diff --git a/.gitignore b/.gitignore index 7ae44218..b8864442 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ build/ dist/ .idea/ node_modules/ +src/components/app/Report.stories.tsx *.log .codegen *.iml diff --git a/generate-fixtures.cjs b/generate-fixtures.cjs index 9d55c1ef..57c22d52 100644 --- a/generate-fixtures.cjs +++ b/generate-fixtures.cjs @@ -2,15 +2,31 @@ const glob = require('glob') const fs = require('fs') const path = require('path') +function toPascalCase(str) { + return str + .split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join('') +} + +function toCamelCase(str) { + const parts = str.split('-') + return parts[0] + parts.slice(1).map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('') +} + if (fs.existsSync('acceptance')) { fs.rmdirSync('acceptance', { recursive: true }) } +const sampleNames = [] + for (const ndjsonPath of glob.sync( 'node_modules/@cucumber/compatibility-kit/features/**/*.ndjson' )) { const filename = path.basename(ndjsonPath) const [suiteName] = filename.split('.') + sampleNames.push(suiteName) + const content = fs.readFileSync(ndjsonPath, { encoding: 'utf-8' }) const asTs = `// Generated file. Do not edit. import { Envelope } from '@cucumber/messages' @@ -21,3 +37,52 @@ export default [${content.split('\n').join(',')}] as ReadonlyArray fs.mkdirSync(`acceptance/${suiteName}`, { recursive: true }) fs.writeFileSync(targetPath, asTs, { encoding: 'utf-8' }) } + +sampleNames.sort() + +const storiesPath = 'src/components/app/Report.stories.tsx' + +const imports = sampleNames + .map(name => `import ${toCamelCase(name)}Sample from '../../../acceptance/${name}/${name}.js'`) + .join('\n') + +const stories = sampleNames + .map(name => { + const exportName = toPascalCase(name) + const importName = toCamelCase(name) + 'Sample' + return `export const ${exportName} = Template.bind({}) +${exportName}.args = { + envelopes: ${importName}, +}` + }) + .join('\n\n') + +const storiesTemplate = `// Generated file. Do not edit. +import { Envelope } from '@cucumber/messages' +import { Story } from '@ladle/react' +import React from 'react' + +${imports} +import { EnvelopesProvider } from './EnvelopesProvider.js' +import { Report } from './Report.js' + +export default { + title: 'App/Report', +} + +type TemplateArgs = { + envelopes: Envelope[] +} + +const Template: Story = ({ envelopes }) => { + return ( + + + + ) +} + +${stories} +` + +fs.writeFileSync(storiesPath, storiesTemplate, { encoding: 'utf-8' }) diff --git a/src/components/app/Report.stories.tsx b/src/components/app/Report.stories.tsx deleted file mode 100644 index 835c98c8..00000000 --- a/src/components/app/Report.stories.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Envelope } from '@cucumber/messages' -import { Story } from '@ladle/react' -import React from 'react' - -import examplesTablesSample from '../../../acceptance/examples-tables/examples-tables.js' -import globalHooksSample from '../../../acceptance/global-hooks/global-hooks.js' -import { EnvelopesProvider } from './EnvelopesProvider.js' -import { InMemorySearchProvider } from './InMemorySearchProvider.js' -import { Report } from './Report.js' - -type TemplateArgs = { - envelopes: readonly Envelope[] -} - -const Template: Story = ({ envelopes }) => { - return ( - - - - - - ) -} - -export default { - title: 'App/Report', -} - -export const Default = Template.bind({}) -Default.args = { - envelopes: examplesTablesSample, -} as TemplateArgs - -export const WithGlobalHooks = Template.bind({}) -WithGlobalHooks.args = { - envelopes: globalHooksSample, -} as TemplateArgs diff --git a/src/components/gherkin/GherkinDocument.stories.tsx b/src/components/gherkin/GherkinDocument.stories.tsx deleted file mode 100644 index 3f28236d..00000000 --- a/src/components/gherkin/GherkinDocument.stories.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import * as messages from '@cucumber/messages' -import { Story } from '@ladle/react' -import React from 'react' - -import attachments from '../../../acceptance/attachments/attachments.js' -import backgrounds from '../../../acceptance/backgrounds/backgrounds.js' -import dataTables from '../../../acceptance/data-tables/data-tables.js' -import examplesTables from '../../../acceptance/examples-tables/examples-tables.js' -import hooks from '../../../acceptance/hooks/hooks.js' -import hooksAttachments from '../../../acceptance/hooks-attachment/hooks-attachment.js' -import markdown from '../../../acceptance/markdown/markdown.js' -import minimal from '../../../acceptance/minimal/minimal.js' -import parameterTypes from '../../../acceptance/parameter-types/parameter-types.js' -import pending from '../../../acceptance/pending/pending.js' -import retry from '../../../acceptance/retry/retry.js' -import rules from '../../../acceptance/rules/rules.js' -import rulesBackgrounds from '../../../acceptance/rules-backgrounds/rules-backgrounds.js' -import skipped from '../../../acceptance/skipped/skipped.js' -import stacktTraces from '../../../acceptance/stack-traces/stack-traces.js' -import undefinedEnvelopes from '../../../acceptance/undefined/undefined.js' -import unknownParameterTypes from '../../../acceptance/unknown-parameter-type/unknown-parameter-type.js' -import { EnvelopesProvider, FilteredDocuments } from '../app/index.js' - -export default { - title: 'Gherkin/GherkinDocument', -} - -type TemplateArgs = { - envelopes: readonly messages.Envelope[] -} - -const Template: Story = ({ envelopes }) => { - return ( - - - - ) -} - -export const Attachments = Template.bind({}) -Attachments.args = { - envelopes: attachments, -} - -export const Backgrounds = Template.bind({}) -Backgrounds.args = { - envelopes: backgrounds, -} - -export const DataTables = Template.bind({}) -DataTables.args = { - envelopes: dataTables, -} - -export const ExamplesTables = Template.bind({}) -ExamplesTables.args = { - envelopes: examplesTables, -} - -export const Hooks = Template.bind({}) -Hooks.args = { - envelopes: hooks, -} - -export const HooksWithAttachments = Template.bind({}) -HooksWithAttachments.args = { - envelopes: hooksAttachments, -} - -export const Markdown = Template.bind({}) -Markdown.args = { - envelopes: markdown, -} - -export const Minimal = Template.bind({}) -Minimal.args = { - envelopes: minimal, -} - -export const ParameterTypes = Template.bind({}) -ParameterTypes.args = { - envelopes: parameterTypes, -} - -export const Pending = Template.bind({}) -Pending.args = { - envelopes: pending, -} - -export const Retry = Template.bind({}) -Retry.args = { - envelopes: retry, -} - -export const Rules = Template.bind({}) -Rules.args = { - envelopes: rules, -} - -export const RulesWithBackgrounds = Template.bind({}) -RulesWithBackgrounds.args = { - envelopes: rulesBackgrounds, -} - -export const Skipped = Template.bind({}) -Skipped.args = { - envelopes: skipped, -} - -export const StackTraces = Template.bind({}) -StackTraces.args = { - envelopes: stacktTraces, -} - -export const Undefined = Template.bind({}) -Undefined.args = { - envelopes: undefinedEnvelopes, -} - -export const UnknownParameterTypes = Template.bind({}) -UnknownParameterTypes.args = { - envelopes: unknownParameterTypes, -}