@lingxia/test 0.17.0 → 0.19.0

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 (126) hide show
  1. package/dist/clock.d.ts +30 -0
  2. package/dist/clock.d.ts.map +1 -0
  3. package/dist/clock.js +99 -0
  4. package/dist/clock.js.map +1 -0
  5. package/dist/coverage.d.ts +25 -0
  6. package/dist/coverage.d.ts.map +1 -0
  7. package/dist/coverage.js +92 -0
  8. package/dist/coverage.js.map +1 -0
  9. package/dist/deadline.d.ts +82 -0
  10. package/dist/deadline.d.ts.map +1 -0
  11. package/dist/deadline.js +184 -0
  12. package/dist/deadline.js.map +1 -0
  13. package/dist/dialogs.d.ts +28 -0
  14. package/dist/dialogs.d.ts.map +1 -0
  15. package/dist/dialogs.js +74 -0
  16. package/dist/dialogs.js.map +1 -0
  17. package/dist/equal.d.ts +28 -0
  18. package/dist/equal.d.ts.map +1 -0
  19. package/dist/equal.js +149 -0
  20. package/dist/equal.js.map +1 -0
  21. package/dist/errors.d.ts +8 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +37 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/expect.d.ts +35 -7
  26. package/dist/expect.d.ts.map +1 -1
  27. package/dist/expect.js +216 -68
  28. package/dist/expect.js.map +1 -1
  29. package/dist/fixture.d.ts +205 -40
  30. package/dist/fixture.d.ts.map +1 -1
  31. package/dist/fixture.js +1178 -156
  32. package/dist/fixture.js.map +1 -1
  33. package/dist/format.d.ts +2 -0
  34. package/dist/format.d.ts.map +1 -1
  35. package/dist/format.js +78 -0
  36. package/dist/format.js.map +1 -1
  37. package/dist/host-types.d.ts +65 -0
  38. package/dist/host-types.d.ts.map +1 -0
  39. package/dist/host-types.js +2 -0
  40. package/dist/host-types.js.map +1 -0
  41. package/dist/host.d.ts +20 -0
  42. package/dist/host.d.ts.map +1 -1
  43. package/dist/host.js +34 -2
  44. package/dist/host.js.map +1 -1
  45. package/dist/ids.d.ts +16 -0
  46. package/dist/ids.d.ts.map +1 -1
  47. package/dist/ids.js +38 -3
  48. package/dist/ids.js.map +1 -1
  49. package/dist/index.d.ts +5 -7
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +3 -5
  52. package/dist/index.js.map +1 -1
  53. package/dist/json-result.d.ts +3 -0
  54. package/dist/json-result.d.ts.map +1 -0
  55. package/dist/json-result.js +62 -0
  56. package/dist/json-result.js.map +1 -0
  57. package/dist/junit.d.ts +1 -1
  58. package/dist/junit.d.ts.map +1 -1
  59. package/dist/junit.js +40 -5
  60. package/dist/junit.js.map +1 -1
  61. package/dist/locator.d.ts +116 -7
  62. package/dist/locator.d.ts.map +1 -1
  63. package/dist/locator.js +444 -58
  64. package/dist/locator.js.map +1 -1
  65. package/dist/mock.d.ts +43 -0
  66. package/dist/mock.d.ts.map +1 -0
  67. package/dist/mock.js +162 -0
  68. package/dist/mock.js.map +1 -0
  69. package/dist/network.d.ts +68 -0
  70. package/dist/network.d.ts.map +1 -0
  71. package/dist/network.js +287 -0
  72. package/dist/network.js.map +1 -0
  73. package/dist/openapi.d.ts +127 -0
  74. package/dist/openapi.d.ts.map +1 -0
  75. package/dist/openapi.js +414 -0
  76. package/dist/openapi.js.map +1 -0
  77. package/dist/pending.d.ts +84 -0
  78. package/dist/pending.d.ts.map +1 -0
  79. package/dist/pending.js +311 -0
  80. package/dist/pending.js.map +1 -0
  81. package/dist/redact.d.ts +41 -0
  82. package/dist/redact.d.ts.map +1 -0
  83. package/dist/redact.js +168 -0
  84. package/dist/redact.js.map +1 -0
  85. package/dist/remote.d.ts +32 -0
  86. package/dist/remote.d.ts.map +1 -0
  87. package/dist/remote.js +117 -0
  88. package/dist/remote.js.map +1 -0
  89. package/dist/report-extras.d.ts +16 -0
  90. package/dist/report-extras.d.ts.map +1 -0
  91. package/dist/report-extras.js +125 -0
  92. package/dist/report-extras.js.map +1 -0
  93. package/dist/report-types.d.ts +428 -0
  94. package/dist/report-types.d.ts.map +1 -0
  95. package/dist/report-types.js +6 -0
  96. package/dist/report-types.js.map +1 -0
  97. package/dist/report.d.ts +15 -1
  98. package/dist/report.d.ts.map +1 -1
  99. package/dist/report.js +196 -19
  100. package/dist/report.js.map +1 -1
  101. package/dist/runner.d.ts +13 -0
  102. package/dist/runner.d.ts.map +1 -0
  103. package/dist/runner.js +11 -0
  104. package/dist/runner.js.map +1 -0
  105. package/dist/runtime.d.ts +55 -4
  106. package/dist/runtime.d.ts.map +1 -1
  107. package/dist/runtime.js +1500 -139
  108. package/dist/runtime.js.map +1 -1
  109. package/dist/schema.d.ts +29 -0
  110. package/dist/schema.d.ts.map +1 -0
  111. package/dist/schema.js +463 -0
  112. package/dist/schema.js.map +1 -0
  113. package/dist/spec-api.d.ts +10 -2
  114. package/dist/spec-api.d.ts.map +1 -1
  115. package/dist/tags.d.ts +26 -0
  116. package/dist/tags.d.ts.map +1 -0
  117. package/dist/tags.js +78 -0
  118. package/dist/tags.js.map +1 -0
  119. package/dist/types.d.ts +863 -168
  120. package/dist/types.d.ts.map +1 -1
  121. package/dist/version.d.ts +1 -1
  122. package/dist/version.js +1 -1
  123. package/package.json +18 -5
  124. package/schemas/lxdev.schema.json +50 -0
  125. package/schemas/mock-config.schema.json +21 -0
  126. package/schemas/scenario.schema.json +180 -0
package/dist/schema.js ADDED
@@ -0,0 +1,463 @@
1
+ /**
2
+ * A JSON Schema validator for the schema objects of OpenAPI 3.0 and 3.1.
3
+ *
4
+ * Dependency-free on purpose: it runs in the test worker on the device,
5
+ * where `expect(...).toMatchSchema()` has to answer synchronously. It covers
6
+ * what API contracts use — `$ref`, `type` (3.1 arrays, 3.0 `nullable`),
7
+ * `enum`/`const`, `required`, `properties`, `additionalProperties`,
8
+ * `patternProperties`, `items`/`prefixItems`, `allOf`/`anyOf`/`oneOf`/`not`
9
+ * (with `discriminator`), `if`/`then`/`else`, and the numeric, string and
10
+ * size bounds. `format` is an annotation: it is never asserted.
11
+ */
12
+ import { isEqual } from "./equal.js";
13
+ const MAX_ISSUES = 20;
14
+ const MAX_REF_HOPS = 64;
15
+ /** No `$ref` entered yet at the current value. */
16
+ const NO_REFS = new Set();
17
+ /** Validate `value`; an empty list means it matches. */
18
+ export function validateSchema(value, schema, schemaPath, context) {
19
+ const issues = new Validator(context).check(value, schema, "", schemaPath, NO_REFS);
20
+ return issues.slice(0, MAX_ISSUES);
21
+ }
22
+ /** Resolve a local `#/…` pointer in `root`; `undefined` when it names nothing. */
23
+ export function resolvePointer(root, ref) {
24
+ if (ref === "#" || ref === "")
25
+ return root;
26
+ if (!ref.startsWith("#/"))
27
+ return undefined;
28
+ let node = root;
29
+ for (const raw of ref.slice(2).split("/")) {
30
+ let key;
31
+ try {
32
+ key = decodeURIComponent(raw).replace(/~1/g, "/").replace(/~0/g, "~");
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ if (node === null || typeof node !== "object" || !Object.prototype.hasOwnProperty.call(node, key)) {
38
+ return undefined;
39
+ }
40
+ node = node[key];
41
+ }
42
+ return node;
43
+ }
44
+ export function pointerSegment(key) {
45
+ return String(key).replace(/~/g, "~0").replace(/\//g, "~1");
46
+ }
47
+ /** `path: message`, one per line, for an assertion or a report. */
48
+ export function formatIssues(issues) {
49
+ return issues.map((issue) => ` at ${issue.path || "/"}: ${issue.message} (${issue.schema})`).join("\n");
50
+ }
51
+ class Validator {
52
+ constructor(context) {
53
+ this.context = context;
54
+ /** `(value, $ref)` results, issue paths relative to the value. */
55
+ this.memo = new Map();
56
+ /** Cycle issues reported so far; a result that saw one is not memoized. */
57
+ this.cycles = 0;
58
+ this.direction = context.direction ?? "response";
59
+ }
60
+ /**
61
+ * `value` against the schema `ref` names, memoized: the same value meets
62
+ * the same `$ref` again through `anyOf`/`oneOf` branches, and checking it
63
+ * afresh each time grows exponentially with nesting.
64
+ */
65
+ checkRef(value, target, ref, refs) {
66
+ let byRef = this.memo.get(value);
67
+ const cached = byRef?.get(ref);
68
+ if (cached)
69
+ return cached;
70
+ const cyclesBefore = this.cycles;
71
+ const entered = new Set(refs);
72
+ entered.add(ref);
73
+ const issues = this.check(value, target, "", ref, entered);
74
+ // A cycle report depends on the refs entered on the way here.
75
+ if (this.cycles === cyclesBefore) {
76
+ if (!byRef) {
77
+ byRef = new Map();
78
+ this.memo.set(value, byRef);
79
+ }
80
+ byRef.set(ref, issues);
81
+ }
82
+ return issues;
83
+ }
84
+ /**
85
+ * `refs`: the `$ref`s already entered for this same value. A `$ref` seen
86
+ * again before the value changes is a cycle that never reaches data; one
87
+ * seen again deeper in the value is ordinary recursive data, however deep.
88
+ */
89
+ check(value, schema, path, at, refs) {
90
+ if (schema === true || schema === undefined)
91
+ return [];
92
+ if (schema === false)
93
+ return [{ path, message: "no value is allowed here", schema: at }];
94
+ if (schema === null || typeof schema !== "object" || Array.isArray(schema)) {
95
+ return [{ path, message: "the contract's schema here is not an object", schema: at }];
96
+ }
97
+ const node = schema;
98
+ if (typeof node.$ref === "string") {
99
+ const ref = node.$ref;
100
+ if (refs.has(ref)) {
101
+ this.cycles += 1;
102
+ return [{ path, message: `$ref ${ref} refers back to itself without matching any value: circular`, schema: at }];
103
+ }
104
+ const target = resolvePointer(this.context.root, ref);
105
+ if (target === undefined) {
106
+ return [{ path, message: `$ref ${ref} does not resolve (only local #/… references are supported)`, schema: at }];
107
+ }
108
+ const viaRef = this.checkRef(value, target, ref, refs).map((issue) => ({ ...issue, path: path + issue.path }));
109
+ // 3.0 ignores a $ref's siblings; 3.1 applies them too.
110
+ if (this.context.dialect === "3.0")
111
+ return viaRef;
112
+ const siblings = { ...node };
113
+ delete siblings.$ref;
114
+ return [...viaRef, ...this.check(value, siblings, path, at, refs)];
115
+ }
116
+ const typeIssue = this.checkType(value, node, path, at);
117
+ if (typeIssue)
118
+ return [typeIssue];
119
+ const issues = [];
120
+ const push = (message) => issues.push({ path, message, schema: at });
121
+ if (Array.isArray(node.enum) && !node.enum.some((option) => isEqual(option, value))) {
122
+ push(`expected one of ${preview(node.enum)}, got ${preview(value)}`);
123
+ }
124
+ if ("const" in node && !isEqual(node.const, value)) {
125
+ push(`expected ${preview(node.const)}, got ${preview(value)}`);
126
+ }
127
+ if (typeof value === "string")
128
+ this.checkString(value, node, push);
129
+ if (typeof value === "number")
130
+ this.checkNumber(value, node, push);
131
+ if (Array.isArray(value))
132
+ issues.push(...this.checkArray(value, node, path, at));
133
+ else if (value !== null && typeof value === "object") {
134
+ issues.push(...this.checkObject(value, node, path, at));
135
+ }
136
+ issues.push(...this.checkCombinators(value, node, path, at, refs));
137
+ return issues;
138
+ }
139
+ checkType(value, node, path, at) {
140
+ const declared = node.type;
141
+ if (declared === undefined)
142
+ return undefined;
143
+ const types = Array.isArray(declared) ? declared.map(String) : [String(declared)];
144
+ const accepted = [...types];
145
+ if (this.context.dialect === "3.0" && node.nullable === true)
146
+ accepted.push("null");
147
+ if (accepted.some((type) => hasType(value, type)))
148
+ return undefined;
149
+ return { path, message: `expected ${accepted.join(" or ")}, got ${describe(value)}`, schema: at, keyword: "type" };
150
+ }
151
+ checkString(value, node, push) {
152
+ const length = [...value].length;
153
+ if (typeof node.minLength === "number" && length < node.minLength) {
154
+ push(`expected at least ${node.minLength} characters, got ${length}`);
155
+ }
156
+ if (typeof node.maxLength === "number" && length > node.maxLength) {
157
+ push(`expected at most ${node.maxLength} characters, got ${length}`);
158
+ }
159
+ if (typeof node.pattern === "string") {
160
+ const pattern = compile(node.pattern);
161
+ if (pattern && !pattern.test(value))
162
+ push(`expected to match /${node.pattern}/, got ${preview(value)}`);
163
+ }
164
+ }
165
+ checkNumber(value, node, push) {
166
+ const exclusiveMin = node.exclusiveMinimum;
167
+ const exclusiveMax = node.exclusiveMaximum;
168
+ if (typeof node.minimum === "number") {
169
+ // 3.0: `exclusiveMinimum: true` turns `minimum` exclusive.
170
+ if (exclusiveMin === true ? value <= node.minimum : value < node.minimum) {
171
+ push(`expected ${exclusiveMin === true ? ">" : ">="} ${node.minimum}, got ${value}`);
172
+ }
173
+ }
174
+ if (typeof node.maximum === "number") {
175
+ if (exclusiveMax === true ? value >= node.maximum : value > node.maximum) {
176
+ push(`expected ${exclusiveMax === true ? "<" : "<="} ${node.maximum}, got ${value}`);
177
+ }
178
+ }
179
+ // 3.1: the exclusive bounds are numbers of their own.
180
+ if (typeof exclusiveMin === "number" && value <= exclusiveMin)
181
+ push(`expected > ${exclusiveMin}, got ${value}`);
182
+ if (typeof exclusiveMax === "number" && value >= exclusiveMax)
183
+ push(`expected < ${exclusiveMax}, got ${value}`);
184
+ if (typeof node.multipleOf === "number" && node.multipleOf > 0) {
185
+ const quotient = value / node.multipleOf;
186
+ if (Math.abs(quotient - Math.round(quotient)) > 1e-9)
187
+ push(`expected a multiple of ${node.multipleOf}, got ${value}`);
188
+ }
189
+ }
190
+ checkArray(value, node, path, at) {
191
+ const issues = [];
192
+ const push = (message) => issues.push({ path, message, schema: at });
193
+ if (typeof node.minItems === "number" && value.length < node.minItems) {
194
+ push(`expected at least ${node.minItems} items, got ${value.length}`);
195
+ }
196
+ if (typeof node.maxItems === "number" && value.length > node.maxItems) {
197
+ push(`expected at most ${node.maxItems} items, got ${value.length}`);
198
+ }
199
+ if (node.uniqueItems === true) {
200
+ for (let i = 1; i < value.length; i += 1) {
201
+ const duplicate = value.slice(0, i).findIndex((earlier) => isEqual(earlier, value[i]));
202
+ if (duplicate >= 0) {
203
+ push(`expected unique items, but items ${duplicate} and ${i} are equal`);
204
+ break;
205
+ }
206
+ }
207
+ }
208
+ const prefix = Array.isArray(node.prefixItems) ? node.prefixItems : [];
209
+ for (let i = 0; i < value.length && issues.length < MAX_ISSUES; i += 1) {
210
+ const itemPath = `${path}/${i}`;
211
+ if (i < prefix.length) {
212
+ issues.push(...this.check(value[i], prefix[i], itemPath, `${at}/prefixItems/${i}`, NO_REFS));
213
+ }
214
+ else if (node.items !== undefined && !Array.isArray(node.items)) {
215
+ issues.push(...this.check(value[i], node.items, itemPath, `${at}/items`, NO_REFS));
216
+ }
217
+ }
218
+ if (node.contains !== undefined) {
219
+ const hits = value.filter((item) => this.check(item, node.contains, path, `${at}/contains`, NO_REFS).length === 0).length;
220
+ const min = typeof node.minContains === "number" ? node.minContains : 1;
221
+ if (hits < min)
222
+ push(`expected at least ${min} item(s) matching \`contains\`, got ${hits}`);
223
+ if (typeof node.maxContains === "number" && hits > node.maxContains) {
224
+ push(`expected at most ${node.maxContains} item(s) matching \`contains\`, got ${hits}`);
225
+ }
226
+ }
227
+ return issues;
228
+ }
229
+ checkObject(value, node, path, at) {
230
+ const issues = [];
231
+ const push = (message) => issues.push({ path, message, schema: at });
232
+ const properties = (isObject(node.properties) ? node.properties : {});
233
+ const keys = Object.keys(value);
234
+ if (typeof node.minProperties === "number" && keys.length < node.minProperties) {
235
+ push(`expected at least ${node.minProperties} properties, got ${keys.length}`);
236
+ }
237
+ if (typeof node.maxProperties === "number" && keys.length > node.maxProperties) {
238
+ push(`expected at most ${node.maxProperties} properties, got ${keys.length}`);
239
+ }
240
+ if (Array.isArray(node.required)) {
241
+ for (const name of node.required) {
242
+ if (typeof name !== "string" || Object.prototype.hasOwnProperty.call(value, name))
243
+ continue;
244
+ if (this.exemptFromRequired(properties[name]))
245
+ continue;
246
+ push(`missing required property ${JSON.stringify(name)}`);
247
+ }
248
+ }
249
+ if (isObject(node.dependentRequired)) {
250
+ for (const [name, needed] of Object.entries(node.dependentRequired)) {
251
+ if (!(name in value) || !Array.isArray(needed))
252
+ continue;
253
+ for (const other of needed) {
254
+ if (typeof other === "string" && !(other in value)) {
255
+ push(`property ${JSON.stringify(name)} requires ${JSON.stringify(other)}`);
256
+ }
257
+ }
258
+ }
259
+ }
260
+ const patterns = isObject(node.patternProperties)
261
+ ? Object.entries(node.patternProperties)
262
+ .map(([source, schema]) => ({ source, schema, regex: compile(source) }))
263
+ : [];
264
+ for (const key of keys) {
265
+ if (issues.length >= MAX_ISSUES)
266
+ break;
267
+ const keyPath = `${path}/${pointerSegment(key)}`;
268
+ let matched = false;
269
+ if (Object.prototype.hasOwnProperty.call(properties, key)) {
270
+ matched = true;
271
+ issues.push(...this.check(value[key], properties[key], keyPath, `${at}/properties/${pointerSegment(key)}`, NO_REFS));
272
+ }
273
+ for (const pattern of patterns) {
274
+ if (!pattern.regex?.test(key))
275
+ continue;
276
+ matched = true;
277
+ issues.push(...this.check(value[key], pattern.schema, keyPath, `${at}/patternProperties/${pointerSegment(pattern.source)}`, NO_REFS));
278
+ }
279
+ if (node.propertyNames !== undefined) {
280
+ for (const issue of this.check(key, node.propertyNames, keyPath, `${at}/propertyNames`, NO_REFS)) {
281
+ issues.push({ ...issue, message: `property name ${JSON.stringify(key)}: ${issue.message}` });
282
+ }
283
+ }
284
+ if (matched)
285
+ continue;
286
+ if (node.additionalProperties === false) {
287
+ issues.push({ path: keyPath, message: `unexpected property ${JSON.stringify(key)} (additionalProperties: false)`, schema: at });
288
+ }
289
+ else if (isObject(node.additionalProperties)) {
290
+ issues.push(...this.check(value[key], node.additionalProperties, keyPath, `${at}/additionalProperties`, NO_REFS));
291
+ }
292
+ }
293
+ return issues;
294
+ }
295
+ /** `writeOnly` properties are not in a response, `readOnly` not in a request. */
296
+ exemptFromRequired(property) {
297
+ const resolved = this.deref(property);
298
+ if (!isObject(resolved))
299
+ return false;
300
+ return this.direction === "response" ? resolved.writeOnly === true : resolved.readOnly === true;
301
+ }
302
+ deref(schema) {
303
+ let node = schema;
304
+ for (let hop = 0; hop < MAX_REF_HOPS && isObject(node) && typeof node.$ref === "string"; hop += 1) {
305
+ node = resolvePointer(this.context.root, node.$ref);
306
+ }
307
+ return node;
308
+ }
309
+ checkCombinators(value, node, path, at, refs) {
310
+ const issues = [];
311
+ if (Array.isArray(node.allOf)) {
312
+ node.allOf.forEach((branch, index) => {
313
+ issues.push(...this.check(value, branch, path, `${at}/allOf/${index}`, refs));
314
+ });
315
+ }
316
+ for (const keyword of ["anyOf", "oneOf"]) {
317
+ const branches = node[keyword];
318
+ if (!Array.isArray(branches))
319
+ continue;
320
+ const chosen = this.discriminated(value, node, branches, keyword, path, at);
321
+ if (chosen) {
322
+ if ("issue" in chosen)
323
+ issues.push(chosen.issue);
324
+ else
325
+ issues.push(...this.check(value, chosen.branch, path, `${at}/${keyword}/${chosen.index}`, refs));
326
+ continue;
327
+ }
328
+ const results = branches.map((branch, index) => this.check(value, branch, path, `${at}/${keyword}/${index}`, refs));
329
+ const passing = results.flatMap((result, index) => (result.length === 0 ? [index] : []));
330
+ if (passing.length === 0) {
331
+ const best = closest(results, path);
332
+ issues.push({
333
+ path,
334
+ message: `matches none of the ${branches.length} ${keyword} alternatives${best ? `; closest is #${best.index}` : ""}`,
335
+ schema: `${at}/${keyword}`,
336
+ });
337
+ if (best)
338
+ issues.push(...best.issues);
339
+ }
340
+ else if (keyword === "oneOf" && passing.length > 1) {
341
+ issues.push({
342
+ path,
343
+ message: `matches ${passing.length} oneOf alternatives (#${passing.join(", #")}); exactly one must match`,
344
+ schema: `${at}/oneOf`,
345
+ });
346
+ }
347
+ }
348
+ if (node.not !== undefined && this.check(value, node.not, path, `${at}/not`, refs).length === 0) {
349
+ issues.push({ path, message: "matches the schema under `not`", schema: `${at}/not` });
350
+ }
351
+ if (node.if !== undefined) {
352
+ const holds = this.check(value, node.if, path, `${at}/if`, refs).length === 0;
353
+ const next = holds ? node.then : node.else;
354
+ if (next !== undefined)
355
+ issues.push(...this.check(value, next, path, `${at}/${holds ? "then" : "else"}`, refs));
356
+ }
357
+ return issues;
358
+ }
359
+ /**
360
+ * With a `discriminator`, the property names the one branch that applies:
361
+ * its errors are the useful ones, not "matches none of 4 alternatives".
362
+ */
363
+ discriminated(value, node, branches, keyword, path, at) {
364
+ const discriminator = node.discriminator;
365
+ if (!isObject(discriminator) || typeof discriminator.propertyName !== "string")
366
+ return undefined;
367
+ if (!isObject(value))
368
+ return undefined;
369
+ const name = discriminator.propertyName;
370
+ const tag = value[name];
371
+ if (typeof tag !== "string") {
372
+ return { issue: { path, message: `missing discriminator property ${JSON.stringify(name)}`, schema: `${at}/discriminator` } };
373
+ }
374
+ const mapping = isObject(discriminator.mapping) ? discriminator.mapping : {};
375
+ const mapped = mapping[tag];
376
+ const target = typeof mapped === "string"
377
+ ? (mapped.startsWith("#") ? mapped : `#/components/schemas/${mapped}`)
378
+ : `#/components/schemas/${tag}`;
379
+ const index = branches.findIndex((branch) => isObject(branch) && branch.$ref === target);
380
+ if (index < 0) {
381
+ const known = [
382
+ ...Object.keys(mapping),
383
+ ...branches.flatMap((branch) => isObject(branch) && typeof branch.$ref === "string" ? [branch.$ref.split("/").pop()] : []),
384
+ ];
385
+ return {
386
+ issue: {
387
+ path: `${path}/${pointerSegment(name)}`,
388
+ message: `discriminator ${JSON.stringify(tag)} names no ${keyword} alternative (known: ${[...new Set(known)].join(", ")})`,
389
+ schema: `${at}/discriminator`,
390
+ },
391
+ };
392
+ }
393
+ return { branch: branches[index], index };
394
+ }
395
+ }
396
+ /** The failing branch most likely meant: its type fits, then fewest issues. */
397
+ function closest(results, path) {
398
+ let best;
399
+ results.forEach((issues, index) => {
400
+ const typeMiss = issues.some((issue) => issue.path === path && issue.keyword === "type");
401
+ const score = (typeMiss ? 1000 : 0) + issues.length;
402
+ if (!best || score < best.score)
403
+ best = { index, issues, score };
404
+ });
405
+ return best && best.score < 1000 ? { index: best.index, issues: best.issues } : undefined;
406
+ }
407
+ function hasType(value, type) {
408
+ switch (type) {
409
+ case "null": return value === null;
410
+ case "boolean": return typeof value === "boolean";
411
+ case "string": return typeof value === "string";
412
+ case "number": return typeof value === "number" && Number.isFinite(value);
413
+ case "integer": return typeof value === "number" && Number.isInteger(value);
414
+ case "array": return Array.isArray(value);
415
+ case "object": return isObject(value);
416
+ default: return false;
417
+ }
418
+ }
419
+ function isObject(value) {
420
+ return value !== null && typeof value === "object" && !Array.isArray(value);
421
+ }
422
+ function describe(value) {
423
+ if (value === null)
424
+ return "null";
425
+ if (Array.isArray(value))
426
+ return `array (${value.length} items)`;
427
+ if (typeof value === "object")
428
+ return "object";
429
+ if (typeof value === "number" && Number.isInteger(value))
430
+ return `integer ${value}`;
431
+ return `${typeof value} ${preview(value)}`;
432
+ }
433
+ function preview(value) {
434
+ let text;
435
+ try {
436
+ text = JSON.stringify(value) ?? String(value);
437
+ }
438
+ catch {
439
+ text = String(value);
440
+ }
441
+ return text.length > 80 ? `${text.slice(0, 77)}...` : text;
442
+ }
443
+ const compiled = new Map();
444
+ /** ECMA-262 is what JSON Schema patterns are; a pattern JS rejects is skipped. */
445
+ function compile(source) {
446
+ if (!compiled.has(source)) {
447
+ let regex = null;
448
+ try {
449
+ regex = new RegExp(source, "u");
450
+ }
451
+ catch {
452
+ try {
453
+ regex = new RegExp(source);
454
+ }
455
+ catch {
456
+ regex = null;
457
+ }
458
+ }
459
+ compiled.set(source, regex);
460
+ }
461
+ return compiled.get(source) ?? null;
462
+ }
463
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { SpecBody, SpecOptions } from "./types.js";
1
+ import type { FailOptions, FileOptions, SpecBody, SpecOptions } from "./types.js";
2
2
  export interface SpecApi {
3
3
  (title: string, body: SpecBody): void;
4
4
  (title: string, options: SpecOptions, body: SpecBody): void;
@@ -9,7 +9,15 @@ export interface SpecApi {
9
9
  fixme(title: string, body?: SpecBody): void;
10
10
  fixme(title: string, options: SpecOptions, body?: SpecBody): void;
11
11
  fail(title: string, body: SpecBody): void;
12
- fail(title: string, options: SpecOptions, body: SpecBody): void;
12
+ fail(title: string, options: FailOptions, body: SpecBody): void;
13
+ /** Restore product state before every attempt; required for retries. */
14
+ reset(fn: SpecBody): void;
13
15
  beforeEach(fn: SpecBody): void;
16
+ afterEach(fn: SpecBody): void;
17
+ /**
18
+ * Defaults for every spec in the calling file, such as `{ tags: ['routed'] }`.
19
+ * File-scoped like the hooks; calling it again adds to the file's tags.
20
+ */
21
+ configure(options: FileOptions): void;
14
22
  }
15
23
  //# sourceMappingURL=spec-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec-api.d.ts","sourceRoot":"","sources":["../src/spec-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,OAAO;IACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChE,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAC;CAChC"}
1
+ {"version":3,"file":"spec-api.d.ts","sourceRoot":"","sources":["../src/spec-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,WAAW,OAAO;IACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChE,wEAAwE;IACxE,KAAK,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CACvC"}
package/dist/tags.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import type { CaseRecord, TagSummary } from "./report-types.js";
2
+ /** The report's bucket for specs without any tag; not a valid tag itself. */
3
+ export declare const UNTAGGED = "(untagged)";
4
+ export declare function validateTags(tags: unknown, where: string): string[];
5
+ /** One `--tag` value: any of its terms; `!tag` is "does not have tag". */
6
+ export interface TagClause {
7
+ source: string;
8
+ terms: Array<{
9
+ tag: string;
10
+ negated: boolean;
11
+ }>;
12
+ }
13
+ /**
14
+ * Parse `--tag` values. Each value is a clause whose comma-separated terms
15
+ * are alternatives (`a,b` = has a or b; `!a` = has no a); several clauses
16
+ * must all hold. Throws on an empty term or an invalid tag.
17
+ */
18
+ export declare function parseTagFilter(values: readonly string[]): TagClause[];
19
+ /**
20
+ * Whether a spec with `tags` passes every clause. A spec without tags has
21
+ * none of them: it fails `--tag routed` and passes `--tag '!live'`.
22
+ */
23
+ export declare function matchesTags(tags: readonly string[], clauses: readonly TagClause[]): boolean;
24
+ /** Specs with tag X, by status: a failing `live` group cannot hide a clean `routed` one. */
25
+ export declare function tagSummary(cases: readonly CaseRecord[]): TagSummary[];
26
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAc,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAS5E,6EAA6E;AAC7E,eAAO,MAAM,QAAQ,eAAe,CAAC;AAErC,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAanE;AAED,0EAA0E;AAC1E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,CAerE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAG3F;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAwBrE"}
package/dist/tags.js ADDED
@@ -0,0 +1,78 @@
1
+ /**
2
+ * A tag names a layer or a slice of the suite (`unit`, `routed`, `live`,
3
+ * `smoke`). Letters, digits and `_ . : / -`, starting with a letter or
4
+ * digit, so a tag never collides with the `!` and `,` of a selection.
5
+ */
6
+ const TAG = /^[A-Za-z0-9][A-Za-z0-9_.:/-]*$/;
7
+ /** The report's bucket for specs without any tag; not a valid tag itself. */
8
+ export const UNTAGGED = "(untagged)";
9
+ export function validateTags(tags, where) {
10
+ if (tags === undefined)
11
+ return [];
12
+ if (!Array.isArray(tags))
13
+ throw new TypeError(`${where} tags must be an array of strings`);
14
+ const out = [];
15
+ for (const tag of tags) {
16
+ if (typeof tag !== "string" || !TAG.test(tag)) {
17
+ throw new TypeError(`${where} tag ${JSON.stringify(tag)} is invalid: use letters, digits and _ . : / -, starting with a letter or digit`);
18
+ }
19
+ if (!out.includes(tag))
20
+ out.push(tag);
21
+ }
22
+ return out;
23
+ }
24
+ /**
25
+ * Parse `--tag` values. Each value is a clause whose comma-separated terms
26
+ * are alternatives (`a,b` = has a or b; `!a` = has no a); several clauses
27
+ * must all hold. Throws on an empty term or an invalid tag.
28
+ */
29
+ export function parseTagFilter(values) {
30
+ return values.map((source) => {
31
+ const terms = source.split(",").map((raw) => {
32
+ const term = raw.trim();
33
+ const negated = term.startsWith("!");
34
+ const tag = negated ? term.slice(1).trim() : term;
35
+ if (!TAG.test(tag)) {
36
+ throw new Error(`--tag ${JSON.stringify(source)}: ${JSON.stringify(term)} is not a tag or !tag`);
37
+ }
38
+ return { tag, negated };
39
+ });
40
+ return { source, terms };
41
+ });
42
+ }
43
+ /**
44
+ * Whether a spec with `tags` passes every clause. A spec without tags has
45
+ * none of them: it fails `--tag routed` and passes `--tag '!live'`.
46
+ */
47
+ export function matchesTags(tags, clauses) {
48
+ return clauses.every((clause) => clause.terms.some((term) => tags.includes(term.tag) !== term.negated));
49
+ }
50
+ /** Specs with tag X, by status: a failing `live` group cannot hide a clean `routed` one. */
51
+ export function tagSummary(cases) {
52
+ const buckets = new Map();
53
+ const touch = (tag) => {
54
+ let entry = buckets.get(tag);
55
+ if (!entry) {
56
+ entry = { tag, total: 0, passed: 0, failed: 0, skipped: 0, timeout: 0, xfail: 0, xpass: 0, flaky: 0, ok: true };
57
+ buckets.set(tag, entry);
58
+ }
59
+ return entry;
60
+ };
61
+ const anyTagged = cases.some((item) => (item.tags ?? []).length > 0);
62
+ if (!anyTagged)
63
+ return [];
64
+ for (const item of cases) {
65
+ const tags = item.tags && item.tags.length > 0 ? item.tags : [UNTAGGED];
66
+ for (const tag of tags) {
67
+ const entry = touch(tag);
68
+ entry.total += 1;
69
+ entry[item.status] += 1;
70
+ if (item.flaky)
71
+ entry.flaky += 1;
72
+ if (item.status === "failed" || item.status === "timeout" || item.status === "xpass")
73
+ entry.ok = false;
74
+ }
75
+ }
76
+ return [...buckets.values()].sort((left, right) => left.tag === UNTAGGED ? 1 : right.tag === UNTAGGED ? -1 : left.tag.localeCompare(right.tag));
77
+ }
78
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"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"}