@autometa/cucumber-expressions 0.4.4 → 1.0.0-rc.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/step-matcher.ts","../src/search-report.ts","../src/parameters.ts","../src/default.parameters.ts"],"sourcesContent":["export * from \"./step-matcher\";\nexport * from \"./search-report\";\nexport * from \"./parameters\";\nexport * from \"./default.parameters\";\n","import { diffWordsWithSpace, Change } from \"diff\";\nimport { distance } from \"closest-match\";\nimport { CachedStep } from \"./types\";\nexport type StepDiff = {\n merged: string;\n step: CachedStep;\n gherkin: string;\n distance: number;\n};\nexport type StepDiffs = StepDiff[];\nexport type LimitedStepDiffs = { same: StepDiffs; other: StepDiffs };\nexport function checkMatch(text: string, it: CachedStep): boolean {\n return it.matches(text);\n}\nexport function limitDiffs(\n sameStepType: StepDiffs,\n differentStepType: StepDiffs,\n max: number\n): LimitedStepDiffs {\n const sameDistances = sameStepType.map((it) => it.distance);\n const maxSameStepDistance = Math.max(...sameDistances);\n const otherStepDistance = differentStepType.map((it) => it.distance);\n const minDifferentStepDistance = Math.min(...otherStepDistance);\n // Prioritize same-type steps for search. Only\n // consider other-type steps when the lowest\n // other score is lower than the highest same scoreF\n if (maxSameStepDistance > minDifferentStepDistance) {\n const filter = sameStepType.filter(\n (it) => it.distance <= minDifferentStepDistance\n );\n if (filter.length >= max) {\n return { same: filter.slice(0, max), other: [] };\n }\n const diff = max - filter.length;\n const sameSlice = sameStepType.slice(0, diff);\n const differentSlice = differentStepType.slice(0, max - diff);\n return { same: sameSlice, other: differentSlice };\n }\n const maxIndex = Math.min(max, sameStepType.length);\n return { same: sameStepType.slice(0, maxIndex), other: [] };\n}\n\nfunction removeWhitespaceFromQuotedSubstrings(inputString: string): string {\n const regex = /([\"'])([^\"']*?)\\1/g;\n let modifiedString = inputString;\n\n let match;\n while ((match = regex.exec(inputString))) {\n const quotedSubstring = match[0];\n const strippedSubstring = match[2].replace(/\\s+/g, \"\"); // Remove whitespace\n modifiedString = modifiedString.replace(\n quotedSubstring,\n `${match[1]}${strippedSubstring}${match[1]}`\n );\n }\n\n return modifiedString;\n}\n\nexport function getDiffs(text: string, maxResults: number, step: CachedStep[]) {\n const sorted = step\n .map((it) => {\n if (checkMatch(text, it)) {\n return { merged: text, step: it, gherkin: text, distance: 0 };\n }\n const collapsed = removeWhitespaceFromQuotedSubstrings(text);\n const diff = getDiff(collapsed, it);\n const refined = refineDiff(diff);\n const dist = distance(collapsed, refined);\n return { merged: refined, step: it, gherkin: text, distance: dist };\n })\n .sort((a, b) => a.distance - b.distance);\n const max = Math.min(maxResults, sorted.length);\n return sorted.slice(0, max);\n}\n\nexport function getDiff(text: string, it: CachedStep) {\n return diffWordsWithSpace(text, it.expression.source);\n}\n\nexport function refineDiff(diff: Change[]) {\n const strings: string[] = [];\n for (let index = 0; index < diff.length; index++) {\n const gherkinChange = diff[index];\n const scopeChange = diff[index + 1];\n if (isExpressionCandidate(gherkinChange, scopeChange)) {\n strings.push(gherkinChange.value);\n const extra = extractTextAfterPlaceholder(scopeChange.value);\n if (extra) {\n strings.push(extra);\n }\n index++;\n continue;\n }\n if (gherkinChange.removed === true) {\n continue;\n }\n if (gherkinChange.value) {\n strings.push(gherkinChange.value);\n\n continue;\n }\n }\n return strings.join(\"\");\n}\n\nfunction extractTextAfterPlaceholder(inputString: string): string | null {\n // Define a regular expression to match the pattern\n const regex = /\\{[^{}]+\\}(.+)?/;\n\n // Use regex.exec to find a match in the input string\n const match = regex.exec(inputString);\n\n // Check if a match was found\n if (match && match[1]) {\n return match[1]; // Extract and trim the matched text (including leading spaces if present)\n } else {\n return null; // No match found or nothing after curly braces\n }\n}\n\nexport function isExpressionCandidate(change1: Change, change2: Change) {\n if (change1 && change1.removed && change2 && change2.added) {\n const scopeText = change2.value;\n return /{.*}/.test(scopeText);\n }\n return false;\n}\n","import type { LimitedStepDiffs, StepDiff } from \"./step-matcher\";\nimport chalk from \"colors-cli\";\nexport class SameStepTypeMatch {\n readonly keyword: string;\n readonly text: string;\n readonly source: string;\n readonly distance: number;\n constructor(diff: StepDiff) {\n this.keyword = diff.step.keyword;\n this.text = diff.merged;\n this.source = diff.step.expression.source;\n this.distance = diff.distance;\n }\n toString() {\n const keyword = chalk.green(this.keyword);\n const text = chalk.white(this.source);\n const distance = chalk.blue(`[${this.distance}]`);\n return `${distance} ${keyword} ${text}`;\n }\n}\nexport class DifferentStepTypeMatch {\n readonly keyword: string;\n readonly text: string;\n readonly source: string;\n readonly distance: number;\n constructor(diff: StepDiff) {\n this.keyword = diff.step.keyword;\n this.text = diff.merged;\n this.source = diff.step.expression.source;\n this.distance = diff.distance;\n }\n toString() {\n const keywordColor = chalk.cyan_bt;\n const keyword = keywordColor(this.keyword);\n const text = chalk.white(this.source);\n const distance = chalk.blue(`[${this.distance}]`);\n return `${distance} ${keyword} ${text}`;\n }\n}\nexport class FuzzySearchReport {\n headingText: string;\n matches: (SameStepTypeMatch | DifferentStepTypeMatch)[] = [];\n children: FuzzySearchReport[] = [];\n constructor(readonly depth: number = 0) {}\n get length() {\n const childLength: number = this.children\n .map((it) => it.length)\n .reduce<number>((a: number, b: number) => a + b, 0);\n return this.matches.length + childLength;\n }\n addHeading(headingText: string) {\n this.headingText = headingText;\n return this;\n }\n addMatch(match: SameStepTypeMatch | DifferentStepTypeMatch) {\n this.matches.push(match);\n return this;\n }\n addChild(child: FuzzySearchReport) {\n this.children.push(child);\n return this;\n }\n get #sameMatchTypes() {\n return this.matches.filter(\n (it) => it instanceof SameStepTypeMatch\n ) as SameStepTypeMatch[];\n }\n get #differentMatchTypes() {\n return this.matches.filter(\n (it) => it instanceof DifferentStepTypeMatch\n ) as DifferentStepTypeMatch[];\n }\n\n toString() {\n if (this.length === 0) {\n return \"\";\n }\n const same = this.#sameMatchTypes\n .filter((it) => it.distance < 10)\n .map((it) => it.toString())\n .join(\"\\n\");\n const sameMessage =\n same.length > 0 ? chalk.italic(`Steps with matching step type:`) : \"\";\n const different = this.#differentMatchTypes\n .filter((it) => it.distance < 10)\n .map((it) => it.toString())\n .join(\"\\n\");\n const differentMessage =\n different.length > 0\n ? chalk.italic(`Steps with different step type:`)\n : \"\";\n\n const messageArray: string[] = [];\n appendSubMessage(messageArray, sameMessage);\n appendSubMessage(messageArray, same);\n appendSubMessage(messageArray, differentMessage);\n appendSubMessage(messageArray, different);\n const children: FuzzySearchReport[] = [];\n this.children.forEach((child) => {\n appendChild(children, child);\n });\n const formatChildren: string = children\n .map((it) => it.toString())\n .join(\"\\n\");\n const message = messageArray.join(`\\n`).trim();\n const heading = this.headingText && chalk.black(this.headingText);\n return `${heading ?? \"\"}\n${message.replace(/\\r\\n|\\n|\\r/gm, `\\n${TAB}`)}\n${formatChildren.replace(/\\r\\n|\\n|\\r/gm, `\\n${TAB}`)}`;\n }\n}\nfunction appendSubMessage(arr: string[], message: string, prefix?: string) {\n if (message && message.length > 0) {\n const str = prefix ? `${prefix ?? \"\"}${message ?? \"\"}` : message ?? \"\";\n arr.push(str);\n }\n}\nfunction appendChild(arr: FuzzySearchReport[], message: FuzzySearchReport) {\n if (message) {\n arr.push(message);\n }\n}\nconst SPACE = \" \";\nconst TAB = SPACE.repeat(2);\n\nexport function buildFuzzySearchReport(\n { same, other }: LimitedStepDiffs,\n depth: number\n) {\n const report = new FuzzySearchReport(depth);\n same.forEach((diff) => {\n report.addMatch(new SameStepTypeMatch(diff));\n });\n other.forEach((diff) => {\n report.addMatch(new DifferentStepTypeMatch(diff));\n });\n return report;\n}\n","import {\n Argument,\n ParameterType,\n ParameterTypeRegistry,\n} from \"@cucumber/cucumber-expressions\";\nimport { Class } from \"@autometa/types\";\nimport {\n def,\n func,\n instance,\n overloads,\n string,\n nil,\n array,\n} from \"@autometa/overloaded\";\nimport { App } from \"@autometa/app\";\ndeclare module \"@cucumber/cucumber-expressions\" {\n interface ParameterType<T> {\n transform(groupValues: string[] | null, app: App): T;\n }\n}\nParameterType.prototype.transform = function transform(\n this: ParameterType<unknown> | undefined,\n value: string[] | null,\n app: App\n) {\n return (\n this as unknown as { transformFn: (...args: unknown[]) => unknown }\n ).transformFn.apply(this, [...(value ?? []), app]);\n} as unknown as typeof ParameterType.prototype.transform;\n\n// todo - this has a bug when dealing with {string} - does not remove quotes\nArgument.prototype.getValue = function getValue<T>(this: Argument, app: App) {\n if (this.group.children.length > 0) {\n const value = this.group.children\n .filter((it) => it.value !== undefined)\n .map((child) => child.value);\n\n if (value.length > 0) {\n return this.parameterType.transform(value, app) as T;\n }\n }\n const groupValues = this.group\n ? this.group.value\n ? [this.group.value]\n : this.group.values\n : null;\n return this.parameterType.transform(groupValues, app) as T;\n};\ntype PrimitiveConstructor =\n | typeof Number\n | typeof String\n | typeof Boolean\n | typeof BigInt;\n\nexport type ParamTypeDefinition = {\n name: string;\n regex: RegExp | RegExp[];\n /**\n * @deprecated use regex instead\n */\n regexpPattern?: RegExp | RegExp[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transform?: (value: any, app: App) => unknown;\n type?: Class<unknown>;\n primitive?:\n | typeof String\n | typeof Number\n | typeof Boolean\n | typeof BigInt\n | typeof Date;\n};\n\nconst regexp = instance(RegExp).or(array([instance(RegExp)]));\n\nexport function defineParameterType<T extends ParamTypeDefinition[]>(\n registry: ParameterTypeRegistry,\n ...params: T\n) {\n params.forEach((param) => {\n const { name, regex, regexpPattern, transform, type, primitive } =\n param as ParamTypeDefinition;\n return registerParameterType(\n registry,\n name,\n regexpPattern ?? regex,\n transform,\n type,\n primitive\n );\n });\n}\nfunction registerParameterType(\n registry: ParameterTypeRegistry,\n name: string,\n regexpPattern: RegExp | RegExp[],\n transform: ((value: unknown, app: App) => unknown) | undefined,\n type: Class<unknown> | undefined,\n primitive:\n | NumberConstructor\n | StringConstructor\n | BooleanConstructor\n | BigIntConstructor\n | DateConstructor\n | undefined\n): void {\n return overloads(\n def(\n string(),\n regexp,\n func(\"type\"),\n func(\"transform\"),\n func(\"primitive\")\n ).matches((name, regexp, type, transform, primitive) => {\n const primitivePrototype = primitive as unknown as PrimitiveConstructor;\n const typePrototype = type as unknown as Class<unknown>;\n const wrapper = (val: unknown) => {\n const asPrimitive = primitivePrototype(val);\n const asType = new typePrototype(asPrimitive);\n return transform(asType);\n };\n const param = new ParameterType(name, regexp, type, wrapper);\n registry.defineParameterType(param);\n }),\n def`allTransforms`(\n string(),\n regexp,\n func(\"type\"),\n func(\"transform\"),\n nil(\"primitive\")\n ).matches((name, regexp, type, transform) => {\n const typePrototype = type as unknown as Class<unknown>;\n const wrapper = (val: unknown) => {\n const asType = new typePrototype(val);\n return transform(asType);\n };\n const param = new ParameterType(name, regexp, type, wrapper);\n registry.defineParameterType(param);\n }),\n def`transformPrimitive`(\n string(),\n regexp,\n nil(\"type\"),\n func(\"transform\"),\n func(\"primitive\")\n ).matches((name, regexp, _, transform, primitive) => {\n const primitivePrototype = primitive as unknown as PrimitiveConstructor;\n const wrapper = (val: unknown) => {\n const asPrimitive = fromPrimitive(val, primitivePrototype);\n return transform(asPrimitive);\n };\n const param = new ParameterType(name, regexp, primitive, wrapper);\n registry.defineParameterType(param);\n }),\n def`encapsulatePrimitive`(\n string(),\n regexp,\n func(\"type\"),\n nil(\"transform\"),\n func(\"primitive\")\n ).matches((name, regexp, type, _, primitive) => {\n const primitivePrototype = primitive as unknown as PrimitiveConstructor;\n const typePrototype = type as unknown as Class<unknown>;\n const wrapper = (val: unknown) => {\n const asPrimitive = fromPrimitive(val, primitivePrototype);\n return new typePrototype(asPrimitive);\n };\n const param = new ParameterType(name, regexp, type, wrapper);\n registry.defineParameterType(param);\n }),\n def`makeType`(string(), regexp, func(\"type\"), nil(), nil()).matches(\n (name, pattern, type) => {\n const prototype = type as unknown as Class<unknown>;\n const transform = (val: unknown) => new prototype(val);\n const param = new ParameterType(name, pattern, null, transform);\n registry.defineParameterType(param);\n }\n ),\n def`makePrimitive`(\n string(),\n regexp,\n nil(),\n nil(),\n func(\"primitive\")\n ).matches((name, pattern, _, __, primitive) => {\n const prototype = primitive as unknown as PrimitiveConstructor;\n const transform = (val: unknown) => fromPrimitive(val, prototype);\n const param = new ParameterType(name, pattern, null, transform);\n registry.defineParameterType(param);\n }),\n def`transformValue`(\n string(),\n regexp,\n nil(),\n func(\"transform\"),\n nil()\n ).matches((name, pattern, _, transform, __) => {\n const param = new ParameterType(name, pattern, null, transform);\n registry.defineParameterType(param);\n }),\n def`default`(string(), instance(RegExp), nil(), nil(), nil()).matches(\n (name, pattern, _, __, ___) => {\n const transform = (val: unknown) => val;\n const param = new ParameterType(name, pattern, null, transform);\n registry.defineParameterType(param);\n }\n )\n ).use([name, regexpPattern, type, transform, primitive]);\n}\n\nfunction fromPrimitive(value: unknown, primitive: PrimitiveConstructor) {\n if (primitive === String) {\n return value;\n }\n if (primitive === Number) {\n return parseFloat(value as string);\n }\n if (primitive === Boolean) {\n return value === \"true\";\n }\n return primitive(value);\n}\n","import { def, fallback, overloads, string } from \"@autometa/overloaded\";\nimport { ParamTypeDefinition } from \"./parameters\";\nimport { Dates } from \"@autometa/datetime\";\nimport { AssertIs } from \"@autometa/asserters\";\nimport { DateTime } from \"luxon\";\ntype AutoParamTypeDefinition = Omit<ParamTypeDefinition, \"transform\">;\nconst strNum = /['\"]-?\\d+['\"]/;\n\nconst isodateRegexp =\n /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/;\nconst shortDateRegex =\n /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\d)/;\nconst boolTypesActive = [\"active\", \"inactive\"];\nconst boolTypesEnabled = [\"enabled\", \"disabled\"];\nconst boolTypes = [\"true\", \"false\"];\n\nexport const OrdinalParam: ParamTypeDefinition = {\n name: \"ordinal\",\n regex: /(\\d+)(?:st|nd|rd|th)/,\n transform: (value: string) => parseInt(value, 10),\n};\n\nexport const NumberParam: AutoParamTypeDefinition = {\n name: \"number\",\n regex: /\\d+/,\n primitive: Number,\n};\n\nexport const AnyParam: AutoParamTypeDefinition = {\n name: \"any\",\n regex: /.*/,\n};\nexport const UnknownParam: AutoParamTypeDefinition = {\n name: \"unknown\",\n regex: /.*/,\n};\nexport const TextParam: ParamTypeDefinition = {\n name: \"text\",\n regex: /\"([^\"\\\\]*(\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(\\\\.[^'\\\\]*)*)'/,\n primitive: String,\n transform: (value: string) => {\n const asStr = value as string;\n return asStr.replace(/^\"(.*)\"$/, \"$1\").replace(/^'(.*)'$/, \"$1\");\n },\n};\n\nexport const BooleanParam = {\n name: \"boolean\",\n regex: /true|false/,\n primitive: Boolean,\n};\nexport const BoolParam = {\n name: \"bool\",\n regex: /true|false/,\n primitive: Boolean,\n};\nexport const DateParam: AutoParamTypeDefinition = {\n name: \"date\",\n regex: [isodateRegexp, shortDateRegex],\n type: Date,\n};\n\nexport const PrimitiveParam: ParamTypeDefinition = {\n name: \"primitive\",\n regex: [\n /true|false/,\n /enabled|disabled/,\n /active|inactive/,\n /null/,\n /empty/,\n /undefined|missing/,\n /NaN/,\n /Infinity/,\n /-Infinity/,\n isodateRegexp,\n shortDateRegex,\n /-?(\\d*\\.?\\d+|\\d{1,3}(,\\d{3})*(\\.\\d+)?)/, // Comma delimited number, e.g. \"1\", \"1,000\", \"1,000.00\"\n /-?(\\d*,?\\d+|\\d{1,3}(.\\d{3})*(,\\d+))/, // Period delimited number, e.g. \"1\", \"1.000,00\"\n /\"([^\"]*)\"/,\n /'([^']*)'/,\n ],\n transform: (value: unknown) => {\n return overloads(\n def(string({ equals: \"null\" })).matches((_) => null),\n def(string({ in: [\"undefined\", \"missing\"] })).matches((_) => undefined),\n def(string({ in: boolTypes })).matches((val) => val === \"true\"),\n def(string({ equals: \"NaN\" })).matches((_) => NaN),\n def(string({ equals: \"Infinity\" })).matches((_) => Infinity),\n def(string({ equals: \"-Infinity\" })).matches((_) => -Infinity),\n def(string({ pattern: isodateRegexp })).matches(parseIso),\n def(string({ pattern: shortDateRegex })).matches(parseDate),\n def(string({ pattern: strNum })).matches(trimQuotes),\n def(string({ pattern: /^-?(\\d{1,3}(,\\d{3})*(\\.\\d+)?)/ })).matches(\n (val) => {\n const asStr = val.replace(/,/g, \"\");\n return parseFloat(asStr);\n }\n ),\n // def(string({ pattern: /-?(\\d{1,3}(\\.\\d{3})*(,\\d+)?)/ })).matches(\n // (val) =>{\n // const asStr = val.replace(/\\./g, \"\").replace(/,/g, \".\");\n // return Number(asStr);\n // }\n // ),\n def(string({ in: boolTypesEnabled })).matches(boolEnabled),\n def(string({ in: boolTypesActive })).matches(boolActive),\n fallback((val) => {\n AssertIs(val, \"string\");\n const fromPhrase = Dates.fromPhrase(val);\n if (fromPhrase && !isNaN(fromPhrase.getTime())) {\n return fromPhrase;\n }\n return val.replace(/^\"(.*)\"$/, \"$1\").replace(/^'(.*)'$/, \"$1\");\n })\n ).use([value]);\n },\n};\n\nfunction boolActive(val: string): boolean {\n return val === \"active\";\n}\n\nfunction boolEnabled(val: string): boolean {\n return val === \"enabled\";\n}\n\nfunction parseDate(val: string): Date {\n return new Date(Date.parse(val));\n}\n\nfunction trimQuotes(val: string): string {\n return val.slice(1, -1);\n}\n\nfunction parseIso(val: string): Date {\n return DateTime.fromISO(val).toJSDate();\n}\n"],"mappings":"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","names":["chalk","distance","transform","name","regexp","type","primitive","import_overloaded"]}
1
+ {"version":3,"sources":["../src/parameter-types.ts","../src/extensions.ts"],"names":["ParameterType"],"mappings":"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","sourcesContent":["import {\n ParameterType,\n ParameterTypeRegistry,\n} from \"@cucumber/cucumber-expressions\";\nimport { attachTransform, applyCucumberExtensions } from \"./extensions\";\nimport type { ParameterRuntime, ParameterTransformFn } from \"./extensions\";\n\nexport interface CreateParameterTypesOptions {\n readonly namespace?: string;\n}\n\nexport interface ParameterTransformContext<World> {\n readonly raw: readonly string[];\n readonly world: World;\n readonly name: string | undefined;\n readonly originalName: string | undefined;\n readonly namespace?: string;\n readonly parameterType: ParameterType<unknown>;\n readonly definition: ParameterTypeDefinition<World>;\n}\n\nexport type ParameterTransformer<TResult, World> = (\n value: unknown,\n context: ParameterTransformContext<World>\n) => TResult | Promise<TResult>;\n\nexport interface ParameterTypeDefinition<World, TResult = unknown> {\n readonly name: string;\n readonly pattern: RegExp | readonly RegExp[];\n readonly transform?: ParameterTransformer<TResult, World>;\n readonly useForSnippets?: boolean;\n readonly preferForRegexpMatch?: boolean;\n readonly builtin?: boolean;\n}\n\nexport type ParameterTypeDefinitions<World> = ReadonlyArray<\n ParameterTypeDefinition<World>\n>;\n\nfunction toPatternArray(pattern: RegExp | readonly RegExp[]) {\n return Array.isArray(pattern) ? [...pattern] : [pattern];\n}\n\nfunction buildDefaultValue(rawValues: readonly string[]): unknown {\n if (rawValues.length === 0) {\n return undefined;\n }\n\n if (rawValues.length === 1) {\n return rawValues[0];\n }\n\n return [...rawValues];\n}\n\nfunction resolveScopedName(name: string, namespace: string | undefined) {\n if (!name || !namespace) {\n return name;\n }\n\n return `${namespace}:${name}`;\n}\n\nfunction buildTransform<World>(\n definition: ParameterTypeDefinition<World>,\n scopedName: string,\n options: CreateParameterTypesOptions | undefined\n): ParameterTransformFn<World> {\n return (values: readonly string[] | null, runtime: ParameterRuntime<World>) => {\n const rawValues = values ?? [];\n const resolved = buildDefaultValue(rawValues);\n\n if (definition.transform) {\n const context: ParameterTransformContext<World> = {\n raw: rawValues,\n world: runtime.world,\n name: scopedName,\n originalName: definition.name,\n parameterType: runtime.parameterType,\n definition,\n ...(options?.namespace !== undefined\n ? { namespace: options.namespace }\n : {}),\n };\n\n return definition.transform(resolved, context);\n }\n\n return resolved;\n };\n}\n\nfunction firstValue<T>(input: unknown): T | undefined {\n return Array.isArray(input) ? (input[0] as T | undefined) : (input as T | undefined);\n}\n\nfunction firstString(input: unknown): string | undefined {\n const value = firstValue<unknown>(input);\n if (value === undefined || value === null) {\n return undefined;\n }\n return String(value);\n}\n\nfunction parseNumberValue(\n input: unknown,\n parser: (raw: string) => number\n): number | null {\n const raw = firstString(input);\n if (raw === undefined) {\n return null;\n }\n\n const numeric = parser(raw);\n return Number.isNaN(numeric) ? null : numeric;\n}\n\nfunction parseBigIntValue(input: unknown): bigint | null {\n const raw = firstString(input);\n if (raw === undefined) {\n return null;\n }\n\n try {\n return BigInt(raw);\n } catch {\n return null;\n }\n}\n\nexport interface DefineParameterTypeFn<World> {\n (\n registry: ParameterTypeRegistry,\n definition: ParameterTypeDefinition<World>\n ): ParameterType<unknown>;\n many(\n registry: ParameterTypeRegistry,\n ...definitions:\n | ParameterTypeDefinitions<World>\n | [ParameterTypeDefinition<World>]\n ): ParameterTypeRegistry;\n}\n\nexport function createParameterTypes<World>(\n options?: CreateParameterTypesOptions\n): DefineParameterTypeFn<World> {\n applyCucumberExtensions();\n\n const define = ((\n registry: ParameterTypeRegistry,\n definition: ParameterTypeDefinition<World>\n ) => {\n const patterns = toPatternArray(definition.pattern);\n const scopedName = resolveScopedName(definition.name, options?.namespace);\n const transform = buildTransform(definition, scopedName, options);\n const parameterType = new ParameterType<unknown>(\n scopedName,\n patterns,\n null,\n // The original transform is overridden by applyCucumberExtensions.\n (...matches: string[]) => (matches.length <= 1 ? matches[0] : matches),\n definition.useForSnippets,\n definition.preferForRegexpMatch,\n definition.builtin\n );\n\n attachTransform(parameterType, transform);\n registry.defineParameterType(parameterType);\n return parameterType;\n }) as DefineParameterTypeFn<World>;\n\n define.many = (\n registry: ParameterTypeRegistry,\n ...definitions:\n | ParameterTypeDefinitions<World>\n | [ParameterTypeDefinition<World>]\n ) => {\n const list =\n definitions.length === 1 && Array.isArray(definitions[0])\n ? (definitions[0] as ParameterTypeDefinitions<World>)\n : (definitions as ParameterTypeDefinition<World>[]);\n\n list.forEach((definition) => {\n define(registry, definition);\n });\n\n return registry;\n };\n\n return define;\n}\n\nexport const defineParameterType = createParameterTypes<unknown>();\n\nconst INTEGER_REGEXPS = [/-?\\d+/, /\\d+/] as const;\nconst FLOAT_REGEXP = /(?=.*\\d.*)[-+]?\\d*(?:\\.(?=\\d.*))?\\d*(?:\\d+[E][+-]?\\d+)?/;\nconst WORD_REGEXP = /[^\\s]+/;\nconst STRING_REGEXP = /\"([^\"\\\\]*(\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(\\\\.[^'\\\\]*)*)'/;\nconst ANONYMOUS_REGEXP = /.*/;\n\nexport function createDefaultParameterTypes<World>(\n options?: CreateParameterTypesOptions\n) {\n const define = createParameterTypes<World>(options);\n\n return (registry: ParameterTypeRegistry) => {\n const defaults: ParameterTypeDefinition<World>[] = [\n {\n name: \"int\",\n pattern: INTEGER_REGEXPS,\n transform: (value: unknown) =>\n parseNumberValue(value, (raw) => parseInt(raw, 10)),\n useForSnippets: true,\n preferForRegexpMatch: true,\n builtin: true,\n },\n {\n name: \"float\",\n pattern: FLOAT_REGEXP,\n transform: (value: unknown) =>\n parseNumberValue(value, (raw) => parseFloat(raw)),\n useForSnippets: true,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"number\",\n pattern: FLOAT_REGEXP,\n transform: (value: unknown) =>\n parseNumberValue(value, (raw) => parseFloat(raw)),\n useForSnippets: true,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"word\",\n pattern: WORD_REGEXP,\n transform: (value: unknown) => firstString(value) ?? \"\",\n useForSnippets: false,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"string\",\n pattern: STRING_REGEXP,\n transform: (_value: unknown, context: ParameterTransformContext<World>) => {\n const [doubleQuoted, singleQuoted] = context.raw;\n const captured = doubleQuoted ?? singleQuoted ?? \"\";\n return captured\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\'/g, \"'\");\n },\n useForSnippets: true,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"\",\n pattern: ANONYMOUS_REGEXP,\n transform: (_value: unknown, context: ParameterTransformContext<World>) =>\n context.raw[0] ?? \"\",\n useForSnippets: false,\n preferForRegexpMatch: true,\n builtin: true,\n },\n {\n name: \"double\",\n pattern: FLOAT_REGEXP,\n transform: (value: unknown) =>\n parseNumberValue(value, (raw) => parseFloat(raw)),\n useForSnippets: false,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"bigdecimal\",\n pattern: FLOAT_REGEXP,\n transform: (value: unknown) => {\n const text = firstString(value);\n return text ?? null;\n },\n useForSnippets: false,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"byte\",\n pattern: INTEGER_REGEXPS,\n transform: (value: unknown) =>\n parseNumberValue(value, (raw) => parseInt(raw, 10)),\n useForSnippets: false,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"short\",\n pattern: INTEGER_REGEXPS,\n transform: (value: unknown) =>\n parseNumberValue(value, (raw) => parseInt(raw, 10)),\n useForSnippets: false,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"long\",\n pattern: INTEGER_REGEXPS,\n transform: (value: unknown) =>\n parseNumberValue(value, (raw) => parseInt(raw, 10)),\n useForSnippets: false,\n preferForRegexpMatch: false,\n builtin: true,\n },\n {\n name: \"biginteger\",\n pattern: INTEGER_REGEXPS,\n transform: (value: unknown) => parseBigIntValue(value),\n useForSnippets: false,\n preferForRegexpMatch: false,\n builtin: true,\n },\n ];\n\n const prepared = defaults.map((definition) =>\n options?.namespace && definition.preferForRegexpMatch\n ? { ...definition, preferForRegexpMatch: false }\n : definition\n );\n\n const toRegister: ParameterTypeDefinition<World>[] = [];\n\n prepared.forEach((definition) => {\n const scopedName = resolveScopedName(\n definition.name,\n options?.namespace\n );\n const existing = registry.lookupByTypeName(scopedName);\n\n if (existing) {\n const transform = buildTransform(definition, scopedName, options);\n attachTransform(existing, transform);\n return;\n }\n\n toRegister.push(definition);\n });\n\n if (toRegister.length > 0) {\n define.many(registry, ...toRegister);\n }\n\n return registry;\n };\n}\n\nexport const defineDefaultParameterTypes =\n createDefaultParameterTypes<unknown>();\n","import { Argument, ParameterType } from \"@cucumber/cucumber-expressions\";\n\nconst transformSymbol: unique symbol = Symbol(\"autometa:cucumber:transform\");\n\nexport interface ParameterRuntime<World> {\n readonly world: World;\n readonly parameterType: ParameterType<unknown>;\n}\n\nexport type ParameterTransformFn<World> = (\n values: readonly string[] | null,\n runtime: ParameterRuntime<World>\n) => unknown;\n\ntype StoredParameterTransformFn = ParameterTransformFn<unknown>;\n\ninterface AppAwareParameterType extends ParameterType<unknown> {\n [transformSymbol]?: StoredParameterTransformFn;\n}\n\nlet extensionsApplied = false;\nlet originalTransform: typeof ParameterType.prototype.transform | undefined;\nlet originalGetValue: typeof Argument.prototype.getValue | undefined;\n\nexport function attachTransform<World>(\n parameterType: ParameterType<unknown>,\n transform: ParameterTransformFn<World>\n) {\n (parameterType as AppAwareParameterType)[transformSymbol] =\n transform as StoredParameterTransformFn;\n}\n\nexport function applyCucumberExtensions() {\n if (extensionsApplied) {\n return;\n }\n\n originalTransform = originalTransform ?? ParameterType.prototype.transform;\n\n ParameterType.prototype.transform = function transform(\n this: AppAwareParameterType,\n thisObj: unknown,\n groupValues: readonly string[] | null\n ) {\n const transformFn = this[transformSymbol];\n if (transformFn) {\n return transformFn(groupValues ?? null, {\n world: thisObj,\n parameterType: this,\n });\n }\n const normalized = groupValues ? [...groupValues] : [];\n if (!originalTransform) {\n throw new Error(\"Cucumber extensions have not been initialised correctly\");\n }\n return originalTransform.call(this, thisObj, normalized);\n } as unknown as typeof ParameterType.prototype.transform;\n\n originalGetValue = originalGetValue ?? (Argument.prototype.getValue as typeof Argument.prototype.getValue);\n\n Argument.prototype.getValue = function getValue<T>(\n this: Argument,\n context?: unknown\n ): T {\n const group = this.group;\n let values: readonly string[] | null = null;\n\n if (group) {\n const childValues = group.children\n ?.map((child: { value?: string | undefined }) => child.value)\n .filter((value: string | undefined): value is string => value !== undefined);\n\n if (childValues && childValues.length > 0) {\n values = childValues;\n } else if (group.value !== undefined && group.value !== null) {\n values = [group.value];\n } else if (group.values) {\n values = group.values;\n }\n }\n\n const parameterType = this.parameterType as AppAwareParameterType | undefined;\n const transformFn = parameterType?.[transformSymbol];\n if (transformFn && parameterType) {\n return transformFn(values, {\n world: context as unknown,\n parameterType,\n }) as T;\n }\n\n if (!originalGetValue) {\n throw new Error(\"Cucumber extensions have not been initialised correctly\");\n }\n\n return originalGetValue.call(this, context) as T;\n };\n\n extensionsApplied = true;\n}\n\nexport function resetCucumberExtensions() {\n if (!extensionsApplied) {\n return;\n }\n\n if (originalTransform) {\n ParameterType.prototype.transform = originalTransform;\n }\n\n if (originalGetValue) {\n Argument.prototype.getValue = originalGetValue;\n }\n\n extensionsApplied = false;\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import { ParameterType, ParameterTypeRegistry } from "@cucumber/cucumber-expressions";
2
+ export interface CreateParameterTypesOptions {
3
+ readonly namespace?: string;
4
+ }
5
+ export interface ParameterTransformContext<World> {
6
+ readonly raw: readonly string[];
7
+ readonly world: World;
8
+ readonly name: string | undefined;
9
+ readonly originalName: string | undefined;
10
+ readonly namespace?: string;
11
+ readonly parameterType: ParameterType<unknown>;
12
+ readonly definition: ParameterTypeDefinition<World>;
13
+ }
14
+ export type ParameterTransformer<TResult, World> = (value: unknown, context: ParameterTransformContext<World>) => TResult | Promise<TResult>;
15
+ export interface ParameterTypeDefinition<World, TResult = unknown> {
16
+ readonly name: string;
17
+ readonly pattern: RegExp | readonly RegExp[];
18
+ readonly transform?: ParameterTransformer<TResult, World>;
19
+ readonly useForSnippets?: boolean;
20
+ readonly preferForRegexpMatch?: boolean;
21
+ readonly builtin?: boolean;
22
+ }
23
+ export type ParameterTypeDefinitions<World> = ReadonlyArray<ParameterTypeDefinition<World>>;
24
+ export interface DefineParameterTypeFn<World> {
25
+ (registry: ParameterTypeRegistry, definition: ParameterTypeDefinition<World>): ParameterType<unknown>;
26
+ many(registry: ParameterTypeRegistry, ...definitions: ParameterTypeDefinitions<World> | [ParameterTypeDefinition<World>]): ParameterTypeRegistry;
27
+ }
28
+ export declare function createParameterTypes<World>(options?: CreateParameterTypesOptions): DefineParameterTypeFn<World>;
29
+ export declare const defineParameterType: DefineParameterTypeFn<unknown>;
30
+ export declare function createDefaultParameterTypes<World>(options?: CreateParameterTypesOptions): (registry: ParameterTypeRegistry) => ParameterTypeRegistry;
31
+ export declare const defineDefaultParameterTypes: (registry: ParameterTypeRegistry) => ParameterTypeRegistry;
@@ -0,0 +1,18 @@
1
+ import type { Expression } from "@cucumber/cucumber-expressions";
2
+ export interface CachedStep {
3
+ readonly keyword: string;
4
+ readonly type: string;
5
+ readonly expression: Expression;
6
+ matches(text: string): boolean;
7
+ }
8
+ export interface StepDiff {
9
+ readonly merged: string;
10
+ readonly step: CachedStep;
11
+ readonly gherkin: string;
12
+ readonly distance: number;
13
+ }
14
+ export type StepDiffList = StepDiff[];
15
+ export interface LimitedStepDiffs {
16
+ readonly matchingType: StepDiffList;
17
+ readonly otherTypes: StepDiffList;
18
+ }
package/package.json CHANGED
@@ -1,60 +1,63 @@
1
1
  {
2
2
  "name": "@autometa/cucumber-expressions",
3
- "version": "0.4.4",
4
- "description": "wrapper on @cucumber/cucumber-expressions",
3
+ "version": "1.0.0-rc.0",
4
+ "description": "Cucumber expression helpers and parameter utilities for Autometa",
5
5
  "type": "module",
6
- "main": "dist/index.js",
7
- "module": "dist/esm/index.js",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
9
12
  "exports": {
10
- "import": "./dist/esm/index.js",
11
- "require": "./dist/index.js",
12
- "default": "./dist/esm/index.js",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs",
15
+ "default": "./dist/index.js",
13
16
  "types": "./dist/index.d.ts"
14
17
  },
15
18
  "license": "MIT",
19
+ "dependencies": {
20
+ "@cucumber/cucumber-expressions": "^16.1.2",
21
+ "colorette": "^2.0.19",
22
+ "diff": "^5.1.0",
23
+ "luxon": "^3.3.0",
24
+ "@autometa/app": "1.0.0-rc.0",
25
+ "@autometa/asserters": "1.0.0-rc.0",
26
+ "@autometa/datetime": "1.0.0-rc.0",
27
+ "@autometa/errors": "1.0.0-rc.0",
28
+ "@autometa/overloaded": "1.0.0-rc.0",
29
+ "@autometa/types": "1.0.0-rc.0"
30
+ },
16
31
  "devDependencies": {
32
+ "@types/diff": "^5.0.3",
17
33
  "@types/node": "^18.11.18",
18
- "@types/strip-color": "^0.1.0",
19
- "@types/uuid": "^9.0.5",
20
34
  "@typescript-eslint/eslint-plugin": "^5.54.1",
21
35
  "@typescript-eslint/parser": "^5.54.1",
22
- "@vitest/coverage-istanbul": "^1.4.0",
23
- "@vitest/coverage-v8": "^1.4.0",
24
36
  "eslint": "^8.37.0",
25
37
  "eslint-config-prettier": "^8.3.0",
26
- "istanbul": "^0.4.5",
27
38
  "rimraf": "^4.1.2",
28
- "strip-color": "^0.1.0",
39
+ "strip-ansi": "^7.1.0",
29
40
  "tsup": "^7.2.0",
30
41
  "typescript": "^4.9.5",
31
42
  "vitest": "1.4.0",
43
+ "eslint-config-custom": "0.6.0",
32
44
  "tsconfig": "0.7.0",
33
- "eslint-config-custom": "0.6.0"
34
- },
35
- "dependencies": {
36
- "@cucumber/cucumber-expressions": "^16.1.2",
37
- "@types/diff": "^5.0.3",
38
- "@types/luxon": "^3.3.1",
39
- "closest-match": "^1.3.3",
40
- "colors-cli": "^1.0.32",
41
- "diff": "^5.1.0",
42
- "luxon": "^3.3.0",
43
- "@autometa/app": "^0.4.2",
44
- "@autometa/datetime": "^0.1.16",
45
- "@autometa/asserters": "^0.1.8",
46
- "@autometa/errors": "^0.2.2",
47
- "@autometa/overloaded": "^0.3.2",
48
- "@autometa/types": "^0.4.1"
45
+ "tsup-config": "0.1.0"
49
46
  },
50
47
  "scripts": {
48
+ "type-check": "tsc --noEmit -p tsconfig.dev.json",
49
+ "type-check:watch": "tsc --noEmit --watch -p tsconfig.dev.json",
50
+ "build": "tsup && pnpm run build:types",
51
+ "build:types": "rimraf tsconfig.types.tsbuildinfo && tsc --build tsconfig.types.json",
52
+ "build:watch": "tsup --watch",
53
+ "dev": "tsup --watch",
51
54
  "test": "vitest run --passWithNoTests",
52
- "coverage": "vitest run --coverage",
53
- "prettify": "prettier --config .prettierrc 'src/**/*.ts' --write",
55
+ "test:watch": "vitest --passWithNoTests",
56
+ "test:ui": "vitest --ui --passWithNoTests",
57
+ "coverage": "vitest run --coverage --passWithNoTests",
54
58
  "lint": "eslint . --max-warnings 0",
55
59
  "lint:fix": "eslint . --fix",
56
- "clean": "rimraf dist",
57
- "build": "tsup",
58
- "build:watch": "tsup --watch"
60
+ "prettify": "prettier --config .prettierrc 'src/**/*.ts' --write",
61
+ "clean": "rimraf dist"
59
62
  }
60
63
  }
package/.eslintignore DELETED
@@ -1,3 +0,0 @@
1
- /dist
2
- /out
3
- node_modules
package/.eslintrc.cjs DELETED
@@ -1,4 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- extends: ["custom"],
4
- };
@@ -1,45 +0,0 @@
1
-
2
- > @autometa/cucumber-expressions@0.1.2 coverage /Users/ben.aherne/Documents/GitHub/autometa/packages/cucumber-expressions
3
- > vitest run --coverage
4
-
5
-
6
- RUN v0.29.8 /Users/ben.aherne/Documents/GitHub/autometa/packages/cucumber-expressions
7
- Coverage enabled with istanbul
8
-
9
- ✓ src/step-matchers.spec.ts (13 tests) 47ms
10
- stdout | src/search-report.spec.ts > SearchReport > should format the match with same step type
11
- Scenario: a test scenario
12
- Steps with matching step type:
13
- [4] Given I have {int} blue grapes in my {string}
14
-
15
-
16
- stdout | src/search-report.spec.ts > SearchReport > should format the match with different step type
17
- Scenario: a test scenario
18
- Steps with different step type:
19
- [4] When I have {int} blue grapes in my {string}
20
-
21
-
22
- stdout | src/search-report.spec.ts > SearchReport > should format the match with same and different step type
23
- Scenario: a test scenario
24
- Steps with matching step type:
25
- [4] Given I have {int} blue grapes in my {string}
26
- Steps with different step type:
27
- [4] When I have {int} blue grapes in my {string}
28
-
29
-
30
- stdout | src/search-report.spec.ts > SearchReport > should format the match with steps and children with steps
31
- Feature: a test feature
32
- Steps with matching step type:
33
- [4] Given I have {int} blue grapes in my {string}
34
- Steps with different step type:
35
- [2] When I have {int} blue grapes in my {string}
36
- Scenario: a test scenario
37
- Steps with matching step type:
38
- [4] Given I have {int} blue grapes in my {string}
39
- Steps with different step type:
40
- [2] When I have {int} blue grapes in my {string}
41
-
42
-
43
- ✓ src/search-report.spec.ts (6 tests) 73ms
44
- ✓ src/parameters.spec.ts (15 tests) 2785ms
45
-  ELIFECYCLE  Command failed.
@@ -1,4 +0,0 @@
1
-
2
- > @autometa/cucumber-expressions@0.3.11 lint:fix /Users/ben.aherne/Documents/GitHub/autometa/packages/cucumber-expressions
3
- > eslint . --fix "--max-warnings=0"
4
-
File without changes
@@ -1,50 +0,0 @@
1
-
2
- > @autometa/cucumber-expressions@0.4.1 test /Users/ben.aherne/Documents/GitHub/autometa/packages/cucumber-expressions
3
- > vitest run --passWithNoTests
4
-
5
-
6
- RUN v1.4.0 /Users/ben.aherne/Documents/GitHub/autometa/packages/cucumber-expressions
7
-
8
- ✓ src/step-matchers.spec.ts (13 tests) 45ms
9
- ✓ src/search-report.spec.ts (6 tests) 6ms
10
- stdout | src/search-report.spec.ts > SearchReport > should format the match with same step type
11
- Scenario: a test scenario
12
- Steps with matching step type:
13
- [4] Given I have {int} blue grapes in my {string}
14
-
15
-
16
- stdout | src/search-report.spec.ts > SearchReport > should format the match with different step type
17
- Scenario: a test scenario
18
- Steps with different step type:
19
- [4] When I have {int} blue grapes in my {string}
20
-
21
-
22
- stdout | src/search-report.spec.ts > SearchReport > should format the match with same and different step type
23
- Scenario: a test scenario
24
- Steps with matching step type:
25
- [4] Given I have {int} blue grapes in my {string}
26
- Steps with different step type:
27
- [4] When I have {int} blue grapes in my {string}
28
-
29
-
30
- stdout | src/search-report.spec.ts > SearchReport > should format the match with steps and children with steps
31
- Feature: a test feature
32
- Steps with matching step type:
33
- [4] Given I have {int} blue grapes in my {string}
34
- Steps with different step type:
35
- [2] When I have {int} blue grapes in my {string}
36
- Scenario: a test scenario
37
- Steps with matching step type:
38
- [4] Given I have {int} blue grapes in my {string}
39
- Steps with different step type:
40
- [2] When I have {int} blue grapes in my {string}
41
-
42
-
43
- ✓ src/parameters.spec.ts (15 tests) 2496ms
44
- ✓ src/default.parameters.spec.ts (19 tests) 7233ms
45
-
46
- Test Files 4 passed (4)
47
- Tests 53 passed (53)
48
- Start at 13:56:48
49
- Duration 11.91s (transform 1.96s, setup 0ms, collect 8.78s, tests 9.78s, environment 1ms, prepare 3.77s)
50
-
package/CHANGELOG.md DELETED
@@ -1,234 +0,0 @@
1
- # @autometa/cucumber-expressions
2
-
3
- ## 0.4.4
4
-
5
- ### Patch Changes
6
-
7
- - @autometa/app@0.4.2
8
-
9
- ## 0.4.3
10
-
11
- ### Patch Changes
12
-
13
- - Updated dependencies [da669a3]
14
- - @autometa/app@0.4.1
15
-
16
- ## 0.4.2
17
-
18
- ### Patch Changes
19
-
20
- - Updated dependencies [7440e9f]
21
- - @autometa/app@0.4.0
22
-
23
- ## 0.4.1
24
-
25
- ### Patch Changes
26
-
27
- - Updated dependencies [1d3f84e]
28
- - @autometa/app@0.3.5
29
-
30
- ## 0.4.0
31
-
32
- ### Minor Changes
33
-
34
- - 884c9dd: Add support to access App instance from cucumber expression transformer
35
-
36
- ## 0.3.11
37
-
38
- ### Patch Changes
39
-
40
- - Updated dependencies [3fe2ad4]
41
- - @autometa/errors@0.2.2
42
- - @autometa/asserters@0.1.8
43
- - @autometa/datetime@0.1.16
44
-
45
- ## 0.3.10
46
-
47
- ### Patch Changes
48
-
49
- - Updated dependencies [3493bb6]
50
- - @autometa/errors@0.2.1
51
- - @autometa/asserters@0.1.7
52
- - @autometa/datetime@0.1.15
53
-
54
- ## 0.3.9
55
-
56
- ### Patch Changes
57
-
58
- - Updated dependencies [0c070cb]
59
- - @autometa/asserters@0.1.6
60
- - @autometa/datetime@0.1.14
61
-
62
- ## 0.3.8
63
-
64
- ### Patch Changes
65
-
66
- - Updated dependencies [6fe8f64]
67
- - @autometa/datetime@0.1.13
68
-
69
- ## 0.3.7
70
-
71
- ### Patch Changes
72
-
73
- - Updated dependencies [b5ce008]
74
- - @autometa/errors@0.2.0
75
- - @autometa/asserters@0.1.5
76
- - @autometa/datetime@0.1.12
77
-
78
- ## 0.3.6
79
-
80
- ### Patch Changes
81
-
82
- - 04ed85d: feat: added HTP client based on axios
83
- - Updated dependencies [04ed85d]
84
- - @autometa/overloaded@0.3.2
85
- - @autometa/asserters@0.1.4
86
- - @autometa/datetime@0.1.11
87
- - @autometa/errors@0.1.4
88
-
89
- ## 0.3.5
90
-
91
- ### Patch Changes
92
-
93
- - 020b205: Fix: strings like 'abc123' parsed as numbers in expressions
94
-
95
- ## 0.3.4
96
-
97
- ### Patch Changes
98
-
99
- - bc3d616: fix: update primitive constructor initialization
100
-
101
- ## 0.3.3
102
-
103
- ### Patch Changes
104
-
105
- - f8b311e: Fix: Boolean expressions incorrectly parsed
106
-
107
- ## 0.3.2
108
-
109
- ### Patch Changes
110
-
111
- - Updated dependencies [6dd05a6]
112
- - @autometa/datetime@0.1.10
113
-
114
- ## 0.3.1
115
-
116
- ### Patch Changes
117
-
118
- - 4ee4e99: Fixes strings like 'abc2bd' being parsed as NaN in `primitive` expression type. Not supports comma and decimal delimters (EU, US respectively
119
-
120
- ## 0.3.0
121
-
122
- ### Minor Changes
123
-
124
- - 329c6b8: Fix: asJson missing from new tables, 'missing' missing from primitive regex's
125
-
126
- ## 0.2.2
127
-
128
- ### Patch Changes
129
-
130
- - Release Bump
131
- - Updated dependencies
132
- - @autometa/datetime@0.1.9
133
-
134
- ## 0.2.1
135
-
136
- ### Patch Changes
137
-
138
- - @autometa/datetime@0.1.8
139
-
140
- ## 0.2.0
141
-
142
- ### Minor Changes
143
-
144
- - 51d88780: Feat: Add Async Test Event support to new runner
145
-
146
- ## 0.1.10
147
-
148
- ### Patch Changes
149
-
150
- - 5b44aa88: Fix: miscalculated Levenshtein distance when comparing a gherkin step literal to a cucumber expression with a string expression
151
-
152
- ## 0.1.9
153
-
154
- ### Patch Changes
155
-
156
- - 4af1139a: Fix: fuzzy search for step names prints malformed strings
157
-
158
- ## 0.1.8
159
-
160
- ### Patch Changes
161
-
162
- - 4bbb87e4: Fix: step search returns literal strings instead of expressions when no exact match is found
163
-
164
- ## 0.1.7
165
-
166
- ### Patch Changes
167
-
168
- - 53f958e1: Fix: steps not executing onStepEnded event when an error was thrown
169
- - Updated dependencies [53f958e1]
170
- - @autometa/asserters@0.1.3
171
- - @autometa/datetime@0.1.7
172
- - @autometa/errors@0.1.3
173
- - @autometa/types@0.4.1
174
-
175
- ## 0.1.6
176
-
177
- ### Patch Changes
178
-
179
- - Updated dependencies [12bd4b1e]
180
- - @autometa/errors@0.1.2
181
- - @autometa/asserters@0.1.2
182
- - @autometa/datetime@0.1.6
183
-
184
- ## 0.1.5
185
-
186
- ### Patch Changes
187
-
188
- - Updated dependencies [e243e8b4]
189
- - @autometa/overloaded@0.3.1
190
- - @autometa/datetime@0.1.5
191
-
192
- ## 0.1.4
193
-
194
- ### Patch Changes
195
-
196
- - @autometa/datetime@0.1.4
197
-
198
- ## 0.1.3
199
-
200
- ### Patch Changes
201
-
202
- - Updated dependencies [e8f02f3a]
203
- - @autometa/errors@0.1.1
204
- - @autometa/datetime@0.1.3
205
- - @autometa/asserters@0.1.1
206
-
207
- ## 0.1.2
208
-
209
- ### Patch Changes
210
-
211
- - Updated dependencies [a50e99e]
212
- - @autometa/datetime@0.1.2
213
-
214
- ## 0.1.1
215
-
216
- ### Patch Changes
217
-
218
- - Updated dependencies [bf23fc4]
219
- - @autometa/datetime@0.1.1
220
-
221
- ## 0.1.0
222
-
223
- ### Minor Changes
224
-
225
- - 554b77e: Releasing packages
226
-
227
- ### Patch Changes
228
-
229
- - Updated dependencies [554b77e]
230
- - @autometa/overloaded@0.3.0
231
- - @autometa/asserters@0.1.0
232
- - @autometa/datetime@0.1.0
233
- - @autometa/errors@0.1.0
234
- - @autometa/types@0.4.0