diff --git a/cypress/e2e/smoke.cy.js b/cypress/e2e/smoke.cy.js index 5a1581bd..f9ff3572 100644 --- a/cypress/e2e/smoke.cy.js +++ b/cypress/e2e/smoke.cy.js @@ -17,4 +17,12 @@ describe('Smoke', () => { assertPreviewContains('Foo\nFoo\nBar'); }); + + it('preview mode works with TypeScript components', () => { + cy.visit( + 'http://localhost:9002/preview#?code=N4Igxg9gJgpiBcIA8AxCEB8r1YEIEMAnAei2LUyXJxAF8g' + ); + + assertPreviewContains('Foo\nFoo\nBar'); + }); }); diff --git a/cypress/e2e/snippets.cy.js b/cypress/e2e/snippets.cy.js index c2227745..d76d8f8f 100644 --- a/cypress/e2e/snippets.cy.js +++ b/cypress/e2e/snippets.cy.js @@ -27,7 +27,7 @@ describe('Snippets', () => { assertCodePaneLineCount(8); // Browse snippetlist - assertSnippetCount(4); + assertSnippetCount(5); mouseOverSnippet(0); assertFirstFrameContains('Initial code\nFoo\nFoo'); mouseOverSnippet(1); @@ -78,7 +78,7 @@ describe('Snippets', () => { assertCodePaneLineCount(8); // Browse snippetlist - assertSnippetCount(4); + assertSnippetCount(5); filterSnippets('{downarrow}'); assertFirstFrameContains('Initial code\nFoo\nFoo'); filterSnippets('{downarrow}'); diff --git a/cypress/placeholder.ts b/cypress/placeholder.ts deleted file mode 100644 index a19773d9..00000000 --- a/cypress/placeholder.ts +++ /dev/null @@ -1 +0,0 @@ -// This is a placeholder file that provides for at least one TypeScript file in the project diff --git a/cypress/projects/basic/snippets.js b/cypress/projects/basic/snippets.js index 51dcb7ab..10f82d7e 100644 --- a/cypress/projects/basic/snippets.js +++ b/cypress/projects/basic/snippets.js @@ -19,4 +19,9 @@ export default [ name: 'Blue', code: 'Blue Bar', }, + { + group: 'Scope', + name: 'hello world', + code: '{hello()} {world()}', + }, ]; diff --git a/cypress/projects/typescript/components.ts b/cypress/projects/typescript/components.ts new file mode 100644 index 00000000..b113ca2a --- /dev/null +++ b/cypress/projects/typescript/components.ts @@ -0,0 +1,2 @@ +export { Foo } from './components/Foo'; +export { Bar } from './components/Bar'; diff --git a/cypress/projects/typescript/components/Bar.tsx b/cypress/projects/typescript/components/Bar.tsx new file mode 100644 index 00000000..bcfc62ea --- /dev/null +++ b/cypress/projects/typescript/components/Bar.tsx @@ -0,0 +1,13 @@ +import type React from 'react'; +import { parent } from './styles'; + +type Props = { + color: 'red' | 'blue'; + children: React.ReactNode; +}; + +export const Bar: React.FC = ({ color = 'black', children }) => ( +
+ Bar{children ?
{children}
: null} +
+); diff --git a/cypress/projects/typescript/components/Foo.tsx b/cypress/projects/typescript/components/Foo.tsx new file mode 100644 index 00000000..e6f2b4ea --- /dev/null +++ b/cypress/projects/typescript/components/Foo.tsx @@ -0,0 +1,13 @@ +import type React from 'react'; +import { parent } from './styles'; + +type Props = { + color: 'red' | 'blue'; + children: React.ReactNode; +}; + +export const Foo: React.FC = ({ color = 'black', children }) => ( +
+ Foo{children ?
{children}
: null} +
+); diff --git a/cypress/projects/typescript/components/styles.ts b/cypress/projects/typescript/components/styles.ts new file mode 100644 index 00000000..a8066f4b --- /dev/null +++ b/cypress/projects/typescript/components/styles.ts @@ -0,0 +1,4 @@ +export const parent = { + border: '4px solid currentColor', + padding: '10px 10px 10px 15px', +}; diff --git a/cypress/projects/typescript/playroom.config.js b/cypress/projects/typescript/playroom.config.js new file mode 100644 index 00000000..2751d80c --- /dev/null +++ b/cypress/projects/typescript/playroom.config.js @@ -0,0 +1,31 @@ +module.exports = { + components: './components.ts', + snippets: './snippets.ts', + outputPath: './dist', + openBrowser: false, + storageKey: 'playroom-example-typescript', + webpackConfig: () => ({ + module: { + rules: [ + { + test: /\.tsx?$/, + exclude: /node_modules/, + use: [ + { + loader: require.resolve('babel-loader'), + options: { + presets: [ + require.resolve('@babel/preset-env'), + [ + require.resolve('@babel/preset-react'), + { runtime: 'automatic' }, + ], + ], + }, + }, + ], + }, + ], + }, + }), +}; diff --git a/cypress/projects/typescript/snippets.ts b/cypress/projects/typescript/snippets.ts new file mode 100644 index 00000000..51dcb7ab --- /dev/null +++ b/cypress/projects/typescript/snippets.ts @@ -0,0 +1,22 @@ +export default [ + { + group: 'Foo', + name: 'Default', + code: 'Foo', + }, + { + group: 'Foo', + name: 'Red', + code: 'Red Foo', + }, + { + group: 'Bar', + name: 'Default', + code: 'Bar', + }, + { + group: 'Bar', + name: 'Blue', + code: 'Blue Bar', + }, +]; diff --git a/cypress/projects/typescript/tsconfig.json b/cypress/projects/typescript/tsconfig.json new file mode 100644 index 00000000..a3d52d4e --- /dev/null +++ b/cypress/projects/typescript/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "noEmit": true, + "skipLibCheck": true, + "moduleResolution": "node", + "module": "es2022", + "allowImportingTsExtensions": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "isolatedModules": true, + "resolveJsonModule": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react-jsx", + "lib": ["dom", "es2022"], + "target": "es2022" + } +} diff --git a/package.json b/package.json index 4c60da74..fa7e5e18 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "playroom": "bin/cli.js" }, "scripts": { - "cypress": "start-server-and-test build-and-serve:all '9000|9001' 'cypress run'", - "cypress:dev": "start-server-and-test start:all '9000|9001' 'cypress open --browser chrome --e2e'", + "cypress": "start-server-and-test build-and-serve:all '9000|9001|9002' 'cypress run'", + "cypress:dev": "start-server-and-test start:all '9000|9001|9002' 'cypress open --browser chrome --e2e'", "cypress:verify": "cypress verify", "start:basic": "./bin/cli.js start --config cypress/projects/basic/playroom.config.js", "build:basic": "./bin/cli.js build --config cypress/projects/basic/playroom.config.js", @@ -17,9 +17,12 @@ "start:themed": "./bin/cli.js start --config cypress/projects/themed/playroom.config.js", "build:themed": "./bin/cli.js build --config cypress/projects/themed/playroom.config.js", "serve:themed": "PORT=9001 serve --config ../serve.json --no-request-logging cypress/projects/themed/dist", - "start:all": "concurrently 'npm:start:basic' 'npm:start:themed'", - "build:all": "concurrently 'npm:build:basic' 'npm:build:themed'", - "serve:all": "concurrently 'npm:serve:basic' 'npm:serve:themed'", + "start:typescript": "./bin/cli.js start --config cypress/projects/typescript/playroom.config.js", + "build:typescript": "./bin/cli.js build --config cypress/projects/typescript/playroom.config.js", + "serve:typescript": "PORT=9002 serve --no-request-logging cypress/projects/typescript/dist", + "start:all": "concurrently 'npm:start:*(!all)'", + "build:all": "concurrently 'npm:build:*(!all)'", + "serve:all": "concurrently 'npm:serve:*(!all)'", "build-and-serve:all": "pnpm build:all && pnpm serve:all", "lint": "concurrently 'npm:lint:*'", "lint:eslint": "eslint --cache .",