@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
@@ -0,0 +1,15 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { CorrelationId } from '@serenity-js/core/model';
3
+ export class PlaywrightSceneId extends CorrelationId {
4
+ static fromJSON(v) {
5
+ return new PlaywrightSceneId(v);
6
+ }
7
+ static from(projectName, test, result) {
8
+ const projectId = createHash('sha1')
9
+ .update(projectName)
10
+ .digest('hex')
11
+ .slice(0, 10);
12
+ return new PlaywrightSceneId(`${test.id}-${projectId}-${test.repeatEachIndex}-${result.retry}`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=PlaywrightSceneId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightSceneId.js","sourceRoot":"","sources":["../../src/events/PlaywrightSceneId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAEhD,MAAM,CAAU,QAAQ,CAAC,CAAS;QAC9B,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,WAAgC,EAAE,IAA8C,EAAE,MAAiC;QAC3H,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;aAC/B,MAAM,CAAC,WAAW,CAAC;aACnB,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAElB,OAAO,IAAI,iBAAiB,CAAC,GAAI,IAAI,CAAC,EAAG,IAAK,SAAU,IAAK,IAAI,CAAC,eAAgB,IAAK,MAAM,CAAC,KAAM,EAAE,CAAC,CAAC;IAC5G,CAAC;CACJ"}
@@ -0,0 +1,3 @@
1
+ export * from './EventFactory.js';
2
+ export * from './PlaywrightSceneId.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './EventFactory.js';
2
+ export * from './PlaywrightSceneId.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './api/index.js';
2
+ export { SerenityReporterForPlaywrightTest as default, SerenityReporterForPlaywrightTestConfig } from './reporter/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,iCAAiC,IAAI,OAAO,EAAE,uCAAuC,EAAE,MAAM,qBAAqB,CAAC"}
package/esm/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './api/index.js';
2
+ export { SerenityReporterForPlaywrightTest as default } from './reporter/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,iCAAiC,IAAI,OAAO,EAA2C,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TestError } from '@playwright/test/reporter';
2
+ export declare class PlaywrightErrorParser {
3
+ private static ascii;
4
+ errorFrom(testError: TestError): Error;
5
+ private static stripAsciiFrom;
6
+ }
7
+ //# sourceMappingURL=PlaywrightErrorParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightErrorParser.d.ts","sourceRoot":"","sources":["../../src/reporter/PlaywrightErrorParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAGlB;IAEK,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK;IAuB7C,OAAO,CAAC,MAAM,CAAC,cAAc;CAGhC"}
@@ -0,0 +1,23 @@
1
+ export class PlaywrightErrorParser {
2
+ static ascii = new RegExp('[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g');
3
+ errorFrom(testError) {
4
+ const message = testError.message && PlaywrightErrorParser.stripAsciiFrom(testError.message);
5
+ let stack = testError.stack && PlaywrightErrorParser.stripAsciiFrom(testError.stack);
6
+ // TODO: Do I need to process it?
7
+ // const value = testError.value;
8
+ const prologue = `Error: ${message}`;
9
+ if (stack && message && stack.startsWith(prologue)) {
10
+ stack = stack.slice(prologue.length);
11
+ }
12
+ if (testError.cause) {
13
+ stack += `\nCaused by: ${this.errorFrom(testError.cause).stack}`;
14
+ }
15
+ const error = new Error(message);
16
+ error.stack = stack;
17
+ return error;
18
+ }
19
+ static stripAsciiFrom(text) {
20
+ return text.replace(this.ascii, '');
21
+ }
22
+ }
23
+ //# sourceMappingURL=PlaywrightErrorParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightErrorParser.js","sourceRoot":"","sources":["../../src/reporter/PlaywrightErrorParser.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,qBAAqB;IACtB,MAAM,CAAC,KAAK,GAAG,IAAI,MAAM,CAC7B,sJAAsJ,EACtJ,GAAG,CACN,CAAC;IAEK,SAAS,CAAC,SAAoB;QACjC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,qBAAqB,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAE7F,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,qBAAqB,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAErF,iCAAiC;QACjC,qCAAqC;QAErC,MAAM,QAAQ,GAAG,UAAW,OAAQ,EAAE,CAAC;QACvC,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,IAAI,gBAAiB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAM,EAAE,CAAC;QACvE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAEpB,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,IAAY;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type FullConfig } from '@playwright/test';
2
+ import { type TestCase, type TestResult } from '@playwright/test/reporter';
3
+ import { type DomainEvent } from '@serenity-js/core/events';
4
+ export declare class PlaywrightEventBuffer {
5
+ private readonly errorParser;
6
+ private readonly eventStreamReader;
7
+ private eventFactory;
8
+ private readonly events;
9
+ private readonly deferredSceneFinishedEvents;
10
+ configure(config: Pick<FullConfig, 'rootDir'>): void;
11
+ appendTestStart(test: TestCase, result: TestResult): void;
12
+ appendRetryableSceneEvents(test: TestCase, result: TestResult): void;
13
+ deferAppendingSceneFinishedEvent(test: TestCase, result: TestResult): void;
14
+ private determineScenarioOutcome;
15
+ appendCrashedWorkerEvents(test: TestCase, result: TestResult): void;
16
+ appendSceneEvents(test: TestCase, result: TestResult): void;
17
+ private readEventStream;
18
+ appendSceneFinishedEvent(test: TestCase, result: TestResult): void;
19
+ flush(test: TestCase, result: TestResult): DomainEvent[];
20
+ flushAllDeferred(): DomainEvent[];
21
+ private determineWorstInteractionOutcome;
22
+ private outcomeFrom;
23
+ private sceneId;
24
+ }
25
+ //# sourceMappingURL=PlaywrightEventBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightEventBuffer.d.ts","sourceRoot":"","sources":["../../src/reporter/PlaywrightEventBuffer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE3E,OAAO,EACH,KAAK,WAAW,EAKnB,MAAM,0BAA0B,CAAC;AAkBlC,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiC;IAEnE,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAIvC;IAEL,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,IAAI;IAIpD,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAOzD,0BAA0B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAmBpE,gCAAgC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAW1E,OAAO,CAAC,wBAAwB;IAiBhC,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAanE,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAO3D,OAAO,CAAC,eAAe;IAyBvB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAalE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,EAAE;IAaxD,gBAAgB,IAAI,WAAW,EAAE;IA6CjC,OAAO,CAAC,gCAAgC;IAUxC,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,OAAO;CAGlB"}
@@ -0,0 +1,143 @@
1
+ import path from 'node:path';
2
+ import { Duration, LogicError, Timestamp } from '@serenity-js/core';
3
+ import { InteractionFinished, RetryableSceneDetected, SceneFinished, SceneTagged } from '@serenity-js/core/events';
4
+ import { Path } from '@serenity-js/core/io';
5
+ import { ArbitraryTag, ExecutionFailedWithAssertionError, ExecutionFailedWithError, ExecutionIgnored, ExecutionSkipped, ExecutionSuccessful } from '@serenity-js/core/model';
6
+ import { WorkerEventStreamReader } from '../api/WorkerEventStreamReader.js';
7
+ import { WorkerEventStreamWriter } from '../api/WorkerEventStreamWriter.js';
8
+ import { EventFactory, PlaywrightSceneId } from '../events/index.js';
9
+ import { PlaywrightErrorParser } from './PlaywrightErrorParser.js';
10
+ export class PlaywrightEventBuffer {
11
+ errorParser = new PlaywrightErrorParser();
12
+ eventStreamReader = new WorkerEventStreamReader();
13
+ eventFactory;
14
+ events = new Map();
15
+ deferredSceneFinishedEvents = new Map();
16
+ configure(config) {
17
+ this.eventFactory = new EventFactory(Path.from(config.rootDir));
18
+ }
19
+ appendTestStart(test, result) {
20
+ this.events.set(this.sceneId(test, result).value, this.eventFactory.createSceneStartEvents(test, result));
21
+ }
22
+ appendRetryableSceneEvents(test, result) {
23
+ const sceneId = this.sceneId(test, result);
24
+ const sceneEndTime = new Timestamp(result.startTime).plus(Duration.ofMilliseconds(result.duration));
25
+ this.events.get(sceneId.value).push(new RetryableSceneDetected(sceneId, sceneEndTime));
26
+ if (result.retry > 0 || result.status !== 'passed') {
27
+ this.events.get(sceneId.value).push(new SceneTagged(sceneId, new ArbitraryTag('retried'), // todo: replace with a dedicated tag
28
+ sceneEndTime));
29
+ }
30
+ }
31
+ deferAppendingSceneFinishedEvent(test, result) {
32
+ const sceneId = this.sceneId(test, result);
33
+ const scenarioOutcome = this.outcomeFrom(test, result);
34
+ this.deferredSceneFinishedEvents.set(sceneId.value, {
35
+ event: this.eventFactory.createSceneFinishedEvent(test, result, scenarioOutcome),
36
+ outputDirectory: test.parent.project().outputDir,
37
+ workerIndex: result.workerIndex,
38
+ });
39
+ }
40
+ determineScenarioOutcome(worstInteractionOutcome, scenarioOutcome) {
41
+ if (worstInteractionOutcome instanceof ExecutionFailedWithAssertionError) {
42
+ return worstInteractionOutcome;
43
+ }
44
+ if (worstInteractionOutcome instanceof ExecutionSkipped) {
45
+ return worstInteractionOutcome;
46
+ }
47
+ return worstInteractionOutcome.isWorseThan(scenarioOutcome)
48
+ ? worstInteractionOutcome
49
+ : scenarioOutcome;
50
+ }
51
+ appendCrashedWorkerEvents(test, result) {
52
+ const workerStreamId = WorkerEventStreamWriter.workerStreamIdFor(result.workerIndex).value;
53
+ const sceneId = this.sceneId(test, result);
54
+ this.events.get(sceneId.value).push(...this.readEventStream(test.parent.project().outputDir, workerStreamId, sceneId.value));
55
+ }
56
+ appendSceneEvents(test, result) {
57
+ const sceneId = this.sceneId(test, result);
58
+ this.events.get(sceneId.value).push(...this.readEventStream(test.parent.project().outputDir, sceneId.value));
59
+ }
60
+ readEventStream(outputDirectory, streamId, expectedSceneId = streamId) {
61
+ const pathToEventStreamFile = path.join(outputDirectory, 'serenity', streamId, 'events.ndjson');
62
+ if (this.eventStreamReader.hasStream(pathToEventStreamFile)) {
63
+ return this.eventStreamReader.read(pathToEventStreamFile, (event) => {
64
+ // re-attach events from orphaned beforeAll to the test case
65
+ const hasSceneId = event.value['sceneId'] !== undefined;
66
+ const isAttachedToScene = event.value['sceneId'] === expectedSceneId;
67
+ if (hasSceneId && !isAttachedToScene) {
68
+ event.value['sceneId'] = expectedSceneId;
69
+ }
70
+ return event;
71
+ });
72
+ }
73
+ return [];
74
+ }
75
+ appendSceneFinishedEvent(test, result) {
76
+ const sceneId = this.sceneId(test, result);
77
+ const worstInteractionOutcome = this.determineWorstInteractionOutcome(this.events.get(sceneId.value));
78
+ const scenarioOutcome = this.determineScenarioOutcome(worstInteractionOutcome, this.outcomeFrom(test, result));
79
+ this.events.get(sceneId.value).push(this.eventFactory.createSceneFinishedEvent(test, result, scenarioOutcome));
80
+ }
81
+ flush(test, result) {
82
+ const sceneId = this.sceneId(test, result);
83
+ const events = this.events.get(sceneId.value);
84
+ if (!events) {
85
+ throw new LogicError(`No events found for test: ${sceneId.value}`);
86
+ }
87
+ this.events.delete(sceneId.value);
88
+ return events;
89
+ }
90
+ flushAllDeferred() {
91
+ const allEvents = [];
92
+ for (const [testId, events] of this.events.entries()) {
93
+ const scenarioEvents = [];
94
+ scenarioEvents.push(...events);
95
+ if (this.deferredSceneFinishedEvents.has(testId)) {
96
+ const lastRecordedEvent = scenarioEvents.at(-1);
97
+ const deferredSceneFinished = this.deferredSceneFinishedEvents.get(testId);
98
+ const eventStream = this.readEventStream(deferredSceneFinished.outputDirectory, deferredSceneFinished.event.sceneId.value);
99
+ const firstEventSinceLastIndex = eventStream.findIndex(event => lastRecordedEvent.equals(event));
100
+ const eventsSinceLast = firstEventSinceLastIndex === -1
101
+ ? eventStream
102
+ : eventStream.slice(firstEventSinceLastIndex);
103
+ scenarioEvents.push(...eventsSinceLast);
104
+ const worstInteractionOutcome = this.determineWorstInteractionOutcome(scenarioEvents);
105
+ const sceneFinishedEvent = new SceneFinished(deferredSceneFinished.event.sceneId, deferredSceneFinished.event.details, this.determineScenarioOutcome(worstInteractionOutcome, deferredSceneFinished.event.outcome), deferredSceneFinished.event.timestamp);
106
+ scenarioEvents.push(sceneFinishedEvent);
107
+ }
108
+ allEvents.push(...scenarioEvents);
109
+ }
110
+ this.events.clear();
111
+ this.deferredSceneFinishedEvents.clear();
112
+ return allEvents;
113
+ }
114
+ determineWorstInteractionOutcome(events) {
115
+ let worstInteractionOutcome = new ExecutionSuccessful();
116
+ for (const event of events) {
117
+ if (event instanceof InteractionFinished && event.outcome.isWorseThan(worstInteractionOutcome)) {
118
+ worstInteractionOutcome = event.outcome;
119
+ }
120
+ }
121
+ return worstInteractionOutcome;
122
+ }
123
+ outcomeFrom(test, result) {
124
+ const outcome = test.outcome();
125
+ if (outcome === 'skipped') {
126
+ return new ExecutionSkipped();
127
+ }
128
+ if (outcome === 'unexpected' && result.status === 'passed') {
129
+ return new ExecutionFailedWithError(new LogicError(`Scenario expected to fail, but ${result.status}`));
130
+ }
131
+ if (['failed', 'interrupted', 'timedOut'].includes(result.status)) {
132
+ if (test.retries > result.retry) {
133
+ return new ExecutionIgnored(this.errorParser.errorFrom(result.error));
134
+ }
135
+ return new ExecutionFailedWithError(this.errorParser.errorFrom(result.error));
136
+ }
137
+ return new ExecutionSuccessful();
138
+ }
139
+ sceneId(test, result) {
140
+ return PlaywrightSceneId.from(test.parent.project()?.name, test, result);
141
+ }
142
+ }
143
+ //# sourceMappingURL=PlaywrightEventBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightEventBuffer.js","sourceRoot":"","sources":["../../src/reporter/PlaywrightEventBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAEH,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EACH,YAAY,EACZ,iCAAiC,EACjC,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACtB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,OAAO,qBAAqB;IACb,WAAW,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC1C,iBAAiB,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAE3D,YAAY,CAAe;IAClB,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1C,2BAA2B,GAAG,IAAI,GAAG,EAIlD,CAAC;IAEL,SAAS,CAAC,MAAmC;QACzC,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,eAAe,CAAC,IAAc,EAAE,MAAkB;QAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CACX,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,EAChC,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CACzD,CAAC;IACN,CAAC;IAED,0BAA0B,CAAC,IAAc,EAAE,MAAkB;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/B,IAAI,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CACpD,CAAC;QAEF,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/B,IAAI,WAAW,CACX,OAAO,EACP,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE,qCAAqC;YAClE,YAAY,CACf,CACJ,CAAC;QACN,CAAC;IACL,CAAC;IAED,gCAAgC,CAAC,IAAc,EAAE,MAAkB;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEvD,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE;YAChD,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC;YAChF,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS;YAChD,WAAW,EAAE,MAAM,CAAC,WAAW;SAClC,CAAC,CAAC;IACP,CAAC;IAEO,wBAAwB,CAC5B,uBAAgC,EAChC,eAAwB;QAExB,IAAI,uBAAuB,YAAY,iCAAiC,EAAE,CAAC;YACvE,OAAO,uBAAuB,CAAC;QACnC,CAAC;QAED,IAAI,uBAAuB,YAAY,gBAAgB,EAAE,CAAC;YACtD,OAAO,uBAAuB,CAAC;QACnC,CAAC;QAED,OAAO,uBAAuB,CAAC,WAAW,CAAC,eAAe,CAAC;YACvD,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,eAAe,CAAC;IAC1B,CAAC;IAED,yBAAyB,CAAC,IAAc,EAAE,MAAkB;QACxD,MAAM,cAAc,GAAG,uBAAuB,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;QAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,eAAe,CACnB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAC/B,cAAc,EACd,OAAO,CAAC,KAAK,CAChB,CACJ,CAAC;IACN,CAAC;IAED,iBAAiB,CAAC,IAAc,EAAE,MAAkB;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAC1E,CAAC;IACN,CAAC;IAEO,eAAe,CACnB,eAAuB,EACvB,QAAgB,EAChB,kBAA0B,QAAQ;QAElC,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QAEhG,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAC9B,qBAAqB,EACrB,CAAC,KAA0C,EAAE,EAAE;gBAC3C,4DAA4D;gBAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC;gBACxD,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,eAAe,CAAA;gBACpE,IAAG,UAAU,IAAI,CAAE,iBAAiB,EAAE,CAAC;oBACnC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC;gBAC7C,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC,CACJ,CAAC;QACN,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC;IAED,wBAAwB,CAAC,IAAc,EAAE,MAAkB;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,uBAAuB,GAAG,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACtG,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CACjD,uBAAuB,EACvB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CACjC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/B,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAC5E,CAAC;IACN,CAAC;IAED,KAAK,CAAC,IAAc,EAAE,MAAkB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAE,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,UAAU,CAAC,6BAA8B,OAAO,CAAC,KAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAElC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,gBAAgB;QACZ,MAAM,SAAS,GAAG,EAAE,CAAC;QAErB,KAAK,MAAM,CAAE,MAAM,EAAE,MAAM,CAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,cAAc,GAAG,EAAE,CAAC;YAE1B,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAE/B,IAAI,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/C,MAAM,iBAAiB,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,MAAM,qBAAqB,GAAG,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAE3E,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CACpC,qBAAqB,CAAC,eAAe,EACrC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAC5C,CAAC;gBAEF,MAAM,wBAAwB,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjG,MAAM,eAAe,GAAG,wBAAwB,KAAK,CAAC,CAAC;oBACnD,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAElD,cAAc,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;gBAExC,MAAM,uBAAuB,GAAG,IAAI,CAAC,gCAAgC,CAAC,cAAc,CAAC,CAAC;gBAEtF,MAAM,kBAAkB,GAAG,IAAI,aAAa,CACxC,qBAAqB,CAAC,KAAK,CAAC,OAAO,EACnC,qBAAqB,CAAC,KAAK,CAAC,OAAO,EACnC,IAAI,CAAC,wBAAwB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,EAC3F,qBAAqB,CAAC,KAAK,CAAC,SAAS,CACxC,CAAA;gBAED,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC5C,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,CAAC;QAEzC,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,gCAAgC,CAAC,MAAqB;QAC1D,IAAI,uBAAuB,GAAY,IAAI,mBAAmB,EAAE,CAAC;QACjE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC7F,uBAAuB,GAAG,KAAK,CAAC,OAAO,CAAC;YAC5C,CAAC;QACL,CAAC;QACD,OAAO,uBAAuB,CAAC;IACnC,CAAC;IAEO,WAAW,CAAC,IAAc,EAAE,MAAkB;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE/B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,OAAO,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzD,OAAO,IAAI,wBAAwB,CAC/B,IAAI,UAAU,CAAC,kCAAmC,MAAM,CAAC,MAAO,EAAE,CAAC,CACtE,CAAC;QACN,CAAC;QAED,IAAI,CAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC9B,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,IAAI,wBAAwB,CAC/B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAC3C,CAAC;QACN,CAAC;QAED,OAAO,IAAI,mBAAmB,EAAE,CAAC;IACrC,CAAC;IAEO,OAAO,CAAC,IAAc,EAAE,MAAkB;QAC9C,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;CACJ"}
@@ -0,0 +1,14 @@
1
+ import type { TestInfo } from '@playwright/test';
2
+ import type { Stage, StageCrewMember } from '@serenity-js/core';
3
+ import type { DomainEvent } from '@serenity-js/core/events';
4
+ export declare class PlaywrightStepReporter implements StageCrewMember {
5
+ private readonly testInfo;
6
+ private stage?;
7
+ constructor(testInfo: TestInfo, stage?: Stage);
8
+ assignedTo(stage: Stage): StageCrewMember;
9
+ notifyOf(event: DomainEvent): void;
10
+ private attachPhotoFrom;
11
+ private shouldAddTag;
12
+ private addTag;
13
+ }
14
+ //# sourceMappingURL=PlaywrightStepReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightStepReporter.d.ts","sourceRoot":"","sources":["../../src/reporter/PlaywrightStepReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAU5D,qBAAa,sBAAuB,YAAW,eAAe;IAGtD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,KAAK,CAAC;gBADG,QAAQ,EAAE,QAAQ,EAC3B,KAAK,CAAC,EAAE,KAAK;IAIzB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe;IAMzC,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAWlC,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,MAAM;CAGjB"}
@@ -0,0 +1,38 @@
1
+ import { ActivityRelatedArtifactGenerated, AsyncOperationAttempted, AsyncOperationCompleted, SceneTagged, } from '@serenity-js/core/events';
2
+ import { BrowserTag, CorrelationId, Description, Name, Photo, PlatformTag } from '@serenity-js/core/model';
3
+ export class PlaywrightStepReporter {
4
+ testInfo;
5
+ stage;
6
+ constructor(testInfo, stage) {
7
+ this.testInfo = testInfo;
8
+ this.stage = stage;
9
+ }
10
+ assignedTo(stage) {
11
+ this.stage = stage;
12
+ return this;
13
+ }
14
+ notifyOf(event) {
15
+ if (event instanceof ActivityRelatedArtifactGenerated && event.artifact instanceof Photo) {
16
+ this.attachPhotoFrom(event);
17
+ }
18
+ if (event instanceof SceneTagged && this.shouldAddTag(event.tag)) {
19
+ this.addTag(event.tag);
20
+ }
21
+ }
22
+ attachPhotoFrom(event) {
23
+ const id = CorrelationId.create();
24
+ this.stage.announce(new AsyncOperationAttempted(new Name(this.constructor.name), new Description(`Attaching screenshot of '${event.name.value}'...`), id, this.stage.currentTime()));
25
+ this.testInfo.attach(event.name.value, { body: Buffer.from(event.artifact.base64EncodedValue, 'base64'), contentType: 'image/png' })
26
+ .then(() => {
27
+ this.stage.announce(new AsyncOperationCompleted(id, this.stage.currentTime()));
28
+ });
29
+ }
30
+ shouldAddTag(tag) {
31
+ // don't include platform and browser tags as Playwright already includes them
32
+ return !(tag instanceof PlatformTag || tag instanceof BrowserTag);
33
+ }
34
+ addTag(tag) {
35
+ this.testInfo.annotations.push({ type: tag.type, description: tag.name });
36
+ }
37
+ }
38
+ //# sourceMappingURL=PlaywrightStepReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightStepReporter.js","sourceRoot":"","sources":["../../src/reporter/PlaywrightStepReporter.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,gCAAgC,EAChC,uBAAuB,EACvB,uBAAuB,EACvB,WAAW,GACd,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3G,MAAM,OAAO,sBAAsB;IAGV;IACT;IAFZ,YACqB,QAAkB,EAC3B,KAAa;QADJ,aAAQ,GAAR,QAAQ,CAAU;QAC3B,UAAK,GAAL,KAAK,CAAQ;IAEzB,CAAC;IAED,UAAU,CAAC,KAAY;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,KAAkB;QAEvB,IAAI,KAAK,YAAY,gCAAgC,IAAI,KAAK,CAAC,QAAQ,YAAY,KAAK,EAAE,CAAC;YACvF,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,KAAK,YAAY,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,KAAuC;QAC3D,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QAElC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,uBAAuB,CAC3C,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAC/B,IAAI,WAAW,CAAC,4BAA6B,KAAK,CAAC,IAAI,CAAC,KAAM,MAAM,CAAC,EACrE,EAAE,EACF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;aAC/H,IAAI,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,uBAAuB,CAC3C,EAAE,EACF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAC3B,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACX,CAAC;IAEO,YAAY,CAAC,GAAQ;QACzB,8EAA8E;QAC9E,OAAO,CAAE,CAAC,GAAG,YAAY,WAAW,IAAI,GAAG,YAAY,UAAU,CAAC,CAAA;IACtE,CAAC;IAEO,MAAM,CAAC,GAAQ;QACnB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;CACJ"}
@@ -0,0 +1,8 @@
1
+ import type { CorrelationIdFactory } from '@serenity-js/core/model';
2
+ import { CorrelationId } from '@serenity-js/core/model';
3
+ export declare class PlaywrightTestSceneIdFactory implements CorrelationIdFactory {
4
+ private testId;
5
+ setTestId(testId: string): void;
6
+ create(): CorrelationId;
7
+ }
8
+ //# sourceMappingURL=PlaywrightTestSceneIdFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightTestSceneIdFactory.d.ts","sourceRoot":"","sources":["../../src/reporter/PlaywrightTestSceneIdFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,qBAAa,4BAA6B,YAAW,oBAAoB;IACrE,OAAO,CAAC,MAAM,CAAgB;IAE9B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,MAAM,IAAI,aAAa;CAG1B"}
@@ -0,0 +1,11 @@
1
+ import { CorrelationId } from '@serenity-js/core/model';
2
+ export class PlaywrightTestSceneIdFactory {
3
+ testId;
4
+ setTestId(testId) {
5
+ this.testId = new CorrelationId(testId);
6
+ }
7
+ create() {
8
+ return this.testId;
9
+ }
10
+ }
11
+ //# sourceMappingURL=PlaywrightTestSceneIdFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightTestSceneIdFactory.js","sourceRoot":"","sources":["../../src/reporter/PlaywrightTestSceneIdFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,OAAO,4BAA4B;IAC7B,MAAM,CAAgB;IAE9B,SAAS,CAAC,MAAc;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM;QACF,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;CACJ"}
@@ -0,0 +1,58 @@
1
+ import type { FullConfig } from '@playwright/test';
2
+ import type { FullResult, Reporter, Suite, TestCase, TestError, TestResult } from '@playwright/test/reporter';
3
+ import type { ClassDescription, StageCrewMember, StageCrewMemberBuilder } from '@serenity-js/core';
4
+ import type { OutputStream } from '@serenity-js/core/adapter';
5
+ /**
6
+ * Configuration object accepted by `@serenity-js/playwright-test` reporter.
7
+ *
8
+ * For usage examples, see:
9
+ * - [`SerenityFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityFixtures/)
10
+ * - [`SerenityWorkerFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityFixtures/)
11
+ */
12
+ export interface SerenityReporterForPlaywrightTestConfig {
13
+ /**
14
+ * A list of [stage crew member builders](https://serenity-js.org/api/core/interface/StageCrewMemberBuilder/) or [stage crew members](https://serenity-js.org/api/core/interface/StageCrewMember/)
15
+ * to be instantiated in Playwright Test reporter process and notified of [Serenity/JS domain events](https://serenity-js.org/api/core-events/class/DomainEvent/) that occur during the scenario execution.
16
+ * Note that the `crew` can also be configured using [class descriptions](https://serenity-js.org/api/core/#ClassDescription).
17
+ *
18
+ * #### Learn more
19
+ * - [`SerenityFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityFixtures/)
20
+ * - [`SerenityConfig.crew`](https://serenity-js.org/api/core/class/SerenityConfig/#crew)
21
+ */
22
+ crew?: Array<StageCrewMember | StageCrewMemberBuilder | ClassDescription>;
23
+ /**
24
+ * An output stream to be injected into [stage crew member builders](https://serenity-js.org/api/core/interface/StageCrewMemberBuilder/)
25
+ *
26
+ * Defaults to [`process.stdout`](https://nodejs.org/api/process.html#process_process_stdout).
27
+ *
28
+ * #### Learn more
29
+ * - [`SerenityConfig.outputStream`](https://serenity-js.org/api/core/class/SerenityConfig/#outputStream)
30
+ */
31
+ outputStream?: OutputStream;
32
+ }
33
+ /**
34
+ * Serenity/JS reporter that receives notifications from Playwright Test and emits them as
35
+ * Serenity/JS [Serenity/JS domain events](https://serenity-js.org/api/core-events/class/DomainEvent/) which can be used by
36
+ * Serenity/JS [stage crew members](https://serenity-js.org/api/core/interface/StageCrewMember/).
37
+ */
38
+ export declare class SerenityReporterForPlaywrightTest implements Reporter {
39
+ private readonly errorParser;
40
+ private readonly sceneIdFactory;
41
+ private readonly serenity;
42
+ private unhandledError?;
43
+ private readonly eventBuffer;
44
+ private readonly suiteTestCounts;
45
+ /**
46
+ * @param config
47
+ */
48
+ constructor(config: SerenityReporterForPlaywrightTestConfig);
49
+ onBegin(config: FullConfig, suite: Suite): void;
50
+ private countTestsPerSuite;
51
+ onTestBegin(test: TestCase, result: TestResult): void;
52
+ onTestEnd(test: TestCase, result: TestResult): void;
53
+ private countPendingAfterAllHooks;
54
+ onError(error: TestError): void;
55
+ onEnd(fullResult: FullResult): Promise<void>;
56
+ printsToStdio(): boolean;
57
+ }
58
+ //# sourceMappingURL=SerenityReporterForPlaywrightTest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerenityReporterForPlaywrightTest.d.ts","sourceRoot":"","sources":["../../src/reporter/SerenityReporterForPlaywrightTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAG,MAAM,2BAA2B,CAAC;AAC/G,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAU9D;;;;;;GAMG;AACH,MAAM,WAAW,uCAAuC;IACpD;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,sBAAsB,GAAG,gBAAgB,CAAC,CAAC;IAE1E;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED;;;;GAIG;AACH,qBAAa,iCAAkC,YAAW,QAAQ;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAE3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,cAAc,CAAC,CAAQ;IAE/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsD;IAClF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAE5D;;OAEG;gBACS,MAAM,EAAE,uCAAuC;IAW3D,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAO/C,OAAO,CAAC,kBAAkB;IAY1B,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAcrD,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAuBnD,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMzB,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA2ClD,aAAa,IAAI,OAAO;CAG3B"}
@@ -0,0 +1,112 @@
1
+ import { Clock, Duration, Serenity, Timestamp } from '@serenity-js/core';
2
+ import { TestRunFinished, TestRunFinishes, TestRunStarts } from '@serenity-js/core/events';
3
+ import { ExecutionFailedWithError, ExecutionSuccessful, } from '@serenity-js/core/model';
4
+ import { PlaywrightErrorParser } from './PlaywrightErrorParser.js';
5
+ import { PlaywrightEventBuffer } from './PlaywrightEventBuffer.js';
6
+ import { PlaywrightTestSceneIdFactory } from './PlaywrightTestSceneIdFactory.js';
7
+ /**
8
+ * Serenity/JS reporter that receives notifications from Playwright Test and emits them as
9
+ * Serenity/JS [Serenity/JS domain events](https://serenity-js.org/api/core-events/class/DomainEvent/) which can be used by
10
+ * Serenity/JS [stage crew members](https://serenity-js.org/api/core/interface/StageCrewMember/).
11
+ */
12
+ export class SerenityReporterForPlaywrightTest {
13
+ errorParser = new PlaywrightErrorParser();
14
+ sceneIdFactory;
15
+ serenity;
16
+ unhandledError;
17
+ eventBuffer = new PlaywrightEventBuffer();
18
+ suiteTestCounts = new Map();
19
+ /**
20
+ * @param config
21
+ */
22
+ constructor(config) {
23
+ this.sceneIdFactory = new PlaywrightTestSceneIdFactory();
24
+ this.serenity = new Serenity(new Clock(), process.cwd(), this.sceneIdFactory);
25
+ this.serenity.configure(config);
26
+ }
27
+ onBegin(config, suite) {
28
+ this.eventBuffer.configure(config);
29
+ this.serenity.announce(new TestRunStarts(this.serenity.currentTime()));
30
+ this.countTestsPerSuite(suite);
31
+ }
32
+ countTestsPerSuite(suite) {
33
+ suite.allTests().forEach(test => {
34
+ let currentSuite = test.parent;
35
+ while (currentSuite) {
36
+ const count = this.suiteTestCounts.get(currentSuite) ?? 0;
37
+ this.suiteTestCounts.set(currentSuite, count + 1);
38
+ currentSuite = currentSuite.parent;
39
+ }
40
+ });
41
+ }
42
+ onTestBegin(test, result) {
43
+ this.eventBuffer.appendTestStart(test, result);
44
+ }
45
+ // TODO might be nice to support that by emitting TestStepStarted / Finished
46
+ // onStepBegin(test: TestCase, _result: TestResult, step: TestStep): void {
47
+ // // console.log('>> onStepBegin');
48
+ // }
49
+ // todo: add stdout -> Log https://github.com/microsoft/playwright/blob/main/packages/playwright/src/reporters/list.ts#L67
50
+ // onStepEnd(test: TestCase, _result: TestResult, step: TestStep): void {
51
+ // // console.log('>> onStepEnd');
52
+ // }
53
+ onTestEnd(test, result) {
54
+ const pendingAfterAllHooks = this.countPendingAfterAllHooks(test);
55
+ if (test.retries > 0) {
56
+ this.eventBuffer.appendRetryableSceneEvents(test, result);
57
+ }
58
+ this.eventBuffer.appendCrashedWorkerEvents(test, result);
59
+ this.eventBuffer.appendSceneEvents(test, result);
60
+ if (pendingAfterAllHooks === 0) {
61
+ this.eventBuffer.appendSceneFinishedEvent(test, result);
62
+ const events = this.eventBuffer.flush(test, result);
63
+ this.serenity.announce(...events);
64
+ }
65
+ else {
66
+ this.eventBuffer.deferAppendingSceneFinishedEvent(test, result);
67
+ }
68
+ }
69
+ countPendingAfterAllHooks(test) {
70
+ let currentSuite = test.parent;
71
+ const pendingAfterAllHooks = [];
72
+ while (currentSuite) {
73
+ const remainingSuites = (this.suiteTestCounts.get(currentSuite) || 0) - 1;
74
+ this.suiteTestCounts.set(currentSuite, remainingSuites);
75
+ if (remainingSuites === 0 && currentSuite['_hooks'].some((hook) => hook.type === 'afterAll')) {
76
+ pendingAfterAllHooks.push(currentSuite);
77
+ }
78
+ currentSuite = currentSuite.parent;
79
+ }
80
+ return pendingAfterAllHooks.length;
81
+ }
82
+ onError(error) {
83
+ if (!this.unhandledError) {
84
+ this.unhandledError = this.errorParser.errorFrom(error);
85
+ }
86
+ }
87
+ async onEnd(fullResult) {
88
+ const deferredEvents = this.eventBuffer.flushAllDeferred();
89
+ this.serenity.announce(...deferredEvents);
90
+ const fullDuration = Duration.ofMilliseconds(Math.round(fullResult.duration));
91
+ const endTime = new Timestamp(fullResult.startTime).plus(fullDuration);
92
+ this.serenity.announce(new TestRunFinishes(endTime));
93
+ try {
94
+ await this.serenity.waitForNextCue();
95
+ const outcome = this.unhandledError
96
+ ? new ExecutionFailedWithError(this.unhandledError)
97
+ : new ExecutionSuccessful();
98
+ this.serenity.announce(new TestRunFinished(outcome, endTime));
99
+ }
100
+ catch (error) {
101
+ this.serenity.announce(new TestRunFinished(new ExecutionFailedWithError(error), endTime));
102
+ throw error;
103
+ }
104
+ }
105
+ // TODO emit a text artifact with stdout
106
+ // reporter.onStdErr(chunk, test, result)
107
+ // reporter.onStdOut(chunk, test, result)
108
+ printsToStdio() {
109
+ return true;
110
+ }
111
+ }
112
+ //# sourceMappingURL=SerenityReporterForPlaywrightTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerenityReporterForPlaywrightTest.js","sourceRoot":"","sources":["../../src/reporter/SerenityReporterForPlaywrightTest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './PlaywrightStepReporter.js';
2
+ export * from './SerenityReporterForPlaywrightTest.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './PlaywrightStepReporter.js';
2
+ export * from './SerenityReporterForPlaywrightTest.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { test as base } from '@playwright/test';
2
2
  import type { Activity, AnswersQuestions, PerformsActivities, UsesAbilities } from '@serenity-js/core';
3
3
  import { PerformActivities } from '@serenity-js/core';
4
- import type { EmitsDomainEvents } from '@serenity-js/core/lib/events';
4
+ import type { EmitsDomainEvents } from '@serenity-js/core/events';
5
5
  export declare class PerformActivitiesAsPlaywrightSteps extends PerformActivities {
6
6
  private readonly test;
7
7
  constructor(actor: AnswersQuestions & UsesAbilities & PerformsActivities & {
@@ -1 +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,8BAA8B,CAAC;AAGtE,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"}
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"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PerformActivitiesAsPlaywrightSteps = void 0;
4
4
  const core_1 = require("@serenity-js/core");
5
- const objects_1 = require("tiny-types/lib/objects");
5
+ const significantFields_js_1 = require("tiny-types/lib/objects/significantFields.js");
6
6
  class PerformActivitiesAsPlaywrightSteps extends core_1.PerformActivities {
7
7
  test;
8
8
  constructor(actor, stage, test) {
@@ -24,7 +24,7 @@ class PerformActivitiesAsPlaywrightSteps extends core_1.PerformActivities {
24
24
  }
25
25
  parametersOf(activity) {
26
26
  if (activity instanceof core_1.Interaction) {
27
- return (0, objects_1.significantFieldsOf)(activity).reduce((acc, field) => {
27
+ return (0, significantFields_js_1.significantFieldsOf)(activity).reduce((acc, field) => {
28
28
  acc[field] = (0, core_1.d) `${activity[field]}`;
29
29
  return acc;
30
30
  }, {});