velocious 1.0.667 → 1.0.668

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 (87) hide show
  1. package/README.md +27 -7
  2. package/build/configuration.js +23 -1
  3. package/build/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  4. package/build/environment-handlers/node/cli/commands/test.js +17 -69
  5. package/build/frontend-models/websocket-channel.js +18 -0
  6. package/build/http-server/client/websocket-session.js +41 -4
  7. package/build/http-server/websocket-channel.js +14 -0
  8. package/build/http-server/websocket-event-log-store.js +85 -12
  9. package/build/http-server/websocket-events-host.js +14 -6
  10. package/build/src/configuration.d.ts +18 -1
  11. package/build/src/configuration.d.ts.map +1 -1
  12. package/build/src/configuration.js +22 -2
  13. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.d.ts.map +1 -1
  14. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +3 -47
  15. package/build/src/environment-handlers/node/cli/commands/test.d.ts +2 -28
  16. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  17. package/build/src/environment-handlers/node/cli/commands/test.js +10 -61
  18. package/build/src/frontend-models/websocket-channel.d.ts +9 -0
  19. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  20. package/build/src/frontend-models/websocket-channel.js +16 -1
  21. package/build/src/http-server/client/websocket-session.d.ts +25 -2
  22. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  23. package/build/src/http-server/client/websocket-session.js +40 -5
  24. package/build/src/http-server/websocket-channel.d.ts +11 -0
  25. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  26. package/build/src/http-server/websocket-channel.js +14 -1
  27. package/build/src/http-server/websocket-event-log-store.d.ts +60 -41
  28. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  29. package/build/src/http-server/websocket-event-log-store.js +79 -12
  30. package/build/src/http-server/websocket-events-host.d.ts +10 -3
  31. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  32. package/build/src/http-server/websocket-events-host.js +14 -7
  33. package/build/src/testing/test-files-finder.d.ts +13 -116
  34. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  35. package/build/src/testing/test-files-finder.js +26 -296
  36. package/build/src/testing/test-filter-parser.d.ts +32 -22
  37. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  38. package/build/src/testing/test-filter-parser.js +25 -217
  39. package/build/src/testing/test-profile-activity.d.ts +1 -6
  40. package/build/src/testing/test-profile-activity.d.ts.map +1 -1
  41. package/build/src/testing/test-profile-activity.js +2 -12
  42. package/build/src/testing/test-profile-output.d.ts +1 -40
  43. package/build/src/testing/test-profile-output.d.ts.map +1 -1
  44. package/build/src/testing/test-profile-output.js +2 -217
  45. package/build/src/testing/test-profiler.d.ts +15 -659
  46. package/build/src/testing/test-profiler.d.ts.map +1 -1
  47. package/build/src/testing/test-profiler.js +35 -833
  48. package/build/src/testing/test-runner.d.ts +10 -1
  49. package/build/src/testing/test-runner.d.ts.map +1 -1
  50. package/build/src/testing/test-runner.js +26 -4
  51. package/build/src/testing/test-suite-splitter.d.ts +1 -128
  52. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  53. package/build/src/testing/test-suite-splitter.js +2 -259
  54. package/build/src/testing/timing-manifest.d.ts +5 -93
  55. package/build/src/testing/timing-manifest.d.ts.map +1 -1
  56. package/build/src/testing/timing-manifest.js +4 -283
  57. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
  58. package/build/src/testing/velocious-attempt-executor.js +8 -2
  59. package/build/testing/test-files-finder.js +29 -345
  60. package/build/testing/test-filter-parser.js +29 -248
  61. package/build/testing/test-profile-activity.js +1 -12
  62. package/build/testing/test-profile-output.js +8 -253
  63. package/build/testing/test-profiler.js +38 -895
  64. package/build/testing/test-runner.js +33 -9
  65. package/build/testing/test-suite-splitter.js +1 -301
  66. package/build/testing/timing-manifest.js +10 -344
  67. package/build/testing/velocious-attempt-executor.js +7 -1
  68. package/package.json +3 -3
  69. package/scripts/test-browser.js +29 -6
  70. package/scripts/verify-docker-dev-environment.js +13 -1
  71. package/src/configuration.js +23 -1
  72. package/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  73. package/src/environment-handlers/node/cli/commands/test.js +17 -69
  74. package/src/frontend-models/websocket-channel.js +18 -0
  75. package/src/http-server/client/websocket-session.js +41 -4
  76. package/src/http-server/websocket-channel.js +14 -0
  77. package/src/http-server/websocket-event-log-store.js +85 -12
  78. package/src/http-server/websocket-events-host.js +14 -6
  79. package/src/testing/test-files-finder.js +29 -345
  80. package/src/testing/test-filter-parser.js +29 -248
  81. package/src/testing/test-profile-activity.js +1 -12
  82. package/src/testing/test-profile-output.js +8 -253
  83. package/src/testing/test-profiler.js +38 -895
  84. package/src/testing/test-runner.js +33 -9
  85. package/src/testing/test-suite-splitter.js +1 -301
  86. package/src/testing/timing-manifest.js +10 -344
  87. package/src/testing/velocious-attempt-executor.js +7 -1
@@ -1,52 +1,18 @@
1
- import Logger from "../logger.js";
1
+ /** Compatibility facade for Velocious's published test-file finder path. */
2
2
  export default class TestFilesFinder {
3
3
  directory: string;
4
- logger: Logger;
5
- directories: string[];
6
- findingCount: number;
4
+ directories: string[] | undefined;
7
5
  filePattern: RegExp | undefined;
8
- processArgs: string[];
9
- /**
10
- * Narrows the runtime value to the documented type.
11
- * @type {string[]} */
12
- foundFiles: string[];
13
- /**
14
- * Narrows the runtime value to the documented type.
15
- * @type {Record<number, Promise<void>>} */
16
- findingPromises: Record<number, Promise<void>>;
17
- /**
18
- * Narrows the runtime value to the documented type.
19
- * @type {string[]} */
20
- testArgs: string[];
21
- /**
22
- * Narrows the runtime value to the documented type.
23
- * @type {string[]} */
24
- directoryArgs: string[];
25
- /**
26
- * Narrows the runtime value to the documented type.
27
- * @type {string[]} */
28
- directoryFullPaths: string[];
29
- /**
30
- * Narrows the runtime value to the documented type.
31
- * @type {string[]} */
32
- fileArgs: string[];
33
- /**
34
- * Narrows the runtime value to the documented type.
35
- * @type {string[]} */
36
- explicitFiles: string[];
37
- /**
38
- * Narrows the runtime value to the documented type.
39
- * @type {Record<string, number[]>} */
6
+ candidates: string[];
7
+ /** @type {Record<string, number[]>} */
40
8
  lineFiltersByFile: Record<string, number[]>;
41
- _argsPrepared: boolean;
42
- static IGNORED_NAMES: string[];
43
9
  /**
44
- * Runs constructor.
45
- * @param {object} args - Options object.
46
- * @param {string} args.directory - Directory path.
47
- * @param {string[]} [args.directories] - Directories.
10
+ * Creates a Velocious-compatible package discovery adapter.
11
+ * @param {object} args - Discovery options.
12
+ * @param {string} args.directory - Discovery base directory.
13
+ * @param {string[]} [args.directories] - Default directories.
48
14
  * @param {RegExp} [args.filePattern] - Test-file pattern override.
49
- * @param {string[]} args.processArgs - Process args.
15
+ * @param {string[]} args.processArgs - Process arguments including the command name.
50
16
  */
51
17
  constructor({ directory, directories, filePattern, processArgs, ...restArgs }: {
52
18
  directory: string;
@@ -55,83 +21,14 @@ export default class TestFilesFinder {
55
21
  processArgs: string[];
56
22
  });
57
23
  /**
58
- * Runs find test files.
59
- * @returns {Promise<string[]>} - Resolves with the test files.
24
+ * Discovers test files through the package implementation.
25
+ * @returns {Promise<string[]>} - Discovered absolute file paths.
60
26
  */
61
27
  findTestFiles(): Promise<string[]>;
62
28
  /**
63
- * Runs get line filters by file.
64
- * @returns {Record<string, number[]>} - Line filters by file.
29
+ * Gets candidate-derived line filters.
30
+ * @returns {Record<string, number[]>} - Line filters keyed by absolute file path.
65
31
  */
66
32
  getLineFiltersByFile(): Record<string, number[]>;
67
- /**
68
- * Runs finding promises length.
69
- * @returns {number} - The ing promises length.
70
- */
71
- findingPromisesLength(): number;
72
- waitForFindingPromises(): Promise<void>;
73
- /**
74
- * Runs wait for finding promises iteration.
75
- * @returns {Promise<void>} - Resolves when complete.
76
- */
77
- waitForFindingPromisesIteration(): Promise<void>;
78
- /**
79
- * Runs with finding count.
80
- * @param {() => Promise<void>} callback - Callback function.
81
- * @returns {Promise<void>} - Resolves when complete.
82
- */
83
- withFindingCount(callback: () => Promise<void>): Promise<void>;
84
- /**
85
- * Runs find test files in dir.
86
- * @param {string} dir - Dir.
87
- * @returns {Promise<void>} - Resolves when complete.
88
- */
89
- findTestFilesInDir(dir: string): Promise<void>;
90
- /**
91
- * Runs is file matching requirements.
92
- * @param {string} file - File.
93
- * @param {string} localPath - Local path.
94
- * @returns {boolean} - Whether file matching requirements.
95
- */
96
- isFileMatchingRequirements(file: string, localPath: string): boolean;
97
- /**
98
- * Runs looks like test file.
99
- * @param {string} file - File.
100
- * @returns {boolean} - Whether looks like test file.
101
- */
102
- looksLikeTestFile(file: string): boolean;
103
- /**
104
- * Runs prepare args.
105
- * @returns {Promise<void>} - Resolves when test args are prepared.
106
- */
107
- prepareArgs(): Promise<void>;
108
- /**
109
- * Runs add line filter.
110
- * @param {string} filePath - File path.
111
- * @param {number} line - Line number.
112
- * @returns {void} - No return value.
113
- */
114
- addLineFilter(filePath: string, line: number): void;
115
- /**
116
- * Runs split line arg.
117
- * @param {string} testArg - Test arg.
118
- * @returns {{cleanArg: string, line?: number}} - Cleaned arg and line.
119
- */
120
- splitLineArg(testArg: string): {
121
- cleanArg: string;
122
- line?: number;
123
- };
124
- /**
125
- * Runs ensure trailing slash.
126
- * @param {string} localPath - Local path.
127
- * @returns {string} - Normalized local path with trailing slash.
128
- */
129
- ensureTrailingSlash(localPath: string): string;
130
- /**
131
- * Runs to local path.
132
- * @param {string} fullPath - Full path.
133
- * @returns {string} - Local path relative to the base directory.
134
- */
135
- toLocalPath(fullPath: string): string;
136
33
  }
137
34
  //# sourceMappingURL=test-files-finder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-files-finder.d.ts","sourceRoot":"","sources":["../../../src/testing/test-files-finder.js"],"names":[],"mappings":"AAMA,OAAO,MAAM,MAAM,cAAc,CAAA;AAIjC,MAAM,CAAC,OAAO,OAAO,eAAe;IAc3B,SAAS;IACT,MAAM;IAGJ,WAAW;IASb,YAAY;IACZ,WAAW;IACX,WAAW;IAEhB;;0BAEsB;IACjB,UAAU,EADL,MAAM,EAAE;IAGlB;;+CAE2C;IACtC,eAAe,EADV,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC;;0BAEsB;IACjB,QAAQ,EADH,MAAM,EAAE;IAGlB;;0BAEsB;IACjB,aAAa,EADR,MAAM,EAAE;IAGlB;;0BAEsB;IACjB,kBAAkB,EADb,MAAM,EAAE;IAGlB;;0BAEsB;IACjB,QAAQ,EADH,MAAM,EAAE;IAGlB;;0BAEsB;IACjB,aAAa,EADR,MAAM,EAAE;IAGlB;;0CAEsC;IACjC,iBAAiB,EADZ,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAG7B,aAAa;IAtEpB,MAAM,CAAC,aAAa,WAA2B;IAE/C;;;;;;;OAOG;IACH,YAAY,EAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAC,EALxE;QAAqB,SAAS,EAAtB,MAAM,CACd;QAAwB,WAAW,AAAnC,CACA,EADQ,MAAM,EAAE,CAChB;QAAsB,WAAW,AAAjC,CACA,EADQ,MAAM,CACd;QAAuB,WAAW,EAA1B,MAAM,EAAE,CAClB;KAC0E,EA6D1E;IAED;;;OAGG;IACG,aAAa,IAFN,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B7B;IAED;;;OAGG;IACH,oBAAoB,IAFP,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAEmB;IAExD;;;OAGG;IACH,qBAAqB,IAFR,MAAM,CAEwD;IAErE,sBAAsB,kBAI3B;IAED;;;OAGG;IACG,+BAA+B,IAFxB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAHd,MAAM,OAAO,CAAC,IAAI,CAGJ,GAFZ,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;OAIG;IACG,kBAAkB,CAAC,GAAG,EAHjB,MAGiB,GAFf,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;;OAKG;IACH,0BAA0B,CAAC,IAAI,EAJpB,MAIoB,EAAE,SAAS,EAH/B,MAG+B,GAF7B,OAAO,CA2BnB;IAED;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,EAHX,MAGW,GAFT,OAAO,CAOnB;IAED;;;OAGG;IACG,WAAW,IAFJ,OAAO,CAAC,IAAI,CAAC,CA8DzB;IAED;;;;;OAKG;IACH,aAAa,CAAC,QAAQ,EAJX,MAIW,EAAE,IAAI,EAHjB,MAGiB,GAFf,IAAI,CAYhB;IAED;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAHT,MAGS,GAFP;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,CAgB7C;IAED;;;;OAIG;IACH,mBAAmB,CAAC,SAAS,EAHlB,MAGkB,GAFhB,MAAM,CAKlB;IAED;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAHT,MAGS,GAFP,MAAM,CAKlB;CACF"}
1
+ {"version":3,"file":"test-files-finder.d.ts","sourceRoot":"","sources":["../../../src/testing/test-files-finder.js"],"names":[],"mappings":"AAWA,4EAA4E;AAC5E,MAAM,CAAC,OAAO,OAAO,eAAe;IAW3B,SAAS;IACT,WAAW;IACX,WAAW;IACX,UAAU;IACf,uCAAuC;IAClC,iBAAiB,EADX,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAdrC;;;;;;;OAOG;IACH,YAAY,EAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAC,EALxE;QAAqB,SAAS,EAAtB,MAAM,CACd;QAAwB,WAAW,AAAnC,CACA,EADQ,MAAM,EAAE,CAChB;QAAsB,WAAW,AAAjC,CACA,EADQ,MAAM,CACd;QAAuB,WAAW,EAA1B,MAAM,EAAE,CAClB;KAC0E,EAW1E;IAED;;;OAGG;IACG,aAAa,IAFN,OAAO,CAAC,MAAM,EAAE,CAAC,CAS7B;IAED;;;OAGG;IACH,oBAAoB,IAFP,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAEmB;CACzD"}
@@ -1,315 +1,45 @@
1
1
  // @ts-check
2
- import fs from "fs/promises";
3
- import path from "path";
4
- import fileExists from "../utils/file-exists.js";
5
- import Logger from "../logger.js";
2
+ import { discoverTestFiles, lineFiltersFromCandidates } from "@velocious/testing/node";
6
3
  import restArgsError from "../utils/rest-args-error.js";
7
- // Incredibly complex class to find files in multiple simultanious running promises to do it as fast as possible.
4
+ const VELOCIOUS_NODE_TEST_PATTERN = /(?<!\.browser)-(?:spec|test)\.(?:m)?js$/u;
5
+ /** Compatibility facade for Velocious's published test-file finder path. */
8
6
  export default class TestFilesFinder {
9
- static IGNORED_NAMES = [".git", "node_modules"];
10
7
  /**
11
- * Runs constructor.
12
- * @param {object} args - Options object.
13
- * @param {string} args.directory - Directory path.
14
- * @param {string[]} [args.directories] - Directories.
8
+ * Creates a Velocious-compatible package discovery adapter.
9
+ * @param {object} args - Discovery options.
10
+ * @param {string} args.directory - Discovery base directory.
11
+ * @param {string[]} [args.directories] - Default directories.
15
12
  * @param {RegExp} [args.filePattern] - Test-file pattern override.
16
- * @param {string[]} args.processArgs - Process args.
13
+ * @param {string[]} args.processArgs - Process arguments including the command name.
17
14
  */
18
15
  constructor({ directory, directories, filePattern, processArgs, ...restArgs }) {
19
16
  restArgsError(restArgs);
20
- this.directory = path.resolve(directory);
21
- this.logger = new Logger(this);
22
- if (directories) {
23
- this.directories = directories.map((entry) => path.resolve(entry));
24
- }
25
- else {
26
- this.directories = [
27
- `${this.directory}/__tests__`,
28
- `${this.directory}/tests`,
29
- `${this.directory}/spec`
30
- ];
31
- }
32
- this.findingCount = 0;
17
+ this.directory = directory;
18
+ this.directories = directories;
33
19
  this.filePattern = filePattern;
34
- this.processArgs = processArgs;
35
- /**
36
- * Narrows the runtime value to the documented type.
37
- * @type {string[]} */
38
- this.foundFiles = [];
39
- /**
40
- * Narrows the runtime value to the documented type.
41
- * @type {Record<number, Promise<void>>} */
42
- this.findingPromises = {};
43
- /**
44
- * Narrows the runtime value to the documented type.
45
- * @type {string[]} */
46
- this.testArgs = this.processArgs.filter((processArg, index) => index != 0);
47
- /**
48
- * Narrows the runtime value to the documented type.
49
- * @type {string[]} */
50
- this.directoryArgs = [];
51
- /**
52
- * Narrows the runtime value to the documented type.
53
- * @type {string[]} */
54
- this.directoryFullPaths = [];
55
- /**
56
- * Narrows the runtime value to the documented type.
57
- * @type {string[]} */
58
- this.fileArgs = [];
59
- /**
60
- * Narrows the runtime value to the documented type.
61
- * @type {string[]} */
62
- this.explicitFiles = [];
63
- /**
64
- * Narrows the runtime value to the documented type.
65
- * @type {Record<string, number[]>} */
66
- this.lineFiltersByFile = {};
67
- this._argsPrepared = false;
20
+ this.candidates = processArgs.slice(1).filter((argument) => argument !== "--");
21
+ /** @type {Record<string, number[]>} */
22
+ this.lineFiltersByFile = lineFiltersFromCandidates({
23
+ cwd: directory,
24
+ candidates: this.candidates
25
+ });
68
26
  }
69
27
  /**
70
- * Runs find test files.
71
- * @returns {Promise<string[]>} - Resolves with the test files.
28
+ * Discovers test files through the package implementation.
29
+ * @returns {Promise<string[]>} - Discovered absolute file paths.
72
30
  */
73
31
  async findTestFiles() {
74
- await this.prepareArgs();
75
- if (this.explicitFiles.length > 0 && this.directoryArgs.length === 0) {
76
- return Array.from(new Set(this.explicitFiles));
77
- }
78
- await this.withFindingCount(async () => {
79
- const hasExplicitArgs = this.directoryFullPaths.length > 0 || this.fileArgs.length > 0;
80
- const directoriesToScan = hasExplicitArgs ? this.directoryFullPaths : this.directories;
81
- for (const directory of directoriesToScan) {
82
- if (await fileExists(directory)) {
83
- await this.findTestFilesInDir(directory);
84
- }
85
- }
32
+ return await discoverTestFiles({
33
+ cwd: this.directory,
34
+ candidates: this.candidates,
35
+ directories: this.directories,
36
+ filePattern: this.filePattern || VELOCIOUS_NODE_TEST_PATTERN
86
37
  });
87
- await this.waitForFindingPromises();
88
- if (this.explicitFiles.length > 0) {
89
- this.foundFiles.push(...this.explicitFiles);
90
- }
91
- return Array.from(new Set(this.foundFiles));
92
38
  }
93
39
  /**
94
- * Runs get line filters by file.
95
- * @returns {Record<string, number[]>} - Line filters by file.
40
+ * Gets candidate-derived line filters.
41
+ * @returns {Record<string, number[]>} - Line filters keyed by absolute file path.
96
42
  */
97
43
  getLineFiltersByFile() { return this.lineFiltersByFile; }
98
- /**
99
- * Runs finding promises length.
100
- * @returns {number} - The ing promises length.
101
- */
102
- findingPromisesLength() { return Object.keys(this.findingPromises).length; }
103
- async waitForFindingPromises() {
104
- while (this.findingPromisesLength() > 0) {
105
- await this.waitForFindingPromisesIteration();
106
- }
107
- }
108
- /**
109
- * Runs wait for finding promises iteration.
110
- * @returns {Promise<void>} - Resolves when complete.
111
- */
112
- async waitForFindingPromisesIteration() {
113
- const unfinishedPromises = [];
114
- for (const findingPromiseId in this.findingPromises) {
115
- const findingPromise = this.findingPromises[findingPromiseId];
116
- unfinishedPromises.push(findingPromise);
117
- }
118
- await Promise.all(unfinishedPromises);
119
- }
120
- /**
121
- * Runs with finding count.
122
- * @param {() => Promise<void>} callback - Callback function.
123
- * @returns {Promise<void>} - Resolves when complete.
124
- */
125
- withFindingCount(callback) {
126
- return new Promise((resolve) => {
127
- const findingPromise = callback();
128
- const findingCount = this.findingCount;
129
- this.findingCount += 1;
130
- this.findingPromises[findingCount] = findingPromise;
131
- findingPromise.finally(() => {
132
- delete this.findingPromises[findingCount];
133
- resolve(undefined);
134
- });
135
- });
136
- }
137
- /**
138
- * Runs find test files in dir.
139
- * @param {string} dir - Dir.
140
- * @returns {Promise<void>} - Resolves when complete.
141
- */
142
- async findTestFilesInDir(dir) {
143
- await this.withFindingCount(async () => {
144
- const files = await fs.readdir(dir);
145
- for (const file of files) {
146
- if (TestFilesFinder.IGNORED_NAMES.includes(file)) {
147
- continue;
148
- }
149
- const fullPath = `${dir}/${file}`;
150
- const localPath = fullPath.replace(`${this.directory}/`, "");
151
- const isDir = (await fs.stat(fullPath)).isDirectory();
152
- if (isDir) {
153
- this.findTestFilesInDir(fullPath);
154
- }
155
- else {
156
- if (this.isFileMatchingRequirements(file, localPath)) {
157
- this.foundFiles.push(fullPath);
158
- }
159
- }
160
- }
161
- });
162
- }
163
- /**
164
- * Runs is file matching requirements.
165
- * @param {string} file - File.
166
- * @param {string} localPath - Local path.
167
- * @returns {boolean} - Whether file matching requirements.
168
- */
169
- isFileMatchingRequirements(file, localPath) {
170
- if (this.directoryArgs.length > 0) {
171
- for (const directoryArg of this.directoryArgs) {
172
- if (localPath.startsWith(directoryArg) && this.looksLikeTestFile(file)) {
173
- this.logger.debug("Found test file because matching dir and looks like this file:", file);
174
- return true;
175
- }
176
- }
177
- }
178
- if (this.fileArgs.length > 0) {
179
- for (const fileArg of this.fileArgs) {
180
- if (fileArg == localPath) {
181
- this.logger.debug("Found test file because matching file arg:", file);
182
- return true;
183
- }
184
- }
185
- }
186
- if (this.fileArgs.length == 0 && this.directoryArgs.length == 0 && this.looksLikeTestFile(file)) {
187
- this.logger.debug("Found test file because looks like this file:", file);
188
- return true;
189
- }
190
- return false;
191
- }
192
- /**
193
- * Runs looks like test file.
194
- * @param {string} file - File.
195
- * @returns {boolean} - Whether looks like test file.
196
- */
197
- looksLikeTestFile(file) {
198
- if (this.filePattern)
199
- return Boolean(file.match(this.filePattern));
200
- return Boolean(file.match(/-(spec|test)\.(m|)js$/))
201
- && !file.match(/\.browser-(spec|test)\.(m|)js$/);
202
- }
203
- /**
204
- * Runs prepare args.
205
- * @returns {Promise<void>} - Resolves when test args are prepared.
206
- */
207
- async prepareArgs() {
208
- if (this._argsPrepared)
209
- return;
210
- for (const testArg of this.testArgs) {
211
- if (testArg === "--")
212
- continue;
213
- const { cleanArg, line } = this.splitLineArg(testArg);
214
- const forceDirectory = testArg.endsWith("/") || testArg.endsWith(path.sep);
215
- const fullPath = path.isAbsolute(cleanArg) ? cleanArg : path.resolve(this.directory, cleanArg);
216
- const baseName = path.basename(this.directory);
217
- const hasBasePrefix = cleanArg === baseName || cleanArg.startsWith(`${baseName}/`) || cleanArg.startsWith(`${baseName}${path.sep}`);
218
- const basePrefixedFullPath = (!path.isAbsolute(cleanArg) && hasBasePrefix) ? path.resolve(path.dirname(this.directory), cleanArg) : null;
219
- const fullPathCandidates = basePrefixedFullPath ? [basePrefixedFullPath] : [fullPath];
220
- if (forceDirectory) {
221
- const preferredLocalPath = this.toLocalPath(basePrefixedFullPath || fullPath);
222
- this.directoryArgs.push(this.ensureTrailingSlash(preferredLocalPath));
223
- this.directoryFullPaths.push(path.resolve(basePrefixedFullPath || fullPath));
224
- continue;
225
- }
226
- try {
227
- let stats;
228
- let resolvedFullPath;
229
- for (const candidatePath of fullPathCandidates) {
230
- try {
231
- stats = await fs.stat(candidatePath);
232
- resolvedFullPath = candidatePath;
233
- break;
234
- }
235
- catch {
236
- // Keep searching
237
- }
238
- }
239
- if (!stats || !resolvedFullPath)
240
- throw new Error("Path not found");
241
- const localPath = this.toLocalPath(resolvedFullPath);
242
- if (stats.isDirectory()) {
243
- this.directoryArgs.push(this.ensureTrailingSlash(localPath));
244
- this.directoryFullPaths.push(resolvedFullPath);
245
- }
246
- else if (stats.isFile()) {
247
- this.fileArgs.push(localPath);
248
- this.explicitFiles.push(resolvedFullPath);
249
- if (line) {
250
- this.addLineFilter(resolvedFullPath, line);
251
- }
252
- }
253
- }
254
- catch {
255
- const fallbackLocalPath = this.toLocalPath(basePrefixedFullPath || fullPath);
256
- this.fileArgs.push(fallbackLocalPath);
257
- if (line) {
258
- this.addLineFilter(basePrefixedFullPath || fullPath, line);
259
- }
260
- }
261
- }
262
- this._argsPrepared = true;
263
- }
264
- /**
265
- * Runs add line filter.
266
- * @param {string} filePath - File path.
267
- * @param {number} line - Line number.
268
- * @returns {void} - No return value.
269
- */
270
- addLineFilter(filePath, line) {
271
- const fullPath = path.resolve(filePath);
272
- if (!this.lineFiltersByFile[fullPath]) {
273
- this.lineFiltersByFile[fullPath] = [];
274
- }
275
- if (!this.lineFiltersByFile[fullPath].includes(line)) {
276
- this.lineFiltersByFile[fullPath].push(line);
277
- }
278
- }
279
- /**
280
- * Runs split line arg.
281
- * @param {string} testArg - Test arg.
282
- * @returns {{cleanArg: string, line?: number}} - Cleaned arg and line.
283
- */
284
- splitLineArg(testArg) {
285
- const match = testArg.match(/^(.*):(\d+)$/);
286
- if (!match) {
287
- return { cleanArg: testArg };
288
- }
289
- const line = Number(match[2]);
290
- if (!Number.isFinite(line)) {
291
- return { cleanArg: testArg };
292
- }
293
- return { cleanArg: match[1], line };
294
- }
295
- /**
296
- * Runs ensure trailing slash.
297
- * @param {string} localPath - Local path.
298
- * @returns {string} - Normalized local path with trailing slash.
299
- */
300
- ensureTrailingSlash(localPath) {
301
- if (localPath === "")
302
- return localPath;
303
- return localPath.endsWith("/") ? localPath : `${localPath}/`;
304
- }
305
- /**
306
- * Runs to local path.
307
- * @param {string} fullPath - Full path.
308
- * @returns {string} - Local path relative to the base directory.
309
- */
310
- toLocalPath(fullPath) {
311
- const relativePath = path.relative(this.directory, fullPath);
312
- return relativePath.split(path.sep).join("/");
313
- }
314
44
  }
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWxlcy1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy90ZXN0LWZpbGVzLWZpbmRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUV2QixPQUFPLFVBQVUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxhQUFhLE1BQU0sNkJBQTZCLENBQUE7QUFFdkQsaUhBQWlIO0FBQ2pILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZTtJQUNsQyxNQUFNLENBQUMsYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBRS9DOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ3pFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUU5QixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3BFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRztnQkFDakIsR0FBRyxJQUFJLENBQUMsU0FBUyxZQUFZO2dCQUM3QixHQUFHLElBQUksQ0FBQyxTQUFTLFFBQVE7Z0JBQ3pCLEdBQUcs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LENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IGZpbGVFeGlzdHMgZnJvbSBcIi4uL3V0aWxzL2ZpbGUtZXhpc3RzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLy8gSW5jcmVkaWJseSBjb21wbGV4IGNsYXNzIHRvIGZpbmQgZmlsZXMgaW4gbXVsdGlwbGUgc2ltdWx0YW5pb3VzIHJ1bm5pbmcgcHJvbWlzZXMgdG8gZG8gaXQgYXMgZmFzdCBhcyBwb3NzaWJsZS5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RGaWxlc0ZpbmRlciB7XG4gIHN0YXRpYyBJR05PUkVEX05BTUVTID0gW1wiLmdpdFwiLCBcIm5vZGVfbW9kdWxlc1wiXVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kaXJlY3RvcnkgLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MuZGlyZWN0b3JpZXNdIC0gRGlyZWN0b3JpZXMuXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBbYXJncy5maWxlUGF0dGVybl0gLSBUZXN0LWZpbGUgcGF0dGVybiBvdmVycmlkZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wcm9jZXNzQXJncyAtIFByb2Nlc3MgYXJncy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkaXJlY3RvcnksIGRpcmVjdG9yaWVzLCBmaWxlUGF0dGVybiwgcHJvY2Vzc0FyZ3MsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLmRpcmVjdG9yeSA9IHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG5cbiAgICBpZiAoZGlyZWN0b3JpZXMpIHtcbiAgICAgIHRoaXMuZGlyZWN0b3JpZXMgPSBkaXJlY3Rvcmllcy5tYXAoKGVudHJ5KSA9PiBwYXRoLnJlc29sdmUoZW50cnkpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpcmVjdG9yaWVzID0gW1xuICAgICAgICBgJHt0aGlzLmRpcmVjdG9yeX0vX190ZXN0c19fYCxcbiAgICAgICAgYCR7dGhpcy5kaXJlY3Rvcnl9L3Rlc3RzYCxcbiAgICAgICAgYCR7dGhpcy5kaXJlY3Rvcnl9L3NwZWNgXG4gICAgICBdXG4gICAgfVxuXG4gICAgdGhpcy5maW5kaW5nQ291bnQgPSAwXG4gICAgdGhpcy5maWxlUGF0dGVybiA9IGZpbGVQYXR0ZXJuXG4gICAgdGhpcy5wcm9jZXNzQXJncyA9IHByb2Nlc3NBcmdzXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuZm91bmRGaWxlcyA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlY29yZDxudW1iZXIsIFByb21pc2U8dm9pZD4+fSAqL1xuICAgIHRoaXMuZmluZGluZ1Byb21pc2VzID0ge31cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy50ZXN0QXJncyA9IHRoaXMucHJvY2Vzc0FyZ3MuZmlsdGVyKChwcm9jZXNzQXJnLCBpbmRleCkgPT4gaW5kZXggIT0gMClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5kaXJlY3RvcnlBcmdzID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5kaXJlY3RvcnlGdWxsUGF0aHMgPSBbXVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLmZpbGVBcmdzID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5leHBsaWNpdEZpbGVzID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyW10+fSAqL1xuICAgIHRoaXMubGluZUZpbHRlcnNCeUZpbGUgPSB7fVxuXG4gICAgdGhpcy5fYXJnc1ByZXBhcmVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZpbmQgdGVzdCBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggdGhlIHRlc3QgZmlsZXMuXG4gICAqL1xuICBhc3luYyBmaW5kVGVzdEZpbGVzKCkge1xuICAgIGF3YWl0IHRoaXMucHJlcGFyZUFyZ3MoKVxuXG4gICAgaWYgKHRoaXMuZXhwbGljaXRGaWxlcy5sZW5ndGggPiAwICYmIHRoaXMuZGlyZWN0b3J5QXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5leHBsaWNpdEZpbGVzKSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndpdGhGaW5kaW5nQ291bnQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaGFzRXhwbGljaXRBcmdzID0gdGhpcy5kaXJlY3RvcnlGdWxsUGF0aHMubGVuZ3RoID4gMCB8fCB0aGlzLmZpbGVBcmdzLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGRpcmVjdG9yaWVzVG9TY2FuID0gaGFzRXhwbGljaXRBcmdzID8gdGhpcy5kaXJlY3RvcnlGdWxsUGF0aHMgOiB0aGlzLmRpcmVjdG9yaWVzXG5cbiAgICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzVG9TY2FuKSB7XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKGRpcmVjdG9yeSkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbmRUZXN0RmlsZXNJbkRpcihkaXJlY3RvcnkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRmluZGluZ1Byb21pc2VzKClcblxuICAgIGlmICh0aGlzLmV4cGxpY2l0RmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mb3VuZEZpbGVzLnB1c2goLi4udGhpcy5leHBsaWNpdEZpbGVzKVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5mb3VuZEZpbGVzKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBsaW5lIGZpbHRlcnMgYnkgZmlsZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIG51bWJlcltdPn0gLSBMaW5lIGZpbHRlcnMgYnkgZmlsZS5cbiAgICovXG4gIGdldExpbmVGaWx0ZXJzQnlGaWxlKCkgeyByZXR1cm4gdGhpcy5saW5lRmlsdGVyc0J5RmlsZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZGluZyBwcm9taXNlcyBsZW5ndGguXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIGluZyBwcm9taXNlcyBsZW5ndGguXG4gICAqL1xuICBmaW5kaW5nUHJvbWlzZXNMZW5ndGgoKSB7IHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbmRpbmdQcm9taXNlcykubGVuZ3RoIH1cblxuICBhc3luYyB3YWl0Rm9yRmluZGluZ1Byb21pc2VzKCkge1xuICAgIHdoaWxlICh0aGlzLmZpbmRpbmdQcm9taXNlc0xlbmd0aCgpID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yRmluZGluZ1Byb21pc2VzSXRlcmF0aW9uKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3YWl0IGZvciBmaW5kaW5nIHByb21pc2VzIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JGaW5kaW5nUHJvbWlzZXNJdGVyYXRpb24oKSB7XG4gICAgY29uc3QgdW5maW5pc2hlZFByb21pc2VzID0gW11cblxuICAgIGZvciAoY29uc3QgZmluZGluZ1Byb21pc2VJZCBpbiB0aGlzLmZpbmRpbmdQcm9taXNlcykge1xuICAgICAgY29uc3QgZmluZGluZ1Byb21pc2UgPSB0aGlzLmZpbmRpbmdQcm9taXNlc1tmaW5kaW5nUHJvbWlzZUlkXVxuXG4gICAgICB1bmZpbmlzaGVkUHJvbWlzZXMucHVzaChmaW5kaW5nUHJvbWlzZSlcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh1bmZpbmlzaGVkUHJvbWlzZXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGZpbmRpbmcgY291bnQuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIHdpdGhGaW5kaW5nQ291bnQoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGZpbmRpbmdQcm9taXNlID0gY2FsbGJhY2soKVxuICAgICAgY29uc3QgZmluZGluZ0NvdW50ID0gdGhpcy5maW5kaW5nQ291bnRcblxuICAgICAgdGhpcy5maW5kaW5nQ291bnQgKz0gMVxuICAgICAgdGhpcy5maW5kaW5nUHJvbWlzZXNbZmluZGluZ0NvdW50XSA9IGZpbmRpbmdQcm9taXNlXG5cbiAgICAgIGZpbmRpbmdQcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5maW5kaW5nUHJvbWlzZXNbZmluZGluZ0NvdW50XVxuXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCB0ZXN0IGZpbGVzIGluIGRpci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpciAtIERpci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGZpbmRUZXN0RmlsZXNJbkRpcihkaXIpIHtcbiAgICBhd2FpdCB0aGlzLndpdGhGaW5kaW5nQ291bnQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChUZXN0RmlsZXNGaW5kZXIuSUdOT1JFRF9OQU1FUy5pbmNsdWRlcyhmaWxlKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGAke2Rpcn0vJHtmaWxlfWBcbiAgICAgICAgY29uc3QgbG9jYWxQYXRoID0gZnVsbFBhdGgucmVwbGFjZShgJHt0aGlzLmRpcmVjdG9yeX0vYCwgXCJcIilcbiAgICAgICAgY29uc3QgaXNEaXIgPSAoYXdhaXQgZnMuc3RhdChmdWxsUGF0aCkpLmlzRGlyZWN0b3J5KClcblxuICAgICAgICBpZiAoaXNEaXIpIHtcbiAgICAgICAgICB0aGlzLmZpbmRUZXN0RmlsZXNJbkRpcihmdWxsUGF0aClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0ZpbGVNYXRjaGluZ1JlcXVpcmVtZW50cyhmaWxlLCBsb2NhbFBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kRmlsZXMucHVzaChmdWxsUGF0aClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgZmlsZSBtYXRjaGluZyByZXF1aXJlbWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIC0gRmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIExvY2FsIHBhdGguXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZmlsZSBtYXRjaGluZyByZXF1aXJlbWVudHMuXG4gICAqL1xuICBpc0ZpbGVNYXRjaGluZ1JlcXVpcmVtZW50cyhmaWxlLCBsb2NhbFBhdGgpIHtcbiAgICBpZiAodGhpcy5kaXJlY3RvcnlBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZGlyZWN0b3J5QXJnIG9mIHRoaXMuZGlyZWN0b3J5QXJncykge1xuICAgICAgICBpZiAobG9jYWxQYXRoLnN0YXJ0c1dpdGgoZGlyZWN0b3J5QXJnKSAmJiB0aGlzLmxvb2tzTGlrZVRlc3RGaWxlKGZpbGUpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJGb3VuZCB0ZXN0IGZpbGUgYmVjYXVzZSBtYXRjaGluZyBkaXIgYW5kIGxvb2tzIGxpa2UgdGhpcyBmaWxlOlwiLCBmaWxlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWxlQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGVBcmcgb2YgdGhpcy5maWxlQXJncykge1xuICAgICAgICBpZiAoZmlsZUFyZyA9PSBsb2NhbFBhdGgpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkZvdW5kIHRlc3QgZmlsZSBiZWNhdXNlIG1hdGNoaW5nIGZpbGUgYXJnOlwiLCBmaWxlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWxlQXJncy5sZW5ndGggPT0gMCAmJiB0aGlzLmRpcmVjdG9yeUFyZ3MubGVuZ3RoID09IDAgJiYgdGhpcy5sb29rc0xpa2VUZXN0RmlsZShmaWxlKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJGb3VuZCB0ZXN0IGZpbGUgYmVjYXVzZSBsb29rcyBsaWtlIHRoaXMgZmlsZTpcIiwgZmlsZSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb29rcyBsaWtlIHRlc3QgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgLSBGaWxlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGxvb2tzIGxpa2UgdGVzdCBmaWxlLlxuICAgKi9cbiAgbG9va3NMaWtlVGVzdEZpbGUoZmlsZSkge1xuICAgIGlmICh0aGlzLmZpbGVQYXR0ZXJuKSByZXR1cm4gQm9vbGVhbihmaWxlLm1hdGNoKHRoaXMuZmlsZVBhdHRlcm4pKVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oZmlsZS5tYXRjaCgvLShzcGVjfHRlc3QpXFwuKG18KWpzJC8pKVxuICAgICAgJiYgIWZpbGUubWF0Y2goL1xcLmJyb3dzZXItKHNwZWN8dGVzdClcXC4obXwpanMkLylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByZXBhcmUgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0ZXN0IGFyZ3MgYXJlIHByZXBhcmVkLlxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZUFyZ3MoKSB7XG4gICAgaWYgKHRoaXMuX2FyZ3NQcmVwYXJlZCkgcmV0dXJuXG5cbiAgICBmb3IgKGNvbnN0IHRlc3RBcmcgb2YgdGhpcy50ZXN0QXJncykge1xuICAgICAgaWYgKHRlc3RBcmcgPT09IFwiLS1cIikgY29udGludWVcblxuICAgICAgY29uc3Qge2NsZWFuQXJnLCBsaW5lfSA9IHRoaXMuc3BsaXRMaW5lQXJnKHRlc3RBcmcpXG4gICAgICBjb25zdCBmb3JjZURpcmVjdG9yeSA9IHRlc3RBcmcuZW5kc1dpdGgoXCIvXCIpIHx8IHRlc3RBcmcuZW5kc1dpdGgocGF0aC5zZXApXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShjbGVhbkFyZykgPyBjbGVhbkFyZyA6IHBhdGgucmVzb2x2ZSh0aGlzLmRpcmVjdG9yeSwgY2xlYW5BcmcpXG4gICAgICBjb25zdCBiYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUodGhpcy5kaXJlY3RvcnkpXG4gICAgICBjb25zdCBoYXNCYXNlUHJlZml4ID0gY2xlYW5BcmcgPT09IGJhc2VOYW1lIHx8IGNsZWFuQXJnLnN0YXJ0c1dpdGgoYCR7YmFzZU5hbWV9L2ApIHx8IGNsZWFuQXJnLnN0YXJ0c1dpdGgoYCR7YmFzZU5hbWV9JHtwYXRoLnNlcH1gKVxuICAgICAgY29uc3QgYmFzZVByZWZpeGVkRnVsbFBhdGggPSAoIXBhdGguaXNBYnNvbHV0ZShjbGVhbkFyZykgJiYgaGFzQmFzZVByZWZpeCkgPyBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKHRoaXMuZGlyZWN0b3J5KSwgY2xlYW5BcmcpIDogbnVsbFxuICAgICAgY29uc3QgZnVsbFBhdGhDYW5kaWRhdGVzID0gYmFzZVByZWZpeGVkRnVsbFBhdGggPyBbYmFzZVByZWZpeGVkRnVsbFBhdGhdIDogW2Z1bGxQYXRoXVxuXG4gICAgICBpZiAoZm9yY2VEaXJlY3RvcnkpIHtcbiAgICAgICAgY29uc3QgcHJlZmVycmVkTG9jYWxQYXRoID0gdGhpcy50b0xvY2FsUGF0aChiYXNlUHJlZml4ZWRGdWxsUGF0aCB8fCBmdWxsUGF0aClcbiAgICAgICAgdGhpcy5kaXJlY3RvcnlBcmdzLnB1c2godGhpcy5lbnN1cmVUcmFpbGluZ1NsYXNoKHByZWZlcnJlZExvY2FsUGF0aCkpXG4gICAgICAgIHRoaXMuZGlyZWN0b3J5RnVsbFBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKGJhc2VQcmVmaXhlZEZ1bGxQYXRoIHx8IGZ1bGxQYXRoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHN0YXRzXG4gICAgICAgIGxldCByZXNvbHZlZEZ1bGxQYXRoXG5cbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGVQYXRoIG9mIGZ1bGxQYXRoQ2FuZGlkYXRlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgIHJlc29sdmVkRnVsbFBhdGggPSBjYW5kaWRhdGVQYXRoXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gS2VlcCBzZWFyY2hpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXRzIHx8ICFyZXNvbHZlZEZ1bGxQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG5vdCBmb3VuZFwiKVxuICAgICAgICBjb25zdCBsb2NhbFBhdGggPSB0aGlzLnRvTG9jYWxQYXRoKHJlc29sdmVkRnVsbFBhdGgpXG5cbiAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICB0aGlzLmRpcmVjdG9yeUFyZ3MucHVzaCh0aGlzLmVuc3VyZVRyYWlsaW5nU2xhc2gobG9jYWxQYXRoKSlcbiAgICAgICAgICB0aGlzLmRpcmVjdG9yeUZ1bGxQYXRocy5wdXNoKHJlc29sdmVkRnVsbFBhdGgpXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICB0aGlzLmZpbGVBcmdzLnB1c2gobG9jYWxQYXRoKVxuICAgICAgICAgIHRoaXMuZXhwbGljaXRGaWxlcy5wdXNoKHJlc29sdmVkRnVsbFBhdGgpXG5cbiAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRMaW5lRmlsdGVyKHJlc29sdmVkRnVsbFBhdGgsIGxpbmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tMb2NhbFBhdGggPSB0aGlzLnRvTG9jYWxQYXRoKGJhc2VQcmVmaXhlZEZ1bGxQYXRoIHx8IGZ1bGxQYXRoKVxuICAgICAgICB0aGlzLmZpbGVBcmdzLnB1c2goZmFsbGJhY2tMb2NhbFBhdGgpXG5cbiAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICB0aGlzLmFkZExpbmVGaWx0ZXIoYmFzZVByZWZpeGVkRnVsbFBhdGggfHwgZnVsbFBhdGgsIGxpbmUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hcmdzUHJlcGFyZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgbGluZSBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmUgLSBMaW5lIG51bWJlci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYWRkTGluZUZpbHRlcihmaWxlUGF0aCwgbGluZSkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKVxuXG4gICAgaWYgKCF0aGlzLmxpbmVGaWx0ZXJzQnlGaWxlW2Z1bGxQYXRoXSkge1xuICAgICAgdGhpcy5saW5lRmlsdGVyc0J5RmlsZVtmdWxsUGF0aF0gPSBbXVxuICAgIH1cblxuICAgIGlmICghdGhpcy5saW5lRmlsdGVyc0J5RmlsZVtmdWxsUGF0aF0uaW5jbHVkZXMobGluZSkpIHtcbiAgICAgIHRoaXMubGluZUZpbHRlcnNCeUZpbGVbZnVsbFBhdGhdLnB1c2gobGluZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGxpdCBsaW5lIGFyZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RBcmcgLSBUZXN0IGFyZy5cbiAgICogQHJldHVybnMge3tjbGVhbkFyZzogc3RyaW5nLCBsaW5lPzogbnVtYmVyfX0gLSBDbGVhbmVkIGFyZyBhbmQgbGluZS5cbiAgICovXG4gIHNwbGl0TGluZUFyZyh0ZXN0QXJnKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0ZXN0QXJnLm1hdGNoKC9eKC4qKTooXFxkKykkLylcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiB7Y2xlYW5Bcmc6IHRlc3RBcmd9XG4gICAgfVxuXG4gICAgY29uc3QgbGluZSA9IE51bWJlcihtYXRjaFsyXSlcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGxpbmUpKSB7XG4gICAgICByZXR1cm4ge2NsZWFuQXJnOiB0ZXN0QXJnfVxuICAgIH1cblxuICAgIHJldHVybiB7Y2xlYW5Bcmc6IG1hdGNoWzFdLCBsaW5lfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIHRyYWlsaW5nIHNsYXNoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gTG9jYWwgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIGxvY2FsIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaC5cbiAgICovXG4gIGVuc3VyZVRyYWlsaW5nU2xhc2gobG9jYWxQYXRoKSB7XG4gICAgaWYgKGxvY2FsUGF0aCA9PT0gXCJcIikgcmV0dXJuIGxvY2FsUGF0aFxuICAgIHJldHVybiBsb2NhbFBhdGguZW5kc1dpdGgoXCIvXCIpID8gbG9jYWxQYXRoIDogYCR7bG9jYWxQYXRofS9gXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBsb2NhbCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnVsbFBhdGggLSBGdWxsIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTG9jYWwgcGF0aCByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuXG4gICAqL1xuICB0b0xvY2FsUGF0aChmdWxsUGF0aCkge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIGZ1bGxQYXRoKVxuICAgIHJldHVybiByZWxhdGl2ZVBhdGguc3BsaXQocGF0aC5zZXApLmpvaW4oXCIvXCIpXG4gIH1cbn1cbiJdfQ==
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWxlcy1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy90ZXN0LWZpbGVzLWZpbmRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUNMLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDMUIsTUFBTSx5QkFBeUIsQ0FBQTtBQUVoQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RCxNQUFNLDJCQUEyQixHQUFHLDBDQUEwQyxDQUFBO0FBRTlFLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsT0FBTyxPQUFPLGVBQWU7SUFDbEM7Ozs7Ozs7T0FPRztJQUNILFlBQVksRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDekUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQTtRQUM5RSx1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLHlCQUF5QixDQUFDO1lBQ2pELEdBQUcsRUFBRSxTQUFTO1lBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsYUFBYTtRQUNqQixPQUFPLE1BQU0saUJBQWlCLENBQUM7WUFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksMkJBQTJCO1NBQzdELENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxvQkFBb0IsS0FBSyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQSxDQUFDLENBQUM7Q0FDekQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtcbiAgZGlzY292ZXJUZXN0RmlsZXMsXG4gIGxpbmVGaWx0ZXJzRnJvbUNhbmRpZGF0ZXNcbn0gZnJvbSBcIkB2ZWxvY2lvdXMvdGVzdGluZy9ub2RlXCJcblxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbmNvbnN0IFZFTE9DSU9VU19OT0RFX1RFU1RfUEFUVEVSTiA9IC8oPzwhXFwuYnJvd3NlciktKD86c3BlY3x0ZXN0KVxcLig/Om0pP2pzJC91XG5cbi8qKiBDb21wYXRpYmlsaXR5IGZhY2FkZSBmb3IgVmVsb2Npb3VzJ3MgcHVibGlzaGVkIHRlc3QtZmlsZSBmaW5kZXIgcGF0aC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RGaWxlc0ZpbmRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVmVsb2Npb3VzLWNvbXBhdGlibGUgcGFja2FnZSBkaXNjb3ZlcnkgYWRhcHRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBEaXNjb3Zlcnkgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyZWN0b3J5IC0gRGlzY292ZXJ5IGJhc2UgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5kaXJlY3Rvcmllc10gLSBEZWZhdWx0IGRpcmVjdG9yaWVzLlxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gW2FyZ3MuZmlsZVBhdHRlcm5dIC0gVGVzdC1maWxlIHBhdHRlcm4gb3ZlcnJpZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MucHJvY2Vzc0FyZ3MgLSBQcm9jZXNzIGFyZ3VtZW50cyBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgbmFtZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkaXJlY3RvcnksIGRpcmVjdG9yaWVzLCBmaWxlUGF0dGVybiwgcHJvY2Vzc0FyZ3MsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG4gICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3RvcnlcbiAgICB0aGlzLmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXNcbiAgICB0aGlzLmZpbGVQYXR0ZXJuID0gZmlsZVBhdHRlcm5cbiAgICB0aGlzLmNhbmRpZGF0ZXMgPSBwcm9jZXNzQXJncy5zbGljZSgxKS5maWx0ZXIoKGFyZ3VtZW50KSA9PiBhcmd1bWVudCAhPT0gXCItLVwiKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyW10+fSAqL1xuICAgIHRoaXMubGluZUZpbHRlcnNCeUZpbGUgPSBsaW5lRmlsdGVyc0Zyb21DYW5kaWRhdGVzKHtcbiAgICAgIGN3ZDogZGlyZWN0b3J5LFxuICAgICAgY2FuZGlkYXRlczogdGhpcy5jYW5kaWRhdGVzXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlcnMgdGVzdCBmaWxlcyB0aHJvdWdoIHRoZSBwYWNrYWdlIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gRGlzY292ZXJlZCBhYnNvbHV0ZSBmaWxlIHBhdGhzLlxuICAgKi9cbiAgYXN5bmMgZmluZFRlc3RGaWxlcygpIHtcbiAgICByZXR1cm4gYXdhaXQgZGlzY292ZXJUZXN0RmlsZXMoe1xuICAgICAgY3dkOiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgIGNhbmRpZGF0ZXM6IHRoaXMuY2FuZGlkYXRlcyxcbiAgICAgIGRpcmVjdG9yaWVzOiB0aGlzLmRpcmVjdG9yaWVzLFxuICAgICAgZmlsZVBhdHRlcm46IHRoaXMuZmlsZVBhdHRlcm4gfHwgVkVMT0NJT1VTX05PREVfVEVTVF9QQVRURVJOXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNhbmRpZGF0ZS1kZXJpdmVkIGxpbmUgZmlsdGVycy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIG51bWJlcltdPn0gLSBMaW5lIGZpbHRlcnMga2V5ZWQgYnkgYWJzb2x1dGUgZmlsZSBwYXRoLlxuICAgKi9cbiAgZ2V0TGluZUZpbHRlcnNCeUZpbGUoKSB7IHJldHVybiB0aGlzLmxpbmVGaWx0ZXJzQnlGaWxlIH1cbn1cbiJdfQ==
@@ -1,17 +1,4 @@
1
- /**
2
- * ParseFiltersResult type.
3
- * @typedef {object} ParseFiltersResult
4
- * @property {string[]} includeTags - Tags to include.
5
- * @property {string[]} excludeTags - Tags to exclude.
6
- * @property {string[]} examplePatterns - Example name patterns.
7
- * @property {string[]} filteredProcessArgs - Remaining process args with filter flags removed.
8
- * @property {number | undefined} groups - Total number of groups for test splitting.
9
- * @property {number | undefined} groupNumber - Which group to run (1-indexed).
10
- * @property {boolean} profile - Whether test profiling is enabled.
11
- * @property {string | undefined} profileJsonPath - Rich profile output path.
12
- * @property {string | undefined} timingManifestPath - JSON timing manifest path.
13
- * @property {string | undefined} timingManifestOutputPath - Timing manifest output path.
14
- */
1
+ import { normalizeExamplePatterns } from "@velocious/testing/node";
15
2
  export type ParseFiltersResult = {
16
3
  /**
17
4
  * - Tags to include.
@@ -26,7 +13,7 @@ export type ParseFiltersResult = {
26
13
  */
27
14
  examplePatterns: string[];
28
15
  /**
29
- * - Remaining process args with filter flags removed.
16
+ * - Remaining process args with package-owned flags removed.
30
17
  */
31
18
  filteredProcessArgs: string[];
32
19
  /**
@@ -53,17 +40,40 @@ export type ParseFiltersResult = {
53
40
  * - Timing manifest output path.
54
41
  */
55
42
  timingManifestOutputPath: string | undefined;
43
+ /**
44
+ * - Default retry count.
45
+ */
46
+ retries: number | undefined;
47
+ /**
48
+ * - Setup files imported before test files.
49
+ */
50
+ setupFiles: string[];
51
+ /**
52
+ * - Default lifecycle timeout.
53
+ */
54
+ timeoutMs: number | undefined;
56
55
  };
57
56
  /**
58
- * Runs the normalizeExamplePatterns helper.
59
- * @param {string[]} patterns - Patterns.
60
- * @returns {RegExp[]} - Normalized patterns.
57
+ * @typedef {object} ParseFiltersResult
58
+ * @property {string[]} includeTags - Tags to include.
59
+ * @property {string[]} excludeTags - Tags to exclude.
60
+ * @property {string[]} examplePatterns - Example name patterns.
61
+ * @property {string[]} filteredProcessArgs - Remaining process args with package-owned flags removed.
62
+ * @property {number | undefined} groups - Total number of groups for test splitting.
63
+ * @property {number | undefined} groupNumber - Which group to run (1-indexed).
64
+ * @property {boolean} profile - Whether test profiling is enabled.
65
+ * @property {string | undefined} profileJsonPath - Rich profile output path.
66
+ * @property {string | undefined} timingManifestPath - JSON timing manifest path.
67
+ * @property {string | undefined} timingManifestOutputPath - Timing manifest output path.
68
+ * @property {number | undefined} retries - Default retry count.
69
+ * @property {string[]} setupFiles - Setup files imported before test files.
70
+ * @property {number | undefined} timeoutMs - Default lifecycle timeout.
61
71
  */
62
- export declare function normalizeExamplePatterns(patterns: string[]): RegExp[];
72
+ export { normalizeExamplePatterns };
63
73
  /**
64
- * Runs the parseFilters helper.
65
- * @param {string[]} processArgs - Process args.
66
- * @returns {ParseFiltersResult} - Parsed tags, group options, and process args.
74
+ * Preserves the Velocious parser result while delegating package-owned option parsing.
75
+ * @param {string[]} processArgs - Raw process arguments including the command name.
76
+ * @returns {ParseFiltersResult} - Package options and downstream process arguments.
67
77
  */
68
78
  export declare function parseFilters(processArgs: string[]): ParseFiltersResult;
69
79
  //# sourceMappingURL=test-filter-parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-filter-parser.d.ts","sourceRoot":"","sources":["../../../src/testing/test-filter-parser.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAXA,YAAkB,kBAAkB,GACpC;;;;IAAqB,WAAW,EAArB,MAAM,EAAE,CACnB;;;;IAAqB,WAAW,EAArB,MAAM,EAAE,CACnB;;;;IAAqB,eAAe,EAAzB,MAAM,EAAE,CACnB;;;;IAAqB,mBAAmB,EAA7B,MAAM,EAAE,CACnB;;;;IAA+B,MAAM,EAA1B,MAAM,GAAG,SAAS,CAC7B;;;;IAA+B,WAAW,EAA/B,MAAM,GAAG,SAAS,CAC7B;;;;IAAoB,OAAO,EAAhB,OAAO,CAClB;;;;IAA+B,eAAe,EAAnC,MAAM,GAAG,SAAS,CAC7B;;;;IAA+B,kBAAkB,EAAtC,MAAM,GAAG,SAAS,CAC7B;;;;IAA+B,wBAAwB,EAA5C,MAAM,GAAG,SAAS,CAC/B;CAAA,CAAA;AAmCD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAHtC,MAAM,EAGgC,GAFpC,MAAM,EAAE,CAgBpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAH7B,MAAM,EAGuB,GAF3B,kBAAkB,CAoM9B"}
1
+ {"version":3,"file":"test-filter-parser.d.ts","sourceRoot":"","sources":["../../../src/testing/test-filter-parser.js"],"names":[],"mappings":"AAEA,OAAO,EAEL,wBAAwB,EACzB,MAAM,yBAAyB,CAAA;AAG7B,YAAkB,kBAAkB,GACpC;;;;IAAqB,WAAW,EAArB,MAAM,EAAE,CACnB;;;;IAAqB,WAAW,EAArB,MAAM,EAAE,CACnB;;;;IAAqB,eAAe,EAAzB,MAAM,EAAE,CACnB;;;;IAAqB,mBAAmB,EAA7B,MAAM,EAAE,CACnB;;;;IAA+B,MAAM,EAA1B,MAAM,GAAG,SAAS,CAC7B;;;;IAA+B,WAAW,EAA/B,MAAM,GAAG,SAAS,CAC7B;;;;IAAoB,OAAO,EAAhB,OAAO,CAClB;;;;IAA+B,eAAe,EAAnC,MAAM,GAAG,SAAS,CAC7B;;;;IAA+B,kBAAkB,EAAtC,MAAM,GAAG,SAAS,CAC7B;;;;IAA+B,wBAAwB,EAA5C,MAAM,GAAG,SAAS,CAC7B;;;;IAA+B,OAAO,EAA3B,MAAM,GAAG,SAAS,CAC7B;;;;IAAqB,UAAU,EAApB,MAAM,EAAE,CACnB;;;;IAA+B,SAAS,EAA7B,MAAM,GAAG,SAAS,CAC/B;CAAA,CAAA;AAfD;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,wBAAwB,EAAE,CAAA;AAEnC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAH7B,MAAM,EAGuB,GAF3B,kBAAkB,CAoB9B"}