Skip to content

Commit ed4eb0d

Browse files
authored
Merge pull request #47 from dev-five-git/pure-code
Add pure code
2 parents 2e44507 + be5e783 commit ed4eb0d

5 files changed

Lines changed: 525 additions & 10 deletions

File tree

src/__tests__/__snapshots__/code.test.ts.snap

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,65 @@
22

33
exports[`registerCodegen should register codegen 1`] = `
44
[
5+
{
6+
"code": "<Box boxSize="100%" />",
7+
"language": "TYPESCRIPT",
8+
"title": "Pure Code",
9+
},
510
{
611
"code": "<Test />",
712
"language": "TYPESCRIPT",
813
"title": "Usage",
914
},
1015
{
11-
"code": "<Box boxSize="100%" />",
16+
"code":
17+
"import { Box } from '@devup-ui/react'
18+
19+
export function Test() {
20+
return <Box boxSize="100%" />
21+
}"
22+
,
1223
"language": "TYPESCRIPT",
1324
"title": "Test",
1425
},
26+
{
27+
"code":
28+
"mkdir -p src/components
29+
30+
echo 'import { Box } from \\'@devup-ui/react\\'
31+
32+
export function Test() {
33+
return <Box boxSize="100%" />
34+
}' > src/components/Test.tsx"
35+
,
36+
"language": "BASH",
37+
"title": "Test - CLI (Bash)",
38+
},
39+
{
40+
"code":
41+
"New-Item -ItemType Directory -Force -Path src\\components | Out-Null
42+
43+
@'
44+
import { Box } from '@devup-ui/react'
45+
46+
export function Test() {
47+
return <Box boxSize="100%" />
48+
}
49+
'@ | Out-File -FilePath src\\components\\Test.tsx -Encoding UTF8"
50+
,
51+
"language": "BASH",
52+
"title": "Test - CLI (PowerShell)",
53+
},
1554
]
1655
`;
1756

1857
exports[`registerCodegen should register codegen 2`] = `
1958
[
59+
{
60+
"code": "<Box boxSize="100%" />",
61+
"language": "TYPESCRIPT",
62+
"title": "Pure Code",
63+
},
2064
{
2165
"code": "<Box boxSize="100%" />",
2266
"language": "TYPESCRIPT",
@@ -35,6 +79,16 @@ exports[`registerCodegen should generate responsive code when root node is SECTI
3579
<Box boxSize="100%" />
3680
<Box boxSize="100%" />
3781
</Box>"
82+
,
83+
"language": "TYPESCRIPT",
84+
"title": "Pure Code",
85+
},
86+
{
87+
"code":
88+
"<Box boxSize="100%">
89+
<Box boxSize="100%" />
90+
<Box boxSize="100%" />
91+
</Box>"
3892
,
3993
"language": "TYPESCRIPT",
4094
"title": "ResponsiveSection",

src/__tests__/code-responsive.test.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,14 @@ describe('registerCodegen responsive error handling', () => {
7474

7575
expect(consoleErrorMock).toHaveBeenCalled()
7676
expect(runMock).toHaveBeenCalled()
77+
// Pure Code is generated via a separate Codegen instance whose run()/getCode()
78+
// hit the same prototype mocks, so its code is also 'base-code'.
7779
expect(result).toEqual([
80+
{
81+
title: 'Pure Code',
82+
language: 'TYPESCRIPT',
83+
code: 'base-code',
84+
},
7885
{
7986
title: 'Main',
8087
language: 'TYPESCRIPT',
@@ -83,3 +90,73 @@ describe('registerCodegen responsive error handling', () => {
8390
])
8491
})
8592
})
93+
94+
describe('registerCodegen pure code error handling', () => {
95+
// Throws ONLY for the Pure Code Codegen instance (inlineAllInstances=true),
96+
// letting the main codegen run normally so we can isolate the catch branch.
97+
const pureCodeRunMock = mock(async function (this: {
98+
options?: { inlineAllInstances?: boolean }
99+
}) {
100+
if (this.options?.inlineAllInstances) {
101+
throw new Error('pure-code-boom')
102+
}
103+
})
104+
105+
beforeEach(() => {
106+
Codegen.prototype.run =
107+
pureCodeRunMock as unknown as typeof Codegen.prototype.run
108+
Codegen.prototype.getComponentsCodes = getComponentsCodesMock
109+
Codegen.prototype.getCode = getCodeMock
110+
111+
console.error = consoleErrorMock as typeof console.error
112+
resetFigma()
113+
})
114+
115+
afterEach(() => {
116+
Codegen.prototype.run = originalRun
117+
Codegen.prototype.getComponentsCodes = originalGetComponentsCodes
118+
Codegen.prototype.getCode = originalGetCode
119+
120+
console.error = originalError
121+
resetFigma()
122+
mock.restore()
123+
})
124+
125+
test('swallows pure code errors and omits the Pure Code entry', async () => {
126+
const handlerCalls: ((event: CodegenEvent) => Promise<CodegenResult[]>)[] =
127+
[]
128+
const ctx = {
129+
editorType: 'dev',
130+
mode: 'codegen',
131+
command: 'noop',
132+
codegen: {
133+
on: mock((_event, handler) => {
134+
handlerCalls.push(handler)
135+
}),
136+
},
137+
} as unknown as typeof figma
138+
139+
const node = {
140+
type: 'FRAME',
141+
name: 'PureFail',
142+
} as unknown as SceneNode
143+
144+
registerCodegen(ctx)
145+
146+
const generate = handlerCalls[0]
147+
const result = await generate({ node, language: 'devup-ui' })
148+
149+
// Pure Code generation threw → console.error captured the failure.
150+
expect(consoleErrorMock).toHaveBeenCalled()
151+
152+
// Pure Code entry must be ABSENT in the result.
153+
expect(
154+
result.find((r) => (r as { title?: string }).title === 'Pure Code'),
155+
).toBeUndefined()
156+
157+
// Main code remains present (FRAME → showMainCode true).
158+
expect(
159+
result.find((r) => (r as { title?: string }).title === 'PureFail'),
160+
).toBeDefined()
161+
})
162+
})

0 commit comments

Comments
 (0)