@nsxbet/playwright-orchestrator 1.0.0 → 2.0.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 (41) hide show
  1. package/README.md +76 -133
  2. package/dist/commands/assign.d.ts +2 -0
  3. package/dist/commands/assign.d.ts.map +1 -1
  4. package/dist/commands/assign.js +44 -3
  5. package/dist/commands/assign.js.map +1 -1
  6. package/dist/commands/extract-timing.d.ts +0 -1
  7. package/dist/commands/extract-timing.d.ts.map +1 -1
  8. package/dist/commands/extract-timing.js +2 -32
  9. package/dist/commands/extract-timing.js.map +1 -1
  10. package/dist/core/ckk-algorithm.d.ts +1 -1
  11. package/dist/core/ckk-algorithm.d.ts.map +1 -1
  12. package/dist/core/ckk-algorithm.js +130 -36
  13. package/dist/core/ckk-algorithm.js.map +1 -1
  14. package/dist/core/estimate.d.ts +11 -0
  15. package/dist/core/estimate.d.ts.map +1 -1
  16. package/dist/core/estimate.js +43 -0
  17. package/dist/core/estimate.js.map +1 -1
  18. package/dist/core/test-discovery.d.ts +17 -3
  19. package/dist/core/test-discovery.d.ts.map +1 -1
  20. package/dist/core/test-discovery.js +39 -19
  21. package/dist/core/test-discovery.js.map +1 -1
  22. package/dist/core/test-id.d.ts +23 -67
  23. package/dist/core/test-id.d.ts.map +1 -1
  24. package/dist/core/test-id.js +29 -86
  25. package/dist/core/test-id.js.map +1 -1
  26. package/dist/core/types.d.ts +2 -0
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/core/types.js.map +1 -1
  29. package/package.json +1 -26
  30. package/dist/commands/filter-report.d.ts +0 -19
  31. package/dist/commands/filter-report.d.ts.map +0 -1
  32. package/dist/commands/filter-report.js +0 -103
  33. package/dist/commands/filter-report.js.map +0 -1
  34. package/dist/fixture.d.ts +0 -75
  35. package/dist/fixture.d.ts.map +0 -1
  36. package/dist/fixture.js +0 -148
  37. package/dist/fixture.js.map +0 -1
  38. package/dist/reporter.d.ts +0 -93
  39. package/dist/reporter.d.ts.map +0 -1
  40. package/dist/reporter.js +0 -343
  41. package/dist/reporter.js.map +0 -1
@@ -1,86 +1,42 @@
1
1
  /**
2
2
  * Test ID Generation Module
3
3
  *
4
- * This module provides shared functions for generating consistent test IDs
5
- * across all orchestrator components (fixture, reporter).
6
- *
7
- * CRITICAL: All components MUST use these shared functions to ensure
8
- * test IDs match between shard assignment and runtime filtering.
9
- *
10
- * There are two contexts for test ID generation:
11
- * 1. Discovery context: Uses buildTestId from types.ts (data from Playwright JSON)
12
- * 2. Runtime context: Uses buildTestIdFromRuntime (data from testInfo.titlePath)
4
+ * Provides shared functions for generating consistent test IDs
5
+ * and converting them to Playwright's --test-list format.
13
6
  *
14
7
  * @module @nsxbet/playwright-orchestrator/core/test-id
15
8
  */
16
9
  /**
17
- * Options for filtering runtime titlePath
10
+ * Minimal test entry for test-list format conversion.
11
+ * Uses the structured data from Playwright's --list JSON directly,
12
+ * avoiding the lossy parseTestId round-trip (test names may contain `::`)
18
13
  */
19
- export interface FilterTitlePathOptions {
20
- /** Playwright project name to exclude from titlePath */
21
- projectName?: string;
22
- /** File name (basename) to exclude from titlePath */
23
- fileName?: string;
14
+ export interface TestListEntry {
15
+ file: string;
16
+ titlePath: string[];
24
17
  }
25
18
  /**
26
- * Filter titlePath from Playwright runtime (testInfo.titlePath) to get only
27
- * describe blocks and test title.
19
+ * Convert a test entry to Playwright's --test-list format.
28
20
  *
29
- * Playwright's runtime titlePath includes:
30
- * - Project name (e.g., "chromium")
31
- * - File path or filename
32
- * - Describe block titles
33
- * - Test title
21
+ * Test-list format: `file › describe › test`
34
22
  *
35
- * This function removes non-meaningful elements to produce a clean titlePath
36
- * that matches what test-discovery produces from Playwright's JSON output.
23
+ * When testDirPrefix is provided (monorepo case where testDir != rootDir),
24
+ * the prefix is prepended to the file path so paths are relative to rootDir.
37
25
  *
38
- * @param titlePath - Raw titlePath from testInfo.titlePath or test.titlePath()
39
- * @param options - Options for filtering
40
- * @returns Filtered titlePath containing only describe blocks and test title
41
- */
42
- export declare function filterRuntimeTitlePath(titlePath: string[], options?: FilterTitlePathOptions): string[];
43
- /**
44
- * Options for building a test ID from runtime data
26
+ * @param entry - Test entry with file and titlePath from Playwright discovery
27
+ * @param testDirPrefix - Relative path from rootDir to testDir (e.g. `src/test/e2e`)
28
+ * @returns Test-list formatted string (e.g. `src/test/e2e/login.spec.ts Login should login`)
45
29
  */
46
- export interface BuildTestIdFromRuntimeOptions {
47
- /** Playwright project name to exclude from titlePath */
48
- projectName?: string;
49
- /**
50
- * Base directory for relative path resolution.
51
- * REQUIRED: Must be testInfo.project.testDir from Playwright.
52
- * No fallback to process.cwd() - this caused the rootDir vs testDir bug.
53
- */
54
- baseDir: string;
55
- }
30
+ export declare function toTestListFormat(entry: TestListEntry, testDirPrefix?: string): string;
56
31
  /**
57
- * Build a test ID from Playwright runtime data (fixture or reporter context).
58
- *
59
- * CRITICAL: The baseDir MUST be the project's testDir (testInfo.project.testDir).
60
- * This ensures test IDs match between discovery and runtime filtering.
61
- *
62
- * This function:
63
- * 1. Converts the absolute file path to relative (using baseDir)
64
- * 2. Filters the titlePath to remove project name, filename, and file paths
65
- * 3. Joins file and filtered titles with "::"
66
- *
67
- * The resulting test ID format: {relative-file}::{describe1}::{describe2}::{testTitle}
32
+ * Convert an array of test entries to a complete test-list file content.
68
33
  *
69
- * @param filePath - Absolute path to the test file (testInfo.file or test.location.file)
70
- * @param titlePath - Raw titlePath from testInfo.titlePath or test.titlePath()
71
- * @param options - Options for path resolution and filtering (baseDir is REQUIRED)
72
- * @returns Test ID string
73
- * @throws Error if baseDir is not provided
34
+ * Each line is one test in Playwright's --test-list format, with a trailing newline.
35
+ * Returns empty string for an empty array.
74
36
  *
75
- * @example
76
- * ```typescript
77
- * const testId = buildTestIdFromRuntime(
78
- * '/project/src/test/e2e/login.spec.ts',
79
- * ['chromium', 'login.spec.ts', 'Login', 'should work'],
80
- * { projectName: 'chromium', baseDir: '/project/src/test/e2e' }
81
- * );
82
- * // Result: 'login.spec.ts::Login::should work'
83
- * ```
37
+ * @param entries - Array of test entries from Playwright discovery
38
+ * @param testDirPrefix - Relative path from rootDir to testDir
39
+ * @returns Ready-to-write test-list file content
84
40
  */
85
- export declare function buildTestIdFromRuntime(filePath: string, titlePath: string[], options?: BuildTestIdFromRuntimeOptions): string;
41
+ export declare function toTestListFile(entries: TestListEntry[], testDirPrefix?: string): string;
86
42
  //# sourceMappingURL=test-id.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-id.d.ts","sourceRoot":"","sources":["../../src/core/test-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,GAAE,sBAA2B,GACnC,MAAM,EAAE,CAsBV;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,CAAC,EAAE,6BAA6B,GACtC,MAAM,CAwBR"}
1
+ {"version":3,"file":"test-id.d.ts","sourceRoot":"","sources":["../../src/core/test-id.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,EACpB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAUR;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EAAE,EACxB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR"}
@@ -1,104 +1,47 @@
1
1
  /**
2
2
  * Test ID Generation Module
3
3
  *
4
- * This module provides shared functions for generating consistent test IDs
5
- * across all orchestrator components (fixture, reporter).
6
- *
7
- * CRITICAL: All components MUST use these shared functions to ensure
8
- * test IDs match between shard assignment and runtime filtering.
9
- *
10
- * There are two contexts for test ID generation:
11
- * 1. Discovery context: Uses buildTestId from types.ts (data from Playwright JSON)
12
- * 2. Runtime context: Uses buildTestIdFromRuntime (data from testInfo.titlePath)
4
+ * Provides shared functions for generating consistent test IDs
5
+ * and converting them to Playwright's --test-list format.
13
6
  *
14
7
  * @module @nsxbet/playwright-orchestrator/core/test-id
15
8
  */
16
- import * as path from 'node:path';
9
+ const TEST_LIST_SEPARATOR = ' ';
17
10
  /**
18
- * Filter titlePath from Playwright runtime (testInfo.titlePath) to get only
19
- * describe blocks and test title.
11
+ * Convert a test entry to Playwright's --test-list format.
20
12
  *
21
- * Playwright's runtime titlePath includes:
22
- * - Project name (e.g., "chromium")
23
- * - File path or filename
24
- * - Describe block titles
25
- * - Test title
13
+ * Test-list format: `file › describe › test`
26
14
  *
27
- * This function removes non-meaningful elements to produce a clean titlePath
28
- * that matches what test-discovery produces from Playwright's JSON output.
15
+ * When testDirPrefix is provided (monorepo case where testDir != rootDir),
16
+ * the prefix is prepended to the file path so paths are relative to rootDir.
29
17
  *
30
- * @param titlePath - Raw titlePath from testInfo.titlePath or test.titlePath()
31
- * @param options - Options for filtering
32
- * @returns Filtered titlePath containing only describe blocks and test title
18
+ * @param entry - Test entry with file and titlePath from Playwright discovery
19
+ * @param testDirPrefix - Relative path from rootDir to testDir (e.g. `src/test/e2e`)
20
+ * @returns Test-list formatted string (e.g. `src/test/e2e/login.spec.ts Login should login`)
33
21
  */
34
- export function filterRuntimeTitlePath(titlePath, options = {}) {
35
- const { projectName, fileName } = options;
36
- return titlePath.filter((title) => {
37
- // Filter empty strings
38
- if (!title || title === '')
39
- return false;
40
- // Filter project name
41
- if (projectName && title === projectName)
42
- return false;
43
- // Filter filename
44
- if (fileName && title === fileName)
45
- return false;
46
- // Filter out file paths (contain / or \)
47
- if (title.includes('/') || title.includes('\\'))
48
- return false;
49
- // Filter out spec/test file extensions
50
- if (title.endsWith('.spec.ts') || title.endsWith('.test.ts'))
51
- return false;
52
- if (title.endsWith('.spec.js') || title.endsWith('.test.js'))
53
- return false;
54
- return true;
55
- });
22
+ export function toTestListFormat(entry, testDirPrefix) {
23
+ const cleanPrefix = (testDirPrefix ?? '')
24
+ .replace(/\\/g, '/')
25
+ .replace(/\/+$/, '');
26
+ const normalizedFile = entry.file.replace(/\\/g, '/');
27
+ const fullPath = cleanPrefix
28
+ ? `${cleanPrefix}/${normalizedFile}`
29
+ : normalizedFile;
30
+ return [fullPath, ...entry.titlePath].join(TEST_LIST_SEPARATOR);
56
31
  }
57
32
  /**
58
- * Build a test ID from Playwright runtime data (fixture or reporter context).
59
- *
60
- * CRITICAL: The baseDir MUST be the project's testDir (testInfo.project.testDir).
61
- * This ensures test IDs match between discovery and runtime filtering.
62
- *
63
- * This function:
64
- * 1. Converts the absolute file path to relative (using baseDir)
65
- * 2. Filters the titlePath to remove project name, filename, and file paths
66
- * 3. Joins file and filtered titles with "::"
67
- *
68
- * The resulting test ID format: {relative-file}::{describe1}::{describe2}::{testTitle}
33
+ * Convert an array of test entries to a complete test-list file content.
69
34
  *
70
- * @param filePath - Absolute path to the test file (testInfo.file or test.location.file)
71
- * @param titlePath - Raw titlePath from testInfo.titlePath or test.titlePath()
72
- * @param options - Options for path resolution and filtering (baseDir is REQUIRED)
73
- * @returns Test ID string
74
- * @throws Error if baseDir is not provided
35
+ * Each line is one test in Playwright's --test-list format, with a trailing newline.
36
+ * Returns empty string for an empty array.
75
37
  *
76
- * @example
77
- * ```typescript
78
- * const testId = buildTestIdFromRuntime(
79
- * '/project/src/test/e2e/login.spec.ts',
80
- * ['chromium', 'login.spec.ts', 'Login', 'should work'],
81
- * { projectName: 'chromium', baseDir: '/project/src/test/e2e' }
82
- * );
83
- * // Result: 'login.spec.ts::Login::should work'
84
- * ```
38
+ * @param entries - Array of test entries from Playwright discovery
39
+ * @param testDirPrefix - Relative path from rootDir to testDir
40
+ * @returns Ready-to-write test-list file content
85
41
  */
86
- export function buildTestIdFromRuntime(filePath, titlePath, options) {
87
- if (!options?.baseDir) {
88
- throw new Error('[Orchestrator] baseDir is required for test ID generation. ' +
89
- 'Use testInfo.project.testDir from Playwright. ' +
90
- 'Do NOT use process.cwd() as it causes path mismatch bugs.');
91
- }
92
- const { projectName, baseDir } = options;
93
- // Convert absolute path to relative
94
- const file = path.relative(baseDir, filePath).replace(/\\/g, '/');
95
- // Get filename for filtering
96
- const fileName = path.basename(filePath);
97
- // Filter titlePath
98
- const filteredTitles = filterRuntimeTitlePath(titlePath, {
99
- projectName,
100
- fileName,
101
- });
102
- return [file, ...filteredTitles].join('::');
42
+ export function toTestListFile(entries, testDirPrefix) {
43
+ if (entries.length === 0)
44
+ return '';
45
+ return `${entries.map((e) => toTestListFormat(e, testDirPrefix)).join('\n')}\n`;
103
46
  }
104
47
  //# sourceMappingURL=test-id.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-id.js","sourceRoot":"","sources":["../../src/core/test-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAYlC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAmB,EACnB,UAAkC,EAAE;IAEpC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,uBAAuB;QACvB,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAEzC,sBAAsB;QACtB,IAAI,WAAW,IAAI,KAAK,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAEvD,kBAAkB;QAClB,IAAI,QAAQ,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAEjD,yCAAyC;QACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAE9D,uCAAuC;QACvC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3E,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,SAAmB,EACnB,OAAuC;IAEvC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,6DAA6D;YAC3D,gDAAgD;YAChD,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEzC,oCAAoC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAElE,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,mBAAmB;IACnB,MAAM,cAAc,GAAG,sBAAsB,CAAC,SAAS,EAAE;QACvD,WAAW;QACX,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"test-id.js","sourceRoot":"","sources":["../../src/core/test-id.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAYlC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAoB,EACpB,aAAsB;IAEtB,MAAM,WAAW,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;SACtC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,GAAG,WAAW,IAAI,cAAc,EAAE;QACpC,CAAC,CAAC,cAAc,CAAC;IAEnB,OAAO,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAwB,EACxB,aAAsB;IAEtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAClF,CAAC"}
@@ -95,6 +95,8 @@ export interface TestAssignResult {
95
95
  estimatedTests: string[];
96
96
  /** Whether CKK found optimal solution (false = fell back to LPT) */
97
97
  isOptimal: boolean;
98
+ /** Map of shard index to Playwright --test-list file content (rootDir-relative paths) */
99
+ testListFiles: Record<number, string>;
98
100
  }
99
101
  /**
100
102
  * Per-shard timing artifact uploaded after test run (test-level)
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAuMA,6CAA6C;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,OAAO,EAAE,mBAAmB;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,SAAmB;IAC3D,OAAO,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IAIxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACpB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAyMA,6CAA6C;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,OAAO,EAAE,mBAAmB;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,SAAmB;IAC3D,OAAO,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IAIxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACpB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,18 +1,12 @@
1
1
  {
2
2
  "name": "@nsxbet/playwright-orchestrator",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Intelligent Playwright test distribution across CI shards using historical timing data",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "typesVersions": {
9
9
  "*": {
10
- "reporter": [
11
- "./dist/reporter.d.ts"
12
- ],
13
- "fixture": [
14
- "./dist/fixture.d.ts"
15
- ],
16
10
  "core": [
17
11
  "./dist/core/index.d.ts"
18
12
  ]
@@ -24,16 +18,6 @@
24
18
  "import": "./dist/index.js",
25
19
  "require": "./dist/index.js"
26
20
  },
27
- "./reporter": {
28
- "types": "./dist/reporter.d.ts",
29
- "import": "./dist/reporter.js",
30
- "require": "./dist/reporter.js"
31
- },
32
- "./fixture": {
33
- "types": "./dist/fixture.d.ts",
34
- "import": "./dist/fixture.js",
35
- "require": "./dist/fixture.js"
36
- },
37
21
  "./core": {
38
22
  "types": "./dist/core/index.d.ts",
39
23
  "import": "./dist/core/index.js",
@@ -99,16 +83,7 @@
99
83
  "@biomejs/biome": "2.3.11",
100
84
  "@changesets/changelog-github": "^0.5.2",
101
85
  "@changesets/cli": "^2.29.8",
102
- "@playwright/test": "^1.40.0",
103
86
  "@types/node": "22.15.29",
104
87
  "typescript": "5.9.3"
105
- },
106
- "peerDependencies": {
107
- "@playwright/test": ">=1.20.0"
108
- },
109
- "peerDependenciesMeta": {
110
- "@playwright/test": {
111
- "optional": true
112
- }
113
88
  }
114
89
  }
@@ -1,19 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class FilterReport extends Command {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- 'report-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
- 'output-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- };
10
- run(): Promise<void>;
11
- /**
12
- * Remove specs where ALL tests are orchestrator-skipped
13
- * (status "skipped" with annotation "Not in shard").
14
- * Prune empty suites after removal.
15
- */
16
- private filterSuites;
17
- private countSpecs;
18
- }
19
- //# sourceMappingURL=filter-report.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-report.d.ts","sourceRoot":"","sources":["../../src/commands/filter-report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,OAAgB,WAAW,SACyC;IAEpE,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;MAgBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC1B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA2CpB,OAAO,CAAC,UAAU;CAYnB"}
@@ -1,103 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import { Command, Flags } from '@oclif/core';
4
- export default class FilterReport extends Command {
5
- static description = 'Remove orchestrator-skipped tests from a Playwright JSON report';
6
- static examples = [
7
- '<%= config.bin %> filter-report --report-file ./results.json',
8
- '<%= config.bin %> filter-report --report-file ./merged.json --output-file ./filtered.json',
9
- ];
10
- static flags = {
11
- 'report-file': Flags.string({
12
- char: 'r',
13
- description: 'Path to Playwright JSON report file',
14
- required: true,
15
- }),
16
- 'output-file': Flags.string({
17
- char: 'o',
18
- description: 'Path to write filtered report (defaults to overwriting input)',
19
- }),
20
- verbose: Flags.boolean({
21
- char: 'v',
22
- description: 'Show verbose output',
23
- default: false,
24
- }),
25
- };
26
- async run() {
27
- const { flags } = await this.parse(FilterReport);
28
- const reportPath = path.resolve(flags['report-file']);
29
- if (!fs.existsSync(reportPath)) {
30
- this.warn(`Report file not found: ${reportPath}`);
31
- return;
32
- }
33
- let report;
34
- try {
35
- report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));
36
- }
37
- catch {
38
- this.error(`Failed to parse report: ${reportPath}`);
39
- }
40
- if (!report.suites) {
41
- this.warn('Report has no suites, nothing to filter');
42
- return;
43
- }
44
- const suites = report.suites;
45
- const beforeCount = this.countSpecs(suites);
46
- this.filterSuites(suites);
47
- const afterCount = this.countSpecs(suites);
48
- const removed = beforeCount - afterCount;
49
- const outputPath = flags['output-file']
50
- ? path.resolve(flags['output-file'])
51
- : reportPath;
52
- fs.writeFileSync(outputPath, JSON.stringify(report));
53
- if (flags.verbose || removed > 0) {
54
- this.log(`Filtered report: ${beforeCount} → ${afterCount} specs (removed ${removed} orchestrator-skipped)`);
55
- }
56
- }
57
- /**
58
- * Remove specs where ALL tests are orchestrator-skipped
59
- * (status "skipped" with annotation "Not in shard").
60
- * Prune empty suites after removal.
61
- */
62
- filterSuites(suites) {
63
- for (let i = suites.length - 1; i >= 0; i--) {
64
- const suite = suites[i];
65
- if (!suite)
66
- continue;
67
- if (Array.isArray(suite.specs)) {
68
- suite.specs = suite.specs.filter((spec) => {
69
- const tests = spec.tests;
70
- if (!tests || tests.length === 0)
71
- return true;
72
- const allOrchestratorSkipped = tests.every((test) => {
73
- const status = test.status;
74
- if (status !== 'skipped')
75
- return false;
76
- const annotations = test.annotations;
77
- return annotations?.some((a) => a.type === 'skip' && a.description === 'Not in shard');
78
- });
79
- return !allOrchestratorSkipped;
80
- });
81
- }
82
- if (Array.isArray(suite.suites)) {
83
- this.filterSuites(suite.suites);
84
- }
85
- const hasSpecs = Array.isArray(suite.specs) && suite.specs.length > 0;
86
- const hasSubSuites = Array.isArray(suite.suites) && suite.suites.length > 0;
87
- if (!hasSpecs && !hasSubSuites) {
88
- suites.splice(i, 1);
89
- }
90
- }
91
- }
92
- countSpecs(suites) {
93
- let count = 0;
94
- for (const suite of suites) {
95
- if (Array.isArray(suite.specs))
96
- count += suite.specs.length;
97
- if (Array.isArray(suite.suites))
98
- count += this.countSpecs(suite.suites);
99
- }
100
- return count;
101
- }
102
- }
103
- //# sourceMappingURL=filter-report.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-report.js","sourceRoot":"","sources":["../../src/commands/filter-report.ts"],"names":[],"mappings":"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"}
package/dist/fixture.d.ts DELETED
@@ -1,75 +0,0 @@
1
- /**
2
- * Playwright Orchestrator Fixture
3
- *
4
- * A Playwright fixture that filters tests based on a JSON shard file.
5
- * This provides actual test skipping (unlike the reporter which only adds metadata).
6
- *
7
- * Usage in your test setup file (e.g., tests/setup.ts):
8
- * ```typescript
9
- * import { test as base } from '@playwright/test';
10
- * import { withOrchestratorFilter } from '@nsxbet/playwright-orchestrator/fixture';
11
- *
12
- * // Create extended test with orchestrator filtering
13
- * export const test = withOrchestratorFilter(base);
14
- * export { expect } from '@playwright/test';
15
- * ```
16
- *
17
- * Then in your test files:
18
- * ```typescript
19
- * import { test, expect } from './setup';
20
- *
21
- * test('my test', async ({ page }) => {
22
- * // ...
23
- * });
24
- * ```
25
- *
26
- * Environment variables:
27
- * - ORCHESTRATOR_SHARD_FILE: Path to JSON file with array of test IDs
28
- * - ORCHESTRATOR_DEBUG: Set to "1" to enable debug logging
29
- *
30
- * @module @nsxbet/playwright-orchestrator/fixture
31
- */
32
- import type { TestType } from '@playwright/test';
33
- /**
34
- * Creates an extended test with orchestrator filtering as an auto-fixture.
35
- * This ensures tests not in the current shard are skipped.
36
- *
37
- * IMPORTANT: Use this function to create your test object, then export it.
38
- * All test files should import the extended test, not the base test.
39
- *
40
- * @param test - The base test object from @playwright/test
41
- * @returns Extended test with orchestrator filtering
42
- *
43
- * @example
44
- * ```typescript
45
- * // In setup.ts
46
- * import { test as base } from '@playwright/test';
47
- * import { withOrchestratorFilter } from '@nsxbet/playwright-orchestrator/fixture';
48
- *
49
- * export const test = withOrchestratorFilter(base);
50
- *
51
- * // In your.spec.ts
52
- * import { test } from './setup';
53
- * test('example', async ({ page }) => { ... });
54
- * ```
55
- */
56
- export declare function withOrchestratorFilter<T extends object, W extends object>(test: TestType<T, W>): TestType<T & {
57
- _orchestratorFilter: undefined;
58
- }, W>;
59
- /**
60
- * Check if a test should run based on the shard file.
61
- * Can be called manually in individual tests.
62
- *
63
- * @param testInfo - The testInfo object from Playwright
64
- * @returns true if the test should run, false if it should be skipped
65
- * @throws Error if project testDir is not configured
66
- */
67
- export declare function shouldRunTest(testInfo: {
68
- file: string;
69
- titlePath: string[];
70
- project: {
71
- name: string;
72
- testDir: string;
73
- };
74
- }): boolean;
75
- //# sourceMappingURL=fixture.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuDjD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EACvE,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,QAAQ,CAAC,CAAC,GAAG;IAAE,mBAAmB,EAAE,SAAS,CAAA;CAAE,EAAE,CAAC,CAAC,CAwDrD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,GAAG,OAAO,CAUV"}