velocious 1.0.667 → 1.0.668

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +27 -7
  2. package/build/configuration.js +23 -1
  3. package/build/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  4. package/build/environment-handlers/node/cli/commands/test.js +17 -69
  5. package/build/frontend-models/websocket-channel.js +18 -0
  6. package/build/http-server/client/websocket-session.js +41 -4
  7. package/build/http-server/websocket-channel.js +14 -0
  8. package/build/http-server/websocket-event-log-store.js +85 -12
  9. package/build/http-server/websocket-events-host.js +14 -6
  10. package/build/src/configuration.d.ts +18 -1
  11. package/build/src/configuration.d.ts.map +1 -1
  12. package/build/src/configuration.js +22 -2
  13. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.d.ts.map +1 -1
  14. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +3 -47
  15. package/build/src/environment-handlers/node/cli/commands/test.d.ts +2 -28
  16. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  17. package/build/src/environment-handlers/node/cli/commands/test.js +10 -61
  18. package/build/src/frontend-models/websocket-channel.d.ts +9 -0
  19. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  20. package/build/src/frontend-models/websocket-channel.js +16 -1
  21. package/build/src/http-server/client/websocket-session.d.ts +25 -2
  22. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  23. package/build/src/http-server/client/websocket-session.js +40 -5
  24. package/build/src/http-server/websocket-channel.d.ts +11 -0
  25. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  26. package/build/src/http-server/websocket-channel.js +14 -1
  27. package/build/src/http-server/websocket-event-log-store.d.ts +60 -41
  28. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  29. package/build/src/http-server/websocket-event-log-store.js +79 -12
  30. package/build/src/http-server/websocket-events-host.d.ts +10 -3
  31. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  32. package/build/src/http-server/websocket-events-host.js +14 -7
  33. package/build/src/testing/test-files-finder.d.ts +13 -116
  34. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  35. package/build/src/testing/test-files-finder.js +26 -296
  36. package/build/src/testing/test-filter-parser.d.ts +32 -22
  37. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  38. package/build/src/testing/test-filter-parser.js +25 -217
  39. package/build/src/testing/test-profile-activity.d.ts +1 -6
  40. package/build/src/testing/test-profile-activity.d.ts.map +1 -1
  41. package/build/src/testing/test-profile-activity.js +2 -12
  42. package/build/src/testing/test-profile-output.d.ts +1 -40
  43. package/build/src/testing/test-profile-output.d.ts.map +1 -1
  44. package/build/src/testing/test-profile-output.js +2 -217
  45. package/build/src/testing/test-profiler.d.ts +15 -659
  46. package/build/src/testing/test-profiler.d.ts.map +1 -1
  47. package/build/src/testing/test-profiler.js +35 -833
  48. package/build/src/testing/test-runner.d.ts +10 -1
  49. package/build/src/testing/test-runner.d.ts.map +1 -1
  50. package/build/src/testing/test-runner.js +26 -4
  51. package/build/src/testing/test-suite-splitter.d.ts +1 -128
  52. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  53. package/build/src/testing/test-suite-splitter.js +2 -259
  54. package/build/src/testing/timing-manifest.d.ts +5 -93
  55. package/build/src/testing/timing-manifest.d.ts.map +1 -1
  56. package/build/src/testing/timing-manifest.js +4 -283
  57. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
  58. package/build/src/testing/velocious-attempt-executor.js +8 -2
  59. package/build/testing/test-files-finder.js +29 -345
  60. package/build/testing/test-filter-parser.js +29 -248
  61. package/build/testing/test-profile-activity.js +1 -12
  62. package/build/testing/test-profile-output.js +8 -253
  63. package/build/testing/test-profiler.js +38 -895
  64. package/build/testing/test-runner.js +33 -9
  65. package/build/testing/test-suite-splitter.js +1 -301
  66. package/build/testing/timing-manifest.js +10 -344
  67. package/build/testing/velocious-attempt-executor.js +7 -1
  68. package/package.json +3 -3
  69. package/scripts/test-browser.js +29 -6
  70. package/scripts/verify-docker-dev-environment.js +13 -1
  71. package/src/configuration.js +23 -1
  72. package/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  73. package/src/environment-handlers/node/cli/commands/test.js +17 -69
  74. package/src/frontend-models/websocket-channel.js +18 -0
  75. package/src/http-server/client/websocket-session.js +41 -4
  76. package/src/http-server/websocket-channel.js +14 -0
  77. package/src/http-server/websocket-event-log-store.js +85 -12
  78. package/src/http-server/websocket-events-host.js +14 -6
  79. package/src/testing/test-files-finder.js +29 -345
  80. package/src/testing/test-filter-parser.js +29 -248
  81. package/src/testing/test-profile-activity.js +1 -12
  82. package/src/testing/test-profile-output.js +8 -253
  83. package/src/testing/test-profiler.js +38 -895
  84. package/src/testing/test-runner.js +33 -9
  85. package/src/testing/test-suite-splitter.js +1 -301
  86. package/src/testing/timing-manifest.js +10 -344
  87. package/src/testing/velocious-attempt-executor.js +7 -1
@@ -1,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 filter flags removed.
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
- // @ts-check
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
- * Runs the parseFilters helper.
65
- * @param {string[]} processArgs - Process args.
66
- * @returns {ParseFiltersResult} - Parsed tags, group options, and process args.
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 includeTags = [];
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: Array.from(new Set(includeTags)),
224
- excludeTags: Array.from(new Set(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;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAHlC,MAGkC,GAFhC,MAAM,CAQlB"}
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
- * Validates a low-cardinality activity label suitable for profile output.
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":"AAuJA;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAHtC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGU,GAFpC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYlC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,EAAC,UAAU,EAAE,cAAc,EAAC,EAJnE;IAAqB,UAAU,EAAvB,MAAM,CACd;IAAqC,cAAc,EAA3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAC9B;CAEmE,GAFzD,OAAO,CAAC,IAAI,CAAC,CAYzB;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,EAAC,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAC,EAL/F;IAA4C,OAAO,EAA3C,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;IAAsB,eAAe,AAArC,CACA,EADQ,MAAM,CACd;IAAsB,wBAAwB,AAA9C,CACA,EADQ,MAAM,CACd;CAE+F,GAFrF,OAAO,CAAC,IAAI,CAAC,CAezB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAJrC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAIS,EAAE,OAAO,AAHtD,CACA,EADQ;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,MAAM,CAAA;CAGT,GAFjD,MAAM,CAwClB"}
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
- import fs from "node:fs/promises";
3
- import path from "node:path";
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