@deepracticex/bdd
Advanced tools
+26
-0
@@ -44,2 +44,3 @@ "use strict"; | ||
| World: () => World, | ||
| configure: () => configure, | ||
| defineParameterType: () => defineParameterType, | ||
@@ -502,2 +503,26 @@ defineStep: () => defineStep, | ||
| } | ||
| // src/configure.ts | ||
| var import_node_path = require("path"); | ||
| async function configure(config) { | ||
| if (config.timeout != null) { | ||
| setDefaultTimeout(config.timeout); | ||
| } | ||
| if (config.steps) { | ||
| const patterns = Array.isArray(config.steps) ? config.steps : [config.steps]; | ||
| for (const pattern of patterns) { | ||
| const glob = new Bun.Glob(pattern); | ||
| for await (const file of glob.scan({ cwd: "." })) { | ||
| await import((0, import_node_path.resolve)(file)); | ||
| } | ||
| } | ||
| } | ||
| const featurePatterns = Array.isArray(config.features) ? config.features : [config.features]; | ||
| for (const pattern of featurePatterns) { | ||
| const glob = new Bun.Glob(pattern); | ||
| for await (const file of glob.scan({ cwd: "." })) { | ||
| loadFeature((0, import_node_path.resolve)(file), { tags: config.tags }); | ||
| } | ||
| } | ||
| } | ||
| // Annotate the CommonJS export names for ESM import in node: | ||
@@ -516,2 +541,3 @@ 0 && (module.exports = { | ||
| World, | ||
| configure, | ||
| defineParameterType, | ||
@@ -518,0 +544,0 @@ defineStep, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/index.ts","../src/registry.ts","../src/hooks.ts","../src/world.ts","../src/data-table.ts","../src/config.ts","../src/runner.ts","../src/parser.ts","../src/matcher.ts","../src/tag-filter.ts"],"sourcesContent":["// Step definitions\nexport { Given, When, Then, defineStep, 假设, 当, 那么 } from \"./registry\";\n\n// Hooks\nexport {\n Before,\n After,\n BeforeStep,\n AfterStep,\n BeforeAll,\n AfterAll,\n 之前,\n 之后,\n} from \"./hooks\";\n\n// World\nexport { World, setWorldConstructor } from \"./world\";\nexport type { IWorld, IWorldOptions } from \"./world\";\n\n// Data\nexport { DataTable } from \"./data-table\";\n\n// Configuration\nexport { setDefaultTimeout, defineParameterType } from \"./config\";\n\n// Runner\nexport { loadFeature } from \"./runner\";\nexport type { LoadFeatureOptions } from \"./runner\";\n","import type { IWorld } from \"./world\";\n\nexport type StepPattern = string | RegExp;\nexport type StepFunction<W extends IWorld = IWorld> = (\n this: W,\n ...args: unknown[]\n) => unknown | Promise<unknown>;\n\nexport interface StepDefinition {\n pattern: StepPattern;\n code: StepFunction;\n options?: StepOptions;\n}\n\nexport interface StepOptions {\n timeout?: number;\n}\n\nconst steps: StepDefinition[] = [];\n\nfunction defineStep(pattern: StepPattern, code: StepFunction): void;\nfunction defineStep(\n pattern: StepPattern,\n options: StepOptions,\n code: StepFunction\n): void;\nfunction defineStep(\n pattern: StepPattern,\n optionsOrCode: StepOptions | StepFunction,\n maybeCode?: StepFunction\n): void {\n if (typeof optionsOrCode === \"function\") {\n steps.push({ pattern, code: optionsOrCode });\n } else {\n steps.push({ pattern, code: maybeCode!, options: optionsOrCode });\n }\n}\n\nexport const Given = defineStep;\nexport const When = defineStep;\nexport const Then = defineStep;\nexport { defineStep };\n\nexport const 假设 = defineStep;\nexport const 当 = defineStep;\nexport const 那么 = defineStep;\n\nexport function getStepDefinitions(): readonly StepDefinition[] {\n return steps;\n}\n\nexport function clearStepDefinitions(): void {\n steps.length = 0;\n}\n","import type { IWorld } from \"./world\";\n\nexport interface TestCaseHookFunction<W extends IWorld = IWorld> {\n (this: W): unknown | Promise<unknown>;\n}\n\nexport interface TestRunHookFunction {\n (): unknown | Promise<unknown>;\n}\n\nexport interface HookOptions {\n name?: string;\n tags?: string;\n timeout?: number;\n}\n\nexport interface HookDefinition {\n code: TestCaseHookFunction;\n options?: HookOptions;\n}\n\nexport interface RunHookDefinition {\n code: TestRunHookFunction;\n options?: { timeout?: number };\n}\n\nconst beforeHooks: HookDefinition[] = [];\nconst afterHooks: HookDefinition[] = [];\nconst beforeStepHooks: HookDefinition[] = [];\nconst afterStepHooks: HookDefinition[] = [];\nconst beforeAllHooks: RunHookDefinition[] = [];\nconst afterAllHooks: RunHookDefinition[] = [];\n\n// Before\nfunction Before<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction Before<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// After\nfunction After<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction After<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction After<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction After(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// BeforeStep\nfunction BeforeStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// AfterStep\nfunction AfterStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// BeforeAll\nfunction BeforeAll(code: TestRunHookFunction): void;\nfunction BeforeAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction BeforeAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n beforeAllHooks.push({ code: codeOrOptions });\n } else {\n beforeAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\n// AfterAll\nfunction AfterAll(code: TestRunHookFunction): void;\nfunction AfterAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction AfterAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n afterAllHooks.push({ code: codeOrOptions });\n } else {\n afterAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\nexport { Before, After, BeforeStep, AfterStep, BeforeAll, AfterAll };\n\nexport const 之前 = Before;\nexport const 之后 = After;\n\nexport function getBeforeHooks(): readonly HookDefinition[] {\n return beforeHooks;\n}\nexport function getAfterHooks(): readonly HookDefinition[] {\n return afterHooks;\n}\nexport function getBeforeStepHooks(): readonly HookDefinition[] {\n return beforeStepHooks;\n}\nexport function getAfterStepHooks(): readonly HookDefinition[] {\n return afterStepHooks;\n}\nexport function getBeforeAllHooks(): readonly RunHookDefinition[] {\n return beforeAllHooks;\n}\nexport function getAfterAllHooks(): readonly RunHookDefinition[] {\n return afterAllHooks;\n}\n\nexport function clearHooks(): void {\n beforeHooks.length = 0;\n afterHooks.length = 0;\n beforeStepHooks.length = 0;\n afterStepHooks.length = 0;\n beforeAllHooks.length = 0;\n afterAllHooks.length = 0;\n}\n","export interface IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n}\n\nexport type ICreateAttachment = (\n data: string | Buffer,\n mediaType?: string\n) => void;\nexport type ICreateLog = (text: string) => void;\n\nexport interface IWorldOptions {\n attach: ICreateAttachment;\n log: ICreateLog;\n parameters: Record<string, unknown>;\n}\n\nexport class World implements IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n\n constructor({ attach, log, parameters }: IWorldOptions) {\n this.attach = attach;\n this.log = log;\n this.parameters = parameters;\n }\n}\n\ntype WorldConstructor = new (options: IWorldOptions) => IWorld;\n\nlet worldConstructor: WorldConstructor = World;\n\nexport function setWorldConstructor(constructor: WorldConstructor): void {\n worldConstructor = constructor;\n}\n\nexport function getWorldConstructor(): WorldConstructor {\n return worldConstructor;\n}\n\nexport function createWorld(\n parameters: Record<string, unknown> = {}\n): IWorld {\n const logs: string[] = [];\n const attachments: Array<{ data: string | Buffer; mediaType?: string }> = [];\n\n return new (getWorldConstructor())({\n attach: (data, mediaType) => {\n attachments.push({ data, mediaType });\n },\n log: (text) => {\n logs.push(text);\n },\n parameters,\n });\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport class DataTable {\n private readonly rawTable: string[][];\n\n constructor(sourceTable: messages.PickleTable | string[][]) {\n if (Array.isArray(sourceTable)) {\n this.rawTable = sourceTable;\n } else {\n this.rawTable = sourceTable.rows.map((row) =>\n row.cells.map((cell) => cell.value)\n );\n }\n }\n\n raw(): string[][] {\n return this.rawTable.map((row) => [...row]);\n }\n\n rows(): string[][] {\n return this.rawTable.slice(1).map((row) => [...row]);\n }\n\n hashes(): Record<string, string>[] {\n const headers = this.rawTable[0];\n return this.rawTable.slice(1).map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((header, i) => {\n obj[header] = row[i];\n });\n return obj;\n });\n }\n\n rowsHash(): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const row of this.rawTable) {\n obj[row[0]] = row[1];\n }\n return obj;\n }\n\n transpose(): DataTable {\n const transposed: string[][] = [];\n const rows = this.rawTable;\n if (rows.length === 0) return new DataTable([]);\n for (let col = 0; col < rows[0].length; col++) {\n transposed.push(rows.map((row) => row[col]));\n }\n return new DataTable(transposed);\n }\n}\n","import {\n ParameterTypeRegistry,\n ParameterType,\n} from \"@cucumber/cucumber-expressions\";\n\nlet defaultTimeout = 5000;\n\nexport function setDefaultTimeout(milliseconds: number): void {\n defaultTimeout = milliseconds;\n}\n\nexport function getDefaultTimeout(): number {\n return defaultTimeout;\n}\n\nconst parameterTypeRegistry = new ParameterTypeRegistry();\n\nexport function defineParameterType<T>({\n name,\n regexp,\n transformer,\n useForSnippets,\n preferForRegexpMatch,\n}: {\n name: string;\n regexp: readonly RegExp[] | readonly string[] | RegExp | string;\n transformer?: (...match: string[]) => T;\n useForSnippets?: boolean;\n preferForRegexpMatch?: boolean;\n}): void {\n parameterTypeRegistry.defineParameterType(\n new ParameterType(\n name,\n regexp,\n null,\n transformer,\n useForSnippets,\n preferForRegexpMatch\n )\n );\n}\n\nexport function getParameterTypeRegistry(): ParameterTypeRegistry {\n return parameterTypeRegistry;\n}\n","import { describe, test, beforeAll, afterAll } from \"bun:test\";\nimport type * as messages from \"@cucumber/messages\";\nimport { parseFeatureFile } from \"./parser\";\nimport { getStepDefinitions } from \"./registry\";\nimport { matchStep } from \"./matcher\";\nimport { createWorld } from \"./world\";\nimport { getDefaultTimeout } from \"./config\";\nimport {\n getBeforeHooks,\n getAfterHooks,\n getBeforeStepHooks,\n getAfterStepHooks,\n getBeforeAllHooks,\n getAfterAllHooks,\n} from \"./hooks\";\nimport { matchesTags } from \"./tag-filter\";\nimport { DataTable } from \"./data-table\";\n\nexport interface LoadFeatureOptions {\n tags?: string;\n}\n\nexport function loadFeature(\n filePath: string,\n options?: LoadFeatureOptions\n): void {\n const { document, pickles } = parseFeatureFile(filePath);\n const featureName =\n document.feature?.name ?? filePath;\n\n describe(featureName, () => {\n const beforeAllDefs = getBeforeAllHooks();\n const afterAllDefs = getAfterAllHooks();\n\n if (beforeAllDefs.length > 0) {\n beforeAll(async () => {\n for (const hook of beforeAllDefs) {\n await hook.code();\n }\n });\n }\n\n if (afterAllDefs.length > 0) {\n afterAll(async () => {\n for (const hook of afterAllDefs) {\n await hook.code();\n }\n });\n }\n\n for (const pickle of pickles) {\n if (!matchesTags(pickle.tags, options?.tags)) {\n continue;\n }\n\n const scenarioName = pickle.name;\n const timeout =\n getDefaultTimeout();\n\n test(\n scenarioName,\n async () => {\n await runScenario(pickle, document);\n },\n timeout\n );\n }\n });\n}\n\nasync function runScenario(\n pickle: messages.Pickle,\n _document: messages.GherkinDocument\n): Promise<void> {\n const world = createWorld();\n const definitions = getStepDefinitions();\n const beforeDefs = getBeforeHooks();\n const afterDefs = getAfterHooks();\n const beforeStepDefs = getBeforeStepHooks();\n const afterStepDefs = getAfterStepHooks();\n\n // Run Before hooks\n for (const hook of beforeDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n try {\n // Run steps\n for (const step of pickle.steps) {\n // BeforeStep hooks\n for (const hook of beforeStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n const { definition, args } = matchStep(step.text, definitions);\n\n // Build final args: extracted params + optional DataTable/DocString\n const finalArgs = [...args];\n if (step.argument?.dataTable) {\n finalArgs.push(new DataTable(step.argument.dataTable));\n }\n if (step.argument?.docString) {\n finalArgs.push(step.argument.docString.content);\n }\n\n await definition.code.call(world, ...finalArgs);\n\n // AfterStep hooks\n for (const hook of afterStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n } finally {\n // Run After hooks (always, even on failure)\n for (const hook of afterDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n}\n","import * as Gherkin from \"@cucumber/gherkin\";\nimport * as messages from \"@cucumber/messages\";\nimport { readFileSync } from \"node:fs\";\n\nexport interface ParsedFeature {\n document: messages.GherkinDocument;\n pickles: messages.Pickle[];\n}\n\nexport function parseFeatureFile(filePath: string): ParsedFeature {\n const source = readFileSync(filePath, \"utf-8\");\n return parseFeatureSource(source, filePath);\n}\n\nexport function parseFeatureSource(\n source: string,\n uri: string\n): ParsedFeature {\n const newId = messages.IdGenerator.uuid();\n\n const envelopes = Gherkin.generateMessages(\n source,\n uri,\n messages.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN,\n {\n newId,\n includeSource: false,\n includeGherkinDocument: true,\n includePickles: true,\n }\n );\n\n let document: messages.GherkinDocument | undefined;\n const pickles: messages.Pickle[] = [];\n const errors: messages.ParseError[] = [];\n\n for (const envelope of envelopes) {\n if (envelope.gherkinDocument) {\n document = envelope.gherkinDocument;\n }\n if (envelope.pickle) {\n pickles.push(envelope.pickle);\n }\n if (envelope.parseError) {\n errors.push(envelope.parseError);\n }\n }\n\n if (errors.length > 0) {\n const msg = errors\n .map(\n (e) =>\n `${uri}:${e.source?.location?.line ?? \"?\"} - ${e.message}`\n )\n .join(\"\\n\");\n throw new Error(`Gherkin parse error:\\n${msg}`);\n }\n\n if (!document) {\n throw new Error(`No gherkin document found in ${uri}`);\n }\n\n return { document, pickles };\n}\n","import {\n CucumberExpression,\n RegularExpression,\n type Expression,\n} from \"@cucumber/cucumber-expressions\";\nimport type { StepDefinition } from \"./registry\";\nimport { getParameterTypeRegistry } from \"./config\";\n\nexport interface MatchResult {\n definition: StepDefinition;\n args: unknown[];\n}\n\nfunction buildExpression(pattern: string | RegExp): Expression {\n const registry = getParameterTypeRegistry();\n if (typeof pattern === \"string\") {\n return new CucumberExpression(pattern, registry);\n }\n return new RegularExpression(pattern, registry);\n}\n\nexport function matchStep(\n text: string,\n definitions: readonly StepDefinition[]\n): MatchResult {\n const matches: MatchResult[] = [];\n\n for (const definition of definitions) {\n const expression = buildExpression(definition.pattern);\n const result = expression.match(text);\n if (result) {\n const args = result.map((arg) => arg.getValue(null));\n matches.push({ definition, args });\n }\n }\n\n if (matches.length === 0) {\n throw new Error(\n `Step undefined: \"${text}\"\\n` +\n `You can implement it with:\\n` +\n ` Given(\"${text}\", function () {\\n` +\n ` // TODO\\n` +\n ` });`\n );\n }\n\n if (matches.length > 1) {\n const patterns = matches\n .map((m) => ` ${m.definition.pattern}`)\n .join(\"\\n\");\n throw new Error(\n `Ambiguous step: \"${text}\"\\nMatches:\\n${patterns}`\n );\n }\n\n return matches[0];\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport function matchesTags(\n tags: readonly messages.PickleTag[],\n tagExpression: string | undefined\n): boolean {\n if (!tagExpression) return true;\n\n const tagNames = new Set(tags.map((t) => t.name));\n return evaluateTagExpression(tagExpression, tagNames);\n}\n\nfunction evaluateTagExpression(\n expression: string,\n tags: Set<string>\n): boolean {\n const tokens = tokenize(expression);\n return parseOr(tokens, 0, tags).result;\n}\n\ninterface ParseResult {\n result: boolean;\n pos: number;\n}\n\nfunction tokenize(expression: string): string[] {\n return expression\n .replace(/\\(/g, \" ( \")\n .replace(/\\)/g, \" ) \")\n .split(/\\s+/)\n .filter((t) => t.length > 0);\n}\n\nfunction parseOr(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseAnd(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"or\") {\n const right = parseAnd(tokens, nextPos + 1, tags);\n result = result || right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseAnd(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseNot(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"and\") {\n const right = parseNot(tokens, nextPos + 1, tags);\n result = result && right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseNot(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos < tokens.length && tokens[pos] === \"not\") {\n const { result, pos: nextPos } = parsePrimary(tokens, pos + 1, tags);\n return { result: !result, pos: nextPos };\n }\n return parsePrimary(tokens, pos, tags);\n}\n\nfunction parsePrimary(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos >= tokens.length) {\n return { result: true, pos };\n }\n\n if (tokens[pos] === \"(\") {\n const { result, pos: nextPos } = parseOr(tokens, pos + 1, tags);\n // skip closing paren\n return { result, pos: nextPos + 1 };\n }\n\n const tag = tokens[pos];\n return { result: tags.has(tag), pos: pos + 1 };\n}\n"],"mappings":"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","names":["import_cucumber_expressions"]} | ||
| {"version":3,"sources":["../src/index.ts","../src/registry.ts","../src/hooks.ts","../src/world.ts","../src/data-table.ts","../src/config.ts","../src/runner.ts","../src/parser.ts","../src/matcher.ts","../src/tag-filter.ts","../src/configure.ts"],"sourcesContent":["// Step definitions\nexport { Given, When, Then, defineStep, 假设, 当, 那么 } from \"./registry\";\n\n// Hooks\nexport {\n Before,\n After,\n BeforeStep,\n AfterStep,\n BeforeAll,\n AfterAll,\n 之前,\n 之后,\n} from \"./hooks\";\n\n// World\nexport { World, setWorldConstructor } from \"./world\";\nexport type { IWorld, IWorldOptions } from \"./world\";\n\n// Data\nexport { DataTable } from \"./data-table\";\n\n// Configuration\nexport { setDefaultTimeout, defineParameterType } from \"./config\";\n\n// Runner\nexport { loadFeature } from \"./runner\";\nexport type { LoadFeatureOptions } from \"./runner\";\n\n// Configure — auto-scan features and steps\nexport { configure } from \"./configure\";\nexport type { BDDConfig } from \"./configure\";\n","import type { IWorld } from \"./world\";\n\nexport type StepPattern = string | RegExp;\nexport type StepFunction<W extends IWorld = IWorld> = (\n this: W,\n ...args: unknown[]\n) => unknown | Promise<unknown>;\n\nexport interface StepDefinition {\n pattern: StepPattern;\n code: StepFunction;\n options?: StepOptions;\n}\n\nexport interface StepOptions {\n timeout?: number;\n}\n\nconst steps: StepDefinition[] = [];\n\nfunction defineStep(pattern: StepPattern, code: StepFunction): void;\nfunction defineStep(\n pattern: StepPattern,\n options: StepOptions,\n code: StepFunction\n): void;\nfunction defineStep(\n pattern: StepPattern,\n optionsOrCode: StepOptions | StepFunction,\n maybeCode?: StepFunction\n): void {\n if (typeof optionsOrCode === \"function\") {\n steps.push({ pattern, code: optionsOrCode });\n } else {\n steps.push({ pattern, code: maybeCode!, options: optionsOrCode });\n }\n}\n\nexport const Given = defineStep;\nexport const When = defineStep;\nexport const Then = defineStep;\nexport { defineStep };\n\nexport const 假设 = defineStep;\nexport const 当 = defineStep;\nexport const 那么 = defineStep;\n\nexport function getStepDefinitions(): readonly StepDefinition[] {\n return steps;\n}\n\nexport function clearStepDefinitions(): void {\n steps.length = 0;\n}\n","import type { IWorld } from \"./world\";\n\nexport interface TestCaseHookFunction<W extends IWorld = IWorld> {\n (this: W): unknown | Promise<unknown>;\n}\n\nexport interface TestRunHookFunction {\n (): unknown | Promise<unknown>;\n}\n\nexport interface HookOptions {\n name?: string;\n tags?: string;\n timeout?: number;\n}\n\nexport interface HookDefinition {\n code: TestCaseHookFunction;\n options?: HookOptions;\n}\n\nexport interface RunHookDefinition {\n code: TestRunHookFunction;\n options?: { timeout?: number };\n}\n\nconst beforeHooks: HookDefinition[] = [];\nconst afterHooks: HookDefinition[] = [];\nconst beforeStepHooks: HookDefinition[] = [];\nconst afterStepHooks: HookDefinition[] = [];\nconst beforeAllHooks: RunHookDefinition[] = [];\nconst afterAllHooks: RunHookDefinition[] = [];\n\n// Before\nfunction Before<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction Before<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// After\nfunction After<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction After<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction After<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction After(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// BeforeStep\nfunction BeforeStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// AfterStep\nfunction AfterStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// BeforeAll\nfunction BeforeAll(code: TestRunHookFunction): void;\nfunction BeforeAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction BeforeAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n beforeAllHooks.push({ code: codeOrOptions });\n } else {\n beforeAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\n// AfterAll\nfunction AfterAll(code: TestRunHookFunction): void;\nfunction AfterAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction AfterAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n afterAllHooks.push({ code: codeOrOptions });\n } else {\n afterAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\nexport { Before, After, BeforeStep, AfterStep, BeforeAll, AfterAll };\n\nexport const 之前 = Before;\nexport const 之后 = After;\n\nexport function getBeforeHooks(): readonly HookDefinition[] {\n return beforeHooks;\n}\nexport function getAfterHooks(): readonly HookDefinition[] {\n return afterHooks;\n}\nexport function getBeforeStepHooks(): readonly HookDefinition[] {\n return beforeStepHooks;\n}\nexport function getAfterStepHooks(): readonly HookDefinition[] {\n return afterStepHooks;\n}\nexport function getBeforeAllHooks(): readonly RunHookDefinition[] {\n return beforeAllHooks;\n}\nexport function getAfterAllHooks(): readonly RunHookDefinition[] {\n return afterAllHooks;\n}\n\nexport function clearHooks(): void {\n beforeHooks.length = 0;\n afterHooks.length = 0;\n beforeStepHooks.length = 0;\n afterStepHooks.length = 0;\n beforeAllHooks.length = 0;\n afterAllHooks.length = 0;\n}\n","export interface IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n}\n\nexport type ICreateAttachment = (\n data: string | Buffer,\n mediaType?: string\n) => void;\nexport type ICreateLog = (text: string) => void;\n\nexport interface IWorldOptions {\n attach: ICreateAttachment;\n log: ICreateLog;\n parameters: Record<string, unknown>;\n}\n\nexport class World implements IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n\n constructor({ attach, log, parameters }: IWorldOptions) {\n this.attach = attach;\n this.log = log;\n this.parameters = parameters;\n }\n}\n\ntype WorldConstructor = new (options: IWorldOptions) => IWorld;\n\nlet worldConstructor: WorldConstructor = World;\n\nexport function setWorldConstructor(constructor: WorldConstructor): void {\n worldConstructor = constructor;\n}\n\nexport function getWorldConstructor(): WorldConstructor {\n return worldConstructor;\n}\n\nexport function createWorld(\n parameters: Record<string, unknown> = {}\n): IWorld {\n const logs: string[] = [];\n const attachments: Array<{ data: string | Buffer; mediaType?: string }> = [];\n\n return new (getWorldConstructor())({\n attach: (data, mediaType) => {\n attachments.push({ data, mediaType });\n },\n log: (text) => {\n logs.push(text);\n },\n parameters,\n });\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport class DataTable {\n private readonly rawTable: string[][];\n\n constructor(sourceTable: messages.PickleTable | string[][]) {\n if (Array.isArray(sourceTable)) {\n this.rawTable = sourceTable;\n } else {\n this.rawTable = sourceTable.rows.map((row) =>\n row.cells.map((cell) => cell.value)\n );\n }\n }\n\n raw(): string[][] {\n return this.rawTable.map((row) => [...row]);\n }\n\n rows(): string[][] {\n return this.rawTable.slice(1).map((row) => [...row]);\n }\n\n hashes(): Record<string, string>[] {\n const headers = this.rawTable[0];\n return this.rawTable.slice(1).map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((header, i) => {\n obj[header] = row[i];\n });\n return obj;\n });\n }\n\n rowsHash(): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const row of this.rawTable) {\n obj[row[0]] = row[1];\n }\n return obj;\n }\n\n transpose(): DataTable {\n const transposed: string[][] = [];\n const rows = this.rawTable;\n if (rows.length === 0) return new DataTable([]);\n for (let col = 0; col < rows[0].length; col++) {\n transposed.push(rows.map((row) => row[col]));\n }\n return new DataTable(transposed);\n }\n}\n","import {\n ParameterTypeRegistry,\n ParameterType,\n} from \"@cucumber/cucumber-expressions\";\n\nlet defaultTimeout = 5000;\n\nexport function setDefaultTimeout(milliseconds: number): void {\n defaultTimeout = milliseconds;\n}\n\nexport function getDefaultTimeout(): number {\n return defaultTimeout;\n}\n\nconst parameterTypeRegistry = new ParameterTypeRegistry();\n\nexport function defineParameterType<T>({\n name,\n regexp,\n transformer,\n useForSnippets,\n preferForRegexpMatch,\n}: {\n name: string;\n regexp: readonly RegExp[] | readonly string[] | RegExp | string;\n transformer?: (...match: string[]) => T;\n useForSnippets?: boolean;\n preferForRegexpMatch?: boolean;\n}): void {\n parameterTypeRegistry.defineParameterType(\n new ParameterType(\n name,\n regexp,\n null,\n transformer,\n useForSnippets,\n preferForRegexpMatch\n )\n );\n}\n\nexport function getParameterTypeRegistry(): ParameterTypeRegistry {\n return parameterTypeRegistry;\n}\n","import { describe, test, beforeAll, afterAll } from \"bun:test\";\nimport type * as messages from \"@cucumber/messages\";\nimport { parseFeatureFile } from \"./parser\";\nimport { getStepDefinitions } from \"./registry\";\nimport { matchStep } from \"./matcher\";\nimport { createWorld } from \"./world\";\nimport { getDefaultTimeout } from \"./config\";\nimport {\n getBeforeHooks,\n getAfterHooks,\n getBeforeStepHooks,\n getAfterStepHooks,\n getBeforeAllHooks,\n getAfterAllHooks,\n} from \"./hooks\";\nimport { matchesTags } from \"./tag-filter\";\nimport { DataTable } from \"./data-table\";\n\nexport interface LoadFeatureOptions {\n tags?: string;\n}\n\nexport function loadFeature(\n filePath: string,\n options?: LoadFeatureOptions\n): void {\n const { document, pickles } = parseFeatureFile(filePath);\n const featureName =\n document.feature?.name ?? filePath;\n\n describe(featureName, () => {\n const beforeAllDefs = getBeforeAllHooks();\n const afterAllDefs = getAfterAllHooks();\n\n if (beforeAllDefs.length > 0) {\n beforeAll(async () => {\n for (const hook of beforeAllDefs) {\n await hook.code();\n }\n });\n }\n\n if (afterAllDefs.length > 0) {\n afterAll(async () => {\n for (const hook of afterAllDefs) {\n await hook.code();\n }\n });\n }\n\n for (const pickle of pickles) {\n if (!matchesTags(pickle.tags, options?.tags)) {\n continue;\n }\n\n const scenarioName = pickle.name;\n const timeout =\n getDefaultTimeout();\n\n test(\n scenarioName,\n async () => {\n await runScenario(pickle, document);\n },\n timeout\n );\n }\n });\n}\n\nasync function runScenario(\n pickle: messages.Pickle,\n _document: messages.GherkinDocument\n): Promise<void> {\n const world = createWorld();\n const definitions = getStepDefinitions();\n const beforeDefs = getBeforeHooks();\n const afterDefs = getAfterHooks();\n const beforeStepDefs = getBeforeStepHooks();\n const afterStepDefs = getAfterStepHooks();\n\n // Run Before hooks\n for (const hook of beforeDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n try {\n // Run steps\n for (const step of pickle.steps) {\n // BeforeStep hooks\n for (const hook of beforeStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n const { definition, args } = matchStep(step.text, definitions);\n\n // Build final args: extracted params + optional DataTable/DocString\n const finalArgs = [...args];\n if (step.argument?.dataTable) {\n finalArgs.push(new DataTable(step.argument.dataTable));\n }\n if (step.argument?.docString) {\n finalArgs.push(step.argument.docString.content);\n }\n\n await definition.code.call(world, ...finalArgs);\n\n // AfterStep hooks\n for (const hook of afterStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n } finally {\n // Run After hooks (always, even on failure)\n for (const hook of afterDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n}\n","import * as Gherkin from \"@cucumber/gherkin\";\nimport * as messages from \"@cucumber/messages\";\nimport { readFileSync } from \"node:fs\";\n\nexport interface ParsedFeature {\n document: messages.GherkinDocument;\n pickles: messages.Pickle[];\n}\n\nexport function parseFeatureFile(filePath: string): ParsedFeature {\n const source = readFileSync(filePath, \"utf-8\");\n return parseFeatureSource(source, filePath);\n}\n\nexport function parseFeatureSource(\n source: string,\n uri: string\n): ParsedFeature {\n const newId = messages.IdGenerator.uuid();\n\n const envelopes = Gherkin.generateMessages(\n source,\n uri,\n messages.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN,\n {\n newId,\n includeSource: false,\n includeGherkinDocument: true,\n includePickles: true,\n }\n );\n\n let document: messages.GherkinDocument | undefined;\n const pickles: messages.Pickle[] = [];\n const errors: messages.ParseError[] = [];\n\n for (const envelope of envelopes) {\n if (envelope.gherkinDocument) {\n document = envelope.gherkinDocument;\n }\n if (envelope.pickle) {\n pickles.push(envelope.pickle);\n }\n if (envelope.parseError) {\n errors.push(envelope.parseError);\n }\n }\n\n if (errors.length > 0) {\n const msg = errors\n .map(\n (e) =>\n `${uri}:${e.source?.location?.line ?? \"?\"} - ${e.message}`\n )\n .join(\"\\n\");\n throw new Error(`Gherkin parse error:\\n${msg}`);\n }\n\n if (!document) {\n throw new Error(`No gherkin document found in ${uri}`);\n }\n\n return { document, pickles };\n}\n","import {\n CucumberExpression,\n RegularExpression,\n type Expression,\n} from \"@cucumber/cucumber-expressions\";\nimport type { StepDefinition } from \"./registry\";\nimport { getParameterTypeRegistry } from \"./config\";\n\nexport interface MatchResult {\n definition: StepDefinition;\n args: unknown[];\n}\n\nfunction buildExpression(pattern: string | RegExp): Expression {\n const registry = getParameterTypeRegistry();\n if (typeof pattern === \"string\") {\n return new CucumberExpression(pattern, registry);\n }\n return new RegularExpression(pattern, registry);\n}\n\nexport function matchStep(\n text: string,\n definitions: readonly StepDefinition[]\n): MatchResult {\n const matches: MatchResult[] = [];\n\n for (const definition of definitions) {\n const expression = buildExpression(definition.pattern);\n const result = expression.match(text);\n if (result) {\n const args = result.map((arg) => arg.getValue(null));\n matches.push({ definition, args });\n }\n }\n\n if (matches.length === 0) {\n throw new Error(\n `Step undefined: \"${text}\"\\n` +\n `You can implement it with:\\n` +\n ` Given(\"${text}\", function () {\\n` +\n ` // TODO\\n` +\n ` });`\n );\n }\n\n if (matches.length > 1) {\n const patterns = matches\n .map((m) => ` ${m.definition.pattern}`)\n .join(\"\\n\");\n throw new Error(\n `Ambiguous step: \"${text}\"\\nMatches:\\n${patterns}`\n );\n }\n\n return matches[0];\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport function matchesTags(\n tags: readonly messages.PickleTag[],\n tagExpression: string | undefined\n): boolean {\n if (!tagExpression) return true;\n\n const tagNames = new Set(tags.map((t) => t.name));\n return evaluateTagExpression(tagExpression, tagNames);\n}\n\nfunction evaluateTagExpression(\n expression: string,\n tags: Set<string>\n): boolean {\n const tokens = tokenize(expression);\n return parseOr(tokens, 0, tags).result;\n}\n\ninterface ParseResult {\n result: boolean;\n pos: number;\n}\n\nfunction tokenize(expression: string): string[] {\n return expression\n .replace(/\\(/g, \" ( \")\n .replace(/\\)/g, \" ) \")\n .split(/\\s+/)\n .filter((t) => t.length > 0);\n}\n\nfunction parseOr(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseAnd(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"or\") {\n const right = parseAnd(tokens, nextPos + 1, tags);\n result = result || right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseAnd(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseNot(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"and\") {\n const right = parseNot(tokens, nextPos + 1, tags);\n result = result && right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseNot(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos < tokens.length && tokens[pos] === \"not\") {\n const { result, pos: nextPos } = parsePrimary(tokens, pos + 1, tags);\n return { result: !result, pos: nextPos };\n }\n return parsePrimary(tokens, pos, tags);\n}\n\nfunction parsePrimary(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos >= tokens.length) {\n return { result: true, pos };\n }\n\n if (tokens[pos] === \"(\") {\n const { result, pos: nextPos } = parseOr(tokens, pos + 1, tags);\n // skip closing paren\n return { result, pos: nextPos + 1 };\n }\n\n const tag = tokens[pos];\n return { result: tags.has(tag), pos: pos + 1 };\n}\n","import { resolve } from \"node:path\";\nimport { setDefaultTimeout } from \"./config\";\nimport { loadFeature } from \"./runner\";\n\nexport interface BDDConfig {\n /** Glob pattern(s) for .feature files */\n features: string | string[];\n /** Glob pattern(s) for step/hook definition files */\n steps?: string | string[];\n /** Global tag filter expression, e.g. \"@smoke and not @slow\" */\n tags?: string;\n /** Default timeout in milliseconds */\n timeout?: number;\n}\n\nexport async function configure(config: BDDConfig): Promise<void> {\n if (config.timeout != null) {\n setDefaultTimeout(config.timeout);\n }\n\n // 1. Scan and import step/hook files — registers Given/When/Then/Before/After\n if (config.steps) {\n const patterns = Array.isArray(config.steps)\n ? config.steps\n : [config.steps];\n for (const pattern of patterns) {\n const glob = new Bun.Glob(pattern);\n for await (const file of glob.scan({ cwd: \".\" })) {\n await import(resolve(file));\n }\n }\n }\n\n // 2. Scan and load feature files — registers describe/test with bun:test\n const featurePatterns = Array.isArray(config.features)\n ? config.features\n : [config.features];\n for (const pattern of featurePatterns) {\n const glob = new Bun.Glob(pattern);\n for await (const file of glob.scan({ cwd: \".\" })) {\n loadFeature(resolve(file), { tags: config.tags });\n }\n }\n}\n"],"mappings":"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","names":["import_cucumber_expressions"]} |
+13
-1
@@ -98,2 +98,14 @@ import * as messages from '@cucumber/messages'; | ||
| export { After, AfterAll, AfterStep, Before, BeforeAll, BeforeStep, DataTable, Given, type IWorld, type IWorldOptions, type LoadFeatureOptions, Then, When, World, defineParameterType, defineStep, loadFeature, setDefaultTimeout, setWorldConstructor, 之前, 之后, 假设, 当, 那么 }; | ||
| interface BDDConfig { | ||
| /** Glob pattern(s) for .feature files */ | ||
| features: string | string[]; | ||
| /** Glob pattern(s) for step/hook definition files */ | ||
| steps?: string | string[]; | ||
| /** Global tag filter expression, e.g. "@smoke and not @slow" */ | ||
| tags?: string; | ||
| /** Default timeout in milliseconds */ | ||
| timeout?: number; | ||
| } | ||
| declare function configure(config: BDDConfig): Promise<void>; | ||
| export { After, AfterAll, AfterStep, type BDDConfig, Before, BeforeAll, BeforeStep, DataTable, Given, type IWorld, type IWorldOptions, type LoadFeatureOptions, Then, When, World, configure, defineParameterType, defineStep, loadFeature, setDefaultTimeout, setWorldConstructor, 之前, 之后, 假设, 当, 那么 }; |
+13
-1
@@ -98,2 +98,14 @@ import * as messages from '@cucumber/messages'; | ||
| export { After, AfterAll, AfterStep, Before, BeforeAll, BeforeStep, DataTable, Given, type IWorld, type IWorldOptions, type LoadFeatureOptions, Then, When, World, defineParameterType, defineStep, loadFeature, setDefaultTimeout, setWorldConstructor, 之前, 之后, 假设, 当, 那么 }; | ||
| interface BDDConfig { | ||
| /** Glob pattern(s) for .feature files */ | ||
| features: string | string[]; | ||
| /** Glob pattern(s) for step/hook definition files */ | ||
| steps?: string | string[]; | ||
| /** Global tag filter expression, e.g. "@smoke and not @slow" */ | ||
| tags?: string; | ||
| /** Default timeout in milliseconds */ | ||
| timeout?: number; | ||
| } | ||
| declare function configure(config: BDDConfig): Promise<void>; | ||
| export { After, AfterAll, AfterStep, type BDDConfig, Before, BeforeAll, BeforeStep, DataTable, Given, type IWorld, type IWorldOptions, type LoadFeatureOptions, Then, When, World, configure, defineParameterType, defineStep, loadFeature, setDefaultTimeout, setWorldConstructor, 之前, 之后, 假设, 当, 那么 }; |
+25
-0
@@ -451,2 +451,26 @@ // src/registry.ts | ||
| } | ||
| // src/configure.ts | ||
| import { resolve } from "path"; | ||
| async function configure(config) { | ||
| if (config.timeout != null) { | ||
| setDefaultTimeout(config.timeout); | ||
| } | ||
| if (config.steps) { | ||
| const patterns = Array.isArray(config.steps) ? config.steps : [config.steps]; | ||
| for (const pattern of patterns) { | ||
| const glob = new Bun.Glob(pattern); | ||
| for await (const file of glob.scan({ cwd: "." })) { | ||
| await import(resolve(file)); | ||
| } | ||
| } | ||
| } | ||
| const featurePatterns = Array.isArray(config.features) ? config.features : [config.features]; | ||
| for (const pattern of featurePatterns) { | ||
| const glob = new Bun.Glob(pattern); | ||
| for await (const file of glob.scan({ cwd: "." })) { | ||
| loadFeature(resolve(file), { tags: config.tags }); | ||
| } | ||
| } | ||
| } | ||
| export { | ||
@@ -464,2 +488,3 @@ After, | ||
| World, | ||
| configure, | ||
| defineParameterType, | ||
@@ -466,0 +491,0 @@ defineStep, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/registry.ts","../src/hooks.ts","../src/world.ts","../src/data-table.ts","../src/config.ts","../src/runner.ts","../src/parser.ts","../src/matcher.ts","../src/tag-filter.ts"],"sourcesContent":["import type { IWorld } from \"./world\";\n\nexport type StepPattern = string | RegExp;\nexport type StepFunction<W extends IWorld = IWorld> = (\n this: W,\n ...args: unknown[]\n) => unknown | Promise<unknown>;\n\nexport interface StepDefinition {\n pattern: StepPattern;\n code: StepFunction;\n options?: StepOptions;\n}\n\nexport interface StepOptions {\n timeout?: number;\n}\n\nconst steps: StepDefinition[] = [];\n\nfunction defineStep(pattern: StepPattern, code: StepFunction): void;\nfunction defineStep(\n pattern: StepPattern,\n options: StepOptions,\n code: StepFunction\n): void;\nfunction defineStep(\n pattern: StepPattern,\n optionsOrCode: StepOptions | StepFunction,\n maybeCode?: StepFunction\n): void {\n if (typeof optionsOrCode === \"function\") {\n steps.push({ pattern, code: optionsOrCode });\n } else {\n steps.push({ pattern, code: maybeCode!, options: optionsOrCode });\n }\n}\n\nexport const Given = defineStep;\nexport const When = defineStep;\nexport const Then = defineStep;\nexport { defineStep };\n\nexport const 假设 = defineStep;\nexport const 当 = defineStep;\nexport const 那么 = defineStep;\n\nexport function getStepDefinitions(): readonly StepDefinition[] {\n return steps;\n}\n\nexport function clearStepDefinitions(): void {\n steps.length = 0;\n}\n","import type { IWorld } from \"./world\";\n\nexport interface TestCaseHookFunction<W extends IWorld = IWorld> {\n (this: W): unknown | Promise<unknown>;\n}\n\nexport interface TestRunHookFunction {\n (): unknown | Promise<unknown>;\n}\n\nexport interface HookOptions {\n name?: string;\n tags?: string;\n timeout?: number;\n}\n\nexport interface HookDefinition {\n code: TestCaseHookFunction;\n options?: HookOptions;\n}\n\nexport interface RunHookDefinition {\n code: TestRunHookFunction;\n options?: { timeout?: number };\n}\n\nconst beforeHooks: HookDefinition[] = [];\nconst afterHooks: HookDefinition[] = [];\nconst beforeStepHooks: HookDefinition[] = [];\nconst afterStepHooks: HookDefinition[] = [];\nconst beforeAllHooks: RunHookDefinition[] = [];\nconst afterAllHooks: RunHookDefinition[] = [];\n\n// Before\nfunction Before<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction Before<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// After\nfunction After<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction After<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction After<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction After(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// BeforeStep\nfunction BeforeStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// AfterStep\nfunction AfterStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// BeforeAll\nfunction BeforeAll(code: TestRunHookFunction): void;\nfunction BeforeAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction BeforeAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n beforeAllHooks.push({ code: codeOrOptions });\n } else {\n beforeAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\n// AfterAll\nfunction AfterAll(code: TestRunHookFunction): void;\nfunction AfterAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction AfterAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n afterAllHooks.push({ code: codeOrOptions });\n } else {\n afterAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\nexport { Before, After, BeforeStep, AfterStep, BeforeAll, AfterAll };\n\nexport const 之前 = Before;\nexport const 之后 = After;\n\nexport function getBeforeHooks(): readonly HookDefinition[] {\n return beforeHooks;\n}\nexport function getAfterHooks(): readonly HookDefinition[] {\n return afterHooks;\n}\nexport function getBeforeStepHooks(): readonly HookDefinition[] {\n return beforeStepHooks;\n}\nexport function getAfterStepHooks(): readonly HookDefinition[] {\n return afterStepHooks;\n}\nexport function getBeforeAllHooks(): readonly RunHookDefinition[] {\n return beforeAllHooks;\n}\nexport function getAfterAllHooks(): readonly RunHookDefinition[] {\n return afterAllHooks;\n}\n\nexport function clearHooks(): void {\n beforeHooks.length = 0;\n afterHooks.length = 0;\n beforeStepHooks.length = 0;\n afterStepHooks.length = 0;\n beforeAllHooks.length = 0;\n afterAllHooks.length = 0;\n}\n","export interface IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n}\n\nexport type ICreateAttachment = (\n data: string | Buffer,\n mediaType?: string\n) => void;\nexport type ICreateLog = (text: string) => void;\n\nexport interface IWorldOptions {\n attach: ICreateAttachment;\n log: ICreateLog;\n parameters: Record<string, unknown>;\n}\n\nexport class World implements IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n\n constructor({ attach, log, parameters }: IWorldOptions) {\n this.attach = attach;\n this.log = log;\n this.parameters = parameters;\n }\n}\n\ntype WorldConstructor = new (options: IWorldOptions) => IWorld;\n\nlet worldConstructor: WorldConstructor = World;\n\nexport function setWorldConstructor(constructor: WorldConstructor): void {\n worldConstructor = constructor;\n}\n\nexport function getWorldConstructor(): WorldConstructor {\n return worldConstructor;\n}\n\nexport function createWorld(\n parameters: Record<string, unknown> = {}\n): IWorld {\n const logs: string[] = [];\n const attachments: Array<{ data: string | Buffer; mediaType?: string }> = [];\n\n return new (getWorldConstructor())({\n attach: (data, mediaType) => {\n attachments.push({ data, mediaType });\n },\n log: (text) => {\n logs.push(text);\n },\n parameters,\n });\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport class DataTable {\n private readonly rawTable: string[][];\n\n constructor(sourceTable: messages.PickleTable | string[][]) {\n if (Array.isArray(sourceTable)) {\n this.rawTable = sourceTable;\n } else {\n this.rawTable = sourceTable.rows.map((row) =>\n row.cells.map((cell) => cell.value)\n );\n }\n }\n\n raw(): string[][] {\n return this.rawTable.map((row) => [...row]);\n }\n\n rows(): string[][] {\n return this.rawTable.slice(1).map((row) => [...row]);\n }\n\n hashes(): Record<string, string>[] {\n const headers = this.rawTable[0];\n return this.rawTable.slice(1).map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((header, i) => {\n obj[header] = row[i];\n });\n return obj;\n });\n }\n\n rowsHash(): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const row of this.rawTable) {\n obj[row[0]] = row[1];\n }\n return obj;\n }\n\n transpose(): DataTable {\n const transposed: string[][] = [];\n const rows = this.rawTable;\n if (rows.length === 0) return new DataTable([]);\n for (let col = 0; col < rows[0].length; col++) {\n transposed.push(rows.map((row) => row[col]));\n }\n return new DataTable(transposed);\n }\n}\n","import {\n ParameterTypeRegistry,\n ParameterType,\n} from \"@cucumber/cucumber-expressions\";\n\nlet defaultTimeout = 5000;\n\nexport function setDefaultTimeout(milliseconds: number): void {\n defaultTimeout = milliseconds;\n}\n\nexport function getDefaultTimeout(): number {\n return defaultTimeout;\n}\n\nconst parameterTypeRegistry = new ParameterTypeRegistry();\n\nexport function defineParameterType<T>({\n name,\n regexp,\n transformer,\n useForSnippets,\n preferForRegexpMatch,\n}: {\n name: string;\n regexp: readonly RegExp[] | readonly string[] | RegExp | string;\n transformer?: (...match: string[]) => T;\n useForSnippets?: boolean;\n preferForRegexpMatch?: boolean;\n}): void {\n parameterTypeRegistry.defineParameterType(\n new ParameterType(\n name,\n regexp,\n null,\n transformer,\n useForSnippets,\n preferForRegexpMatch\n )\n );\n}\n\nexport function getParameterTypeRegistry(): ParameterTypeRegistry {\n return parameterTypeRegistry;\n}\n","import { describe, test, beforeAll, afterAll } from \"bun:test\";\nimport type * as messages from \"@cucumber/messages\";\nimport { parseFeatureFile } from \"./parser\";\nimport { getStepDefinitions } from \"./registry\";\nimport { matchStep } from \"./matcher\";\nimport { createWorld } from \"./world\";\nimport { getDefaultTimeout } from \"./config\";\nimport {\n getBeforeHooks,\n getAfterHooks,\n getBeforeStepHooks,\n getAfterStepHooks,\n getBeforeAllHooks,\n getAfterAllHooks,\n} from \"./hooks\";\nimport { matchesTags } from \"./tag-filter\";\nimport { DataTable } from \"./data-table\";\n\nexport interface LoadFeatureOptions {\n tags?: string;\n}\n\nexport function loadFeature(\n filePath: string,\n options?: LoadFeatureOptions\n): void {\n const { document, pickles } = parseFeatureFile(filePath);\n const featureName =\n document.feature?.name ?? filePath;\n\n describe(featureName, () => {\n const beforeAllDefs = getBeforeAllHooks();\n const afterAllDefs = getAfterAllHooks();\n\n if (beforeAllDefs.length > 0) {\n beforeAll(async () => {\n for (const hook of beforeAllDefs) {\n await hook.code();\n }\n });\n }\n\n if (afterAllDefs.length > 0) {\n afterAll(async () => {\n for (const hook of afterAllDefs) {\n await hook.code();\n }\n });\n }\n\n for (const pickle of pickles) {\n if (!matchesTags(pickle.tags, options?.tags)) {\n continue;\n }\n\n const scenarioName = pickle.name;\n const timeout =\n getDefaultTimeout();\n\n test(\n scenarioName,\n async () => {\n await runScenario(pickle, document);\n },\n timeout\n );\n }\n });\n}\n\nasync function runScenario(\n pickle: messages.Pickle,\n _document: messages.GherkinDocument\n): Promise<void> {\n const world = createWorld();\n const definitions = getStepDefinitions();\n const beforeDefs = getBeforeHooks();\n const afterDefs = getAfterHooks();\n const beforeStepDefs = getBeforeStepHooks();\n const afterStepDefs = getAfterStepHooks();\n\n // Run Before hooks\n for (const hook of beforeDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n try {\n // Run steps\n for (const step of pickle.steps) {\n // BeforeStep hooks\n for (const hook of beforeStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n const { definition, args } = matchStep(step.text, definitions);\n\n // Build final args: extracted params + optional DataTable/DocString\n const finalArgs = [...args];\n if (step.argument?.dataTable) {\n finalArgs.push(new DataTable(step.argument.dataTable));\n }\n if (step.argument?.docString) {\n finalArgs.push(step.argument.docString.content);\n }\n\n await definition.code.call(world, ...finalArgs);\n\n // AfterStep hooks\n for (const hook of afterStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n } finally {\n // Run After hooks (always, even on failure)\n for (const hook of afterDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n}\n","import * as Gherkin from \"@cucumber/gherkin\";\nimport * as messages from \"@cucumber/messages\";\nimport { readFileSync } from \"node:fs\";\n\nexport interface ParsedFeature {\n document: messages.GherkinDocument;\n pickles: messages.Pickle[];\n}\n\nexport function parseFeatureFile(filePath: string): ParsedFeature {\n const source = readFileSync(filePath, \"utf-8\");\n return parseFeatureSource(source, filePath);\n}\n\nexport function parseFeatureSource(\n source: string,\n uri: string\n): ParsedFeature {\n const newId = messages.IdGenerator.uuid();\n\n const envelopes = Gherkin.generateMessages(\n source,\n uri,\n messages.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN,\n {\n newId,\n includeSource: false,\n includeGherkinDocument: true,\n includePickles: true,\n }\n );\n\n let document: messages.GherkinDocument | undefined;\n const pickles: messages.Pickle[] = [];\n const errors: messages.ParseError[] = [];\n\n for (const envelope of envelopes) {\n if (envelope.gherkinDocument) {\n document = envelope.gherkinDocument;\n }\n if (envelope.pickle) {\n pickles.push(envelope.pickle);\n }\n if (envelope.parseError) {\n errors.push(envelope.parseError);\n }\n }\n\n if (errors.length > 0) {\n const msg = errors\n .map(\n (e) =>\n `${uri}:${e.source?.location?.line ?? \"?\"} - ${e.message}`\n )\n .join(\"\\n\");\n throw new Error(`Gherkin parse error:\\n${msg}`);\n }\n\n if (!document) {\n throw new Error(`No gherkin document found in ${uri}`);\n }\n\n return { document, pickles };\n}\n","import {\n CucumberExpression,\n RegularExpression,\n type Expression,\n} from \"@cucumber/cucumber-expressions\";\nimport type { StepDefinition } from \"./registry\";\nimport { getParameterTypeRegistry } from \"./config\";\n\nexport interface MatchResult {\n definition: StepDefinition;\n args: unknown[];\n}\n\nfunction buildExpression(pattern: string | RegExp): Expression {\n const registry = getParameterTypeRegistry();\n if (typeof pattern === \"string\") {\n return new CucumberExpression(pattern, registry);\n }\n return new RegularExpression(pattern, registry);\n}\n\nexport function matchStep(\n text: string,\n definitions: readonly StepDefinition[]\n): MatchResult {\n const matches: MatchResult[] = [];\n\n for (const definition of definitions) {\n const expression = buildExpression(definition.pattern);\n const result = expression.match(text);\n if (result) {\n const args = result.map((arg) => arg.getValue(null));\n matches.push({ definition, args });\n }\n }\n\n if (matches.length === 0) {\n throw new Error(\n `Step undefined: \"${text}\"\\n` +\n `You can implement it with:\\n` +\n ` Given(\"${text}\", function () {\\n` +\n ` // TODO\\n` +\n ` });`\n );\n }\n\n if (matches.length > 1) {\n const patterns = matches\n .map((m) => ` ${m.definition.pattern}`)\n .join(\"\\n\");\n throw new Error(\n `Ambiguous step: \"${text}\"\\nMatches:\\n${patterns}`\n );\n }\n\n return matches[0];\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport function matchesTags(\n tags: readonly messages.PickleTag[],\n tagExpression: string | undefined\n): boolean {\n if (!tagExpression) return true;\n\n const tagNames = new Set(tags.map((t) => t.name));\n return evaluateTagExpression(tagExpression, tagNames);\n}\n\nfunction evaluateTagExpression(\n expression: string,\n tags: Set<string>\n): boolean {\n const tokens = tokenize(expression);\n return parseOr(tokens, 0, tags).result;\n}\n\ninterface ParseResult {\n result: boolean;\n pos: number;\n}\n\nfunction tokenize(expression: string): string[] {\n return expression\n .replace(/\\(/g, \" ( \")\n .replace(/\\)/g, \" ) \")\n .split(/\\s+/)\n .filter((t) => t.length > 0);\n}\n\nfunction parseOr(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseAnd(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"or\") {\n const right = parseAnd(tokens, nextPos + 1, tags);\n result = result || right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseAnd(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseNot(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"and\") {\n const right = parseNot(tokens, nextPos + 1, tags);\n result = result && right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseNot(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos < tokens.length && tokens[pos] === \"not\") {\n const { result, pos: nextPos } = parsePrimary(tokens, pos + 1, tags);\n return { result: !result, pos: nextPos };\n }\n return parsePrimary(tokens, pos, tags);\n}\n\nfunction parsePrimary(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos >= tokens.length) {\n return { result: true, pos };\n }\n\n if (tokens[pos] === \"(\") {\n const { result, pos: nextPos } = parseOr(tokens, pos + 1, tags);\n // skip closing paren\n return { result, pos: nextPos + 1 };\n }\n\n const tag = tokens[pos];\n return { result: tags.has(tag), pos: pos + 1 };\n}\n"],"mappings":"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","names":[]} | ||
| {"version":3,"sources":["../src/registry.ts","../src/hooks.ts","../src/world.ts","../src/data-table.ts","../src/config.ts","../src/runner.ts","../src/parser.ts","../src/matcher.ts","../src/tag-filter.ts","../src/configure.ts"],"sourcesContent":["import type { IWorld } from \"./world\";\n\nexport type StepPattern = string | RegExp;\nexport type StepFunction<W extends IWorld = IWorld> = (\n this: W,\n ...args: unknown[]\n) => unknown | Promise<unknown>;\n\nexport interface StepDefinition {\n pattern: StepPattern;\n code: StepFunction;\n options?: StepOptions;\n}\n\nexport interface StepOptions {\n timeout?: number;\n}\n\nconst steps: StepDefinition[] = [];\n\nfunction defineStep(pattern: StepPattern, code: StepFunction): void;\nfunction defineStep(\n pattern: StepPattern,\n options: StepOptions,\n code: StepFunction\n): void;\nfunction defineStep(\n pattern: StepPattern,\n optionsOrCode: StepOptions | StepFunction,\n maybeCode?: StepFunction\n): void {\n if (typeof optionsOrCode === \"function\") {\n steps.push({ pattern, code: optionsOrCode });\n } else {\n steps.push({ pattern, code: maybeCode!, options: optionsOrCode });\n }\n}\n\nexport const Given = defineStep;\nexport const When = defineStep;\nexport const Then = defineStep;\nexport { defineStep };\n\nexport const 假设 = defineStep;\nexport const 当 = defineStep;\nexport const 那么 = defineStep;\n\nexport function getStepDefinitions(): readonly StepDefinition[] {\n return steps;\n}\n\nexport function clearStepDefinitions(): void {\n steps.length = 0;\n}\n","import type { IWorld } from \"./world\";\n\nexport interface TestCaseHookFunction<W extends IWorld = IWorld> {\n (this: W): unknown | Promise<unknown>;\n}\n\nexport interface TestRunHookFunction {\n (): unknown | Promise<unknown>;\n}\n\nexport interface HookOptions {\n name?: string;\n tags?: string;\n timeout?: number;\n}\n\nexport interface HookDefinition {\n code: TestCaseHookFunction;\n options?: HookOptions;\n}\n\nexport interface RunHookDefinition {\n code: TestRunHookFunction;\n options?: { timeout?: number };\n}\n\nconst beforeHooks: HookDefinition[] = [];\nconst afterHooks: HookDefinition[] = [];\nconst beforeStepHooks: HookDefinition[] = [];\nconst afterStepHooks: HookDefinition[] = [];\nconst beforeAllHooks: RunHookDefinition[] = [];\nconst afterAllHooks: RunHookDefinition[] = [];\n\n// Before\nfunction Before<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction Before<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction Before(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// After\nfunction After<W extends IWorld = IWorld>(code: TestCaseHookFunction<W>): void;\nfunction After<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction After<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction After(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterHooks.push({ code: maybeCode!, options: codeOrTagsOrOptions });\n }\n}\n\n// BeforeStep\nfunction BeforeStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction BeforeStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n beforeStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n beforeStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n beforeStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// AfterStep\nfunction AfterStep<W extends IWorld = IWorld>(\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n tags: string,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep<W extends IWorld = IWorld>(\n options: HookOptions,\n code: TestCaseHookFunction<W>\n): void;\nfunction AfterStep(\n codeOrTagsOrOptions:\n | TestCaseHookFunction\n | string\n | HookOptions,\n maybeCode?: TestCaseHookFunction\n): void {\n if (typeof codeOrTagsOrOptions === \"function\") {\n afterStepHooks.push({ code: codeOrTagsOrOptions });\n } else if (typeof codeOrTagsOrOptions === \"string\") {\n afterStepHooks.push({\n code: maybeCode!,\n options: { tags: codeOrTagsOrOptions },\n });\n } else {\n afterStepHooks.push({\n code: maybeCode!,\n options: codeOrTagsOrOptions,\n });\n }\n}\n\n// BeforeAll\nfunction BeforeAll(code: TestRunHookFunction): void;\nfunction BeforeAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction BeforeAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n beforeAllHooks.push({ code: codeOrOptions });\n } else {\n beforeAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\n// AfterAll\nfunction AfterAll(code: TestRunHookFunction): void;\nfunction AfterAll(\n options: { timeout?: number },\n code: TestRunHookFunction\n): void;\nfunction AfterAll(\n codeOrOptions: TestRunHookFunction | { timeout?: number },\n maybeCode?: TestRunHookFunction\n): void {\n if (typeof codeOrOptions === \"function\") {\n afterAllHooks.push({ code: codeOrOptions });\n } else {\n afterAllHooks.push({ code: maybeCode!, options: codeOrOptions });\n }\n}\n\nexport { Before, After, BeforeStep, AfterStep, BeforeAll, AfterAll };\n\nexport const 之前 = Before;\nexport const 之后 = After;\n\nexport function getBeforeHooks(): readonly HookDefinition[] {\n return beforeHooks;\n}\nexport function getAfterHooks(): readonly HookDefinition[] {\n return afterHooks;\n}\nexport function getBeforeStepHooks(): readonly HookDefinition[] {\n return beforeStepHooks;\n}\nexport function getAfterStepHooks(): readonly HookDefinition[] {\n return afterStepHooks;\n}\nexport function getBeforeAllHooks(): readonly RunHookDefinition[] {\n return beforeAllHooks;\n}\nexport function getAfterAllHooks(): readonly RunHookDefinition[] {\n return afterAllHooks;\n}\n\nexport function clearHooks(): void {\n beforeHooks.length = 0;\n afterHooks.length = 0;\n beforeStepHooks.length = 0;\n afterStepHooks.length = 0;\n beforeAllHooks.length = 0;\n afterAllHooks.length = 0;\n}\n","export interface IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n}\n\nexport type ICreateAttachment = (\n data: string | Buffer,\n mediaType?: string\n) => void;\nexport type ICreateLog = (text: string) => void;\n\nexport interface IWorldOptions {\n attach: ICreateAttachment;\n log: ICreateLog;\n parameters: Record<string, unknown>;\n}\n\nexport class World implements IWorld {\n readonly attach: ICreateAttachment;\n readonly log: ICreateLog;\n readonly parameters: Record<string, unknown>;\n\n constructor({ attach, log, parameters }: IWorldOptions) {\n this.attach = attach;\n this.log = log;\n this.parameters = parameters;\n }\n}\n\ntype WorldConstructor = new (options: IWorldOptions) => IWorld;\n\nlet worldConstructor: WorldConstructor = World;\n\nexport function setWorldConstructor(constructor: WorldConstructor): void {\n worldConstructor = constructor;\n}\n\nexport function getWorldConstructor(): WorldConstructor {\n return worldConstructor;\n}\n\nexport function createWorld(\n parameters: Record<string, unknown> = {}\n): IWorld {\n const logs: string[] = [];\n const attachments: Array<{ data: string | Buffer; mediaType?: string }> = [];\n\n return new (getWorldConstructor())({\n attach: (data, mediaType) => {\n attachments.push({ data, mediaType });\n },\n log: (text) => {\n logs.push(text);\n },\n parameters,\n });\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport class DataTable {\n private readonly rawTable: string[][];\n\n constructor(sourceTable: messages.PickleTable | string[][]) {\n if (Array.isArray(sourceTable)) {\n this.rawTable = sourceTable;\n } else {\n this.rawTable = sourceTable.rows.map((row) =>\n row.cells.map((cell) => cell.value)\n );\n }\n }\n\n raw(): string[][] {\n return this.rawTable.map((row) => [...row]);\n }\n\n rows(): string[][] {\n return this.rawTable.slice(1).map((row) => [...row]);\n }\n\n hashes(): Record<string, string>[] {\n const headers = this.rawTable[0];\n return this.rawTable.slice(1).map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((header, i) => {\n obj[header] = row[i];\n });\n return obj;\n });\n }\n\n rowsHash(): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const row of this.rawTable) {\n obj[row[0]] = row[1];\n }\n return obj;\n }\n\n transpose(): DataTable {\n const transposed: string[][] = [];\n const rows = this.rawTable;\n if (rows.length === 0) return new DataTable([]);\n for (let col = 0; col < rows[0].length; col++) {\n transposed.push(rows.map((row) => row[col]));\n }\n return new DataTable(transposed);\n }\n}\n","import {\n ParameterTypeRegistry,\n ParameterType,\n} from \"@cucumber/cucumber-expressions\";\n\nlet defaultTimeout = 5000;\n\nexport function setDefaultTimeout(milliseconds: number): void {\n defaultTimeout = milliseconds;\n}\n\nexport function getDefaultTimeout(): number {\n return defaultTimeout;\n}\n\nconst parameterTypeRegistry = new ParameterTypeRegistry();\n\nexport function defineParameterType<T>({\n name,\n regexp,\n transformer,\n useForSnippets,\n preferForRegexpMatch,\n}: {\n name: string;\n regexp: readonly RegExp[] | readonly string[] | RegExp | string;\n transformer?: (...match: string[]) => T;\n useForSnippets?: boolean;\n preferForRegexpMatch?: boolean;\n}): void {\n parameterTypeRegistry.defineParameterType(\n new ParameterType(\n name,\n regexp,\n null,\n transformer,\n useForSnippets,\n preferForRegexpMatch\n )\n );\n}\n\nexport function getParameterTypeRegistry(): ParameterTypeRegistry {\n return parameterTypeRegistry;\n}\n","import { describe, test, beforeAll, afterAll } from \"bun:test\";\nimport type * as messages from \"@cucumber/messages\";\nimport { parseFeatureFile } from \"./parser\";\nimport { getStepDefinitions } from \"./registry\";\nimport { matchStep } from \"./matcher\";\nimport { createWorld } from \"./world\";\nimport { getDefaultTimeout } from \"./config\";\nimport {\n getBeforeHooks,\n getAfterHooks,\n getBeforeStepHooks,\n getAfterStepHooks,\n getBeforeAllHooks,\n getAfterAllHooks,\n} from \"./hooks\";\nimport { matchesTags } from \"./tag-filter\";\nimport { DataTable } from \"./data-table\";\n\nexport interface LoadFeatureOptions {\n tags?: string;\n}\n\nexport function loadFeature(\n filePath: string,\n options?: LoadFeatureOptions\n): void {\n const { document, pickles } = parseFeatureFile(filePath);\n const featureName =\n document.feature?.name ?? filePath;\n\n describe(featureName, () => {\n const beforeAllDefs = getBeforeAllHooks();\n const afterAllDefs = getAfterAllHooks();\n\n if (beforeAllDefs.length > 0) {\n beforeAll(async () => {\n for (const hook of beforeAllDefs) {\n await hook.code();\n }\n });\n }\n\n if (afterAllDefs.length > 0) {\n afterAll(async () => {\n for (const hook of afterAllDefs) {\n await hook.code();\n }\n });\n }\n\n for (const pickle of pickles) {\n if (!matchesTags(pickle.tags, options?.tags)) {\n continue;\n }\n\n const scenarioName = pickle.name;\n const timeout =\n getDefaultTimeout();\n\n test(\n scenarioName,\n async () => {\n await runScenario(pickle, document);\n },\n timeout\n );\n }\n });\n}\n\nasync function runScenario(\n pickle: messages.Pickle,\n _document: messages.GherkinDocument\n): Promise<void> {\n const world = createWorld();\n const definitions = getStepDefinitions();\n const beforeDefs = getBeforeHooks();\n const afterDefs = getAfterHooks();\n const beforeStepDefs = getBeforeStepHooks();\n const afterStepDefs = getAfterStepHooks();\n\n // Run Before hooks\n for (const hook of beforeDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n try {\n // Run steps\n for (const step of pickle.steps) {\n // BeforeStep hooks\n for (const hook of beforeStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n\n const { definition, args } = matchStep(step.text, definitions);\n\n // Build final args: extracted params + optional DataTable/DocString\n const finalArgs = [...args];\n if (step.argument?.dataTable) {\n finalArgs.push(new DataTable(step.argument.dataTable));\n }\n if (step.argument?.docString) {\n finalArgs.push(step.argument.docString.content);\n }\n\n await definition.code.call(world, ...finalArgs);\n\n // AfterStep hooks\n for (const hook of afterStepDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n } finally {\n // Run After hooks (always, even on failure)\n for (const hook of afterDefs) {\n if (matchesTags(pickle.tags, hook.options?.tags)) {\n await hook.code.call(world);\n }\n }\n }\n}\n","import * as Gherkin from \"@cucumber/gherkin\";\nimport * as messages from \"@cucumber/messages\";\nimport { readFileSync } from \"node:fs\";\n\nexport interface ParsedFeature {\n document: messages.GherkinDocument;\n pickles: messages.Pickle[];\n}\n\nexport function parseFeatureFile(filePath: string): ParsedFeature {\n const source = readFileSync(filePath, \"utf-8\");\n return parseFeatureSource(source, filePath);\n}\n\nexport function parseFeatureSource(\n source: string,\n uri: string\n): ParsedFeature {\n const newId = messages.IdGenerator.uuid();\n\n const envelopes = Gherkin.generateMessages(\n source,\n uri,\n messages.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN,\n {\n newId,\n includeSource: false,\n includeGherkinDocument: true,\n includePickles: true,\n }\n );\n\n let document: messages.GherkinDocument | undefined;\n const pickles: messages.Pickle[] = [];\n const errors: messages.ParseError[] = [];\n\n for (const envelope of envelopes) {\n if (envelope.gherkinDocument) {\n document = envelope.gherkinDocument;\n }\n if (envelope.pickle) {\n pickles.push(envelope.pickle);\n }\n if (envelope.parseError) {\n errors.push(envelope.parseError);\n }\n }\n\n if (errors.length > 0) {\n const msg = errors\n .map(\n (e) =>\n `${uri}:${e.source?.location?.line ?? \"?\"} - ${e.message}`\n )\n .join(\"\\n\");\n throw new Error(`Gherkin parse error:\\n${msg}`);\n }\n\n if (!document) {\n throw new Error(`No gherkin document found in ${uri}`);\n }\n\n return { document, pickles };\n}\n","import {\n CucumberExpression,\n RegularExpression,\n type Expression,\n} from \"@cucumber/cucumber-expressions\";\nimport type { StepDefinition } from \"./registry\";\nimport { getParameterTypeRegistry } from \"./config\";\n\nexport interface MatchResult {\n definition: StepDefinition;\n args: unknown[];\n}\n\nfunction buildExpression(pattern: string | RegExp): Expression {\n const registry = getParameterTypeRegistry();\n if (typeof pattern === \"string\") {\n return new CucumberExpression(pattern, registry);\n }\n return new RegularExpression(pattern, registry);\n}\n\nexport function matchStep(\n text: string,\n definitions: readonly StepDefinition[]\n): MatchResult {\n const matches: MatchResult[] = [];\n\n for (const definition of definitions) {\n const expression = buildExpression(definition.pattern);\n const result = expression.match(text);\n if (result) {\n const args = result.map((arg) => arg.getValue(null));\n matches.push({ definition, args });\n }\n }\n\n if (matches.length === 0) {\n throw new Error(\n `Step undefined: \"${text}\"\\n` +\n `You can implement it with:\\n` +\n ` Given(\"${text}\", function () {\\n` +\n ` // TODO\\n` +\n ` });`\n );\n }\n\n if (matches.length > 1) {\n const patterns = matches\n .map((m) => ` ${m.definition.pattern}`)\n .join(\"\\n\");\n throw new Error(\n `Ambiguous step: \"${text}\"\\nMatches:\\n${patterns}`\n );\n }\n\n return matches[0];\n}\n","import type * as messages from \"@cucumber/messages\";\n\nexport function matchesTags(\n tags: readonly messages.PickleTag[],\n tagExpression: string | undefined\n): boolean {\n if (!tagExpression) return true;\n\n const tagNames = new Set(tags.map((t) => t.name));\n return evaluateTagExpression(tagExpression, tagNames);\n}\n\nfunction evaluateTagExpression(\n expression: string,\n tags: Set<string>\n): boolean {\n const tokens = tokenize(expression);\n return parseOr(tokens, 0, tags).result;\n}\n\ninterface ParseResult {\n result: boolean;\n pos: number;\n}\n\nfunction tokenize(expression: string): string[] {\n return expression\n .replace(/\\(/g, \" ( \")\n .replace(/\\)/g, \" ) \")\n .split(/\\s+/)\n .filter((t) => t.length > 0);\n}\n\nfunction parseOr(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseAnd(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"or\") {\n const right = parseAnd(tokens, nextPos + 1, tags);\n result = result || right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseAnd(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n let { result, pos: nextPos } = parseNot(tokens, pos, tags);\n while (nextPos < tokens.length && tokens[nextPos] === \"and\") {\n const right = parseNot(tokens, nextPos + 1, tags);\n result = result && right.result;\n nextPos = right.pos;\n }\n return { result, pos: nextPos };\n}\n\nfunction parseNot(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos < tokens.length && tokens[pos] === \"not\") {\n const { result, pos: nextPos } = parsePrimary(tokens, pos + 1, tags);\n return { result: !result, pos: nextPos };\n }\n return parsePrimary(tokens, pos, tags);\n}\n\nfunction parsePrimary(\n tokens: string[],\n pos: number,\n tags: Set<string>\n): ParseResult {\n if (pos >= tokens.length) {\n return { result: true, pos };\n }\n\n if (tokens[pos] === \"(\") {\n const { result, pos: nextPos } = parseOr(tokens, pos + 1, tags);\n // skip closing paren\n return { result, pos: nextPos + 1 };\n }\n\n const tag = tokens[pos];\n return { result: tags.has(tag), pos: pos + 1 };\n}\n","import { resolve } from \"node:path\";\nimport { setDefaultTimeout } from \"./config\";\nimport { loadFeature } from \"./runner\";\n\nexport interface BDDConfig {\n /** Glob pattern(s) for .feature files */\n features: string | string[];\n /** Glob pattern(s) for step/hook definition files */\n steps?: string | string[];\n /** Global tag filter expression, e.g. \"@smoke and not @slow\" */\n tags?: string;\n /** Default timeout in milliseconds */\n timeout?: number;\n}\n\nexport async function configure(config: BDDConfig): Promise<void> {\n if (config.timeout != null) {\n setDefaultTimeout(config.timeout);\n }\n\n // 1. Scan and import step/hook files — registers Given/When/Then/Before/After\n if (config.steps) {\n const patterns = Array.isArray(config.steps)\n ? config.steps\n : [config.steps];\n for (const pattern of patterns) {\n const glob = new Bun.Glob(pattern);\n for await (const file of glob.scan({ cwd: \".\" })) {\n await import(resolve(file));\n }\n }\n }\n\n // 2. Scan and load feature files — registers describe/test with bun:test\n const featurePatterns = Array.isArray(config.features)\n ? config.features\n : [config.features];\n for (const pattern of featurePatterns) {\n const glob = new Bun.Glob(pattern);\n for await (const file of glob.scan({ cwd: \".\" })) {\n loadFeature(resolve(file), { tags: config.tags });\n }\n }\n}\n"],"mappings":"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","names":[]} |
+1
-1
| { | ||
| "name": "@deepracticex/bdd", | ||
| "version": "0.2.0", | ||
| "version": "0.3.0", | ||
| "description": "Cucumber-compatible BDD framework for Bun", | ||
@@ -5,0 +5,0 @@ "type": "module", |
103001
7.09%1127
5.62%