@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
@@ -0,0 +1,428 @@
1
+ /**
2
+ * The shapes of `report.json` and of the run protocol lxdev reads, published
3
+ * as `@lingxia/test/report` for tools that read a report.
4
+ */
5
+ export type SpecStatus = "passed" | "failed" | "skipped" | "timeout" | "xfail" | "xpass";
6
+ export type StepStatus = "passed" | "failed" | "timeout" | "skipped";
7
+ export interface AssertionRecord {
8
+ matcher: string;
9
+ expected: string;
10
+ actual: string;
11
+ passed: boolean;
12
+ step?: string;
13
+ /** The locator or poll description, when available. */
14
+ target?: string;
15
+ /** Optional business intent supplied by the spec author. */
16
+ message?: string;
17
+ /** Authored source location. */
18
+ location?: string;
19
+ duration_ms?: number;
20
+ /** First unequal path or string offset, computed before preview truncation. */
21
+ difference?: string;
22
+ /** Order within this spec's attempt, shared with steps and attachments. */
23
+ sequence?: number;
24
+ at_ms?: number;
25
+ }
26
+ export interface StepRecord {
27
+ name: string;
28
+ path: string;
29
+ /** `step` is authored with `t.step`; `action` is a recorded driver call. */
30
+ kind?: "step" | "action";
31
+ /** Short argument summary for an action — a selector, a page, a script head. */
32
+ detail?: string;
33
+ /** Identical consecutive actions collapse into one row with a count. */
34
+ repeat?: number;
35
+ status: StepStatus;
36
+ duration_ms: number;
37
+ /** Event-only recovery could not measure elapsed time; 0 is a placeholder. */
38
+ duration_unknown?: boolean;
39
+ sequence?: number;
40
+ at_ms?: number;
41
+ error?: ReportError;
42
+ steps: StepRecord[];
43
+ attachments: AttachmentRef[];
44
+ assertions: AssertionRecord[];
45
+ }
46
+ export interface AttachmentRef {
47
+ name: string;
48
+ path: string;
49
+ mimeType: string;
50
+ sequence?: number;
51
+ at_ms?: number;
52
+ /** Authored step in which the attachment was created. Failure evidence is attempt-scoped. */
53
+ step?: string;
54
+ /** Captured after an attempt failed, rather than attached by the spec body. */
55
+ purpose?: "failure_evidence";
56
+ }
57
+ /** A page instance, as a failure names it. */
58
+ export interface FailurePage {
59
+ name: string | null;
60
+ instanceId: string | null;
61
+ /**
62
+ * Set when the page was hidden at the failure (window covered, minimized
63
+ * or display asleep): WebKit pauses animation frames, so rAF- and
64
+ * transition-driven UI never moved.
65
+ */
66
+ hidden?: string;
67
+ }
68
+ /** `document.visibilityState` and whether an animation frame arrived. */
69
+ export interface PageVisibility {
70
+ state: string;
71
+ animationFrames: boolean;
72
+ /** The explanation, when the page was hidden or got no frame. */
73
+ note?: string;
74
+ }
75
+ /**
76
+ * One Logic `fetch` (or `Rong.SSE` connection) the app made, as a failed
77
+ * spec's report lists it: no bodies, no headers, credentials and
78
+ * `--secret-arg` values masked in the URL.
79
+ */
80
+ export interface FailureNetworkCall {
81
+ /** Epoch milliseconds when the request started. */
82
+ time: number;
83
+ /** Milliseconds from this attempt's start when included in `network_calls`. */
84
+ at_ms?: number;
85
+ /** Deepest authored step active when the request started. Time overlap is not causation. */
86
+ observed_during?: string;
87
+ /** `function`: a Worker Function call the dev session's companion saw. */
88
+ kind: "fetch" | "sse" | "function";
89
+ /** Empty for a `function` call. */
90
+ method: string;
91
+ /** Empty for a `function` call. */
92
+ url: string;
93
+ /** `function` calls: the Function and `result`/`error`/`fault`/`default`. */
94
+ function?: string;
95
+ outcome?: string;
96
+ /** Response status; `null` when it failed or has not answered. */
97
+ status: number | null;
98
+ /** The rejection, e.g. `TypeError: fetch failed`. */
99
+ error?: string;
100
+ durationMs: number | null;
101
+ /** `route` when a test route answered; `network` when the request was real. */
102
+ source: "route" | "network";
103
+ /** The route that matched, including a `continue` pass-through. */
104
+ route?: {
105
+ pattern: string;
106
+ action: string;
107
+ rule?: number;
108
+ scenario?: string;
109
+ };
110
+ /** `rule 2 (name:variant)`, `route <pattern>`, `real`, or `companion default`. */
111
+ answeredBy?: string;
112
+ /** Why no scenario rule answered, when rules targeted the call. */
113
+ noMatch?: string;
114
+ }
115
+ /** The scenario a failed spec had installed, and what each rule answered. */
116
+ export interface ScenarioReport {
117
+ /** `name:variant`. */
118
+ label: string;
119
+ name: string | null;
120
+ variant: string | null;
121
+ rules: {
122
+ index: number;
123
+ target: string;
124
+ kind: "http" | "function";
125
+ hits: number;
126
+ }[];
127
+ }
128
+ export interface ReportError {
129
+ code?: string;
130
+ data?: unknown;
131
+ phase?: string;
132
+ /** The app's last Logic network calls before the failure, oldest first. */
133
+ network?: FailureNetworkCall[];
134
+ /** The scenario installed with `t.scenario.use()` when the spec failed. */
135
+ scenario?: ScenarioReport;
136
+ /** The recorded driver action that failed, e.g. `page.click [data-testid=save]`. */
137
+ failedAction?: string;
138
+ /** The page that was current when the spec failed. */
139
+ page?: FailurePage;
140
+ name: string;
141
+ message: string;
142
+ stack?: string;
143
+ matcher?: string;
144
+ expected?: string;
145
+ actual?: string;
146
+ difference?: string;
147
+ location?: string;
148
+ step?: string;
149
+ }
150
+ export interface CaseRecord {
151
+ attempt?: number;
152
+ attempts?: CaseRecord[];
153
+ flaky?: boolean;
154
+ id: string;
155
+ title: string;
156
+ name: string;
157
+ full_name: string;
158
+ /** Which `--repeat-each` execution this is (1-based); absent without it. */
159
+ repeat?: number;
160
+ /** Source file the spec was registered from, remapped through the bundle map. */
161
+ file?: string;
162
+ line?: number;
163
+ /** Display group in the report — the spec file's path inside the project. */
164
+ suite?: string;
165
+ status: SpecStatus;
166
+ duration_ms: number;
167
+ covers: string[];
168
+ /** Selection tags: the file's `spec.configure` tags, then the spec's own. */
169
+ tags?: string[];
170
+ /**
171
+ * `lxdev test --openapi`: this spec's Logic `fetch` responses checked
172
+ * against the contract. `violations` (routed responses) failed the spec;
173
+ * `warnings` (the real server's) did not.
174
+ */
175
+ contract?: CaseContract;
176
+ /**
177
+ * `lx.*` members the spec's evals actually reached, observed by the runtime
178
+ * rather than declared. A `covers` tag absent from here was claimed but never
179
+ * exercised.
180
+ */
181
+ observed?: string[];
182
+ /** Scenario selected by this attempt, including passing attempts. */
183
+ scenario?: {
184
+ label: string;
185
+ name: string | null;
186
+ variant: string | null;
187
+ };
188
+ /** Bounded Logic call provenance, including passing attempts. */
189
+ network_summary?: {
190
+ observed: number;
191
+ routed: number;
192
+ real: number;
193
+ limit_reached: boolean;
194
+ };
195
+ /** Recent Logic calls made during this attempt, ordered by request start time.
196
+ * Time proximity to a step is evidence, not proof that the step caused it. */
197
+ network_calls?: FailureNetworkCall[];
198
+ /** The action trace hit its bounded record limit. */
199
+ trace_truncated?: boolean;
200
+ steps: StepRecord[];
201
+ assertions: AssertionRecord[];
202
+ attachments: AttachmentRef[];
203
+ error?: ReportError;
204
+ timeout_ms: number;
205
+ reason?: string;
206
+ }
207
+ /** One response that breaks the OpenAPI contract. */
208
+ export interface ContractIssue {
209
+ /** The spec id. */
210
+ case: string;
211
+ /** `route`/`patch`: a route shaped it; `network`: the real server. */
212
+ source: "route" | "patch" | "network";
213
+ method: string;
214
+ /** Scheme, host and path only. */
215
+ url: string;
216
+ status: number;
217
+ /** `METHOD /path/{template}` as the document names it. */
218
+ operation: string;
219
+ /** The response schema, as a document pointer. */
220
+ schema: string;
221
+ /** The route that fulfilled or patched it. */
222
+ pattern?: string;
223
+ issues: Array<{
224
+ path: string;
225
+ message: string;
226
+ schema: string;
227
+ }>;
228
+ }
229
+ export interface CaseContract {
230
+ /** Responses captured during the spec. */
231
+ checked: number;
232
+ violations: ContractIssue[];
233
+ warnings: ContractIssue[];
234
+ }
235
+ /** `report.openapi`: what `--openapi` checked across the run. */
236
+ export interface OpenApiSummary {
237
+ documents: Array<{
238
+ name: string;
239
+ version: string;
240
+ title?: string;
241
+ operations: number;
242
+ }>;
243
+ /** Captured responses. */
244
+ responses: number;
245
+ /** Responses with a documented JSON schema and a body, validated. */
246
+ validated: number;
247
+ routed: {
248
+ validated: number;
249
+ failed: number;
250
+ };
251
+ network: {
252
+ validated: number;
253
+ mismatched: number;
254
+ };
255
+ /** Matched an operation but not validated, by why. */
256
+ skipped: {
257
+ no_schema: number;
258
+ not_json: number;
259
+ empty: number;
260
+ truncated: number;
261
+ };
262
+ /** A status the operation does not document. */
263
+ undocumented: Array<{
264
+ operation: string;
265
+ status: number;
266
+ source: string;
267
+ count: number;
268
+ }>;
269
+ /** Requests no operation describes (another API, or a gap in the document). */
270
+ unmatched: Array<{
271
+ method: string;
272
+ path: string;
273
+ count: number;
274
+ }>;
275
+ /** Real-server mismatches (at most 100). */
276
+ warnings: ContractIssue[];
277
+ }
278
+ /** `report.tag_summary`: one row per tag, and `(untagged)` for the rest. */
279
+ export interface TagSummary {
280
+ tag: string;
281
+ total: number;
282
+ passed: number;
283
+ failed: number;
284
+ skipped: number;
285
+ timeout: number;
286
+ xfail: number;
287
+ xpass: number;
288
+ flaky: number;
289
+ /** No failed, timed-out or xpass spec carries the tag. */
290
+ ok: boolean;
291
+ }
292
+ /** A spec covering a manifest id, with its outcome in this run. */
293
+ export interface CoverageSpec {
294
+ id: string;
295
+ title: string;
296
+ /** `not_run`: registered, but outside this selection. */
297
+ status: SpecStatus | "not_run";
298
+ }
299
+ /** `report.coverage`: the `--covers-manifest` ids against the suite's `covers`. */
300
+ export interface CoverageSummary {
301
+ total: number;
302
+ /** Ids at least one registered spec covers. */
303
+ covered: number;
304
+ /** Covered ids whose specs passed (none broke). */
305
+ passing: number;
306
+ /** Covered ids with a failed, timed-out or xpass spec. */
307
+ failing: number;
308
+ /** Manifest ids no spec covers. */
309
+ uncovered: Array<{
310
+ id: string;
311
+ title?: string;
312
+ }>;
313
+ /** `covers` ids used by specs but missing from the manifest. */
314
+ unknown: Array<{
315
+ id: string;
316
+ specs: string[];
317
+ }>;
318
+ ids: Array<{
319
+ id: string;
320
+ title?: string;
321
+ status: "passed" | "failed" | "xfail" | "skipped" | "not_run" | "uncovered";
322
+ specs: CoverageSpec[];
323
+ }>;
324
+ }
325
+ /** The app under test, so a report identifies its own subject. */
326
+ export interface RunSubject {
327
+ appid?: string;
328
+ app_name?: string;
329
+ version?: string;
330
+ release_type?: string;
331
+ pages?: number;
332
+ }
333
+ export interface RunMeta {
334
+ started_at: string;
335
+ duration_ms: number;
336
+ /** User args; declared secrets and credential-named keys are `***`. */
337
+ args: Record<string, string>;
338
+ /** lxdev's run controls (grep, ids, shard, retries, …). */
339
+ run?: Record<string, string>;
340
+ platform?: string;
341
+ framework?: string;
342
+ subject?: RunSubject;
343
+ /** The suite opted into measuring the whole published `lx` surface. */
344
+ surface_coverage?: boolean;
345
+ /**
346
+ * The whole-run budget: fixed by `--timeout-secs`, or scaled to the
347
+ * planned executions (`auto`). `exhausted_after` counts the specs that
348
+ * finished before it ran out; the rest are skipped as not run.
349
+ */
350
+ budget?: {
351
+ ms: number;
352
+ auto: boolean;
353
+ planned: number;
354
+ exhausted_after?: number;
355
+ };
356
+ /** `--shuffle` seed; rerun with `--shuffle=<seed>` for the same order. */
357
+ shuffle_seed?: number;
358
+ /** `--repeat-each` count. */
359
+ repeat_each?: number;
360
+ }
361
+ /** One failed case, flat, for tools that only need what broke and where. */
362
+ export interface FailureRecord {
363
+ id: string;
364
+ title: string;
365
+ file?: string;
366
+ line?: number;
367
+ phase?: string;
368
+ code?: string;
369
+ message: string;
370
+ failedAction?: string;
371
+ page?: FailurePage;
372
+ /** Report-relative path of the failure screenshot, when one was captured. */
373
+ screenshot?: string;
374
+ /** The app's last Logic network calls before the failure (up to 20). */
375
+ network?: FailureNetworkCall[];
376
+ /** The scenario installed when the spec failed. */
377
+ scenario?: ScenarioReport;
378
+ }
379
+ export interface JsonReport {
380
+ schema_version?: number;
381
+ /** Added by lxdev when the host run is finalized. */
382
+ run_id?: string;
383
+ state?: string;
384
+ error?: {
385
+ code?: string;
386
+ message: string;
387
+ data?: unknown;
388
+ } | null;
389
+ run_errors?: Array<{
390
+ message: string;
391
+ }>;
392
+ framework: {
393
+ name: string;
394
+ version: string;
395
+ };
396
+ meta: RunMeta;
397
+ partial: boolean;
398
+ filtered: boolean;
399
+ total: number;
400
+ passed: number;
401
+ failed: number;
402
+ skipped: number;
403
+ xfail: number;
404
+ xpass: number;
405
+ timeout: number;
406
+ duration_ms: number;
407
+ cases: CaseRecord[];
408
+ /** Every failed, timed-out or xpass case, flattened from `cases`. */
409
+ failures?: FailureRecord[];
410
+ /** Per-tag outcome, when any spec is tagged. */
411
+ tag_summary?: TagSummary[];
412
+ /** `--covers-manifest` summary. */
413
+ coverage?: CoverageSummary;
414
+ /** `--openapi` contract summary. */
415
+ openapi?: OpenApiSummary;
416
+ /** `lxdev test --list`: the selected specs; nothing ran. */
417
+ listed?: ListedSpec[];
418
+ }
419
+ /** A spec `lxdev test --list` shows. */
420
+ export interface ListedSpec {
421
+ id: string;
422
+ title: string;
423
+ file: string;
424
+ line: number;
425
+ tags: string[];
426
+ }
427
+ export type ProtocolReport = JsonReport;
428
+ //# sourceMappingURL=report-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-types.d.ts","sourceRoot":"","sources":["../src/report-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The shapes of `report.json` and of the run protocol lxdev reads, published
3
+ * as `@lingxia/test/report` for tools that read a report.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=report-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-types.js","sourceRoot":"","sources":["../src/report-types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/dist/report.d.ts CHANGED
@@ -1,5 +1,19 @@
1
- import type { CaseRecord, JsonReport } from "./types.js";
1
+ import type { CaseRecord, JsonReport, FailureNetworkCall, ScenarioReport, ReportError } from "./report-types.js";
2
2
  export declare function renderHtml(report: JsonReport): string;
3
+ /**
4
+ * The app's last Logic network calls before the failure: when each started
5
+ * relative to the first, what it asked, what came back and whether a route
6
+ * or the real network answered.
7
+ */
8
+ /** The scenario a failed spec had installed: each rule and its hits. */
9
+ export declare function renderScenario(scenario: ScenarioReport | undefined): string;
10
+ export declare function renderNetwork(calls: FailureNetworkCall[] | undefined): string;
11
+ /**
12
+ * One line naming the failed action, the page that was current and the code,
13
+ * e.g. `failed at page.click [data-testid=save] on page "devices" (#a1b2) — E_PAGE_NOT_ACTIVE`.
14
+ * `undefined` when the failure names neither an action nor a page.
15
+ */
16
+ export declare function failedAt(error: Pick<ReportError, "code" | "failedAction" | "page">): string | undefined;
3
17
  export declare function formatDuration(ms: number): string;
4
18
  interface Inlined {
5
19
  /** `data:` URL for an image. */
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EAGX,MAAM,YAAY,CAAC;AA8DpB,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmGrD;AAwjBD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,UAAU,OAAO;IACf,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAOnF;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAMD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,EAAE,GAClB,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC,CAW3F"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,WAAW,EAGZ,MAAM,mBAAmB,CAAC;AAuE3B,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAsGrD;AAikBD;;;;GAIG;AACH,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAW3E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,SAAS,GAAG,MAAM,CA4B7E;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAWvG;AA8ED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,UAAU,OAAO;IACf,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAOnF;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAOD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,EAAE,GAClB,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC,CAW3F"}