Skip to content

Commit e19f3ca

Browse files
chore: strip types when using ts.
1 parent 5283d66 commit e19f3ca

2 files changed

Lines changed: 25 additions & 3 deletions

File tree

playwright/app.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ const waitForInitialRender = async (page: Page) => {
88
await expect(page.locator('#cdn-loading')).toHaveAttribute('hidden', '')
99
}
1010

11+
const setComponentEditorSource = async (page: Page, source: string) => {
12+
const editorContent = page.locator('.component-panel .cm-content').first()
13+
await editorContent.fill(source)
14+
}
15+
1116
test('renders default playground preview', async ({ page }) => {
1217
await waitForInitialRender(page)
1318

@@ -49,6 +54,22 @@ test('renders in react mode with css modules', async ({ page }) => {
4954
await expect(previewItems.first()).toContainText('apple')
5055
})
5156

57+
test('transpiles TypeScript annotations in component source', async ({ page }) => {
58+
await waitForInitialRender(page)
59+
60+
await page.getByLabel('ShadowRoot (open)').uncheck()
61+
await setComponentEditorSource(
62+
page,
63+
[
64+
'const Button = ({ label }: { label: string }): unknown => <button>{label}</button>',
65+
'const App = () => <Button label="typed" />',
66+
].join('\n'),
67+
)
68+
69+
await expect(page.locator('#status')).toHaveText('Rendered')
70+
await expect(page.locator('#preview-host button')).toContainText('typed')
71+
})
72+
5273
test('shows error status when component source is cleared', async ({ page }) => {
5374
await waitForInitialRender(page)
5475

src/app.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -594,8 +594,7 @@ const remapReactClassNames = (value, moduleExports, React) => {
594594
return React.cloneElement(value, nextProps)
595595
}
596596

597-
const looksLikeJsxSyntaxError = error =>
598-
error instanceof SyntaxError && /Unexpected token ['"]?</.test(error.message)
597+
const shouldAttemptTranspileFallback = error => error instanceof SyntaxError
599598

600599
const createUserModuleFactory = source =>
601600
new Function(
@@ -794,7 +793,7 @@ const evaluateUserModule = async (helpers = {}) => {
794793
const moduleFactory = createUserModuleFactory(userCode)
795794
return moduleFactory(helpers.jsx ?? jsx, helpers.reactJsx, helpers.React)
796795
} catch (error) {
797-
if (!looksLikeJsxSyntaxError(error)) {
796+
if (!shouldAttemptTranspileFallback(error)) {
798797
throw error
799798
}
800799

@@ -804,11 +803,13 @@ const evaluateUserModule = async (helpers = {}) => {
804803
sourceType: 'script',
805804
createElement: 'jsx.createElement',
806805
fragment: 'jsx.Fragment',
806+
typescript: 'strip',
807807
},
808808
react: {
809809
sourceType: 'script',
810810
createElement: 'React.createElement',
811811
fragment: 'React.Fragment',
812+
typescript: 'strip',
812813
},
813814
}
814815
const transpiledUserCode = transpileJsxSource(

0 commit comments

Comments
 (0)