Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 55 additions & 1 deletion src/__tests__/__snapshots__/code.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,65 @@

exports[`registerCodegen should register codegen 1`] = `
[
{
"code": "<Box boxSize="100%" />",
"language": "TYPESCRIPT",
"title": "Pure Code",
},
{
"code": "<Test />",
"language": "TYPESCRIPT",
"title": "Usage",
},
{
"code": "<Box boxSize="100%" />",
"code":
"import { Box } from '@devup-ui/react'

export function Test() {
return <Box boxSize="100%" />
}"
,
"language": "TYPESCRIPT",
"title": "Test",
},
{
"code":
"mkdir -p src/components

echo 'import { Box } from \\'@devup-ui/react\\'

export function Test() {
return <Box boxSize="100%" />
}' > src/components/Test.tsx"
,
"language": "BASH",
"title": "Test - CLI (Bash)",
},
{
"code":
"New-Item -ItemType Directory -Force -Path src\\components | Out-Null

@'
import { Box } from '@devup-ui/react'

export function Test() {
return <Box boxSize="100%" />
}
'@ | Out-File -FilePath src\\components\\Test.tsx -Encoding UTF8"
,
"language": "BASH",
"title": "Test - CLI (PowerShell)",
},
]
`;

exports[`registerCodegen should register codegen 2`] = `
[
{
"code": "<Box boxSize="100%" />",
"language": "TYPESCRIPT",
"title": "Pure Code",
},
{
"code": "<Box boxSize="100%" />",
"language": "TYPESCRIPT",
Expand All @@ -35,6 +79,16 @@ exports[`registerCodegen should generate responsive code when root node is SECTI
<Box boxSize="100%" />
<Box boxSize="100%" />
</Box>"
,
"language": "TYPESCRIPT",
"title": "Pure Code",
},
{
"code":
"<Box boxSize="100%">
<Box boxSize="100%" />
<Box boxSize="100%" />
</Box>"
,
"language": "TYPESCRIPT",
"title": "ResponsiveSection",
Expand Down
77 changes: 77 additions & 0 deletions src/__tests__/code-responsive.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,14 @@ describe('registerCodegen responsive error handling', () => {

expect(consoleErrorMock).toHaveBeenCalled()
expect(runMock).toHaveBeenCalled()
// Pure Code is generated via a separate Codegen instance whose run()/getCode()
// hit the same prototype mocks, so its code is also 'base-code'.
expect(result).toEqual([
{
title: 'Pure Code',
language: 'TYPESCRIPT',
code: 'base-code',
},
{
title: 'Main',
language: 'TYPESCRIPT',
Expand All @@ -83,3 +90,73 @@ describe('registerCodegen responsive error handling', () => {
])
})
})

describe('registerCodegen pure code error handling', () => {
// Throws ONLY for the Pure Code Codegen instance (inlineAllInstances=true),
// letting the main codegen run normally so we can isolate the catch branch.
const pureCodeRunMock = mock(async function (this: {
options?: { inlineAllInstances?: boolean }
}) {
if (this.options?.inlineAllInstances) {
throw new Error('pure-code-boom')
}
})

beforeEach(() => {
Codegen.prototype.run =
pureCodeRunMock as unknown as typeof Codegen.prototype.run
Codegen.prototype.getComponentsCodes = getComponentsCodesMock
Codegen.prototype.getCode = getCodeMock

console.error = consoleErrorMock as typeof console.error
resetFigma()
})

afterEach(() => {
Codegen.prototype.run = originalRun
Codegen.prototype.getComponentsCodes = originalGetComponentsCodes
Codegen.prototype.getCode = originalGetCode

console.error = originalError
resetFigma()
mock.restore()
})

test('swallows pure code errors and omits the Pure Code entry', async () => {
const handlerCalls: ((event: CodegenEvent) => Promise<CodegenResult[]>)[] =
[]
const ctx = {
editorType: 'dev',
mode: 'codegen',
command: 'noop',
codegen: {
on: mock((_event, handler) => {
handlerCalls.push(handler)
}),
},
} as unknown as typeof figma

const node = {
type: 'FRAME',
name: 'PureFail',
} as unknown as SceneNode

registerCodegen(ctx)

const generate = handlerCalls[0]
const result = await generate({ node, language: 'devup-ui' })

// Pure Code generation threw → console.error captured the failure.
expect(consoleErrorMock).toHaveBeenCalled()

// Pure Code entry must be ABSENT in the result.
expect(
result.find((r) => (r as { title?: string }).title === 'Pure Code'),
).toBeUndefined()

// Main code remains present (FRAME → showMainCode true).
expect(
result.find((r) => (r as { title?: string }).title === 'PureFail'),
).toBeDefined()
})
})
Loading