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.
- package/README.md +27 -7
- package/build/configuration.js +23 -1
- package/build/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
- package/build/environment-handlers/node/cli/commands/test.js +17 -69
- package/build/frontend-models/websocket-channel.js +18 -0
- package/build/http-server/client/websocket-session.js +41 -4
- package/build/http-server/websocket-channel.js +14 -0
- package/build/http-server/websocket-event-log-store.js +85 -12
- package/build/http-server/websocket-events-host.js +14 -6
- package/build/src/configuration.d.ts +18 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +22 -2
- package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +3 -47
- package/build/src/environment-handlers/node/cli/commands/test.d.ts +2 -28
- package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/test.js +10 -61
- package/build/src/frontend-models/websocket-channel.d.ts +9 -0
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +16 -1
- package/build/src/http-server/client/websocket-session.d.ts +25 -2
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +40 -5
- package/build/src/http-server/websocket-channel.d.ts +11 -0
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +14 -1
- package/build/src/http-server/websocket-event-log-store.d.ts +60 -41
- package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
- package/build/src/http-server/websocket-event-log-store.js +79 -12
- package/build/src/http-server/websocket-events-host.d.ts +10 -3
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +14 -7
- package/build/src/testing/test-files-finder.d.ts +13 -116
- package/build/src/testing/test-files-finder.d.ts.map +1 -1
- package/build/src/testing/test-files-finder.js +26 -296
- package/build/src/testing/test-filter-parser.d.ts +32 -22
- package/build/src/testing/test-filter-parser.d.ts.map +1 -1
- package/build/src/testing/test-filter-parser.js +25 -217
- package/build/src/testing/test-profile-activity.d.ts +1 -6
- package/build/src/testing/test-profile-activity.d.ts.map +1 -1
- package/build/src/testing/test-profile-activity.js +2 -12
- package/build/src/testing/test-profile-output.d.ts +1 -40
- package/build/src/testing/test-profile-output.d.ts.map +1 -1
- package/build/src/testing/test-profile-output.js +2 -217
- package/build/src/testing/test-profiler.d.ts +15 -659
- package/build/src/testing/test-profiler.d.ts.map +1 -1
- package/build/src/testing/test-profiler.js +35 -833
- package/build/src/testing/test-runner.d.ts +10 -1
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +26 -4
- package/build/src/testing/test-suite-splitter.d.ts +1 -128
- package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
- package/build/src/testing/test-suite-splitter.js +2 -259
- package/build/src/testing/timing-manifest.d.ts +5 -93
- package/build/src/testing/timing-manifest.d.ts.map +1 -1
- package/build/src/testing/timing-manifest.js +4 -283
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
- package/build/src/testing/velocious-attempt-executor.js +8 -2
- package/build/testing/test-files-finder.js +29 -345
- package/build/testing/test-filter-parser.js +29 -248
- package/build/testing/test-profile-activity.js +1 -12
- package/build/testing/test-profile-output.js +8 -253
- package/build/testing/test-profiler.js +38 -895
- package/build/testing/test-runner.js +33 -9
- package/build/testing/test-suite-splitter.js +1 -301
- package/build/testing/timing-manifest.js +10 -344
- package/build/testing/velocious-attempt-executor.js +7 -1
- package/package.json +3 -3
- package/scripts/test-browser.js +29 -6
- package/scripts/verify-docker-dev-environment.js +13 -1
- package/src/configuration.js +23 -1
- package/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
- package/src/environment-handlers/node/cli/commands/test.js +17 -69
- package/src/frontend-models/websocket-channel.js +18 -0
- package/src/http-server/client/websocket-session.js +41 -4
- package/src/http-server/websocket-channel.js +14 -0
- package/src/http-server/websocket-event-log-store.js +85 -12
- package/src/http-server/websocket-events-host.js +14 -6
- package/src/testing/test-files-finder.js +29 -345
- package/src/testing/test-filter-parser.js +29 -248
- package/src/testing/test-profile-activity.js +1 -12
- package/src/testing/test-profile-output.js +8 -253
- package/src/testing/test-profiler.js +38 -895
- package/src/testing/test-runner.js +33 -9
- package/src/testing/test-suite-splitter.js +1 -301
- package/src/testing/timing-manifest.js +10 -344
- package/src/testing/velocious-attempt-executor.js +7 -1
|
@@ -1,52 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
/** Compatibility facade for Velocious's published test-file finder path. */
|
|
2
2
|
export default class TestFilesFinder {
|
|
3
3
|
directory: string;
|
|
4
|
-
|
|
5
|
-
directories: string[];
|
|
6
|
-
findingCount: number;
|
|
4
|
+
directories: string[] | undefined;
|
|
7
5
|
filePattern: RegExp | undefined;
|
|
8
|
-
|
|
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
|
-
*
|
|
45
|
-
* @param {object} args -
|
|
46
|
-
* @param {string} args.directory -
|
|
47
|
-
* @param {string[]} [args.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
|
|
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
|
-
*
|
|
59
|
-
* @returns {Promise<string[]>} -
|
|
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
|
-
*
|
|
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":"
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
12
|
-
* @param {object} args -
|
|
13
|
-
* @param {string} args.directory -
|
|
14
|
-
* @param {string[]} [args.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
|
|
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 =
|
|
21
|
-
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.
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
*
|
|
71
|
-
* @returns {Promise<string[]>} -
|
|
28
|
+
* Discovers test files through the package implementation.
|
|
29
|
+
* @returns {Promise<string[]>} - Discovered absolute file paths.
|
|
72
30
|
*/
|
|
73
31
|
async findTestFiles() {
|
|
74
|
-
await
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
*
|
|
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
|
|
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
|
-
*
|
|
59
|
-
* @
|
|
60
|
-
* @
|
|
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
|
|
72
|
+
export { normalizeExamplePatterns };
|
|
63
73
|
/**
|
|
64
|
-
*
|
|
65
|
-
* @param {string[]} processArgs -
|
|
66
|
-
* @returns {ParseFiltersResult} -
|
|
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":"
|
|
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"}
|