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,235 +1,43 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { extractTestCliArguments, normalizeExamplePatterns } from "@velocious/testing/node";
|
|
1
3
|
/**
|
|
2
|
-
* ParseFiltersResult type.
|
|
3
4
|
* @typedef {object} ParseFiltersResult
|
|
4
5
|
* @property {string[]} includeTags - Tags to include.
|
|
5
6
|
* @property {string[]} excludeTags - Tags to exclude.
|
|
6
7
|
* @property {string[]} examplePatterns - Example name patterns.
|
|
7
|
-
* @property {string[]} filteredProcessArgs - Remaining process args with
|
|
8
|
+
* @property {string[]} filteredProcessArgs - Remaining process args with package-owned flags removed.
|
|
8
9
|
* @property {number | undefined} groups - Total number of groups for test splitting.
|
|
9
10
|
* @property {number | undefined} groupNumber - Which group to run (1-indexed).
|
|
10
11
|
* @property {boolean} profile - Whether test profiling is enabled.
|
|
11
12
|
* @property {string | undefined} profileJsonPath - Rich profile output path.
|
|
12
13
|
* @property {string | undefined} timingManifestPath - JSON timing manifest path.
|
|
13
14
|
* @property {string | undefined} timingManifestOutputPath - Timing manifest output path.
|
|
15
|
+
* @property {number | undefined} retries - Default retry count.
|
|
16
|
+
* @property {string[]} setupFiles - Setup files imported before test files.
|
|
17
|
+
* @property {number | undefined} timeoutMs - Default lifecycle timeout.
|
|
14
18
|
*/
|
|
15
|
-
|
|
16
|
-
const INCLUDE_TAG_FLAGS = new Set(["--tag", "--include-tag", "-t"]);
|
|
17
|
-
const EXCLUDE_TAG_FLAGS = new Set(["--exclude-tag", "--skip-tag", "-x"]);
|
|
18
|
-
const EXAMPLE_FLAGS = new Set(["--example", "--name", "-e"]);
|
|
19
|
-
const GROUPS_FLAGS = new Set(["--groups"]);
|
|
20
|
-
const GROUP_NUMBER_FLAGS = new Set(["--group-number"]);
|
|
21
|
-
const TIMING_MANIFEST_FLAGS = new Set(["--timing-manifest"]);
|
|
22
|
-
const PROFILE_JSON_FLAGS = new Set(["--profile-json"]);
|
|
23
|
-
const TIMING_MANIFEST_OUTPUT_FLAGS = new Set(["--timing-manifest-output"]);
|
|
24
|
-
/**
|
|
25
|
-
* Runs split tags.
|
|
26
|
-
* @param {string | undefined} value - Tag argument value.
|
|
27
|
-
* @returns {string[]} - Tags list.
|
|
28
|
-
*/
|
|
29
|
-
function splitTags(value) {
|
|
30
|
-
if (!value)
|
|
31
|
-
return [];
|
|
32
|
-
return value
|
|
33
|
-
.split(",")
|
|
34
|
-
.map((tag) => tag.trim())
|
|
35
|
-
.filter(Boolean);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Runs escape reg exp.
|
|
39
|
-
* @param {string} value - Value.
|
|
40
|
-
* @returns {string} - Escaped value for regex.
|
|
41
|
-
*/
|
|
42
|
-
function escapeRegExp(value) {
|
|
43
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Runs the normalizeExamplePatterns helper.
|
|
47
|
-
* @param {string[]} patterns - Patterns.
|
|
48
|
-
* @returns {RegExp[]} - Normalized patterns.
|
|
49
|
-
*/
|
|
50
|
-
export function normalizeExamplePatterns(patterns) {
|
|
51
|
-
const normalized = [];
|
|
52
|
-
for (const pattern of patterns) {
|
|
53
|
-
const regexMatch = pattern.match(/^\/(.+)\/([gimsuy]*)$/);
|
|
54
|
-
if (regexMatch) {
|
|
55
|
-
normalized.push(new RegExp(regexMatch[1], regexMatch[2]));
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
normalized.push(new RegExp(escapeRegExp(pattern)));
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return normalized;
|
|
62
|
-
}
|
|
19
|
+
export { normalizeExamplePatterns };
|
|
63
20
|
/**
|
|
64
|
-
*
|
|
65
|
-
* @param {string[]} processArgs -
|
|
66
|
-
* @returns {ParseFiltersResult} -
|
|
21
|
+
* Preserves the Velocious parser result while delegating package-owned option parsing.
|
|
22
|
+
* @param {string[]} processArgs - Raw process arguments including the command name.
|
|
23
|
+
* @returns {ParseFiltersResult} - Package options and downstream process arguments.
|
|
67
24
|
*/
|
|
68
25
|
export function parseFilters(processArgs) {
|
|
69
|
-
const
|
|
70
|
-
const excludeTags = [];
|
|
71
|
-
const filteredProcessArgs = processArgs.length > 0 ? [processArgs[0]] : [];
|
|
72
|
-
const examplePatterns = [];
|
|
73
|
-
/**
|
|
74
|
-
* Defines groups.
|
|
75
|
-
* @type {number | undefined} */
|
|
76
|
-
let groups;
|
|
77
|
-
/**
|
|
78
|
-
* Defines groupNumber.
|
|
79
|
-
* @type {number | undefined} */
|
|
80
|
-
let groupNumber;
|
|
81
|
-
let profile = false;
|
|
82
|
-
/** @type {string | undefined} */
|
|
83
|
-
let profileJsonPath;
|
|
84
|
-
/** @type {string | undefined} */
|
|
85
|
-
let timingManifestPath;
|
|
86
|
-
/** @type {string | undefined} */
|
|
87
|
-
let timingManifestOutputPath;
|
|
88
|
-
let inRestArgs = false;
|
|
89
|
-
for (let i = 1; i < processArgs.length; i++) {
|
|
90
|
-
const arg = processArgs[i];
|
|
91
|
-
if (arg === "--") {
|
|
92
|
-
inRestArgs = true;
|
|
93
|
-
filteredProcessArgs.push(arg);
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (!inRestArgs) {
|
|
97
|
-
if (INCLUDE_TAG_FLAGS.has(arg)) {
|
|
98
|
-
const nextValue = processArgs[i + 1];
|
|
99
|
-
if (nextValue && !nextValue.startsWith("-")) {
|
|
100
|
-
includeTags.push(...splitTags(nextValue));
|
|
101
|
-
i++;
|
|
102
|
-
}
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
if (EXCLUDE_TAG_FLAGS.has(arg)) {
|
|
106
|
-
const nextValue = processArgs[i + 1];
|
|
107
|
-
if (nextValue && !nextValue.startsWith("-")) {
|
|
108
|
-
excludeTags.push(...splitTags(nextValue));
|
|
109
|
-
i++;
|
|
110
|
-
}
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
if (arg.startsWith("--tag=")) {
|
|
114
|
-
includeTags.push(...splitTags(arg.slice("--tag=".length)));
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
if (arg.startsWith("--include-tag=")) {
|
|
118
|
-
includeTags.push(...splitTags(arg.slice("--include-tag=".length)));
|
|
119
|
-
continue;
|
|
120
|
-
}
|
|
121
|
-
if (arg.startsWith("--exclude-tag=")) {
|
|
122
|
-
excludeTags.push(...splitTags(arg.slice("--exclude-tag=".length)));
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
if (arg.startsWith("--skip-tag=")) {
|
|
126
|
-
excludeTags.push(...splitTags(arg.slice("--skip-tag=".length)));
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
if (EXAMPLE_FLAGS.has(arg)) {
|
|
130
|
-
const nextValue = processArgs[i + 1];
|
|
131
|
-
if (nextValue && !nextValue.startsWith("-")) {
|
|
132
|
-
examplePatterns.push(nextValue);
|
|
133
|
-
i++;
|
|
134
|
-
}
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
if (arg.startsWith("--example=")) {
|
|
138
|
-
examplePatterns.push(arg.slice("--example=".length));
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (arg.startsWith("--name=")) {
|
|
142
|
-
examplePatterns.push(arg.slice("--name=".length));
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
if (GROUPS_FLAGS.has(arg)) {
|
|
146
|
-
const nextValue = processArgs[i + 1];
|
|
147
|
-
if (nextValue && !nextValue.startsWith("-")) {
|
|
148
|
-
groups = parseInt(nextValue, 10);
|
|
149
|
-
i++;
|
|
150
|
-
}
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
if (arg.startsWith("--groups=")) {
|
|
154
|
-
groups = parseInt(arg.slice("--groups=".length), 10);
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
if (GROUP_NUMBER_FLAGS.has(arg)) {
|
|
158
|
-
const nextValue = processArgs[i + 1];
|
|
159
|
-
if (nextValue && !nextValue.startsWith("-")) {
|
|
160
|
-
groupNumber = parseInt(nextValue, 10);
|
|
161
|
-
i++;
|
|
162
|
-
}
|
|
163
|
-
continue;
|
|
164
|
-
}
|
|
165
|
-
if (arg.startsWith("--group-number=")) {
|
|
166
|
-
groupNumber = parseInt(arg.slice("--group-number=".length), 10);
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
if (TIMING_MANIFEST_FLAGS.has(arg)) {
|
|
170
|
-
const nextValue = processArgs[i + 1];
|
|
171
|
-
if (!nextValue || nextValue.startsWith("-"))
|
|
172
|
-
throw new Error("--timing-manifest requires a path");
|
|
173
|
-
timingManifestPath = nextValue;
|
|
174
|
-
i++;
|
|
175
|
-
continue;
|
|
176
|
-
}
|
|
177
|
-
if (arg.startsWith("--timing-manifest=")) {
|
|
178
|
-
timingManifestPath = arg.slice("--timing-manifest=".length);
|
|
179
|
-
if (!timingManifestPath)
|
|
180
|
-
throw new Error("--timing-manifest requires a path");
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
if (arg === "--profile") {
|
|
184
|
-
profile = true;
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
if (PROFILE_JSON_FLAGS.has(arg)) {
|
|
188
|
-
const nextValue = processArgs[i + 1];
|
|
189
|
-
if (!nextValue || nextValue.startsWith("-"))
|
|
190
|
-
throw new Error("--profile-json requires a path");
|
|
191
|
-
profileJsonPath = nextValue;
|
|
192
|
-
profile = true;
|
|
193
|
-
i++;
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (arg.startsWith("--profile-json=")) {
|
|
197
|
-
profileJsonPath = arg.slice("--profile-json=".length);
|
|
198
|
-
if (!profileJsonPath)
|
|
199
|
-
throw new Error("--profile-json requires a path");
|
|
200
|
-
profile = true;
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
|
-
if (TIMING_MANIFEST_OUTPUT_FLAGS.has(arg)) {
|
|
204
|
-
const nextValue = processArgs[i + 1];
|
|
205
|
-
if (!nextValue || nextValue.startsWith("-"))
|
|
206
|
-
throw new Error("--timing-manifest-output requires a path");
|
|
207
|
-
timingManifestOutputPath = nextValue;
|
|
208
|
-
profile = true;
|
|
209
|
-
i++;
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
if (arg.startsWith("--timing-manifest-output=")) {
|
|
213
|
-
timingManifestOutputPath = arg.slice("--timing-manifest-output=".length);
|
|
214
|
-
if (!timingManifestOutputPath)
|
|
215
|
-
throw new Error("--timing-manifest-output requires a path");
|
|
216
|
-
profile = true;
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
filteredProcessArgs.push(arg);
|
|
221
|
-
}
|
|
26
|
+
const { options, remainingArguments } = extractTestCliArguments(processArgs);
|
|
222
27
|
return {
|
|
223
|
-
includeTags:
|
|
224
|
-
excludeTags:
|
|
225
|
-
examplePatterns,
|
|
226
|
-
filteredProcessArgs,
|
|
227
|
-
groups,
|
|
228
|
-
groupNumber,
|
|
229
|
-
profile,
|
|
230
|
-
profileJsonPath,
|
|
231
|
-
timingManifestPath,
|
|
232
|
-
timingManifestOutputPath
|
|
28
|
+
includeTags: options.includeTags,
|
|
29
|
+
excludeTags: options.excludeTags,
|
|
30
|
+
examplePatterns: options.examples,
|
|
31
|
+
filteredProcessArgs: remainingArguments,
|
|
32
|
+
groups: options.groups,
|
|
33
|
+
groupNumber: options.groupNumber,
|
|
34
|
+
profile: options.profile === true,
|
|
35
|
+
profileJsonPath: options.profileJsonPath,
|
|
36
|
+
timingManifestPath: options.timingManifestPath,
|
|
37
|
+
timingManifestOutputPath: options.timingManifestOutputPath,
|
|
38
|
+
retries: options.retries,
|
|
39
|
+
setupFiles: options.setupFiles,
|
|
40
|
+
timeoutMs: options.timeoutMs
|
|
233
41
|
};
|
|
234
42
|
}
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWx0ZXItcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGVzdC1maWx0ZXItcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxZQUFZO0FBRVosTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUNuRSxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ3hFLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBO0FBQ3RELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUE7QUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtBQUN0RCxNQUFNLDRCQUE0QixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFBO0FBRTFFOzs7O0dBSUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxLQUFLO0lBQ3RCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFckIsT0FBTyxLQUFLO1NBQ1QsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMs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QUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUE7Z0JBQ3hHLHdCQUF3QixHQUFHLFNBQVMsQ0FBQTtnQkFDcEMsT0FBTyxHQUFHLElBQUksQ0FBQTtnQkFDZCxDQUFDLEVBQUUsQ0FBQTtnQkFDSCxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELHdCQUF3QixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ3hFLElBQUksQ0FBQyx3QkFBd0I7b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO2dCQUMxRixPQUFPLEdBQUcsSUFBSSxDQUFBO2dCQUNkLFNBQVE7WUFDVixDQUFDO1FBQ0gsQ0FBQztRQUVELG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLGVBQWU7UUFDZixtQkFBbUI7UUFDbkIsTUFBTTtRQUNOLFdBQVc7UUFDWCxPQUFPO1FBQ1AsZUFBZTtRQUNmLGtCQUFrQjtRQUNsQix3QkFBd0I7S0FDekIsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlRmlsdGVyc1Jlc3VsdCB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyc2VGaWx0ZXJzUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBpbmNsdWRlVGFncyAtIFRhZ3MgdG8gaW5jbHVkZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGV4Y2x1ZGVUYWdzIC0gVGFncyB0byBleGNsdWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZXhhbXBsZVBhdHRlcm5zIC0gRXhhbXBsZSBuYW1lIHBhdHRlcm5zLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZmlsdGVyZWRQcm9jZXNzQXJncyAtIFJlbWFpbmluZyBwcm9jZXNzIGFyZ3Mgd2l0aCBmaWx0ZXIgZmxhZ3MgcmVtb3ZlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBncm91cHMgLSBUb3RhbCBudW1iZXIgb2YgZ3JvdXBzIGZvciB0ZXN0IHNwbGl0dGluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBncm91cE51bWJlciAtIFdoaWNoIGdyb3VwIHRvIHJ1biAoMS1pbmRleGVkKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJvZmlsZSAtIFdoZXRoZXIgdGVzdCBwcm9maWxpbmcgaXMgZW5hYmxlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBwcm9maWxlSnNvblBhdGggLSBSaWNoIHByb2ZpbGUgb3V0cHV0IHBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gdGltaW5nTWFuaWZlc3RQYXRoIC0gSlNPTiB0aW1pbmcgbWFuaWZlc3QgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGggLSBUaW1pbmcgbWFuaWZlc3Qgb3V0cHV0IHBhdGguXG4gKi9cbi8vIEB0cy1jaGVja1xuXG5jb25zdCBJTkNMVURFX1RBR19GTEFHUyA9IG5ldyBTZXQoW1wiLS10YWdcIiwgXCItLWluY2x1ZGUtdGFnXCIsIFwiLXRcIl0pXG5jb25zdCBFWENMVURFX1RBR19GTEFHUyA9IG5ldyBTZXQoW1wiLS1leGNsdWRlLXRhZ1wiLCBcIi0tc2tpcC10YWdcIiwgXCIteFwiXSlcbmNvbnN0IEVYQU1QTEVfRkxBR1MgPSBuZXcgU2V0KFtcIi0tZXhhbXBsZVwiLCBcIi0tbmFtZVwiLCBcIi1lXCJdKVxuY29uc3QgR1JPVVBTX0ZMQUdTID0gbmV3IFNldChbXCItLWdyb3Vwc1wiXSlcbmNvbnN0IEdST1VQX05VTUJFUl9GTEFHUyA9IG5ldyBTZXQoW1wiLS1ncm91cC1udW1iZXJcIl0pXG5jb25zdCBUSU1JTkdfTUFOSUZFU1RfRkxBR1MgPSBuZXcgU2V0KFtcIi0tdGltaW5nLW1hbmlmZXN0XCJdKVxuY29uc3QgUFJPRklMRV9KU09OX0ZMQUdTID0gbmV3IFNldChbXCItLXByb2ZpbGUtanNvblwiXSlcbmNvbnN0IFRJTUlOR19NQU5JRkVTVF9PVVRQVVRfRkxBR1MgPSBuZXcgU2V0KFtcIi0tdGltaW5nLW1hbmlmZXN0LW91dHB1dFwiXSlcblxuLyoqXG4gKiBSdW5zIHNwbGl0IHRhZ3MuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUYWcgYXJndW1lbnQgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVGFncyBsaXN0LlxuICovXG5mdW5jdGlvbiBzcGxpdFRhZ3ModmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdXG5cbiAgcmV0dXJuIHZhbHVlXG4gICAgLnNwbGl0KFwiLFwiKVxuICAgIC5tYXAoKHRhZykgPT4gdGFnLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG59XG5cbi8qKlxuICogUnVucyBlc2NhcGUgcmVnIGV4cC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBFc2NhcGVkIHZhbHVlIGZvciByZWdleC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIilcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBub3JtYWxpemVFeGFtcGxlUGF0dGVybnMgaGVscGVyLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0dGVybnMgLSBQYXR0ZXJucy5cbiAqIEByZXR1cm5zIHtSZWdFeHBbXX0gLSBOb3JtYWxpemVkIHBhdHRlcm5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zKHBhdHRlcm5zKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGNvbnN0IHJlZ2V4TWF0Y2ggPSBwYXR0ZXJuLm1hdGNoKC9eXFwvKC4rKVxcLyhbZ2ltc3V5XSopJC8pXG5cbiAgICBpZiAocmVnZXhNYXRjaCkge1xuICAgICAgbm9ybWFsaXplZC5wdXNoKG5ldyBSZWdFeHAocmVnZXhNYXRjaFsxXSwgcmVnZXhNYXRjaFsyXSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZWQucHVzaChuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChwYXR0ZXJuKSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBwYXJzZUZpbHRlcnMgaGVscGVyLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvY2Vzc0FyZ3MgLSBQcm9jZXNzIGFyZ3MuXG4gKiBAcmV0dXJucyB7UGFyc2VGaWx0ZXJzUmVzdWx0fSAtIFBhcnNlZCB0YWdzLCBncm91cCBvcHRpb25zLCBhbmQgcHJvY2VzcyBhcmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWx0ZXJzKHByb2Nlc3NBcmdzKSB7XG4gIGNvbnN0IGluY2x1ZGVUYWdzID0gW11cbiAgY29uc3QgZXhjbHVkZVRhZ3MgPSBbXVxuICBjb25zdCBmaWx0ZXJlZFByb2Nlc3NBcmdzID0gcHJvY2Vzc0FyZ3MubGVuZ3RoID4gMCA/IFtwcm9jZXNzQXJnc1swXV0gOiBbXVxuICBjb25zdCBleGFtcGxlUGF0dGVybnMgPSBbXVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGdyb3Vwcy5cbiAgICogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGdyb3Vwc1xuICAvKipcbiAgICogRGVmaW5lcyBncm91cE51bWJlci5cbiAgICogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGdyb3VwTnVtYmVyXG4gIGxldCBwcm9maWxlID0gZmFsc2VcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCBwcm9maWxlSnNvblBhdGhcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCB0aW1pbmdNYW5pZmVzdFBhdGhcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGhcblxuICBsZXQgaW5SZXN0QXJncyA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9jZXNzQXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IHByb2Nlc3NBcmdzW2ldXG5cbiAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgIGluUmVzdEFyZ3MgPSB0cnVlXG4gICAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzLnB1c2goYXJnKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWluUmVzdEFyZ3MpIHtcbiAgICAgIGlmIChJTkNMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChFWENMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBleGNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tdGFnPVwiKSkge1xuICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhhcmcuc2xpY2UoXCItLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1pbmNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1pbmNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1leGNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1leGNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1za2lwLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1za2lwLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKEVYQU1QTEVfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2gobmV4dFZhbHVlKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZXhhbXBsZT1cIikpIHtcbiAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2goYXJnLnNsaWNlKFwiLS1leGFtcGxlPVwiLmxlbmd0aCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tbmFtZT1cIikpIHtcbiAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2goYXJnLnNsaWNlKFwiLS1uYW1lPVwiLmxlbmd0aCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChHUk9VUFNfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZ3JvdXBzID0gcGFyc2VJbnQobmV4dFZhbHVlLCAxMClcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLWdyb3Vwcz1cIikpIHtcbiAgICAgICAgZ3JvdXBzID0gcGFyc2VJbnQoYXJnLnNsaWNlKFwiLS1ncm91cHM9XCIubGVuZ3RoKSwgMTApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChHUk9VUF9OVU1CRVJfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZ3JvdXBOdW1iZXIgPSBwYXJzZUludChuZXh0VmFsdWUsIDEwKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZ3JvdXAtbnVtYmVyPVwiKSkge1xuICAgICAgICBncm91cE51bWJlciA9IHBhcnNlSW50KGFyZy5zbGljZShcIi0tZ3JvdXAtbnVtYmVyPVwiLmxlbmd0aCksIDEwKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoVElNSU5HX01BTklGRVNUX0ZMQUdTLmhhcyhhcmcpKSB7XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IHByb2Nlc3NBcmdzW2kgKyAxXVxuXG4gICAgICAgIGlmICghbmV4dFZhbHVlIHx8IG5leHRWYWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkgdGhyb3cgbmV3IEVycm9yKFwiLS10aW1pbmctbWFuaWZlc3QgcmVxdWlyZXMgYSBwYXRoXCIpXG4gICAgICAgIHRpbWluZ01hbmlmZXN0UGF0aCA9IG5leHRWYWx1ZVxuICAgICAgICBpKytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS10aW1pbmctbWFuaWZlc3Q9XCIpKSB7XG4gICAgICAgIHRpbWluZ01hbmlmZXN0UGF0aCA9IGFyZy5zbGljZShcIi0tdGltaW5nLW1hbmlmZXN0PVwiLmxlbmd0aClcbiAgICAgICAgaWYgKCF0aW1pbmdNYW5pZmVzdFBhdGgpIHRocm93IG5ldyBFcnJvcihcIi0tdGltaW5nLW1hbmlmZXN0IHJlcXVpcmVzIGEgcGF0aFwiKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnID09PSBcIi0tcHJvZmlsZVwiKSB7XG4gICAgICAgIHByb2ZpbGUgPSB0cnVlXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChQUk9GSUxFX0pTT05fRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKCFuZXh0VmFsdWUgfHwgbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB0aHJvdyBuZXcgRXJyb3IoXCItLXByb2ZpbGUtanNvbiByZXF1aXJlcyBhIHBhdGhcIilcbiAgICAgICAgcHJvZmlsZUpzb25QYXRoID0gbmV4dFZhbHVlXG4gICAgICAgIHByb2ZpbGUgPSB0cnVlXG4gICAgICAgIGkrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLXByb2ZpbGUtanNvbj1cIikpIHtcbiAgICAgICAgcHJvZmlsZUpzb25QYXRoID0gYXJnLnNsaWNlKFwiLS1wcm9maWxlLWpzb249XCIubGVuZ3RoKVxuICAgICAgICBpZiAoIXByb2ZpbGVKc29uUGF0aCkgdGhyb3cgbmV3IEVycm9yKFwiLS1wcm9maWxlLWpzb24gcmVxdWlyZXMgYSBwYXRoXCIpXG4gICAgICAgIHByb2ZpbGUgPSB0cnVlXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChUSU1JTkdfTUFOSUZFU1RfT1VUUFVUX0ZMQUdTLmhhcyhhcmcpKSB7XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IHByb2Nlc3NBcmdzW2kgKyAxXVxuXG4gICAgICAgIGlmICghbmV4dFZhbHVlIHx8IG5leHRWYWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkgdGhyb3cgbmV3IEVycm9yKFwiLS10aW1pbmctbWFuaWZlc3Qtb3V0cHV0IHJlcXVpcmVzIGEgcGF0aFwiKVxuICAgICAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGggPSBuZXh0VmFsdWVcbiAgICAgICAgcHJvZmlsZSA9IHRydWVcbiAgICAgICAgaSsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tdGltaW5nLW1hbmlmZXN0LW91dHB1dD1cIikpIHtcbiAgICAgICAgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoID0gYXJnLnNsaWNlKFwiLS10aW1pbmctbWFuaWZlc3Qtb3V0cHV0PVwiLmxlbmd0aClcbiAgICAgICAgaWYgKCF0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGgpIHRocm93IG5ldyBFcnJvcihcIi0tdGltaW5nLW1hbmlmZXN0LW91dHB1dCByZXF1aXJlcyBhIHBhdGhcIilcbiAgICAgICAgcHJvZmlsZSA9IHRydWVcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzLnB1c2goYXJnKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbmNsdWRlVGFnczogQXJyYXkuZnJvbShuZXcgU2V0KGluY2x1ZGVUYWdzKSksXG4gICAgZXhjbHVkZVRhZ3M6IEFycmF5LmZyb20obmV3IFNldChleGNsdWRlVGFncykpLFxuICAgIGV4YW1wbGVQYXR0ZXJucyxcbiAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzLFxuICAgIGdyb3VwcyxcbiAgICBncm91cE51bWJlcixcbiAgICBwcm9maWxlLFxuICAgIHByb2ZpbGVKc29uUGF0aCxcbiAgICB0aW1pbmdNYW5pZmVzdFBhdGgsXG4gICAgdGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoXG4gIH1cbn1cbiJdfQ==
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWx0ZXItcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGVzdC1maWx0ZXItcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN6QixNQUFNLHlCQUF5QixDQUFBO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxDQUFBO0FBRW5DOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQVc7SUFDdEMsTUFBTSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxHQUFHLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRTFFLE9BQU87UUFDTCxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLGVBQWUsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUNqQyxtQkFBbUIsRUFBRSxrQkFBa0I7UUFDdkMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJO1FBQ2pDLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtRQUN4QyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1FBQzlDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyx3QkFBd0I7UUFDMUQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7S0FDN0IsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtcbiAgZXh0cmFjdFRlc3RDbGlBcmd1bWVudHMsXG4gIG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJuc1xufSBmcm9tIFwiQHZlbG9jaW91cy90ZXN0aW5nL25vZGVcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcnNlRmlsdGVyc1Jlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gaW5jbHVkZVRhZ3MgLSBUYWdzIHRvIGluY2x1ZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBleGNsdWRlVGFncyAtIFRhZ3MgdG8gZXhjbHVkZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGV4YW1wbGVQYXR0ZXJucyAtIEV4YW1wbGUgbmFtZSBwYXR0ZXJucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZpbHRlcmVkUHJvY2Vzc0FyZ3MgLSBSZW1haW5pbmcgcHJvY2VzcyBhcmdzIHdpdGggcGFja2FnZS1vd25lZCBmbGFncyByZW1vdmVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IGdyb3VwcyAtIFRvdGFsIG51bWJlciBvZiBncm91cHMgZm9yIHRlc3Qgc3BsaXR0aW5nLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IGdyb3VwTnVtYmVyIC0gV2hpY2ggZ3JvdXAgdG8gcnVuICgxLWluZGV4ZWQpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBwcm9maWxlIC0gV2hldGhlciB0ZXN0IHByb2ZpbGluZyBpcyBlbmFibGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IHByb2ZpbGVKc29uUGF0aCAtIFJpY2ggcHJvZmlsZSBvdXRwdXQgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB0aW1pbmdNYW5pZmVzdFBhdGggLSBKU09OIHRpbWluZyBtYW5pZmVzdCBwYXRoLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCAtIFRpbWluZyBtYW5pZmVzdCBvdXRwdXQgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSByZXRyaWVzIC0gRGVmYXVsdCByZXRyeSBjb3VudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHNldHVwRmlsZXMgLSBTZXR1cCBmaWxlcyBpbXBvcnRlZCBiZWZvcmUgdGVzdCBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSB0aW1lb3V0TXMgLSBEZWZhdWx0IGxpZmVjeWNsZSB0aW1lb3V0LlxuICovXG5cbmV4cG9ydCB7IG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucyB9XG5cbi8qKlxuICogUHJlc2VydmVzIHRoZSBWZWxvY2lvdXMgcGFyc2VyIHJlc3VsdCB3aGlsZSBkZWxlZ2F0aW5nIHBhY2thZ2Utb3duZWQgb3B0aW9uIHBhcnNpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9jZXNzQXJncyAtIFJhdyBwcm9jZXNzIGFyZ3VtZW50cyBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgbmFtZS5cbiAqIEByZXR1cm5zIHtQYXJzZUZpbHRlcnNSZXN1bHR9IC0gUGFja2FnZSBvcHRpb25zIGFuZCBkb3duc3RyZWFtIHByb2Nlc3MgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWx0ZXJzKHByb2Nlc3NBcmdzKSB7XG4gIGNvbnN0IHtvcHRpb25zLCByZW1haW5pbmdBcmd1bWVudHN9ID0gZXh0cmFjdFRlc3RDbGlBcmd1bWVudHMocHJvY2Vzc0FyZ3MpXG5cbiAgcmV0dXJuIHtcbiAgICBpbmNsdWRlVGFnczogb3B0aW9ucy5pbmNsdWRlVGFncyxcbiAgICBleGNsdWRlVGFnczogb3B0aW9ucy5leGNsdWRlVGFncyxcbiAgICBleGFtcGxlUGF0dGVybnM6IG9wdGlvbnMuZXhhbXBsZXMsXG4gICAgZmlsdGVyZWRQcm9jZXNzQXJnczogcmVtYWluaW5nQXJndW1lbnRzLFxuICAgIGdyb3Vwczogb3B0aW9ucy5ncm91cHMsXG4gICAgZ3JvdXBOdW1iZXI6IG9wdGlvbnMuZ3JvdXBOdW1iZXIsXG4gICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlID09PSB0cnVlLFxuICAgIHByb2ZpbGVKc29uUGF0aDogb3B0aW9ucy5wcm9maWxlSnNvblBhdGgsXG4gICAgdGltaW5nTWFuaWZlc3RQYXRoOiBvcHRpb25zLnRpbWluZ01hbmlmZXN0UGF0aCxcbiAgICB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGg6IG9wdGlvbnMudGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoLFxuICAgIHJldHJpZXM6IG9wdGlvbnMucmV0cmllcyxcbiAgICBzZXR1cEZpbGVzOiBvcHRpb25zLnNldHVwRmlsZXMsXG4gICAgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNc1xuICB9XG59XG4iXX0=
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Validates a low-cardinality activity label suitable for profile output.
|
|
3
|
-
* @param {string} name - Activity name.
|
|
4
|
-
* @returns {string} - Validated name.
|
|
5
|
-
*/
|
|
6
|
-
export declare function validateTestActivityName(name: string): string;
|
|
1
|
+
export { validateTestActivityName } from "@velocious/testing/profiling";
|
|
7
2
|
//# sourceMappingURL=test-profile-activity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-profile-activity.d.ts","sourceRoot":"","sources":["../../../src/testing/test-profile-activity.js"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"test-profile-activity.d.ts","sourceRoot":"","sources":["../../../src/testing/test-profile-activity.js"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA"}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* @param {string} name - Activity name.
|
|
5
|
-
* @returns {string} - Validated name.
|
|
6
|
-
*/
|
|
7
|
-
export function validateTestActivityName(name) {
|
|
8
|
-
if (typeof name !== "string" || !/^[a-z][a-z0-9]*(?:[._:-][a-z0-9]+)*$/.test(name) || name.length > 64) {
|
|
9
|
-
throw new Error("Test profile activity name must be a lowercase identifier of at most 64 characters");
|
|
10
|
-
}
|
|
11
|
-
return name;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1wcm9maWxlLWFjdGl2aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGVzdC1wcm9maWxlLWFjdGl2aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQUk7SUFDM0MsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUN2RyxNQUFNLElBQUksS0FBSyxDQUFDLG9GQUFvRixDQUFDLENBQUE7SUFDdkcsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGxvdy1jYXJkaW5hbGl0eSBhY3Rpdml0eSBsYWJlbCBzdWl0YWJsZSBmb3IgcHJvZmlsZSBvdXRwdXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEFjdGl2aXR5IG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFZhbGlkYXRlZCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUZXN0QWN0aXZpdHlOYW1lKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiIHx8ICEvXlthLXpdW2EtejAtOV0qKD86Wy5fOi1dW2EtejAtOV0rKSokLy50ZXN0KG5hbWUpIHx8IG5hbWUubGVuZ3RoID4gNjQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUZXN0IHByb2ZpbGUgYWN0aXZpdHkgbmFtZSBtdXN0IGJlIGEgbG93ZXJjYXNlIGlkZW50aWZpZXIgb2YgYXQgbW9zdCA2NCBjaGFyYWN0ZXJzXCIpXG4gIH1cblxuICByZXR1cm4gbmFtZVxufVxuIl19
|
|
2
|
+
export { validateTestActivityName } from "@velocious/testing/profiling";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1wcm9maWxlLWFjdGl2aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGVzdC1wcm9maWxlLWFjdGl2aXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5leHBvcnQgeyB2YWxpZGF0ZVRlc3RBY3Rpdml0eU5hbWUgfSBmcm9tIFwiQHZlbG9jaW91cy90ZXN0aW5nL3Byb2ZpbGluZ1wiXG4iXX0=
|
|
@@ -1,41 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Creates a sorted plain timing manifest.
|
|
3
|
-
* @param {ReturnType<typeof JSON.parse>} profile - Rich profile document.
|
|
4
|
-
* @returns {Record<string, number>} - Sorted file-duration map.
|
|
5
|
-
*/
|
|
6
|
-
export declare function timingManifestFromProfile(profile: ReturnType<typeof JSON.parse>): Record<string, number>;
|
|
7
|
-
/**
|
|
8
|
-
* Atomically writes a canonical splitter-compatible timing manifest.
|
|
9
|
-
* @param {object} args - Output arguments.
|
|
10
|
-
* @param {string} args.outputPath - Final output path.
|
|
11
|
-
* @param {Record<string, number>} args.timingManifest - Validated or candidate timing manifest.
|
|
12
|
-
* @returns {Promise<void>} - Resolves after atomic replacement.
|
|
13
|
-
*/
|
|
14
|
-
export declare function writeTimingManifest({ outputPath, timingManifest }: {
|
|
15
|
-
outputPath: string;
|
|
16
|
-
timingManifest: Record<string, number>;
|
|
17
|
-
}): Promise<void>;
|
|
18
|
-
/**
|
|
19
|
-
* Atomically writes requested test profile outputs.
|
|
20
|
-
* @param {object} args - Output options.
|
|
21
|
-
* @param {ReturnType<typeof JSON.parse>} args.profile - Rich profile document.
|
|
22
|
-
* @param {string} [args.profileJsonPath] - Rich JSON path.
|
|
23
|
-
* @param {string} [args.timingManifestOutputPath] - Plain timing manifest path.
|
|
24
|
-
* @returns {Promise<void>} - Resolves after all requested writes.
|
|
25
|
-
*/
|
|
26
|
-
export declare function writeTestProfileOutputs({ profile, profileJsonPath, timingManifestOutputPath }: {
|
|
27
|
-
profile: ReturnType<typeof JSON.parse>;
|
|
28
|
-
profileJsonPath?: string;
|
|
29
|
-
timingManifestOutputPath?: string;
|
|
30
|
-
}): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Formats a compact Benchmark-style console summary.
|
|
33
|
-
* @param {ReturnType<typeof JSON.parse>} profile - Rich profile document.
|
|
34
|
-
* @param {{profileJsonPath?: string, timingManifestOutputPath?: string}} [outputs] - Written output paths.
|
|
35
|
-
* @returns {string} - Console summary.
|
|
36
|
-
*/
|
|
37
|
-
export declare function formatTestProfileSummary(profile: ReturnType<typeof JSON.parse>, outputs?: {
|
|
38
|
-
profileJsonPath?: string;
|
|
39
|
-
timingManifestOutputPath?: string;
|
|
40
|
-
}): string;
|
|
1
|
+
export { formatTestProfileSummary, loadTimingManifest, resolveTestProfileOptions, timingManifestFromProfile, writeTestProfileOutputs, writeTimingManifest } from "@velocious/testing/node";
|
|
41
2
|
//# sourceMappingURL=test-profile-output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-profile-output.d.ts","sourceRoot":"","sources":["../../../src/testing/test-profile-output.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-profile-output.d.ts","sourceRoot":"","sources":["../../../src/testing/test-profile-output.js"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,yBAAyB,CAAA"}
|
|
@@ -1,218 +1,3 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { roundProfileDuration } from "./test-profiler.js";
|
|
5
|
-
import { validateTimingManifest } from "./timing-manifest.js";
|
|
6
|
-
const FORBIDDEN_PROFILE_FIELDS = new Set([
|
|
7
|
-
"bind",
|
|
8
|
-
"binds",
|
|
9
|
-
"checkoutname",
|
|
10
|
-
"credential",
|
|
11
|
-
"credentials",
|
|
12
|
-
"databasename",
|
|
13
|
-
"error",
|
|
14
|
-
"host",
|
|
15
|
-
"password",
|
|
16
|
-
"reusekey",
|
|
17
|
-
"sql",
|
|
18
|
-
"stack",
|
|
19
|
-
"tenant",
|
|
20
|
-
"username"
|
|
21
|
-
]);
|
|
22
|
-
const PHASE_ORDER = [
|
|
23
|
-
"discovery",
|
|
24
|
-
"imports",
|
|
25
|
-
"testing config/global setup",
|
|
26
|
-
"beforeAll",
|
|
27
|
-
"beforeEach",
|
|
28
|
-
"test body",
|
|
29
|
-
"afterEach",
|
|
30
|
-
"afterAll",
|
|
31
|
-
"custom",
|
|
32
|
-
"runner overhead",
|
|
33
|
-
"total"
|
|
34
|
-
];
|
|
35
|
-
let atomicWriteSequence = 0;
|
|
36
|
-
/**
|
|
37
|
-
* Recursively rejects fields that are forbidden from rich profile output.
|
|
38
|
-
* @param {ReturnType<typeof JSON.parse>} value - Profile value.
|
|
39
|
-
* @param {string} [pathName] - Diagnostic field path.
|
|
40
|
-
* @returns {void}
|
|
41
|
-
*/
|
|
42
|
-
function assertProfilePrivacy(value, pathName = "profile") {
|
|
43
|
-
if (!value || typeof value !== "object")
|
|
44
|
-
return;
|
|
45
|
-
if (Array.isArray(value)) {
|
|
46
|
-
for (let index = 0; index < value.length; index++) {
|
|
47
|
-
assertProfilePrivacy(value[index], `${pathName}[${index}]`);
|
|
48
|
-
}
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
for (const [key, childValue] of Object.entries(value)) {
|
|
52
|
-
if (FORBIDDEN_PROFILE_FIELDS.has(key.toLowerCase())) {
|
|
53
|
-
throw new Error(`Forbidden profile field: ${pathName}.${key}`);
|
|
54
|
-
}
|
|
55
|
-
assertProfilePrivacy(childValue, `${pathName}.${key}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Recursively rounds duration fields and rejects invalid duration values.
|
|
60
|
-
* @param {ReturnType<typeof JSON.parse>} value - Profile value.
|
|
61
|
-
* @param {string | undefined} [parentKey] - Parent field name.
|
|
62
|
-
* @returns {void}
|
|
63
|
-
*/
|
|
64
|
-
function normalizeDurations(value, parentKey) {
|
|
65
|
-
if (!value || typeof value !== "object")
|
|
66
|
-
return;
|
|
67
|
-
if (Array.isArray(value)) {
|
|
68
|
-
for (const childValue of value)
|
|
69
|
-
normalizeDurations(childValue, parentKey);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
for (const [key, childValue] of Object.entries(value)) {
|
|
73
|
-
const durationField = key.endsWith("Ms") || parentKey === "cpuMs";
|
|
74
|
-
if (durationField && typeof childValue === "number") {
|
|
75
|
-
if (typeof childValue !== "number" || !Number.isFinite(childValue) || childValue < 0) {
|
|
76
|
-
throw new Error(`Invalid test profile duration field: ${key}`);
|
|
77
|
-
}
|
|
78
|
-
value[key] = roundProfileDuration(childValue);
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
if (key.endsWith("Ms") && key !== "cpuMs") {
|
|
82
|
-
throw new Error(`Invalid test profile duration field: ${key}`);
|
|
83
|
-
}
|
|
84
|
-
normalizeDurations(childValue, key);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Returns a normalized JSON-safe rich profile.
|
|
89
|
-
* @param {ReturnType<typeof JSON.parse>} profile - Rich profile document.
|
|
90
|
-
* @returns {ReturnType<typeof JSON.parse>} - Normalized document.
|
|
91
|
-
*/
|
|
92
|
-
function normalizedProfile(profile) {
|
|
93
|
-
if (profile?.schema !== "velocious.test-profile" || profile?.schemaVersion !== 1) {
|
|
94
|
-
throw new Error("Invalid Velocious test profile schema");
|
|
95
|
-
}
|
|
96
|
-
assertProfilePrivacy(profile);
|
|
97
|
-
const normalized = JSON.parse(JSON.stringify(profile));
|
|
98
|
-
normalizeDurations(normalized);
|
|
99
|
-
return normalized;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Writes text through a same-directory temporary file and atomic rename.
|
|
103
|
-
* @param {string} outputPath - Final output path.
|
|
104
|
-
* @param {string} content - Complete output content.
|
|
105
|
-
* @returns {Promise<void>} - Resolves after rename.
|
|
106
|
-
*/
|
|
107
|
-
async function atomicWrite(outputPath, content) {
|
|
108
|
-
const directory = path.dirname(outputPath);
|
|
109
|
-
const sequence = ++atomicWriteSequence;
|
|
110
|
-
const temporaryPath = path.join(directory, `.${path.basename(outputPath)}.${process.pid}.${sequence}.tmp`);
|
|
111
|
-
let temporaryFileCreated = false;
|
|
112
|
-
await fs.mkdir(directory, { recursive: true });
|
|
113
|
-
try {
|
|
114
|
-
await fs.writeFile(temporaryPath, content, { encoding: "utf8", flag: "wx" });
|
|
115
|
-
temporaryFileCreated = true;
|
|
116
|
-
await fs.rename(temporaryPath, outputPath);
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
if (temporaryFileCreated) {
|
|
120
|
-
try {
|
|
121
|
-
await fs.unlink(temporaryPath);
|
|
122
|
-
}
|
|
123
|
-
catch (cleanupError) {
|
|
124
|
-
if (!(cleanupError instanceof Error) || !("code" in cleanupError) || cleanupError.code !== "ENOENT") {
|
|
125
|
-
throw new AggregateError([error, cleanupError], `Failed to write and clean up test profile output: ${outputPath}`, { cause: cleanupError });
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
throw error;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Creates a sorted plain timing manifest.
|
|
134
|
-
* @param {ReturnType<typeof JSON.parse>} profile - Rich profile document.
|
|
135
|
-
* @returns {Record<string, number>} - Sorted file-duration map.
|
|
136
|
-
*/
|
|
137
|
-
export function timingManifestFromProfile(profile) {
|
|
138
|
-
/** @type {Record<string, number>} */
|
|
139
|
-
const manifest = {};
|
|
140
|
-
const validatedManifest = validateTimingManifest(profile.timingManifest || {}, { source: "Test profile timing manifest" });
|
|
141
|
-
for (const [filePath, durationMs] of Object.entries(validatedManifest)) {
|
|
142
|
-
manifest[filePath] = roundProfileDuration(durationMs);
|
|
143
|
-
}
|
|
144
|
-
return manifest;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Atomically writes a canonical splitter-compatible timing manifest.
|
|
148
|
-
* @param {object} args - Output arguments.
|
|
149
|
-
* @param {string} args.outputPath - Final output path.
|
|
150
|
-
* @param {Record<string, number>} args.timingManifest - Validated or candidate timing manifest.
|
|
151
|
-
* @returns {Promise<void>} - Resolves after atomic replacement.
|
|
152
|
-
*/
|
|
153
|
-
export async function writeTimingManifest({ outputPath, timingManifest }) {
|
|
154
|
-
const normalized = validateTimingManifest(timingManifest);
|
|
155
|
-
/** @type {Record<string, number>} */
|
|
156
|
-
const rounded = {};
|
|
157
|
-
for (const [filePath, durationMs] of Object.entries(normalized)) {
|
|
158
|
-
rounded[filePath] = roundProfileDuration(durationMs);
|
|
159
|
-
}
|
|
160
|
-
await atomicWrite(outputPath, `${JSON.stringify(rounded, null, 2)}\n`);
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Atomically writes requested test profile outputs.
|
|
164
|
-
* @param {object} args - Output options.
|
|
165
|
-
* @param {ReturnType<typeof JSON.parse>} args.profile - Rich profile document.
|
|
166
|
-
* @param {string} [args.profileJsonPath] - Rich JSON path.
|
|
167
|
-
* @param {string} [args.timingManifestOutputPath] - Plain timing manifest path.
|
|
168
|
-
* @returns {Promise<void>} - Resolves after all requested writes.
|
|
169
|
-
*/
|
|
170
|
-
export async function writeTestProfileOutputs({ profile, profileJsonPath, timingManifestOutputPath }) {
|
|
171
|
-
const normalized = normalizedProfile(profile);
|
|
172
|
-
const timingManifest = timingManifestFromProfile(normalized);
|
|
173
|
-
normalized.timingManifest = timingManifest;
|
|
174
|
-
if (profileJsonPath) {
|
|
175
|
-
await atomicWrite(profileJsonPath, `${JSON.stringify(normalized, null, 2)}\n`);
|
|
176
|
-
}
|
|
177
|
-
if (timingManifestOutputPath) {
|
|
178
|
-
await writeTimingManifest({ outputPath: timingManifestOutputPath, timingManifest });
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Formats a compact Benchmark-style console summary.
|
|
183
|
-
* @param {ReturnType<typeof JSON.parse>} profile - Rich profile document.
|
|
184
|
-
* @param {{profileJsonPath?: string, timingManifestOutputPath?: string}} [outputs] - Written output paths.
|
|
185
|
-
* @returns {string} - Console summary.
|
|
186
|
-
*/
|
|
187
|
-
export function formatTestProfileSummary(profile, outputs = {}) {
|
|
188
|
-
const lines = [
|
|
189
|
-
"Test profile",
|
|
190
|
-
"Phase".padEnd(31) + "Count".padStart(5) + "Real ms".padStart(13) + "CPU ms".padStart(13)
|
|
191
|
-
];
|
|
192
|
-
for (const phase of PHASE_ORDER) {
|
|
193
|
-
const aggregate = profile.phases?.[phase];
|
|
194
|
-
if (!aggregate)
|
|
195
|
-
continue;
|
|
196
|
-
lines.push(phase.padEnd(31) +
|
|
197
|
-
String(aggregate.count).padStart(5) +
|
|
198
|
-
aggregate.totalMs.toFixed(3).padStart(13) +
|
|
199
|
-
aggregate.cpuMs.total.toFixed(3).padStart(13));
|
|
200
|
-
}
|
|
201
|
-
if (profile.pools?.length > 0) {
|
|
202
|
-
lines.push("Pools");
|
|
203
|
-
for (const pool of profile.pools) {
|
|
204
|
-
lines.push(`Pool ${pool.identifier}: created=${pool.connectionCreation.count}` +
|
|
205
|
-
` failed=${pool.connectionCreation.failedCount}` +
|
|
206
|
-
` wait=${pool.checkoutWait.count}/${pool.checkoutWait.totalMs.toFixed(3)}ms` +
|
|
207
|
-
` timeouts=${pool.checkoutTimeoutCount}` +
|
|
208
|
-
` reaped=${pool.idleReap.disposalCount}` +
|
|
209
|
-
` peak=${pool.peakLiveConnections}`);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
if (outputs.profileJsonPath)
|
|
213
|
-
lines.push(`Rich JSON: ${outputs.profileJsonPath}`);
|
|
214
|
-
if (outputs.timingManifestOutputPath)
|
|
215
|
-
lines.push(`Timing manifest: ${outputs.timingManifestOutputPath}`);
|
|
216
|
-
return lines.join("\n");
|
|
217
|
-
}
|
|
218
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1wcm9maWxlLW91dHB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QtcHJvZmlsZS1vdXRwdXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUU3RCxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3ZDLE1BQU07SUFDTixPQUFPO0lBQ1AsY0FBYztJQUNkLFlBQVk7SUFDWixhQUFhO0lBQ2IsY0FBYztJQUNkLE9BQU87SUFDUCxNQUFNO0lBQ04sVUFBVTtJQUNWLFVBQVU7SUFDVixLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0NBQ1gsQ0FBQyxDQUFBO0FBQ0YsTUFBTSxXQUFXLEdBQUc7SUFDbEIsV0FBVztJQUNYLFNBQVM7SUFDVCw2QkFBNkI7SUFDN0IsV0FBVztJQUNYLFlBQVk7SUFDWixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsaUJBQWlCO0lBQ2pCLE9BQU87Q0FDUixDQUFBO0FBQ0QsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUE7QUFFM0I7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsU0FBUztJQUN2RCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFNO0lBRS9DLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLENB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d0IsRUFBRSxDQUFDLENBQUE7SUFFeEcsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgcm91bmRQcm9maWxlRHVyYXRpb24gfSBmcm9tIFwiLi90ZXN0LXByb2ZpbGVyLmpzXCJcbmltcG9ydCB7IHZhbGlkYXRlVGltaW5nTWFuaWZlc3QgfSBmcm9tIFwiLi90aW1pbmctbWFuaWZlc3QuanNcIlxuXG5jb25zdCBGT1JCSURERU5fUFJPRklMRV9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgXCJiaW5kXCIsXG4gIFwiYmluZHNcIixcbiAgXCJjaGVja291dG5hbWVcIixcbiAgXCJjcmVkZW50aWFsXCIsXG4gIFwiY3JlZGVudGlhbHNcIixcbiAgXCJkYXRhYmFzZW5hbWVcIixcbiAgXCJlcnJvclwiLFxuICBcImhvc3RcIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInJldXNla2V5XCIsXG4gIFwic3FsXCIsXG4gIFwic3RhY2tcIixcbiAgXCJ0ZW5hbnRcIixcbiAgXCJ1c2VybmFtZVwiXG5dKVxuY29uc3QgUEhBU0VfT1JERVIgPSBbXG4gIFwiZGlzY292ZXJ5XCIsXG4gIFwiaW1wb3J0c1wiLFxuICBcInRlc3RpbmcgY29uZmlnL2dsb2JhbCBzZXR1cFwiLFxuICBcImJlZm9yZUFsbFwiLFxuICBcImJlZm9yZUVhY2hcIixcbiAgXCJ0ZXN0IGJvZHlcIixcbiAgXCJhZnRlckVhY2hcIixcbiAgXCJhZnRlckFsbFwiLFxuICBcImN1c3RvbVwiLFxuICBcInJ1bm5lciBvdmVyaGVhZFwiLFxuICBcInRvdGFsXCJcbl1cbmxldCBhdG9taWNXcml0ZVNlcXVlbmNlID0gMFxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHJlamVjdHMgZmllbGRzIHRoYXQgYXJlIGZvcmJpZGRlbiBmcm9tIHJpY2ggcHJvZmlsZSBvdXRwdXQuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFByb2ZpbGUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhOYW1lXSAtIERpYWdub3N0aWMgZmllbGQgcGF0aC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRQcm9maWxlUHJpdmFjeSh2YWx1ZSwgcGF0aE5hbWUgPSBcInByb2ZpbGVcIikge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZhbHVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgYXNzZXJ0UHJvZmlsZVByaXZhY3kodmFsdWVbaW5kZXhdLCBgJHtwYXRoTmFtZX1bJHtpbmRleH1dYClcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChGT1JCSURERU5fUFJPRklMRV9GSUVMRFMuaGFzKGtleS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3JiaWRkZW4gcHJvZmlsZSBmaWVsZDogJHtwYXRoTmFtZX0uJHtrZXl9YClcbiAgICB9XG5cbiAgICBhc3NlcnRQcm9maWxlUHJpdmFjeShjaGlsZFZhbHVlLCBgJHtwYXRoTmFtZX0uJHtrZXl9YClcbiAgfVxufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHJvdW5kcyBkdXJhdGlvbiBmaWVsZHMgYW5kIHJlamVjdHMgaW52YWxpZCBkdXJhdGlvbiB2YWx1ZXMuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFByb2ZpbGUgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW3BhcmVudEtleV0gLSBQYXJlbnQgZmllbGQgbmFtZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEdXJhdGlvbnModmFsdWUsIHBhcmVudEtleSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZFZhbHVlIG9mIHZhbHVlKSBub3JtYWxpemVEdXJhdGlvbnMoY2hpbGRWYWx1ZSwgcGFyZW50S2V5KVxuICAgIHJldHVyblxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICBjb25zdCBkdXJhdGlvbkZpZWxkID0ga2V5LmVuZHNXaXRoKFwiTXNcIikgfHwgcGFyZW50S2V5ID09PSBcImNwdU1zXCJcblxuICAgIGlmIChkdXJhdGlvbkZpZWxkICYmIHR5cGVvZiBjaGlsZFZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkVmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShjaGlsZFZhbHVlKSB8fCBjaGlsZFZhbHVlIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVzdCBwcm9maWxlIGR1cmF0aW9uIGZpZWxkOiAke2tleX1gKVxuICAgICAgfVxuXG4gICAgICB2YWx1ZVtrZXldID0gcm91bmRQcm9maWxlRHVyYXRpb24oY2hpbGRWYWx1ZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGtleS5lbmRzV2l0aChcIk1zXCIpICYmIGtleSAhPT0gXCJjcHVNc1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVzdCBwcm9maWxlIGR1cmF0aW9uIGZpZWxkOiAke2tleX1gKVxuICAgIH1cblxuICAgIG5vcm1hbGl6ZUR1cmF0aW9ucyhjaGlsZFZhbHVlLCBrZXkpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBKU09OLXNhZmUgcmljaCBwcm9maWxlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcHJvZmlsZSAtIFJpY2ggcHJvZmlsZSBkb2N1bWVudC5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBOb3JtYWxpemVkIGRvY3VtZW50LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVkUHJvZmlsZShwcm9maWxlKSB7XG4gIGlmIChwcm9maWxlPy5zY2hlbWEgIT09IFwidmVsb2Npb3VzLnRlc3QtcHJvZmlsZVwiIHx8IHByb2ZpbGU/LnNjaGVtYVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFZlbG9jaW91cyB0ZXN0IHByb2ZpbGUgc2NoZW1hXCIpXG4gIH1cblxuICBhc3NlcnRQcm9maWxlUHJpdmFjeShwcm9maWxlKVxuICBjb25zdCBub3JtYWxpemVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwcm9maWxlKSlcblxuICBub3JtYWxpemVEdXJhdGlvbnMobm9ybWFsaXplZClcbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGV4dCB0aHJvdWdoIGEgc2FtZS1kaXJlY3RvcnkgdGVtcG9yYXJ5IGZpbGUgYW5kIGF0b21pYyByZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3V0cHV0UGF0aCAtIEZpbmFsIG91dHB1dCBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBDb21wbGV0ZSBvdXRwdXQgY29udGVudC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXRvbWljV3JpdGUob3V0cHV0UGF0aCwgY29udGVudCkge1xuICBjb25zdCBkaXJlY3RvcnkgPSBwYXRoLmRpcm5hbWUob3V0cHV0UGF0aClcbiAgY29uc3Qgc2VxdWVuY2UgPSArK2F0b21pY1dyaXRlU2VxdWVuY2VcbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGAuJHtwYXRoLmJhc2VuYW1lKG91dHB1dFBhdGgpfS4ke3Byb2Nlc3MucGlkfS4ke3NlcXVlbmNlfS50bXBgKVxuICBsZXQgdGVtcG9yYXJ5RmlsZUNyZWF0ZWQgPSBmYWxzZVxuXG4gIGF3YWl0IGZzLm1rZGlyKGRpcmVjdG9yeSwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcG9yYXJ5UGF0aCwgY29udGVudCwge2VuY29kaW5nOiBcInV0ZjhcIiwgZmxhZzogXCJ3eFwifSlcbiAgICB0ZW1wb3JhcnlGaWxlQ3JlYXRlZCA9IHRydWVcbiAgICBhd2FpdCBmcy5yZW5hbWUodGVtcG9yYXJ5UGF0aCwgb3V0cHV0UGF0aClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodGVtcG9yYXJ5RmlsZUNyZWF0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnVubGluayh0ZW1wb3JhcnlQYXRoKVxuICAgICAgfSBjYXRjaCAoY2xlYW51cEVycm9yKSB7XG4gICAgICAgIGlmICghKGNsZWFudXBFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY29kZVwiIGluIGNsZWFudXBFcnJvcikgfHwgY2xlYW51cEVycm9yLmNvZGUgIT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgICAgICBbZXJyb3IsIGNsZWFudXBFcnJvcl0sXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHdyaXRlIGFuZCBjbGVhbiB1cCB0ZXN0IHByb2ZpbGUgb3V0cHV0OiAke291dHB1dFBhdGh9YCxcbiAgICAgICAgICAgIHtjYXVzZTogY2xlYW51cEVycm9yfVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc29ydGVkIHBsYWluIHRpbWluZyBtYW5pZmVzdC5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHByb2ZpbGUgLSBSaWNoIHByb2ZpbGUgZG9jdW1lbnQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gLSBTb3J0ZWQgZmlsZS1kdXJhdGlvbiBtYXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1pbmdNYW5pZmVzdEZyb21Qcm9maWxlKHByb2ZpbGUpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqL1xuICBjb25zdCBtYW5pZmVzdCA9IHt9XG4gIGNvbnN0IHZhbGlkYXRlZE1hbmlmZXN0ID0gdmFsaWRhdGVUaW1pbmdNYW5pZmVzdChwcm9maWxlLnRpbWluZ01hbmlmZXN0IHx8IHt9LCB7c291cmNlOiBcIlRlc3QgcHJvZmlsZSB0aW1pbmcgbWFuaWZlc3RcIn0pXG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGR1cmF0aW9uTXNdIG9mIE9iamVjdC5lbnRyaWVzKHZhbGlkYXRlZE1hbmlmZXN0KSkge1xuICAgIG1hbmlmZXN0W2ZpbGVQYXRoXSA9IHJvdW5kUHJvZmlsZUR1cmF0aW9uKGR1cmF0aW9uTXMpXG4gIH1cblxuICByZXR1cm4gbWFuaWZlc3Rcbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IHdyaXRlcyBhIGNhbm9uaWNhbCBzcGxpdHRlci1jb21wYXRpYmxlIHRpbWluZyBtYW5pZmVzdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3V0cHV0IGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm91dHB1dFBhdGggLSBGaW5hbCBvdXRwdXQgcGF0aC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gYXJncy50aW1pbmdNYW5pZmVzdCAtIFZhbGlkYXRlZCBvciBjYW5kaWRhdGUgdGltaW5nIG1hbmlmZXN0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgYXRvbWljIHJlcGxhY2VtZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVUaW1pbmdNYW5pZmVzdCh7b3V0cHV0UGF0aCwgdGltaW5nTWFuaWZlc3R9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWxpZGF0ZVRpbWluZ01hbmlmZXN0KHRpbWluZ01hbmlmZXN0KVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovXG4gIGNvbnN0IHJvdW5kZWQgPSB7fVxuXG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBkdXJhdGlvbk1zXSBvZiBPYmplY3QuZW50cmllcyhub3JtYWxpemVkKSkge1xuICAgIHJvdW5kZWRbZmlsZVBhdGhdID0gcm91bmRQcm9maWxlRHVyYXRpb24oZHVyYXRpb25NcylcbiAgfVxuXG4gIGF3YWl0IGF0b21pY1dyaXRlKG91dHB1dFBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHJvdW5kZWQsIG51bGwsIDIpfVxcbmApXG59XG5cbi8qKlxuICogQXRvbWljYWxseSB3cml0ZXMgcmVxdWVzdGVkIHRlc3QgcHJvZmlsZSBvdXRwdXRzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPdXRwdXQgb3B0aW9ucy5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucHJvZmlsZSAtIFJpY2ggcHJvZmlsZSBkb2N1bWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5wcm9maWxlSnNvblBhdGhdIC0gUmljaCBKU09OIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoXSAtIFBsYWluIHRpbWluZyBtYW5pZmVzdCBwYXRoLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgYWxsIHJlcXVlc3RlZCB3cml0ZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVRlc3RQcm9maWxlT3V0cHV0cyh7cHJvZmlsZSwgcHJvZmlsZUpzb25QYXRoLCB0aW1pbmdNYW5pZmVzdE91dHB1dFBhdGh9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkUHJvZmlsZShwcm9maWxlKVxuICBjb25zdCB0aW1pbmdNYW5pZmVzdCA9IHRpbWluZ01hbmlmZXN0RnJvbVByb2ZpbGUobm9ybWFsaXplZClcblxuICBub3JtYWxpemVkLnRpbWluZ01hbmlmZXN0ID0gdGltaW5nTWFuaWZlc3RcblxuICBpZiAocHJvZmlsZUpzb25QYXRoKSB7XG4gICAgYXdhaXQgYXRvbWljV3JpdGUocHJvZmlsZUpzb25QYXRoLCBgJHtKU09OLnN0cmluZ2lmeShub3JtYWxpemVkLCBudWxsLCAyKX1cXG5gKVxuICB9XG5cbiAgaWYgKHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCkge1xuICAgIGF3YWl0IHdyaXRlVGltaW5nTWFuaWZlc3Qoe291dHB1dFBhdGg6IHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aCwgdGltaW5nTWFuaWZlc3R9KVxuICB9XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGNvbXBhY3QgQmVuY2htYXJrLXN0eWxlIGNvbnNvbGUgc3VtbWFyeS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHByb2ZpbGUgLSBSaWNoIHByb2ZpbGUgZG9jdW1lbnQuXG4gKiBAcGFyYW0ge3twcm9maWxlSnNvblBhdGg/OiBzdHJpbmcsIHRpbWluZ01hbmlmZXN0T3V0cHV0UGF0aD86IHN0cmluZ319IFtvdXRwdXRzXSAtIFdyaXR0ZW4gb3V0cHV0IHBhdGhzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBDb25zb2xlIHN1bW1hcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUZXN0UHJvZmlsZVN1bW1hcnkocHJvZmlsZSwgb3V0cHV0cyA9IHt9KSB7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIFwiVGVzdCBwcm9maWxlXCIsXG4gICAgXCJQaGFzZVwiLnBhZEVuZCgzMSkgKyBcIkNvdW50XCIucGFkU3RhcnQoNSkgKyBcIlJlYWwgbXNcIi5wYWRTdGFydCgxMykgKyBcIkNQVSBtc1wiLnBhZFN0YXJ0KDEzKVxuICBdXG5cbiAgZm9yIChjb25zdCBwaGFzZSBvZiBQSEFTRV9PUkRFUikge1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZSA9IHByb2ZpbGUucGhhc2VzPy5bcGhhc2VdXG5cbiAgICBpZiAoIWFnZ3JlZ2F0ZSkgY29udGludWVcblxuICAgIGxpbmVzLnB1c2goXG4gICAgICBwaGFzZS5wYWRFbmQoMzEpICtcbiAgICAgIFN0cmluZyhhZ2dyZWdhdGUuY291bnQpLnBhZFN0YXJ0KDUpICtcbiAgICAgIGFnZ3JlZ2F0ZS50b3RhbE1zLnRvRml4ZWQoMykucGFkU3RhcnQoMTMpICtcbiAgICAgIGFnZ3JlZ2F0ZS5jcHVNcy50b3RhbC50b0ZpeGVkKDMpLnBhZFN0YXJ0KDEzKVxuICAgIClcbiAgfVxuXG4gIGlmIChwcm9maWxlLnBvb2xzPy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaChcIlBvb2xzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHBvb2wgb2YgcHJvZmlsZS5wb29scykge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYFBvb2wgJHtwb29sLmlkZW50aWZpZXJ9OiBjcmVhdGVkPSR7cG9vbC5jb25uZWN0aW9uQ3JlYXRpb24uY291bnR9YCArXG4gICAgICAgIGAgZmFpbGVkPSR7cG9vbC5jb25uZWN0aW9uQ3JlYXRpb24uZmFpbGVkQ291bnR9YCArXG4gICAgICAgIGAgd2FpdD0ke3Bvb2wuY2hlY2tvdXRXYWl0LmNvdW50fS8ke3Bvb2wuY2hlY2tvdXRXYWl0LnRvdGFsTXMudG9GaXhlZCgzKX1tc2AgK1xuICAgICAgICBgIHRpbWVvdXRzPSR7cG9vbC5jaGVja291dFRpbWVvdXRDb3VudH1gICtcbiAgICAgICAgYCByZWFwZWQ9JHtwb29sLmlkbGVSZWFwLmRpc3Bvc2FsQ291bnR9YCArXG4gICAgICAgIGAgcGVhaz0ke3Bvb2wucGVha0xpdmVDb25uZWN0aW9uc31gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKG91dHB1dHMucHJvZmlsZUpzb25QYXRoKSBsaW5lcy5wdXNoKGBSaWNoIEpTT046ICR7b3V0cHV0cy5wcm9maWxlSnNvblBhdGh9YClcbiAgaWYgKG91dHB1dHMudGltaW5nTWFuaWZlc3RPdXRwdXRQYXRoKSBsaW5lcy5wdXNoKGBUaW1pbmcgbWFuaWZlc3Q6ICR7b3V0cHV0cy50aW1pbmdNYW5pZmVzdE91dHB1dFBhdGh9YClcblxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIl19
|
|
2
|
+
export { formatTestProfileSummary, loadTimingManifest, resolveTestProfileOptions, timingManifestFromProfile, writeTestProfileOutputs, writeTimingManifest } from "@velocious/testing/node";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1wcm9maWxlLW91dHB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QtcHJvZmlsZS1vdXRwdXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNwQixNQUFNLHlCQUF5QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmV4cG9ydCB7XG4gIGZvcm1hdFRlc3RQcm9maWxlU3VtbWFyeSxcbiAgbG9hZFRpbWluZ01hbmlmZXN0LFxuICByZXNvbHZlVGVzdFByb2ZpbGVPcHRpb25zLFxuICB0aW1pbmdNYW5pZmVzdEZyb21Qcm9maWxlLFxuICB3cml0ZVRlc3RQcm9maWxlT3V0cHV0cyxcbiAgd3JpdGVUaW1pbmdNYW5pZmVzdFxufSBmcm9tIFwiQHZlbG9jaW91cy90ZXN0aW5nL25vZGVcIlxuIl19
|