@fairfox/polly 0.85.1 → 0.86.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/polly.js.map +1 -1
- package/dist/gallery/gallery.css +1 -1
- package/dist/gallery/gallery.js +2 -27
- package/dist/scripts/build-extension.js.map +1 -1
- package/dist/src/actions/index.js +34 -32
- package/dist/src/actions/index.js.map +2 -2
- package/dist/src/background/index.js +24 -22
- package/dist/src/background/index.js.map +2 -2
- package/dist/src/background/message-router.js +21 -19
- package/dist/src/background/message-router.js.map +2 -2
- package/dist/src/client/index.js +9 -7
- package/dist/src/client/index.js.map +3 -3
- package/dist/src/client/wrapper.d.ts +3 -3
- package/dist/src/elysia/index.d.ts +1 -1
- package/dist/src/elysia/index.js +25 -23
- package/dist/src/elysia/index.js.map +2 -2
- package/dist/src/elysia/types.d.ts +11 -2
- package/dist/src/index.js +68 -64
- package/dist/src/index.js.map +3 -3
- package/dist/src/mesh-node.js +6 -6
- package/dist/src/mesh-node.js.map +1 -1
- package/dist/src/mesh.js +92 -90
- package/dist/src/mesh.js.map +2 -2
- package/dist/src/peer.js +83 -52
- package/dist/src/peer.js.map +3 -3
- package/dist/src/polly-ui/index.css +1 -1
- package/dist/src/polly-ui/index.js +37 -35
- package/dist/src/polly-ui/index.js.map +2 -2
- package/dist/src/polly-ui/markdown.js +233 -96
- package/dist/src/polly-ui/markdown.js.map +4 -4
- package/dist/src/polly-ui/styles.css +1 -1
- package/dist/src/shared/adapters/index.js +30 -28
- package/dist/src/shared/adapters/index.js.map +2 -2
- package/dist/src/shared/lib/context-helpers.js +23 -21
- package/dist/src/shared/lib/context-helpers.js.map +2 -2
- package/dist/src/shared/lib/errors.js +16 -14
- package/dist/src/shared/lib/errors.js.map +2 -2
- package/dist/src/shared/lib/guards.js +11 -9
- package/dist/src/shared/lib/guards.js.map +2 -2
- package/dist/src/shared/lib/message-bus.js +24 -22
- package/dist/src/shared/lib/message-bus.js.map +2 -2
- package/dist/src/shared/lib/peer-relay-adapter.d.ts +6 -0
- package/dist/src/shared/lib/resource.js +19 -15
- package/dist/src/shared/lib/resource.js.map +3 -3
- package/dist/src/shared/lib/state.js +26 -22
- package/dist/src/shared/lib/state.js.map +3 -3
- package/dist/src/shared/lib/test-helpers.js +11 -9
- package/dist/src/shared/lib/test-helpers.js.map +2 -2
- package/dist/src/shared/state/app-state.js +22 -18
- package/dist/src/shared/state/app-state.js.map +3 -3
- package/dist/src/shared/types/messages.js +11 -9
- package/dist/src/shared/types/messages.js.map +2 -2
- package/dist/tools/bdd/src/cli.js +44 -1
- package/dist/tools/bdd/src/cli.js.map +4 -4
- package/dist/tools/bdd/src/index.js +54 -11
- package/dist/tools/bdd/src/index.js.map +4 -4
- package/dist/tools/gallery/src/cli.js +1 -1
- package/dist/tools/gallery/src/cli.js.map +2 -2
- package/dist/tools/init/src/cli.js +1 -1
- package/dist/tools/init/src/cli.js.map +2 -2
- package/dist/tools/mutate/src/cli.js +1 -1
- package/dist/tools/mutate/src/cli.js.map +2 -2
- package/dist/tools/mutate/src/index.js +8 -8
- package/dist/tools/mutate/src/index.js.map +2 -2
- package/dist/tools/quality/src/cli.js +3 -2
- package/dist/tools/quality/src/cli.js.map +3 -3
- package/dist/tools/quality/src/index.js +37 -36
- package/dist/tools/quality/src/index.js.map +3 -3
- package/dist/tools/test/src/adapters/index.js +19 -17
- package/dist/tools/test/src/adapters/index.js.map +2 -2
- package/dist/tools/test/src/browser/index.js +15 -13
- package/dist/tools/test/src/browser/index.js.map +2 -2
- package/dist/tools/test/src/browser/run.js +12 -3
- package/dist/tools/test/src/browser/run.js.map +5 -4
- package/dist/tools/test/src/contrast/index.js +14 -12
- package/dist/tools/test/src/contrast/index.js.map +2 -2
- package/dist/tools/test/src/coverage-policy/cli.js +5 -5
- package/dist/tools/test/src/coverage-policy/cli.js.map +2 -2
- package/dist/tools/test/src/coverage-policy/index.js +12 -12
- package/dist/tools/test/src/coverage-policy/index.js.map +1 -1
- package/dist/tools/test/src/e2e-mesh/index.js +88 -50
- package/dist/tools/test/src/e2e-mesh/index.js.map +6 -5
- package/dist/tools/test/src/e2e-mesh/with-relay.d.ts +1 -1
- package/dist/tools/test/src/e2e-relay/index.js +3 -3
- package/dist/tools/test/src/e2e-relay/index.js.map +2 -2
- package/dist/tools/test/src/e2e-shared/ephemeral-port.d.ts +73 -0
- package/dist/tools/test/src/e2e-shared/index.d.ts +1 -0
- package/dist/tools/test/src/index.d.ts +1 -0
- package/dist/tools/test/src/index.js +68 -24
- package/dist/tools/test/src/index.js.map +4 -3
- package/dist/tools/test/src/test-utils.js +14 -12
- package/dist/tools/test/src/test-utils.js.map +2 -2
- package/dist/tools/test/src/tiers/budget.d.ts +32 -0
- package/dist/tools/test/src/tiers/cli.js +35 -5
- package/dist/tools/test/src/tiers/cli.js.map +6 -5
- package/dist/tools/test/src/tiers/index.d.ts +1 -0
- package/dist/tools/test/src/tiers/reporter.d.ts +0 -5
- package/dist/tools/test/src/tiers/types.d.ts +9 -0
- package/dist/tools/test/src/tiers/worker.js +1 -1
- package/dist/tools/test/src/tiers/worker.js.map +1 -1
- package/dist/tools/test/src/visual/index.js +121 -119
- package/dist/tools/test/src/visual/index.js.map +2 -2
- package/dist/tools/verify/specs/README.md +18 -0
- package/dist/tools/verify/specs/tla/MeshState.cfg +1 -1
- package/dist/tools/verify/specs/tla/MeshState.tla +7 -0
- package/dist/tools/verify/specs/tla/MessageRouter.cfg +4 -2
- package/dist/tools/verify/specs/tla/MessageRouter.tla +45 -10
- package/dist/tools/verify/specs/tla/PeerState.cfg +1 -1
- package/dist/tools/verify/specs/tla/PeerState.tla +7 -0
- package/dist/tools/verify/specs/tla/README.md +1 -1
- package/dist/tools/verify/src/cli.js +258 -202
- package/dist/tools/verify/src/cli.js.map +12 -11
- package/dist/tools/verify/src/config.d.ts +25 -0
- package/dist/tools/verify/src/config.js +18 -16
- package/dist/tools/verify/src/config.js.map +3 -3
- package/dist/tools/verify/src/stryker/index.js +6 -6
- package/dist/tools/verify/src/stryker/index.js.map +1 -1
- package/dist/tools/visualize/src/cli.js +439 -47
- package/dist/tools/visualize/src/cli.js.map +7 -5
- package/package.json +2 -2
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
"sources": ["../tools/bdd/src/parse.ts", "../tools/bdd/src/steps.ts", "../tools/bdd/src/cli.ts", "../tools/bdd/src/args.ts", "../tools/bdd/src/check-verify.ts", "../tools/bdd/src/extract.ts", "../tools/bdd/src/config.ts", "../tools/bdd/src/report.ts", "../tools/bdd/src/run.ts", "../tools/bdd/src/scaffold.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Parse `.feature` files into the runner's normalized AST.\n *\n * Thin wrapper over `@cucumber/gherkin` (parser only — no cucumber runtime):\n * we keep our own {@link ParsedFeature} shape so the rest of the tool never\n * touches the gherkin message types, and swapping the parser stays a one-file\n * change. Responsibilities beyond raw parsing:\n * - normalize And/But to the preceding concrete keyword (Given/When/Then);\n * - fold Background steps into a feature-level list;\n * - expand each Scenario Outline into one concrete scenario per Examples row.\n */\nimport { AstBuilder, GherkinClassicTokenMatcher, Parser } from \"@cucumber/gherkin\";\nimport type { GherkinDocument, Scenario } from \"@cucumber/messages\";\nimport { IdGenerator } from \"@cucumber/messages\";\nimport type { ParsedFeature, ParsedScenario, ParsedStep, StepKeyword } from \"./types.ts\";\n\nfunction newParser() {\n return new Parser(new AstBuilder(IdGenerator.uuid()), new GherkinClassicTokenMatcher());\n}\n\n/** And/But inherit the previous concrete keyword; a leading And/But defaults to Given. */\nfunction normalizeKeyword(raw: string, prev: StepKeyword | null): StepKeyword {\n const k = raw.trim().toLowerCase();\n if (k === \"given\") return \"given\";\n if (k === \"when\") return \"when\";\n if (k === \"then\") return \"then\";\n return prev ?? \"given\";\n}\n\ninterface RawStep {\n keyword: string;\n text: string;\n location?: { line?: number };\n}\n\nfunction normalizeSteps(rawSteps: readonly RawStep[]): ParsedStep[] {\n const out: ParsedStep[] = [];\n let prev: StepKeyword | null = null;\n for (const s of rawSteps) {\n const keyword = normalizeKeyword(s.keyword, prev);\n prev = keyword;\n out.push({\n keyword,\n rawKeyword: s.keyword.trim(),\n text: s.text.trim(),\n line: s.location?.line ?? 0,\n });\n }\n return out;\n}\n\nfunction tagNames(tags: ReadonlyArray<{ name: string }> | undefined): string[] {\n return (tags ?? []).map((t) => t.name.replace(/^@/, \"\"));\n}\n\n/** Substitute `<placeholder>` cells from an Examples row into step text. */\nfunction fillOutline(text: string, headers: string[], cells: string[]): string {\n let filled = text;\n headers.forEach((h, i) => {\n filled = filled.split(`<${h}>`).join(cells[i] ?? \"\");\n });\n return filled;\n}\n\n/** A plain scenario, or one concrete scenario per Scenario Outline Examples row. */\nfunction buildScenarios(sc: Scenario): ParsedScenario[] {\n const baseSteps = sc.steps ?? [];\n const tags = tagNames(sc.tags);\n const examples = sc.examples ?? [];\n\n if (examples.length === 0) {\n return [\n { name: sc.name, tags, steps: normalizeSteps(baseSteps), line: sc.location?.line ?? 0 },\n ];\n }\n\n const out: ParsedScenario[] = [];\n for (const ex of examples) {\n const headers = (ex.tableHeader?.cells ?? []).map((c) => c.value);\n for (const row of ex.tableBody ?? []) {\n const cells = (row.cells ?? []).map((c) => c.value);\n const rowSteps = baseSteps.map((s) => ({\n keyword: s.keyword,\n text: fillOutline(s.text, headers, cells),\n location: s.location,\n }));\n const label = headers.map((h, i) => `${h}=${cells[i] ?? \"\"}`).join(\", \");\n out.push({\n name: `${sc.name} [${label}]`,\n tags: [...tags, ...tagNames(ex.tags)],\n steps: normalizeSteps(rowSteps),\n line: row.location?.line ?? sc.location?.line ?? 0,\n fromOutline: true,\n });\n }\n }\n return out;\n}\n\nexport function parseFeatureText(text: string, file: string): ParsedFeature {\n const doc: GherkinDocument = newParser().parse(text);\n const feature = doc.feature;\n if (!feature) {\n return { name: \"\", description: \"\", tags: [], background: [], scenarios: [], file };\n }\n\n let background: ParsedStep[] = [];\n const scenarios: ParsedScenario[] = [];\n\n for (const child of feature.children ?? []) {\n if (child.background) {\n background = normalizeSteps(child.background.steps ?? []);\n } else if (child.scenario) {\n scenarios.push(...buildScenarios(child.scenario));\n }\n }\n\n return {\n name: feature.name,\n description: (feature.description ?? \"\").trim(),\n tags: tagNames(feature.tags),\n background,\n scenarios,\n file,\n };\n}\n\nexport async function parseFeatureFile(path: string): Promise<ParsedFeature> {\n const text = await Bun.file(path).text();\n return parseFeatureText(text, path);\n}\n",
|
|
6
|
-
"/**\n * The step-binding registry and matcher.\n *\n * `defineStep()` is the consumer-facing keystone: one call registers a binding\n * that the runner executes (`given`/`when`/`then`) AND the verify extractor\n * reads (`message`/`stateExpr`). `defineWorld()` records how to build and\n * cold-reset the real-factory world.\n *\n * Patterns use a small Cucumber-expression subset: `{string}`, `{int}`,\n * `{float}`, `{word}`. Everything else is matched literally. That covers\n * declarative steps without dragging in the full cucumber-expressions library.\n *\n * The registry lives on `globalThis`, not in a module-level array, on purpose:\n * `polly bdd` ships as two bundles (the CLI and the `@fairfox/polly/bdd`\n * library export). `build-lib` runs with `splitting: false`, so this module is\n * *inlined separately into each bundle* — a module-level array would give the\n * runner and the consumer's `defineWorld` two different registries. A single\n * global slot is the standard cross-bundle-singleton fix.\n */\nimport type { StepBinding, StepKeyword, WorldDef } from \"./types.ts\";\n\ninterface CompiledBinding {\n binding: StepBinding;\n regex: RegExp;\n}\n\ninterface RegistryState {\n bindings: CompiledBinding[];\n worldDef: WorldDef | null;\n}\n\ndeclare global {\n // An ambient global declaration — `var` is the only legal form here.\n var __pollyBddRegistry__: RegistryState | undefined;\n}\n\nfunction state(): RegistryState {\n globalThis.__pollyBddRegistry__ ??= { bindings: [], worldDef: null };\n return globalThis.__pollyBddRegistry__;\n}\n\n/** Translate a Cucumber-expression pattern into an anchored RegExp. */\nexport function compilePattern(pattern: string): RegExp {\n // Escape regex metacharacters, then re-introduce capture groups for {tokens}.\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const withGroups = escaped\n // {string} — double- or single-quoted; capture the inner text. The\n // alternation MUST be wrapped in a non-capturing group, or the `|` would\n // bind to the whole pattern and shatter any step with two+ tokens.\n .replace(/\\\\\\{string\\\\\\}/g, `(?:\"([^\"]*)\"|'([^']*)')`)\n .replace(/\\\\\\{int\\\\\\}/g, \"([-+]?\\\\d+)\")\n .replace(/\\\\\\{float\\\\\\}/g, \"([-+]?\\\\d*\\\\.?\\\\d+)\")\n .replace(/\\\\\\{word\\\\\\}/g, \"([^\\\\s]+)\");\n return new RegExp(`^${withGroups}$`);\n}\n\nexport function defineStep(binding: StepBinding): void {\n state().bindings.push({ binding, regex: compilePattern(binding.pattern) });\n}\n\nexport function defineWorld(def: WorldDef): void {\n state().worldDef = def;\n}\n\nexport function getWorldDef(): WorldDef | null {\n return state().worldDef;\n}\n\n/** Drop all registrations — used between isolated runs/tests. */\nexport function resetRegistry(): void {\n const s = state();\n s.bindings.length = 0;\n s.worldDef = null;\n}\n\nexport interface StepMatch {\n binding: StepBinding;\n args: string[];\n}\n\n/**\n * Find the binding whose pattern matches `text`. Captured groups become the\n * step arguments (the `{string}` alternation yields two groups per token, so\n * we drop the undefined half).\n *\n * When `keyword` is given, a binding that *has* the callback for that keyword\n * wins over one that merely matches the text — so the same phrase can serve as\n * a `given` precondition in one scenario and a `then` assertion in another.\n */\nexport function matchStep(text: string, keyword?: StepKeyword): StepMatch | null {\n let textOnlyFallback: StepMatch | null = null;\n for (const { binding, regex } of state().bindings) {\n const m = regex.exec(text);\n if (!m) continue;\n const args = m.slice(1).filter((g) => g !== undefined);\n if (!keyword || binding[keyword]) return { binding, args };\n textOnlyFallback ??= { binding, args };\n }\n return textOnlyFallback;\n}\n\n/** Snapshot of all registered bindings (for the verify extractor). */\nexport function registeredBindings(): StepBinding[] {\n return state().bindings.map((c) => c.binding);\n}\n",
|
|
6
|
+
"/**\n * The step-binding registry and matcher.\n *\n * `defineStep()` is the consumer-facing keystone: one call registers a binding\n * that the runner executes (`given`/`when`/`then`) AND the verify extractor\n * reads (`message`/`stateExpr`). `defineWorld()` records how to build and\n * cold-reset the real-factory world.\n *\n * Patterns use a small Cucumber-expression subset: `{string}`, `{int}`,\n * `{float}`, `{word}`. Everything else is matched literally. That covers\n * declarative steps without dragging in the full cucumber-expressions library.\n *\n * The registry lives on `globalThis`, not in a module-level array, on purpose:\n * `polly bdd` ships as two bundles (the CLI and the `@fairfox/polly/bdd`\n * library export). `build-lib` runs with `splitting: false`, so this module is\n * *inlined separately into each bundle* — a module-level array would give the\n * runner and the consumer's `defineWorld` two different registries. A single\n * global slot is the standard cross-bundle-singleton fix.\n */\nimport type { StepBinding, StepKeyword, WorldDef } from \"./types.ts\";\n\ninterface CompiledBinding {\n binding: StepBinding;\n regex: RegExp;\n}\n\ninterface RegistryState {\n bindings: CompiledBinding[];\n worldDef: WorldDef | null;\n}\n\ndeclare global {\n // An ambient global declaration — `var` is the only legal form here.\n var __pollyBddRegistry__: RegistryState | undefined;\n}\n\nfunction state(): RegistryState {\n globalThis.__pollyBddRegistry__ ??= { bindings: [], worldDef: null };\n return globalThis.__pollyBddRegistry__;\n}\n\n/** Translate a Cucumber-expression pattern into an anchored RegExp. */\nexport function compilePattern(pattern: string): RegExp {\n // Escape regex metacharacters, then re-introduce capture groups for {tokens}.\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const withGroups = escaped\n // {string} — double- or single-quoted; capture the inner text. The\n // alternation MUST be wrapped in a non-capturing group, or the `|` would\n // bind to the whole pattern and shatter any step with two+ tokens.\n .replace(/\\\\\\{string\\\\\\}/g, `(?:\"([^\"]*)\"|'([^']*)')`)\n .replace(/\\\\\\{int\\\\\\}/g, \"([-+]?\\\\d+)\")\n .replace(/\\\\\\{float\\\\\\}/g, \"([-+]?\\\\d*\\\\.?\\\\d+)\")\n .replace(/\\\\\\{word\\\\\\}/g, \"([^\\\\s]+)\");\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp — `pattern` is a step expression from the project's own step-definition file, not external input, and every metacharacter is escaped above before the {token} groups are re-introduced.\n return new RegExp(`^${withGroups}$`);\n}\n\nexport function defineStep(binding: StepBinding): void {\n state().bindings.push({ binding, regex: compilePattern(binding.pattern) });\n}\n\nexport function defineWorld(def: WorldDef): void {\n state().worldDef = def;\n}\n\nexport function getWorldDef(): WorldDef | null {\n return state().worldDef;\n}\n\n/** Drop all registrations — used between isolated runs/tests. */\nexport function resetRegistry(): void {\n const s = state();\n s.bindings.length = 0;\n s.worldDef = null;\n}\n\nexport interface StepMatch {\n binding: StepBinding;\n args: string[];\n}\n\n/**\n * Find the binding whose pattern matches `text`. Captured groups become the\n * step arguments (the `{string}` alternation yields two groups per token, so\n * we drop the undefined half).\n *\n * When `keyword` is given, a binding that *has* the callback for that keyword\n * wins over one that merely matches the text — so the same phrase can serve as\n * a `given` precondition in one scenario and a `then` assertion in another.\n */\nexport function matchStep(text: string, keyword?: StepKeyword): StepMatch | null {\n let textOnlyFallback: StepMatch | null = null;\n for (const { binding, regex } of state().bindings) {\n const m = regex.exec(text);\n if (!m) continue;\n const args = m.slice(1).filter((g) => g !== undefined);\n if (!keyword || binding[keyword]) return { binding, args };\n textOnlyFallback ??= { binding, args };\n }\n return textOnlyFallback;\n}\n\n/** Snapshot of all registered bindings (for the verify extractor). */\nexport function registeredBindings(): StepBinding[] {\n return state().bindings.map((c) => c.binding);\n}\n",
|
|
7
7
|
"#!/usr/bin/env bun\n/**\n * `polly bdd` — author and run executable Gherkin against polly's own model.\n *\n * BDD is polly's third verification stratum. verify (TLA+) proves invariants\n * over the handler state machine; mutate (Stryker) proves the tests have teeth;\n * BDD pins down what a feature should do *from the user's perspective*, as\n * concrete examples that run across the real factory boundary. A Gherkin\n * scenario decomposes onto the same vocabulary the other two already speak:\n * Given = state signals, When = a message type, Then = an observable outcome.\n *\n * Thin verb dispatcher over the reusable functions in this directory.\n */\nimport { resolve } from \"node:path\";\nimport { parseBddArgs } from \"./args.ts\";\nimport { checkAgainstVerify } from \"./check-verify.ts\";\nimport { resolveBddConfig } from \"./config.ts\";\nimport { formatRun, toJson } from \"./report.ts\";\nimport { runFeatures } from \"./run.ts\";\nimport { scaffoldFeature } from \"./scaffold.ts\";\n\nconst HELP = `polly bdd — executable Gherkin against polly's handlers + state\n\nThree-amigos sessions produce acceptance examples from the user's perspective;\nthis runs them across the real factory boundary and cross-checks them against\nthe verification config — so the example layer, the formal layer, and the\nmutation layer all describe the same handlers and state.\n\nUsage:\n polly bdd [run] [path] Run .feature files (default: features/**/*.feature)\n polly bdd check Cross-check scenarios against specs/verification.config.ts\n polly bdd new <name> Scaffold a feature stub seeded from the verify vocabulary\n polly bdd help Show this help\n\nFlags:\n --features <glob> feature files (default: features/**/*.feature)\n --steps <glob> step modules to load (default: features/**/*.steps.ts + features/steps.ts)\n --tags <tag> only run scenarios with this tag (~tag negates)\n --json machine-readable output\n -h, --help\n\nScenarios tagged @formal cover precondition-only behaviour (requires() is a\nruntime no-op) — the runner defers them; 'polly verify' checks them, since the\nrequires() guard is extracted into the TLA+ model.`;\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a flat verb dispatcher — the branches are the command surface.\nasync function main(): Promise<number> {\n const args = parseBddArgs(process.argv.slice(2));\n if (args.help || args.verb === \"help\") {\n console.log(HELP);\n return 0;\n }\n\n const cwd = process.cwd();\n\n switch (args.verb) {\n case \"run\": {\n const cfg = await resolveBddConfig(cwd, args);\n if (cfg.featureFiles.length === 0) {\n console.log(\"No .feature files found (looked for features/**/*.feature).\");\n return 1;\n }\n if (cfg.stepFiles.length === 0) {\n console.log(\n \"No step modules found (looked for features/**/*.steps.ts and features/steps.ts).\"\n );\n return 1;\n }\n const result = await runFeatures({\n featureFiles: cfg.featureFiles,\n stepFiles: cfg.stepFiles,\n tagFilter: args.tags,\n });\n console.log(args.json ? toJson(result) : formatRun(result, cwd));\n return result.ok ? 0 : 1;\n }\n\n case \"check\": {\n const cfg = await resolveBddConfig(cwd, args);\n const configPath = resolve(cwd, \"specs\", \"verification.config.ts\");\n const result = await checkAgainstVerify({\n featureFiles: cfg.featureFiles,\n stepFiles: cfg.stepFiles,\n configPath,\n });\n if (args.json) {\n console.log(JSON.stringify(result, null, 2));\n return result.ok ? 0 : 1;\n }\n console.log(`\\nCross-checked ${result.checked} scenario(s) against the verification config:`);\n if (result.findings.length === 0) {\n console.log(\" ✓ every When models a real message; every Given/Then names a tracked field\");\n }\n for (const f of result.findings) {\n console.log(` ${f.kind === \"error\" ? \"✗\" : \"⚠\"} ${f.scenario}\\n ${f.message}`);\n }\n console.log(result.ok ? \"\\n✓ BDD ↔ verify cross-check holds.\" : \"\\n✗ Cross-check failed.\");\n return result.ok ? 0 : 1;\n }\n\n case \"new\": {\n const name = args.rest.join(\" \").trim();\n if (!name) {\n console.log(\"usage: polly bdd new <feature name>\");\n return 1;\n }\n const configPath = resolve(cwd, \"specs\", \"verification.config.ts\");\n const res = await scaffoldFeature(cwd, name, configPath);\n if (!res.created) {\n console.log(`${res.featurePath} already exists.`);\n return 1;\n }\n console.log(`✓ wrote ${res.featurePath}`);\n console.log(\n ` seeded from ${res.messages.length} message type(s), ${res.fields.length} state field(s)`\n );\n console.log(\"\\nNext: bind the steps in features/steps.ts, then 'polly bdd run'.\");\n return 0;\n }\n\n default:\n console.log(`Unknown subcommand: ${args.verb}\\n`);\n console.log(HELP);\n return 1;\n }\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err) => {\n console.log(`\\n❌ ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n });\n",
|
|
8
8
|
"/**\n * Argument parsing for `polly bdd`. Flat verb dispatcher, mirroring the shape\n * of `tools/mutate/src/args.ts`.\n */\nexport interface BddArgs {\n /** First positional: \"run\" | \"check\" | \"new\" (default \"run\"). */\n verb: string;\n /** Positionals after the verb (e.g. a feature path, or a new feature name). */\n rest: string[];\n /** --features <glob> override. */\n features?: string;\n /** --steps <glob> override. */\n steps?: string;\n /** --tags <expr> filter (plain tag name, optionally prefixed ~ to negate). */\n tags?: string;\n /** --json machine-readable output. */\n json: boolean;\n /** -h / --help. */\n help: boolean;\n}\n\nconst VALUE_FLAGS = new Set([\"--features\", \"--steps\", \"--tags\"]);\n\nexport function parseBddArgs(argv: string[]): BddArgs {\n const positionals: string[] = [];\n const flags = new Map<string, string>();\n const bools = new Set<string>();\n\n let i = 0;\n while (i < argv.length) {\n const a = argv[i] ?? \"\";\n if (VALUE_FLAGS.has(a)) {\n flags.set(a, argv[i + 1] ?? \"\");\n i += 2;\n } else {\n if (a.startsWith(\"-\")) bools.add(a);\n else positionals.push(a);\n i += 1;\n }\n }\n\n return {\n verb: positionals[0] ?? \"run\",\n rest: positionals.slice(1),\n features: flags.get(\"--features\"),\n steps: flags.get(\"--steps\"),\n tags: flags.get(\"--tags\"),\n json: bools.has(\"--json\"),\n help: bools.has(\"--help\") || bools.has(\"-h\"),\n };\n}\n",
|
|
9
|
-
"/**\n * The verify cross-link, half two: hold every scenario trace against the\n * verification config — the always-on, static, cheap gate (`polly bdd check`).\n * The deeper TLC reachability *witness* rides `polly verify --witness`\n * (tools/verify); this file never runs a model checker.\n *\n * Three checks, each the BDD analogue of a verify guarantee:\n * 1. every `When` message type is one the config actually models (and so has\n * a handler the model knows about) — a scenario that drives a phantom\n * message is a scenario about nothing;\n * 2. every `Given`/`Then` state expression names a field the config tracks —\n * an assertion on an unmodeled field can't be cross-checked or verified;\n * 3. every feature that filters/selects/validates carries a negative\n * complement (a scenario tagged `@negative` or `@formal`) — the mechanical\n * enforcer of the Tester's \"prove the system also says no\" rule, which is\n * exactly what mutation testing then makes teeth on.\n */\nimport { resolve } from \"node:path\";\nimport { extractTraces } from \"./extract.ts\";\nimport type { ScenarioTrace } from \"./types.ts\";\n\nexport interface Finding {\n kind: \"error\" | \"warn\";\n scenario: string;\n message: string;\n}\n\nexport interface CrossCheckResult {\n ok: boolean;\n checked: number;\n findings: Finding[];\n}\n\ninterface VerifyConfigShape {\n state?: Record<string, unknown>;\n messages?: { include?: string[]; perMessageBounds?: Record<string, number> };\n subsystems?: Record<string, { state?: string[]; handlers?: string[] }>;\n}\n\nasync function loadVerifyConfig(configPath: string): Promise<VerifyConfigShape> {\n const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);\n const config = mod.verificationConfig ?? mod.default;\n if (!config) throw new Error(`no verificationConfig/default export in ${configPath}`);\n
|
|
9
|
+
"/**\n * The verify cross-link, half two: hold every scenario trace against the\n * verification config — the always-on, static, cheap gate (`polly bdd check`).\n * The deeper TLC reachability *witness* rides `polly verify --witness`\n * (tools/verify); this file never runs a model checker.\n *\n * Three checks, each the BDD analogue of a verify guarantee:\n * 1. every `When` message type is one the config actually models (and so has\n * a handler the model knows about) — a scenario that drives a phantom\n * message is a scenario about nothing;\n * 2. every `Given`/`Then` state expression names a field the config tracks —\n * an assertion on an unmodeled field can't be cross-checked or verified;\n * 3. every feature that filters/selects/validates carries a negative\n * complement (a scenario tagged `@negative` or `@formal`) — the mechanical\n * enforcer of the Tester's \"prove the system also says no\" rule, which is\n * exactly what mutation testing then makes teeth on.\n */\nimport { resolve } from \"node:path\";\nimport { extractTraces } from \"./extract.ts\";\nimport type { ScenarioTrace } from \"./types.ts\";\n\nexport interface Finding {\n kind: \"error\" | \"warn\";\n scenario: string;\n message: string;\n}\n\nexport interface CrossCheckResult {\n ok: boolean;\n checked: number;\n findings: Finding[];\n}\n\ninterface VerifyConfigShape {\n state?: Record<string, unknown>;\n messages?: { include?: string[]; perMessageBounds?: Record<string, number> };\n subsystems?: Record<string, { state?: string[]; handlers?: string[] }>;\n}\n\nfunction isRecord(input: unknown): input is Record<string, unknown> {\n return typeof input === \"object\" && input !== null && !Array.isArray(input);\n}\n\nfunction isStringArray(input: unknown): input is string[] {\n return Array.isArray(input) && input.every((item) => typeof item === \"string\");\n}\n\nfunction isMessagesShape(input: unknown): input is VerifyConfigShape[\"messages\"] {\n if (!isRecord(input)) return false;\n if (input[\"include\"] !== undefined && !isStringArray(input[\"include\"])) return false;\n if (input[\"perMessageBounds\"] !== undefined && !isRecord(input[\"perMessageBounds\"])) {\n return false;\n }\n return true;\n}\n\nfunction isSubsystemsShape(input: unknown): input is VerifyConfigShape[\"subsystems\"] {\n if (!isRecord(input)) return false;\n for (const sub of Object.values(input)) {\n if (!isRecord(sub)) return false;\n if (sub[\"state\"] !== undefined && !isStringArray(sub[\"state\"])) return false;\n if (sub[\"handlers\"] !== undefined && !isStringArray(sub[\"handlers\"])) return false;\n }\n return true;\n}\n\n/**\n * Narrow a dynamically imported export to the slice of the verification config\n * this file reads. A bare cast would accept a config whose `messages.include`\n * or `subsystems[x].handlers` is not an array of strings, and every check below\n * would then read an empty set and report a clean bill on nothing. Keys this\n * file does not read are left alone.\n */\nfunction isVerifyConfigShape(input: unknown): input is VerifyConfigShape {\n if (!isRecord(input)) return false;\n if (input[\"state\"] !== undefined && !isRecord(input[\"state\"])) return false;\n if (input[\"messages\"] !== undefined && !isMessagesShape(input[\"messages\"])) return false;\n if (input[\"subsystems\"] !== undefined && !isSubsystemsShape(input[\"subsystems\"])) return false;\n return true;\n}\n\nasync function loadVerifyConfig(configPath: string): Promise<VerifyConfigShape> {\n const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);\n const config: unknown = mod.verificationConfig ?? mod.default;\n if (!config) throw new Error(`no verificationConfig/default export in ${configPath}`);\n if (!isVerifyConfigShape(config)) {\n throw new Error(\n `verificationConfig in ${configPath} does not match the shape this check reads ` +\n \"(state must be an object; messages.include and subsystems[*].state/handlers must be string arrays)\"\n );\n }\n return config;\n}\n\n/** Union of every message type the config models. */\nfunction messageSet(config: VerifyConfigShape): Set<string> {\n const set = new Set<string>();\n for (const t of config.messages?.include ?? []) set.add(t);\n for (const t of Object.keys(config.messages?.perMessageBounds ?? {})) set.add(t);\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const h of sub.handlers ?? []) set.add(h);\n }\n return set;\n}\n\n/** Every state field key the config tracks. */\nfunction stateKeys(config: VerifyConfigShape): string[] {\n const keys = new Set(Object.keys(config.state ?? {}));\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const f of sub.state ?? []) keys.add(f);\n }\n return [...keys];\n}\n\n/** Dotted identifier paths in an expression, minus string literals and keywords. */\nfunction fieldsIn(expr: string): string[] {\n const noStrings = expr.replace(/\"[^\"]*\"|'[^']*'/g, \"\");\n const ids = noStrings.match(/[a-zA-Z_$][\\w$]*(?:\\.[a-zA-Z_$][\\w$]*)*/g) ?? [];\n const ignore = new Set([\"true\", \"false\", \"null\", \"undefined\", \"length\", \"value\"]);\n return ids.filter((id) => !ignore.has(id) && Number.isNaN(Number(id)));\n}\n\n/** A field matches a config key if either is a dotted prefix of the other. */\nfunction fieldKnown(field: string, keys: string[]): boolean {\n return keys.some((k) => k === field || field.startsWith(`${k}.`) || k.startsWith(`${field}.`));\n}\n\nconst NEGATIVE_TAGS = new Set([\"negative\", \"formal\", \"forbidden\"]);\n\nfunction checkTrace(\n trace: ScenarioTrace,\n messages: Set<string>,\n keys: string[],\n findings: Finding[]\n): void {\n const id = `${trace.feature} › ${trace.scenario}`;\n\n for (const step of [...trace.given, ...trace.when, ...trace.then]) {\n if (step.unbound) {\n findings.push({ kind: \"warn\", scenario: id, message: `step has no binding: \"${step.text}\"` });\n }\n }\n\n for (const step of trace.when) {\n if (step.message && !messages.has(step.message)) {\n findings.push({\n kind: \"error\",\n scenario: id,\n message: `When sends \"${step.message}\", which the verification config does not model`,\n });\n }\n }\n\n for (const step of [...trace.given, ...trace.then]) {\n if (!step.stateExpr) continue;\n for (const field of fieldsIn(step.stateExpr)) {\n if (!fieldKnown(field, keys)) {\n findings.push({\n kind: \"error\",\n scenario: id,\n message: `${step.keyword} asserts on \"${field}\", absent from the config's state map`,\n });\n }\n }\n }\n}\n\n/** A feature filters/selects/validates if any Then mentions an exclusion/limit notion. */\nfunction featureNeedsNegative(traces: ScenarioTrace[]): boolean {\n return traces.some((t) =>\n t.then.some((s) => /\\bnot\\b|exclud|reject|empty|invalid|limit|forbidden/i.test(s.text))\n );\n}\n\nfunction checkNegativeComplement(traces: ScenarioTrace[], findings: Finding[]): void {\n const byFeature = new Map<string, ScenarioTrace[]>();\n for (const t of traces) {\n const arr = byFeature.get(t.feature) ?? [];\n arr.push(t);\n byFeature.set(t.feature, arr);\n }\n for (const [feature, group] of byFeature) {\n const hasNegative = group.some((t) => t.tags.some((tag) => NEGATIVE_TAGS.has(tag)));\n if (!hasNegative && featureNeedsNegative(group)) {\n findings.push({\n kind: \"warn\",\n scenario: feature,\n message:\n \"feature filters/selects/validates but has no negative complement (a @negative or @formal scenario) — an over-permissive build would still pass\",\n });\n }\n }\n}\n\nexport async function checkAgainstVerify(opts: {\n featureFiles: string[];\n stepFiles: string[];\n configPath: string;\n}): Promise<CrossCheckResult> {\n const config = await loadVerifyConfig(opts.configPath);\n const messages = messageSet(config);\n const keys = stateKeys(config);\n\n const traces = await extractTraces(opts.featureFiles, opts.stepFiles);\n const findings: Finding[] = [];\n\n for (const trace of traces) checkTrace(trace, messages, keys, findings);\n checkNegativeComplement(traces, findings);\n\n return {\n ok: findings.every((f) => f.kind !== \"error\"),\n checked: traces.length,\n findings,\n };\n}\n",
|
|
10
10
|
"/**\n * The verify cross-link, half one: reduce each scenario to a {@link ScenarioTrace}\n * over the *same vocabulary the verification config speaks* — Given (initial\n * state exprs) → When (message types) → Then (state exprs).\n *\n * This is to `.feature` files what `extractCondition` (tools/analysis) is to a\n * `requires()` call: it reads the statically-declared `message`/`stateExpr`\n * metadata off each matched step binding and hands check-verify a structure it\n * can compare against the config and the TLA+ model. Steps that match no\n * binding are kept as `unbound` so gaps are visible rather than silently empty.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { matchStep, resetRegistry } from \"./steps.ts\";\nimport type { ScenarioTrace, TraceStep } from \"./types.ts\";\n\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\nfunction toTraceStep(text: string, keyword: TraceStep[\"keyword\"]): TraceStep {\n const match = matchStep(text, keyword);\n if (!match) return { text, keyword, unbound: true };\n return {\n text,\n keyword,\n message: match.binding.message,\n stateExpr: match.binding.stateExpr,\n };\n}\n\nexport async function extractTraces(\n featureFiles: string[],\n stepFiles: string[]\n): Promise<ScenarioTrace[]> {\n await loadStepModules(stepFiles);\n const traces: ScenarioTrace[] = [];\n\n for (const file of featureFiles) {\n const feature = await parseFeatureFile(file);\n for (const scenario of feature.scenarios) {\n const allSteps = [...feature.background, ...scenario.steps];\n const trace: ScenarioTrace = {\n feature: feature.name,\n scenario: scenario.name,\n tags: [...feature.tags, ...scenario.tags],\n given: [],\n when: [],\n // biome-ignore lint/suspicious/noThenProperty: `then` is Gherkin vocabulary here, not a thenable.\n then: [],\n file,\n };\n for (const step of allSteps) {\n trace[step.keyword].push(toTraceStep(step.text, step.keyword));\n }\n traces.push(trace);\n }\n }\n return traces;\n}\n",
|
|
11
11
|
"/**\n * Resolve the feature files and step modules `polly bdd` operates on, relative\n * to the cwd it was invoked from — so a consumer's project tree works the same\n * as this repo. Convention (overridable with --features / --steps):\n * - features: features/**\\/*.feature\n * - steps: features/**\\/*.steps.ts + features/steps.ts\n * A positional path narrows the feature glob to a single file or directory.\n */\nimport { resolve } from \"node:path\";\nimport { Glob } from \"bun\";\nimport type { BddArgs } from \"./args.ts\";\n\nexport interface BddConfig {\n cwd: string;\n /** Absolute paths of `.feature` files to run. */\n featureFiles: string[];\n /** Absolute paths of step-definition modules to import (side-effect registration). */\n stepFiles: string[];\n}\n\nasync function expand(cwd: string, pattern: string): Promise<string[]> {\n const out: string[] = [];\n for await (const f of new Glob(pattern).scan({ cwd, absolute: true, onlyFiles: true })) {\n out.push(f);\n }\n return out.sort();\n}\n\nexport async function resolveBddConfig(cwd: string, args: BddArgs): Promise<BddConfig> {\n // A positional path (verb's first rest arg for `run`) narrows the features.\n const pathArg = args.verb === \"run\" ? args.rest[0] : undefined;\n\n let featurePattern = args.features ?? \"features/**/*.feature\";\n if (pathArg) {\n featurePattern = pathArg.endsWith(\".feature\")\n ? pathArg\n : `${pathArg.replace(/\\/$/, \"\")}/**/*.feature`;\n }\n\n const stepPatterns = args.steps ? [args.steps] : [\"features/**/*.steps.ts\", \"features/steps.ts\"];\n\n const featureFiles = pathArg?.endsWith(\".feature\")\n ? [resolve(cwd, pathArg)]\n : await expand(cwd, featurePattern);\n\n const stepSets = await Promise.all(stepPatterns.map((p) => expand(cwd, p)));\n const stepFiles = [...new Set(stepSets.flat())];\n\n return { cwd, featureFiles, stepFiles };\n}\n",
|
|
12
12
|
"/**\n * Human- and machine-readable formatting of a {@link RunResult}.\n */\nimport type { RunResult, ScenarioResult } from \"./types.ts\";\n\nconst MARK: Record<ScenarioResult[\"outcome\"], string> = {\n pass: \"✓\",\n fail: \"✗\",\n undefined: \"?\",\n \"deferred-formal\": \"→\",\n};\n\nfunction relFile(file: string, cwd: string): string {\n return file.startsWith(cwd) ? file.slice(cwd.length + 1) : file;\n}\n\n/** The detail lines under a failed/undefined/deferred scenario. */\nfunction scenarioDetail(s: ScenarioResult): string[] {\n if (s.outcome === \"deferred-formal\") {\n return [\n \" deferred to polly verify — precondition is formal-only (requires() is a runtime no-op)\",\n ];\n }\n if (s.outcome !== \"fail\" && s.outcome !== \"undefined\") return [];\n const lines: string[] = [];\n for (const step of s.steps) {\n if (step.outcome !== \"fail\" && step.outcome !== \"undefined\") continue;\n lines.push(` ${step.outcome === \"fail\" ? \"✗\" : \"?\"} ${step.rawKeyword} ${step.text}`);\n if (step.message) lines.push(` ↳ ${step.message}`);\n }\n return lines;\n}\n\nexport function formatRun(result: RunResult, cwd: string): string {\n const lines: string[] = [];\n let currentFeature = \"\";\n\n for (const s of result.scenarios) {\n if (s.feature !== currentFeature) {\n currentFeature = s.feature;\n lines.push(`\\nFeature: ${s.feature} (${relFile(s.file, cwd)})`);\n }\n lines.push(` ${MARK[s.outcome]} ${s.scenario}`);\n lines.push(...scenarioDetail(s));\n }\n\n lines.push(\"\");\n lines.push(\n `${result.ok ? \"✓\" : \"✗\"} ${result.passed} passed, ${result.failed} failed, ` +\n `${result.undefinedSteps} undefined, ${result.deferred} deferred (formal)`\n );\n return lines.join(\"\\n\");\n}\n\nexport function toJson(result: RunResult): string {\n return JSON.stringify(result, null, 2);\n}\n",
|
|
13
13
|
"/**\n * The runtime engine: parse features, load step modules, drive each scenario\n * against the *real* factory world the consumer built in `defineWorld`.\n *\n * What this stratum can and cannot check is deliberate. Runtime BDD asserts on\n * *observable* behaviour — state-signal changes and the response a handler\n * returns. Polly's `requires()` preconditions are runtime no-ops (they exist\n * only for the TLA+ model), so a precondition-only negative (e.g. \"a guest\n * login is rejected\") is NOT runtime-observable. Tag those `@formal`: the\n * runner defers them with a clear note, and `polly verify` is where they're\n * actually checked — the `requires()` guard is extracted into the TLA+ model.\n * This is the three strata dividing the work.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { getWorldDef, matchStep, resetRegistry } from \"./steps.ts\";\nimport type {\n ParsedFeature,\n ParsedScenario,\n ParsedStep,\n RunResult,\n ScenarioResult,\n StepResult,\n World,\n} from \"./types.ts\";\n\n// Tags whose scenarios are formal-only — checked by `polly verify`, not the\n// runtime runner. `@formal` covers precondition-only negatives (requires() is a\n// runtime no-op); `@forbidden` covers safety claims (\"this state never happens\"),\n// which a single runtime execution cannot establish. Both are deferred here and\n// settled by `polly verify --witness`.\nconst DEFERRED_TAGS = new Set([\"formal\", \"forbidden\"]);\n\nexport interface RunOptions {\n featureFiles: string[];\n stepFiles: string[];\n /** Only run scenarios carrying this tag (without leading @); ~tag negates. */\n tagFilter?: string;\n}\n\n/** Import each step module so its `defineStep`/`defineWorld` side effects run. */\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n // Cache-bust so repeated in-process runs re-register cleanly.\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\nfunction tagMatches(tags: string[], filter?: string): boolean {\n if (!filter) return true;\n if (filter.startsWith(\"~\")) return !tags.includes(filter.slice(1));\n return tags.includes(filter);\n}\n\nasync function runStep(world: World, step: ParsedStep): Promise<StepResult> {\n const base = { text: step.text, rawKeyword: step.rawKeyword };\n const match = matchStep(step.text, step.keyword);\n if (!match) {\n return { ...base, outcome: \"undefined\", message: `no binding matches \"${step.text}\"` };\n }\n const fn = match.binding[step.keyword];\n if (!fn) {\n return {\n ...base,\n outcome: \"undefined\",\n message: `binding for \"${step.text}\" has no '${step.keyword}' callback`,\n };\n }\n try {\n const ret = await fn(world, ...match.args);\n // A `when` that returns the send promise gets its response captured.\n if (ret !== undefined) world.lastResponse = ret;\n return { ...base, outcome: \"pass\" };\n } catch (err) {\n world.lastError = err;\n return { ...base, outcome: \"fail\", message: err instanceof Error ? err.message : String(err) };\n }\n}\n\nasync function runScenario(\n world: World,\n feature: ParsedFeature,\n scenario: ParsedScenario,\n reset: (w: World) => void | Promise<void>\n): Promise<ScenarioResult> {\n const result: ScenarioResult = {\n feature: feature.name,\n scenario: scenario.name,\n tags: scenario.tags,\n outcome: \"pass\",\n steps: [],\n file: feature.file,\n };\n\n // Cold start: reset the world (signals → initial) and clear per-scenario scratch.\n await reset(world);\n world.vars = {};\n world.lastResponse = undefined;\n world.lastError = undefined;\n\n const steps = [...feature.background, ...scenario.steps];\n let aborted = false;\n for (const step of steps) {\n if (aborted) {\n result.steps.push({ text: step.text, rawKeyword: step.rawKeyword, outcome: \"skipped\" });\n continue;\n }\n const sr = await runStep(world, step);\n result.steps.push(sr);\n if (sr.outcome === \"fail\") {\n result.outcome = \"fail\";\n aborted = true;\n } else if (sr.outcome === \"undefined\") {\n result.outcome = result.outcome === \"fail\" ? \"fail\" : \"undefined\";\n aborted = true;\n }\n }\n return result;\n}\n\nexport async function runFeatures(options: RunOptions): Promise<RunResult> {\n await loadStepModules(options.stepFiles);\n\n const worldDef = getWorldDef();\n if (!worldDef) {\n throw new Error(\n \"no world defined. A step module must call defineWorld({ create, reset }) — see tools/bdd/README.md.\"\n );\n }\n const world = await worldDef.create();\n\n const features = await Promise.all(options.featureFiles.map((f) => parseFeatureFile(f)));\n const scenarios: ScenarioResult[] = [];\n\n try {\n for (const feature of features) {\n for (const scenario of feature.scenarios) {\n const tags = [...feature.tags, ...scenario.tags];\n if (!tagMatches(tags, options.tagFilter)) continue;\n\n if (tags.some((t) => DEFERRED_TAGS.has(t))) {\n scenarios.push({\n feature: feature.name,\n scenario: scenario.name,\n tags,\n outcome: \"deferred-formal\",\n steps: [],\n file: feature.file,\n });\n continue;\n }\n scenarios.push(await runScenario(world, feature, { ...scenario, tags }, worldDef.reset));\n }\n }\n } finally {\n // Release any real resources the world holds (browsers, relay, sockets),\n // even when a scenario threw — otherwise the runner hangs on live handles.\n await worldDef.teardown?.(world);\n }\n\n const passed = scenarios.filter((s) => s.outcome === \"pass\").length;\n const failed = scenarios.filter((s) => s.outcome === \"fail\").length;\n const undef = scenarios.filter((s) => s.outcome === \"undefined\").length;\n const deferred = scenarios.filter((s) => s.outcome === \"deferred-formal\").length;\n\n return {\n scenarios,\n passed,\n failed,\n undefinedSteps: undef,\n deferred,\n ok: failed === 0 && undef === 0,\n };\n}\n",
|
|
14
14
|
"/**\n * `polly bdd new <feature>` — scaffold a `.feature` stub seeded from the\n * project's verification config, so a three-amigos session starts from polly's\n * real ubiquitous language (the message types and state fields the model\n * already tracks) instead of inventing terms. The session's job is to turn\n * those into declarative scenarios; this just lays the table.\n */\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\ninterface ConfigShape {\n state?: Record<string, unknown>;\n messages?: { include?: string[]; perMessageBounds?: Record<string, number> };\n subsystems?: Record<string, { handlers?: string[] }>;\n}\n\nasync function loadVocabulary(\n configPath: string\n): Promise<{ messages: string[]; fields: string[] }> {\n if (!existsSync(configPath)) return { messages: [], fields: [] };\n const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);\n const config: ConfigShape = mod.verificationConfig ?? mod.default ?? {};\n const messages = new Set<string>();\n for (const t of config.messages?.include ?? []) messages.add(t);\n for (const t of Object.keys(config.messages?.perMessageBounds ?? {})) messages.add(t);\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const h of sub.handlers ?? []) messages.add(h);\n }\n return { messages: [...messages].sort(), fields: Object.keys(config.state ?? {}).sort() };\n}\n\nfunction slug(name: string): string {\n return name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nexport interface ScaffoldResult {\n created: boolean;\n featurePath: string;\n messages: string[];\n fields: string[];\n}\n\nexport async function scaffoldFeature(\n cwd: string,\n name: string,\n configPath: string\n): Promise<ScaffoldResult> {\n const { messages, fields } = await loadVocabulary(configPath);\n const featurePath = resolve(cwd, \"features\", `${slug(name)}.feature`);\n\n if (existsSync(featurePath)) {\n return { created: false, featurePath, messages, fields };\n }\n\n const body = `Feature: ${name}\n # Three-amigos: state the user story, then converge on declarative scenarios.\n # As a <role> I want <capability> so that <benefit>.\n #\n # Bind each step in features/steps.ts. The dual-use binding carries formal\n # metadata so 'polly bdd check' can cross-check it against the verify config:\n # When-steps declare \\`message\\` (a modeled message type)\n # Given/Then-steps declare \\`stateExpr\\` (a tracked state field)\n #\n # Message types this project models:\n${messages.map((m) => ` # - ${m}`).join(\"\\n\") || \" # (none found — is specs/verification.config.ts present?)\"}\n # State fields this project tracks:\n${fields.map((f) => ` # - ${f}`).join(\"\\n\") || \" # (none found)\"}\n\n Scenario: <name the behaviour by its outcome>\n Given <context that is already true>\n When <a single action>\n Then <an observable outcome>\n\n @negative\n Scenario: <the negative complement — what is excluded / rejected / empty>\n Given <context>\n When <a single action>\n Then <the system observably says no>\n`;\n\n await Bun.write(featurePath, body);\n return { created: true, featurePath, messages, fields };\n}\n"
|
|
15
15
|
],
|
|
16
|
-
"mappings": "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",
|
|
17
|
-
"debugId": "
|
|
16
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAWA;AAEA;AAGA,SAAS,SAAS,GAAG;AAAA,EACnB,OAAO,IAAI,OAAO,IAAI,WAAW,YAAY,KAAK,CAAC,GAAG,IAAI,0BAA4B;AAAA;AAIxF,SAAS,gBAAgB,CAAC,KAAa,MAAuC;AAAA,EAC5E,MAAM,IAAI,IAAI,KAAK,EAAE,YAAY;AAAA,EACjC,IAAI,MAAM;AAAA,IAAS,OAAO;AAAA,EAC1B,IAAI,MAAM;AAAA,IAAQ,OAAO;AAAA,EACzB,IAAI,MAAM;AAAA,IAAQ,OAAO;AAAA,EACzB,OAAO,QAAQ;AAAA;AASjB,SAAS,cAAc,CAAC,UAA4C;AAAA,EAClE,MAAM,MAAoB,CAAC;AAAA,EAC3B,IAAI,OAA2B;AAAA,EAC/B,WAAW,KAAK,UAAU;AAAA,IACxB,MAAM,UAAU,iBAAiB,EAAE,SAAS,IAAI;AAAA,IAChD,OAAO;AAAA,IACP,IAAI,KAAK;AAAA,MACP;AAAA,MACA,YAAY,EAAE,QAAQ,KAAK;AAAA,MAC3B,MAAM,EAAE,KAAK,KAAK;AAAA,MAClB,MAAM,EAAE,UAAU,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,QAAQ,CAAC,MAA6D;AAAA,EAC7E,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,QAAQ,MAAM,EAAE,CAAC;AAAA;AAIzD,SAAS,WAAW,CAAC,MAAc,SAAmB,OAAyB;AAAA,EAC7E,IAAI,SAAS;AAAA,EACb,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAAA,IACxB,SAAS,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,MAAM,EAAE;AAAA,GACpD;AAAA,EACD,OAAO;AAAA;AAIT,SAAS,cAAc,CAAC,IAAgC;AAAA,EACtD,MAAM,YAAY,GAAG,SAAS,CAAC;AAAA,EAC/B,MAAM,OAAO,SAAS,GAAG,IAAI;AAAA,EAC7B,MAAM,WAAW,GAAG,YAAY,CAAC;AAAA,EAEjC,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB,OAAO;AAAA,MACL,EAAE,MAAM,GAAG,MAAM,MAAM,OAAO,eAAe,SAAS,GAAG,MAAM,GAAG,UAAU,QAAQ,EAAE;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,MAAM,MAAwB,CAAC;AAAA,EAC/B,WAAW,MAAM,UAAU;AAAA,IACzB,MAAM,WAAW,GAAG,aAAa,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,IAChE,WAAW,OAAO,GAAG,aAAa,CAAC,GAAG;AAAA,MACpC,MAAM,SAAS,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,MAClD,MAAM,WAAW,UAAU,IAAI,CAAC,OAAO;AAAA,QACrC,SAAS,EAAE;AAAA,QACX,MAAM,YAAY,EAAE,MAAM,SAAS,KAAK;AAAA,QACxC,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,MACF,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,MAAM,MAAM,IAAI,EAAE,KAAK,IAAI;AAAA,MACvE,IAAI,KAAK;AAAA,QACP,MAAM,GAAG,GAAG,SAAS;AAAA,QACrB,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAAA,QACpC,OAAO,eAAe,QAAQ;AAAA,QAC9B,MAAM,IAAI,UAAU,QAAQ,GAAG,UAAU,QAAQ;AAAA,QACjD,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,gBAAgB,CAAC,MAAc,MAA6B;AAAA,EAC1E,MAAM,MAAuB,UAAU,EAAE,MAAM,IAAI;AAAA,EACnD,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO,EAAE,MAAM,IAAI,aAAa,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,WAAW,CAAC,GAAG,KAAK;AAAA,EACpF;AAAA,EAEA,IAAI,aAA2B,CAAC;AAAA,EAChC,MAAM,YAA8B,CAAC;AAAA,EAErC,WAAW,SAAS,QAAQ,YAAY,CAAC,GAAG;AAAA,IAC1C,IAAI,MAAM,YAAY;AAAA,MACpB,aAAa,eAAe,MAAM,WAAW,SAAS,CAAC,CAAC;AAAA,IAC1D,EAAO,SAAI,MAAM,UAAU;AAAA,MACzB,UAAU,KAAK,GAAG,eAAe,MAAM,QAAQ,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,cAAc,QAAQ,eAAe,IAAI,KAAK;AAAA,IAC9C,MAAM,SAAS,QAAQ,IAAI;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAGF,eAAsB,gBAAgB,CAAC,MAAsC;AAAA,EAC3E,MAAM,OAAO,MAAM,IAAI,KAAK,IAAI,EAAE,KAAK;AAAA,EACvC,OAAO,iBAAiB,MAAM,IAAI;AAAA;AAAA;;;AC7FpC,SAAS,KAAK,GAAkB;AAAA,EAC9B,WAAW,yBAAyB,EAAE,UAAU,CAAC,GAAG,UAAU,KAAK;AAAA,EACnE,OAAO,WAAW;AAAA;AAIb,SAAS,cAAc,CAAC,SAAyB;AAAA,EAEtD,MAAM,UAAU,QAAQ,QAAQ,uBAAuB,MAAM;AAAA,EAC7D,MAAM,aAAa,QAIhB,QAAQ,mBAAmB,yBAAyB,EACpD,QAAQ,gBAAgB,aAAa,EACrC,QAAQ,kBAAkB,qBAAqB,EAC/C,QAAQ,iBAAiB,WAAW;AAAA,EAEvC,OAAO,IAAI,OAAO,IAAI,aAAa;AAAA;AAG9B,SAAS,UAAU,CAAC,SAA4B;AAAA,EACrD,MAAM,EAAE,SAAS,KAAK,EAAE,SAAS,OAAO,eAAe,QAAQ,OAAO,EAAE,CAAC;AAAA;AAGpE,SAAS,WAAW,CAAC,KAAqB;AAAA,EAC/C,MAAM,EAAE,WAAW;AAAA;AAGd,SAAS,WAAW,GAAoB;AAAA,EAC7C,OAAO,MAAM,EAAE;AAAA;AAIV,SAAS,aAAa,GAAS;AAAA,EACpC,MAAM,IAAI,MAAM;AAAA,EAChB,EAAE,SAAS,SAAS;AAAA,EACpB,EAAE,WAAW;AAAA;AAiBR,SAAS,SAAS,CAAC,MAAc,SAAyC;AAAA,EAC/E,IAAI,mBAAqC;AAAA,EACzC,aAAa,SAAS,WAAW,MAAM,EAAE,UAAU;AAAA,IACjD,MAAM,IAAI,MAAM,KAAK,IAAI;AAAA,IACzB,IAAI,CAAC;AAAA,MAAG;AAAA,IACR,MAAM,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,SAAS;AAAA,IACrD,IAAI,CAAC,WAAW,QAAQ;AAAA,MAAU,OAAO,EAAE,SAAS,KAAK;AAAA,IACzD,qBAAqB,EAAE,SAAS,KAAK;AAAA,EACvC;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,kBAAkB,GAAkB;AAAA,EAClD,OAAO,MAAM,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA;;;AC3F9C,oBAAS;;;ACQT,IAAM,cAAc,IAAI,IAAI,CAAC,cAAc,WAAW,QAAQ,CAAC;AAExD,SAAS,YAAY,CAAC,MAAyB;AAAA,EACpD,MAAM,cAAwB,CAAC;AAAA,EAC/B,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,QAAQ,IAAI;AAAA,EAElB,IAAI,IAAI;AAAA,EACR,OAAO,IAAI,KAAK,QAAQ;AAAA,IACtB,MAAM,IAAI,KAAK,MAAM;AAAA,IACrB,IAAI,YAAY,IAAI,CAAC,GAAG;AAAA,MACtB,MAAM,IAAI,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,MAC9B,KAAK;AAAA,IACP,EAAO;AAAA,MACL,IAAI,EAAE,WAAW,GAAG;AAAA,QAAG,MAAM,IAAI,CAAC;AAAA,MAC7B;AAAA,oBAAY,KAAK,CAAC;AAAA,MACvB,KAAK;AAAA;AAAA,EAET;AAAA,EAEA,OAAO;AAAA,IACL,MAAM,YAAY,MAAM;AAAA,IACxB,MAAM,YAAY,MAAM,CAAC;AAAA,IACzB,UAAU,MAAM,IAAI,YAAY;AAAA,IAChC,OAAO,MAAM,IAAI,SAAS;AAAA,IAC1B,MAAM,MAAM,IAAI,QAAQ;AAAA,IACxB,MAAM,MAAM,IAAI,QAAQ;AAAA,IACxB,MAAM,MAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,EAC7C;AAAA;;;AChCF;;;ACNA;AAIA,eAAe,eAAe,CAAC,WAAoC;AAAA,EACjE,cAAc;AAAA,EACd,WAAW,QAAQ,WAAW;AAAA,IAC5B,MAAa,UAAG,UAAU,IAAI,YAAY;AAAA,EAC5C;AAAA;AAGF,SAAS,WAAW,CAAC,MAAc,SAA0C;AAAA,EAC3E,MAAM,QAAQ,UAAU,MAAM,OAAO;AAAA,EACrC,IAAI,CAAC;AAAA,IAAO,OAAO,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,EAClD,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,MAAM,QAAQ;AAAA,IACvB,WAAW,MAAM,QAAQ;AAAA,EAC3B;AAAA;AAGF,eAAsB,aAAa,CACjC,cACA,WAC0B;AAAA,EAC1B,MAAM,gBAAgB,SAAS;AAAA,EAC/B,MAAM,SAA0B,CAAC;AAAA,EAEjC,WAAW,QAAQ,cAAc;AAAA,IAC/B,MAAM,UAAU,MAAM,iBAAiB,IAAI;AAAA,IAC3C,WAAW,YAAY,QAAQ,WAAW;AAAA,MACxC,MAAM,WAAW,CAAC,GAAG,QAAQ,YAAY,GAAG,SAAS,KAAK;AAAA,MAC1D,MAAM,QAAuB;AAAA,QAC3B,SAAS,QAAQ;AAAA,QACjB,UAAU,SAAS;AAAA,QACnB,MAAM,CAAC,GAAG,QAAQ,MAAM,GAAG,SAAS,IAAI;AAAA,QACxC,OAAO,CAAC;AAAA,QACR,MAAM,CAAC;AAAA,QAEP,MAAM,CAAC;AAAA,QACP;AAAA,MACF;AAAA,MACA,WAAW,QAAQ,UAAU;AAAA,QAC3B,MAAM,KAAK,SAAS,KAAK,YAAY,KAAK,MAAM,KAAK,OAAO,CAAC;AAAA,MAC/D;AAAA,MACA,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;ADrBT,SAAS,QAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAAA;AAG5E,SAAS,aAAa,CAAC,OAAmC;AAAA,EACxD,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ;AAAA;AAG/E,SAAS,eAAe,CAAC,OAAwD;AAAA,EAC/E,IAAI,CAAC,SAAS,KAAK;AAAA,IAAG,OAAO;AAAA,EAC7B,IAAI,MAAM,eAAe,aAAa,CAAC,cAAc,MAAM,UAAU;AAAA,IAAG,OAAO;AAAA,EAC/E,IAAI,MAAM,wBAAwB,aAAa,CAAC,SAAS,MAAM,mBAAmB,GAAG;AAAA,IACnF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,OAA0D;AAAA,EACnF,IAAI,CAAC,SAAS,KAAK;AAAA,IAAG,OAAO;AAAA,EAC7B,WAAW,OAAO,OAAO,OAAO,KAAK,GAAG;AAAA,IACtC,IAAI,CAAC,SAAS,GAAG;AAAA,MAAG,OAAO;AAAA,IAC3B,IAAI,IAAI,aAAa,aAAa,CAAC,cAAc,IAAI,QAAQ;AAAA,MAAG,OAAO;AAAA,IACvE,IAAI,IAAI,gBAAgB,aAAa,CAAC,cAAc,IAAI,WAAW;AAAA,MAAG,OAAO;AAAA,EAC/E;AAAA,EACA,OAAO;AAAA;AAUT,SAAS,mBAAmB,CAAC,OAA4C;AAAA,EACvE,IAAI,CAAC,SAAS,KAAK;AAAA,IAAG,OAAO;AAAA,EAC7B,IAAI,MAAM,aAAa,aAAa,CAAC,SAAS,MAAM,QAAQ;AAAA,IAAG,OAAO;AAAA,EACtE,IAAI,MAAM,gBAAgB,aAAa,CAAC,gBAAgB,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EACnF,IAAI,MAAM,kBAAkB,aAAa,CAAC,kBAAkB,MAAM,aAAa;AAAA,IAAG,OAAO;AAAA,EACzF,OAAO;AAAA;AAGT,eAAe,gBAAgB,CAAC,YAAgD;AAAA,EAC9E,MAAM,MAAM,MAAa,iBAAU,QAAQ,UAAU,OAAO,IAAI,YAAY;AAAA,EAC5E,MAAM,SAAkB,IAAI,sBAAsB,IAAI;AAAA,EACtD,IAAI,CAAC;AAAA,IAAQ,MAAM,IAAI,MAAM,2CAA2C,YAAY;AAAA,EACpF,IAAI,CAAC,oBAAoB,MAAM,GAAG;AAAA,IAChC,MAAM,IAAI,MACR,yBAAyB,yJAE3B;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,UAAU,CAAC,QAAwC;AAAA,EAC1D,MAAM,MAAM,IAAI;AAAA,EAChB,WAAW,KAAK,OAAO,UAAU,WAAW,CAAC;AAAA,IAAG,IAAI,IAAI,CAAC;AAAA,EACzD,WAAW,KAAK,OAAO,KAAK,OAAO,UAAU,oBAAoB,CAAC,CAAC;AAAA,IAAG,IAAI,IAAI,CAAC;AAAA,EAC/E,WAAW,OAAO,OAAO,OAAO,OAAO,cAAc,CAAC,CAAC,GAAG;AAAA,IACxD,WAAW,KAAK,IAAI,YAAY,CAAC;AAAA,MAAG,IAAI,IAAI,CAAC;AAAA,EAC/C;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,SAAS,CAAC,QAAqC;AAAA,EACtD,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;AAAA,EACpD,WAAW,OAAO,OAAO,OAAO,OAAO,cAAc,CAAC,CAAC,GAAG;AAAA,IACxD,WAAW,KAAK,IAAI,SAAS,CAAC;AAAA,MAAG,KAAK,IAAI,CAAC;AAAA,EAC7C;AAAA,EACA,OAAO,CAAC,GAAG,IAAI;AAAA;AAIjB,SAAS,QAAQ,CAAC,MAAwB;AAAA,EACxC,MAAM,YAAY,KAAK,QAAQ,oBAAoB,EAAE;AAAA,EACrD,MAAM,MAAM,UAAU,MAAM,0CAA0C,KAAK,CAAC;AAAA,EAC5E,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,SAAS,QAAQ,aAAa,UAAU,OAAO,CAAC;AAAA,EAChF,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,KAAK,OAAO,MAAM,OAAO,EAAE,CAAC,CAAC;AAAA;AAIvE,SAAS,UAAU,CAAC,OAAe,MAAyB;AAAA,EAC1D,OAAO,KAAK,KAAK,CAAC,MAAM,MAAM,SAAS,MAAM,WAAW,GAAG,IAAI,KAAK,EAAE,WAAW,GAAG,QAAQ,CAAC;AAAA;AAG/F,IAAM,gBAAgB,IAAI,IAAI,CAAC,YAAY,UAAU,WAAW,CAAC;AAEjE,SAAS,UAAU,CACjB,OACA,UACA,MACA,UACM;AAAA,EACN,MAAM,KAAK,GAAG,MAAM,aAAa,MAAM;AAAA,EAEvC,WAAW,QAAQ,CAAC,GAAG,MAAM,OAAO,GAAG,MAAM,MAAM,GAAG,MAAM,IAAI,GAAG;AAAA,IACjE,IAAI,KAAK,SAAS;AAAA,MAChB,SAAS,KAAK,EAAE,MAAM,QAAQ,UAAU,IAAI,SAAS,yBAAyB,KAAK,QAAQ,CAAC;AAAA,IAC9F;AAAA,EACF;AAAA,EAEA,WAAW,QAAQ,MAAM,MAAM;AAAA,IAC7B,IAAI,KAAK,WAAW,CAAC,SAAS,IAAI,KAAK,OAAO,GAAG;AAAA,MAC/C,SAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,eAAe,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,WAAW,QAAQ,CAAC,GAAG,MAAM,OAAO,GAAG,MAAM,IAAI,GAAG;AAAA,IAClD,IAAI,CAAC,KAAK;AAAA,MAAW;AAAA,IACrB,WAAW,SAAS,SAAS,KAAK,SAAS,GAAG;AAAA,MAC5C,IAAI,CAAC,WAAW,OAAO,IAAI,GAAG;AAAA,QAC5B,SAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,GAAG,KAAK,uBAAuB;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAIF,SAAS,oBAAoB,CAAC,QAAkC;AAAA,EAC9D,OAAO,OAAO,KAAK,CAAC,MAClB,EAAE,KAAK,KAAK,CAAC,MAAM,uDAAuD,KAAK,EAAE,IAAI,CAAC,CACxF;AAAA;AAGF,SAAS,uBAAuB,CAAC,QAAyB,UAA2B;AAAA,EACnF,MAAM,YAAY,IAAI;AAAA,EACtB,WAAW,KAAK,QAAQ;AAAA,IACtB,MAAM,MAAM,UAAU,IAAI,EAAE,OAAO,KAAK,CAAC;AAAA,IACzC,IAAI,KAAK,CAAC;AAAA,IACV,UAAU,IAAI,EAAE,SAAS,GAAG;AAAA,EAC9B;AAAA,EACA,YAAY,SAAS,UAAU,WAAW;AAAA,IACxC,MAAM,cAAc,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,cAAc,IAAI,GAAG,CAAC,CAAC;AAAA,IAClF,IAAI,CAAC,eAAe,qBAAqB,KAAK,GAAG;AAAA,MAC/C,SAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAGF,eAAsB,kBAAkB,CAAC,MAIX;AAAA,EAC5B,MAAM,SAAS,MAAM,iBAAiB,KAAK,UAAU;AAAA,EACrD,MAAM,WAAW,WAAW,MAAM;AAAA,EAClC,MAAM,OAAO,UAAU,MAAM;AAAA,EAE7B,MAAM,SAAS,MAAM,cAAc,KAAK,cAAc,KAAK,SAAS;AAAA,EACpE,MAAM,WAAsB,CAAC;AAAA,EAE7B,WAAW,SAAS;AAAA,IAAQ,WAAW,OAAO,UAAU,MAAM,QAAQ;AAAA,EACtE,wBAAwB,QAAQ,QAAQ;AAAA,EAExC,OAAO;AAAA,IACL,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,IAC5C,SAAS,OAAO;AAAA,IAChB;AAAA,EACF;AAAA;;;AE7MF,oBAAS;AACT;AAWA,eAAe,MAAM,CAAC,KAAa,SAAoC;AAAA,EACrE,MAAM,MAAgB,CAAC;AAAA,EACvB,iBAAiB,KAAK,IAAI,KAAK,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,MAAM,WAAW,KAAK,CAAC,GAAG;AAAA,IACtF,IAAI,KAAK,CAAC;AAAA,EACZ;AAAA,EACA,OAAO,IAAI,KAAK;AAAA;AAGlB,eAAsB,gBAAgB,CAAC,KAAa,MAAmC;AAAA,EAErF,MAAM,UAAU,KAAK,SAAS,QAAQ,KAAK,KAAK,KAAK;AAAA,EAErD,IAAI,iBAAiB,KAAK,YAAY;AAAA,EACtC,IAAI,SAAS;AAAA,IACX,iBAAiB,QAAQ,SAAS,UAAU,IACxC,UACA,GAAG,QAAQ,QAAQ,OAAO,EAAE;AAAA,EAClC;AAAA,EAEA,MAAM,eAAe,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,0BAA0B,mBAAmB;AAAA,EAE/F,MAAM,eAAe,SAAS,SAAS,UAAU,IAC7C,CAAC,SAAQ,KAAK,OAAO,CAAC,IACtB,MAAM,OAAO,KAAK,cAAc;AAAA,EAEpC,MAAM,WAAW,MAAM,QAAQ,IAAI,aAAa,IAAI,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC;AAAA,EAC1E,MAAM,YAAY,CAAC,GAAG,IAAI,IAAI,SAAS,KAAK,CAAC,CAAC;AAAA,EAE9C,OAAO,EAAE,KAAK,cAAc,UAAU;AAAA;;;AC3CxC,IAAM,OAAkD;AAAA,EACtD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,mBAAmB;AACrB;AAEA,SAAS,OAAO,CAAC,MAAc,KAAqB;AAAA,EAClD,OAAO,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI;AAAA;AAI7D,SAAS,cAAc,CAAC,GAA6B;AAAA,EACnD,IAAI,EAAE,YAAY,mBAAmB;AAAA,IACnC,OAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,EAAE,YAAY,UAAU,EAAE,YAAY;AAAA,IAAa,OAAO,CAAC;AAAA,EAC/D,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,QAAQ,EAAE,OAAO;AAAA,IAC1B,IAAI,KAAK,YAAY,UAAU,KAAK,YAAY;AAAA,MAAa;AAAA,IAC7D,MAAM,KAAK,SAAS,KAAK,YAAY,SAAS,MAAM,OAAO,KAAK,cAAc,KAAK,MAAM;AAAA,IACzF,IAAI,KAAK;AAAA,MAAS,MAAM,KAAK,aAAa,KAAK,SAAS;AAAA,EAC1D;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,SAAS,CAAC,QAAmB,KAAqB;AAAA,EAChE,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,iBAAiB;AAAA,EAErB,WAAW,KAAK,OAAO,WAAW;AAAA,IAChC,IAAI,EAAE,YAAY,gBAAgB;AAAA,MAChC,iBAAiB,EAAE;AAAA,MACnB,MAAM,KAAK;AAAA,WAAc,EAAE,aAAa,QAAQ,EAAE,MAAM,GAAG,IAAI;AAAA,IACjE;AAAA,IACA,MAAM,KAAK,KAAK,KAAK,EAAE,YAAY,EAAE,UAAU;AAAA,IAC/C,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC;AAAA,EACjC;AAAA,EAEA,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KACJ,GAAG,OAAO,KAAK,MAAM,OAAO,OAAO,kBAAkB,OAAO,oBAC1D,GAAG,OAAO,6BAA6B,OAAO,4BAClD;AAAA,EACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAGjB,SAAS,MAAM,CAAC,QAA2B;AAAA,EAChD,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA;;;AC1CvC;AAiBA,IAAM,gBAAgB,IAAI,IAAI,CAAC,UAAU,WAAW,CAAC;AAUrD,eAAe,gBAAe,CAAC,WAAoC;AAAA,EACjE,cAAc;AAAA,EACd,WAAW,QAAQ,WAAW;AAAA,IAE5B,MAAa,UAAG,UAAU,IAAI,YAAY;AAAA,EAC5C;AAAA;AAGF,SAAS,UAAU,CAAC,MAAgB,QAA0B;AAAA,EAC5D,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EACpB,IAAI,OAAO,WAAW,GAAG;AAAA,IAAG,OAAO,CAAC,KAAK,SAAS,OAAO,MAAM,CAAC,CAAC;AAAA,EACjE,OAAO,KAAK,SAAS,MAAM;AAAA;AAG7B,eAAe,OAAO,CAAC,OAAc,MAAuC;AAAA,EAC1E,MAAM,OAAO,EAAE,MAAM,KAAK,MAAM,YAAY,KAAK,WAAW;AAAA,EAC5D,MAAM,QAAQ,UAAU,KAAK,MAAM,KAAK,OAAO;AAAA,EAC/C,IAAI,CAAC,OAAO;AAAA,IACV,OAAO,KAAK,MAAM,SAAS,aAAa,SAAS,uBAAuB,KAAK,QAAQ;AAAA,EACvF;AAAA,EACA,MAAM,KAAK,MAAM,QAAQ,KAAK;AAAA,EAC9B,IAAI,CAAC,IAAI;AAAA,IACP,OAAO;AAAA,SACF;AAAA,MACH,SAAS;AAAA,MACT,SAAS,gBAAgB,KAAK,iBAAiB,KAAK;AAAA,IACtD;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IACF,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,IAAI;AAAA,IAEzC,IAAI,QAAQ;AAAA,MAAW,MAAM,eAAe;AAAA,IAC5C,OAAO,KAAK,MAAM,SAAS,OAAO;AAAA,IAClC,OAAO,KAAK;AAAA,IACZ,MAAM,YAAY;AAAA,IAClB,OAAO,KAAK,MAAM,SAAS,QAAQ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA;AAAA;AAIjG,eAAe,WAAW,CACxB,OACA,SACA,UACA,OACyB;AAAA,EACzB,MAAM,SAAyB;AAAA,IAC7B,SAAS,QAAQ;AAAA,IACjB,UAAU,SAAS;AAAA,IACnB,MAAM,SAAS;AAAA,IACf,SAAS;AAAA,IACT,OAAO,CAAC;AAAA,IACR,MAAM,QAAQ;AAAA,EAChB;AAAA,EAGA,MAAM,MAAM,KAAK;AAAA,EACjB,MAAM,OAAO,CAAC;AAAA,EACd,MAAM,eAAe;AAAA,EACrB,MAAM,YAAY;AAAA,EAElB,MAAM,QAAQ,CAAC,GAAG,QAAQ,YAAY,GAAG,SAAS,KAAK;AAAA,EACvD,IAAI,UAAU;AAAA,EACd,WAAW,QAAQ,OAAO;AAAA,IACxB,IAAI,SAAS;AAAA,MACX,OAAO,MAAM,KAAK,EAAE,MAAM,KAAK,MAAM,YAAY,KAAK,YAAY,SAAS,UAAU,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,IACA,MAAM,KAAK,MAAM,QAAQ,OAAO,IAAI;AAAA,IACpC,OAAO,MAAM,KAAK,EAAE;AAAA,IACpB,IAAI,GAAG,YAAY,QAAQ;AAAA,MACzB,OAAO,UAAU;AAAA,MACjB,UAAU;AAAA,IACZ,EAAO,SAAI,GAAG,YAAY,aAAa;AAAA,MACrC,OAAO,UAAU,OAAO,YAAY,SAAS,SAAS;AAAA,MACtD,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,eAAsB,WAAW,CAAC,SAAyC;AAAA,EACzE,MAAM,iBAAgB,QAAQ,SAAS;AAAA,EAEvC,MAAM,WAAW,YAAY;AAAA,EAC7B,IAAI,CAAC,UAAU;AAAA,IACb,MAAM,IAAI,MACR,qGACF;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS,OAAO;AAAA,EAEpC,MAAM,WAAW,MAAM,QAAQ,IAAI,QAAQ,aAAa,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC;AAAA,EACvF,MAAM,YAA8B,CAAC;AAAA,EAErC,IAAI;AAAA,IACF,WAAW,WAAW,UAAU;AAAA,MAC9B,WAAW,YAAY,QAAQ,WAAW;AAAA,QACxC,MAAM,OAAO,CAAC,GAAG,QAAQ,MAAM,GAAG,SAAS,IAAI;AAAA,QAC/C,IAAI,CAAC,WAAW,MAAM,QAAQ,SAAS;AAAA,UAAG;AAAA,QAE1C,IAAI,KAAK,KAAK,CAAC,MAAM,cAAc,IAAI,CAAC,CAAC,GAAG;AAAA,UAC1C,UAAU,KAAK;AAAA,YACb,SAAS,QAAQ;AAAA,YACjB,UAAU,SAAS;AAAA,YACnB;AAAA,YACA,SAAS;AAAA,YACT,OAAO,CAAC;AAAA,YACR,MAAM,QAAQ;AAAA,UAChB,CAAC;AAAA,UACD;AAAA,QACF;AAAA,QACA,UAAU,KAAK,MAAM,YAAY,OAAO,SAAS,KAAK,UAAU,KAAK,GAAG,SAAS,KAAK,CAAC;AAAA,MACzF;AAAA,IACF;AAAA,YACA;AAAA,IAGA,MAAM,SAAS,WAAW,KAAK;AAAA;AAAA,EAGjC,MAAM,SAAS,UAAU,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE;AAAA,EAC7D,MAAM,SAAS,UAAU,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE;AAAA,EAC7D,MAAM,QAAQ,UAAU,OAAO,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE;AAAA,EACjE,MAAM,WAAW,UAAU,OAAO,CAAC,MAAM,EAAE,YAAY,iBAAiB,EAAE;AAAA,EAE1E,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,IAAI,WAAW,KAAK,UAAU;AAAA,EAChC;AAAA;;;ACrKF;AACA,oBAAS;AAQT,eAAe,cAAc,CAC3B,YACmD;AAAA,EACnD,IAAI,CAAC,WAAW,UAAU;AAAA,IAAG,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC/D,MAAM,MAAM,MAAa,iBAAU,SAAQ,UAAU,OAAO,IAAI,YAAY;AAAA,EAC5E,MAAM,SAAsB,IAAI,sBAAsB,IAAI,WAAW,CAAC;AAAA,EACtE,MAAM,WAAW,IAAI;AAAA,EACrB,WAAW,KAAK,OAAO,UAAU,WAAW,CAAC;AAAA,IAAG,SAAS,IAAI,CAAC;AAAA,EAC9D,WAAW,KAAK,OAAO,KAAK,OAAO,UAAU,oBAAoB,CAAC,CAAC;AAAA,IAAG,SAAS,IAAI,CAAC;AAAA,EACpF,WAAW,OAAO,OAAO,OAAO,OAAO,cAAc,CAAC,CAAC,GAAG;AAAA,IACxD,WAAW,KAAK,IAAI,YAAY,CAAC;AAAA,MAAG,SAAS,IAAI,CAAC;AAAA,EACpD;AAAA,EACA,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAE,KAAK,GAAG,QAAQ,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA;AAG1F,SAAS,IAAI,CAAC,MAAsB;AAAA,EAClC,OAAO,KACJ,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AAAA;AAUzB,eAAsB,eAAe,CACnC,KACA,MACA,YACyB;AAAA,EACzB,QAAQ,UAAU,WAAW,MAAM,eAAe,UAAU;AAAA,EAC5D,MAAM,cAAc,SAAQ,KAAK,YAAY,GAAG,KAAK,IAAI,WAAW;AAAA,EAEpE,IAAI,WAAW,WAAW,GAAG;AAAA,IAC3B,OAAO,EAAE,SAAS,OAAO,aAAa,UAAU,OAAO;AAAA,EACzD;AAAA,EAEA,MAAM,OAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUzB,SAAS,IAAI,CAAC,MAAM,WAAW,GAAG,EAAE,KAAK;AAAA,CAAI,KAAK;AAAA;AAAA,EAElD,OAAO,IAAI,CAAC,MAAM,WAAW,GAAG,EAAE,KAAK;AAAA,CAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAchD,MAAM,IAAI,MAAM,aAAa,IAAI;AAAA,EACjC,OAAO,EAAE,SAAS,MAAM,aAAa,UAAU,OAAO;AAAA;;;APhExD,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBb,eAAe,IAAI,GAAoB;AAAA,EACrC,MAAM,OAAO,aAAa,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EAC/C,IAAI,KAAK,QAAQ,KAAK,SAAS,QAAQ;AAAA,IACrC,QAAQ,IAAI,IAAI;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,QAAQ,IAAI;AAAA,EAExB,QAAQ,KAAK;AAAA,SACN,OAAO;AAAA,MACV,MAAM,MAAM,MAAM,iBAAiB,KAAK,IAAI;AAAA,MAC5C,IAAI,IAAI,aAAa,WAAW,GAAG;AAAA,QACjC,QAAQ,IAAI,6DAA6D;AAAA,QACzE,OAAO;AAAA,MACT;AAAA,MACA,IAAI,IAAI,UAAU,WAAW,GAAG;AAAA,QAC9B,QAAQ,IACN,kFACF;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA,MAAM,SAAS,MAAM,YAAY;AAAA,QAC/B,cAAc,IAAI;AAAA,QAClB,WAAW,IAAI;AAAA,QACf,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,MACD,QAAQ,IAAI,KAAK,OAAO,OAAO,MAAM,IAAI,UAAU,QAAQ,GAAG,CAAC;AAAA,MAC/D,OAAO,OAAO,KAAK,IAAI;AAAA,IACzB;AAAA,SAEK,SAAS;AAAA,MACZ,MAAM,MAAM,MAAM,iBAAiB,KAAK,IAAI;AAAA,MAC5C,MAAM,aAAa,SAAQ,KAAK,SAAS,wBAAwB;AAAA,MACjE,MAAM,SAAS,MAAM,mBAAmB;AAAA,QACtC,cAAc,IAAI;AAAA,QAClB,WAAW,IAAI;AAAA,QACf;AAAA,MACF,CAAC;AAAA,MACD,IAAI,KAAK,MAAM;AAAA,QACb,QAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,QAC3C,OAAO,OAAO,KAAK,IAAI;AAAA,MACzB;AAAA,MACA,QAAQ,IAAI;AAAA,gBAAmB,OAAO,sDAAsD;AAAA,MAC5F,IAAI,OAAO,SAAS,WAAW,GAAG;AAAA,QAChC,QAAQ,IAAI,8EAA8E;AAAA,MAC5F;AAAA,MACA,WAAW,KAAK,OAAO,UAAU;AAAA,QAC/B,QAAQ,IAAI,KAAK,EAAE,SAAS,UAAU,MAAM,OAAO,EAAE;AAAA,QAAmB,EAAE,SAAS;AAAA,MACrF;AAAA,MACA,QAAQ,IAAI,OAAO,KAAK;AAAA,qCAAwC;AAAA,sBAAyB;AAAA,MACzF,OAAO,OAAO,KAAK,IAAI;AAAA,IACzB;AAAA,SAEK,OAAO;AAAA,MACV,MAAM,OAAO,KAAK,KAAK,KAAK,GAAG,EAAE,KAAK;AAAA,MACtC,IAAI,CAAC,MAAM;AAAA,QACT,QAAQ,IAAI,qCAAqC;AAAA,QACjD,OAAO;AAAA,MACT;AAAA,MACA,MAAM,aAAa,SAAQ,KAAK,SAAS,wBAAwB;AAAA,MACjE,MAAM,MAAM,MAAM,gBAAgB,KAAK,MAAM,UAAU;AAAA,MACvD,IAAI,CAAC,IAAI,SAAS;AAAA,QAChB,QAAQ,IAAI,GAAG,IAAI,6BAA6B;AAAA,QAChD,OAAO;AAAA,MACT;AAAA,MACA,QAAQ,IAAI,WAAW,IAAI,aAAa;AAAA,MACxC,QAAQ,IACN,iBAAiB,IAAI,SAAS,2BAA2B,IAAI,OAAO,uBACtE;AAAA,MACA,QAAQ,IAAI;AAAA,iEAAoE;AAAA,MAChF,OAAO;AAAA,IACT;AAAA;AAAA,MAGE,QAAQ,IAAI,uBAAuB,KAAK;AAAA,CAAQ;AAAA,MAChD,QAAQ,IAAI,IAAI;AAAA,MAChB,OAAO;AAAA;AAAA;AAIb,KAAK,EACF,KAAK,CAAC,SAAS,QAAQ,KAAK,IAAI,CAAC,EACjC,MAAM,CAAC,QAAQ;AAAA,EACd,QAAQ,IAAI;AAAA,IAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG;AAAA,EACrE,QAAQ,KAAK,CAAC;AAAA,CACf;",
|
|
17
|
+
"debugId": "B2B9C0FD1C95AD7B64756E2164756E21",
|
|
18
18
|
"names": []
|
|
19
19
|
}
|
|
@@ -300,11 +300,54 @@ async function extractTraces(featureFiles, stepFiles) {
|
|
|
300
300
|
}
|
|
301
301
|
|
|
302
302
|
// tools/bdd/src/check-verify.ts
|
|
303
|
+
function isRecord(input) {
|
|
304
|
+
return typeof input === "object" && input !== null && !Array.isArray(input);
|
|
305
|
+
}
|
|
306
|
+
function isStringArray(input) {
|
|
307
|
+
return Array.isArray(input) && input.every((item) => typeof item === "string");
|
|
308
|
+
}
|
|
309
|
+
function isMessagesShape(input) {
|
|
310
|
+
if (!isRecord(input))
|
|
311
|
+
return false;
|
|
312
|
+
if (input["include"] !== undefined && !isStringArray(input["include"]))
|
|
313
|
+
return false;
|
|
314
|
+
if (input["perMessageBounds"] !== undefined && !isRecord(input["perMessageBounds"])) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
function isSubsystemsShape(input) {
|
|
320
|
+
if (!isRecord(input))
|
|
321
|
+
return false;
|
|
322
|
+
for (const sub of Object.values(input)) {
|
|
323
|
+
if (!isRecord(sub))
|
|
324
|
+
return false;
|
|
325
|
+
if (sub["state"] !== undefined && !isStringArray(sub["state"]))
|
|
326
|
+
return false;
|
|
327
|
+
if (sub["handlers"] !== undefined && !isStringArray(sub["handlers"]))
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
function isVerifyConfigShape(input) {
|
|
333
|
+
if (!isRecord(input))
|
|
334
|
+
return false;
|
|
335
|
+
if (input["state"] !== undefined && !isRecord(input["state"]))
|
|
336
|
+
return false;
|
|
337
|
+
if (input["messages"] !== undefined && !isMessagesShape(input["messages"]))
|
|
338
|
+
return false;
|
|
339
|
+
if (input["subsystems"] !== undefined && !isSubsystemsShape(input["subsystems"]))
|
|
340
|
+
return false;
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
303
343
|
async function loadVerifyConfig(configPath) {
|
|
304
344
|
const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);
|
|
305
345
|
const config = mod.verificationConfig ?? mod.default;
|
|
306
346
|
if (!config)
|
|
307
347
|
throw new Error(`no verificationConfig/default export in ${configPath}`);
|
|
348
|
+
if (!isVerifyConfigShape(config)) {
|
|
349
|
+
throw new Error(`verificationConfig in ${configPath} does not match the shape this check reads (state must be an object; messages.include and subsystems[*].state/handlers must be string arrays)`);
|
|
350
|
+
}
|
|
308
351
|
return config;
|
|
309
352
|
}
|
|
310
353
|
function messageSet(config) {
|
|
@@ -528,17 +571,17 @@ async function runFeatures(options) {
|
|
|
528
571
|
// tools/bdd/src/index.ts
|
|
529
572
|
init_witness();
|
|
530
573
|
export {
|
|
531
|
-
|
|
532
|
-
registeredBindings,
|
|
533
|
-
parseFeatureText,
|
|
534
|
-
parseFeatureFile,
|
|
535
|
-
matchStep,
|
|
536
|
-
extractWitnesses,
|
|
537
|
-
extractTraces,
|
|
538
|
-
driveBus,
|
|
539
|
-
defineWorld,
|
|
574
|
+
checkAgainstVerify,
|
|
540
575
|
defineStep,
|
|
541
|
-
|
|
576
|
+
defineWorld,
|
|
577
|
+
driveBus,
|
|
578
|
+
extractTraces,
|
|
579
|
+
extractWitnesses,
|
|
580
|
+
matchStep,
|
|
581
|
+
parseFeatureFile,
|
|
582
|
+
parseFeatureText,
|
|
583
|
+
registeredBindings,
|
|
584
|
+
runFeatures
|
|
542
585
|
};
|
|
543
586
|
|
|
544
|
-
//# debugId=
|
|
587
|
+
//# debugId=CAC0C5F204704B1A64756E2164756E21
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
"sources": ["../tools/bdd/src/parse.ts", "../tools/bdd/src/steps.ts", "../tools/bdd/src/witness.ts", "../tools/bdd/src/bus-driver.ts", "../tools/bdd/src/check-verify.ts", "../tools/bdd/src/extract.ts", "../tools/bdd/src/index.ts", "../tools/bdd/src/run.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Parse `.feature` files into the runner's normalized AST.\n *\n * Thin wrapper over `@cucumber/gherkin` (parser only — no cucumber runtime):\n * we keep our own {@link ParsedFeature} shape so the rest of the tool never\n * touches the gherkin message types, and swapping the parser stays a one-file\n * change. Responsibilities beyond raw parsing:\n * - normalize And/But to the preceding concrete keyword (Given/When/Then);\n * - fold Background steps into a feature-level list;\n * - expand each Scenario Outline into one concrete scenario per Examples row.\n */\nimport { AstBuilder, GherkinClassicTokenMatcher, Parser } from \"@cucumber/gherkin\";\nimport type { GherkinDocument, Scenario } from \"@cucumber/messages\";\nimport { IdGenerator } from \"@cucumber/messages\";\nimport type { ParsedFeature, ParsedScenario, ParsedStep, StepKeyword } from \"./types.ts\";\n\nfunction newParser() {\n return new Parser(new AstBuilder(IdGenerator.uuid()), new GherkinClassicTokenMatcher());\n}\n\n/** And/But inherit the previous concrete keyword; a leading And/But defaults to Given. */\nfunction normalizeKeyword(raw: string, prev: StepKeyword | null): StepKeyword {\n const k = raw.trim().toLowerCase();\n if (k === \"given\") return \"given\";\n if (k === \"when\") return \"when\";\n if (k === \"then\") return \"then\";\n return prev ?? \"given\";\n}\n\ninterface RawStep {\n keyword: string;\n text: string;\n location?: { line?: number };\n}\n\nfunction normalizeSteps(rawSteps: readonly RawStep[]): ParsedStep[] {\n const out: ParsedStep[] = [];\n let prev: StepKeyword | null = null;\n for (const s of rawSteps) {\n const keyword = normalizeKeyword(s.keyword, prev);\n prev = keyword;\n out.push({\n keyword,\n rawKeyword: s.keyword.trim(),\n text: s.text.trim(),\n line: s.location?.line ?? 0,\n });\n }\n return out;\n}\n\nfunction tagNames(tags: ReadonlyArray<{ name: string }> | undefined): string[] {\n return (tags ?? []).map((t) => t.name.replace(/^@/, \"\"));\n}\n\n/** Substitute `<placeholder>` cells from an Examples row into step text. */\nfunction fillOutline(text: string, headers: string[], cells: string[]): string {\n let filled = text;\n headers.forEach((h, i) => {\n filled = filled.split(`<${h}>`).join(cells[i] ?? \"\");\n });\n return filled;\n}\n\n/** A plain scenario, or one concrete scenario per Scenario Outline Examples row. */\nfunction buildScenarios(sc: Scenario): ParsedScenario[] {\n const baseSteps = sc.steps ?? [];\n const tags = tagNames(sc.tags);\n const examples = sc.examples ?? [];\n\n if (examples.length === 0) {\n return [\n { name: sc.name, tags, steps: normalizeSteps(baseSteps), line: sc.location?.line ?? 0 },\n ];\n }\n\n const out: ParsedScenario[] = [];\n for (const ex of examples) {\n const headers = (ex.tableHeader?.cells ?? []).map((c) => c.value);\n for (const row of ex.tableBody ?? []) {\n const cells = (row.cells ?? []).map((c) => c.value);\n const rowSteps = baseSteps.map((s) => ({\n keyword: s.keyword,\n text: fillOutline(s.text, headers, cells),\n location: s.location,\n }));\n const label = headers.map((h, i) => `${h}=${cells[i] ?? \"\"}`).join(\", \");\n out.push({\n name: `${sc.name} [${label}]`,\n tags: [...tags, ...tagNames(ex.tags)],\n steps: normalizeSteps(rowSteps),\n line: row.location?.line ?? sc.location?.line ?? 0,\n fromOutline: true,\n });\n }\n }\n return out;\n}\n\nexport function parseFeatureText(text: string, file: string): ParsedFeature {\n const doc: GherkinDocument = newParser().parse(text);\n const feature = doc.feature;\n if (!feature) {\n return { name: \"\", description: \"\", tags: [], background: [], scenarios: [], file };\n }\n\n let background: ParsedStep[] = [];\n const scenarios: ParsedScenario[] = [];\n\n for (const child of feature.children ?? []) {\n if (child.background) {\n background = normalizeSteps(child.background.steps ?? []);\n } else if (child.scenario) {\n scenarios.push(...buildScenarios(child.scenario));\n }\n }\n\n return {\n name: feature.name,\n description: (feature.description ?? \"\").trim(),\n tags: tagNames(feature.tags),\n background,\n scenarios,\n file,\n };\n}\n\nexport async function parseFeatureFile(path: string): Promise<ParsedFeature> {\n const text = await Bun.file(path).text();\n return parseFeatureText(text, path);\n}\n",
|
|
6
|
-
"/**\n * The step-binding registry and matcher.\n *\n * `defineStep()` is the consumer-facing keystone: one call registers a binding\n * that the runner executes (`given`/`when`/`then`) AND the verify extractor\n * reads (`message`/`stateExpr`). `defineWorld()` records how to build and\n * cold-reset the real-factory world.\n *\n * Patterns use a small Cucumber-expression subset: `{string}`, `{int}`,\n * `{float}`, `{word}`. Everything else is matched literally. That covers\n * declarative steps without dragging in the full cucumber-expressions library.\n *\n * The registry lives on `globalThis`, not in a module-level array, on purpose:\n * `polly bdd` ships as two bundles (the CLI and the `@fairfox/polly/bdd`\n * library export). `build-lib` runs with `splitting: false`, so this module is\n * *inlined separately into each bundle* — a module-level array would give the\n * runner and the consumer's `defineWorld` two different registries. A single\n * global slot is the standard cross-bundle-singleton fix.\n */\nimport type { StepBinding, StepKeyword, WorldDef } from \"./types.ts\";\n\ninterface CompiledBinding {\n binding: StepBinding;\n regex: RegExp;\n}\n\ninterface RegistryState {\n bindings: CompiledBinding[];\n worldDef: WorldDef | null;\n}\n\ndeclare global {\n // An ambient global declaration — `var` is the only legal form here.\n var __pollyBddRegistry__: RegistryState | undefined;\n}\n\nfunction state(): RegistryState {\n globalThis.__pollyBddRegistry__ ??= { bindings: [], worldDef: null };\n return globalThis.__pollyBddRegistry__;\n}\n\n/** Translate a Cucumber-expression pattern into an anchored RegExp. */\nexport function compilePattern(pattern: string): RegExp {\n // Escape regex metacharacters, then re-introduce capture groups for {tokens}.\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const withGroups = escaped\n // {string} — double- or single-quoted; capture the inner text. The\n // alternation MUST be wrapped in a non-capturing group, or the `|` would\n // bind to the whole pattern and shatter any step with two+ tokens.\n .replace(/\\\\\\{string\\\\\\}/g, `(?:\"([^\"]*)\"|'([^']*)')`)\n .replace(/\\\\\\{int\\\\\\}/g, \"([-+]?\\\\d+)\")\n .replace(/\\\\\\{float\\\\\\}/g, \"([-+]?\\\\d*\\\\.?\\\\d+)\")\n .replace(/\\\\\\{word\\\\\\}/g, \"([^\\\\s]+)\");\n return new RegExp(`^${withGroups}$`);\n}\n\nexport function defineStep(binding: StepBinding): void {\n state().bindings.push({ binding, regex: compilePattern(binding.pattern) });\n}\n\nexport function defineWorld(def: WorldDef): void {\n state().worldDef = def;\n}\n\nexport function getWorldDef(): WorldDef | null {\n return state().worldDef;\n}\n\n/** Drop all registrations — used between isolated runs/tests. */\nexport function resetRegistry(): void {\n const s = state();\n s.bindings.length = 0;\n s.worldDef = null;\n}\n\nexport interface StepMatch {\n binding: StepBinding;\n args: string[];\n}\n\n/**\n * Find the binding whose pattern matches `text`. Captured groups become the\n * step arguments (the `{string}` alternation yields two groups per token, so\n * we drop the undefined half).\n *\n * When `keyword` is given, a binding that *has* the callback for that keyword\n * wins over one that merely matches the text — so the same phrase can serve as\n * a `given` precondition in one scenario and a `then` assertion in another.\n */\nexport function matchStep(text: string, keyword?: StepKeyword): StepMatch | null {\n let textOnlyFallback: StepMatch | null = null;\n for (const { binding, regex } of state().bindings) {\n const m = regex.exec(text);\n if (!m) continue;\n const args = m.slice(1).filter((g) => g !== undefined);\n if (!keyword || binding[keyword]) return { binding, args };\n textOnlyFallback ??= { binding, args };\n }\n return textOnlyFallback;\n}\n\n/** Snapshot of all registered bindings (for the verify extractor). */\nexport function registeredBindings(): StepBinding[] {\n return state().bindings.map((c) => c.binding);\n}\n",
|
|
6
|
+
"/**\n * The step-binding registry and matcher.\n *\n * `defineStep()` is the consumer-facing keystone: one call registers a binding\n * that the runner executes (`given`/`when`/`then`) AND the verify extractor\n * reads (`message`/`stateExpr`). `defineWorld()` records how to build and\n * cold-reset the real-factory world.\n *\n * Patterns use a small Cucumber-expression subset: `{string}`, `{int}`,\n * `{float}`, `{word}`. Everything else is matched literally. That covers\n * declarative steps without dragging in the full cucumber-expressions library.\n *\n * The registry lives on `globalThis`, not in a module-level array, on purpose:\n * `polly bdd` ships as two bundles (the CLI and the `@fairfox/polly/bdd`\n * library export). `build-lib` runs with `splitting: false`, so this module is\n * *inlined separately into each bundle* — a module-level array would give the\n * runner and the consumer's `defineWorld` two different registries. A single\n * global slot is the standard cross-bundle-singleton fix.\n */\nimport type { StepBinding, StepKeyword, WorldDef } from \"./types.ts\";\n\ninterface CompiledBinding {\n binding: StepBinding;\n regex: RegExp;\n}\n\ninterface RegistryState {\n bindings: CompiledBinding[];\n worldDef: WorldDef | null;\n}\n\ndeclare global {\n // An ambient global declaration — `var` is the only legal form here.\n var __pollyBddRegistry__: RegistryState | undefined;\n}\n\nfunction state(): RegistryState {\n globalThis.__pollyBddRegistry__ ??= { bindings: [], worldDef: null };\n return globalThis.__pollyBddRegistry__;\n}\n\n/** Translate a Cucumber-expression pattern into an anchored RegExp. */\nexport function compilePattern(pattern: string): RegExp {\n // Escape regex metacharacters, then re-introduce capture groups for {tokens}.\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const withGroups = escaped\n // {string} — double- or single-quoted; capture the inner text. The\n // alternation MUST be wrapped in a non-capturing group, or the `|` would\n // bind to the whole pattern and shatter any step with two+ tokens.\n .replace(/\\\\\\{string\\\\\\}/g, `(?:\"([^\"]*)\"|'([^']*)')`)\n .replace(/\\\\\\{int\\\\\\}/g, \"([-+]?\\\\d+)\")\n .replace(/\\\\\\{float\\\\\\}/g, \"([-+]?\\\\d*\\\\.?\\\\d+)\")\n .replace(/\\\\\\{word\\\\\\}/g, \"([^\\\\s]+)\");\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp — `pattern` is a step expression from the project's own step-definition file, not external input, and every metacharacter is escaped above before the {token} groups are re-introduced.\n return new RegExp(`^${withGroups}$`);\n}\n\nexport function defineStep(binding: StepBinding): void {\n state().bindings.push({ binding, regex: compilePattern(binding.pattern) });\n}\n\nexport function defineWorld(def: WorldDef): void {\n state().worldDef = def;\n}\n\nexport function getWorldDef(): WorldDef | null {\n return state().worldDef;\n}\n\n/** Drop all registrations — used between isolated runs/tests. */\nexport function resetRegistry(): void {\n const s = state();\n s.bindings.length = 0;\n s.worldDef = null;\n}\n\nexport interface StepMatch {\n binding: StepBinding;\n args: string[];\n}\n\n/**\n * Find the binding whose pattern matches `text`. Captured groups become the\n * step arguments (the `{string}` alternation yields two groups per token, so\n * we drop the undefined half).\n *\n * When `keyword` is given, a binding that *has* the callback for that keyword\n * wins over one that merely matches the text — so the same phrase can serve as\n * a `given` precondition in one scenario and a `then` assertion in another.\n */\nexport function matchStep(text: string, keyword?: StepKeyword): StepMatch | null {\n let textOnlyFallback: StepMatch | null = null;\n for (const { binding, regex } of state().bindings) {\n const m = regex.exec(text);\n if (!m) continue;\n const args = m.slice(1).filter((g) => g !== undefined);\n if (!keyword || binding[keyword]) return { binding, args };\n textOnlyFallback ??= { binding, args };\n }\n return textOnlyFallback;\n}\n\n/** Snapshot of all registered bindings (for the verify extractor). */\nexport function registeredBindings(): StepBinding[] {\n return state().bindings.map((c) => c.binding);\n}\n",
|
|
7
7
|
"/**\n * The deeper verify cross-link: reduce each scenario to its *Then-predicate* —\n * the observable post-state a passing scenario claims is reachable.\n *\n * Where {@link extractTraces} (and `polly bdd check`) ask \"does this scenario\n * speak the config's vocabulary?\", a witness asks the *formal* question: \"can\n * the exhaustive model actually reach the state this scenario asserts?\" A\n * scenario whose Then-state the model proves unreachable is a scenario that\n * lies — green in the runner, impossible in the model. `polly verify --witness`\n * turns each predicate produced here into a per-scenario TLC reachability check\n * (tools/verify); this module never runs a model checker — it only reduces.\n *\n * The reduction reuses the same dual-use `stateExpr` metadata the static check\n * reads, but it needs the *whole* predicate, not just the field names. So it\n * substitutes the values captured from the step text into the binding's\n * `stateExpr` placeholders: a `then` bound to `user.role === \"{0}\"` matched\n * against `their role is \"admin\"` reduces to `user.role === \"admin\"`. Then-steps\n * whose `stateExpr` is a bare field reference (no comparison) or absent (a\n * runtime-only assertion like `the change is refused`) are not state-observable\n * outcomes — they are reported as skipped, never silently dropped.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { matchStep, resetRegistry } from \"./steps.ts\";\n\n/** A scenario reduced to the post-state it claims, ready for the verify witness. */\nexport interface ScenarioWitness {\n feature: string;\n scenario: string;\n tags: string[];\n file: string;\n /**\n * The conjoined Then-predicate (TS, `signal.field` dialect, values\n * substituted) — e.g. `user.loggedIn === true && user.role === \"admin\"`.\n * `null` when the scenario has no state-observable outcome to witness.\n */\n predicate: string | null;\n /** Dotted state-field paths the predicate references (for subsystem routing). */\n fields: string[];\n /** Then-step texts skipped: a bare field ref, no binding, or a runtime-only check. */\n skipped: string[];\n}\n\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\n/** A predicate is witnessable only if it actually compares — a bare field cannot. */\nconst COMPARISON = /===|!==|==|!=|<=|>=|<|>/;\n\n/** Substitute `{0}`, `{1}`, … in a stateExpr with the values captured from the step text. */\nfunction substituteArgs(expr: string, args: string[]): string {\n return expr.replace(/\\{(\\d+)\\}/g, (whole, index) => args[Number(index)] ?? whole);\n}\n\n/** Dotted identifier paths in an expression, minus string literals and keywords. */\nfunction fieldsIn(expr: string): string[] {\n const noStrings = expr.replace(/\"[^\"]*\"|'[^']*'/g, \"\");\n const ids = noStrings.match(/[a-zA-Z_$][\\w$]*(?:\\.[a-zA-Z_$][\\w$]*)*/g) ?? [];\n const ignore = new Set([\"true\", \"false\", \"null\", \"undefined\", \"length\", \"value\"]);\n return (\n ids\n .filter((id) => !ignore.has(id) && Number.isNaN(Number(id)))\n // Drop a trailing `.length` so routing sees the underlying field (`todos`).\n .map((id) => id.replace(/\\.length$/, \"\"))\n );\n}\n\n/**\n * Reduce one scenario's Then steps to a witness. Conjoins every Then whose\n * bound `stateExpr` resolves to a comparison; records the rest as skipped.\n */\nfunction reduceScenario(\n feature: { name: string; tags: string[]; background: ParsedStepLike[]; file: string },\n scenario: { name: string; tags: string[]; steps: ParsedStepLike[] }\n): ScenarioWitness {\n const thenSteps = [...feature.background, ...scenario.steps].filter((s) => s.keyword === \"then\");\n const conjuncts: string[] = [];\n const skipped: string[] = [];\n\n for (const step of thenSteps) {\n const match = matchStep(step.text, \"then\");\n const expr = match?.binding.stateExpr;\n if (!expr) {\n skipped.push(step.text);\n continue;\n }\n const resolved = substituteArgs(expr, match.args);\n if (!COMPARISON.test(resolved)) {\n // A bare field reference (`todos`, `user.role`) names a field but asserts\n // nothing checkable — useful to `polly bdd check`, not to a witness.\n skipped.push(step.text);\n continue;\n }\n conjuncts.push(resolved);\n }\n\n const predicate = conjuncts.length > 0 ? conjuncts.join(\" && \") : null;\n const fields = [...new Set(conjuncts.flatMap(fieldsIn))];\n return {\n feature: feature.name,\n scenario: scenario.name,\n tags: [...feature.tags, ...scenario.tags],\n file: feature.file,\n predicate,\n fields,\n skipped,\n };\n}\n\ninterface ParsedStepLike {\n keyword: \"given\" | \"when\" | \"then\";\n text: string;\n}\n\n/**\n * Reduce every scenario in the given feature files to a {@link ScenarioWitness}.\n * Step modules are loaded for their `defineStep` side effects (the same import\n * trick {@link extractTraces} uses) so `matchStep` can resolve each Then.\n */\nexport async function extractWitnesses(\n featureFiles: string[],\n stepFiles: string[]\n): Promise<ScenarioWitness[]> {\n await loadStepModules(stepFiles);\n const witnesses: ScenarioWitness[] = [];\n for (const file of featureFiles) {\n const feature = await parseFeatureFile(file);\n for (const scenario of feature.scenarios) {\n witnesses.push(\n reduceScenario(\n {\n name: feature.name,\n tags: feature.tags,\n background: feature.background,\n file: feature.file,\n },\n scenario\n )\n );\n }\n }\n return witnesses;\n}\n",
|
|
8
8
|
"/**\n * Drive a real polly MessageBus from step definitions.\n *\n * `createBackground()` wires a MessageRouter whose request/response loopback\n * runs over ports — which don't exist in a single in-process world, so a\n * self-targeted `bus.send` would just time out. `handleMessage` is the exact\n * method the router calls for a background-targeted message\n * (`routeToSingleTarget` → `this.bus.handleMessage(message)`): it runs the\n * registered handler and returns its response. So we build the inbound\n * RoutedMessage a UI context would send and hand it to `handleMessage`.\n *\n * This crosses the real handler + state-signal path through the real,\n * factory-built bus. The only thing it does NOT exercise is cross-context port\n * transport — and that boundary is covered for real by the mesh e2e scenario,\n * not faked here. (The polly#57 lesson is about not letting a hand-wired bus\n * paper over a factory gap; here the factory built the bus and registered the\n * handlers, and we drive its own dispatch entry point.)\n */\nimport type { BusLike } from \"./types.ts\";\n\n/**\n * Anything with the bus's dispatch entry point. Declared as a *method* (not an\n * arrow property) so its parameter is bivariant — a real\n * `MessageBus<TMessage>`, whose `handleMessage` takes the narrower\n * `RoutedMessage<TMessage>`, is assignable here.\n */\nexport interface DispatchBus {\n handleMessage(message: unknown): Promise<unknown>;\n}\n\ninterface DriveOptions {\n /** The context the message appears to come from (a UI context → background). */\n source?: string;\n /** Default delivery target. */\n target?: string;\n}\n\nexport function driveBus(bus: DispatchBus, driveOpts: DriveOptions = {}): BusLike {\n const source = driveOpts.source ?? \"popup\";\n const defaultTarget = driveOpts.target ?? \"background\";\n\n return {\n async send(payload, options) {\n const target = options?.target ?? defaultTarget;\n const targets = Array.isArray(target) ? target : [target];\n const message = {\n id: crypto.randomUUID(),\n source,\n targets,\n timestamp: Date.now(),\n payload,\n ...(options?.tabId === undefined ? {} : { tabId: options.tabId }),\n };\n const response = (await bus.handleMessage(message)) as\n | { success?: boolean; data?: unknown; error?: string }\n | undefined;\n // Return the handler's own return value (response.data); steps assert on it.\n return response?.data;\n },\n };\n}\n",
|
|
9
|
-
"/**\n * The verify cross-link, half two: hold every scenario trace against the\n * verification config — the always-on, static, cheap gate (`polly bdd check`).\n * The deeper TLC reachability *witness* rides `polly verify --witness`\n * (tools/verify); this file never runs a model checker.\n *\n * Three checks, each the BDD analogue of a verify guarantee:\n * 1. every `When` message type is one the config actually models (and so has\n * a handler the model knows about) — a scenario that drives a phantom\n * message is a scenario about nothing;\n * 2. every `Given`/`Then` state expression names a field the config tracks —\n * an assertion on an unmodeled field can't be cross-checked or verified;\n * 3. every feature that filters/selects/validates carries a negative\n * complement (a scenario tagged `@negative` or `@formal`) — the mechanical\n * enforcer of the Tester's \"prove the system also says no\" rule, which is\n * exactly what mutation testing then makes teeth on.\n */\nimport { resolve } from \"node:path\";\nimport { extractTraces } from \"./extract.ts\";\nimport type { ScenarioTrace } from \"./types.ts\";\n\nexport interface Finding {\n kind: \"error\" | \"warn\";\n scenario: string;\n message: string;\n}\n\nexport interface CrossCheckResult {\n ok: boolean;\n checked: number;\n findings: Finding[];\n}\n\ninterface VerifyConfigShape {\n state?: Record<string, unknown>;\n messages?: { include?: string[]; perMessageBounds?: Record<string, number> };\n subsystems?: Record<string, { state?: string[]; handlers?: string[] }>;\n}\n\nasync function loadVerifyConfig(configPath: string): Promise<VerifyConfigShape> {\n const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);\n const config = mod.verificationConfig ?? mod.default;\n if (!config) throw new Error(`no verificationConfig/default export in ${configPath}`);\n
|
|
9
|
+
"/**\n * The verify cross-link, half two: hold every scenario trace against the\n * verification config — the always-on, static, cheap gate (`polly bdd check`).\n * The deeper TLC reachability *witness* rides `polly verify --witness`\n * (tools/verify); this file never runs a model checker.\n *\n * Three checks, each the BDD analogue of a verify guarantee:\n * 1. every `When` message type is one the config actually models (and so has\n * a handler the model knows about) — a scenario that drives a phantom\n * message is a scenario about nothing;\n * 2. every `Given`/`Then` state expression names a field the config tracks —\n * an assertion on an unmodeled field can't be cross-checked or verified;\n * 3. every feature that filters/selects/validates carries a negative\n * complement (a scenario tagged `@negative` or `@formal`) — the mechanical\n * enforcer of the Tester's \"prove the system also says no\" rule, which is\n * exactly what mutation testing then makes teeth on.\n */\nimport { resolve } from \"node:path\";\nimport { extractTraces } from \"./extract.ts\";\nimport type { ScenarioTrace } from \"./types.ts\";\n\nexport interface Finding {\n kind: \"error\" | \"warn\";\n scenario: string;\n message: string;\n}\n\nexport interface CrossCheckResult {\n ok: boolean;\n checked: number;\n findings: Finding[];\n}\n\ninterface VerifyConfigShape {\n state?: Record<string, unknown>;\n messages?: { include?: string[]; perMessageBounds?: Record<string, number> };\n subsystems?: Record<string, { state?: string[]; handlers?: string[] }>;\n}\n\nfunction isRecord(input: unknown): input is Record<string, unknown> {\n return typeof input === \"object\" && input !== null && !Array.isArray(input);\n}\n\nfunction isStringArray(input: unknown): input is string[] {\n return Array.isArray(input) && input.every((item) => typeof item === \"string\");\n}\n\nfunction isMessagesShape(input: unknown): input is VerifyConfigShape[\"messages\"] {\n if (!isRecord(input)) return false;\n if (input[\"include\"] !== undefined && !isStringArray(input[\"include\"])) return false;\n if (input[\"perMessageBounds\"] !== undefined && !isRecord(input[\"perMessageBounds\"])) {\n return false;\n }\n return true;\n}\n\nfunction isSubsystemsShape(input: unknown): input is VerifyConfigShape[\"subsystems\"] {\n if (!isRecord(input)) return false;\n for (const sub of Object.values(input)) {\n if (!isRecord(sub)) return false;\n if (sub[\"state\"] !== undefined && !isStringArray(sub[\"state\"])) return false;\n if (sub[\"handlers\"] !== undefined && !isStringArray(sub[\"handlers\"])) return false;\n }\n return true;\n}\n\n/**\n * Narrow a dynamically imported export to the slice of the verification config\n * this file reads. A bare cast would accept a config whose `messages.include`\n * or `subsystems[x].handlers` is not an array of strings, and every check below\n * would then read an empty set and report a clean bill on nothing. Keys this\n * file does not read are left alone.\n */\nfunction isVerifyConfigShape(input: unknown): input is VerifyConfigShape {\n if (!isRecord(input)) return false;\n if (input[\"state\"] !== undefined && !isRecord(input[\"state\"])) return false;\n if (input[\"messages\"] !== undefined && !isMessagesShape(input[\"messages\"])) return false;\n if (input[\"subsystems\"] !== undefined && !isSubsystemsShape(input[\"subsystems\"])) return false;\n return true;\n}\n\nasync function loadVerifyConfig(configPath: string): Promise<VerifyConfigShape> {\n const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);\n const config: unknown = mod.verificationConfig ?? mod.default;\n if (!config) throw new Error(`no verificationConfig/default export in ${configPath}`);\n if (!isVerifyConfigShape(config)) {\n throw new Error(\n `verificationConfig in ${configPath} does not match the shape this check reads ` +\n \"(state must be an object; messages.include and subsystems[*].state/handlers must be string arrays)\"\n );\n }\n return config;\n}\n\n/** Union of every message type the config models. */\nfunction messageSet(config: VerifyConfigShape): Set<string> {\n const set = new Set<string>();\n for (const t of config.messages?.include ?? []) set.add(t);\n for (const t of Object.keys(config.messages?.perMessageBounds ?? {})) set.add(t);\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const h of sub.handlers ?? []) set.add(h);\n }\n return set;\n}\n\n/** Every state field key the config tracks. */\nfunction stateKeys(config: VerifyConfigShape): string[] {\n const keys = new Set(Object.keys(config.state ?? {}));\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const f of sub.state ?? []) keys.add(f);\n }\n return [...keys];\n}\n\n/** Dotted identifier paths in an expression, minus string literals and keywords. */\nfunction fieldsIn(expr: string): string[] {\n const noStrings = expr.replace(/\"[^\"]*\"|'[^']*'/g, \"\");\n const ids = noStrings.match(/[a-zA-Z_$][\\w$]*(?:\\.[a-zA-Z_$][\\w$]*)*/g) ?? [];\n const ignore = new Set([\"true\", \"false\", \"null\", \"undefined\", \"length\", \"value\"]);\n return ids.filter((id) => !ignore.has(id) && Number.isNaN(Number(id)));\n}\n\n/** A field matches a config key if either is a dotted prefix of the other. */\nfunction fieldKnown(field: string, keys: string[]): boolean {\n return keys.some((k) => k === field || field.startsWith(`${k}.`) || k.startsWith(`${field}.`));\n}\n\nconst NEGATIVE_TAGS = new Set([\"negative\", \"formal\", \"forbidden\"]);\n\nfunction checkTrace(\n trace: ScenarioTrace,\n messages: Set<string>,\n keys: string[],\n findings: Finding[]\n): void {\n const id = `${trace.feature} › ${trace.scenario}`;\n\n for (const step of [...trace.given, ...trace.when, ...trace.then]) {\n if (step.unbound) {\n findings.push({ kind: \"warn\", scenario: id, message: `step has no binding: \"${step.text}\"` });\n }\n }\n\n for (const step of trace.when) {\n if (step.message && !messages.has(step.message)) {\n findings.push({\n kind: \"error\",\n scenario: id,\n message: `When sends \"${step.message}\", which the verification config does not model`,\n });\n }\n }\n\n for (const step of [...trace.given, ...trace.then]) {\n if (!step.stateExpr) continue;\n for (const field of fieldsIn(step.stateExpr)) {\n if (!fieldKnown(field, keys)) {\n findings.push({\n kind: \"error\",\n scenario: id,\n message: `${step.keyword} asserts on \"${field}\", absent from the config's state map`,\n });\n }\n }\n }\n}\n\n/** A feature filters/selects/validates if any Then mentions an exclusion/limit notion. */\nfunction featureNeedsNegative(traces: ScenarioTrace[]): boolean {\n return traces.some((t) =>\n t.then.some((s) => /\\bnot\\b|exclud|reject|empty|invalid|limit|forbidden/i.test(s.text))\n );\n}\n\nfunction checkNegativeComplement(traces: ScenarioTrace[], findings: Finding[]): void {\n const byFeature = new Map<string, ScenarioTrace[]>();\n for (const t of traces) {\n const arr = byFeature.get(t.feature) ?? [];\n arr.push(t);\n byFeature.set(t.feature, arr);\n }\n for (const [feature, group] of byFeature) {\n const hasNegative = group.some((t) => t.tags.some((tag) => NEGATIVE_TAGS.has(tag)));\n if (!hasNegative && featureNeedsNegative(group)) {\n findings.push({\n kind: \"warn\",\n scenario: feature,\n message:\n \"feature filters/selects/validates but has no negative complement (a @negative or @formal scenario) — an over-permissive build would still pass\",\n });\n }\n }\n}\n\nexport async function checkAgainstVerify(opts: {\n featureFiles: string[];\n stepFiles: string[];\n configPath: string;\n}): Promise<CrossCheckResult> {\n const config = await loadVerifyConfig(opts.configPath);\n const messages = messageSet(config);\n const keys = stateKeys(config);\n\n const traces = await extractTraces(opts.featureFiles, opts.stepFiles);\n const findings: Finding[] = [];\n\n for (const trace of traces) checkTrace(trace, messages, keys, findings);\n checkNegativeComplement(traces, findings);\n\n return {\n ok: findings.every((f) => f.kind !== \"error\"),\n checked: traces.length,\n findings,\n };\n}\n",
|
|
10
10
|
"/**\n * The verify cross-link, half one: reduce each scenario to a {@link ScenarioTrace}\n * over the *same vocabulary the verification config speaks* — Given (initial\n * state exprs) → When (message types) → Then (state exprs).\n *\n * This is to `.feature` files what `extractCondition` (tools/analysis) is to a\n * `requires()` call: it reads the statically-declared `message`/`stateExpr`\n * metadata off each matched step binding and hands check-verify a structure it\n * can compare against the config and the TLA+ model. Steps that match no\n * binding are kept as `unbound` so gaps are visible rather than silently empty.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { matchStep, resetRegistry } from \"./steps.ts\";\nimport type { ScenarioTrace, TraceStep } from \"./types.ts\";\n\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\nfunction toTraceStep(text: string, keyword: TraceStep[\"keyword\"]): TraceStep {\n const match = matchStep(text, keyword);\n if (!match) return { text, keyword, unbound: true };\n return {\n text,\n keyword,\n message: match.binding.message,\n stateExpr: match.binding.stateExpr,\n };\n}\n\nexport async function extractTraces(\n featureFiles: string[],\n stepFiles: string[]\n): Promise<ScenarioTrace[]> {\n await loadStepModules(stepFiles);\n const traces: ScenarioTrace[] = [];\n\n for (const file of featureFiles) {\n const feature = await parseFeatureFile(file);\n for (const scenario of feature.scenarios) {\n const allSteps = [...feature.background, ...scenario.steps];\n const trace: ScenarioTrace = {\n feature: feature.name,\n scenario: scenario.name,\n tags: [...feature.tags, ...scenario.tags],\n given: [],\n when: [],\n // biome-ignore lint/suspicious/noThenProperty: `then` is Gherkin vocabulary here, not a thenable.\n then: [],\n file,\n };\n for (const step of allSteps) {\n trace[step.keyword].push(toTraceStep(step.text, step.keyword));\n }\n traces.push(trace);\n }\n }\n return traces;\n}\n",
|
|
11
11
|
"/**\n * @fairfox/polly/bdd — author executable Gherkin against polly's own model.\n *\n * The CLI (`polly bdd`) is the primary entry point; this barrel exposes the\n * pieces a consumer's step module needs (`defineStep`, `defineWorld`) plus the\n * programmatic surface for driving the runner and the verify cross-link.\n *\n * The binding declared by `defineStep` is dual-use — its `given`/`when`/`then`\n * drive the real factory bus, and its `message`/`stateExpr` are read statically\n * by the verify extractor. See tools/bdd/README.md.\n */\n\nexport { type DispatchBus, driveBus } from \"./bus-driver.ts\";\nexport { type CrossCheckResult, checkAgainstVerify } from \"./check-verify.ts\";\nexport { extractTraces } from \"./extract.ts\";\nexport { parseFeatureFile, parseFeatureText } from \"./parse.ts\";\nexport { type RunOptions, runFeatures } from \"./run.ts\";\nexport { defineStep, defineWorld, matchStep, registeredBindings } from \"./steps.ts\";\nexport type {\n BusLike,\n ParsedFeature,\n ParsedScenario,\n ParsedStep,\n RunResult,\n ScenarioResult,\n ScenarioTrace,\n SignalLike,\n StepBinding,\n StepFn,\n TraceStep,\n World,\n WorldDef,\n} from \"./types.ts\";\nexport { extractWitnesses, type ScenarioWitness } from \"./witness.ts\";\n",
|
|
12
12
|
"/**\n * The runtime engine: parse features, load step modules, drive each scenario\n * against the *real* factory world the consumer built in `defineWorld`.\n *\n * What this stratum can and cannot check is deliberate. Runtime BDD asserts on\n * *observable* behaviour — state-signal changes and the response a handler\n * returns. Polly's `requires()` preconditions are runtime no-ops (they exist\n * only for the TLA+ model), so a precondition-only negative (e.g. \"a guest\n * login is rejected\") is NOT runtime-observable. Tag those `@formal`: the\n * runner defers them with a clear note, and `polly verify` is where they're\n * actually checked — the `requires()` guard is extracted into the TLA+ model.\n * This is the three strata dividing the work.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { getWorldDef, matchStep, resetRegistry } from \"./steps.ts\";\nimport type {\n ParsedFeature,\n ParsedScenario,\n ParsedStep,\n RunResult,\n ScenarioResult,\n StepResult,\n World,\n} from \"./types.ts\";\n\n// Tags whose scenarios are formal-only — checked by `polly verify`, not the\n// runtime runner. `@formal` covers precondition-only negatives (requires() is a\n// runtime no-op); `@forbidden` covers safety claims (\"this state never happens\"),\n// which a single runtime execution cannot establish. Both are deferred here and\n// settled by `polly verify --witness`.\nconst DEFERRED_TAGS = new Set([\"formal\", \"forbidden\"]);\n\nexport interface RunOptions {\n featureFiles: string[];\n stepFiles: string[];\n /** Only run scenarios carrying this tag (without leading @); ~tag negates. */\n tagFilter?: string;\n}\n\n/** Import each step module so its `defineStep`/`defineWorld` side effects run. */\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n // Cache-bust so repeated in-process runs re-register cleanly.\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\nfunction tagMatches(tags: string[], filter?: string): boolean {\n if (!filter) return true;\n if (filter.startsWith(\"~\")) return !tags.includes(filter.slice(1));\n return tags.includes(filter);\n}\n\nasync function runStep(world: World, step: ParsedStep): Promise<StepResult> {\n const base = { text: step.text, rawKeyword: step.rawKeyword };\n const match = matchStep(step.text, step.keyword);\n if (!match) {\n return { ...base, outcome: \"undefined\", message: `no binding matches \"${step.text}\"` };\n }\n const fn = match.binding[step.keyword];\n if (!fn) {\n return {\n ...base,\n outcome: \"undefined\",\n message: `binding for \"${step.text}\" has no '${step.keyword}' callback`,\n };\n }\n try {\n const ret = await fn(world, ...match.args);\n // A `when` that returns the send promise gets its response captured.\n if (ret !== undefined) world.lastResponse = ret;\n return { ...base, outcome: \"pass\" };\n } catch (err) {\n world.lastError = err;\n return { ...base, outcome: \"fail\", message: err instanceof Error ? err.message : String(err) };\n }\n}\n\nasync function runScenario(\n world: World,\n feature: ParsedFeature,\n scenario: ParsedScenario,\n reset: (w: World) => void | Promise<void>\n): Promise<ScenarioResult> {\n const result: ScenarioResult = {\n feature: feature.name,\n scenario: scenario.name,\n tags: scenario.tags,\n outcome: \"pass\",\n steps: [],\n file: feature.file,\n };\n\n // Cold start: reset the world (signals → initial) and clear per-scenario scratch.\n await reset(world);\n world.vars = {};\n world.lastResponse = undefined;\n world.lastError = undefined;\n\n const steps = [...feature.background, ...scenario.steps];\n let aborted = false;\n for (const step of steps) {\n if (aborted) {\n result.steps.push({ text: step.text, rawKeyword: step.rawKeyword, outcome: \"skipped\" });\n continue;\n }\n const sr = await runStep(world, step);\n result.steps.push(sr);\n if (sr.outcome === \"fail\") {\n result.outcome = \"fail\";\n aborted = true;\n } else if (sr.outcome === \"undefined\") {\n result.outcome = result.outcome === \"fail\" ? \"fail\" : \"undefined\";\n aborted = true;\n }\n }\n return result;\n}\n\nexport async function runFeatures(options: RunOptions): Promise<RunResult> {\n await loadStepModules(options.stepFiles);\n\n const worldDef = getWorldDef();\n if (!worldDef) {\n throw new Error(\n \"no world defined. A step module must call defineWorld({ create, reset }) — see tools/bdd/README.md.\"\n );\n }\n const world = await worldDef.create();\n\n const features = await Promise.all(options.featureFiles.map((f) => parseFeatureFile(f)));\n const scenarios: ScenarioResult[] = [];\n\n try {\n for (const feature of features) {\n for (const scenario of feature.scenarios) {\n const tags = [...feature.tags, ...scenario.tags];\n if (!tagMatches(tags, options.tagFilter)) continue;\n\n if (tags.some((t) => DEFERRED_TAGS.has(t))) {\n scenarios.push({\n feature: feature.name,\n scenario: scenario.name,\n tags,\n outcome: \"deferred-formal\",\n steps: [],\n file: feature.file,\n });\n continue;\n }\n scenarios.push(await runScenario(world, feature, { ...scenario, tags }, worldDef.reset));\n }\n }\n } finally {\n // Release any real resources the world holds (browsers, relay, sockets),\n // even when a scenario threw — otherwise the runner hangs on live handles.\n await worldDef.teardown?.(world);\n }\n\n const passed = scenarios.filter((s) => s.outcome === \"pass\").length;\n const failed = scenarios.filter((s) => s.outcome === \"fail\").length;\n const undef = scenarios.filter((s) => s.outcome === \"undefined\").length;\n const deferred = scenarios.filter((s) => s.outcome === \"deferred-formal\").length;\n\n return {\n scenarios,\n passed,\n failed,\n undefinedSteps: undef,\n deferred,\n ok: failed === 0 && undef === 0,\n };\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "CAC0C5F204704B1A64756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"/**\n * Build and serve the component gallery.\n *\n * One `Bun.build` pass of client.tsx bundles the Preact app and — through the\n * components' transitive `.module.css` imports plus the global stylesheets the\n * entry pulls in — emits a single CSS artifact (verified: ~38KB for one\n * primitive). The JS and CSS outputs are served as separate routes, or written\n * to a directory for a static export. CSS-module class hashing is deterministic\n * across builds, so the bundled JS and CSS always agree (the same property the\n * extension build relies on).\n */\n\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\nconst CLIENT_ENTRY = join(HERE, \"client.tsx\");\n/**\n * Where build-lib.ts writes the static gallery at package-build time. Polly\n * ships only `dist`, so the published CLI can't bundle from source at runtime —\n * it serves these pre-built files instead. From the bundled CLI at\n * `dist/tools/gallery/src/`, three levels up is `dist/`, then `gallery/`.\n */\nconst PREBUILT_DIR = join(HERE, \"..\", \"..\", \"..\", \"gallery\");\n\nexport interface GalleryBundle {\n js: string;\n css: string;\n}\n\n/** Bundle the gallery client into a JS string and a CSS string. */\nexport async function buildGalleryBundle(): Promise<GalleryBundle> {\n const result = await Bun.build({\n entrypoints: [CLIENT_ENTRY],\n target: \"browser\",\n format: \"esm\",\n minify: false,\n sourcemap: \"inline\",\n });\n\n if (!result.success) {\n const logs = result.logs.map((log) => String(log)).join(\"\\n\");\n throw new Error(`gallery build failed:\\n${logs}`);\n }\n\n let js = \"\";\n let css = \"\";\n for (const output of result.outputs) {\n const text = await output.text();\n if (output.path.endsWith(\".css\")) css += text;\n else js += text;\n }\n return { js, css };\n}\n\n/** The page shell — links the bundle's JS and CSS as separate files. */\nfunction galleryHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Polly UI gallery</title>\n<link rel=\"stylesheet\" href=\"./gallery.css\">\n</head>\n<body>\n<div id=\"app\"></div>\n<script type=\"module\" src=\"./gallery.js\"></script>\n</body>\n</html>\n`;\n}\n\nexport interface ServeOptions {\n /** Port to bind. 0 (the default) asks the OS for a free port. */\n port?: number;\n}\n\nexport interface RunningGallery {\n url: string;\n port: number;\n stop: () => void;\n}\n\n/**\n * Resolve the page assets to serve. In the monorepo (source present) the client\n * is bundled fresh; in a published package (source stripped) the pre-built files\n * written by build-lib.ts are read from disk. Either way the served bytes are\n * self-contained — no source is needed at request time.\n */\nasync function resolveAssets(): Promise<{ html: string; js: string; css: string }> {\n if (await Bun.file(CLIENT_ENTRY).exists()) {\n const bundle = await buildGalleryBundle();\n return { html: galleryHtml(), js: bundle.js, css: bundle.css };\n }\n const indexFile = Bun.file(join(PREBUILT_DIR, \"index.html\"));\n if (!(await indexFile.exists())) {\n throw new Error(\n `no gallery source or pre-built bundle found (looked for ${CLIENT_ENTRY} and ${PREBUILT_DIR}). ` +\n \"Rebuild the package with 'bun run build:lib'.\"\n );\n }\n return {\n html: await indexFile.text(),\n js: await Bun.file(join(PREBUILT_DIR, \"gallery.js\")).text(),\n css: await Bun.file(join(PREBUILT_DIR, \"gallery.css\")).text(),\n };\n}\n\n/** Build (or load) once, then serve the gallery over HTTP until `stop()`. */\nexport async function serveGallery(options: ServeOptions = {}): Promise<RunningGallery> {\n const { html, js, css } = await resolveAssets();\n const bundle = { js, css };\n\n const server = Bun.serve({\n port: options.port ?? 0,\n fetch(req) {\n const { pathname } = new URL(req.url);\n if (pathname === \"/\" || pathname === \"/index.html\") {\n return new Response(html, {\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n }\n if (pathname === \"/gallery.js\") {\n return new Response(bundle.js, {\n headers: { \"Content-Type\": \"text/javascript; charset=utf-8\" },\n });\n }\n if (pathname === \"/gallery.css\") {\n return new Response(bundle.css, {\n headers: { \"Content-Type\": \"text/css; charset=utf-8\" },\n });\n }\n // The browser always requests a favicon; answer quietly so it doesn't\n // surface as a console error (the e2e gates on a clean console).\n if (pathname === \"/favicon.ico\") {\n return new Response(null, { status: 204 });\n }\n return new Response(\"Not found\", { status: 404 });\n },\n });\n\n const boundPort = server.port ?? options.port ?? 0;\n return {\n url: `http://localhost:${boundPort}/`,\n port: boundPort,\n stop: () => server.stop(true),\n };\n}\n\n/** Build the gallery and write index.html + gallery.js + gallery.css to a dir. */\nexport async function buildGalleryToDir(outDir: string): Promise<string[]> {\n const { html, js, css } = await resolveAssets();\n const files: Array<[string, string]> = [\n [\"index.html\", html],\n [\"gallery.js\", js],\n [\"gallery.css\", css],\n ];\n const written: string[] = [];\n for (const [name, content] of files) {\n const path = join(outDir, name);\n await Bun.write(path, content);\n written.push(path);\n }\n return written;\n}\n",
|
|
6
6
|
"#!/usr/bin/env bun\n/**\n * `polly gallery` — serve (or statically export) the polly-ui component gallery.\n *\n * polly gallery # serve at http://localhost:4321\n * polly gallery --port 5000 # serve on a chosen port\n * polly gallery --open # serve and open the default browser\n * polly gallery --build <dir> # write a static index.html + js + css\n *\n * Hand-rolled arg parsing, matching the other polly tool CLIs.\n */\n\nimport { buildGalleryToDir, serveGallery } from \"./server.ts\";\n\nconst DEFAULT_PORT = 4321;\n\nfunction printHelp(): void {\n console.log(`polly gallery — preview every polly-ui primitive in one page.\n\nUsage:\n polly gallery [--port <n>] [--open] Serve the gallery (default port ${DEFAULT_PORT})\n polly gallery --build <dir> Write a static gallery to <dir>\n polly gallery --help Show this help\n\nOne page that renders every polly-ui primitive: the single place to see the\ncomponents, the render surface the visual-regression baselines capture, and a\ngap-check that fails when a registered primitive has no specimen.`);\n}\n\n/** Read the value following a flag, erroring if it is missing or another flag. */\nfunction flagValue(args: string[], flag: string): string | undefined {\n const idx = args.indexOf(flag);\n if (idx === -1) return undefined;\n const value = args[idx + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n console.log(`error: ${flag} requires a value`);\n process.exit(1);\n }\n return value;\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? [\"open\", url]\n : process.platform === \"win32\"\n ? [\"cmd\", \"/c\", \"start\", \"\", url]\n : [\"xdg-open\", url];\n try {\n Bun.spawn(command, { stdout: \"ignore\", stderr: \"ignore\" });\n } catch {\n // Opening the browser is best-effort; the URL is printed regardless.\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n const buildDir = flagValue(args, \"--build\");\n if (buildDir !== undefined) {\n const files = await buildGalleryToDir(buildDir);\n console.log(`Gallery written to ${buildDir}:`);\n for (const file of files) console.log(` ${file}`);\n return;\n }\n\n const portArg = flagValue(args, \"--port\");\n const port = portArg === undefined ? DEFAULT_PORT : Number(portArg);\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n console.log(`error: --port must be an integer in 0–65535 (got \"${portArg}\")`);\n process.exit(1);\n }\n\n let gallery: Awaited<ReturnType<typeof serveGallery>>;\n try {\n gallery = await serveGallery({ port });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(`error: could not start the gallery server: ${message}`);\n if (/EADDRINUSE|in use|address already/i.test(message)) {\n console.log(`Port ${port} is in use — try 'polly gallery --port <other>'.`);\n }\n process.exit(1);\n }\n\n console.log(`Polly UI gallery → ${gallery.url}`);\n console.log(\"Serving the polly-ui component gallery. Press Ctrl-C to stop.\");\n if (args.includes(\"--open\")) openBrowser(gallery.url);\n\n const shutdown = (): void => {\n gallery.stop();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((error) => {\n console.log(error);\n process.exit(1);\n});\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "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
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "C3E8CD3FDE7C433B64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|