@autometa/events 0.1.6 → 0.2.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.
@@ -1,12 +1,12 @@
1
1
 
2
- > @autometa/events@0.1.2 test /Users/ben.aherne/Documents/GitHub/autometa/packages/events
2
+ > @autometa/events@0.1.6 test /Users/ben.aherne/Documents/GitHub/autometa/packages/events
3
3
  > vitest run --passWithNoTests
4
4
 
5
5
 
6
6
  RUN v0.33.0 /Users/ben.aherne/Documents/GitHub/autometa/packages/events/src
7
7
 
8
- No test files found, exiting with code 0
9
-
10
8
  include: **/*.{test,spec}.?(c|m)[jt]s?(x)
11
9
  exclude: **/node_modules/**, **/dist/**, **/cypress/**, **/.{idea,git,cache,output,temp}/**, **/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build}.config.*
12
10
  watch exclude: **/node_modules/**, **/dist/**
11
+ No test files found, exiting with code 0
12
+
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Gherkin
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 51d88780: Feat: Add Async Test Event support to new runner
8
+
3
9
  ## 0.1.6
4
10
 
5
11
  ### Patch Changes
package/dist/esm/index.js CHANGED
@@ -62,22 +62,22 @@ var ProviderSubscriber = class {
62
62
 
63
63
  // src/test-emitter.ts
64
64
  import EventEmitter from "events";
65
- import { AutomationError } from "@autometa/errors";
66
65
  var TestEmitter = class extends EventEmitter {
67
66
  constructor(name) {
68
67
  super();
69
68
  this.name = name;
69
+ this.promises = [];
70
70
  this.emitStart = (...args) => {
71
71
  this.emit(`onStart${this.name}`, ...args);
72
72
  };
73
73
  this.onStart = (action) => {
74
74
  if (action) {
75
- this.on(`onStart${this.name}`, tryWrapper(this.name, action));
75
+ this.on(`onStart${this.name}`, this.collectPromises(this.name, action));
76
76
  }
77
77
  };
78
78
  this.onEnd = (action) => {
79
79
  if (action) {
80
- this.on(`onEnd${this.name}`, tryWrapper(this.name, action));
80
+ this.on(`onEnd${this.name}`, this.collectPromises(this.name, action));
81
81
  }
82
82
  };
83
83
  this.emitEnd = (...args) => {
@@ -87,24 +87,24 @@ var TestEmitter = class extends EventEmitter {
87
87
  this.onStart(onStart);
88
88
  this.onEnd(onEnd);
89
89
  };
90
+ this.collectPromises = (name, action) => {
91
+ return (...args) => {
92
+ try {
93
+ const result = action(...args);
94
+ if (result instanceof Promise) {
95
+ this.promises.push(result);
96
+ }
97
+ } catch (e) {
98
+ console.error(`Event Subscriber ${name} threw an error ${e.message}`);
99
+ }
100
+ };
101
+ };
102
+ this.waitForPromises = async () => {
103
+ const settled = await Promise.allSettled(this.promises);
104
+ return settled.filter((it) => it.status === "rejected").length;
105
+ };
90
106
  }
91
107
  };
92
- function tryWrapper(name, action) {
93
- return (...args) => {
94
- try {
95
- const result = action(...args);
96
- if (result instanceof Promise) {
97
- throw new AutomationError(
98
- `A Subscriber action cannot be async or return a promise. Executing ${name}`
99
- );
100
- }
101
- } catch (e) {
102
- console.error(
103
- `Event Subscriber ${name} threw an error ${e.message}`
104
- );
105
- }
106
- };
107
- }
108
108
 
109
109
  // src/test-event-emitter.ts
110
110
  var TestEventEmitter = class {
@@ -121,6 +121,20 @@ var TestEventEmitter = class {
121
121
  this.before = new TestEmitter("Before");
122
122
  this.after = new TestEmitter("After");
123
123
  this.step = new TestEmitter("Step");
124
+ this.settleAsyncEvents = async () => {
125
+ return await Promise.allSettled([
126
+ this.scenarioOutline.waitForPromises(),
127
+ this.feature.waitForPromises(),
128
+ this.rule.waitForPromises(),
129
+ this.scenario.waitForPromises(),
130
+ this.scenarioWrapper.waitForPromises(),
131
+ this.setup.waitForPromises(),
132
+ this.teardown.waitForPromises(),
133
+ this.before.waitForPromises(),
134
+ this.after.waitForPromises(),
135
+ this.step.waitForPromises()
136
+ ]);
137
+ };
124
138
  this.load = ({
125
139
  onFeatureStart,
126
140
  onFeatureEnd,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/event-options.ts","../../src/event-subscriber.ts","../../src/test-emitter.ts","../../src/test-event-emitter.ts","../../src/test-status.ts"],"sourcesContent":["import { object, string, literal, z } from \"zod\";\nconst uuidRegex =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gm;\nexport const UUIDStringSchema = string().regex(uuidRegex).optional();\n\nexport const StatusSchema = z.union([\n literal(\"FAILED\"),\n literal(\"BROKEN\"),\n literal(\"PASSED\"),\n literal(\"SKIPPED\")\n]);\nexport const EventOptionsSchema = object({\n title: string().optional(),\n keyword: string().optional(),\n tags: string().array().optional(),\n modifier: literal(\"skip\").or(literal(\"only\")).optional(),\n status: StatusSchema.optional()\n});\n\nexport const ErrorEventSchema = EventOptionsSchema.extend({\n error: z.instanceof(Error).optional()\n});\nexport const ArgsEventSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional()\n});\n\nexport const StartFeatureOptsSchema = EventOptionsSchema.extend({\n path: string().optional()\n});\n\nexport const EndFeatureOptsSchema = ErrorEventSchema;\n\nexport const EndRuleOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOutlineOptsSchema = EventOptionsSchema;\n// .extend({\n// uuid: UUIDStringSchema.optional()\n// });\n\nexport const EndScenarioOutlineOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOptsSchema = EventOptionsSchema;\n\nexport const EndScenarioOptsSchema = ErrorEventSchema;\n\nexport const StartStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n});\nexport const EndStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string(),\n}).and(ErrorEventSchema);\nexport const StartBeforeOptsSchema = ArgsEventSchema;\nexport const EndBeforeOptsSchema = ErrorEventSchema;\nexport const StartAfterOptsSchema = ArgsEventSchema;\nexport const EndAfterOptsSchema = ErrorEventSchema;\nexport const StartSetupOptsSchema = ArgsEventSchema;\nexport const EndSetupOptsSchema = ErrorEventSchema;\nexport const StartTeardownOptsSchema = ArgsEventSchema;\nexport const EndTeardownOptsSchema = ErrorEventSchema;\n\nexport type EventOptions = z.infer<typeof EventOptionsSchema>;\nexport type StartFeatureOpts = z.infer<typeof StartFeatureOptsSchema>;\nexport type EndFeatureOpts = z.infer<typeof EndFeatureOptsSchema>;\nexport type StartRuleOpts = EventOptions;\nexport type EndRuleOpts = z.infer<typeof EndRuleOptsSchema>;\nexport type StartScenarioOutlineOpts = z.infer<\n typeof StartScenarioOutlineOptsSchema\n>;\nexport type EndScenarioOutlineOpts = z.infer<\n typeof EndScenarioOutlineOptsSchema\n>;\nexport type StartScenarioOpts = z.infer<typeof StartScenarioOptsSchema>;\nexport type EndScenarioOpts = z.infer<typeof EndScenarioOptsSchema>;\nexport type StartStepOpts = z.infer<typeof StartStepOptsSchema>;\nexport type EndStepOpts = z.infer<typeof EndStepOptsSchema>;\nexport type StartBeforeOpts = z.infer<typeof StartBeforeOptsSchema>;\nexport type EndBeforeOpts = z.infer<typeof EndBeforeOptsSchema>;\nexport type StartAfterOpts = z.infer<typeof StartAfterOptsSchema>;\nexport type EndAfterOpts = z.infer<typeof EndAfterOptsSchema>;\nexport type StartSetupOpts = z.infer<typeof StartSetupOptsSchema>;\nexport type EndSetupOpts = z.infer<typeof EndSetupOptsSchema>;\nexport type StartTeardownOpts = z.infer<typeof StartTeardownOptsSchema>;\nexport type EndTeardownOpts = z.infer<typeof EndTeardownOptsSchema>;\n","import { Class } from \"@autometa/types\";\nimport { InjectionToken } from \"tsyringe\";\nimport {\n EndAfterOpts,\n EndBeforeOpts,\n EndFeatureOpts,\n EndRuleOpts,\n EndScenarioOpts,\n EndSetupOpts,\n EndStepOpts,\n EndTeardownOpts,\n StartAfterOpts,\n StartBeforeOpts,\n StartFeatureOpts,\n StartRuleOpts,\n StartScenarioOpts,\n StartScenarioOutlineOpts,\n StartSetupOpts,\n StartStepOpts,\n StartTeardownOpts,\n} from \"./event-options\";\nimport {object, function as fun} from 'zod'\nexport type DependencyInstanceProvider = {\n token: InjectionToken<unknown>;\n instance: unknown;\n};\n\nexport const EventSubscriberSchema = object({\n onFeature: fun()\n})\nexport interface EventSubscriber {\n onFeatureStart?(opts: StartFeatureOpts): void;\n onFeatureEnd?(opts: EndFeatureOpts): void;\n onRuleStart?(opts: StartRuleOpts): void;\n onRuleEnd?(opts: EndRuleOpts): void;\n onScenarioOutlineStart?(opts: StartScenarioOutlineOpts): void;\n onScenarioOutlineEnd?(opts: EndScenarioOpts): void;\n onPreScenarioStart?(): void;\n onPostScenarioEnd?(): void;\n onScenarioStart?(opts: StartScenarioOpts): void;\n onScenarioEnd?(opts: EndScenarioOpts): void;\n onStepStart?(opts: StartStepOpts): void;\n onStepEnd?(opts: EndStepOpts): void;\n onSetupStart?(opts: StartSetupOpts): void;\n onSetupEnd?(opts: EndSetupOpts): void;\n onTeardownStart?(opts: StartTeardownOpts): void;\n onTeardownEnd?(opts: EndTeardownOpts): void;\n onBeforeStart?(opts: StartBeforeOpts): void;\n onBeforeEnd?(opts: EndBeforeOpts): void;\n onAfterStart?(opts: StartAfterOpts): void;\n onAfterEnd?(opts: EndAfterOpts): void;\n}\n\nexport abstract class ProviderSubscriber implements EventSubscriber {\n abstract get fixtures(): {\n instances?: DependencyInstanceProvider[];\n prototypes?: Class<unknown>[];\n };\n\n addFixtureInstance = (instance: DependencyInstanceProvider) => {\n this.fixtures.instances?.push(instance);\n };\n\n onFeatureStart?(opts: StartFeatureOpts): void;\n}\n","import EventEmitter from \"events\";\nimport { Cb } from \"./test-event-emitter\";\nimport { AutomationError } from \"@autometa/errors\";\nexport class TestEmitter<\n TArgsStart = never,\n TArgsEnd = never\n> extends EventEmitter {\n constructor(readonly name: string) {\n super();\n }\n\n emitStart = (...args: TArgsStart[]) => {\n this.emit(`onStart${this.name}`, ...args);\n };\n\n onStart = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onStart${this.name}`, tryWrapper(this.name, action));\n }\n };\n\n onEnd = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onEnd${this.name}`, tryWrapper(this.name, action));\n }\n };\n\n emitEnd = (...args: TArgsEnd[]) => {\n this.emit(`onEnd${this.name}`, ...args);\n };\n\n load = (onStart?: Cb, onEnd?: Cb) => {\n this.onStart(onStart);\n this.onEnd(onEnd);\n };\n}\n\nfunction tryWrapper(name: string, action: (...args: unknown[]) => void) {\n return (...args: unknown[]) => {\n try {\n const result = action(...args);\n if ((result as unknown) instanceof Promise) {\n throw new AutomationError(\n `A Subscriber action cannot be async or return a promise. Executing ${name}`\n );\n }\n } catch (e) {\n console.error(\n `Event Subscriber ${name} threw an error ${(e as Error).message}`\n );\n }\n };\n}\n","import { EventSubscriber } from \"./event-subscriber\";\nimport { TestEmitter } from \"./test-emitter\";\nimport {\n StartScenarioOutlineOpts,\n EndScenarioOutlineOpts,\n StartFeatureOpts,\n EndFeatureOpts,\n StartRuleOpts,\n EndRuleOpts,\n StartScenarioOpts,\n EndScenarioOpts,\n StartSetupOpts,\n EndSetupOpts,\n StartTeardownOpts,\n EndTeardownOpts,\n StartBeforeOpts,\n EndBeforeOpts,\n StartAfterOpts,\n EndAfterOpts,\n StartStepOpts,\n EndStepOpts,\n} from \"./event-options\";\nexport class TestEventEmitter {\n scenarioOutline = new TestEmitter<StartScenarioOutlineOpts, EndScenarioOutlineOpts>(\n \"ScenarioOutline\"\n );\n feature = new TestEmitter<StartFeatureOpts, EndFeatureOpts>(\"Feature\");\n rule = new TestEmitter<StartRuleOpts, EndRuleOpts>(\"Rule\");\n scenario = new TestEmitter<StartScenarioOpts, EndScenarioOpts>(\"Scenario\");\n scenarioWrapper = new TestEmitter<never, never>(\"Scenario Wrapper\");\n setup = new TestEmitter<StartSetupOpts, EndSetupOpts>(\"Setup\");\n teardown = new TestEmitter<StartTeardownOpts, EndTeardownOpts>(\"Teardown\");\n before = new TestEmitter<StartBeforeOpts, EndBeforeOpts>(\"Before\");\n after = new TestEmitter<StartAfterOpts, EndAfterOpts>(\"After\");\n step = new TestEmitter<StartStepOpts, EndStepOpts>(\"Step\");\n\n load = ({\n onFeatureStart,\n onFeatureEnd,\n onScenarioOutlineStart,\n onScenarioOutlineEnd,\n onScenarioStart,\n onScenarioEnd,\n onRuleStart,\n onRuleEnd,\n onBeforeStart,\n onBeforeEnd,\n onSetupStart,\n onSetupEnd,\n onStepStart,\n onStepEnd,\n onAfterStart,\n onAfterEnd,\n onTeardownStart,\n onTeardownEnd,\n onPreScenarioStart,\n onPostScenarioEnd,\n }: EventSubscriber) => {\n this.feature.load(onFeatureStart, onFeatureEnd);\n this.rule.load(onRuleStart, onRuleEnd);\n this.scenarioOutline.load(onScenarioOutlineStart, onScenarioOutlineEnd);\n this.scenario.load(onScenarioStart, onScenarioEnd);\n this.step.load(onStepStart, onStepEnd);\n this.before.load(onBeforeStart, onBeforeEnd);\n this.after.load(onAfterStart, onAfterEnd);\n this.setup.load(onSetupStart, onSetupEnd);\n this.teardown.load(onTeardownStart, onTeardownEnd);\n this.scenarioWrapper.load(onPreScenarioStart, onPostScenarioEnd);\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Cb = (...args: any[]) => void;\n","export const Status = {\n FAILED: \"FAILED\",\n BROKEN: \"BROKEN\",\n PASSED: \"PASSED\",\n SKIPPED: \"SKIPPED\",\n} as const;\n\nexport type StatusType = keyof typeof Status;\n"],"mappings":"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","names":["object"]}
1
+ {"version":3,"sources":["../../src/event-options.ts","../../src/event-subscriber.ts","../../src/test-emitter.ts","../../src/test-event-emitter.ts","../../src/test-status.ts"],"sourcesContent":["import { object, string, literal, z } from \"zod\";\nconst uuidRegex =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gm;\nexport const UUIDStringSchema = string().regex(uuidRegex).optional();\n\nexport const StatusSchema = z.union([\n literal(\"FAILED\"),\n literal(\"BROKEN\"),\n literal(\"PASSED\"),\n literal(\"SKIPPED\")\n]);\nexport const EventOptionsSchema = object({\n title: string().optional(),\n keyword: string().optional(),\n tags: string().array().optional(),\n modifier: literal(\"skip\").or(literal(\"only\")).optional(),\n status: StatusSchema.optional()\n});\n\nexport const ErrorEventSchema = EventOptionsSchema.extend({\n error: z.instanceof(Error).optional()\n});\nexport const ArgsEventSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional()\n});\n\nexport const StartFeatureOptsSchema = EventOptionsSchema.extend({\n path: string().optional()\n});\n\nexport const EndFeatureOptsSchema = ErrorEventSchema;\n\nexport const EndRuleOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOutlineOptsSchema = EventOptionsSchema;\n// .extend({\n// uuid: UUIDStringSchema.optional()\n// });\n\nexport const EndScenarioOutlineOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOptsSchema = EventOptionsSchema;\n\nexport const EndScenarioOptsSchema = ErrorEventSchema;\n\nexport const StartStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n});\nexport const EndStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string(),\n}).and(ErrorEventSchema);\nexport const StartBeforeOptsSchema = ArgsEventSchema;\nexport const EndBeforeOptsSchema = ErrorEventSchema;\nexport const StartAfterOptsSchema = ArgsEventSchema;\nexport const EndAfterOptsSchema = ErrorEventSchema;\nexport const StartSetupOptsSchema = ArgsEventSchema;\nexport const EndSetupOptsSchema = ErrorEventSchema;\nexport const StartTeardownOptsSchema = ArgsEventSchema;\nexport const EndTeardownOptsSchema = ErrorEventSchema;\n\nexport type EventOptions = z.infer<typeof EventOptionsSchema>;\nexport type StartFeatureOpts = z.infer<typeof StartFeatureOptsSchema>;\nexport type EndFeatureOpts = z.infer<typeof EndFeatureOptsSchema>;\nexport type StartRuleOpts = EventOptions;\nexport type EndRuleOpts = z.infer<typeof EndRuleOptsSchema>;\nexport type StartScenarioOutlineOpts = z.infer<\n typeof StartScenarioOutlineOptsSchema\n>;\nexport type EndScenarioOutlineOpts = z.infer<\n typeof EndScenarioOutlineOptsSchema\n>;\nexport type StartScenarioOpts = z.infer<typeof StartScenarioOptsSchema>;\nexport type EndScenarioOpts = z.infer<typeof EndScenarioOptsSchema>;\nexport type StartStepOpts = z.infer<typeof StartStepOptsSchema>;\nexport type EndStepOpts = z.infer<typeof EndStepOptsSchema>;\nexport type StartBeforeOpts = z.infer<typeof StartBeforeOptsSchema>;\nexport type EndBeforeOpts = z.infer<typeof EndBeforeOptsSchema>;\nexport type StartAfterOpts = z.infer<typeof StartAfterOptsSchema>;\nexport type EndAfterOpts = z.infer<typeof EndAfterOptsSchema>;\nexport type StartSetupOpts = z.infer<typeof StartSetupOptsSchema>;\nexport type EndSetupOpts = z.infer<typeof EndSetupOptsSchema>;\nexport type StartTeardownOpts = z.infer<typeof StartTeardownOptsSchema>;\nexport type EndTeardownOpts = z.infer<typeof EndTeardownOptsSchema>;\n","import { Class } from \"@autometa/types\";\nimport { InjectionToken } from \"tsyringe\";\nimport {\n EndAfterOpts,\n EndBeforeOpts,\n EndFeatureOpts,\n EndRuleOpts,\n EndScenarioOpts,\n EndSetupOpts,\n EndStepOpts,\n EndTeardownOpts,\n StartAfterOpts,\n StartBeforeOpts,\n StartFeatureOpts,\n StartRuleOpts,\n StartScenarioOpts,\n StartScenarioOutlineOpts,\n StartSetupOpts,\n StartStepOpts,\n StartTeardownOpts,\n} from \"./event-options\";\nimport {object, function as fun} from 'zod'\nexport type DependencyInstanceProvider = {\n token: InjectionToken<unknown>;\n instance: unknown;\n};\n\nexport const EventSubscriberSchema = object({\n onFeature: fun()\n})\nexport interface EventSubscriber {\n onFeatureStart?(opts: StartFeatureOpts): void;\n onFeatureEnd?(opts: EndFeatureOpts): void;\n onRuleStart?(opts: StartRuleOpts): void;\n onRuleEnd?(opts: EndRuleOpts): void;\n onScenarioOutlineStart?(opts: StartScenarioOutlineOpts): void;\n onScenarioOutlineEnd?(opts: EndScenarioOpts): void;\n onPreScenarioStart?(): void;\n onPostScenarioEnd?(): void;\n onScenarioStart?(opts: StartScenarioOpts): void;\n onScenarioEnd?(opts: EndScenarioOpts): void;\n onStepStart?(opts: StartStepOpts): void;\n onStepEnd?(opts: EndStepOpts): void;\n onSetupStart?(opts: StartSetupOpts): void;\n onSetupEnd?(opts: EndSetupOpts): void;\n onTeardownStart?(opts: StartTeardownOpts): void;\n onTeardownEnd?(opts: EndTeardownOpts): void;\n onBeforeStart?(opts: StartBeforeOpts): void;\n onBeforeEnd?(opts: EndBeforeOpts): void;\n onAfterStart?(opts: StartAfterOpts): void;\n onAfterEnd?(opts: EndAfterOpts): void;\n}\n\nexport abstract class ProviderSubscriber implements EventSubscriber {\n abstract get fixtures(): {\n instances?: DependencyInstanceProvider[];\n prototypes?: Class<unknown>[];\n };\n\n addFixtureInstance = (instance: DependencyInstanceProvider) => {\n this.fixtures.instances?.push(instance);\n };\n\n onFeatureStart?(opts: StartFeatureOpts): void;\n}\n","import EventEmitter from \"events\";\nimport { Cb } from \"./test-event-emitter\";\nexport class TestEmitter<\n TArgsStart = never,\n TArgsEnd = never\n> extends EventEmitter {\n private promises: Promise<unknown>[] = [];\n\n constructor(readonly name: string) {\n super();\n }\n\n emitStart = (...args: TArgsStart[]) => {\n this.emit(`onStart${this.name}`, ...args);\n };\n\n onStart = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onStart${this.name}`, this.collectPromises(this.name, action));\n }\n };\n\n onEnd = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onEnd${this.name}`, this.collectPromises(this.name, action));\n }\n };\n\n emitEnd = (...args: TArgsEnd[]) => {\n this.emit(`onEnd${this.name}`, ...args);\n };\n\n load = (onStart?: Cb, onEnd?: Cb) => {\n this.onStart(onStart);\n this.onEnd(onEnd);\n };\n \n collectPromises = (name: string, action: (...args: unknown[]) => unknown) => {\n return (...args: unknown[]) => {\n try {\n const result = action(...args);\n if (result instanceof Promise) {\n this.promises.push(result);\n }\n } catch (e) {\n console.error(`Event Subscriber ${name} threw an error ${(e as Error).message}`);\n }\n };\n };\n\n waitForPromises = async () => {\n const settled = await Promise.allSettled(this.promises);\n return settled.filter((it) => it.status === \"rejected\").length;\n };\n}\n","import { EventSubscriber } from \"./event-subscriber\";\nimport { TestEmitter } from \"./test-emitter\";\nimport {\n StartScenarioOutlineOpts,\n EndScenarioOutlineOpts,\n StartFeatureOpts,\n EndFeatureOpts,\n StartRuleOpts,\n EndRuleOpts,\n StartScenarioOpts,\n EndScenarioOpts,\n StartSetupOpts,\n EndSetupOpts,\n StartTeardownOpts,\n EndTeardownOpts,\n StartBeforeOpts,\n EndBeforeOpts,\n StartAfterOpts,\n EndAfterOpts,\n StartStepOpts,\n EndStepOpts,\n} from \"./event-options\";\nexport class TestEventEmitter {\n scenarioOutline = new TestEmitter<StartScenarioOutlineOpts, EndScenarioOutlineOpts>(\n \"ScenarioOutline\"\n );\n feature = new TestEmitter<StartFeatureOpts, EndFeatureOpts>(\"Feature\");\n rule = new TestEmitter<StartRuleOpts, EndRuleOpts>(\"Rule\");\n scenario = new TestEmitter<StartScenarioOpts, EndScenarioOpts>(\"Scenario\");\n scenarioWrapper = new TestEmitter<never, never>(\"Scenario Wrapper\");\n setup = new TestEmitter<StartSetupOpts, EndSetupOpts>(\"Setup\");\n teardown = new TestEmitter<StartTeardownOpts, EndTeardownOpts>(\"Teardown\");\n before = new TestEmitter<StartBeforeOpts, EndBeforeOpts>(\"Before\");\n after = new TestEmitter<StartAfterOpts, EndAfterOpts>(\"After\");\n step = new TestEmitter<StartStepOpts, EndStepOpts>(\"Step\");\n \n settleAsyncEvents = async () => {\n return await Promise.allSettled([\n this.scenarioOutline.waitForPromises(),\n this.feature.waitForPromises(),\n this.rule.waitForPromises(),\n this.scenario.waitForPromises(),\n this.scenarioWrapper.waitForPromises(),\n this.setup.waitForPromises(),\n this.teardown.waitForPromises(),\n this.before.waitForPromises(),\n this.after.waitForPromises(),\n this.step.waitForPromises(),\n ]);\n };\n\n load = ({\n onFeatureStart,\n onFeatureEnd,\n onScenarioOutlineStart,\n onScenarioOutlineEnd,\n onScenarioStart,\n onScenarioEnd,\n onRuleStart,\n onRuleEnd,\n onBeforeStart,\n onBeforeEnd,\n onSetupStart,\n onSetupEnd,\n onStepStart,\n onStepEnd,\n onAfterStart,\n onAfterEnd,\n onTeardownStart,\n onTeardownEnd,\n onPreScenarioStart,\n onPostScenarioEnd,\n }: EventSubscriber) => {\n this.feature.load(onFeatureStart, onFeatureEnd);\n this.rule.load(onRuleStart, onRuleEnd);\n this.scenarioOutline.load(onScenarioOutlineStart, onScenarioOutlineEnd);\n this.scenario.load(onScenarioStart, onScenarioEnd);\n this.step.load(onStepStart, onStepEnd);\n this.before.load(onBeforeStart, onBeforeEnd);\n this.after.load(onAfterStart, onAfterEnd);\n this.setup.load(onSetupStart, onSetupEnd);\n this.teardown.load(onTeardownStart, onTeardownEnd);\n this.scenarioWrapper.load(onPreScenarioStart, onPostScenarioEnd);\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Cb = (...args: any[]) => void;\n","export const Status = {\n FAILED: \"FAILED\",\n BROKEN: \"BROKEN\",\n PASSED: \"PASSED\",\n SKIPPED: \"SKIPPED\",\n} as const;\n\nexport type StatusType = keyof typeof Status;\n"],"mappings":"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","names":["object"]}
package/dist/index.d.cts CHANGED
@@ -528,12 +528,15 @@ declare abstract class ProviderSubscriber implements EventSubscriber {
528
528
 
529
529
  declare class TestEmitter<TArgsStart = never, TArgsEnd = never> extends EventEmitter {
530
530
  readonly name: string;
531
+ private promises;
531
532
  constructor(name: string);
532
533
  emitStart: (...args: TArgsStart[]) => void;
533
534
  onStart: (action?: ((...args: unknown[]) => void) | undefined) => void;
534
535
  onEnd: (action?: ((...args: unknown[]) => void) | undefined) => void;
535
536
  emitEnd: (...args: TArgsEnd[]) => void;
536
537
  load: (onStart?: Cb, onEnd?: Cb) => void;
538
+ collectPromises: (name: string, action: (...args: unknown[]) => unknown) => (...args: unknown[]) => void;
539
+ waitForPromises: () => Promise<number>;
537
540
  }
538
541
 
539
542
  declare class TestEventEmitter {
@@ -679,6 +682,7 @@ declare class TestEventEmitter {
679
682
  modifier?: "skip" | "only" | undefined;
680
683
  error?: Error | undefined;
681
684
  }>;
685
+ settleAsyncEvents: () => Promise<[PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>]>;
682
686
  load: ({ onFeatureStart, onFeatureEnd, onScenarioOutlineStart, onScenarioOutlineEnd, onScenarioStart, onScenarioEnd, onRuleStart, onRuleEnd, onBeforeStart, onBeforeEnd, onSetupStart, onSetupEnd, onStepStart, onStepEnd, onAfterStart, onAfterEnd, onTeardownStart, onTeardownEnd, onPreScenarioStart, onPostScenarioEnd, }: EventSubscriber) => void;
683
687
  }
684
688
  type Cb = (...args: any[]) => void;
package/dist/index.d.ts CHANGED
@@ -528,12 +528,15 @@ declare abstract class ProviderSubscriber implements EventSubscriber {
528
528
 
529
529
  declare class TestEmitter<TArgsStart = never, TArgsEnd = never> extends EventEmitter {
530
530
  readonly name: string;
531
+ private promises;
531
532
  constructor(name: string);
532
533
  emitStart: (...args: TArgsStart[]) => void;
533
534
  onStart: (action?: ((...args: unknown[]) => void) | undefined) => void;
534
535
  onEnd: (action?: ((...args: unknown[]) => void) | undefined) => void;
535
536
  emitEnd: (...args: TArgsEnd[]) => void;
536
537
  load: (onStart?: Cb, onEnd?: Cb) => void;
538
+ collectPromises: (name: string, action: (...args: unknown[]) => unknown) => (...args: unknown[]) => void;
539
+ waitForPromises: () => Promise<number>;
537
540
  }
538
541
 
539
542
  declare class TestEventEmitter {
@@ -679,6 +682,7 @@ declare class TestEventEmitter {
679
682
  modifier?: "skip" | "only" | undefined;
680
683
  error?: Error | undefined;
681
684
  }>;
685
+ settleAsyncEvents: () => Promise<[PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>, PromiseSettledResult<number>]>;
682
686
  load: ({ onFeatureStart, onFeatureEnd, onScenarioOutlineStart, onScenarioOutlineEnd, onScenarioStart, onScenarioEnd, onRuleStart, onRuleEnd, onBeforeStart, onBeforeEnd, onSetupStart, onSetupEnd, onStepStart, onStepEnd, onAfterStart, onAfterEnd, onTeardownStart, onTeardownEnd, onPreScenarioStart, onPostScenarioEnd, }: EventSubscriber) => void;
683
687
  }
684
688
  type Cb = (...args: any[]) => void;
package/dist/index.js CHANGED
@@ -124,22 +124,22 @@ var ProviderSubscriber = class {
124
124
 
125
125
  // src/test-emitter.ts
126
126
  var import_events = __toESM(require("events"), 1);
127
- var import_errors = require("@autometa/errors");
128
127
  var TestEmitter = class extends import_events.default {
129
128
  constructor(name) {
130
129
  super();
131
130
  this.name = name;
131
+ this.promises = [];
132
132
  this.emitStart = (...args) => {
133
133
  this.emit(`onStart${this.name}`, ...args);
134
134
  };
135
135
  this.onStart = (action) => {
136
136
  if (action) {
137
- this.on(`onStart${this.name}`, tryWrapper(this.name, action));
137
+ this.on(`onStart${this.name}`, this.collectPromises(this.name, action));
138
138
  }
139
139
  };
140
140
  this.onEnd = (action) => {
141
141
  if (action) {
142
- this.on(`onEnd${this.name}`, tryWrapper(this.name, action));
142
+ this.on(`onEnd${this.name}`, this.collectPromises(this.name, action));
143
143
  }
144
144
  };
145
145
  this.emitEnd = (...args) => {
@@ -149,24 +149,24 @@ var TestEmitter = class extends import_events.default {
149
149
  this.onStart(onStart);
150
150
  this.onEnd(onEnd);
151
151
  };
152
+ this.collectPromises = (name, action) => {
153
+ return (...args) => {
154
+ try {
155
+ const result = action(...args);
156
+ if (result instanceof Promise) {
157
+ this.promises.push(result);
158
+ }
159
+ } catch (e) {
160
+ console.error(`Event Subscriber ${name} threw an error ${e.message}`);
161
+ }
162
+ };
163
+ };
164
+ this.waitForPromises = async () => {
165
+ const settled = await Promise.allSettled(this.promises);
166
+ return settled.filter((it) => it.status === "rejected").length;
167
+ };
152
168
  }
153
169
  };
154
- function tryWrapper(name, action) {
155
- return (...args) => {
156
- try {
157
- const result = action(...args);
158
- if (result instanceof Promise) {
159
- throw new import_errors.AutomationError(
160
- `A Subscriber action cannot be async or return a promise. Executing ${name}`
161
- );
162
- }
163
- } catch (e) {
164
- console.error(
165
- `Event Subscriber ${name} threw an error ${e.message}`
166
- );
167
- }
168
- };
169
- }
170
170
 
171
171
  // src/test-event-emitter.ts
172
172
  var TestEventEmitter = class {
@@ -183,6 +183,20 @@ var TestEventEmitter = class {
183
183
  this.before = new TestEmitter("Before");
184
184
  this.after = new TestEmitter("After");
185
185
  this.step = new TestEmitter("Step");
186
+ this.settleAsyncEvents = async () => {
187
+ return await Promise.allSettled([
188
+ this.scenarioOutline.waitForPromises(),
189
+ this.feature.waitForPromises(),
190
+ this.rule.waitForPromises(),
191
+ this.scenario.waitForPromises(),
192
+ this.scenarioWrapper.waitForPromises(),
193
+ this.setup.waitForPromises(),
194
+ this.teardown.waitForPromises(),
195
+ this.before.waitForPromises(),
196
+ this.after.waitForPromises(),
197
+ this.step.waitForPromises()
198
+ ]);
199
+ };
186
200
  this.load = ({
187
201
  onFeatureStart,
188
202
  onFeatureEnd,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/event-options.ts","../src/event-subscriber.ts","../src/test-emitter.ts","../src/test-event-emitter.ts","../src/test-status.ts"],"sourcesContent":["export * from './event-options'\nexport * from './event-subscriber'\nexport * from './test-event-emitter'\nexport * from './test-emitter'\nexport * from './test-status'","import { object, string, literal, z } from \"zod\";\nconst uuidRegex =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gm;\nexport const UUIDStringSchema = string().regex(uuidRegex).optional();\n\nexport const StatusSchema = z.union([\n literal(\"FAILED\"),\n literal(\"BROKEN\"),\n literal(\"PASSED\"),\n literal(\"SKIPPED\")\n]);\nexport const EventOptionsSchema = object({\n title: string().optional(),\n keyword: string().optional(),\n tags: string().array().optional(),\n modifier: literal(\"skip\").or(literal(\"only\")).optional(),\n status: StatusSchema.optional()\n});\n\nexport const ErrorEventSchema = EventOptionsSchema.extend({\n error: z.instanceof(Error).optional()\n});\nexport const ArgsEventSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional()\n});\n\nexport const StartFeatureOptsSchema = EventOptionsSchema.extend({\n path: string().optional()\n});\n\nexport const EndFeatureOptsSchema = ErrorEventSchema;\n\nexport const EndRuleOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOutlineOptsSchema = EventOptionsSchema;\n// .extend({\n// uuid: UUIDStringSchema.optional()\n// });\n\nexport const EndScenarioOutlineOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOptsSchema = EventOptionsSchema;\n\nexport const EndScenarioOptsSchema = ErrorEventSchema;\n\nexport const StartStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n});\nexport const EndStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string(),\n}).and(ErrorEventSchema);\nexport const StartBeforeOptsSchema = ArgsEventSchema;\nexport const EndBeforeOptsSchema = ErrorEventSchema;\nexport const StartAfterOptsSchema = ArgsEventSchema;\nexport const EndAfterOptsSchema = ErrorEventSchema;\nexport const StartSetupOptsSchema = ArgsEventSchema;\nexport const EndSetupOptsSchema = ErrorEventSchema;\nexport const StartTeardownOptsSchema = ArgsEventSchema;\nexport const EndTeardownOptsSchema = ErrorEventSchema;\n\nexport type EventOptions = z.infer<typeof EventOptionsSchema>;\nexport type StartFeatureOpts = z.infer<typeof StartFeatureOptsSchema>;\nexport type EndFeatureOpts = z.infer<typeof EndFeatureOptsSchema>;\nexport type StartRuleOpts = EventOptions;\nexport type EndRuleOpts = z.infer<typeof EndRuleOptsSchema>;\nexport type StartScenarioOutlineOpts = z.infer<\n typeof StartScenarioOutlineOptsSchema\n>;\nexport type EndScenarioOutlineOpts = z.infer<\n typeof EndScenarioOutlineOptsSchema\n>;\nexport type StartScenarioOpts = z.infer<typeof StartScenarioOptsSchema>;\nexport type EndScenarioOpts = z.infer<typeof EndScenarioOptsSchema>;\nexport type StartStepOpts = z.infer<typeof StartStepOptsSchema>;\nexport type EndStepOpts = z.infer<typeof EndStepOptsSchema>;\nexport type StartBeforeOpts = z.infer<typeof StartBeforeOptsSchema>;\nexport type EndBeforeOpts = z.infer<typeof EndBeforeOptsSchema>;\nexport type StartAfterOpts = z.infer<typeof StartAfterOptsSchema>;\nexport type EndAfterOpts = z.infer<typeof EndAfterOptsSchema>;\nexport type StartSetupOpts = z.infer<typeof StartSetupOptsSchema>;\nexport type EndSetupOpts = z.infer<typeof EndSetupOptsSchema>;\nexport type StartTeardownOpts = z.infer<typeof StartTeardownOptsSchema>;\nexport type EndTeardownOpts = z.infer<typeof EndTeardownOptsSchema>;\n","import { Class } from \"@autometa/types\";\nimport { InjectionToken } from \"tsyringe\";\nimport {\n EndAfterOpts,\n EndBeforeOpts,\n EndFeatureOpts,\n EndRuleOpts,\n EndScenarioOpts,\n EndSetupOpts,\n EndStepOpts,\n EndTeardownOpts,\n StartAfterOpts,\n StartBeforeOpts,\n StartFeatureOpts,\n StartRuleOpts,\n StartScenarioOpts,\n StartScenarioOutlineOpts,\n StartSetupOpts,\n StartStepOpts,\n StartTeardownOpts,\n} from \"./event-options\";\nimport {object, function as fun} from 'zod'\nexport type DependencyInstanceProvider = {\n token: InjectionToken<unknown>;\n instance: unknown;\n};\n\nexport const EventSubscriberSchema = object({\n onFeature: fun()\n})\nexport interface EventSubscriber {\n onFeatureStart?(opts: StartFeatureOpts): void;\n onFeatureEnd?(opts: EndFeatureOpts): void;\n onRuleStart?(opts: StartRuleOpts): void;\n onRuleEnd?(opts: EndRuleOpts): void;\n onScenarioOutlineStart?(opts: StartScenarioOutlineOpts): void;\n onScenarioOutlineEnd?(opts: EndScenarioOpts): void;\n onPreScenarioStart?(): void;\n onPostScenarioEnd?(): void;\n onScenarioStart?(opts: StartScenarioOpts): void;\n onScenarioEnd?(opts: EndScenarioOpts): void;\n onStepStart?(opts: StartStepOpts): void;\n onStepEnd?(opts: EndStepOpts): void;\n onSetupStart?(opts: StartSetupOpts): void;\n onSetupEnd?(opts: EndSetupOpts): void;\n onTeardownStart?(opts: StartTeardownOpts): void;\n onTeardownEnd?(opts: EndTeardownOpts): void;\n onBeforeStart?(opts: StartBeforeOpts): void;\n onBeforeEnd?(opts: EndBeforeOpts): void;\n onAfterStart?(opts: StartAfterOpts): void;\n onAfterEnd?(opts: EndAfterOpts): void;\n}\n\nexport abstract class ProviderSubscriber implements EventSubscriber {\n abstract get fixtures(): {\n instances?: DependencyInstanceProvider[];\n prototypes?: Class<unknown>[];\n };\n\n addFixtureInstance = (instance: DependencyInstanceProvider) => {\n this.fixtures.instances?.push(instance);\n };\n\n onFeatureStart?(opts: StartFeatureOpts): void;\n}\n","import EventEmitter from \"events\";\nimport { Cb } from \"./test-event-emitter\";\nimport { AutomationError } from \"@autometa/errors\";\nexport class TestEmitter<\n TArgsStart = never,\n TArgsEnd = never\n> extends EventEmitter {\n constructor(readonly name: string) {\n super();\n }\n\n emitStart = (...args: TArgsStart[]) => {\n this.emit(`onStart${this.name}`, ...args);\n };\n\n onStart = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onStart${this.name}`, tryWrapper(this.name, action));\n }\n };\n\n onEnd = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onEnd${this.name}`, tryWrapper(this.name, action));\n }\n };\n\n emitEnd = (...args: TArgsEnd[]) => {\n this.emit(`onEnd${this.name}`, ...args);\n };\n\n load = (onStart?: Cb, onEnd?: Cb) => {\n this.onStart(onStart);\n this.onEnd(onEnd);\n };\n}\n\nfunction tryWrapper(name: string, action: (...args: unknown[]) => void) {\n return (...args: unknown[]) => {\n try {\n const result = action(...args);\n if ((result as unknown) instanceof Promise) {\n throw new AutomationError(\n `A Subscriber action cannot be async or return a promise. Executing ${name}`\n );\n }\n } catch (e) {\n console.error(\n `Event Subscriber ${name} threw an error ${(e as Error).message}`\n );\n }\n };\n}\n","import { EventSubscriber } from \"./event-subscriber\";\nimport { TestEmitter } from \"./test-emitter\";\nimport {\n StartScenarioOutlineOpts,\n EndScenarioOutlineOpts,\n StartFeatureOpts,\n EndFeatureOpts,\n StartRuleOpts,\n EndRuleOpts,\n StartScenarioOpts,\n EndScenarioOpts,\n StartSetupOpts,\n EndSetupOpts,\n StartTeardownOpts,\n EndTeardownOpts,\n StartBeforeOpts,\n EndBeforeOpts,\n StartAfterOpts,\n EndAfterOpts,\n StartStepOpts,\n EndStepOpts,\n} from \"./event-options\";\nexport class TestEventEmitter {\n scenarioOutline = new TestEmitter<StartScenarioOutlineOpts, EndScenarioOutlineOpts>(\n \"ScenarioOutline\"\n );\n feature = new TestEmitter<StartFeatureOpts, EndFeatureOpts>(\"Feature\");\n rule = new TestEmitter<StartRuleOpts, EndRuleOpts>(\"Rule\");\n scenario = new TestEmitter<StartScenarioOpts, EndScenarioOpts>(\"Scenario\");\n scenarioWrapper = new TestEmitter<never, never>(\"Scenario Wrapper\");\n setup = new TestEmitter<StartSetupOpts, EndSetupOpts>(\"Setup\");\n teardown = new TestEmitter<StartTeardownOpts, EndTeardownOpts>(\"Teardown\");\n before = new TestEmitter<StartBeforeOpts, EndBeforeOpts>(\"Before\");\n after = new TestEmitter<StartAfterOpts, EndAfterOpts>(\"After\");\n step = new TestEmitter<StartStepOpts, EndStepOpts>(\"Step\");\n\n load = ({\n onFeatureStart,\n onFeatureEnd,\n onScenarioOutlineStart,\n onScenarioOutlineEnd,\n onScenarioStart,\n onScenarioEnd,\n onRuleStart,\n onRuleEnd,\n onBeforeStart,\n onBeforeEnd,\n onSetupStart,\n onSetupEnd,\n onStepStart,\n onStepEnd,\n onAfterStart,\n onAfterEnd,\n onTeardownStart,\n onTeardownEnd,\n onPreScenarioStart,\n onPostScenarioEnd,\n }: EventSubscriber) => {\n this.feature.load(onFeatureStart, onFeatureEnd);\n this.rule.load(onRuleStart, onRuleEnd);\n this.scenarioOutline.load(onScenarioOutlineStart, onScenarioOutlineEnd);\n this.scenario.load(onScenarioStart, onScenarioEnd);\n this.step.load(onStepStart, onStepEnd);\n this.before.load(onBeforeStart, onBeforeEnd);\n this.after.load(onAfterStart, onAfterEnd);\n this.setup.load(onSetupStart, onSetupEnd);\n this.teardown.load(onTeardownStart, onTeardownEnd);\n this.scenarioWrapper.load(onPreScenarioStart, onPostScenarioEnd);\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Cb = (...args: any[]) => void;\n","export const Status = {\n FAILED: \"FAILED\",\n BROKEN: \"BROKEN\",\n PASSED: \"PASSED\",\n SKIPPED: \"SKIPPED\",\n} as const;\n\nexport type StatusType = keyof typeof Status;\n"],"mappings":"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","names":["import_zod","fun","EventEmitter"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/event-options.ts","../src/event-subscriber.ts","../src/test-emitter.ts","../src/test-event-emitter.ts","../src/test-status.ts"],"sourcesContent":["export * from './event-options'\nexport * from './event-subscriber'\nexport * from './test-event-emitter'\nexport * from './test-emitter'\nexport * from './test-status'","import { object, string, literal, z } from \"zod\";\nconst uuidRegex =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gm;\nexport const UUIDStringSchema = string().regex(uuidRegex).optional();\n\nexport const StatusSchema = z.union([\n literal(\"FAILED\"),\n literal(\"BROKEN\"),\n literal(\"PASSED\"),\n literal(\"SKIPPED\")\n]);\nexport const EventOptionsSchema = object({\n title: string().optional(),\n keyword: string().optional(),\n tags: string().array().optional(),\n modifier: literal(\"skip\").or(literal(\"only\")).optional(),\n status: StatusSchema.optional()\n});\n\nexport const ErrorEventSchema = EventOptionsSchema.extend({\n error: z.instanceof(Error).optional()\n});\nexport const ArgsEventSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional()\n});\n\nexport const StartFeatureOptsSchema = EventOptionsSchema.extend({\n path: string().optional()\n});\n\nexport const EndFeatureOptsSchema = ErrorEventSchema;\n\nexport const EndRuleOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOutlineOptsSchema = EventOptionsSchema;\n// .extend({\n// uuid: UUIDStringSchema.optional()\n// });\n\nexport const EndScenarioOutlineOptsSchema = ErrorEventSchema;\n\nexport const StartScenarioOptsSchema = EventOptionsSchema;\n\nexport const EndScenarioOptsSchema = ErrorEventSchema;\n\nexport const StartStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n});\nexport const EndStepOptsSchema = EventOptionsSchema.extend({\n args: z.array(z.unknown()).optional(),\n expression: z.string(),\n}).and(ErrorEventSchema);\nexport const StartBeforeOptsSchema = ArgsEventSchema;\nexport const EndBeforeOptsSchema = ErrorEventSchema;\nexport const StartAfterOptsSchema = ArgsEventSchema;\nexport const EndAfterOptsSchema = ErrorEventSchema;\nexport const StartSetupOptsSchema = ArgsEventSchema;\nexport const EndSetupOptsSchema = ErrorEventSchema;\nexport const StartTeardownOptsSchema = ArgsEventSchema;\nexport const EndTeardownOptsSchema = ErrorEventSchema;\n\nexport type EventOptions = z.infer<typeof EventOptionsSchema>;\nexport type StartFeatureOpts = z.infer<typeof StartFeatureOptsSchema>;\nexport type EndFeatureOpts = z.infer<typeof EndFeatureOptsSchema>;\nexport type StartRuleOpts = EventOptions;\nexport type EndRuleOpts = z.infer<typeof EndRuleOptsSchema>;\nexport type StartScenarioOutlineOpts = z.infer<\n typeof StartScenarioOutlineOptsSchema\n>;\nexport type EndScenarioOutlineOpts = z.infer<\n typeof EndScenarioOutlineOptsSchema\n>;\nexport type StartScenarioOpts = z.infer<typeof StartScenarioOptsSchema>;\nexport type EndScenarioOpts = z.infer<typeof EndScenarioOptsSchema>;\nexport type StartStepOpts = z.infer<typeof StartStepOptsSchema>;\nexport type EndStepOpts = z.infer<typeof EndStepOptsSchema>;\nexport type StartBeforeOpts = z.infer<typeof StartBeforeOptsSchema>;\nexport type EndBeforeOpts = z.infer<typeof EndBeforeOptsSchema>;\nexport type StartAfterOpts = z.infer<typeof StartAfterOptsSchema>;\nexport type EndAfterOpts = z.infer<typeof EndAfterOptsSchema>;\nexport type StartSetupOpts = z.infer<typeof StartSetupOptsSchema>;\nexport type EndSetupOpts = z.infer<typeof EndSetupOptsSchema>;\nexport type StartTeardownOpts = z.infer<typeof StartTeardownOptsSchema>;\nexport type EndTeardownOpts = z.infer<typeof EndTeardownOptsSchema>;\n","import { Class } from \"@autometa/types\";\nimport { InjectionToken } from \"tsyringe\";\nimport {\n EndAfterOpts,\n EndBeforeOpts,\n EndFeatureOpts,\n EndRuleOpts,\n EndScenarioOpts,\n EndSetupOpts,\n EndStepOpts,\n EndTeardownOpts,\n StartAfterOpts,\n StartBeforeOpts,\n StartFeatureOpts,\n StartRuleOpts,\n StartScenarioOpts,\n StartScenarioOutlineOpts,\n StartSetupOpts,\n StartStepOpts,\n StartTeardownOpts,\n} from \"./event-options\";\nimport {object, function as fun} from 'zod'\nexport type DependencyInstanceProvider = {\n token: InjectionToken<unknown>;\n instance: unknown;\n};\n\nexport const EventSubscriberSchema = object({\n onFeature: fun()\n})\nexport interface EventSubscriber {\n onFeatureStart?(opts: StartFeatureOpts): void;\n onFeatureEnd?(opts: EndFeatureOpts): void;\n onRuleStart?(opts: StartRuleOpts): void;\n onRuleEnd?(opts: EndRuleOpts): void;\n onScenarioOutlineStart?(opts: StartScenarioOutlineOpts): void;\n onScenarioOutlineEnd?(opts: EndScenarioOpts): void;\n onPreScenarioStart?(): void;\n onPostScenarioEnd?(): void;\n onScenarioStart?(opts: StartScenarioOpts): void;\n onScenarioEnd?(opts: EndScenarioOpts): void;\n onStepStart?(opts: StartStepOpts): void;\n onStepEnd?(opts: EndStepOpts): void;\n onSetupStart?(opts: StartSetupOpts): void;\n onSetupEnd?(opts: EndSetupOpts): void;\n onTeardownStart?(opts: StartTeardownOpts): void;\n onTeardownEnd?(opts: EndTeardownOpts): void;\n onBeforeStart?(opts: StartBeforeOpts): void;\n onBeforeEnd?(opts: EndBeforeOpts): void;\n onAfterStart?(opts: StartAfterOpts): void;\n onAfterEnd?(opts: EndAfterOpts): void;\n}\n\nexport abstract class ProviderSubscriber implements EventSubscriber {\n abstract get fixtures(): {\n instances?: DependencyInstanceProvider[];\n prototypes?: Class<unknown>[];\n };\n\n addFixtureInstance = (instance: DependencyInstanceProvider) => {\n this.fixtures.instances?.push(instance);\n };\n\n onFeatureStart?(opts: StartFeatureOpts): void;\n}\n","import EventEmitter from \"events\";\nimport { Cb } from \"./test-event-emitter\";\nexport class TestEmitter<\n TArgsStart = never,\n TArgsEnd = never\n> extends EventEmitter {\n private promises: Promise<unknown>[] = [];\n\n constructor(readonly name: string) {\n super();\n }\n\n emitStart = (...args: TArgsStart[]) => {\n this.emit(`onStart${this.name}`, ...args);\n };\n\n onStart = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onStart${this.name}`, this.collectPromises(this.name, action));\n }\n };\n\n onEnd = (action?: (...args: unknown[]) => void) => {\n if (action) {\n this.on(`onEnd${this.name}`, this.collectPromises(this.name, action));\n }\n };\n\n emitEnd = (...args: TArgsEnd[]) => {\n this.emit(`onEnd${this.name}`, ...args);\n };\n\n load = (onStart?: Cb, onEnd?: Cb) => {\n this.onStart(onStart);\n this.onEnd(onEnd);\n };\n \n collectPromises = (name: string, action: (...args: unknown[]) => unknown) => {\n return (...args: unknown[]) => {\n try {\n const result = action(...args);\n if (result instanceof Promise) {\n this.promises.push(result);\n }\n } catch (e) {\n console.error(`Event Subscriber ${name} threw an error ${(e as Error).message}`);\n }\n };\n };\n\n waitForPromises = async () => {\n const settled = await Promise.allSettled(this.promises);\n return settled.filter((it) => it.status === \"rejected\").length;\n };\n}\n","import { EventSubscriber } from \"./event-subscriber\";\nimport { TestEmitter } from \"./test-emitter\";\nimport {\n StartScenarioOutlineOpts,\n EndScenarioOutlineOpts,\n StartFeatureOpts,\n EndFeatureOpts,\n StartRuleOpts,\n EndRuleOpts,\n StartScenarioOpts,\n EndScenarioOpts,\n StartSetupOpts,\n EndSetupOpts,\n StartTeardownOpts,\n EndTeardownOpts,\n StartBeforeOpts,\n EndBeforeOpts,\n StartAfterOpts,\n EndAfterOpts,\n StartStepOpts,\n EndStepOpts,\n} from \"./event-options\";\nexport class TestEventEmitter {\n scenarioOutline = new TestEmitter<StartScenarioOutlineOpts, EndScenarioOutlineOpts>(\n \"ScenarioOutline\"\n );\n feature = new TestEmitter<StartFeatureOpts, EndFeatureOpts>(\"Feature\");\n rule = new TestEmitter<StartRuleOpts, EndRuleOpts>(\"Rule\");\n scenario = new TestEmitter<StartScenarioOpts, EndScenarioOpts>(\"Scenario\");\n scenarioWrapper = new TestEmitter<never, never>(\"Scenario Wrapper\");\n setup = new TestEmitter<StartSetupOpts, EndSetupOpts>(\"Setup\");\n teardown = new TestEmitter<StartTeardownOpts, EndTeardownOpts>(\"Teardown\");\n before = new TestEmitter<StartBeforeOpts, EndBeforeOpts>(\"Before\");\n after = new TestEmitter<StartAfterOpts, EndAfterOpts>(\"After\");\n step = new TestEmitter<StartStepOpts, EndStepOpts>(\"Step\");\n \n settleAsyncEvents = async () => {\n return await Promise.allSettled([\n this.scenarioOutline.waitForPromises(),\n this.feature.waitForPromises(),\n this.rule.waitForPromises(),\n this.scenario.waitForPromises(),\n this.scenarioWrapper.waitForPromises(),\n this.setup.waitForPromises(),\n this.teardown.waitForPromises(),\n this.before.waitForPromises(),\n this.after.waitForPromises(),\n this.step.waitForPromises(),\n ]);\n };\n\n load = ({\n onFeatureStart,\n onFeatureEnd,\n onScenarioOutlineStart,\n onScenarioOutlineEnd,\n onScenarioStart,\n onScenarioEnd,\n onRuleStart,\n onRuleEnd,\n onBeforeStart,\n onBeforeEnd,\n onSetupStart,\n onSetupEnd,\n onStepStart,\n onStepEnd,\n onAfterStart,\n onAfterEnd,\n onTeardownStart,\n onTeardownEnd,\n onPreScenarioStart,\n onPostScenarioEnd,\n }: EventSubscriber) => {\n this.feature.load(onFeatureStart, onFeatureEnd);\n this.rule.load(onRuleStart, onRuleEnd);\n this.scenarioOutline.load(onScenarioOutlineStart, onScenarioOutlineEnd);\n this.scenario.load(onScenarioStart, onScenarioEnd);\n this.step.load(onStepStart, onStepEnd);\n this.before.load(onBeforeStart, onBeforeEnd);\n this.after.load(onAfterStart, onAfterEnd);\n this.setup.load(onSetupStart, onSetupEnd);\n this.teardown.load(onTeardownStart, onTeardownEnd);\n this.scenarioWrapper.load(onPreScenarioStart, onPostScenarioEnd);\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Cb = (...args: any[]) => void;\n","export const Status = {\n FAILED: \"FAILED\",\n BROKEN: \"BROKEN\",\n PASSED: \"PASSED\",\n SKIPPED: \"SKIPPED\",\n} as const;\n\nexport type StatusType = keyof typeof Status;\n"],"mappings":"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","names":["import_zod","fun","EventEmitter"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autometa/events",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -39,8 +39,8 @@
39
39
  "webpack": "^5.77.0",
40
40
  "webpack-cli": "^5.0.1",
41
41
  "webpack-node-externals": "^3.0.0",
42
- "tsconfig": "0.7.0",
43
- "eslint-config-custom": "0.6.0"
42
+ "eslint-config-custom": "0.6.0",
43
+ "tsconfig": "0.7.0"
44
44
  },
45
45
  "dependencies": {
46
46
  "@cucumber/messages": "^21.0.1",
@@ -48,9 +48,9 @@
48
48
  "tsyringe": "^4.7.0",
49
49
  "uuid": "^9.0.0",
50
50
  "zod": "^3.21.4",
51
- "@autometa/types": "0.4.1",
52
51
  "@autometa/errors": "^0.1.3",
53
- "@autometa/gherkin": "0.4.5"
52
+ "@autometa/gherkin": "0.4.5",
53
+ "@autometa/types": "0.4.1"
54
54
  },
55
55
  "scripts": {
56
56
  "test": "vitest run --passWithNoTests",