@lingxia/test 0.18.0 → 0.20.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 +201 -23
  30. package/dist/fixture.d.ts.map +1 -1
  31. package/dist/fixture.js +1127 -157
  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 +33 -1
  44. package/dist/host.js.map +1 -1
  45. package/dist/ids.d.ts +14 -0
  46. package/dist/ids.d.ts.map +1 -1
  47. package/dist/ids.js +37 -2
  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 +32 -4
  60. package/dist/junit.js.map +1 -1
  61. package/dist/locator.d.ts +87 -9
  62. package/dist/locator.d.ts.map +1 -1
  63. package/dist/locator.js +413 -86
  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 +195 -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 +54 -4
  106. package/dist/runtime.d.ts.map +1 -1
  107. package/dist/runtime.js +1375 -97
  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 +7 -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 +852 -165
  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
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Function-form eval: a spec passes a function, the fixture sends its source.
3
+ *
4
+ * Both targets already accept a script string, but they classify it with
5
+ * different heuristics (Logic tries an expression, then a function body; the
6
+ * WebView awaits an expression unless it starts with a statement keyword).
7
+ * The script built here is one parenthesised call expression, which both read
8
+ * the same way, so a spec never meets either heuristic.
9
+ */
10
+ export type RemoteTarget = "logic" | "page";
11
+ /** `fn.toString()`, rejecting what cannot be re-evaluated as an expression. */
12
+ export declare function functionSource(fn: unknown, api: string): string;
13
+ export declare function checkJsonArgs(args: readonly unknown[], api: string): void;
14
+ /**
15
+ * Logic: a direct `eval` in the runtime, so `lx` here is the runtime's
16
+ * recording binding and `lx.*` coverage keeps working. `getApp` and
17
+ * `getCurrentPages` are read defensively: a missing one must surface as
18
+ * `undefined` in the scope, not as a ReferenceError blamed on the spec.
19
+ */
20
+ export declare function logicScript(fn: unknown, args: readonly unknown[], api?: string, result?: "strict" | "snapshot"): string;
21
+ /** WebView: evaluated as `await (<expression>)`. */
22
+ export declare function pageScript(fn: unknown, args: readonly unknown[], api?: string): string;
23
+ export declare function isRetryableRemoteError(error: unknown): boolean;
24
+ /**
25
+ * The usual way a function-form eval fails: it closed over something from
26
+ * the spec, which does not exist where it runs. Say so, keeping the original
27
+ * error's code and data.
28
+ */
29
+ export declare function explainRemoteError(error: unknown, api: string, target: RemoteTarget): unknown;
30
+ /** Report detail for a function-form eval: its source, whitespace-collapsed. */
31
+ export declare function functionDetail(fn: unknown): string;
32
+ //# sourceMappingURL=remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAK5C,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAiB/D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzE;AAQD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,GAAG,SAAqB,EAAE,MAAM,GAAE,QAAQ,GAAG,UAAqB,GAAG,MAAM,CAY7I;AAQD,oDAAoD;AACpD,wBAAgB,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,GAAG,SAAoB,GAAG,MAAM,CAOjG;AAGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CA2B7F;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAMlD"}
package/dist/remote.js ADDED
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Function-form eval: a spec passes a function, the fixture sends its source.
3
+ *
4
+ * Both targets already accept a script string, but they classify it with
5
+ * different heuristics (Logic tries an expression, then a function body; the
6
+ * WebView awaits an expression unless it starts with a statement keyword).
7
+ * The script built here is one parenthesised call expression, which both read
8
+ * the same way, so a spec never meets either heuristic.
9
+ */
10
+ import { jsonResult } from "./json-result.js";
11
+ const FUNCTION_SOURCE = /^\s*(?:async\s*)?(?:function\b|\(|[A-Za-z_$][\w$]*\s*=>)/;
12
+ /** `fn.toString()`, rejecting what cannot be re-evaluated as an expression. */
13
+ export function functionSource(fn, api) {
14
+ if (typeof fn !== "function") {
15
+ throw new TypeError(`${api} expects a function or { script }`);
16
+ }
17
+ const source = Function.prototype.toString.call(fn);
18
+ if (/\{\s*\[native code\]\s*\}\s*$/.test(source)) {
19
+ throw new TypeError(`${api}: a bound or native function has no source to send; pass an inline function`);
20
+ }
21
+ if (!FUNCTION_SOURCE.test(source)) {
22
+ throw new TypeError(`${api}: pass an arrow or function expression, not a method or class ` +
23
+ `(received ${JSON.stringify(source.slice(0, 40))})`);
24
+ }
25
+ return source;
26
+ }
27
+ export function checkJsonArgs(args, api) {
28
+ args.forEach((value, index) => jsonResult(value, api, false, `args[${index}]`));
29
+ }
30
+ function argsLiteral(args, api) {
31
+ const json = JSON.stringify(args.map((value, index) => jsonResult(value, api, false, `args[${index}]`)));
32
+ // JSON object keys such as __proto__ must remain data in the target realm.
33
+ return `JSON.parse(${JSON.stringify(json)})`;
34
+ }
35
+ /**
36
+ * Logic: a direct `eval` in the runtime, so `lx` here is the runtime's
37
+ * recording binding and `lx.*` coverage keeps working. `getApp` and
38
+ * `getCurrentPages` are read defensively: a missing one must surface as
39
+ * `undefined` in the scope, not as a ReferenceError blamed on the spec.
40
+ */
41
+ export function logicScript(fn, args, api = "t.app.logic.eval", result = "strict") {
42
+ const source = functionSource(fn, api);
43
+ return [
44
+ "((__lxFn, __lxArgs, __lxResult) => Promise.resolve(__lxFn({",
45
+ " lx,",
46
+ ' getPage: typeof __lxGetPage === "function" ? __lxGetPage : undefined,',
47
+ ' getApp: typeof getApp === "function" ? getApp : undefined,',
48
+ ' getCurrentPages: typeof getCurrentPages === "function" ? getCurrentPages : undefined,',
49
+ `}, ...__lxArgs)).then(value => __lxResult(value, ${JSON.stringify(api)})))(`,
50
+ source,
51
+ `, ${argsLiteral(args, api)}, ${(result === "snapshot" ? jsonSnapshot : jsonResult).toString()})`,
52
+ ].join("\n");
53
+ }
54
+ /** Page data crosses the same JSON boundary as setData. Sent as source. */
55
+ function jsonSnapshot(value) {
56
+ if (value === undefined)
57
+ return undefined;
58
+ return JSON.parse(JSON.stringify(value));
59
+ }
60
+ /** WebView: evaluated as `await (<expression>)`. */
61
+ export function pageScript(fn, args, api = "t.app.view.eval") {
62
+ const source = functionSource(fn, api);
63
+ return [
64
+ `((__lxFn, __lxArgs, __lxResult) => Promise.resolve(__lxFn({ document, window }, ...__lxArgs)).then(value => __lxResult(value, ${JSON.stringify(api)})))(`,
65
+ source,
66
+ `, ${argsLiteral(args, api)}, ${jsonResult.toString()})`,
67
+ ].join("\n");
68
+ }
69
+ const retryableRemoteErrors = new WeakSet();
70
+ export function isRetryableRemoteError(error) {
71
+ return typeof error === "object" && error !== null && retryableRemoteErrors.has(error);
72
+ }
73
+ /**
74
+ * The usual way a function-form eval fails: it closed over something from
75
+ * the spec, which does not exist where it runs. Say so, keeping the original
76
+ * error's code and data.
77
+ */
78
+ export function explainRemoteError(error, api, target) {
79
+ const message = error instanceof Error ? error.message : String(error);
80
+ const name = error instanceof Error ? error.name : "";
81
+ const remoteName = ["ReferenceError", "TypeError", "SyntaxError"].find((candidate) => name === candidate || new RegExp(`\\b${candidate}:`).test(message));
82
+ if (remoteName === undefined)
83
+ return error;
84
+ const where = target === "logic" ? "the app's Logic runtime" : "the page WebView";
85
+ const explained = new Error(remoteName === "ReferenceError"
86
+ ? `${message}\n${api}(fn) runs fn in ${where} from its source text, so it cannot ` +
87
+ "use variables, imports or helpers of the spec. Pass values as JSON " +
88
+ `arguments: ${api}((scope, value) => ..., value).`
89
+ : message);
90
+ // Keep programming failures recognizable to retrying reads.
91
+ explained.name = remoteName;
92
+ const details = error;
93
+ if (details && typeof details === "object") {
94
+ if (details.code !== undefined)
95
+ explained.code = details.code;
96
+ if (details.data !== undefined)
97
+ explained.data = details.data;
98
+ }
99
+ // A DOM null read can throw TypeError until rendering catches up; in Logic
100
+ // a TypeError is a programming mistake. JSON validation errors carry a
101
+ // marker that survives the native error string.
102
+ if (target === "page" && remoteName === "TypeError" && !message.includes("[E_NON_JSON_VALUE]")) {
103
+ retryableRemoteErrors.add(explained);
104
+ }
105
+ explained.cause = error;
106
+ return explained;
107
+ }
108
+ /** Report detail for a function-form eval: its source, whitespace-collapsed. */
109
+ export function functionDetail(fn) {
110
+ try {
111
+ return Function.prototype.toString.call(fn).replace(/\s+/g, " ").trim();
112
+ }
113
+ catch {
114
+ return "";
115
+ }
116
+ }
117
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,MAAM,eAAe,GACnB,0DAA0D,CAAC;AAE7D,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,EAAW,EAAE,GAAW;IACrD,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,GAAG,GAAG,mCAAmC,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,SAAS,CACjB,GAAG,GAAG,6EAA6E,CACpF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CACjB,GAAG,GAAG,gEAAgE;YACpE,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CACtD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAwB,EAAE,GAAW;IACjE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,WAAW,CAAC,IAAwB,EAAE,GAAW;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACzG,2EAA2E;IAC3E,OAAO,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,EAAW,EAAE,IAAwB,EAAE,GAAG,GAAG,kBAAkB,EAAE,SAAgC,QAAQ;IACnI,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO;QACL,6DAA6D;QAC7D,OAAO;QACP,yEAAyE;QACzE,8DAA8D;QAC9D,yFAAyF;QACzF,oDAAoD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM;QAC7E,MAAM;QACN,KAAK,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,GAAG;KAClG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,UAAU,CAAC,EAAW,EAAE,IAAwB,EAAE,GAAG,GAAG,iBAAiB;IACvF,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO;QACL,iIAAiI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM;QAC1J,MAAM;QACN,KAAK,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,UAAU,CAAC,QAAQ,EAAE,GAAG;KACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,qBAAqB,GAAG,IAAI,OAAO,EAAU,CAAC;AACpD,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,GAAW,EAAE,MAAoB;IAClF,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,CAAC,gBAAgB,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACnF,IAAI,KAAK,SAAS,IAAI,IAAI,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,UAAU,KAAK,gBAAgB;QACzD,CAAC,CAAC,GAAG,OAAO,KAAK,GAAG,mBAAmB,KAAK,sCAAsC;YAChF,qEAAqE;YACrE,cAAc,GAAG,iCAAiC;QACpD,CAAC,CAAC,OAAO,CAAgE,CAAC;IAC5E,4DAA4D;IAC5D,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC;IAC5B,MAAM,OAAO,GAAG,KAA2C,CAAC;IAC5D,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC9D,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAChE,CAAC;IACD,2EAA2E;IAC3E,uEAAuE;IACvE,gDAAgD;IAChD,IAAI,MAAM,KAAK,MAAM,IAAI,UAAU,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC/F,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IACD,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,EAAW;IACxC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CaseRecord, CoverageSummary, JsonReport, OpenApiSummary, TagSummary } from "./report-types.js";
2
+ /** One row per tag, so a failing `live` group cannot hide a clean `routed` one. */
3
+ export declare function renderTagSummary(rows: readonly TagSummary[] | undefined): string;
4
+ /** Manifest ids: covered by which specs and how they fared, and the holes. */
5
+ export declare function renderManifestCoverage(coverage: CoverageSummary | undefined): string;
6
+ /** The `--openapi` run summary. */
7
+ export declare function renderContract(openapi: OpenApiSummary | undefined): string;
8
+ /** Tag chips for a case. */
9
+ export declare function renderCaseTags(item: CaseRecord): string;
10
+ /** Contract warnings for a case (violations already are its error). */
11
+ export declare function renderCaseContract(item: CaseRecord): string;
12
+ /** Extra search terms for a case. */
13
+ export declare function caseSearchTerms(item: CaseRecord): string[];
14
+ export declare function hasExtras(report: JsonReport): boolean;
15
+ export declare const EXTRA_STYLE = "\ntable.tagsum { width:100%; border-collapse:collapse; font-size:13px; }\ntable.tagsum th, table.tagsum td { text-align:left; padding:5px 8px; border-bottom:1px solid var(--line); vertical-align:top; }\ntable.tagsum th { color:var(--muted); font-size:11px; text-transform:uppercase; letter-spacing:.05em; }\ntable.tagsum td.num { text-align:right; font-family:var(--mono); width:4em; }\ntable.tagsum td .mini { margin-right:4px; display:inline-block; text-decoration:none; }\ntr.row-fail td:first-child { border-left:3px solid var(--fail); }\ntr.row-ok td:first-child { border-left:3px solid var(--pass); }\n.tag-sel { color:var(--accent); }\n.muted { color:var(--muted); }\n.warn-line { color:var(--skip); margin:0 0 10px; }\nul.plain { margin:4px 0 12px; padding-left:18px; }\n.contract { margin:8px 0; }\n.contract h4, .panel-body h4 { margin:10px 0 4px; font-size:12px; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; }\n";
16
+ //# sourceMappingURL=report-extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-extras.d.ts","sourceRoot":"","sources":["../src/report-extras.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAiB,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAS5H,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,GAAG,MAAM,CAoBhF;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,CAyBpF;AAED,mCAAmC;AACnC,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAsB1E;AASD,4BAA4B;AAC5B,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAGvD;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAI3D;AAED,qCAAqC;AACrC,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAE1D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAErD;AAED,eAAO,MAAM,WAAW,s7BAcvB,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Report panels for tags, the `--covers-manifest` summary and the
3
+ * `--openapi` contract, kept apart from the core report renderer.
4
+ */
5
+ import { escapeHtml } from "./format.js";
6
+ function toneOf(status) {
7
+ if (status === "passed" || status === "xfail")
8
+ return "pass";
9
+ if (status === "skipped" || status === "not_run")
10
+ return "skip";
11
+ if (status === "uncovered")
12
+ return "none";
13
+ return "fail";
14
+ }
15
+ /** One row per tag, so a failing `live` group cannot hide a clean `routed` one. */
16
+ export function renderTagSummary(rows) {
17
+ if (!rows || rows.length === 0)
18
+ return "";
19
+ const failing = rows.filter((row) => !row.ok).length;
20
+ const body = rows.map((row) => {
21
+ const counts = ["passed", "failed", "timeout", "xpass", "xfail", "skipped"]
22
+ .filter((status) => row[status] > 0)
23
+ .map((status) => `<span class="mini ${toneOf(status)}">${row[status]} ${status}</span>`)
24
+ .join("");
25
+ const flaky = row.flaky > 0 ? `<span class="mini skip">${row.flaky} flaky</span>` : "";
26
+ return `<tr class="${row.ok ? "row-ok" : "row-fail"}">
27
+ <td><span class="tag">${escapeHtml(row.tag)}</span></td>
28
+ <td class="num">${row.total}</td>
29
+ <td>${counts}${flaky}</td>
30
+ </tr>`;
31
+ }).join("");
32
+ return `<details class="panel" open>
33
+ <summary><span class="panel-title">By tag</span>
34
+ <span class="panel-sub">${rows.length} tag${rows.length === 1 ? "" : "s"}${failing > 0 ? `, ${failing} failing` : ", all passing"}</span></summary>
35
+ <div class="panel-body"><table class="tagsum"><thead><tr><th>tag</th><th>specs</th><th>outcome</th></tr></thead><tbody>${body}</tbody></table></div>
36
+ </details>`;
37
+ }
38
+ /** Manifest ids: covered by which specs and how they fared, and the holes. */
39
+ export function renderManifestCoverage(coverage) {
40
+ if (!coverage)
41
+ return "";
42
+ const rows = coverage.ids.map((entry) => {
43
+ const specs = entry.specs.length === 0
44
+ ? `<span class="muted">no spec</span>`
45
+ : entry.specs.map((spec) => `<a class="mini ${toneOf(spec.status)}" href="#case-${escapeHtml(spec.id)}" title="${escapeHtml(spec.title)}">${escapeHtml(spec.id)} · ${escapeHtml(spec.status.replace("_", " "))}</a>`).join(" ");
46
+ return `<tr data-search="${escapeHtml(`${entry.id} ${entry.title ?? ""}`)}">
47
+ <td><span class="cover cover-${entry.status === "passed" ? "ok" : entry.status === "uncovered" ? "none" : entry.status === "failed" ? "claimed" : "pending"}">${escapeHtml(entry.id)}</span></td>
48
+ <td>${escapeHtml(entry.title ?? "")}</td>
49
+ <td>${specs}</td>
50
+ </tr>`;
51
+ }).join("");
52
+ const unknown = coverage.unknown.length > 0
53
+ ? `<p class="warn-line">Not in the manifest: ${coverage.unknown.map((entry) => `<code>${escapeHtml(entry.id)}</code> (${entry.specs.map(escapeHtml).join(", ")})`).join(", ")}</p>`
54
+ : "";
55
+ return `<details class="panel" open>
56
+ <summary><span class="panel-title">Coverage manifest</span>
57
+ <span class="panel-sub">${coverage.covered}/${coverage.total} ids covered · ${coverage.passing} passing · ${coverage.failing} failing · ${coverage.uncovered.length} without a spec</span></summary>
58
+ <div class="panel-body">
59
+ ${unknown}
60
+ <table class="tagsum"><thead><tr><th>id</th><th>title</th><th>specs</th></tr></thead><tbody>${rows}</tbody></table>
61
+ </div>
62
+ </details>`;
63
+ }
64
+ /** The `--openapi` run summary. */
65
+ export function renderContract(openapi) {
66
+ if (!openapi)
67
+ return "";
68
+ const docs = openapi.documents.map((doc) => `<span class="chip"><b>${escapeHtml(doc.name)}</b>${escapeHtml(`${doc.title ? `${doc.title} · ` : ""}OpenAPI ${doc.version} · ${doc.operations} operations`)}</span>`).join("");
69
+ const skipped = Object.entries(openapi.skipped).filter(([, count]) => count > 0)
70
+ .map(([reason, count]) => `${count} ${reason.replace("_", " ")}`).join(", ");
71
+ const list = (title, items) => items.length === 0 ? "" : `<h4>${escapeHtml(title)}</h4><ul class="plain">${items.join("")}</ul>`;
72
+ const undocumented = list("Statuses the contract does not document", openapi.undocumented.map((entry) => `<li><code>${escapeHtml(entry.operation)} → ${entry.status}</code> <span class="muted">${escapeHtml(entry.source)} ×${entry.count}</span></li>`));
73
+ const unmatched = list("Requests no operation describes", openapi.unmatched.map((entry) => `<li><code>${escapeHtml(`${entry.method} ${entry.path}`)}</code> <span class="muted">×${entry.count}</span></li>`));
74
+ const warnings = list("Server responses that break the contract (warnings)", openapi.warnings.map((issue) => `<li>${renderIssue(issue)}</li>`));
75
+ const failed = openapi.routed.failed > 0;
76
+ return `<details class="panel"${failed || openapi.warnings.length > 0 ? " open" : ""}>
77
+ <summary><span class="panel-title">OpenAPI contract</span>
78
+ <span class="panel-sub">${openapi.validated}/${openapi.responses} responses validated · routed ${openapi.routed.validated - openapi.routed.failed}/${openapi.routed.validated} ok · server ${openapi.network.validated - openapi.network.mismatched}/${openapi.network.validated} ok${skipped ? ` · skipped: ${escapeHtml(skipped)}` : ""}</span></summary>
79
+ <div class="panel-body">
80
+ <div class="chips">${docs}</div>
81
+ ${warnings}${undocumented}${unmatched}
82
+ </div>
83
+ </details>`;
84
+ }
85
+ function renderIssue(issue) {
86
+ const lines = issue.issues.map((entry) => `at ${entry.path || "/"}: ${entry.message} (${entry.schema})`).join("\n");
87
+ return `<a href="#case-${escapeHtml(issue.case)}"><code>${escapeHtml(issue.case)}</code></a>
88
+ <code>${escapeHtml(`${issue.operation} → ${issue.status}`)}</code> against <code>${escapeHtml(issue.schema)}</code>
89
+ <pre class="message">${escapeHtml(lines)}</pre>`;
90
+ }
91
+ /** Tag chips for a case. */
92
+ export function renderCaseTags(item) {
93
+ const tags = item.tags ?? [];
94
+ return tags.length === 0 ? "" : `<div class="covers">${tags.map((tag) => `<span class="tag tag-sel">#${escapeHtml(tag)}</span>`).join("")}</div>`;
95
+ }
96
+ /** Contract warnings for a case (violations already are its error). */
97
+ export function renderCaseContract(item) {
98
+ const contract = item.contract;
99
+ if (!contract || contract.warnings.length === 0)
100
+ return "";
101
+ return `<div class="contract"><h4>OpenAPI warnings (server responses)</h4>${contract.warnings.map(renderIssue).join("")}</div>`;
102
+ }
103
+ /** Extra search terms for a case. */
104
+ export function caseSearchTerms(item) {
105
+ return (item.tags ?? []).flatMap((tag) => [tag, `#${tag}`]);
106
+ }
107
+ export function hasExtras(report) {
108
+ return Boolean(report.tag_summary?.length || report.coverage || report.openapi);
109
+ }
110
+ export const EXTRA_STYLE = `
111
+ table.tagsum { width:100%; border-collapse:collapse; font-size:13px; }
112
+ table.tagsum th, table.tagsum td { text-align:left; padding:5px 8px; border-bottom:1px solid var(--line); vertical-align:top; }
113
+ table.tagsum th { color:var(--muted); font-size:11px; text-transform:uppercase; letter-spacing:.05em; }
114
+ table.tagsum td.num { text-align:right; font-family:var(--mono); width:4em; }
115
+ table.tagsum td .mini { margin-right:4px; display:inline-block; text-decoration:none; }
116
+ tr.row-fail td:first-child { border-left:3px solid var(--fail); }
117
+ tr.row-ok td:first-child { border-left:3px solid var(--pass); }
118
+ .tag-sel { color:var(--accent); }
119
+ .muted { color:var(--muted); }
120
+ .warn-line { color:var(--skip); margin:0 0 10px; }
121
+ ul.plain { margin:4px 0 12px; padding-left:18px; }
122
+ .contract { margin:8px 0; }
123
+ .contract h4, .panel-body h4 { margin:10px 0 4px; font-size:12px; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; }
124
+ `;
125
+ //# sourceMappingURL=report-extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-extras.js","sourceRoot":"","sources":["../src/report-extras.ts"],"names":[],"mappings":"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"}