@serenity-js/playwright-test 3.41.2 → 3.42.1

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.
Files changed (146) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/esm/api/PerformActivitiesAsPlaywrightSteps.d.ts +14 -0
  3. package/esm/api/PerformActivitiesAsPlaywrightSteps.d.ts.map +1 -0
  4. package/esm/api/PerformActivitiesAsPlaywrightSteps.js +40 -0
  5. package/esm/api/PerformActivitiesAsPlaywrightSteps.js.map +1 -0
  6. package/esm/api/PlaywrightTestConfig.d.ts +42 -0
  7. package/esm/api/PlaywrightTestConfig.d.ts.map +1 -0
  8. package/esm/api/PlaywrightTestConfig.js +2 -0
  9. package/esm/api/PlaywrightTestConfig.js.map +1 -0
  10. package/esm/api/WorkerEventStreamReader.d.ts +13 -0
  11. package/esm/api/WorkerEventStreamReader.d.ts.map +1 -0
  12. package/esm/api/WorkerEventStreamReader.js +18 -0
  13. package/esm/api/WorkerEventStreamReader.js.map +1 -0
  14. package/esm/api/WorkerEventStreamWriter.d.ts +24 -0
  15. package/esm/api/WorkerEventStreamWriter.d.ts.map +1 -0
  16. package/esm/api/WorkerEventStreamWriter.js +79 -0
  17. package/esm/api/WorkerEventStreamWriter.js.map +1 -0
  18. package/esm/api/index.d.ts +4 -0
  19. package/esm/api/index.d.ts.map +1 -0
  20. package/esm/api/index.js +4 -0
  21. package/esm/api/index.js.map +1 -0
  22. package/esm/api/serenity-fixtures.d.ts +452 -0
  23. package/esm/api/serenity-fixtures.d.ts.map +1 -0
  24. package/esm/api/serenity-fixtures.js +2 -0
  25. package/esm/api/serenity-fixtures.js.map +1 -0
  26. package/esm/api/test-api.d.ts +387 -0
  27. package/esm/api/test-api.d.ts.map +1 -0
  28. package/esm/api/test-api.js +521 -0
  29. package/esm/api/test-api.js.map +1 -0
  30. package/esm/events/EventFactory.d.ts +16 -0
  31. package/esm/events/EventFactory.d.ts.map +1 -0
  32. package/esm/events/EventFactory.js +90 -0
  33. package/esm/events/EventFactory.js.map +1 -0
  34. package/esm/events/PlaywrightSceneId.d.ts +7 -0
  35. package/esm/events/PlaywrightSceneId.d.ts.map +1 -0
  36. package/esm/events/PlaywrightSceneId.js +15 -0
  37. package/esm/events/PlaywrightSceneId.js.map +1 -0
  38. package/esm/events/index.d.ts +3 -0
  39. package/esm/events/index.d.ts.map +1 -0
  40. package/esm/events/index.js +3 -0
  41. package/esm/events/index.js.map +1 -0
  42. package/esm/index.d.ts +3 -0
  43. package/esm/index.d.ts.map +1 -0
  44. package/esm/index.js +3 -0
  45. package/esm/index.js.map +1 -0
  46. package/esm/reporter/PlaywrightErrorParser.d.ts +7 -0
  47. package/esm/reporter/PlaywrightErrorParser.d.ts.map +1 -0
  48. package/esm/reporter/PlaywrightErrorParser.js +23 -0
  49. package/esm/reporter/PlaywrightErrorParser.js.map +1 -0
  50. package/esm/reporter/PlaywrightEventBuffer.d.ts +25 -0
  51. package/esm/reporter/PlaywrightEventBuffer.d.ts.map +1 -0
  52. package/esm/reporter/PlaywrightEventBuffer.js +143 -0
  53. package/esm/reporter/PlaywrightEventBuffer.js.map +1 -0
  54. package/esm/reporter/PlaywrightStepReporter.d.ts +14 -0
  55. package/esm/reporter/PlaywrightStepReporter.d.ts.map +1 -0
  56. package/esm/reporter/PlaywrightStepReporter.js +38 -0
  57. package/esm/reporter/PlaywrightStepReporter.js.map +1 -0
  58. package/esm/reporter/PlaywrightTestSceneIdFactory.d.ts +8 -0
  59. package/esm/reporter/PlaywrightTestSceneIdFactory.d.ts.map +1 -0
  60. package/esm/reporter/PlaywrightTestSceneIdFactory.js +11 -0
  61. package/esm/reporter/PlaywrightTestSceneIdFactory.js.map +1 -0
  62. package/esm/reporter/SerenityReporterForPlaywrightTest.d.ts +58 -0
  63. package/esm/reporter/SerenityReporterForPlaywrightTest.d.ts.map +1 -0
  64. package/esm/reporter/SerenityReporterForPlaywrightTest.js +112 -0
  65. package/esm/reporter/SerenityReporterForPlaywrightTest.js.map +1 -0
  66. package/esm/reporter/index.d.ts +3 -0
  67. package/esm/reporter/index.d.ts.map +1 -0
  68. package/esm/reporter/index.js +3 -0
  69. package/esm/reporter/index.js.map +1 -0
  70. package/lib/api/PerformActivitiesAsPlaywrightSteps.d.ts +1 -1
  71. package/lib/api/PerformActivitiesAsPlaywrightSteps.d.ts.map +1 -1
  72. package/lib/api/PerformActivitiesAsPlaywrightSteps.js +2 -2
  73. package/lib/api/PerformActivitiesAsPlaywrightSteps.js.map +1 -1
  74. package/lib/api/PlaywrightTestConfig.d.ts +1 -1
  75. package/lib/api/PlaywrightTestConfig.d.ts.map +1 -1
  76. package/lib/api/WorkerEventStreamReader.d.ts +1 -1
  77. package/lib/api/WorkerEventStreamReader.d.ts.map +1 -1
  78. package/lib/api/WorkerEventStreamReader.js +1 -1
  79. package/lib/api/WorkerEventStreamReader.js.map +1 -1
  80. package/lib/api/WorkerEventStreamWriter.d.ts +2 -2
  81. package/lib/api/WorkerEventStreamWriter.d.ts.map +1 -1
  82. package/lib/api/WorkerEventStreamWriter.js +1 -1
  83. package/lib/api/WorkerEventStreamWriter.js.map +1 -1
  84. package/lib/api/index.d.ts +3 -3
  85. package/lib/api/index.d.ts.map +1 -1
  86. package/lib/api/index.js +3 -3
  87. package/lib/api/index.js.map +1 -1
  88. package/lib/api/test-api.d.ts +3 -3
  89. package/lib/api/test-api.d.ts.map +1 -1
  90. package/lib/api/test-api.js +12 -12
  91. package/lib/api/test-api.js.map +1 -1
  92. package/lib/events/EventFactory.d.ts +3 -3
  93. package/lib/events/EventFactory.d.ts.map +1 -1
  94. package/lib/events/EventFactory.js +6 -6
  95. package/lib/events/EventFactory.js.map +1 -1
  96. package/lib/events/PlaywrightSceneId.d.ts +1 -1
  97. package/lib/events/PlaywrightSceneId.d.ts.map +1 -1
  98. package/lib/events/PlaywrightSceneId.js +1 -1
  99. package/lib/events/PlaywrightSceneId.js.map +1 -1
  100. package/lib/events/index.d.ts +2 -2
  101. package/lib/events/index.d.ts.map +1 -1
  102. package/lib/events/index.js +2 -2
  103. package/lib/events/index.js.map +1 -1
  104. package/lib/index.d.ts +2 -2
  105. package/lib/index.d.ts.map +1 -1
  106. package/lib/index.js +3 -3
  107. package/lib/index.js.map +1 -1
  108. package/lib/package.json +1 -0
  109. package/lib/reporter/PlaywrightEventBuffer.d.ts +1 -1
  110. package/lib/reporter/PlaywrightEventBuffer.d.ts.map +1 -1
  111. package/lib/reporter/PlaywrightEventBuffer.js +12 -12
  112. package/lib/reporter/PlaywrightEventBuffer.js.map +1 -1
  113. package/lib/reporter/PlaywrightStepReporter.d.ts +1 -1
  114. package/lib/reporter/PlaywrightStepReporter.d.ts.map +1 -1
  115. package/lib/reporter/PlaywrightStepReporter.js +2 -2
  116. package/lib/reporter/PlaywrightStepReporter.js.map +1 -1
  117. package/lib/reporter/PlaywrightTestSceneIdFactory.d.ts +2 -2
  118. package/lib/reporter/PlaywrightTestSceneIdFactory.d.ts.map +1 -1
  119. package/lib/reporter/PlaywrightTestSceneIdFactory.js +1 -1
  120. package/lib/reporter/PlaywrightTestSceneIdFactory.js.map +1 -1
  121. package/lib/reporter/SerenityReporterForPlaywrightTest.d.ts +1 -1
  122. package/lib/reporter/SerenityReporterForPlaywrightTest.d.ts.map +1 -1
  123. package/lib/reporter/SerenityReporterForPlaywrightTest.js +8 -8
  124. package/lib/reporter/SerenityReporterForPlaywrightTest.js.map +1 -1
  125. package/lib/reporter/index.d.ts +2 -2
  126. package/lib/reporter/index.d.ts.map +1 -1
  127. package/lib/reporter/index.js +2 -2
  128. package/lib/reporter/index.js.map +1 -1
  129. package/package.json +60 -12
  130. package/src/api/PerformActivitiesAsPlaywrightSteps.ts +2 -2
  131. package/src/api/PlaywrightTestConfig.ts +1 -1
  132. package/src/api/WorkerEventStreamReader.ts +2 -2
  133. package/src/api/WorkerEventStreamWriter.ts +2 -2
  134. package/src/api/index.ts +3 -3
  135. package/src/api/test-api.ts +8 -8
  136. package/src/events/EventFactory.ts +5 -5
  137. package/src/events/PlaywrightSceneId.ts +1 -1
  138. package/src/events/index.ts +2 -2
  139. package/src/index.ts +2 -2
  140. package/src/reporter/PlaywrightEventBuffer.ts +8 -8
  141. package/src/reporter/PlaywrightStepReporter.ts +4 -4
  142. package/src/reporter/PlaywrightTestSceneIdFactory.ts +2 -2
  143. package/src/reporter/SerenityReporterForPlaywrightTest.ts +6 -6
  144. package/src/reporter/index.ts +2 -2
  145. package/tsconfig-cjs.build.json +18 -0
  146. package/tsconfig-esm.build.json +18 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,29 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [3.42.1](https://github.com/serenity-js/serenity-js/compare/v3.42.0...v3.42.1) (2026-04-08)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **deps:** update playwright dependencies to v1.59.1 ([a65e205](https://github.com/serenity-js/serenity-js/commit/a65e20562618728ad82fff883eab567c9861deec))
12
+ * **deps:** update rest dependencies ([277382c](https://github.com/serenity-js/serenity-js/commit/277382c6cf88330586519b6a88b7e78015309a53))
13
+
14
+
15
+
16
+
17
+
18
+ # [3.42.0](https://github.com/serenity-js/serenity-js/compare/v3.41.2...v3.42.0) (2026-03-19)
19
+
20
+
21
+ ### Features
22
+
23
+ * **core:** add ESM/CJS dual build support for web packages ([94c5a64](https://github.com/serenity-js/serenity-js/commit/94c5a6423dc369477bbabbacee5a54f8fca20209))
24
+
25
+
26
+
27
+
28
+
6
29
  ## [3.41.2](https://github.com/serenity-js/serenity-js/compare/v3.41.1...v3.41.2) (2026-03-05)
7
30
 
8
31
 
@@ -0,0 +1,14 @@
1
+ import type { test as base } from '@playwright/test';
2
+ import type { Activity, AnswersQuestions, PerformsActivities, UsesAbilities } from '@serenity-js/core';
3
+ import { PerformActivities } from '@serenity-js/core';
4
+ import type { EmitsDomainEvents } from '@serenity-js/core/events';
5
+ export declare class PerformActivitiesAsPlaywrightSteps extends PerformActivities {
6
+ private readonly test;
7
+ constructor(actor: AnswersQuestions & UsesAbilities & PerformsActivities & {
8
+ name: string;
9
+ }, stage: EmitsDomainEvents, test: typeof base);
10
+ perform(activity: Activity): Promise<void>;
11
+ private parametersOf;
12
+ private locationOf;
13
+ }
14
+ //# sourceMappingURL=PerformActivitiesAsPlaywrightSteps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerformActivitiesAsPlaywrightSteps.d.ts","sourceRoot":"","sources":["../../src/api/PerformActivitiesAsPlaywrightSteps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,EAAY,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EACR,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAkB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,qBAAa,kCAAmC,SAAQ,iBAAiB;IAKjE,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFrB,KAAK,EAAE,gBAAgB,GAAG,aAAa,GAAG,kBAAkB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC/E,KAAK,EAAE,iBAAiB,EACP,IAAI,EAAE,OAAO,IAAI;IAKvB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBzD,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,UAAU;CAQrB"}
@@ -0,0 +1,40 @@
1
+ import { d, Interaction, PerformActivities } from '@serenity-js/core';
2
+ import { significantFieldsOf } from 'tiny-types/lib/objects/significantFields.js';
3
+ export class PerformActivitiesAsPlaywrightSteps extends PerformActivities {
4
+ test;
5
+ constructor(actor, stage, test) {
6
+ super(actor, stage);
7
+ this.test = test;
8
+ }
9
+ async perform(activity) {
10
+ const testInfo = this.test.info();
11
+ // Monkey-patch addStep to allow for passing a pre-computed location
12
+ // see https://github.com/microsoft/playwright/issues/30160
13
+ const originalAddStep = testInfo._addStep;
14
+ testInfo._addStep = (data) => {
15
+ data.location = this.locationOf(activity);
16
+ data.params = this.parametersOf(activity);
17
+ return originalAddStep.call(testInfo, data);
18
+ };
19
+ await this.test.step(await activity.describedBy(this.actor), () => super.perform(activity));
20
+ testInfo._addStep = originalAddStep;
21
+ }
22
+ parametersOf(activity) {
23
+ if (activity instanceof Interaction) {
24
+ return significantFieldsOf(activity).reduce((acc, field) => {
25
+ acc[field] = d `${activity[field]}`;
26
+ return acc;
27
+ }, {});
28
+ }
29
+ return {};
30
+ }
31
+ locationOf(activity) {
32
+ const instantiationLocation = activity.instantiationLocation();
33
+ return {
34
+ file: instantiationLocation.path.value,
35
+ line: instantiationLocation.line,
36
+ column: instantiationLocation.column
37
+ };
38
+ }
39
+ }
40
+ //# sourceMappingURL=PerformActivitiesAsPlaywrightSteps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerformActivitiesAsPlaywrightSteps.js","sourceRoot":"","sources":["../../src/api/PerformActivitiesAsPlaywrightSteps.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,MAAM,OAAO,kCAAmC,SAAQ,iBAAiB;IAKhD;IAHrB,YACI,KAA+E,EAC/E,KAAwB,EACP,IAAiB;QAElC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAFH,SAAI,GAAJ,IAAI,CAAa;IAGtC,CAAC;IAEQ,KAAK,CAAC,OAAO,CAAC,QAAkB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAE9B,CAAC;QAEF,oEAAoE;QACpE,2DAA2D;QAC3D,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC1C,QAAQ,CAAC,QAAQ,GAAG,CAAC,IAAsB,EAAE,EAAE;YAE3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAE1C,OAAO,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC,CAAA;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAChB,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EACtC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAChC,CAAC;QAEF,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAAC;IACxC,CAAC;IAEO,YAAY,CAAC,QAAkB;QACnC,IAAI,QAAQ,YAAY,WAAW,EAAE,CAAC;YAClC,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACvD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,GAAI,QAAQ,CAAC,KAAK,CAAE,EAAE,CAAC;gBACrC,OAAO,GAAG,CAAC;YACf,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,QAAkB;QACjC,MAAM,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QAC/D,OAAO;YACH,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC,KAAK;YACtC,IAAI,EAAE,qBAAqB,CAAC,IAAI;YAChC,MAAM,EAAE,qBAAqB,CAAC,MAAM;SACvC,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,42 @@
1
+ import type { PlaywrightTestConfig as BasePlaywrightTestConfig } from '@playwright/test';
2
+ import type { SerenityFixtures, SerenityWorkerFixtures } from './serenity-fixtures.js';
3
+ /**
4
+ * Convenience alias for [PlaywrightTestConfig](https://playwright.dev/docs/test-configuration) object
5
+ * that includes [`SerenityFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityFixtures/) and
6
+ * [`SerenityWorkerFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityWorkerFixtures/) and allows for any other custom options when needed.
7
+ *
8
+ * #### Example
9
+ * Configuring Playwright Test using the standard `PlaywrightTestConfig` from `@playwright/test`:
10
+ *
11
+ * ```typescript
12
+ * // playwright.config.ts
13
+ * import type { PlaywrightTestConfig } from '@playwright/test'
14
+ * import type { SerenityFixtures, SerenityWorkerFixtures } from '@serenity-js/playwright-test'
15
+ *
16
+ * const config: PlaywrightTestConfig<SerenityFixtures & MyCustomOptions, SerenityWorkerFixtures> = {
17
+ * // ...
18
+ * }
19
+ *
20
+ * export default config
21
+ * ```
22
+ *
23
+ * Simplified configuration using Serenity/JS `PlaywrightTestConfig` from `@serenity-js/playwright-test`:
24
+ *
25
+ * ```typescript
26
+ * // playwright.config.ts
27
+ * import type { PlaywrightTestConfig } from '@serenity-js/playwright-test'
28
+ *
29
+ * const config: PlaywrightTestConfig<MyCustomOptions> = {
30
+ * // ...
31
+ * }
32
+ * export default config
33
+ * ```
34
+ *
35
+ * #### Learn more
36
+ * - [`SerenityFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityFixtures/)
37
+ * - [`SerenityWorkerFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityWorkerFixtures/)
38
+ * - [`SerenityReporterForPlaywrightTestConfig`](https://serenity-js.org/api/playwright-test/interface/SerenityReporterForPlaywrightTestConfig/)
39
+ * - [Playwright Test configuration](https://playwright.dev/docs/test-configuration)
40
+ */
41
+ export type PlaywrightTestConfig<TestArgs = object, WorkerArgs = object> = BasePlaywrightTestConfig<SerenityFixtures & TestArgs, SerenityWorkerFixtures & WorkerArgs>;
42
+ //# sourceMappingURL=PlaywrightTestConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightTestConfig.d.ts","sourceRoot":"","sources":["../../src/api/PlaywrightTestConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,IAAI,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAEzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,MAAM,oBAAoB,CAAC,QAAQ,GAAG,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,wBAAwB,CAAC,gBAAgB,GAAG,QAAQ,EAAE,sBAAsB,GAAG,UAAU,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PlaywrightTestConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightTestConfig.js","sourceRoot":"","sources":["../../src/api/PlaywrightTestConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { DomainEvent } from '@serenity-js/core/events';
2
+ import type { JSONObject } from 'tiny-types';
3
+ export declare class WorkerEventStreamReader {
4
+ hasStream(pathToEventStreamFile: string): boolean;
5
+ read<T extends DomainEvent>(pathToEventStreamFile: string, mapper?: (input: {
6
+ type: string;
7
+ value: JSONObject;
8
+ }) => {
9
+ type: string;
10
+ value: JSONObject;
11
+ }): T[];
12
+ }
13
+ //# sourceMappingURL=WorkerEventStreamReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerEventStreamReader.d.ts","sourceRoot":"","sources":["../../src/api/WorkerEventStreamReader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,uBAAuB;IAEhC,SAAS,CAAC,qBAAqB,EAAE,MAAM,GAAG,OAAO;IAIjD,IAAI,CAAC,CAAC,SAAS,WAAW,EACtB,qBAAqB,EAAE,MAAM,EAC7B,MAAM,GAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAmB,GAC7G,CAAC,EAAE;CAWT"}
@@ -0,0 +1,18 @@
1
+ import fs from 'node:fs';
2
+ import * as events from '@serenity-js/core/events';
3
+ export class WorkerEventStreamReader {
4
+ hasStream(pathToEventStreamFile) {
5
+ return fs.existsSync(pathToEventStreamFile);
6
+ }
7
+ read(pathToEventStreamFile, mapper = input => input) {
8
+ const content = fs.readFileSync(pathToEventStreamFile, 'utf8');
9
+ return content
10
+ .split('\n')
11
+ .filter(Boolean)
12
+ .map(line => {
13
+ const { type, value } = mapper(JSON.parse(line));
14
+ return events[type].fromJSON(value);
15
+ });
16
+ }
17
+ }
18
+ //# sourceMappingURL=WorkerEventStreamReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerEventStreamReader.js","sourceRoot":"","sources":["../../src/api/WorkerEventStreamReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AAGnD,MAAM,OAAO,uBAAuB;IAEhC,SAAS,CAAC,qBAA6B;QACnC,OAAO,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CACA,qBAA6B,EAC7B,SAA8F,KAAK,CAAC,EAAE,CAAC,KAAK;QAE5G,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAE/D,OAAO,OAAO;aACT,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,IAAI,CAAC,EAAE;YACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACX,CAAC;CACJ"}
@@ -0,0 +1,24 @@
1
+ import { type WorkerInfo } from '@playwright/test';
2
+ import type { TestCase } from '@playwright/test/reporter';
3
+ import type { Stage, StageCrewMember } from '@serenity-js/core';
4
+ import type { DomainEvent } from '@serenity-js/core/events';
5
+ import { CorrelationId } from '@serenity-js/core/model';
6
+ export declare class WorkerEventStreamWriter implements StageCrewMember {
7
+ private readonly outputDirectory;
8
+ private readonly workerInfo;
9
+ private stage?;
10
+ private readonly beforeAllId;
11
+ private activeSceneId;
12
+ private events;
13
+ static workerStreamIdFor(workerIndex: number): CorrelationId;
14
+ constructor(outputDirectory: string, workerInfo: WorkerInfo, stage?: Stage);
15
+ assignedTo(stage: Stage): StageCrewMember;
16
+ notifyOf(event: DomainEvent): void;
17
+ private isSceneEvent;
18
+ private activeSceneExistsFor;
19
+ private activateScene;
20
+ persistAll(workerBeforeAllSceneId: CorrelationId): Promise<void>;
21
+ persist(testId: TestCase['id'], workerBeforeAllSceneId?: CorrelationId): Promise<void>;
22
+ private flush;
23
+ }
24
+ //# sourceMappingURL=WorkerEventStreamWriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerEventStreamWriter.d.ts","sourceRoot":"","sources":["../../src/api/WorkerEventStreamWriter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,qBAAa,uBAAwB,YAAW,eAAe;IAYvD,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,KAAK,CAAC;IAZlB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,MAAM,CAAiD;IAE/D,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa;gBAKvC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,UAAU,EAC/B,KAAK,CAAC,EAAE,KAAK;IAQzB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe;IAMzC,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IASlC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,aAAa;IAgBf,UAAU,CAAC,sBAAsB,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B5F,OAAO,CAAC,KAAK;CAUhB"}
@@ -0,0 +1,79 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { LogicError } from '@serenity-js/core';
4
+ import { CorrelationId } from '@serenity-js/core/model';
5
+ export class WorkerEventStreamWriter {
6
+ outputDirectory;
7
+ workerInfo;
8
+ stage;
9
+ beforeAllId; // = new CorrelationId('unknown');
10
+ activeSceneId; // = WorkerEventStreamWriter.beforeTest;
11
+ events = new Map();
12
+ static workerStreamIdFor(workerIndex) {
13
+ return new CorrelationId(`worker-${workerIndex}`);
14
+ }
15
+ constructor(outputDirectory, workerInfo, stage) {
16
+ this.outputDirectory = outputDirectory;
17
+ this.workerInfo = workerInfo;
18
+ this.stage = stage;
19
+ this.beforeAllId = WorkerEventStreamWriter.workerStreamIdFor(this.workerInfo.workerIndex);
20
+ this.activeSceneId = this.beforeAllId;
21
+ this.events.set(this.beforeAllId.value, []);
22
+ }
23
+ assignedTo(stage) {
24
+ this.stage = stage;
25
+ return this;
26
+ }
27
+ notifyOf(event) {
28
+ if (this.isSceneEvent(event) && !this.activeSceneExistsFor(event)) {
29
+ this.activateScene(event);
30
+ }
31
+ this.events.get(this.activeSceneId.value).push(event);
32
+ }
33
+ isSceneEvent(event) {
34
+ return event['sceneId'] instanceof CorrelationId;
35
+ }
36
+ activeSceneExistsFor(event) {
37
+ return this.activeSceneId.equals(event.sceneId);
38
+ }
39
+ activateScene(event) {
40
+ this.activeSceneId = event.sceneId;
41
+ const testId = event.sceneId.value;
42
+ if (!this.events.has(testId)) {
43
+ this.events.set(testId, []);
44
+ }
45
+ this.events.get(testId).push(...this.events.get(this.beforeAllId.value));
46
+ this.events.set(this.beforeAllId.value, []);
47
+ }
48
+ async persistAll(workerBeforeAllSceneId) {
49
+ const testIds = [...this.events.keys()];
50
+ await Promise.all(testIds.map(testId => this.persist(testId, workerBeforeAllSceneId)));
51
+ }
52
+ async persist(testId, workerBeforeAllSceneId) {
53
+ const testOutputDirectory = path.join(this.outputDirectory, testId);
54
+ const filePath = path.join(testOutputDirectory, 'events.ndjson');
55
+ const events = this.flush(testId);
56
+ if (events.length === 0) {
57
+ return;
58
+ }
59
+ await fs.promises.mkdir(testOutputDirectory, { recursive: true });
60
+ for (const event of events) {
61
+ const shouldReattachToScene = event['sceneId'] && event['sceneId'].equals(workerBeforeAllSceneId);
62
+ const type = event.constructor.name;
63
+ const value = shouldReattachToScene
64
+ ? ({ ...event.toJSON(), sceneId: testId })
65
+ : event.toJSON();
66
+ const serialisedEvent = JSON.stringify({ type, value }, undefined, 0);
67
+ await fs.promises.appendFile(filePath, serialisedEvent + '\n');
68
+ }
69
+ }
70
+ flush(testId) {
71
+ if (!this.events.has(testId)) {
72
+ throw new LogicError(`No events recorded for test with id ${testId}`);
73
+ }
74
+ const events = this.events.get(testId);
75
+ this.events.set(testId, []);
76
+ return events;
77
+ }
78
+ }
79
+ //# sourceMappingURL=WorkerEventStreamWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerEventStreamWriter.js","sourceRoot":"","sources":["../../src/api/WorkerEventStreamWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './PlaywrightTestConfig.js';
2
+ export * from './serenity-fixtures.js';
3
+ export * from './test-api.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './PlaywrightTestConfig.js';
2
+ export * from './serenity-fixtures.js';
3
+ export * from './test-api.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC"}