@cucumber/cucumber 12.4.0 → 12.5.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/README.md +2 -0
- package/lib/api/convert_configuration.js +4 -0
- package/lib/api/convert_configuration.js.map +1 -1
- package/lib/api/index.d.ts +4 -2
- package/lib/api/index.js.map +1 -1
- package/lib/api/plugins.d.ts +1 -1
- package/lib/api/plugins.js +51 -2
- package/lib/api/plugins.js.map +1 -1
- package/lib/api/types.d.ts +25 -0
- package/lib/api/types.js.map +1 -1
- package/lib/configuration/argv_parser.d.ts +2 -0
- package/lib/configuration/argv_parser.js +2 -0
- package/lib/configuration/argv_parser.js.map +1 -1
- package/lib/configuration/default_configuration.js +2 -0
- package/lib/configuration/default_configuration.js.map +1 -1
- package/lib/configuration/types.d.ts +20 -0
- package/lib/configuration/types.js.map +1 -1
- package/lib/environment/console_logger.d.ts +1 -0
- package/lib/environment/console_logger.js +3 -0
- package/lib/environment/console_logger.js.map +1 -1
- package/lib/environment/types.d.ts +7 -0
- package/lib/environment/types.js.map +1 -1
- package/lib/filter/filter_plugin.d.ts +2 -3
- package/lib/filter/filter_plugin.js +3 -3
- package/lib/filter/filter_plugin.js.map +1 -1
- package/lib/filter/types.d.ts +4 -0
- package/lib/filter/types.js.map +1 -1
- package/lib/formatter/helpers/event_data_collector.js +0 -1
- package/lib/formatter/helpers/event_data_collector.js.map +1 -1
- package/lib/paths/types.d.ts +7 -0
- package/lib/paths/types.js.map +1 -1
- package/lib/plugin/plugin_manager.d.ts +9 -7
- package/lib/plugin/plugin_manager.js +67 -16
- package/lib/plugin/plugin_manager.js.map +1 -1
- package/lib/plugin/types.d.ts +120 -32
- package/lib/plugin/types.js.map +1 -1
- package/lib/publish/publish_plugin.d.ts +2 -3
- package/lib/publish/publish_plugin.js.map +1 -1
- package/lib/sharding/sharding_plugin.d.ts +2 -3
- package/lib/sharding/sharding_plugin.js +2 -2
- package/lib/sharding/sharding_plugin.js.map +1 -1
- package/lib/tsconfig.node.tsbuildinfo +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +6 -6
- package/lib/plugin/events.d.ts +0 -2
- package/lib/plugin/events.js +0 -9
- package/lib/plugin/events.js.map +0 -1
package/lib/paths/types.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paths that woll be used to load feature files and user code
|
|
3
|
+
* @public
|
|
4
|
+
* @remarks
|
|
5
|
+
* These values are the result of pre-processing to expand globs, expand
|
|
6
|
+
* directory references, and apply defaults where applicable.
|
|
7
|
+
*/
|
|
1
8
|
export interface IResolvedPaths {
|
|
2
9
|
unexpandedSourcePaths: string[];
|
|
3
10
|
sourcePaths: string[];
|
package/lib/paths/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/paths/types.ts"],"names":[],"mappings":"","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/paths/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Paths that woll be used to load feature files and user code\n * @public\n * @remarks\n * These values are the result of pre-processing to expand globs, expand\n * directory references, and apply defaults where applicable.\n */\nexport interface IResolvedPaths {\n unexpandedSourcePaths: string[]\n sourcePaths: string[]\n requirePaths: string[]\n importPaths: string[]\n}\n"]}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { UsableEnvironment } from '../environment';
|
|
2
|
-
import {
|
|
2
|
+
import { CoordinatorEventKey, CoordinatorEventValues, CoordinatorTransformKey, CoordinatorTransformValues, FormatterPlugin, Plugin, PluginOperation } from './types';
|
|
3
3
|
export declare class PluginManager {
|
|
4
4
|
private readonly environment;
|
|
5
|
-
private handlers;
|
|
5
|
+
private readonly handlers;
|
|
6
|
+
private readonly transformers;
|
|
6
7
|
private cleanupFns;
|
|
7
8
|
constructor(environment: UsableEnvironment);
|
|
8
|
-
private
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
private registerHandler;
|
|
10
|
+
private registerTransformer;
|
|
11
|
+
initFormatter<OptionsType>(plugin: FormatterPlugin<OptionsType>, options: OptionsType, stream: NodeJS.WritableStream, write: (buffer: string | Uint8Array) => void, directory?: string, specifier?: string): Promise<void>;
|
|
12
|
+
initCoordinator<OptionsType>(operation: PluginOperation, plugin: Plugin<OptionsType>, options: OptionsType, specifier?: string): Promise<void>;
|
|
13
|
+
emit<K extends CoordinatorEventKey>(event: K, value: CoordinatorEventValues[K]): void;
|
|
14
|
+
transform<K extends CoordinatorTransformKey>(event: K, value: CoordinatorTransformValues[K]): Promise<CoordinatorTransformValues[K]>;
|
|
13
15
|
cleanup(): Promise<void>;
|
|
14
16
|
}
|
|
@@ -6,6 +6,8 @@ class PluginManager {
|
|
|
6
6
|
handlers = {
|
|
7
7
|
message: [],
|
|
8
8
|
'paths:resolve': [],
|
|
9
|
+
};
|
|
10
|
+
transformers = {
|
|
9
11
|
'pickles:filter': [],
|
|
10
12
|
'pickles:order': [],
|
|
11
13
|
};
|
|
@@ -13,12 +15,27 @@ class PluginManager {
|
|
|
13
15
|
constructor(environment) {
|
|
14
16
|
this.environment = environment;
|
|
15
17
|
}
|
|
16
|
-
async
|
|
17
|
-
this.handlers[event]
|
|
18
|
+
async registerHandler(event, handler, specifier) {
|
|
19
|
+
if (!this.handlers[event]) {
|
|
20
|
+
throw new Error(`Cannot register handler for unknown event "${event}"`);
|
|
21
|
+
}
|
|
22
|
+
this.handlers[event].push({
|
|
23
|
+
handler,
|
|
24
|
+
specifier,
|
|
25
|
+
});
|
|
18
26
|
}
|
|
19
|
-
async
|
|
27
|
+
async registerTransformer(event, transformer, specifier) {
|
|
28
|
+
if (!this.transformers[event]) {
|
|
29
|
+
throw new Error(`Cannot register transformer for unknown event "${event}"`);
|
|
30
|
+
}
|
|
31
|
+
this.transformers[event].push({
|
|
32
|
+
transformer,
|
|
33
|
+
specifier,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async initFormatter(plugin, options, stream, write, directory, specifier) {
|
|
20
37
|
const cleanupFn = await plugin.formatter({
|
|
21
|
-
on: (key, handler) => this.
|
|
38
|
+
on: (key, handler) => this.registerHandler(key, handler, specifier),
|
|
22
39
|
options: plugin.optionsKey
|
|
23
40
|
? (options[plugin.optionsKey] ?? {})
|
|
24
41
|
: options,
|
|
@@ -28,32 +45,44 @@ class PluginManager {
|
|
|
28
45
|
directory,
|
|
29
46
|
});
|
|
30
47
|
if (typeof cleanupFn === 'function') {
|
|
31
|
-
this.cleanupFns.push(
|
|
48
|
+
this.cleanupFns.push({
|
|
49
|
+
cleanupFn: cleanupFn,
|
|
50
|
+
specifier,
|
|
51
|
+
});
|
|
32
52
|
}
|
|
33
53
|
}
|
|
34
|
-
async initCoordinator(operation, plugin, options) {
|
|
35
|
-
const
|
|
54
|
+
async initCoordinator(operation, plugin, options, specifier) {
|
|
55
|
+
const context = {
|
|
36
56
|
operation,
|
|
37
|
-
on: this.
|
|
38
|
-
|
|
57
|
+
on: (event, handler) => this.registerHandler(event, handler, specifier),
|
|
58
|
+
transform: (event, transformer) => this.registerTransformer(event, transformer, specifier),
|
|
59
|
+
options: 'optionsKey' in plugin && plugin.optionsKey
|
|
60
|
+
? (options[plugin.optionsKey] ?? {})
|
|
61
|
+
: options,
|
|
39
62
|
logger: this.environment.logger,
|
|
40
63
|
environment: {
|
|
41
64
|
cwd: this.environment.cwd,
|
|
42
65
|
stderr: this.environment.stderr,
|
|
43
66
|
env: { ...this.environment.env },
|
|
44
67
|
},
|
|
45
|
-
}
|
|
68
|
+
};
|
|
69
|
+
const cleanupFn = await wrapErrorAsync(async () => await plugin.coordinator(context), specifier, `Plugin "${specifier}" errored when trying to init`);
|
|
46
70
|
if (typeof cleanupFn === 'function') {
|
|
47
|
-
this.cleanupFns.push(
|
|
71
|
+
this.cleanupFns.push({
|
|
72
|
+
cleanupFn: cleanupFn,
|
|
73
|
+
specifier,
|
|
74
|
+
});
|
|
48
75
|
}
|
|
49
76
|
}
|
|
50
77
|
emit(event, value) {
|
|
51
|
-
this.handlers[event].forEach((handler) =>
|
|
78
|
+
this.handlers[event].forEach(({ handler, specifier }) => {
|
|
79
|
+
wrapError(() => handler(value), specifier, `Plugin "${specifier}" errored when trying to handle a "${event}" event`);
|
|
80
|
+
});
|
|
52
81
|
}
|
|
53
82
|
async transform(event, value) {
|
|
54
83
|
let transformed = value;
|
|
55
|
-
for (const
|
|
56
|
-
const returned = await
|
|
84
|
+
for (const { transformer, specifier } of this.transformers[event]) {
|
|
85
|
+
const returned = await wrapErrorAsync(async () => await transformer(transformed), specifier, `Plugin "${specifier}" errored when trying to do a "${event}" transform`);
|
|
57
86
|
if (typeof returned !== 'undefined') {
|
|
58
87
|
transformed = returned;
|
|
59
88
|
}
|
|
@@ -61,10 +90,32 @@ class PluginManager {
|
|
|
61
90
|
return transformed;
|
|
62
91
|
}
|
|
63
92
|
async cleanup() {
|
|
64
|
-
for (const cleanupFn of this.cleanupFns) {
|
|
65
|
-
await cleanupFn();
|
|
93
|
+
for (const { cleanupFn, specifier } of this.cleanupFns) {
|
|
94
|
+
await wrapErrorAsync(async () => await cleanupFn(), specifier, `Plugin "${specifier}" errored when trying to cleanup`);
|
|
66
95
|
}
|
|
67
96
|
}
|
|
68
97
|
}
|
|
69
98
|
exports.PluginManager = PluginManager;
|
|
99
|
+
function wrapError(fn, specifier, message) {
|
|
100
|
+
try {
|
|
101
|
+
return fn();
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (specifier) {
|
|
105
|
+
throw new Error(message, { cause: error });
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function wrapErrorAsync(fn, specifier, message) {
|
|
111
|
+
try {
|
|
112
|
+
return await fn();
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (specifier) {
|
|
116
|
+
throw new Error(message, { cause: error });
|
|
117
|
+
}
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
70
121
|
//# sourceMappingURL=plugin_manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin_manager.js","sourceRoot":"","sources":["../../src/plugin/plugin_manager.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"plugin_manager.js","sourceRoot":"","sources":["../../src/plugin/plugin_manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { UsableEnvironment } from '../environment'\nimport {\n CoordinatorEventHandler,\n CoordinatorEventKey,\n CoordinatorEventValues,\n CoordinatorTransformer,\n CoordinatorTransformKey,\n CoordinatorTransformValues,\n FormatterPlugin,\n Plugin,\n PluginCleanup,\n PluginOperation,\n} from './types'\n\ntype SourcedEventHandler<K extends CoordinatorEventKey> = {\n handler: CoordinatorEventHandler<K>\n specifier?: string\n}\n\ntype SourcedTransformer<K extends CoordinatorTransformKey> = {\n transformer: CoordinatorTransformer<K>\n specifier?: string\n}\n\ntype SourcedCleanup = {\n cleanupFn: PluginCleanup\n specifier?: string\n}\n\ntype HandlerRegistry = {\n [K in CoordinatorEventKey]: Array<SourcedEventHandler<K>>\n}\n\ntype TransformerRegistry = {\n [K in CoordinatorTransformKey]: Array<SourcedTransformer<K>>\n}\n\nexport class PluginManager {\n private readonly handlers: HandlerRegistry = {\n message: [],\n 'paths:resolve': [],\n }\n private readonly transformers: TransformerRegistry = {\n 'pickles:filter': [],\n 'pickles:order': [],\n }\n private cleanupFns: SourcedCleanup[] = []\n\n constructor(private readonly environment: UsableEnvironment) {}\n\n private async registerHandler<K extends CoordinatorEventKey>(\n event: K,\n handler: CoordinatorEventHandler<K>,\n specifier?: string\n ) {\n if (!this.handlers[event]) {\n throw new Error(`Cannot register handler for unknown event \"${event}\"`)\n }\n this.handlers[event].push({\n handler,\n specifier,\n })\n }\n\n private async registerTransformer<K extends CoordinatorTransformKey>(\n event: K,\n transformer: CoordinatorTransformer<K>,\n specifier?: string\n ) {\n if (!this.transformers[event]) {\n throw new Error(\n `Cannot register transformer for unknown event \"${event}\"`\n )\n }\n this.transformers[event].push({\n transformer,\n specifier,\n })\n }\n\n async initFormatter<OptionsType>(\n plugin: FormatterPlugin<OptionsType>,\n options: OptionsType,\n stream: NodeJS.WritableStream,\n write: (buffer: string | Uint8Array) => void,\n directory?: string,\n specifier?: string\n ) {\n const cleanupFn = await plugin.formatter({\n on: (key, handler) => this.registerHandler(key, handler, specifier),\n options: plugin.optionsKey\n ? ((options as any)[plugin.optionsKey] ?? ({} as OptionsType))\n : options,\n logger: this.environment.logger,\n stream,\n write,\n directory,\n })\n if (typeof cleanupFn === 'function') {\n this.cleanupFns.push({\n cleanupFn: cleanupFn,\n specifier,\n })\n }\n }\n\n async initCoordinator<OptionsType>(\n operation: PluginOperation,\n plugin: Plugin<OptionsType>,\n options: OptionsType,\n specifier?: string\n ) {\n const context = {\n operation,\n on: <K extends CoordinatorEventKey>(\n event: K,\n handler: CoordinatorEventHandler<K>\n ) => this.registerHandler(event, handler, specifier),\n transform: <K extends CoordinatorTransformKey>(\n event: K,\n transformer: CoordinatorTransformer<K>\n ) => this.registerTransformer(event, transformer, specifier),\n options:\n 'optionsKey' in plugin && plugin.optionsKey\n ? ((options as any)[plugin.optionsKey] ?? ({} as OptionsType))\n : options,\n logger: this.environment.logger,\n environment: {\n cwd: this.environment.cwd,\n stderr: this.environment.stderr,\n env: { ...this.environment.env },\n },\n }\n const cleanupFn = await wrapErrorAsync(\n async () => await plugin.coordinator(context),\n specifier,\n `Plugin \"${specifier}\" errored when trying to init`\n )\n if (typeof cleanupFn === 'function') {\n this.cleanupFns.push({\n cleanupFn: cleanupFn,\n specifier,\n })\n }\n }\n\n emit<K extends CoordinatorEventKey>(\n event: K,\n value: CoordinatorEventValues[K]\n ): void {\n this.handlers[event].forEach(({ handler, specifier }) => {\n wrapError(\n () => handler(value),\n specifier,\n `Plugin \"${specifier}\" errored when trying to handle a \"${event}\" event`\n )\n })\n }\n\n async transform<K extends CoordinatorTransformKey>(\n event: K,\n value: CoordinatorTransformValues[K]\n ): Promise<CoordinatorTransformValues[K]> {\n let transformed = value\n for (const { transformer, specifier } of this.transformers[event]) {\n const returned = await wrapErrorAsync(\n async () => await transformer(transformed),\n specifier,\n `Plugin \"${specifier}\" errored when trying to do a \"${event}\" transform`\n )\n if (typeof returned !== 'undefined') {\n transformed = returned\n }\n }\n return transformed\n }\n\n async cleanup(): Promise<void> {\n for (const { cleanupFn, specifier } of this.cleanupFns) {\n await wrapErrorAsync(\n async () => await cleanupFn(),\n specifier,\n `Plugin \"${specifier}\" errored when trying to cleanup`\n )\n }\n }\n}\n\nfunction wrapError<T>(fn: () => T, specifier: string, message: string): T {\n try {\n return fn()\n } catch (error) {\n if (specifier) {\n throw new Error(message, { cause: error })\n }\n throw error\n }\n}\n\nasync function wrapErrorAsync<T>(\n fn: () => Promise<T>,\n specifier: string,\n message: string\n): Promise<T> {\n try {\n return await fn()\n } catch (error) {\n if (specifier) {\n throw new Error(message, { cause: error })\n }\n throw error\n }\n}\n"]}
|
package/lib/plugin/types.d.ts
CHANGED
|
@@ -1,53 +1,141 @@
|
|
|
1
|
+
import { Writable } from 'node:stream';
|
|
1
2
|
import { Envelope } from '@cucumber/messages';
|
|
2
|
-
import { ArrayValues, Promisable } from 'type-fest';
|
|
3
|
-
import { IRunEnvironment } from '../environment';
|
|
4
3
|
import { ILogger } from '../environment';
|
|
5
4
|
import { IFilterablePickle } from '../filter';
|
|
6
5
|
import { IResolvedPaths } from '../paths';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
/**
|
|
7
|
+
* The operation Cucumber is doing in this process
|
|
8
|
+
* @public
|
|
9
|
+
* @remarks
|
|
10
|
+
* `loadSources` and `loadSupport` are generally used as preflight operations
|
|
11
|
+
* for complex use cases. `runCucumber` is the one where tests are actually
|
|
12
|
+
* executed.
|
|
13
|
+
*/
|
|
14
|
+
export type PluginOperation = 'loadSources' | 'loadSupport' | 'runCucumber';
|
|
15
|
+
/**
|
|
16
|
+
* Subset of the environment available to plugins
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
export type CoordinatorEnvironment = {
|
|
20
|
+
/**
|
|
21
|
+
* Working directory for the project
|
|
22
|
+
*/
|
|
23
|
+
cwd: string;
|
|
24
|
+
/**
|
|
25
|
+
* Writable stream where the test run's warning/error output is written
|
|
26
|
+
* and plugins can write to directly if required
|
|
27
|
+
*/
|
|
28
|
+
stderr: Writable;
|
|
29
|
+
/**
|
|
30
|
+
* Environment variables
|
|
31
|
+
*/
|
|
32
|
+
env: Record<string, string | undefined>;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Keys for event handlers that plugins can register
|
|
36
|
+
* @public
|
|
37
|
+
*/
|
|
38
|
+
export type CoordinatorEventKey = 'message' | 'paths:resolve';
|
|
39
|
+
/**
|
|
40
|
+
* Keys for transforms that plugins can register
|
|
41
|
+
* @public
|
|
42
|
+
*/
|
|
43
|
+
export type CoordinatorTransformKey = 'pickles:filter' | 'pickles:order';
|
|
44
|
+
/**
|
|
45
|
+
* Mapping of event keys to their value types
|
|
46
|
+
* @public
|
|
47
|
+
*/
|
|
48
|
+
export type CoordinatorEventValues = {
|
|
14
49
|
message: Readonly<Envelope>;
|
|
15
50
|
'paths:resolve': Readonly<IResolvedPaths>;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Mapping of transform keys to their value types
|
|
54
|
+
* @public
|
|
55
|
+
*/
|
|
56
|
+
export type CoordinatorTransformValues = {
|
|
16
57
|
'pickles:filter': Readonly<Array<IFilterablePickle>>;
|
|
17
58
|
'pickles:order': Readonly<Array<IFilterablePickle>>;
|
|
18
59
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Handler function for a coordinator event
|
|
62
|
+
* @public
|
|
63
|
+
* @remarks
|
|
64
|
+
* You can do async work here, but Cucumber will not await the Promise.
|
|
65
|
+
*/
|
|
66
|
+
export type CoordinatorEventHandler<K extends CoordinatorEventKey> = (value: CoordinatorEventValues[K]) => void;
|
|
67
|
+
/**
|
|
68
|
+
* Transformer function for a coordinator transform
|
|
69
|
+
* @remarks
|
|
70
|
+
* Don't try to modify the original value. Return a transformed value, or
|
|
71
|
+
* `undefined` to pass through unchanged.
|
|
72
|
+
* @public
|
|
73
|
+
*/
|
|
74
|
+
export type CoordinatorTransformer<K extends CoordinatorTransformKey> = (value: CoordinatorTransformValues[K]) => PromiseLike<CoordinatorTransformValues[K]> | CoordinatorTransformValues[K];
|
|
75
|
+
/**
|
|
76
|
+
* Context object passed to a plugin's coordinator function
|
|
77
|
+
* @public
|
|
78
|
+
*/
|
|
79
|
+
export type CoordinatorContext<OptionsType> = {
|
|
80
|
+
/**
|
|
81
|
+
* The operation Cucumber is doing in this process
|
|
82
|
+
*/
|
|
83
|
+
operation: PluginOperation;
|
|
84
|
+
/**
|
|
85
|
+
* Register an event handler
|
|
86
|
+
*/
|
|
87
|
+
on: <EventKey extends CoordinatorEventKey>(event: EventKey, handler: CoordinatorEventHandler<EventKey>) => void;
|
|
88
|
+
/**
|
|
89
|
+
* Register a transformer
|
|
90
|
+
*/
|
|
91
|
+
transform: <EventKey extends CoordinatorTransformKey>(event: EventKey, handler: CoordinatorTransformer<EventKey>) => void;
|
|
92
|
+
/**
|
|
93
|
+
* Options for the plugin
|
|
94
|
+
*/
|
|
23
95
|
options: OptionsType;
|
|
96
|
+
/**
|
|
97
|
+
* Logger for emitting user-facing messages or diagnostics
|
|
98
|
+
*/
|
|
24
99
|
logger: ILogger;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
100
|
+
/**
|
|
101
|
+
* Subset of the environment
|
|
102
|
+
*/
|
|
103
|
+
environment: CoordinatorEnvironment;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Optional cleanup function returned by a plugin coordinator
|
|
107
|
+
* @public
|
|
108
|
+
*/
|
|
109
|
+
export type PluginCleanup = () => PromiseLike<void> | void;
|
|
110
|
+
/**
|
|
111
|
+
* A plugin that can subscribe to events and register transforms
|
|
112
|
+
* @public
|
|
113
|
+
*/
|
|
114
|
+
export type Plugin<OptionsType = any> = {
|
|
37
115
|
type: 'plugin';
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Coordinator function called during initialization
|
|
118
|
+
* @remarks
|
|
119
|
+
* Can do async work, and the Promise will be awaited. Can optionally return
|
|
120
|
+
* a cleanup function to be called when Cucumber is about to exit.
|
|
121
|
+
*/
|
|
122
|
+
coordinator: (context: CoordinatorContext<OptionsType>) => PromiseLike<PluginCleanup | void> | PluginCleanup | void;
|
|
123
|
+
/**
|
|
124
|
+
* Optional key to extract plugin-specific options from the root options object
|
|
125
|
+
*/
|
|
126
|
+
optionsKey?: string;
|
|
127
|
+
};
|
|
128
|
+
export type FormatterPluginContext<OptionsType> = {
|
|
41
129
|
on: (key: 'message', handler: (value: Envelope) => void) => void;
|
|
42
130
|
options: OptionsType;
|
|
43
131
|
logger: ILogger;
|
|
44
132
|
stream: NodeJS.WritableStream;
|
|
45
133
|
write: (buffer: string | Uint8Array) => void;
|
|
46
134
|
directory?: string;
|
|
47
|
-
}
|
|
48
|
-
export type FormatterPluginFunction<OptionsType> = (context: FormatterPluginContext<OptionsType>) =>
|
|
49
|
-
export
|
|
135
|
+
};
|
|
136
|
+
export type FormatterPluginFunction<OptionsType> = (context: FormatterPluginContext<OptionsType>) => PromiseLike<PluginCleanup | void> | PluginCleanup | void;
|
|
137
|
+
export type FormatterPlugin<OptionsType = any> = {
|
|
50
138
|
type: 'formatter';
|
|
51
139
|
formatter: FormatterPluginFunction<OptionsType>;
|
|
52
140
|
optionsKey?: string;
|
|
53
|
-
}
|
|
141
|
+
};
|
package/lib/plugin/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugin/types.ts"],"names":[],"mappings":"","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugin/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Writable } from 'node:stream'\nimport { Envelope } from '@cucumber/messages'\nimport { ILogger } from '../environment'\nimport { IFilterablePickle } from '../filter'\nimport { IResolvedPaths } from '../paths'\n\n/**\n * The operation Cucumber is doing in this process\n * @public\n * @remarks\n * `loadSources` and `loadSupport` are generally used as preflight operations\n * for complex use cases. `runCucumber` is the one where tests are actually\n * executed.\n */\nexport type PluginOperation = 'loadSources' | 'loadSupport' | 'runCucumber'\n\n/**\n * Subset of the environment available to plugins\n * @public\n */\nexport type CoordinatorEnvironment = {\n /**\n * Working directory for the project\n */\n cwd: string\n /**\n * Writable stream where the test run's warning/error output is written\n * and plugins can write to directly if required\n */\n stderr: Writable\n /**\n * Environment variables\n */\n env: Record<string, string | undefined>\n}\n\n/**\n * Keys for event handlers that plugins can register\n * @public\n */\nexport type CoordinatorEventKey = 'message' | 'paths:resolve'\n\n/**\n * Keys for transforms that plugins can register\n * @public\n */\nexport type CoordinatorTransformKey = 'pickles:filter' | 'pickles:order'\n\n/**\n * Mapping of event keys to their value types\n * @public\n */\nexport type CoordinatorEventValues = {\n message: Readonly<Envelope>\n 'paths:resolve': Readonly<IResolvedPaths>\n}\n\n/**\n * Mapping of transform keys to their value types\n * @public\n */\nexport type CoordinatorTransformValues = {\n 'pickles:filter': Readonly<Array<IFilterablePickle>>\n 'pickles:order': Readonly<Array<IFilterablePickle>>\n}\n\n/**\n * Handler function for a coordinator event\n * @public\n * @remarks\n * You can do async work here, but Cucumber will not await the Promise.\n */\nexport type CoordinatorEventHandler<K extends CoordinatorEventKey> = (\n value: CoordinatorEventValues[K]\n) => void\n\n/**\n * Transformer function for a coordinator transform\n * @remarks\n * Don't try to modify the original value. Return a transformed value, or\n * `undefined` to pass through unchanged.\n * @public\n */\nexport type CoordinatorTransformer<K extends CoordinatorTransformKey> = (\n value: CoordinatorTransformValues[K]\n) => PromiseLike<CoordinatorTransformValues[K]> | CoordinatorTransformValues[K]\n\n/**\n * Context object passed to a plugin's coordinator function\n * @public\n */\nexport type CoordinatorContext<OptionsType> = {\n /**\n * The operation Cucumber is doing in this process\n */\n operation: PluginOperation\n /**\n * Register an event handler\n */\n on: <EventKey extends CoordinatorEventKey>(\n event: EventKey,\n handler: CoordinatorEventHandler<EventKey>\n ) => void\n /**\n * Register a transformer\n */\n transform: <EventKey extends CoordinatorTransformKey>(\n event: EventKey,\n handler: CoordinatorTransformer<EventKey>\n ) => void\n /**\n * Options for the plugin\n */\n options: OptionsType\n /**\n * Logger for emitting user-facing messages or diagnostics\n */\n logger: ILogger\n /**\n * Subset of the environment\n */\n environment: CoordinatorEnvironment\n}\n\n/**\n * Optional cleanup function returned by a plugin coordinator\n * @public\n */\nexport type PluginCleanup = () => PromiseLike<void> | void\n\n/**\n * A plugin that can subscribe to events and register transforms\n * @public\n */\nexport type Plugin<OptionsType = any> = {\n type: 'plugin'\n /**\n * Coordinator function called during initialization\n * @remarks\n * Can do async work, and the Promise will be awaited. Can optionally return\n * a cleanup function to be called when Cucumber is about to exit.\n */\n coordinator: (\n context: CoordinatorContext<OptionsType>\n ) => PromiseLike<PluginCleanup | void> | PluginCleanup | void\n /**\n * Optional key to extract plugin-specific options from the root options object\n */\n optionsKey?: string\n}\n\nexport type FormatterPluginContext<OptionsType> = {\n on: (key: 'message', handler: (value: Envelope) => void) => void\n options: OptionsType\n logger: ILogger\n stream: NodeJS.WritableStream\n write: (buffer: string | Uint8Array) => void\n directory?: string\n}\n\nexport type FormatterPluginFunction<OptionsType> = (\n context: FormatterPluginContext<OptionsType>\n) => PromiseLike<PluginCleanup | void> | PluginCleanup | void\n\nexport type FormatterPlugin<OptionsType = any> = {\n type: 'formatter'\n formatter: FormatterPluginFunction<OptionsType>\n optionsKey?: string\n}\n"]}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare const publishPlugin: InternalPlugin<IPublishConfig | false>;
|
|
1
|
+
import { Plugin } from '../plugin';
|
|
2
|
+
export declare const publishPlugin: Plugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish_plugin.js","sourceRoot":"","sources":["../../src/publish/publish_plugin.ts"],"names":[],"mappings":";;;;;;AACA,mDAA+C;AAC/C,yCAAoD;AACpD,+CAAgD;AAChD,0DAA4B;AAC5B,qCAAgC;AAChC,qCAA6D;AAC7D,yCAAsC;AACtC,mDAA8C;AAC9C,wDAA8B;
|
|
1
|
+
{"version":3,"file":"publish_plugin.js","sourceRoot":"","sources":["../../src/publish/publish_plugin.ts"],"names":[],"mappings":";;;;;;AACA,mDAA+C;AAC/C,yCAAoD;AACpD,+CAAgD;AAChD,0DAA4B;AAC5B,qCAAgC;AAChC,qCAA6D;AAC7D,yCAAsC;AACtC,mDAA8C;AAC9C,wDAA8B;AAG9B,MAAM,4BAA4B,GAAG,0CAA0C,CAAA;AAElE,QAAA,aAAa,GAAW;IACnC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;QAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,4BAA4B,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;QAC7D,MAAM,OAAO,GAA8B,EAAE,CAAA;QAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAA;QAC3C,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;QAEzC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACtB,OAAO,GAAG,EAAE;gBACV,IAAI,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAC/B,WAAW,CAAC,MAAM,CAAC,KAAK,CACtB,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CACzD,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CACV,+BAA+B,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,gBAChD,aAAa,CAAC,MAChB,EAAE,CACH,CAAA;oBACD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC,CAAA;QACH,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,mBAAI,CAAC,IAAI,CAAC,IAAA,gBAAM,GAAE,EAAE,sBAAsB,CAAC,CAAC,CAAA;QAC1E,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;QAC7D,MAAM,WAAW,GAAG,IAAA,sBAAU,GAAE,CAAA;QAChC,MAAM,eAAe,GAAG,IAAA,mBAAQ,EAC9B,WAAW,EACX,IAAA,2BAAiB,EAAC,YAAY,CAAC,CAChC,CAAA;QACD,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAEzE,OAAO,GAAG,EAAE;YACV,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;oBACzB,MAAM,eAAe,CAAA;oBACrB,MAAM,KAAK,GAAG,MAAM,IAAA,eAAI,EAAC,YAAY,CAAC,CAAA;oBACtC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;oBAC3C,MAAM,CAAC,KAAK,CACV,8DAA8D,EAC9D,aAAa,CACd,CAAA;oBACD,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;wBAC5C,MAAM,EAAE,KAAK;wBACb,OAAO,EAAE;4BACP,cAAc,EAAE,mBAAmB;4BACnC,kBAAkB,EAAE,MAAM;4BAC1B,gBAAgB,EAAE,aAAa;yBAChC;wBACD,IAAI,EAAE,IAAA,0BAAgB,EAAC,YAAY,CAAC;wBACpC,MAAM,EAAE,MAAM;qBACf,CAAC,CAAA;oBACF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;wBACtB,WAAW,CAAC,MAAM,CAAC,KAAK,CACtB,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CACzD,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,KAAK,CACV,8BACE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MACrB,gBAAgB,cAAc,CAAC,MAAM,EAAE,CACxC,CAAA;wBACD,MAAM,CAAC,KAAK,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;oBAC3C,CAAC;oBACD,OAAO,EAAE,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;IACH,CAAC;CACF,CAAA;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAW,EAAE,MAAgB;IAC1D,IAAI,CAAC,IAAA,8BAAa,EAAC,MAAM,CAAC,IAAI,IAAA,kBAAO,EAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAA,oCAAwB,EAAC,GAAG,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["import { Writable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { stripVTControlCharacters } from 'node:util'\nimport { mkdtemp, stat } from 'node:fs/promises'\nimport path from 'node:path'\nimport { tmpdir } from 'node:os'\nimport { createReadStream, createWriteStream } from 'node:fs'\nimport { createGzip } from 'node:zlib'\nimport { supportsColor } from 'supports-color'\nimport hasAnsi from 'has-ansi'\nimport { Plugin } from '../plugin'\n\nconst DEFAULT_CUCUMBER_PUBLISH_URL = 'https://messages.cucumber.io/api/reports'\n\nexport const publishPlugin: Plugin = {\n type: 'plugin',\n coordinator: async ({ on, logger, options, environment }) => {\n if (!options) {\n return undefined\n }\n const { url = DEFAULT_CUCUMBER_PUBLISH_URL, token } = options\n const headers: { [key: string]: string } = {}\n if (token !== undefined) {\n headers.Authorization = `Bearer ${token}`\n }\n const touchResponse = await fetch(url, { headers })\n const banner = await touchResponse.text()\n\n if (!touchResponse.ok) {\n return () => {\n if (touchResponse.status < 500) {\n environment.stderr.write(\n sanitisePublishOutput(banner, environment.stderr) + '\\n'\n )\n } else {\n logger.error(\n `Failed to publish report to ${new URL(url).origin} with status ${\n touchResponse.status\n }`\n )\n logger.debug(touchResponse)\n }\n }\n }\n\n const uploadUrl = touchResponse.headers.get('Location')\n const tempDir = await mkdtemp(path.join(tmpdir(), `cucumber-js-publish-`))\n const tempFilePath = path.join(tempDir, 'envelopes.jsonl.gz')\n const writeStream = createGzip()\n const finishedWriting = pipeline(\n writeStream,\n createWriteStream(tempFilePath)\n )\n on('message', (value) => writeStream.write(JSON.stringify(value) + '\\n'))\n\n return () => {\n return new Promise<void>((resolve) => {\n writeStream.end(async () => {\n await finishedWriting\n const stats = await stat(tempFilePath)\n const contentLength = stats.size.toString()\n logger.debug(\n 'Uploading envelopes to Cucumber Reports with content length:',\n contentLength\n )\n const uploadResponse = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/jsonl',\n 'Content-Encoding': 'gzip',\n 'Content-Length': contentLength,\n },\n body: createReadStream(tempFilePath),\n duplex: 'half',\n })\n if (uploadResponse.ok) {\n environment.stderr.write(\n sanitisePublishOutput(banner, environment.stderr) + '\\n'\n )\n } else {\n logger.error(\n `Failed to upload report to ${\n new URL(uploadUrl).origin\n } with status ${uploadResponse.status}`\n )\n logger.debug(await uploadResponse.text())\n }\n resolve()\n })\n })\n }\n },\n}\n\n/*\nThis is because the Cucumber Reports service returns a pre-formatted console message\nincluding ANSI escapes, so if our stderr stream doesn't support those we need to\nstrip them back out. Ideally we should get structured data from the service and\ncompose the console message on this end.\n */\nfunction sanitisePublishOutput(raw: string, stderr: Writable) {\n if (!supportsColor(stderr) && hasAnsi(raw)) {\n return stripVTControlCharacters(raw)\n }\n return raw\n}\n"]}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare const shardingPlugin: InternalPlugin<ISourcesCoordinates>;
|
|
1
|
+
import { Plugin } from '../plugin';
|
|
2
|
+
export declare const shardingPlugin: Plugin;
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.shardingPlugin = void 0;
|
|
4
4
|
exports.shardingPlugin = {
|
|
5
5
|
type: 'plugin',
|
|
6
|
-
coordinator: async ({
|
|
7
|
-
|
|
6
|
+
coordinator: async ({ transform, options }) => {
|
|
7
|
+
transform('pickles:filter', async (allPickles) => {
|
|
8
8
|
if (!options.shard) {
|
|
9
9
|
return allPickles;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharding_plugin.js","sourceRoot":"","sources":["../../src/sharding/sharding_plugin.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"sharding_plugin.js","sourceRoot":"","sources":["../../src/sharding/sharding_plugin.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAW;IACpC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5C,SAAS,CAAC,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAC/C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,UAAU,CAAA;YACnB,CAAC;YAED,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/D,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;YAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;YAE9C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,UAAU,KAAK,UAAU,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA","sourcesContent":["import { Plugin } from '../plugin'\n\nexport const shardingPlugin: Plugin = {\n type: 'plugin',\n coordinator: async ({ transform, options }) => {\n transform('pickles:filter', async (allPickles) => {\n if (!options.shard) {\n return allPickles\n }\n\n const [shardIndexStr, shardTotalStr] = options.shard.split('/')\n const shardIndex = parseInt(shardIndexStr, 10) - 1\n const shardTotal = parseInt(shardTotalStr, 10)\n\n return allPickles.filter((_, i) => i % shardTotal === shardIndex)\n })\n },\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/filter_stack_trace.ts","../src/index.ts","../src/pickle_filter.ts","../src/step_arguments.ts","../src/time.ts","../src/try_require.ts","../src/uncaught_exception_manager.ts","../src/user_code_runner.ts","../src/value_checker.ts","../src/version.ts","../src/api/convert_configuration.ts","../src/api/formatters.ts","../src/api/gherkin.ts","../src/api/index.ts","../src/api/load_configuration.ts","../src/api/load_sources.ts","../src/api/load_support.ts","../src/api/plugins.ts","../src/api/run_cucumber.ts","../src/api/support.ts","../src/api/test_helpers.ts","../src/api/types.ts","../src/assemble/assemble_test_cases.ts","../src/assemble/index.ts","../src/assemble/types.ts","../src/cli/helpers.ts","../src/cli/i18n.ts","../src/cli/index.ts","../src/cli/install_validator.ts","../src/cli/run.ts","../src/cli/validate_node_engine_version.ts","../src/configuration/argv_parser.ts","../src/configuration/check_schema.ts","../src/configuration/default_configuration.ts","../src/configuration/from_file.ts","../src/configuration/helpers.ts","../src/configuration/index.ts","../src/configuration/locate_file.ts","../src/configuration/merge_configurations.ts","../src/configuration/parse_configuration.ts","../src/configuration/split_format_descriptor.ts","../src/configuration/types.ts","../src/configuration/validate_configuration.ts","../src/environment/console_logger.ts","../src/environment/index.ts","../src/environment/make_environment.ts","../src/environment/types.ts","../src/filter/filter_plugin.ts","../src/filter/index.ts","../src/filter/types.ts","../src/formatter/builder.ts","../src/formatter/create_stream.ts","../src/formatter/find_class_or_plugin.ts","../src/formatter/get_color_fns.ts","../src/formatter/import_code.ts","../src/formatter/index.ts","../src/formatter/json_formatter.ts","../src/formatter/progress_bar_formatter.ts","../src/formatter/progress_formatter.ts","../src/formatter/rerun_formatter.ts","../src/formatter/resolve_implementation.ts","../src/formatter/snippets_formatter.ts","../src/formatter/summary_formatter.ts","../src/formatter/usage_formatter.ts","../src/formatter/usage_json_formatter.ts","../src/formatter/builtin/html.ts","../src/formatter/builtin/index.ts","../src/formatter/builtin/message.ts","../src/formatter/helpers/duration_helpers.ts","../src/formatter/helpers/event_data_collector.ts","../src/formatter/helpers/formatters.ts","../src/formatter/helpers/gherkin_document_parser.ts","../src/formatter/helpers/index.ts","../src/formatter/helpers/issue_helpers.ts","../src/formatter/helpers/keyword_type.ts","../src/formatter/helpers/location_helpers.ts","../src/formatter/helpers/pickle_parser.ts","../src/formatter/helpers/step_argument_formatter.ts","../src/formatter/helpers/summary_helpers.ts","../src/formatter/helpers/test_case_attempt_formatter.ts","../src/formatter/helpers/test_case_attempt_parser.ts","../src/formatter/helpers/usage_helpers/index.ts","../src/formatter/step_definition_snippet_builder/index.ts","../src/formatter/step_definition_snippet_builder/javascript_snippet_syntax.ts","../src/formatter/step_definition_snippet_builder/snippet_syntax.ts","../src/models/data_table.ts","../src/models/definition.ts","../src/models/gherkin_step_keyword.ts","../src/models/step_definition.ts","../src/models/test_case_hook_definition.ts","../src/models/test_run_hook_definition.ts","../src/models/test_step_hook_definition.ts","../src/paths/index.ts","../src/paths/paths.ts","../src/paths/types.ts","../src/plugin/
|
|
1
|
+
{"root":["../src/filter_stack_trace.ts","../src/index.ts","../src/pickle_filter.ts","../src/step_arguments.ts","../src/time.ts","../src/try_require.ts","../src/uncaught_exception_manager.ts","../src/user_code_runner.ts","../src/value_checker.ts","../src/version.ts","../src/api/convert_configuration.ts","../src/api/formatters.ts","../src/api/gherkin.ts","../src/api/index.ts","../src/api/load_configuration.ts","../src/api/load_sources.ts","../src/api/load_support.ts","../src/api/plugins.ts","../src/api/run_cucumber.ts","../src/api/support.ts","../src/api/test_helpers.ts","../src/api/types.ts","../src/assemble/assemble_test_cases.ts","../src/assemble/index.ts","../src/assemble/types.ts","../src/cli/helpers.ts","../src/cli/i18n.ts","../src/cli/index.ts","../src/cli/install_validator.ts","../src/cli/run.ts","../src/cli/validate_node_engine_version.ts","../src/configuration/argv_parser.ts","../src/configuration/check_schema.ts","../src/configuration/default_configuration.ts","../src/configuration/from_file.ts","../src/configuration/helpers.ts","../src/configuration/index.ts","../src/configuration/locate_file.ts","../src/configuration/merge_configurations.ts","../src/configuration/parse_configuration.ts","../src/configuration/split_format_descriptor.ts","../src/configuration/types.ts","../src/configuration/validate_configuration.ts","../src/environment/console_logger.ts","../src/environment/index.ts","../src/environment/make_environment.ts","../src/environment/types.ts","../src/filter/filter_plugin.ts","../src/filter/index.ts","../src/filter/types.ts","../src/formatter/builder.ts","../src/formatter/create_stream.ts","../src/formatter/find_class_or_plugin.ts","../src/formatter/get_color_fns.ts","../src/formatter/import_code.ts","../src/formatter/index.ts","../src/formatter/json_formatter.ts","../src/formatter/progress_bar_formatter.ts","../src/formatter/progress_formatter.ts","../src/formatter/rerun_formatter.ts","../src/formatter/resolve_implementation.ts","../src/formatter/snippets_formatter.ts","../src/formatter/summary_formatter.ts","../src/formatter/usage_formatter.ts","../src/formatter/usage_json_formatter.ts","../src/formatter/builtin/html.ts","../src/formatter/builtin/index.ts","../src/formatter/builtin/message.ts","../src/formatter/helpers/duration_helpers.ts","../src/formatter/helpers/event_data_collector.ts","../src/formatter/helpers/formatters.ts","../src/formatter/helpers/gherkin_document_parser.ts","../src/formatter/helpers/index.ts","../src/formatter/helpers/issue_helpers.ts","../src/formatter/helpers/keyword_type.ts","../src/formatter/helpers/location_helpers.ts","../src/formatter/helpers/pickle_parser.ts","../src/formatter/helpers/step_argument_formatter.ts","../src/formatter/helpers/summary_helpers.ts","../src/formatter/helpers/test_case_attempt_formatter.ts","../src/formatter/helpers/test_case_attempt_parser.ts","../src/formatter/helpers/usage_helpers/index.ts","../src/formatter/step_definition_snippet_builder/index.ts","../src/formatter/step_definition_snippet_builder/javascript_snippet_syntax.ts","../src/formatter/step_definition_snippet_builder/snippet_syntax.ts","../src/models/data_table.ts","../src/models/definition.ts","../src/models/gherkin_step_keyword.ts","../src/models/step_definition.ts","../src/models/test_case_hook_definition.ts","../src/models/test_run_hook_definition.ts","../src/models/test_step_hook_definition.ts","../src/paths/index.ts","../src/paths/paths.ts","../src/paths/types.ts","../src/plugin/index.ts","../src/plugin/plugin_manager.ts","../src/plugin/types.ts","../src/publish/index.ts","../src/publish/publish_plugin.ts","../src/publish/types.ts","../src/runtime/coordinator.ts","../src/runtime/format_error.ts","../src/runtime/helpers.ts","../src/runtime/index.ts","../src/runtime/make_runtime.ts","../src/runtime/make_suggestion.ts","../src/runtime/step_runner.ts","../src/runtime/stopwatch.ts","../src/runtime/test_case_runner.ts","../src/runtime/types.ts","../src/runtime/worker.ts","../src/runtime/attachment_manager/index.ts","../src/runtime/parallel/adapter.ts","../src/runtime/parallel/run_worker.ts","../src/runtime/parallel/types.ts","../src/runtime/parallel/worker.ts","../src/runtime/scope/index.ts","../src/runtime/scope/make_proxy.ts","../src/runtime/scope/test_case_scope.ts","../src/runtime/scope/test_run_scope.ts","../src/runtime/serial/adapter.ts","../src/sharding/index.ts","../src/sharding/sharding_plugin.ts","../src/support_code_library_builder/build_parameter_type.ts","../src/support_code_library_builder/context.ts","../src/support_code_library_builder/get_definition_line_and_uri.ts","../src/support_code_library_builder/index.ts","../src/support_code_library_builder/parallel_can_assign_helpers.ts","../src/support_code_library_builder/sourced_parameter_type_registry.ts","../src/support_code_library_builder/types.ts","../src/support_code_library_builder/validate_arguments.ts","../src/support_code_library_builder/world.ts","../src/types/index.ts","../src/types/assertion-error-formatter/index.d.ts","../src/types/is-generator/index.d.ts","../src/types/knuth-shuffle-seeded/index.d.ts","../src/types/stack-chain/index.d.ts","../src/types/supports-color/index.d.ts"],"version":"5.8.3"}
|
package/lib/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "12.
|
|
1
|
+
export declare const version = "12.5.0";
|
package/lib/version.js
CHANGED
package/lib/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,QAAQ,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '12.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,QAAQ,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '12.5.0'\n"]}
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"gherkin",
|
|
9
9
|
"tests"
|
|
10
10
|
],
|
|
11
|
-
"version": "12.
|
|
11
|
+
"version": "12.5.0",
|
|
12
12
|
"funding": "https://opencollective.com/cucumber",
|
|
13
13
|
"homepage": "https://github.com/cucumber/cucumber-js",
|
|
14
14
|
"author": "Julien Biezemans <jb@jbpros.com>",
|
|
@@ -219,13 +219,13 @@
|
|
|
219
219
|
"dependencies": {
|
|
220
220
|
"@cucumber/ci-environment": "12.0.0",
|
|
221
221
|
"@cucumber/cucumber-expressions": "18.0.1",
|
|
222
|
-
"@cucumber/gherkin": "37.0.
|
|
222
|
+
"@cucumber/gherkin": "37.0.1",
|
|
223
223
|
"@cucumber/gherkin-streams": "6.0.0",
|
|
224
224
|
"@cucumber/gherkin-utils": "10.0.0",
|
|
225
|
-
"@cucumber/html-formatter": "22.
|
|
225
|
+
"@cucumber/html-formatter": "22.3.0",
|
|
226
226
|
"@cucumber/junit-xml-formatter": "0.9.0",
|
|
227
227
|
"@cucumber/message-streams": "4.0.1",
|
|
228
|
-
"@cucumber/messages": "31.
|
|
228
|
+
"@cucumber/messages": "31.1.0",
|
|
229
229
|
"@cucumber/pretty-formatter": "1.0.1",
|
|
230
230
|
"@cucumber/tag-expressions": "8.1.0",
|
|
231
231
|
"assertion-error-formatter": "^3.0.0",
|
|
@@ -265,7 +265,7 @@
|
|
|
265
265
|
"@eslint/eslintrc": "^3.3.1",
|
|
266
266
|
"@eslint/js": "^9.29.0",
|
|
267
267
|
"@microsoft/api-extractor": "7.55.2",
|
|
268
|
-
"@sinonjs/fake-timers": "15.
|
|
268
|
+
"@sinonjs/fake-timers": "15.1.0",
|
|
269
269
|
"@types/chai": "4.3.20",
|
|
270
270
|
"@types/debug": "4.1.12",
|
|
271
271
|
"@types/dirty-chai": "2.0.5",
|
|
@@ -305,7 +305,7 @@
|
|
|
305
305
|
"prettier": "^3.5.3",
|
|
306
306
|
"reindent-template-literals": "1.1.0",
|
|
307
307
|
"shx": "0.4.0",
|
|
308
|
-
"sinon": "21.0.
|
|
308
|
+
"sinon": "21.0.1",
|
|
309
309
|
"sinon-chai": "3.7.0",
|
|
310
310
|
"stream-to-string": "1.2.1",
|
|
311
311
|
"tmp": "0.2.5",
|
package/lib/plugin/events.d.ts
DELETED
package/lib/plugin/events.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.coordinatorTransformKeys = exports.coordinatorVoidKeys = void 0;
|
|
4
|
-
exports.coordinatorVoidKeys = ['message', 'paths:resolve'];
|
|
5
|
-
exports.coordinatorTransformKeys = [
|
|
6
|
-
'pickles:filter',
|
|
7
|
-
'pickles:order',
|
|
8
|
-
];
|
|
9
|
-
//# sourceMappingURL=events.js.map
|
package/lib/plugin/events.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/plugin/events.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,CAAC,SAAS,EAAE,eAAe,CAAU,CAAA;AAC3D,QAAA,wBAAwB,GAAG;IACtC,gBAAgB;IAChB,eAAe;CACP,CAAA","sourcesContent":["export const coordinatorVoidKeys = ['message', 'paths:resolve'] as const\nexport const coordinatorTransformKeys = [\n 'pickles:filter',\n 'pickles:order',\n] as const\n"]}
|