velocious 1.0.262 → 1.0.263

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.
@@ -3,14 +3,44 @@
3
3
  * @returns {RegExp[]} - Normalized patterns.
4
4
  */
5
5
  export function normalizeExamplePatterns(patterns: string[]): RegExp[];
6
+ /**
7
+ * @typedef {object} ParseFiltersResult
8
+ * @property {string[]} includeTags - Tags to include.
9
+ * @property {string[]} excludeTags - Tags to exclude.
10
+ * @property {string[]} examplePatterns - Example name patterns.
11
+ * @property {string[]} filteredProcessArgs - Remaining process args with filter flags removed.
12
+ * @property {number | undefined} groups - Total number of groups for test splitting.
13
+ * @property {number | undefined} groupNumber - Which group to run (1-indexed).
14
+ */
6
15
  /**
7
16
  * @param {string[]} processArgs - Process args.
8
- * @returns {{includeTags: string[], excludeTags: string[], examplePatterns: string[], filteredProcessArgs: string[]}} - Parsed tags and process args.
17
+ * @returns {ParseFiltersResult} - Parsed tags, group options, and process args.
9
18
  */
10
- export function parseFilters(processArgs: string[]): {
19
+ export function parseFilters(processArgs: string[]): ParseFiltersResult;
20
+ export type ParseFiltersResult = {
21
+ /**
22
+ * - Tags to include.
23
+ */
11
24
  includeTags: string[];
25
+ /**
26
+ * - Tags to exclude.
27
+ */
12
28
  excludeTags: string[];
29
+ /**
30
+ * - Example name patterns.
31
+ */
13
32
  examplePatterns: string[];
33
+ /**
34
+ * - Remaining process args with filter flags removed.
35
+ */
14
36
  filteredProcessArgs: string[];
37
+ /**
38
+ * - Total number of groups for test splitting.
39
+ */
40
+ groups: number | undefined;
41
+ /**
42
+ * - Which group to run (1-indexed).
43
+ */
44
+ groupNumber: number | undefined;
15
45
  };
16
46
  //# sourceMappingURL=test-filter-parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-filter-parser.d.ts","sourceRoot":"","sources":["../../../src/testing/test-filter-parser.js"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,mDAHW,MAAM,EAAE,GACN,MAAM,EAAE,CAgBpB;AAED;;;GAGG;AACH,0CAHW,MAAM,EAAE,GACN;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAAC,CAyFpH"}
1
+ {"version":3,"file":"test-filter-parser.d.ts","sourceRoot":"","sources":["../../../src/testing/test-filter-parser.js"],"names":[],"mappings":"AA6BA;;;GAGG;AACH,mDAHW,MAAM,EAAE,GACN,MAAM,EAAE,CAgBpB;AAED;;;;;;;;GAQG;AAEH;;;GAGG;AACH,0CAHW,MAAM,EAAE,GACN,kBAAkB,CA+H9B;;;;;iBAzIa,MAAM,EAAE;;;;iBACR,MAAM,EAAE;;;;qBACR,MAAM,EAAE;;;;yBACR,MAAM,EAAE;;;;YACR,MAAM,GAAG,SAAS;;;;iBAClB,MAAM,GAAG,SAAS"}
@@ -2,6 +2,8 @@
2
2
  const INCLUDE_TAG_FLAGS = new Set(["--tag", "--include-tag", "-t"]);
3
3
  const EXCLUDE_TAG_FLAGS = new Set(["--exclude-tag", "--skip-tag", "-x"]);
4
4
  const EXAMPLE_FLAGS = new Set(["--example", "--name", "-e"]);
5
+ const GROUPS_FLAGS = new Set(["--groups"]);
6
+ const GROUP_NUMBER_FLAGS = new Set(["--group-number"]);
5
7
  /**
6
8
  * @param {string | undefined} value - Tag argument value.
7
9
  * @returns {string[]} - Tags list.
@@ -38,15 +40,28 @@ export function normalizeExamplePatterns(patterns) {
38
40
  }
39
41
  return normalized;
40
42
  }
43
+ /**
44
+ * @typedef {object} ParseFiltersResult
45
+ * @property {string[]} includeTags - Tags to include.
46
+ * @property {string[]} excludeTags - Tags to exclude.
47
+ * @property {string[]} examplePatterns - Example name patterns.
48
+ * @property {string[]} filteredProcessArgs - Remaining process args with filter flags removed.
49
+ * @property {number | undefined} groups - Total number of groups for test splitting.
50
+ * @property {number | undefined} groupNumber - Which group to run (1-indexed).
51
+ */
41
52
  /**
42
53
  * @param {string[]} processArgs - Process args.
43
- * @returns {{includeTags: string[], excludeTags: string[], examplePatterns: string[], filteredProcessArgs: string[]}} - Parsed tags and process args.
54
+ * @returns {ParseFiltersResult} - Parsed tags, group options, and process args.
44
55
  */
45
56
  export function parseFilters(processArgs) {
46
57
  const includeTags = [];
47
58
  const excludeTags = [];
48
59
  const filteredProcessArgs = processArgs.length > 0 ? [processArgs[0]] : [];
49
60
  const examplePatterns = [];
61
+ /** @type {number | undefined} */
62
+ let groups;
63
+ /** @type {number | undefined} */
64
+ let groupNumber;
50
65
  let inRestArgs = false;
51
66
  for (let i = 1; i < processArgs.length; i++) {
52
67
  const arg = processArgs[i];
@@ -104,6 +119,30 @@ export function parseFilters(processArgs) {
104
119
  examplePatterns.push(arg.slice("--name=".length));
105
120
  continue;
106
121
  }
122
+ if (GROUPS_FLAGS.has(arg)) {
123
+ const nextValue = processArgs[i + 1];
124
+ if (nextValue && !nextValue.startsWith("-")) {
125
+ groups = parseInt(nextValue, 10);
126
+ i++;
127
+ }
128
+ continue;
129
+ }
130
+ if (arg.startsWith("--groups=")) {
131
+ groups = parseInt(arg.slice("--groups=".length), 10);
132
+ continue;
133
+ }
134
+ if (GROUP_NUMBER_FLAGS.has(arg)) {
135
+ const nextValue = processArgs[i + 1];
136
+ if (nextValue && !nextValue.startsWith("-")) {
137
+ groupNumber = parseInt(nextValue, 10);
138
+ i++;
139
+ }
140
+ continue;
141
+ }
142
+ if (arg.startsWith("--group-number=")) {
143
+ groupNumber = parseInt(arg.slice("--group-number=".length), 10);
144
+ continue;
145
+ }
107
146
  }
108
147
  filteredProcessArgs.push(arg);
109
148
  }
@@ -111,7 +150,9 @@ export function parseFilters(processArgs) {
111
150
  includeTags: Array.from(new Set(includeTags)),
112
151
  excludeTags: Array.from(new Set(excludeTags)),
113
152
  examplePatterns,
114
- filteredProcessArgs
153
+ filteredProcessArgs,
154
+ groups,
155
+ groupNumber
115
156
  };
116
157
  }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWx0ZXItcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGVzdC1maWx0ZXItcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ25FLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDeEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFFNUQ7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0QixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXJCLE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ3JELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsUUFBUTtJQUMvQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7SUFFckIsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENB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LG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLGVBQWU7UUFDZixtQkFBbUI7S0FDcEIsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgSU5DTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tdGFnXCIsIFwiLS1pbmNsdWRlLXRhZ1wiLCBcIi10XCJdKVxuY29uc3QgRVhDTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tZXhjbHVkZS10YWdcIiwgXCItLXNraXAtdGFnXCIsIFwiLXhcIl0pXG5jb25zdCBFWEFNUExFX0ZMQUdTID0gbmV3IFNldChbXCItLWV4YW1wbGVcIiwgXCItLW5hbWVcIiwgXCItZVwiXSlcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUYWcgYXJndW1lbnQgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVGFncyBsaXN0LlxuICovXG5mdW5jdGlvbiBzcGxpdFRhZ3ModmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdXG5cbiAgcmV0dXJuIHZhbHVlXG4gICAgLnNwbGl0KFwiLFwiKVxuICAgIC5tYXAoKHRhZykgPT4gdGFnLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVzY2FwZWQgdmFsdWUgZm9yIHJlZ2V4LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdHRlcm5zIC0gUGF0dGVybnMuXG4gKiBAcmV0dXJucyB7UmVnRXhwW119IC0gTm9ybWFsaXplZCBwYXR0ZXJucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucyhwYXR0ZXJucykge1xuICBjb25zdCBub3JtYWxpemVkID0gW11cblxuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICBjb25zdCByZWdleE1hdGNoID0gcGF0dGVybi5tYXRjaCgvXlxcLyguKylcXC8oW2dpbXN1eV0qKSQvKVxuXG4gICAgaWYgKHJlZ2V4TWF0Y2gpIHtcbiAgICAgIG5vcm1hbGl6ZWQucHVzaChuZXcgUmVnRXhwKHJlZ2V4TWF0Y2hbMV0sIHJlZ2V4TWF0Y2hbMl0pKVxuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkLnB1c2gobmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAocGF0dGVybikpKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvY2Vzc0FyZ3MgLSBQcm9jZXNzIGFyZ3MuXG4gKiBAcmV0dXJucyB7e2luY2x1ZGVUYWdzOiBzdHJpbmdbXSwgZXhjbHVkZVRhZ3M6IHN0cmluZ1tdLCBleGFtcGxlUGF0dGVybnM6IHN0cmluZ1tdLCBmaWx0ZXJlZFByb2Nlc3NBcmdzOiBzdHJpbmdbXX19IC0gUGFyc2VkIHRhZ3MgYW5kIHByb2Nlc3MgYXJncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmlsdGVycyhwcm9jZXNzQXJncykge1xuICBjb25zdCBpbmNsdWRlVGFncyA9IFtdXG4gIGNvbnN0IGV4Y2x1ZGVUYWdzID0gW11cbiAgY29uc3QgZmlsdGVyZWRQcm9jZXNzQXJncyA9IHByb2Nlc3NBcmdzLmxlbmd0aCA+IDAgPyBbcHJvY2Vzc0FyZ3NbMF1dIDogW11cbiAgY29uc3QgZXhhbXBsZVBhdHRlcm5zID0gW11cbiAgbGV0IGluUmVzdEFyZ3MgPSBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcHJvY2Vzc0FyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBwcm9jZXNzQXJnc1tpXVxuXG4gICAgaWYgKGFyZyA9PT0gXCItLVwiKSB7XG4gICAgICBpblJlc3RBcmdzID0gdHJ1ZVxuICAgICAgZmlsdGVyZWRQcm9jZXNzQXJncy5wdXNoKGFyZylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpblJlc3RBcmdzKSB7XG4gICAgICBpZiAoSU5DTFVERV9UQUdfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MobmV4dFZhbHVlKSlcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoRVhDTFVERV9UQUdfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MobmV4dFZhbHVlKSlcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLXRhZz1cIikpIHtcbiAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0taW5jbHVkZS10YWc9XCIpKSB7XG4gICAgICAgIGluY2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0taW5jbHVkZS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZXhjbHVkZS10YWc9XCIpKSB7XG4gICAgICAgIGV4Y2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0tZXhjbHVkZS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tc2tpcC10YWc9XCIpKSB7XG4gICAgICAgIGV4Y2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0tc2tpcC10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChFWEFNUExFX0ZMQUdTLmhhcyhhcmcpKSB7XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IHByb2Nlc3NBcmdzW2kgKyAxXVxuXG4gICAgICAgIGlmIChuZXh0VmFsdWUgJiYgIW5leHRWYWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIGV4YW1wbGVQYXR0ZXJucy5wdXNoKG5leHRWYWx1ZSlcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLWV4YW1wbGU9XCIpKSB7XG4gICAgICAgIGV4YW1wbGVQYXR0ZXJucy5wdXNoKGFyZy5zbGljZShcIi0tZXhhbXBsZT1cIi5sZW5ndGgpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLW5hbWU9XCIpKSB7XG4gICAgICAgIGV4YW1wbGVQYXR0ZXJucy5wdXNoKGFyZy5zbGljZShcIi0tbmFtZT1cIi5sZW5ndGgpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZpbHRlcmVkUHJvY2Vzc0FyZ3MucHVzaChhcmcpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGluY2x1ZGVUYWdzOiBBcnJheS5mcm9tKG5ldyBTZXQoaW5jbHVkZVRhZ3MpKSxcbiAgICBleGNsdWRlVGFnczogQXJyYXkuZnJvbShuZXcgU2V0KGV4Y2x1ZGVUYWdzKSksXG4gICAgZXhhbXBsZVBhdHRlcm5zLFxuICAgIGZpbHRlcmVkUHJvY2Vzc0FyZ3NcbiAgfVxufVxuIl19
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWx0ZXItcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGVzdC1maWx0ZXItcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ25FLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDeEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDNUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0FBQzFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7QUFFdEQ7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0QixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXJCLE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ3JELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsUUFBUTtJ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LFNBQVE7WUFDVixDQUFDO1lBRUQsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQkFDdEMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dCQUMvRCxTQUFRO1lBQ1YsQ0FBQztRQUNILENBQUM7UUFFRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxlQUFlO1FBQ2YsbUJBQW1CO1FBQ25CLE1BQU07UUFDTixXQUFXO0tBQ1osQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuY29uc3QgSU5DTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tdGFnXCIsIFwiLS1pbmNsdWRlLXRhZ1wiLCBcIi10XCJdKVxuY29uc3QgRVhDTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tZXhjbHVkZS10YWdcIiwgXCItLXNraXAtdGFnXCIsIFwiLXhcIl0pXG5jb25zdCBFWEFNUExFX0ZMQUdTID0gbmV3IFNldChbXCItLWV4YW1wbGVcIiwgXCItLW5hbWVcIiwgXCItZVwiXSlcbmNvbnN0IEdST1VQU19GTEFHUyA9IG5ldyBTZXQoW1wiLS1ncm91cHNcIl0pXG5jb25zdCBHUk9VUF9OVU1CRVJfRkxBR1MgPSBuZXcgU2V0KFtcIi0tZ3JvdXAtbnVtYmVyXCJdKVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRhZyBhcmd1bWVudCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBUYWdzIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIHNwbGl0VGFncyh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW11cblxuICByZXR1cm4gdmFsdWVcbiAgICAuc3BsaXQoXCIsXCIpXG4gICAgLm1hcCgodGFnKSA9PiB0YWcudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRXNjYXBlZCB2YWx1ZSBmb3IgcmVnZXguXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0dGVybnMgLSBQYXR0ZXJucy5cbiAqIEByZXR1cm5zIHtSZWdFeHBbXX0gLSBOb3JtYWxpemVkIHBhdHRlcm5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zKHBhdHRlcm5zKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGNvbnN0IHJlZ2V4TWF0Y2ggPSBwYXR0ZXJuLm1hdGNoKC9eXFwvKC4rKVxcLyhbZ2ltc3V5XSopJC8pXG5cbiAgICBpZiAocmVnZXhNYXRjaCkge1xuICAgICAgbm9ybWFsaXplZC5wdXNoKG5ldyBSZWdFeHAocmVnZXhNYXRjaFsxXSwgcmVnZXhNYXRjaFsyXSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZWQucHVzaChuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChwYXR0ZXJuKSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJzZUZpbHRlcnNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGluY2x1ZGVUYWdzIC0gVGFncyB0byBpbmNsdWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZXhjbHVkZVRhZ3MgLSBUYWdzIHRvIGV4Y2x1ZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBleGFtcGxlUGF0dGVybnMgLSBFeGFtcGxlIG5hbWUgcGF0dGVybnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmaWx0ZXJlZFByb2Nlc3NBcmdzIC0gUmVtYWluaW5nIHByb2Nlc3MgYXJncyB3aXRoIGZpbHRlciBmbGFncyByZW1vdmVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IGdyb3VwcyAtIFRvdGFsIG51bWJlciBvZiBncm91cHMgZm9yIHRlc3Qgc3BsaXR0aW5nLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IGdyb3VwTnVtYmVyIC0gV2hpY2ggZ3JvdXAgdG8gcnVuICgxLWluZGV4ZWQpLlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvY2Vzc0FyZ3MgLSBQcm9jZXNzIGFyZ3MuXG4gKiBAcmV0dXJucyB7UGFyc2VGaWx0ZXJzUmVzdWx0fSAtIFBhcnNlZCB0YWdzLCBncm91cCBvcHRpb25zLCBhbmQgcHJvY2VzcyBhcmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWx0ZXJzKHByb2Nlc3NBcmdzKSB7XG4gIGNvbnN0IGluY2x1ZGVUYWdzID0gW11cbiAgY29uc3QgZXhjbHVkZVRhZ3MgPSBbXVxuICBjb25zdCBmaWx0ZXJlZFByb2Nlc3NBcmdzID0gcHJvY2Vzc0FyZ3MubGVuZ3RoID4gMCA/IFtwcm9jZXNzQXJnc1swXV0gOiBbXVxuICBjb25zdCBleGFtcGxlUGF0dGVybnMgPSBbXVxuXG4gIC8qKiBAdHlwZSB7bnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgZ3JvdXBzXG4gIC8qKiBAdHlwZSB7bnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgZ3JvdXBOdW1iZXJcblxuICBsZXQgaW5SZXN0QXJncyA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9jZXNzQXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IHByb2Nlc3NBcmdzW2ldXG5cbiAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgIGluUmVzdEFyZ3MgPSB0cnVlXG4gICAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzLnB1c2goYXJnKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWluUmVzdEFyZ3MpIHtcbiAgICAgIGlmIChJTkNMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChFWENMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBleGNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tdGFnPVwiKSkge1xuICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhhcmcuc2xpY2UoXCItLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1pbmNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1pbmNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1leGNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1leGNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1za2lwLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1za2lwLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKEVYQU1QTEVfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2gobmV4dFZhbHVlKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZXhhbXBsZT1cIikpIHtcbiAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2goYXJnLnNsaWNlKFwiLS1leGFtcGxlPVwiLmxlbmd0aCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tbmFtZT1cIikpIHtcbiAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2goYXJnLnNsaWNlKFwiLS1uYW1lPVwiLmxlbmd0aCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChHUk9VUFNfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZ3JvdXBzID0gcGFyc2VJbnQobmV4dFZhbHVlLCAxMClcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLWdyb3Vwcz1cIikpIHtcbiAgICAgICAgZ3JvdXBzID0gcGFyc2VJbnQoYXJnLnNsaWNlKFwiLS1ncm91cHM9XCIubGVuZ3RoKSwgMTApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChHUk9VUF9OVU1CRVJfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZ3JvdXBOdW1iZXIgPSBwYXJzZUludChuZXh0VmFsdWUsIDEwKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZ3JvdXAtbnVtYmVyPVwiKSkge1xuICAgICAgICBncm91cE51bWJlciA9IHBhcnNlSW50KGFyZy5zbGljZShcIi0tZ3JvdXAtbnVtYmVyPVwiLmxlbmd0aCksIDEwKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZpbHRlcmVkUHJvY2Vzc0FyZ3MucHVzaChhcmcpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGluY2x1ZGVUYWdzOiBBcnJheS5mcm9tKG5ldyBTZXQoaW5jbHVkZVRhZ3MpKSxcbiAgICBleGNsdWRlVGFnczogQXJyYXkuZnJvbShuZXcgU2V0KGV4Y2x1ZGVUYWdzKSksXG4gICAgZXhhbXBsZVBhdHRlcm5zLFxuICAgIGZpbHRlcmVkUHJvY2Vzc0FyZ3MsXG4gICAgZ3JvdXBzLFxuICAgIGdyb3VwTnVtYmVyXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Splits a list of test files into balanced groups using a greedy load-balancing algorithm.
3
+ * Modeled after test_suite_splitter for RSpec.
4
+ */
5
+ export default class TestSuiteSplitter {
6
+ /**
7
+ * @param {object} args - Options.
8
+ * @param {number} args.groups - Total number of groups.
9
+ * @param {number} args.groupNumber - Which group to return (1-indexed).
10
+ * @param {string[]} args.testFiles - All discovered test file paths.
11
+ * @param {string} [args.baseDirectory] - Base directory for relative path computation.
12
+ */
13
+ constructor({ groups, groupNumber, testFiles, baseDirectory, ...restArgs }: {
14
+ groups: number;
15
+ groupNumber: number;
16
+ testFiles: string[];
17
+ baseDirectory?: string;
18
+ });
19
+ _groups: number;
20
+ _groupNumber: number;
21
+ _testFiles: string[];
22
+ _baseDirectory: string;
23
+ /**
24
+ * Returns the test files assigned to this group.
25
+ * @returns {string[]} - File paths for the requested group.
26
+ */
27
+ getGroupFiles(): string[];
28
+ /**
29
+ * Computes weight for each test file based on directory type and file suffix.
30
+ * @returns {SplitterFileEntry[]} - Weighted file entries.
31
+ */
32
+ computeWeightedFiles(): SplitterFileEntry[];
33
+ /**
34
+ * Computes the weight for a single file.
35
+ * @param {string} filePath - Absolute file path.
36
+ * @returns {number} - Weight value.
37
+ */
38
+ computeWeight(filePath: string): number;
39
+ /**
40
+ * Sorts files by weight descending, then by path for determinism.
41
+ * @param {SplitterFileEntry[]} files - Weighted files.
42
+ * @returns {SplitterFileEntry[]} - Sorted files.
43
+ */
44
+ sortByWeightDescending(files: SplitterFileEntry[]): SplitterFileEntry[];
45
+ /**
46
+ * Distributes files greedily into N balanced groups.
47
+ * Each file is assigned to the group with the least accumulated weight.
48
+ * @param {SplitterFileEntry[]} sortedFiles - Files sorted by weight descending.
49
+ * @returns {GroupBucket[]} - Array of group buckets.
50
+ */
51
+ distributeGreedily(sortedFiles: SplitterFileEntry[]): GroupBucket[];
52
+ /**
53
+ * Finds the bucket with the least accumulated weight.
54
+ * Ties are broken by bucket index (earlier bucket wins) for determinism.
55
+ * @param {GroupBucket[]} buckets - Group buckets.
56
+ * @returns {GroupBucket} - The lightest bucket.
57
+ */
58
+ findLightestBucket(buckets: GroupBucket[]): GroupBucket;
59
+ }
60
+ export type SplitterFileEntry = {
61
+ /**
62
+ * - Absolute file path.
63
+ */
64
+ filePath: string;
65
+ /**
66
+ * - Computed weight for load balancing.
67
+ */
68
+ weight: number;
69
+ };
70
+ export type GroupBucket = {
71
+ /**
72
+ * - Accumulated weight.
73
+ */
74
+ totalWeight: number;
75
+ /**
76
+ * - Files assigned to this group.
77
+ */
78
+ files: string[];
79
+ };
80
+ //# sourceMappingURL=test-suite-splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-suite-splitter.d.ts","sourceRoot":"","sources":["../../../src/testing/test-suite-splitter.js"],"names":[],"mappings":"AAkCA;;;GAGG;AACH;IACE;;;;;;OAMG;IACH,4EALG;QAAqB,MAAM,EAAnB,MAAM;QACO,WAAW,EAAxB,MAAM;QACS,SAAS,EAAxB,MAAM,EAAE;QACM,aAAa,GAA3B,MAAM;KAChB,EAgBA;IAJC,gBAAqB;IACrB,qBAA+B;IAC/B,qBAA2B;IAC3B,uBAAoD;IAGtD;;;OAGG;IACH,iBAFa,MAAM,EAAE,CAQpB;IAED;;;OAGG;IACH,wBAFa,iBAAiB,EAAE,CAO/B;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACJ,MAAM,CAwBlB;IAED;;;;OAIG;IACH,8BAHW,iBAAiB,EAAE,GACjB,iBAAiB,EAAE,CAU/B;IAED;;;;;OAKG;IACH,gCAHW,iBAAiB,EAAE,GACjB,WAAW,EAAE,CAkBzB;IAED;;;;;OAKG;IACH,4BAHW,WAAW,EAAE,GACX,WAAW,CAYvB;CACF;;;;;cApKa,MAAM;;;;YACN,MAAM;;;;;;iBAKN,MAAM;;;;WACN,MAAM,EAAE"}
@@ -0,0 +1,144 @@
1
+ // @ts-check
2
+ import path from "path";
3
+ import restArgsError from "../utils/rest-args-error.js";
4
+ /**
5
+ * @typedef {object} SplitterFileEntry
6
+ * @property {string} filePath - Absolute file path.
7
+ * @property {number} weight - Computed weight for load balancing.
8
+ */
9
+ /**
10
+ * @typedef {object} GroupBucket
11
+ * @property {number} totalWeight - Accumulated weight.
12
+ * @property {string[]} files - Files assigned to this group.
13
+ */
14
+ /** Default weight for a regular test file. */
15
+ const DEFAULT_WEIGHT = 1;
16
+ /**
17
+ * Weight multipliers by spec directory name.
18
+ * Heavier test types get higher weights so greedy distribution balances wall-clock time.
19
+ * @type {Record<string, number>}
20
+ */
21
+ const DIRECTORY_WEIGHTS = {
22
+ system: 20,
23
+ "frontend-models": 10,
24
+ controller: 3
25
+ };
26
+ /** Extra multiplier applied to browser spec files on top of directory weight. */
27
+ const BROWSER_SPEC_MULTIPLIER = 2;
28
+ /**
29
+ * Splits a list of test files into balanced groups using a greedy load-balancing algorithm.
30
+ * Modeled after test_suite_splitter for RSpec.
31
+ */
32
+ export default class TestSuiteSplitter {
33
+ /**
34
+ * @param {object} args - Options.
35
+ * @param {number} args.groups - Total number of groups.
36
+ * @param {number} args.groupNumber - Which group to return (1-indexed).
37
+ * @param {string[]} args.testFiles - All discovered test file paths.
38
+ * @param {string} [args.baseDirectory] - Base directory for relative path computation.
39
+ */
40
+ constructor({ groups, groupNumber, testFiles, baseDirectory, ...restArgs }) {
41
+ restArgsError(restArgs);
42
+ if (!Number.isInteger(groups) || groups < 1) {
43
+ throw new Error(`--groups must be a positive integer, got: ${groups}`);
44
+ }
45
+ if (!Number.isInteger(groupNumber) || groupNumber < 1 || groupNumber > groups) {
46
+ throw new Error(`--group-number must be between 1 and ${groups}, got: ${groupNumber}`);
47
+ }
48
+ this._groups = groups;
49
+ this._groupNumber = groupNumber;
50
+ this._testFiles = testFiles;
51
+ this._baseDirectory = baseDirectory || process.cwd();
52
+ }
53
+ /**
54
+ * Returns the test files assigned to this group.
55
+ * @returns {string[]} - File paths for the requested group.
56
+ */
57
+ getGroupFiles() {
58
+ const weighted = this.computeWeightedFiles();
59
+ const sorted = this.sortByWeightDescending(weighted);
60
+ const buckets = this.distributeGreedily(sorted);
61
+ return buckets[this._groupNumber - 1].files;
62
+ }
63
+ /**
64
+ * Computes weight for each test file based on directory type and file suffix.
65
+ * @returns {SplitterFileEntry[]} - Weighted file entries.
66
+ */
67
+ computeWeightedFiles() {
68
+ return this._testFiles.map((filePath) => ({
69
+ filePath,
70
+ weight: this.computeWeight(filePath)
71
+ }));
72
+ }
73
+ /**
74
+ * Computes the weight for a single file.
75
+ * @param {string} filePath - Absolute file path.
76
+ * @returns {number} - Weight value.
77
+ */
78
+ computeWeight(filePath) {
79
+ const relativePath = path.relative(this._baseDirectory, filePath).split(path.sep).join("/");
80
+ let weight = DEFAULT_WEIGHT;
81
+ // Extract the type directory from the relative path.
82
+ // Matches both "spec/system/..." (base is project root) and "system/..." (base is spec/ itself).
83
+ const specDirMatch = relativePath.match(/^(?:(?:spec|__tests__|tests)\/)?([^/]+)\//);
84
+ if (specDirMatch) {
85
+ const dirName = specDirMatch[1];
86
+ if (DIRECTORY_WEIGHTS[dirName] !== undefined) {
87
+ weight = DIRECTORY_WEIGHTS[dirName];
88
+ }
89
+ }
90
+ // Browser spec files are heavier
91
+ if (filePath.endsWith(".browser-spec.js") || filePath.endsWith(".browser-spec.mjs")) {
92
+ weight *= BROWSER_SPEC_MULTIPLIER;
93
+ }
94
+ return weight;
95
+ }
96
+ /**
97
+ * Sorts files by weight descending, then by path for determinism.
98
+ * @param {SplitterFileEntry[]} files - Weighted files.
99
+ * @returns {SplitterFileEntry[]} - Sorted files.
100
+ */
101
+ sortByWeightDescending(files) {
102
+ return [...files].sort((a, b) => {
103
+ if (b.weight !== a.weight) {
104
+ return b.weight - a.weight;
105
+ }
106
+ return a.filePath.localeCompare(b.filePath);
107
+ });
108
+ }
109
+ /**
110
+ * Distributes files greedily into N balanced groups.
111
+ * Each file is assigned to the group with the least accumulated weight.
112
+ * @param {SplitterFileEntry[]} sortedFiles - Files sorted by weight descending.
113
+ * @returns {GroupBucket[]} - Array of group buckets.
114
+ */
115
+ distributeGreedily(sortedFiles) {
116
+ /** @type {GroupBucket[]} */
117
+ const buckets = [];
118
+ for (let i = 0; i < this._groups; i++) {
119
+ buckets.push({ totalWeight: 0, files: [] });
120
+ }
121
+ for (const entry of sortedFiles) {
122
+ const lightest = this.findLightestBucket(buckets);
123
+ lightest.files.push(entry.filePath);
124
+ lightest.totalWeight += entry.weight;
125
+ }
126
+ return buckets;
127
+ }
128
+ /**
129
+ * Finds the bucket with the least accumulated weight.
130
+ * Ties are broken by bucket index (earlier bucket wins) for determinism.
131
+ * @param {GroupBucket[]} buckets - Group buckets.
132
+ * @returns {GroupBucket} - The lightest bucket.
133
+ */
134
+ findLightestBucket(buckets) {
135
+ let lightest = buckets[0];
136
+ for (let i = 1; i < buckets.length; i++) {
137
+ if (buckets[i].totalWeight < lightest.totalWeight) {
138
+ lightest = buckets[i];
139
+ }
140
+ }
141
+ return lightest;
142
+ }
143
+ }
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1zdWl0ZS1zcGxpdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3Qtc3VpdGUtc3BsaXR0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUN2QixPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7OztHQUlHO0FBRUg7Ozs7R0FJRztBQUVILDhDQUE4QztBQUM5QyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUE7QUFFeEI7Ozs7R0FJRztBQUNILE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsTUFBTSxFQUFFLEVBQUU7SUFDVixpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLFVBQVUsRUFBRSxDQUFDO0NBQ2QsQ0FBQTtBQUVELGlGQUFpRjtBQUNqRixNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQTtBQUVqQzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGlCQUFpQjtJQUNwQzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ3RFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxXQUFXLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDOUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsTUFBTSxVQUFVLFdBQVcsRUFBRSxDQUFDLENBQUE7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QyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFBO1FBQzNDLENBQUM7UUFFRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUVqRCxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkMsUUFBUSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQ3RDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FBQyxPQUFPO1FBQ3hCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2xELFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3BsaXR0ZXJGaWxlRW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlUGF0aCAtIEFic29sdXRlIGZpbGUgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3ZWlnaHQgLSBDb21wdXRlZCB3ZWlnaHQgZm9yIGxvYWQgYmFsYW5jaW5nLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR3JvdXBCdWNrZXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3RhbFdlaWdodCAtIEFjY3VtdWxhdGVkIHdlaWdodC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZpbGVzIC0gRmlsZXMgYXNzaWduZWQgdG8gdGhpcyBncm91cC5cbiAqL1xuXG4vKiogRGVmYXVsdCB3ZWlnaHQgZm9yIGEgcmVndWxhciB0ZXN0IGZpbGUuICovXG5jb25zdCBERUZBVUxUX1dFSUdIVCA9IDFcblxuLyoqXG4gKiBXZWlnaHQgbXVsdGlwbGllcnMgYnkgc3BlYyBkaXJlY3RvcnkgbmFtZS5cbiAqIEhlYXZpZXIgdGVzdCB0eXBlcyBnZXQgaGlnaGVyIHdlaWdodHMgc28gZ3JlZWR5IGRpc3RyaWJ1dGlvbiBiYWxhbmNlcyB3YWxsLWNsb2NrIHRpbWUuXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn1cbiAqL1xuY29uc3QgRElSRUNUT1JZX1dFSUdIVFMgPSB7XG4gIHN5c3RlbTogMjAsXG4gIFwiZnJvbnRlbmQtbW9kZWxzXCI6IDEwLFxuICBjb250cm9sbGVyOiAzXG59XG5cbi8qKiBFeHRyYSBtdWx0aXBsaWVyIGFwcGxpZWQgdG8gYnJvd3NlciBzcGVjIGZpbGVzIG9uIHRvcCBvZiBkaXJlY3Rvcnkgd2VpZ2h0LiAqL1xuY29uc3QgQlJPV1NFUl9TUEVDX01VTFRJUExJRVIgPSAyXG5cbi8qKlxuICogU3BsaXRzIGEgbGlzdCBvZiB0ZXN0IGZpbGVzIGludG8gYmFsYW5jZWQgZ3JvdXBzIHVzaW5nIGEgZ3JlZWR5IGxvYWQtYmFsYW5jaW5nIGFsZ29yaXRobS5cbiAqIE1vZGVsZWQgYWZ0ZXIgdGVzdF9zdWl0ZV9zcGxpdHRlciBmb3IgUlNwZWMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RTdWl0ZVNwbGl0dGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuZ3JvdXBzIC0gVG90YWwgbnVtYmVyIG9mIGdyb3Vwcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuZ3JvdXBOdW1iZXIgLSBXaGljaCBncm91cCB0byByZXR1cm4gKDEtaW5kZXhlZCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MudGVzdEZpbGVzIC0gQWxsIGRpc2NvdmVyZWQgdGVzdCBmaWxlIHBhdGhzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYmFzZURpcmVjdG9yeV0gLSBCYXNlIGRpcmVjdG9yeSBmb3IgcmVsYXRpdmUgcGF0aCBjb21wdXRhdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtncm91cHMsIGdyb3VwTnVtYmVyLCB0ZXN0RmlsZXMsIGJhc2VEaXJlY3RvcnksIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZ3JvdXBzKSB8fCBncm91cHMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYC0tZ3JvdXBzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3Q6ICR7Z3JvdXBzfWApXG4gICAgfVxuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGdyb3VwTnVtYmVyKSB8fCBncm91cE51bWJlciA8IDEgfHwgZ3JvdXBOdW1iZXIgPiBncm91cHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgLS1ncm91cC1udW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7Z3JvdXBzfSwgZ290OiAke2dyb3VwTnVtYmVyfWApXG4gICAgfVxuXG4gICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzXG4gICAgdGhpcy5fZ3JvdXBOdW1iZXIgPSBncm91cE51bWJlclxuICAgIHRoaXMuX3Rlc3RGaWxlcyA9IHRlc3RGaWxlc1xuICAgIHRoaXMuX2Jhc2VEaXJlY3RvcnkgPSBiYXNlRGlyZWN0b3J5IHx8IHByb2Nlc3MuY3dkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXN0IGZpbGVzIGFzc2lnbmVkIHRvIHRoaXMgZ3JvdXAuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBGaWxlIHBhdGhzIGZvciB0aGUgcmVxdWVzdGVkIGdyb3VwLlxuICAgKi9cbiAgZ2V0R3JvdXBGaWxlcygpIHtcbiAgICBjb25zdCB3ZWlnaHRlZCA9IHRoaXMuY29tcHV0ZVdlaWdodGVkRmlsZXMoKVxuICAgIGNvbnN0IHNvcnRlZCA9IHRoaXMuc29ydEJ5V2VpZ2h0RGVzY2VuZGluZyh3ZWlnaHRlZClcbiAgICBjb25zdCBidWNrZXRzID0gdGhpcy5kaXN0cmlidXRlR3JlZWRpbHkoc29ydGVkKVxuXG4gICAgcmV0dXJuIGJ1Y2tldHNbdGhpcy5fZ3JvdXBOdW1iZXIgLSAxXS5maWxlc1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHdlaWdodCBmb3IgZWFjaCB0ZXN0IGZpbGUgYmFzZWQgb24gZGlyZWN0b3J5IHR5cGUgYW5kIGZpbGUgc3VmZml4LlxuICAgKiBAcmV0dXJucyB7U3BsaXR0ZXJGaWxlRW50cnlbXX0gLSBXZWlnaHRlZCBmaWxlIGVudHJpZXMuXG4gICAqL1xuICBjb21wdXRlV2VpZ2h0ZWRGaWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVzdEZpbGVzLm1hcCgoZmlsZVBhdGgpID0+ICh7XG4gICAgICBmaWxlUGF0aCxcbiAgICAgIHdlaWdodDogdGhpcy5jb21wdXRlV2VpZ2h0KGZpbGVQYXRoKVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSB3ZWlnaHQgZm9yIGEgc2luZ2xlIGZpbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIEFic29sdXRlIGZpbGUgcGF0aC5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBXZWlnaHQgdmFsdWUuXG4gICAqL1xuICBjb21wdXRlV2VpZ2h0KGZpbGVQYXRoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLl9iYXNlRGlyZWN0b3J5LCBmaWxlUGF0aCkuc3BsaXQocGF0aC5zZXApLmpvaW4oXCIvXCIpXG4gICAgbGV0IHdlaWdodCA9IERFRkFVTFRfV0VJR0hUXG5cbiAgICAvLyBFeHRyYWN0IHRoZSB0eXBlIGRpcmVjdG9yeSBmcm9tIHRoZSByZWxhdGl2ZSBwYXRoLlxuICAgIC8vIE1hdGNoZXMgYm90aCBcInNwZWMvc3lzdGVtLy4uLlwiIChiYXNlIGlzIHByb2plY3Qgcm9vdCkgYW5kIFwic3lzdGVtLy4uLlwiIChiYXNlIGlzIHNwZWMvIGl0c2VsZikuXG4gICAgY29uc3Qgc3BlY0Rpck1hdGNoID0gcmVsYXRpdmVQYXRoLm1hdGNoKC9eKD86KD86c3BlY3xfX3Rlc3RzX198dGVzdHMpXFwvKT8oW14vXSspXFwvLylcblxuICAgIGlmIChzcGVjRGlyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBzcGVjRGlyTWF0Y2hbMV1cblxuICAgICAgaWYgKERJUkVDVE9SWV9XRUlHSFRTW2Rpck5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2VpZ2h0ID0gRElSRUNUT1JZX1dFSUdIVFNbZGlyTmFtZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCcm93c2VyIHNwZWMgZmlsZXMgYXJlIGhlYXZpZXJcbiAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuYnJvd3Nlci1zcGVjLmpzXCIpIHx8IGZpbGVQYXRoLmVuZHNXaXRoKFwiLmJyb3dzZXItc3BlYy5tanNcIikpIHtcbiAgICAgIHdlaWdodCAqPSBCUk9XU0VSX1NQRUNfTVVMVElQTElFUlxuICAgIH1cblxuICAgIHJldHVybiB3ZWlnaHRcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyBmaWxlcyBieSB3ZWlnaHQgZGVzY2VuZGluZywgdGhlbiBieSBwYXRoIGZvciBkZXRlcm1pbmlzbS5cbiAgICogQHBhcmFtIHtTcGxpdHRlckZpbGVFbnRyeVtdfSBmaWxlcyAtIFdlaWdodGVkIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7U3BsaXR0ZXJGaWxlRW50cnlbXX0gLSBTb3J0ZWQgZmlsZXMuXG4gICAqL1xuICBzb3J0QnlXZWlnaHREZXNjZW5kaW5nKGZpbGVzKSB7XG4gICAgcmV0dXJuIFsuLi5maWxlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGIud2VpZ2h0ICE9PSBhLndlaWdodCkge1xuICAgICAgICByZXR1cm4gYi53ZWlnaHQgLSBhLndlaWdodFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5maWxlUGF0aC5sb2NhbGVDb21wYXJlKGIuZmlsZVBhdGgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0cmlidXRlcyBmaWxlcyBncmVlZGlseSBpbnRvIE4gYmFsYW5jZWQgZ3JvdXBzLlxuICAgKiBFYWNoIGZpbGUgaXMgYXNzaWduZWQgdG8gdGhlIGdyb3VwIHdpdGggdGhlIGxlYXN0IGFjY3VtdWxhdGVkIHdlaWdodC5cbiAgICogQHBhcmFtIHtTcGxpdHRlckZpbGVFbnRyeVtdfSBzb3J0ZWRGaWxlcyAtIEZpbGVzIHNvcnRlZCBieSB3ZWlnaHQgZGVzY2VuZGluZy5cbiAgICogQHJldHVybnMge0dyb3VwQnVja2V0W119IC0gQXJyYXkgb2YgZ3JvdXAgYnVja2V0cy5cbiAgICovXG4gIGRpc3RyaWJ1dGVHcmVlZGlseShzb3J0ZWRGaWxlcykge1xuICAgIC8qKiBAdHlwZSB7R3JvdXBCdWNrZXRbXX0gKi9cbiAgICBjb25zdCBidWNrZXRzID0gW11cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZ3JvdXBzOyBpKyspIHtcbiAgICAgIGJ1Y2tldHMucHVzaCh7dG90YWxXZWlnaHQ6IDAsIGZpbGVzOiBbXX0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3J0ZWRGaWxlcykge1xuICAgICAgY29uc3QgbGlnaHRlc3QgPSB0aGlzLmZpbmRMaWdodGVzdEJ1Y2tldChidWNrZXRzKVxuXG4gICAgICBsaWdodGVzdC5maWxlcy5wdXNoKGVudHJ5LmZpbGVQYXRoKVxuICAgICAgbGlnaHRlc3QudG90YWxXZWlnaHQgKz0gZW50cnkud2VpZ2h0XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1Y2tldHNcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgYnVja2V0IHdpdGggdGhlIGxlYXN0IGFjY3VtdWxhdGVkIHdlaWdodC5cbiAgICogVGllcyBhcmUgYnJva2VuIGJ5IGJ1Y2tldCBpbmRleCAoZWFybGllciBidWNrZXQgd2lucykgZm9yIGRldGVybWluaXNtLlxuICAgKiBAcGFyYW0ge0dyb3VwQnVja2V0W119IGJ1Y2tldHMgLSBHcm91cCBidWNrZXRzLlxuICAgKiBAcmV0dXJucyB7R3JvdXBCdWNrZXR9IC0gVGhlIGxpZ2h0ZXN0IGJ1Y2tldC5cbiAgICovXG4gIGZpbmRMaWdodGVzdEJ1Y2tldChidWNrZXRzKSB7XG4gICAgbGV0IGxpZ2h0ZXN0ID0gYnVja2V0c1swXVxuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBidWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYnVja2V0c1tpXS50b3RhbFdlaWdodCA8IGxpZ2h0ZXN0LnRvdGFsV2VpZ2h0KSB7XG4gICAgICAgIGxpZ2h0ZXN0ID0gYnVja2V0c1tpXVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaWdodGVzdFxuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/scheduler.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/where-base.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/user-module.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/frontend-model-resource/base-resource.js","../src/frontend-models/base.js","../src/frontend-models/model-registry.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/index.js","../src/http-server/server-client.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/testing/base-expect.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/format-value.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test.js","../src/utils/backtrace-cleaner.js","../src/utils/ensure-error.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/nest-callbacks.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"5.9.3"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/scheduler.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/where-base.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/user-module.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/frontend-model-resource/base-resource.js","../src/frontend-models/base.js","../src/frontend-models/model-registry.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/index.js","../src/http-server/server-client.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/testing/base-expect.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/format-value.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/utils/backtrace-cleaner.js","../src/utils/ensure-error.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/nest-callbacks.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"5.9.3"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.262",
6
+ "version": "1.0.263",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [