@plan2net/typo3-playwright-toolkit 0.1.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.
Files changed (164) hide show
  1. package/LICENSE +338 -0
  2. package/README.md +404 -0
  3. package/dist/builders/content-builder.d.ts +30 -0
  4. package/dist/builders/content-builder.d.ts.map +1 -0
  5. package/dist/builders/content-builder.js +67 -0
  6. package/dist/builders/content-builder.js.map +1 -0
  7. package/dist/builders/content-factory.d.ts +10 -0
  8. package/dist/builders/content-factory.d.ts.map +1 -0
  9. package/dist/builders/content-factory.js +23 -0
  10. package/dist/builders/content-factory.js.map +1 -0
  11. package/dist/builders/core-content.d.ts +127 -0
  12. package/dist/builders/core-content.d.ts.map +1 -0
  13. package/dist/builders/core-content.js +223 -0
  14. package/dist/builders/core-content.js.map +1 -0
  15. package/dist/builders/fields.d.ts +7 -0
  16. package/dist/builders/fields.d.ts.map +1 -0
  17. package/dist/builders/fields.js +20 -0
  18. package/dist/builders/fields.js.map +1 -0
  19. package/dist/builders/identifier.d.ts +2 -0
  20. package/dist/builders/identifier.d.ts.map +1 -0
  21. package/dist/builders/identifier.js +11 -0
  22. package/dist/builders/identifier.js.map +1 -0
  23. package/dist/builders/page-builder.d.ts +40 -0
  24. package/dist/builders/page-builder.d.ts.map +1 -0
  25. package/dist/builders/page-builder.js +119 -0
  26. package/dist/builders/page-builder.js.map +1 -0
  27. package/dist/builders/request-context.d.ts +23 -0
  28. package/dist/builders/request-context.d.ts.map +1 -0
  29. package/dist/builders/request-context.js +32 -0
  30. package/dist/builders/request-context.js.map +1 -0
  31. package/dist/checks/accessibility.d.ts +34 -0
  32. package/dist/checks/accessibility.d.ts.map +1 -0
  33. package/dist/checks/accessibility.js +90 -0
  34. package/dist/checks/accessibility.js.map +1 -0
  35. package/dist/checks/csp.d.ts +39 -0
  36. package/dist/checks/csp.d.ts.map +1 -0
  37. package/dist/checks/csp.js +179 -0
  38. package/dist/checks/csp.js.map +1 -0
  39. package/dist/checks/screenshot.d.ts +18 -0
  40. package/dist/checks/screenshot.d.ts.map +1 -0
  41. package/dist/checks/screenshot.js +125 -0
  42. package/dist/checks/screenshot.js.map +1 -0
  43. package/dist/config.d.ts +100 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +68 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/contract.d.ts +9 -0
  48. package/dist/contract.d.ts.map +1 -0
  49. package/dist/contract.js +25 -0
  50. package/dist/contract.js.map +1 -0
  51. package/dist/global-setup.d.ts +20 -0
  52. package/dist/global-setup.d.ts.map +1 -0
  53. package/dist/global-setup.js +103 -0
  54. package/dist/global-setup.js.map +1 -0
  55. package/dist/global-teardown.d.ts +34 -0
  56. package/dist/global-teardown.d.ts.map +1 -0
  57. package/dist/global-teardown.js +269 -0
  58. package/dist/global-teardown.js.map +1 -0
  59. package/dist/http/api-secret.d.ts +11 -0
  60. package/dist/http/api-secret.d.ts.map +1 -0
  61. package/dist/http/api-secret.js +27 -0
  62. package/dist/http/api-secret.js.map +1 -0
  63. package/dist/http/cleanup-client.d.ts +26 -0
  64. package/dist/http/cleanup-client.d.ts.map +1 -0
  65. package/dist/http/cleanup-client.js +91 -0
  66. package/dist/http/cleanup-client.js.map +1 -0
  67. package/dist/http/off-site-headers.d.ts +13 -0
  68. package/dist/http/off-site-headers.d.ts.map +1 -0
  69. package/dist/http/off-site-headers.js +27 -0
  70. package/dist/http/off-site-headers.js.map +1 -0
  71. package/dist/http/prepare-context.d.ts +4 -0
  72. package/dist/http/prepare-context.d.ts.map +1 -0
  73. package/dist/http/prepare-context.js +6 -0
  74. package/dist/http/prepare-context.js.map +1 -0
  75. package/dist/http/record-edit.d.ts +37 -0
  76. package/dist/http/record-edit.d.ts.map +1 -0
  77. package/dist/http/record-edit.js +86 -0
  78. package/dist/http/record-edit.js.map +1 -0
  79. package/dist/http/toolkit-request.d.ts +8 -0
  80. package/dist/http/toolkit-request.d.ts.map +1 -0
  81. package/dist/http/toolkit-request.js +45 -0
  82. package/dist/http/toolkit-request.js.map +1 -0
  83. package/dist/index.d.ts +18 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +14 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/inspect/cli.d.ts +3 -0
  88. package/dist/inspect/cli.d.ts.map +1 -0
  89. package/dist/inspect/cli.js +36 -0
  90. package/dist/inspect/cli.js.map +1 -0
  91. package/dist/inspect/links.d.ts +10 -0
  92. package/dist/inspect/links.d.ts.map +1 -0
  93. package/dist/inspect/links.js +51 -0
  94. package/dist/inspect/links.js.map +1 -0
  95. package/dist/inspect/token.d.ts +5 -0
  96. package/dist/inspect/token.d.ts.map +1 -0
  97. package/dist/inspect/token.js +15 -0
  98. package/dist/inspect/token.js.map +1 -0
  99. package/dist/playwright/base-config.d.ts +4 -0
  100. package/dist/playwright/base-config.d.ts.map +1 -0
  101. package/dist/playwright/base-config.js +34 -0
  102. package/dist/playwright/base-config.js.map +1 -0
  103. package/dist/playwright/index.d.ts +3 -0
  104. package/dist/playwright/index.d.ts.map +1 -0
  105. package/dist/playwright/index.js +3 -0
  106. package/dist/playwright/index.js.map +1 -0
  107. package/dist/scenario.d.ts +46 -0
  108. package/dist/scenario.d.ts.map +1 -0
  109. package/dist/scenario.js +139 -0
  110. package/dist/scenario.js.map +1 -0
  111. package/dist/state/attempt-claim.d.ts +8 -0
  112. package/dist/state/attempt-claim.d.ts.map +1 -0
  113. package/dist/state/attempt-claim.js +47 -0
  114. package/dist/state/attempt-claim.js.map +1 -0
  115. package/dist/state/attempt-registry.d.ts +36 -0
  116. package/dist/state/attempt-registry.d.ts.map +1 -0
  117. package/dist/state/attempt-registry.js +68 -0
  118. package/dist/state/attempt-registry.js.map +1 -0
  119. package/dist/state/ensure-state.d.ts +42 -0
  120. package/dist/state/ensure-state.d.ts.map +1 -0
  121. package/dist/state/ensure-state.js +169 -0
  122. package/dist/state/ensure-state.js.map +1 -0
  123. package/dist/state/json-safe.d.ts +9 -0
  124. package/dist/state/json-safe.d.ts.map +1 -0
  125. package/dist/state/json-safe.js +18 -0
  126. package/dist/state/json-safe.js.map +1 -0
  127. package/dist/state/run-id.d.ts +6 -0
  128. package/dist/state/run-id.d.ts.map +1 -0
  129. package/dist/state/run-id.js +28 -0
  130. package/dist/state/run-id.js.map +1 -0
  131. package/dist/state/run-namespace.d.ts +33 -0
  132. package/dist/state/run-namespace.d.ts.map +1 -0
  133. package/dist/state/run-namespace.js +136 -0
  134. package/dist/state/run-namespace.js.map +1 -0
  135. package/dist/state/safe-paths.d.ts +10 -0
  136. package/dist/state/safe-paths.d.ts.map +1 -0
  137. package/dist/state/safe-paths.js +56 -0
  138. package/dist/state/safe-paths.js.map +1 -0
  139. package/dist/state/scenario-outcome.d.ts +9 -0
  140. package/dist/state/scenario-outcome.d.ts.map +1 -0
  141. package/dist/state/scenario-outcome.js +23 -0
  142. package/dist/state/scenario-outcome.js.map +1 -0
  143. package/dist/state/scenario-state.d.ts +41 -0
  144. package/dist/state/scenario-state.d.ts.map +1 -0
  145. package/dist/state/scenario-state.js +50 -0
  146. package/dist/state/scenario-state.js.map +1 -0
  147. package/dist/state/setup-lock.d.ts +22 -0
  148. package/dist/state/setup-lock.d.ts.map +1 -0
  149. package/dist/state/setup-lock.js +90 -0
  150. package/dist/state/setup-lock.js.map +1 -0
  151. package/dist/types/common.d.ts +17 -0
  152. package/dist/types/common.d.ts.map +1 -0
  153. package/dist/types/common.js +2 -0
  154. package/dist/types/common.js.map +1 -0
  155. package/dist/types/content-builder.d.ts +16 -0
  156. package/dist/types/content-builder.d.ts.map +1 -0
  157. package/dist/types/content-builder.js +2 -0
  158. package/dist/types/content-builder.js.map +1 -0
  159. package/dist/types/playwright-extensions.d.ts +8 -0
  160. package/dist/types/playwright-extensions.d.ts.map +1 -0
  161. package/dist/types/playwright-extensions.js +2 -0
  162. package/dist/types/playwright-extensions.js.map +1 -0
  163. package/package.json +88 -0
  164. package/tsconfig.base.json +13 -0
@@ -0,0 +1,100 @@
1
+ import type { BrowserContext } from '@playwright/test';
2
+ import type { ContentBuilderInterface } from './types/content-builder.js';
3
+ export type ContentTypeConstructor = new () => ContentBuilderInterface;
4
+ export interface ToolkitScreenshotConfig {
5
+ threshold?: number;
6
+ maxDiffPixelRatio?: number;
7
+ }
8
+ export interface ToolkitAccessibilityConfig {
9
+ /**
10
+ * Projects to scan; omit for all. Worth narrowing: axe evaluates the rendered
11
+ * state, so desktop and mobile surface different violations while a tablet
12
+ * project or a second engine adds cost without coverage.
13
+ */
14
+ projects?: string[];
15
+ /** Overrides DEFAULT_SCAN_TAGS. */
16
+ tags?: string[];
17
+ disabledRules?: string[];
18
+ /**
19
+ * Scan after every test that opened a page, instead of calling
20
+ * runAccessibilityScan yourself. A test that already failed is left alone.
21
+ */
22
+ auto?: boolean;
23
+ }
24
+ export interface ToolkitCspConfig {
25
+ /**
26
+ * `any` (default) requires some policy header, `report-only` also refuses an
27
+ * enforcing one, `enforced` requires it and tolerates report-only alongside.
28
+ */
29
+ mode?: 'any' | 'report-only' | 'enforced';
30
+ /** Defaults to the origin of testingURL. */
31
+ expectedOrigin?: string;
32
+ }
33
+ /** All three are absolute, and both writable ones must sit inside consumerRoot. */
34
+ export interface ToolkitPaths {
35
+ consumerRoot: string;
36
+ stateDir: string;
37
+ /** TYPO3 session directory; teardown deletes stale entries from it. */
38
+ sessionDir: string;
39
+ }
40
+ /** Every default lives in SETUP_DEFAULTS (ensure-state.ts), which is exported. */
41
+ export interface ToolkitSetupConfig {
42
+ /** One setup attempt. */
43
+ attemptTimeoutMs?: number;
44
+ /** Whole wait for a scenario, lock waiting plus every attempt. */
45
+ waitTimeoutMs?: number;
46
+ /** Total attempts, so 2 means one retry. */
47
+ attempts?: number;
48
+ /** Silence after which a holder's lock may be taken. */
49
+ lockStaleMs?: number;
50
+ /** Gap between polls while waiting. */
51
+ pollMs?: number;
52
+ }
53
+ export interface ToolkitCleanupConfig {
54
+ /** Age after which unrecorded databases and abandoned runs are reclaimed. */
55
+ orphanAgeMs?: number;
56
+ /** Fail the run when a test database survives teardown. Defaults to true in CI. */
57
+ failOnLeak?: boolean;
58
+ /** Which databases to keep when something failed. Default `failed`. */
59
+ preserveOnFailure?: 'failed' | 'all' | 'none';
60
+ }
61
+ export interface ToolkitConfig {
62
+ /**
63
+ * The only URL the toolkit uses: the origin that serves the Testing context.
64
+ * Relative navigation, the test API and the builders all resolve against it,
65
+ * because the per-test database exists nowhere else. A bare origin — no path,
66
+ * query, fragment or credentials; `defineToolkitConfig` refuses anything else.
67
+ */
68
+ testingURL: string;
69
+ /** Screenshot tolerances merged into the base Playwright config + Screenshot helper. */
70
+ screenshot?: ToolkitScreenshotConfig;
71
+ /**
72
+ * Your own content-type builders, keyed by CType. Core CTypes (text,
73
+ * textmedia, bullets, table, …) ship with the toolkit and need no entry; a key
74
+ * matching one of them replaces the shipped builder.
75
+ */
76
+ contentTypes?: Record<string, ContentTypeConstructor>;
77
+ /** Selectors hidden before each screenshot. Defaults to []. */
78
+ hideBeforeScreenshot?: string[];
79
+ /**
80
+ * Runs on every context a scenario test uses, after the toolkit's own headers are
81
+ * in place. Where a consumer stubs a third-party script or adds its own routes.
82
+ */
83
+ prepareContext?: (context: BrowserContext) => Promise<void> | void;
84
+ /** Relocatability paths — never derived from __dirname. */
85
+ paths: ToolkitPaths;
86
+ /** Pins the run ID. Normally omitted — taken from PW_RUN_ID or minted. */
87
+ runId?: string;
88
+ cleanup?: ToolkitCleanupConfig;
89
+ accessibility?: ToolkitAccessibilityConfig;
90
+ csp?: ToolkitCspConfig;
91
+ setup?: ToolkitSetupConfig;
92
+ }
93
+ /** What a consumer writes: only consumerRoot is required, the other two are derived from it. */
94
+ export type ToolkitConfigInput = Omit<ToolkitConfig, 'paths'> & {
95
+ paths: Pick<ToolkitPaths, 'consumerRoot'> & Partial<ToolkitPaths>;
96
+ };
97
+ export declare function defineToolkitConfig(config: ToolkitConfigInput): ToolkitConfig;
98
+ export declare function setToolkitConfig(config: ToolkitConfig): void;
99
+ export declare function getToolkitConfig(): ToolkitConfig;
100
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AAKzE,MAAM,MAAM,sBAAsB,GAAG,UAAU,uBAAuB,CAAA;AAEtE,MAAM,WAAW,uBAAuB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,aAAa,GAAG,UAAU,CAAA;IACzC,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAA;CACrB;AAED,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IAC/B,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACjC,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mFAAmF;IACnF,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;CAChD;AAED,MAAM,WAAW,aAAa;IAC1B;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,wFAAwF;IACxF,UAAU,CAAC,EAAE,uBAAuB,CAAA;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IACrD,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAClE,2DAA2D;IAC3D,KAAK,EAAE,YAAY,CAAA;IACnB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,oBAAoB,CAAA;IAC9B,aAAa,CAAC,EAAE,0BAA0B,CAAA;IAC1C,GAAG,CAAC,EAAE,gBAAgB,CAAA;IACtB,KAAK,CAAC,EAAE,kBAAkB,CAAA;CAC7B;AAED,gGAAgG;AAChG,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG;IAC5D,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACpE,CAAA;AAqDD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,aAAa,CAW7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE5D;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAQhD"}
package/dist/config.js ADDED
@@ -0,0 +1,68 @@
1
+ import * as path from 'path';
2
+ import { registerContentTypes } from './builders/content-factory.js';
3
+ import { resolveRunId } from './state/run-id.js';
4
+ import { assertDeletableDirectory } from './state/safe-paths.js';
5
+ let activeConfig;
6
+ function resolvePaths(paths) {
7
+ if (!path.isAbsolute(paths.consumerRoot)) {
8
+ throw new Error(`[typo3-playwright-toolkit] paths.consumerRoot must be an absolute path, got "${paths.consumerRoot}".`);
9
+ }
10
+ const resolved = {
11
+ consumerRoot: paths.consumerRoot,
12
+ stateDir: paths.stateDir ?? path.join(paths.consumerRoot, '.test-state'),
13
+ sessionDir: paths.sessionDir ?? path.join(paths.consumerRoot, 'var/session'),
14
+ };
15
+ assertDeletableDirectory('stateDir', resolved.stateDir, resolved.consumerRoot);
16
+ assertDeletableDirectory('sessionDir', resolved.sessionDir, resolved.consumerRoot);
17
+ return resolved;
18
+ }
19
+ function resolveTestingURL(testingURL) {
20
+ const refuse = (reason) => {
21
+ throw new Error(`[typo3-playwright-toolkit] testingURL ${reason}, got "${testingURL}".`);
22
+ };
23
+ let url;
24
+ try {
25
+ url = new URL(testingURL);
26
+ }
27
+ catch {
28
+ return refuse('must be an absolute URL, such as https://example-testing.ddev.site');
29
+ }
30
+ if ('https:' !== url.protocol && 'http:' !== url.protocol) {
31
+ return refuse('must be http or https');
32
+ }
33
+ if (url.username || url.password) {
34
+ return refuse('must carry no credentials');
35
+ }
36
+ if (url.search || url.hash) {
37
+ return refuse('must carry no query string or fragment');
38
+ }
39
+ // The test API answers at /typo3/test-api/…, so a subdirectory install cannot
40
+ // work and dropping the path silently would hide that.
41
+ if (!/^\/+$/.test(url.pathname)) {
42
+ return refuse('must be a bare origin, with no path');
43
+ }
44
+ return url.origin;
45
+ }
46
+ export function defineToolkitConfig(config) {
47
+ // Resolved here: this runs in the main process before workers are forked.
48
+ const resolved = {
49
+ ...config,
50
+ testingURL: resolveTestingURL(config.testingURL),
51
+ paths: resolvePaths(config.paths),
52
+ runId: resolveRunId(config.runId),
53
+ };
54
+ setToolkitConfig(resolved);
55
+ registerContentTypes(config.contentTypes ?? {});
56
+ return resolved;
57
+ }
58
+ export function setToolkitConfig(config) {
59
+ activeConfig = config;
60
+ }
61
+ export function getToolkitConfig() {
62
+ if (!activeConfig) {
63
+ throw new Error('[typo3-playwright-toolkit] No toolkit config set. Call defineToolkitConfig(...) ' +
64
+ 'in your Playwright config before the toolkit modules run.');
65
+ }
66
+ return activeConfig;
67
+ }
68
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ToolkitConfig } from './config.js';
2
+ export declare const TEST_ID_HEADER = "X-Playwright-Test-Id";
3
+ export declare const TEST_ID_PATTERN: RegExp;
4
+ export declare function generateTestId(): string;
5
+ /** Both headers, for one explicit request. */
6
+ export declare function toolkitHeaders(config: ToolkitConfig, testId: string): Record<string, string>;
7
+ /** What routing and the request client add. No secret: that stays explicit. */
8
+ export declare function browserHeaders(testId: string): Record<string, string>;
9
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,eAAO,MAAM,cAAc,yBAAyB,CAAA;AACpD,eAAO,MAAM,eAAe,QAAmB,CAAA;AAK/C,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK5F;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAErE"}
@@ -0,0 +1,25 @@
1
+ import { randomInt } from 'crypto';
2
+ import { SECRET_HEADER, resolveApiSecret } from './http/api-secret.js';
3
+ export const TEST_ID_HEADER = 'X-Playwright-Test-Id';
4
+ export const TEST_ID_PATTERN = /^[A-Z0-9]{16}$/;
5
+ const TEST_ID_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
6
+ const TEST_ID_LENGTH = 16;
7
+ export function generateTestId() {
8
+ let testId = '';
9
+ for (let index = 0; index < TEST_ID_LENGTH; index++) {
10
+ testId += TEST_ID_ALPHABET.charAt(randomInt(TEST_ID_ALPHABET.length));
11
+ }
12
+ return testId;
13
+ }
14
+ /** Both headers, for one explicit request. */
15
+ export function toolkitHeaders(config, testId) {
16
+ return {
17
+ ...browserHeaders(testId),
18
+ [SECRET_HEADER]: resolveApiSecret(config),
19
+ };
20
+ }
21
+ /** What routing and the request client add. No secret: that stays explicit. */
22
+ export function browserHeaders(testId) {
23
+ return { [TEST_ID_HEADER]: testId };
24
+ }
25
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEtE,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,CAAA;AACpD,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAA;AAE/C,MAAM,gBAAgB,GAAG,sCAAsC,CAAA;AAC/D,MAAM,cAAc,GAAG,EAAE,CAAA;AAEzB,MAAM,UAAU,cAAc;IAC1B,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,cAAc,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,MAAM,CAAA;AACjB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,cAAc,CAAC,MAAqB,EAAE,MAAc;IAChE,OAAO;QACH,GAAG,cAAc,CAAC,MAAM,CAAC;QACzB,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC;KAC5C,CAAA;AACL,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,MAAc;IACzC,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;AACvC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type ToolkitConfig } from './config.js';
2
+ export declare function preflightTestId(config: ToolkitConfig): string;
3
+ /** The oldest extension this toolkit can talk to. */
4
+ export declare const MINIMUM_API_VERSION = 1;
5
+ /**
6
+ * Sends no test ID, and runs before any test ID exists. A request with one makes
7
+ * the extension create a database, and an extension this old has no endpoint to
8
+ * delete it again.
9
+ */
10
+ export declare function verifyApiVersion(config: ToolkitConfig, options?: {
11
+ fetchImpl?: typeof fetch;
12
+ }): Promise<number>;
13
+ export declare function runHealthCheck(testingURL: string, options?: {
14
+ testId?: string;
15
+ secret?: string;
16
+ fetchImpl?: typeof fetch;
17
+ }): Promise<void>;
18
+ declare function globalSetup(): Promise<void>;
19
+ export default globalSetup;
20
+ //# sourceMappingURL=global-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAMlE,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAK7D;AAED,qDAAqD;AACrD,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAuCpC;;;;GAIG;AACH,wBAAsB,gBAAgB,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GAC3C,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED,wBAAsB,cAAc,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GAC7E,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED,iBAAe,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAe1C;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,103 @@
1
+ import { getToolkitConfig } from './config.js';
2
+ import { prepareRun } from './state/run-namespace.js';
3
+ import { TEST_ID_HEADER, generateTestId } from './contract.js';
4
+ import { SECRET_HEADER, resolveApiSecret } from './http/api-secret.js';
5
+ import { registerSetupAttempt } from './state/attempt-registry.js';
6
+ export function preflightTestId(config) {
7
+ const testId = generateTestId();
8
+ registerSetupAttempt(config, 'preflight', testId);
9
+ return testId;
10
+ }
11
+ /** The oldest extension this toolkit can talk to. */
12
+ export const MINIMUM_API_VERSION = 1;
13
+ /**
14
+ * The body is read whatever the status: an unhealthy site still reports its
15
+ * version, and "too old" is a different problem from "unhealthy".
16
+ */
17
+ async function readHealth(healthUrl, headers, doFetch, unreachable) {
18
+ let response;
19
+ try {
20
+ response = await doFetch(healthUrl, {
21
+ method: 'GET',
22
+ signal: AbortSignal.timeout(Number(process.env.PW_HEALTH_TIMEOUT_MS) || 5000),
23
+ headers,
24
+ });
25
+ }
26
+ catch (error) {
27
+ throw new Error(unreachable(error instanceof Error ? error.message : String(error)));
28
+ }
29
+ try {
30
+ return { status: response.status, ok: response.ok, body: (await response.json()) };
31
+ }
32
+ catch {
33
+ throw new Error(`Preflight failed: ${healthUrl} returned non-JSON (status ${response.status}). ` +
34
+ 'Check that the Playwright test API extension is loaded in the Testing context.');
35
+ }
36
+ }
37
+ /**
38
+ * Sends no test ID, and runs before any test ID exists. A request with one makes
39
+ * the extension create a database, and an extension this old has no endpoint to
40
+ * delete it again.
41
+ */
42
+ export async function verifyApiVersion(config, options = {}) {
43
+ const healthUrl = `${config.testingURL}/typo3/test-api/health`;
44
+ const { body } = await readHealth(healthUrl, { [SECRET_HEADER]: resolveApiSecret(config) }, options.fetchImpl ?? fetch, (reason) => `Preflight failed: could not read the API version from ${healthUrl} (${reason}).`);
45
+ const reported = body.api;
46
+ if (typeof reported !== 'number' || reported < MINIMUM_API_VERSION) {
47
+ throw new Error([
48
+ `Preflight failed: the TYPO3 extension is too old for this toolkit.`,
49
+ ` needs api ${MINIMUM_API_VERSION} or newer, got ${JSON.stringify(reported)}`,
50
+ '',
51
+ 'Upgrade it with: composer update plan2net/playwright-toolkit',
52
+ '',
53
+ 'Continuing would create test databases the extension has no endpoint',
54
+ 'to clean up again.',
55
+ ].join('\n'));
56
+ }
57
+ return reported;
58
+ }
59
+ export async function runHealthCheck(testingURL, options = {}) {
60
+ const healthUrl = `${testingURL}/typo3/test-api/health`;
61
+ const headers = {};
62
+ if (options.testId) {
63
+ headers[TEST_ID_HEADER] = options.testId;
64
+ }
65
+ if (options.secret) {
66
+ headers[SECRET_HEADER] = options.secret;
67
+ }
68
+ const { status, ok, body } = await readHealth(healthUrl, headers, options.fetchImpl ?? fetch, (reason) => [
69
+ `Preflight failed: ${healthUrl} unreachable (${reason}).`,
70
+ 'Likely causes:',
71
+ ' - The test environment is not running',
72
+ ' - The testing site configuration is missing',
73
+ ].join('\n'));
74
+ if (ok && body.ok) {
75
+ return;
76
+ }
77
+ const failed = Object.entries(body.checks ?? {})
78
+ .filter(([, check]) => !check.ok)
79
+ .map(([name, check]) => ` ✗ ${name}: ${check.detail}`)
80
+ .join('\n');
81
+ throw new Error([
82
+ `Preflight failed (HTTP ${status}):`,
83
+ failed || ' (no per-check detail returned — investigate the endpoint response)',
84
+ '',
85
+ 'Fix the underlying issue then re-run. To bypass for endpoint debugging, set PW_SKIP_HEALTH=1.',
86
+ ].join('\n'));
87
+ }
88
+ async function globalSetup() {
89
+ const config = getToolkitConfig();
90
+ prepareRun(config);
91
+ if (process.env.PW_SKIP_HEALTH === '1') {
92
+ return;
93
+ }
94
+ // Order matters: verify the engine before minting an ID, or a mismatch leaves
95
+ // behind a database teardown can no longer reach.
96
+ await verifyApiVersion(config);
97
+ await runHealthCheck(config.testingURL, {
98
+ testId: preflightTestId(config),
99
+ secret: resolveApiSecret(config),
100
+ });
101
+ }
102
+ export default globalSetup;
103
+ //# sourceMappingURL=global-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-setup.js","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type ToolkitConfig } from './config.js';
2
+ import { type CleanupClient } from './http/cleanup-client.js';
3
+ export declare const DEFAULT_ORPHAN_AGE_MS = 86400000;
4
+ export declare function failedScenarioKeys(config: ToolkitConfig): string[];
5
+ export declare function preservedTestIds(config: ToolkitConfig): string[];
6
+ export type PreservePlan = {
7
+ mode: 'none';
8
+ } | {
9
+ mode: 'all';
10
+ reason?: string;
11
+ } | {
12
+ mode: 'some';
13
+ testIds: string[];
14
+ reason?: string;
15
+ };
16
+ export declare function resolvePreservePlan(config: ToolkitConfig, cleanupSwitchedOff: boolean): PreservePlan;
17
+ export interface TeardownOptions {
18
+ /** Injectable so tests need no site; see httpCleanup for the real one. */
19
+ cleanup: CleanupClient;
20
+ preserve: PreservePlan;
21
+ }
22
+ export interface TeardownSummary {
23
+ dropped: number;
24
+ /** Test IDs whose database may still exist, so the caller can fail the run. */
25
+ leaked: string[];
26
+ preserved: string[];
27
+ }
28
+ /** Only live runs go in `keepTestIds`; an abandoned run's databases are dropped. */
29
+ export declare function sweepOrphans(config: ToolkitConfig, cleanup: CleanupClient, now?: number): Promise<number>;
30
+ export declare function describePreservedRun(config: ToolkitConfig, keptTestIds?: string[], secret?: string, now?: number): string;
31
+ export declare function runTeardown(config: ToolkitConfig, options: TeardownOptions): Promise<TeardownSummary>;
32
+ declare function globalTeardown(): Promise<void>;
33
+ export default globalTeardown;
34
+ //# sourceMappingURL=global-teardown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-teardown.d.ts","sourceRoot":"","sources":["../src/global-teardown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAO1E,eAAO,MAAM,qBAAqB,WAAa,CAAA;AAO/C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAwBlE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAgBhE;AAED,MAAM,MAAM,YAAY,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,OAAO,GAAG,YAAY,CAoBpG;AAMD,MAAM,WAAW,eAAe;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,aAAa,CAAA;IACtB,QAAQ,EAAE,YAAY,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,oFAAoF;AACpF,wBAAsB,YAAY,CAC9B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,aAAa,EACtB,GAAG,GAAE,MAAmB,GACzB,OAAO,CAAC,MAAM,CAAC,CA2DjB;AAED,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,MAAM,SAAK,EACX,GAAG,GAAE,MAAmB,GACzB,MAAM,CAwBR;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA8B3G;AA8FD,iBAAe,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAmC7C;AAgBD,eAAe,cAAc,CAAA"}