@vitest-agent/ui 4.1.0 → 5.0.1
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.
- package/README.md +3 -3
- package/dispatcher/cells/single-file-fail.js +1 -5
- package/dispatcher/cells/single-file-pass.js +1 -5
- package/dispatcher/cells/single-file-threshold.js +1 -5
- package/dispatcher/cells/single-project-fail.js +1 -5
- package/dispatcher/cells/single-project-pass.js +1 -5
- package/dispatcher/cells/single-project-threshold.js +1 -5
- package/dispatcher/cells/single-test-fail.js +1 -5
- package/dispatcher/cells/single-test-pass.js +1 -5
- package/dispatcher/cells/workspace-fail.js +1 -5
- package/dispatcher/cells/workspace-pass.js +1 -5
- package/dispatcher/cells/workspace-threshold.js +1 -5
- package/dispatcher/dispatch.js +20 -25
- package/index.d.ts +45 -316
- package/index.js +4 -17
- package/{render-ink → ink}/CountColumns.js +2 -2
- package/{render-ink → ink}/CoverageBlock.js +2 -2
- package/{render-ink → ink}/FailureSection.js +2 -2
- package/{render-ink → ink}/FailuresSection.js +2 -2
- package/{render-ink → ink}/ModuleHeader.js +1 -1
- package/{render-ink → ink}/ProjectRow.js +1 -1
- package/{render-ink → ink}/StatusIcon.js +2 -2
- package/{render-ink → ink}/StreamApp.js +14 -5
- package/{render-ink → ink}/SuggestedActions.js +2 -2
- package/{render-ink → ink}/TagColumns.js +1 -1
- package/{render-ink → ink}/TestRow.js +1 -1
- package/{render-ink → ink}/TrendLine.js +2 -2
- package/ink/dispatch-ink.js +61 -0
- package/{dispatcher → ink}/ink-helpers.js +1 -1
- package/ink.d.ts +789 -0
- package/ink.js +15 -0
- package/package.json +12 -7
- package/reducer.js +2 -1
- package/render-agent.js +2 -0
- package/{render-ink/spinner.js → spinner.js} +1 -1
- package/synthesize.js +2 -1
- package/render-ink/index.js +0 -15
package/ink.d.ts
ADDED
|
@@ -0,0 +1,789 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { FC, ReactElement } from "react";
|
|
3
|
+
//#region ../sdk/dist/dev/pkg/index.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Per-file coverage data including uncovered line ranges.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
declare const FileCoverageReport: Schema.Struct<{
|
|
9
|
+
readonly file: Schema.String;
|
|
10
|
+
readonly summary: Schema.Struct<{
|
|
11
|
+
readonly statements: Schema.Number;
|
|
12
|
+
readonly branches: Schema.Number;
|
|
13
|
+
readonly functions: Schema.Number;
|
|
14
|
+
readonly lines: Schema.Number;
|
|
15
|
+
}>;
|
|
16
|
+
readonly uncoveredLines: Schema.String;
|
|
17
|
+
}>;
|
|
18
|
+
/** @public */
|
|
19
|
+
type FileCoverageReport = typeof FileCoverageReport.Type;
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/schemas/RenderState.d.ts
|
|
22
|
+
/**
|
|
23
|
+
* Per-test record accumulated as `TestStarted` / `TestFinished` events arrive.
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
declare const TestRecord: Schema.Struct<{
|
|
27
|
+
readonly testName: Schema.String;
|
|
28
|
+
readonly suitePath: Schema.$Array<Schema.String>;
|
|
29
|
+
readonly status: Schema.Union<readonly [Schema.Literals<readonly ["passed", "failed", "skipped", "pending"]>, Schema.Literals<readonly ["running", "timed-out"]>]>;
|
|
30
|
+
readonly durationMs: Schema.NullOr<Schema.Number>;
|
|
31
|
+
readonly error: Schema.optional<Schema.Struct<{
|
|
32
|
+
readonly message: Schema.String;
|
|
33
|
+
readonly stack: Schema.optional<Schema.String>;
|
|
34
|
+
readonly diff: Schema.optional<Schema.String>;
|
|
35
|
+
readonly expected: Schema.optional<Schema.String>;
|
|
36
|
+
readonly received: Schema.optional<Schema.String>;
|
|
37
|
+
}>>;
|
|
38
|
+
}>;
|
|
39
|
+
/** @public */
|
|
40
|
+
type TestRecord = typeof TestRecord.Type;
|
|
41
|
+
/**
|
|
42
|
+
* Per-module aggregation. The reducer keeps modules keyed on
|
|
43
|
+
* `modulePath` so out-of-order events can update the right slot.
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
declare const ModuleRecord: Schema.Struct<{
|
|
47
|
+
readonly modulePath: Schema.String;
|
|
48
|
+
readonly status: Schema.Literals<readonly ["queued", "running", "finished"]>;
|
|
49
|
+
readonly passCount: Schema.Number;
|
|
50
|
+
readonly failCount: Schema.Number;
|
|
51
|
+
readonly skipCount: Schema.Number;
|
|
52
|
+
readonly timeoutCount: Schema.Number;
|
|
53
|
+
readonly durationMs: Schema.Number;
|
|
54
|
+
readonly tests: Schema.$Array<Schema.Struct<{
|
|
55
|
+
readonly testName: Schema.String;
|
|
56
|
+
readonly suitePath: Schema.$Array<Schema.String>;
|
|
57
|
+
readonly status: Schema.Union<readonly [Schema.Literals<readonly ["passed", "failed", "skipped", "pending"]>, Schema.Literals<readonly ["running", "timed-out"]>]>;
|
|
58
|
+
readonly durationMs: Schema.NullOr<Schema.Number>;
|
|
59
|
+
readonly error: Schema.optional<Schema.Struct<{
|
|
60
|
+
readonly message: Schema.String;
|
|
61
|
+
readonly stack: Schema.optional<Schema.String>;
|
|
62
|
+
readonly diff: Schema.optional<Schema.String>;
|
|
63
|
+
readonly expected: Schema.optional<Schema.String>;
|
|
64
|
+
readonly received: Schema.optional<Schema.String>;
|
|
65
|
+
}>>;
|
|
66
|
+
}>>;
|
|
67
|
+
/**
|
|
68
|
+
* Owning Vitest project name. Optional — events from project-less
|
|
69
|
+
* configs or older replays leave it `undefined`, which the renderer
|
|
70
|
+
* treats as a single anonymous project.
|
|
71
|
+
*/
|
|
72
|
+
readonly projectName: Schema.optional<Schema.String>;
|
|
73
|
+
/**
|
|
74
|
+
* ISO wall-clock stamp captured at `onTestModuleStart`. The live
|
|
75
|
+
* renderer derives a ticking elapsed column from it while the module
|
|
76
|
+
* runs; once finished it shows `durationMs` instead. Optional — a
|
|
77
|
+
* module seeded by `ModuleQueued` (or replayed) has no start stamp.
|
|
78
|
+
*/
|
|
79
|
+
readonly startedAt: Schema.optional<Schema.String>;
|
|
80
|
+
readonly tagCounts: Schema.optional<Schema.$Record<Schema.String, Schema.Number>>;
|
|
81
|
+
}>;
|
|
82
|
+
/** @public */
|
|
83
|
+
type ModuleRecord = typeof ModuleRecord.Type;
|
|
84
|
+
/**
|
|
85
|
+
* One row in the failure list. A failure can exist before its
|
|
86
|
+
* classification arrives (`FailureClassified` is emitted from a
|
|
87
|
+
* separate pipeline), so `classification` is nullable.
|
|
88
|
+
* @public
|
|
89
|
+
*/
|
|
90
|
+
declare const FailureRecord: Schema.Struct<{
|
|
91
|
+
readonly modulePath: Schema.String;
|
|
92
|
+
readonly testName: Schema.String;
|
|
93
|
+
readonly suitePath: Schema.$Array<Schema.String>;
|
|
94
|
+
readonly error: Schema.optional<Schema.Struct<{
|
|
95
|
+
readonly message: Schema.String;
|
|
96
|
+
readonly stack: Schema.optional<Schema.String>;
|
|
97
|
+
readonly diff: Schema.optional<Schema.String>;
|
|
98
|
+
readonly expected: Schema.optional<Schema.String>;
|
|
99
|
+
readonly received: Schema.optional<Schema.String>;
|
|
100
|
+
}>>;
|
|
101
|
+
readonly timedOut: Schema.optional<Schema.Boolean>;
|
|
102
|
+
readonly classification: Schema.NullOr<Schema.Literals<readonly ["stable", "new-failure", "persistent", "flaky", "recovered"]>>;
|
|
103
|
+
}>;
|
|
104
|
+
/** @public */
|
|
105
|
+
type FailureRecord = typeof FailureRecord.Type;
|
|
106
|
+
/**
|
|
107
|
+
* Coverage block, populated only after `CoverageReady`. Threshold
|
|
108
|
+
* violations are accumulated separately as they arrive.
|
|
109
|
+
* @public
|
|
110
|
+
*/
|
|
111
|
+
declare const CoverageRenderState: Schema.Struct<{
|
|
112
|
+
readonly metrics: Schema.Struct<{
|
|
113
|
+
readonly statements: Schema.Number;
|
|
114
|
+
readonly branches: Schema.Number;
|
|
115
|
+
readonly functions: Schema.Number;
|
|
116
|
+
readonly lines: Schema.Number;
|
|
117
|
+
}>;
|
|
118
|
+
readonly thresholds: Schema.Struct<{
|
|
119
|
+
readonly lines: Schema.optional<Schema.Number>;
|
|
120
|
+
readonly functions: Schema.optional<Schema.Number>;
|
|
121
|
+
readonly branches: Schema.optional<Schema.Number>;
|
|
122
|
+
readonly statements: Schema.optional<Schema.Number>;
|
|
123
|
+
}>;
|
|
124
|
+
readonly gaps: Schema.$Array<Schema.Struct<{
|
|
125
|
+
readonly file: Schema.String;
|
|
126
|
+
readonly missing: Schema.Struct<{
|
|
127
|
+
readonly statements: Schema.Number;
|
|
128
|
+
readonly branches: Schema.Number;
|
|
129
|
+
readonly functions: Schema.Number;
|
|
130
|
+
readonly lines: Schema.Number;
|
|
131
|
+
}>;
|
|
132
|
+
readonly uncoveredLines: Schema.optional<Schema.String>;
|
|
133
|
+
}>>;
|
|
134
|
+
readonly violations: Schema.$Array<Schema.Struct<{
|
|
135
|
+
readonly metric: Schema.Literals<readonly ["lines", "branches", "functions", "statements"]>;
|
|
136
|
+
readonly expected: Schema.Number;
|
|
137
|
+
readonly actual: Schema.Number;
|
|
138
|
+
}>>;
|
|
139
|
+
readonly scoped: Schema.optional<Schema.Boolean>;
|
|
140
|
+
readonly scopedFiles: Schema.optional<Schema.Number>;
|
|
141
|
+
readonly totalFiles: Schema.optional<Schema.Number>;
|
|
142
|
+
readonly globShortfalls: Schema.optional<Schema.$Array<Schema.Struct<{
|
|
143
|
+
readonly pattern: Schema.String;
|
|
144
|
+
readonly summary: Schema.Struct<{
|
|
145
|
+
readonly statements: Schema.Number;
|
|
146
|
+
readonly branches: Schema.Number;
|
|
147
|
+
readonly functions: Schema.Number;
|
|
148
|
+
readonly lines: Schema.Number;
|
|
149
|
+
}>;
|
|
150
|
+
readonly thresholds: Schema.Struct<{
|
|
151
|
+
readonly lines: Schema.optional<Schema.Number>;
|
|
152
|
+
readonly functions: Schema.optional<Schema.Number>;
|
|
153
|
+
readonly branches: Schema.optional<Schema.Number>;
|
|
154
|
+
readonly statements: Schema.optional<Schema.Number>;
|
|
155
|
+
}>;
|
|
156
|
+
}>>>;
|
|
157
|
+
}>;
|
|
158
|
+
/** @public */
|
|
159
|
+
type CoverageRenderState = typeof CoverageRenderState.Type;
|
|
160
|
+
/**
|
|
161
|
+
* A `SuggestedAction` event, denormalized into the queue the renderer reads.
|
|
162
|
+
* @public
|
|
163
|
+
*/
|
|
164
|
+
declare const SuggestedActionRecord: Schema.Struct<{
|
|
165
|
+
readonly severity: Schema.Literals<readonly ["info", "warn", "blocker"]>;
|
|
166
|
+
readonly title: Schema.String;
|
|
167
|
+
readonly detail: Schema.String;
|
|
168
|
+
readonly targetTool: Schema.optional<Schema.String>;
|
|
169
|
+
}>;
|
|
170
|
+
/** @public */
|
|
171
|
+
type SuggestedActionRecord = typeof SuggestedActionRecord.Type;
|
|
172
|
+
/**
|
|
173
|
+
* The renderer state. Both the human (Ink) and agent (string)
|
|
174
|
+
* renderers read this shape; the reducer is the only producer.
|
|
175
|
+
*
|
|
176
|
+
* `phase` is the layout discriminator — agent mode emits one final
|
|
177
|
+
* frame when `phase === "finished"`; human mode redraws at every
|
|
178
|
+
* state change. `"timed-out"` is a terminal phase like `"finished"`
|
|
179
|
+
* — the run is over, but it ended because `onProcessTimeout` fired
|
|
180
|
+
* rather than the suite completing.
|
|
181
|
+
* @public
|
|
182
|
+
*/
|
|
183
|
+
declare const RenderState: Schema.Struct<{
|
|
184
|
+
readonly phase: Schema.Literals<readonly ["idle", "running", "finished", "timed-out"]>;
|
|
185
|
+
readonly runId: Schema.NullOr<Schema.String>;
|
|
186
|
+
readonly configHash: Schema.NullOr<Schema.String>;
|
|
187
|
+
readonly startedAt: Schema.NullOr<Schema.String>;
|
|
188
|
+
readonly finishedAt: Schema.NullOr<Schema.String>;
|
|
189
|
+
readonly modules: Schema.$Record<Schema.String, Schema.Struct<{
|
|
190
|
+
readonly modulePath: Schema.String;
|
|
191
|
+
readonly status: Schema.Literals<readonly ["queued", "running", "finished"]>;
|
|
192
|
+
readonly passCount: Schema.Number;
|
|
193
|
+
readonly failCount: Schema.Number;
|
|
194
|
+
readonly skipCount: Schema.Number;
|
|
195
|
+
readonly timeoutCount: Schema.Number;
|
|
196
|
+
readonly durationMs: Schema.Number;
|
|
197
|
+
readonly tests: Schema.$Array<Schema.Struct<{
|
|
198
|
+
readonly testName: Schema.String;
|
|
199
|
+
readonly suitePath: Schema.$Array<Schema.String>;
|
|
200
|
+
readonly status: Schema.Union<readonly [Schema.Literals<readonly ["passed", "failed", "skipped", "pending"]>, Schema.Literals<readonly ["running", "timed-out"]>]>;
|
|
201
|
+
readonly durationMs: Schema.NullOr<Schema.Number>;
|
|
202
|
+
readonly error: Schema.optional<Schema.Struct<{
|
|
203
|
+
readonly message: Schema.String;
|
|
204
|
+
readonly stack: Schema.optional<Schema.String>;
|
|
205
|
+
readonly diff: Schema.optional<Schema.String>;
|
|
206
|
+
readonly expected: Schema.optional<Schema.String>;
|
|
207
|
+
readonly received: Schema.optional<Schema.String>;
|
|
208
|
+
}>>;
|
|
209
|
+
}>>;
|
|
210
|
+
/**
|
|
211
|
+
* Owning Vitest project name. Optional — events from project-less
|
|
212
|
+
* configs or older replays leave it `undefined`, which the renderer
|
|
213
|
+
* treats as a single anonymous project.
|
|
214
|
+
*/
|
|
215
|
+
readonly projectName: Schema.optional<Schema.String>;
|
|
216
|
+
/**
|
|
217
|
+
* ISO wall-clock stamp captured at `onTestModuleStart`. The live
|
|
218
|
+
* renderer derives a ticking elapsed column from it while the module
|
|
219
|
+
* runs; once finished it shows `durationMs` instead. Optional — a
|
|
220
|
+
* module seeded by `ModuleQueued` (or replayed) has no start stamp.
|
|
221
|
+
*/
|
|
222
|
+
readonly startedAt: Schema.optional<Schema.String>;
|
|
223
|
+
readonly tagCounts: Schema.optional<Schema.$Record<Schema.String, Schema.Number>>;
|
|
224
|
+
}>>;
|
|
225
|
+
readonly moduleOrder: Schema.$Array<Schema.String>;
|
|
226
|
+
readonly totals: Schema.Struct<{
|
|
227
|
+
readonly passCount: Schema.Number;
|
|
228
|
+
readonly failCount: Schema.Number;
|
|
229
|
+
readonly skipCount: Schema.Number;
|
|
230
|
+
readonly timeoutCount: Schema.Number;
|
|
231
|
+
readonly durationMs: Schema.Number;
|
|
232
|
+
}>;
|
|
233
|
+
readonly coverage: Schema.NullOr<Schema.Struct<{
|
|
234
|
+
readonly metrics: Schema.Struct<{
|
|
235
|
+
readonly statements: Schema.Number;
|
|
236
|
+
readonly branches: Schema.Number;
|
|
237
|
+
readonly functions: Schema.Number;
|
|
238
|
+
readonly lines: Schema.Number;
|
|
239
|
+
}>;
|
|
240
|
+
readonly thresholds: Schema.Struct<{
|
|
241
|
+
readonly lines: Schema.optional<Schema.Number>;
|
|
242
|
+
readonly functions: Schema.optional<Schema.Number>;
|
|
243
|
+
readonly branches: Schema.optional<Schema.Number>;
|
|
244
|
+
readonly statements: Schema.optional<Schema.Number>;
|
|
245
|
+
}>;
|
|
246
|
+
readonly gaps: Schema.$Array<Schema.Struct<{
|
|
247
|
+
readonly file: Schema.String;
|
|
248
|
+
readonly missing: Schema.Struct<{
|
|
249
|
+
readonly statements: Schema.Number;
|
|
250
|
+
readonly branches: Schema.Number;
|
|
251
|
+
readonly functions: Schema.Number;
|
|
252
|
+
readonly lines: Schema.Number;
|
|
253
|
+
}>;
|
|
254
|
+
readonly uncoveredLines: Schema.optional<Schema.String>;
|
|
255
|
+
}>>;
|
|
256
|
+
readonly violations: Schema.$Array<Schema.Struct<{
|
|
257
|
+
readonly metric: Schema.Literals<readonly ["lines", "branches", "functions", "statements"]>;
|
|
258
|
+
readonly expected: Schema.Number;
|
|
259
|
+
readonly actual: Schema.Number;
|
|
260
|
+
}>>;
|
|
261
|
+
readonly scoped: Schema.optional<Schema.Boolean>;
|
|
262
|
+
readonly scopedFiles: Schema.optional<Schema.Number>;
|
|
263
|
+
readonly totalFiles: Schema.optional<Schema.Number>;
|
|
264
|
+
readonly globShortfalls: Schema.optional<Schema.$Array<Schema.Struct<{
|
|
265
|
+
readonly pattern: Schema.String;
|
|
266
|
+
readonly summary: Schema.Struct<{
|
|
267
|
+
readonly statements: Schema.Number;
|
|
268
|
+
readonly branches: Schema.Number;
|
|
269
|
+
readonly functions: Schema.Number;
|
|
270
|
+
readonly lines: Schema.Number;
|
|
271
|
+
}>;
|
|
272
|
+
readonly thresholds: Schema.Struct<{
|
|
273
|
+
readonly lines: Schema.optional<Schema.Number>;
|
|
274
|
+
readonly functions: Schema.optional<Schema.Number>;
|
|
275
|
+
readonly branches: Schema.optional<Schema.Number>;
|
|
276
|
+
readonly statements: Schema.optional<Schema.Number>;
|
|
277
|
+
}>;
|
|
278
|
+
}>>>;
|
|
279
|
+
}>>;
|
|
280
|
+
readonly trend: Schema.NullOr<Schema.Struct<{
|
|
281
|
+
readonly direction: Schema.Literals<readonly ["improving", "regressing", "stable"]>;
|
|
282
|
+
readonly runCount: Schema.Number;
|
|
283
|
+
}>>;
|
|
284
|
+
readonly failures: Schema.$Array<Schema.Struct<{
|
|
285
|
+
readonly modulePath: Schema.String;
|
|
286
|
+
readonly testName: Schema.String;
|
|
287
|
+
readonly suitePath: Schema.$Array<Schema.String>;
|
|
288
|
+
readonly error: Schema.optional<Schema.Struct<{
|
|
289
|
+
readonly message: Schema.String;
|
|
290
|
+
readonly stack: Schema.optional<Schema.String>;
|
|
291
|
+
readonly diff: Schema.optional<Schema.String>;
|
|
292
|
+
readonly expected: Schema.optional<Schema.String>;
|
|
293
|
+
readonly received: Schema.optional<Schema.String>;
|
|
294
|
+
}>>;
|
|
295
|
+
readonly timedOut: Schema.optional<Schema.Boolean>;
|
|
296
|
+
readonly classification: Schema.NullOr<Schema.Literals<readonly ["stable", "new-failure", "persistent", "flaky", "recovered"]>>;
|
|
297
|
+
}>>;
|
|
298
|
+
readonly suggestedActions: Schema.$Array<Schema.Struct<{
|
|
299
|
+
readonly severity: Schema.Literals<readonly ["info", "warn", "blocker"]>;
|
|
300
|
+
readonly title: Schema.String;
|
|
301
|
+
readonly detail: Schema.String;
|
|
302
|
+
readonly targetTool: Schema.optional<Schema.String>;
|
|
303
|
+
}>>;
|
|
304
|
+
/**
|
|
305
|
+
* Count of every collected module, passing modules included. Folded
|
|
306
|
+
* from `RunFinished.collectedModules`. Renderers prefer this over
|
|
307
|
+
* `moduleOrder.length` for "N modules all-passed" copy — a report
|
|
308
|
+
* replay only queues failing modules, so `moduleOrder` alone
|
|
309
|
+
* undercounts a green run to zero (issue #204). Optional — a run
|
|
310
|
+
* that never carried the field (older replay data, hand-built
|
|
311
|
+
* fixtures) falls back to `moduleOrder.length`.
|
|
312
|
+
*/
|
|
313
|
+
readonly collectedModules: Schema.optional<Schema.Number>;
|
|
314
|
+
/**
|
|
315
|
+
* Process-level errors with no owning module, folded from
|
|
316
|
+
* `RunFinished.unhandledErrors`. A run that never carried the field
|
|
317
|
+
* (older replay data, hand-built fixtures) defaults to `[]`. See
|
|
318
|
+
* issue #240.
|
|
319
|
+
*/
|
|
320
|
+
readonly unhandledErrors: Schema.$Array<Schema.Struct<{
|
|
321
|
+
readonly message: Schema.String;
|
|
322
|
+
readonly stack: Schema.optional<Schema.String>;
|
|
323
|
+
readonly diff: Schema.optional<Schema.String>;
|
|
324
|
+
readonly expected: Schema.optional<Schema.String>;
|
|
325
|
+
readonly received: Schema.optional<Schema.String>;
|
|
326
|
+
}>>;
|
|
327
|
+
/**
|
|
328
|
+
* What the run wrote straight to the terminal, past Vitest's console
|
|
329
|
+
* capture, folded from `RunFinished.strayOutput`. Absent when the run
|
|
330
|
+
* wrote nothing stray.
|
|
331
|
+
*/
|
|
332
|
+
readonly strayOutput: Schema.optional<Schema.Struct<{
|
|
333
|
+
readonly total: Schema.Number;
|
|
334
|
+
readonly stdout: Schema.Number;
|
|
335
|
+
readonly stderr: Schema.Number;
|
|
336
|
+
readonly bytes: Schema.Number;
|
|
337
|
+
readonly samples: Schema.$Array<Schema.Struct<{
|
|
338
|
+
readonly stream: Schema.Literals<readonly ["stdout", "stderr"]>;
|
|
339
|
+
readonly text: Schema.String;
|
|
340
|
+
}>>;
|
|
341
|
+
}>>;
|
|
342
|
+
}>;
|
|
343
|
+
/** @public */
|
|
344
|
+
type RenderState = typeof RenderState.Type;
|
|
345
|
+
//#endregion
|
|
346
|
+
//#region src/contracts/dispatcher.d.ts
|
|
347
|
+
/**
|
|
348
|
+
* The four run shapes the dispatcher distinguishes.
|
|
349
|
+
*
|
|
350
|
+
* Computed once per run from the reduced state's module count, the
|
|
351
|
+
* distinct-project count (carried via {@link DispatchInputs.projects}),
|
|
352
|
+
* and the test count inside each module.
|
|
353
|
+
*
|
|
354
|
+
* - `single-test` — exactly one test by name across the run.
|
|
355
|
+
* - `single-file` — exactly one module, more than one test.
|
|
356
|
+
* - `single-project` — one project, more than one module.
|
|
357
|
+
* - `workspace` — more than one project.
|
|
358
|
+
* @public
|
|
359
|
+
*/
|
|
360
|
+
type RunShape = "single-test" | "single-file" | "single-project" | "workspace";
|
|
361
|
+
/**
|
|
362
|
+
* The three outcome classes the dispatcher distinguishes.
|
|
363
|
+
*
|
|
364
|
+
* - `all-pass` — `totals.failed === 0` and no coverage threshold violations.
|
|
365
|
+
* - `some-fail` — `totals.failed > 0`.
|
|
366
|
+
* - `threshold-violation` — `totals.failed === 0` and at least one coverage violation.
|
|
367
|
+
* @public
|
|
368
|
+
*/
|
|
369
|
+
type RunOutcome = "all-pass" | "some-fail" | "threshold-violation";
|
|
370
|
+
/**
|
|
371
|
+
* Compact per-project aggregate carried into workspace cells.
|
|
372
|
+
*
|
|
373
|
+
* Populated by the plugin from `ReporterRenderInput.reports`. Empty for
|
|
374
|
+
* non-workspace shapes. `tagCounts`, `belowTarget`, and `violations` are
|
|
375
|
+
* optional — workspace cells render the columns only when present.
|
|
376
|
+
* @public
|
|
377
|
+
*/
|
|
378
|
+
interface ProjectSummary {
|
|
379
|
+
readonly name: string;
|
|
380
|
+
readonly passCount: number;
|
|
381
|
+
readonly failCount: number;
|
|
382
|
+
readonly skipCount: number;
|
|
383
|
+
readonly durationMs: number;
|
|
384
|
+
readonly timeoutCount?: number;
|
|
385
|
+
readonly tagCounts?: Record<string, number>;
|
|
386
|
+
readonly belowTarget?: number;
|
|
387
|
+
readonly violations?: number;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Per-run trend direction handed to cells that surface a `Trend: …` line.
|
|
391
|
+
*
|
|
392
|
+
* Mirrors the inline `ReporterRenderInput.trendSummary` shape — promoted
|
|
393
|
+
* to a named type here so the dispatcher and its cells can pass it around
|
|
394
|
+
* without re-declaring it. The plugin populates this from
|
|
395
|
+
* `ReporterRenderInput.trendSummary` before invoking `dispatch`.
|
|
396
|
+
* @public
|
|
397
|
+
*/
|
|
398
|
+
interface TrendSummary {
|
|
399
|
+
readonly direction: "improving" | "regressing" | "stable";
|
|
400
|
+
readonly runCount: number;
|
|
401
|
+
readonly firstMetric?: {
|
|
402
|
+
readonly name: string;
|
|
403
|
+
readonly from: number;
|
|
404
|
+
readonly to: number;
|
|
405
|
+
readonly target?: number;
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Inputs each cell renderer reads to produce its output.
|
|
410
|
+
*
|
|
411
|
+
* `state` carries the post-reduce projection of the `RunEvent`
|
|
412
|
+
* stream. `shape` and `outcome` are the classified axes the dispatcher
|
|
413
|
+
* keyed on to reach this cell. The remaining fields are non-state
|
|
414
|
+
* helpers the plugin computes once before dispatch so cells stay pure.
|
|
415
|
+
* @public
|
|
416
|
+
*/
|
|
417
|
+
interface DispatchInputs {
|
|
418
|
+
readonly state: RenderState;
|
|
419
|
+
readonly shape: RunShape;
|
|
420
|
+
readonly outcome: RunOutcome;
|
|
421
|
+
/**
|
|
422
|
+
* Per-project aggregates carried into workspace cells. Populated by
|
|
423
|
+
* the plugin from `ReporterRenderInput.reports`; empty for non-workspace
|
|
424
|
+
* shapes.
|
|
425
|
+
*/
|
|
426
|
+
readonly projects: ReadonlyArray<ProjectSummary>;
|
|
427
|
+
/**
|
|
428
|
+
* Trend direction for cells that surface a `Trend: …` line. `null`
|
|
429
|
+
* for scoped runs and any run where trend history is unavailable.
|
|
430
|
+
*/
|
|
431
|
+
readonly trend: TrendSummary | null;
|
|
432
|
+
/**
|
|
433
|
+
* Files below the aspirational `coverageTargets` tier. Workspace and
|
|
434
|
+
* project cells surface a truncated listing of these; single-file and
|
|
435
|
+
* single-test cells ignore them.
|
|
436
|
+
*/
|
|
437
|
+
readonly belowTarget: ReadonlyArray<FileCoverageReport>;
|
|
438
|
+
/**
|
|
439
|
+
* Configured run command (e.g. `pnpm test`). Cell footers reference
|
|
440
|
+
* this so copy-pasted commands stay accurate. `null` when no command
|
|
441
|
+
* was configured.
|
|
442
|
+
*/
|
|
443
|
+
readonly runCommand: string | null;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Render-time options threaded into each cell from the resolved
|
|
447
|
+
* `ReporterKit`. These are concerns the cell needs to format its
|
|
448
|
+
* output but that do not belong on the state-derived
|
|
449
|
+
* {@link DispatchInputs} struct.
|
|
450
|
+
*
|
|
451
|
+
* The plugin builds this once per run from the kit and passes it into
|
|
452
|
+
* `dispatch(inputs, opts)`. Cells destructure only what they consume.
|
|
453
|
+
* @public
|
|
454
|
+
*/
|
|
455
|
+
interface CellOptions {
|
|
456
|
+
/**
|
|
457
|
+
* Resolved value of the `NO_COLOR` env var. Cells gate ANSI escape
|
|
458
|
+
* sequences and OSC-8 hyperlinks on this.
|
|
459
|
+
*/
|
|
460
|
+
readonly noColor: boolean;
|
|
461
|
+
/**
|
|
462
|
+
* Pre-bound OSC-8 hyperlink helper. The plugin has already decided
|
|
463
|
+
* whether OSC-8 should be enabled (`target=stdout`, `!noColor`) so
|
|
464
|
+
* cells can call this directly without re-consulting the environment.
|
|
465
|
+
*/
|
|
466
|
+
readonly osc8: (url: string, label: string) => string;
|
|
467
|
+
}
|
|
468
|
+
//#endregion
|
|
469
|
+
//#region src/ink/CountColumns.d.ts
|
|
470
|
+
/**
|
|
471
|
+
* Props for the `CountColumns` component.
|
|
472
|
+
*
|
|
473
|
+
* @public
|
|
474
|
+
*/
|
|
475
|
+
interface CountColumnsProps {
|
|
476
|
+
/** Number of passing tests. */
|
|
477
|
+
readonly passCount: number;
|
|
478
|
+
/** Number of failing tests. */
|
|
479
|
+
readonly failCount: number;
|
|
480
|
+
/** Number of skipped tests. */
|
|
481
|
+
readonly skipCount: number;
|
|
482
|
+
/** Number of timed-out tests. */
|
|
483
|
+
readonly timeoutCount: number;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Fixed width of the duration cell that follows the count columns on an
|
|
487
|
+
* aggregate row — sized for the formatter's widest common output
|
|
488
|
+
* (`59m 59s`). Longer values overflow their row rather than truncate.
|
|
489
|
+
*
|
|
490
|
+
* @public
|
|
491
|
+
*/
|
|
492
|
+
export declare const DURATION_CELL_WIDTH = 7;
|
|
493
|
+
/**
|
|
494
|
+
* Renders four colored count columns (pass ✓, fail ✗, skip ↷, timeout ⧖)
|
|
495
|
+
* for an aggregate row. Counts render right-aligned in fixed 4-digit cells so
|
|
496
|
+
* columns align across rows; counts of 10,000+ overflow their row without
|
|
497
|
+
* truncation. Zeros are greyed; all four columns always appear. Glyphs and
|
|
498
|
+
* colours come from `VitestAgentStatus` (skip is `muted`).
|
|
499
|
+
*
|
|
500
|
+
* @public
|
|
501
|
+
*/
|
|
502
|
+
export declare const CountColumns: FC<CountColumnsProps>;
|
|
503
|
+
//#endregion
|
|
504
|
+
//#region src/ink/CoverageBlock.d.ts
|
|
505
|
+
/**
|
|
506
|
+
* Props for the `CoverageBlock` component.
|
|
507
|
+
*
|
|
508
|
+
* @public
|
|
509
|
+
*/
|
|
510
|
+
interface CoverageBlockProps {
|
|
511
|
+
/** The coverage render state to display. */
|
|
512
|
+
readonly coverage: CoverageRenderState;
|
|
513
|
+
/** Maximum number of gap entries to list; defaults to 3. */
|
|
514
|
+
readonly maxGaps?: number;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Renders the coverage section: per-metric percentages, threshold
|
|
518
|
+
* violations, and top-N gap entries sorted by missing line count.
|
|
519
|
+
*
|
|
520
|
+
* @public
|
|
521
|
+
*/
|
|
522
|
+
export declare const CoverageBlock: FC<CoverageBlockProps>;
|
|
523
|
+
//#endregion
|
|
524
|
+
//#region src/ink/dispatch-ink.d.ts
|
|
525
|
+
/**
|
|
526
|
+
* A cell's Ink half: pure function from dispatch inputs to a React
|
|
527
|
+
* element rendered to the terminal.
|
|
528
|
+
*
|
|
529
|
+
* @public
|
|
530
|
+
*/
|
|
531
|
+
type InkCellFn = (inputs: DispatchInputs, opts: CellOptions) => ReactElement;
|
|
532
|
+
/**
|
|
533
|
+
* The 4×3 Ink cell table, keyed by the same `(RunShape, RunOutcome)`
|
|
534
|
+
* matrix as the root entry's `dispatcherTable`. An `undefined` entry is a
|
|
535
|
+
* cell with no Ink half (`single-test × threshold-violation`).
|
|
536
|
+
*
|
|
537
|
+
* @public
|
|
538
|
+
*/
|
|
539
|
+
export declare const inkDispatcherTable: Readonly<Record<RunShape, Readonly<Record<RunOutcome, InkCellFn | undefined>>>>;
|
|
540
|
+
/**
|
|
541
|
+
* Dispatch to the cell that matches `(inputs.shape, inputs.outcome)`
|
|
542
|
+
* and return its Ink-half React tree, followed by the scoped-coverage
|
|
543
|
+
* note on a partial run. Returns `null` when the matched cell has no Ink
|
|
544
|
+
* half — callers fall back to the root entry's `dispatch` string then.
|
|
545
|
+
*
|
|
546
|
+
* @param inputs - the classified dispatch inputs
|
|
547
|
+
* @param opts - cell rendering options
|
|
548
|
+
* @returns the Ink React element, or `null` when the cell has no Ink half
|
|
549
|
+
* @public
|
|
550
|
+
*/
|
|
551
|
+
export declare const dispatchInk: (inputs: DispatchInputs, opts: CellOptions) => ReactElement | null;
|
|
552
|
+
//#endregion
|
|
553
|
+
//#region src/ink/FailureSection.d.ts
|
|
554
|
+
/**
|
|
555
|
+
* Props for the `FailureSection` component.
|
|
556
|
+
*
|
|
557
|
+
* @public
|
|
558
|
+
*/
|
|
559
|
+
interface FailureSectionProps {
|
|
560
|
+
/** The list of failure records to display. */
|
|
561
|
+
readonly failures: ReadonlyArray<FailureRecord>;
|
|
562
|
+
/** When `true`, renders the full stack trace under each failure. */
|
|
563
|
+
readonly includeStack?: boolean;
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Renders one block per failed test: glyph, path, classification tag,
|
|
567
|
+
* error message, diff lines, and optionally the stack trace.
|
|
568
|
+
*
|
|
569
|
+
* @public
|
|
570
|
+
*/
|
|
571
|
+
export declare const FailureSection: FC<FailureSectionProps>;
|
|
572
|
+
//#endregion
|
|
573
|
+
//#region src/ink/FailuresSection.d.ts
|
|
574
|
+
/**
|
|
575
|
+
* Props for the `FailuresSection` component.
|
|
576
|
+
*
|
|
577
|
+
* @public
|
|
578
|
+
*/
|
|
579
|
+
interface FailuresSectionProps {
|
|
580
|
+
/** The list of failure records to display. */
|
|
581
|
+
readonly failures: ReadonlyArray<FailureRecord>;
|
|
582
|
+
/** Maximum entries to list before collapsing the rest into an overflow line. */
|
|
583
|
+
readonly limit: number;
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Renders the capped failures block for aggregate-row shapes.
|
|
587
|
+
* Entries beyond `limit` collapse into an overflow line.
|
|
588
|
+
*
|
|
589
|
+
* @public
|
|
590
|
+
*/
|
|
591
|
+
export declare const FailuresSection: FC<FailuresSectionProps>;
|
|
592
|
+
//#endregion
|
|
593
|
+
//#region src/ink/ModuleHeader.d.ts
|
|
594
|
+
/**
|
|
595
|
+
* Props for the `ModuleHeader` component.
|
|
596
|
+
*
|
|
597
|
+
* @public
|
|
598
|
+
*/
|
|
599
|
+
interface ModuleHeaderProps {
|
|
600
|
+
/** The module record to display. */
|
|
601
|
+
readonly module: ModuleRecord;
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Renders the per-module title line: a status glyph, the module path,
|
|
605
|
+
* and a dimmed inline summary of pass/fail/skip counts and duration.
|
|
606
|
+
*
|
|
607
|
+
* @public
|
|
608
|
+
*/
|
|
609
|
+
export declare const ModuleHeader: FC<ModuleHeaderProps>;
|
|
610
|
+
//#endregion
|
|
611
|
+
//#region src/ink/ProjectRow.d.ts
|
|
612
|
+
/**
|
|
613
|
+
* Props for the `ProjectRow` component.
|
|
614
|
+
*
|
|
615
|
+
* @public
|
|
616
|
+
*/
|
|
617
|
+
interface ProjectRowProps {
|
|
618
|
+
/** The per-project rollup. */
|
|
619
|
+
readonly project: ProjectSummary;
|
|
620
|
+
/** Pass/fail/skip/timeout counts for the project. */
|
|
621
|
+
readonly counts: {
|
|
622
|
+
passCount: number;
|
|
623
|
+
failCount: number;
|
|
624
|
+
skipCount: number;
|
|
625
|
+
timeoutCount: number;
|
|
626
|
+
};
|
|
627
|
+
/** True while the project still has a running or queued module. */
|
|
628
|
+
readonly running: boolean;
|
|
629
|
+
/**
|
|
630
|
+
* True when the run has been timed out — running rows resolve to the
|
|
631
|
+
* `⧖` glyph instead of continuing to animate the spinner.
|
|
632
|
+
*/
|
|
633
|
+
readonly timedOut?: boolean;
|
|
634
|
+
/** Elapsed milliseconds — wall-clock while running, summed duration once finished. */
|
|
635
|
+
readonly elapsedMs: number;
|
|
636
|
+
/** Current spinner glyph; rendered in place of the status icon while running. */
|
|
637
|
+
readonly frame: string;
|
|
638
|
+
/** Name-column width so the count columns align across rows. */
|
|
639
|
+
readonly nameWidth: number;
|
|
640
|
+
/** Per-tag test counts for the project, merged across its modules; feeds the TagColumns cells. */
|
|
641
|
+
readonly tagCounts?: Record<string, number> | undefined;
|
|
642
|
+
/**
|
|
643
|
+
* The view-level tag union. Every row renders every tag in it so the
|
|
644
|
+
* tag columns align; empty (the default) renders no tag cells.
|
|
645
|
+
*/
|
|
646
|
+
readonly tagUnion?: ReadonlyArray<string>;
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Renders one per-project row in the `workspace`-shape live view: status
|
|
650
|
+
* glyph (animated spinner while running), project name, count columns,
|
|
651
|
+
* elapsed duration, and optional tag counts.
|
|
652
|
+
*
|
|
653
|
+
* @public
|
|
654
|
+
*/
|
|
655
|
+
export declare const ProjectRow: FC<ProjectRowProps>;
|
|
656
|
+
//#endregion
|
|
657
|
+
//#region src/ink/StatusIcon.d.ts
|
|
658
|
+
/**
|
|
659
|
+
* The set of named statuses a `StatusIcon` can render.
|
|
660
|
+
*
|
|
661
|
+
* @public
|
|
662
|
+
*/
|
|
663
|
+
type StatusIconKind = "passed" | "failed" | "skipped" | "pending" | "running" | "queued" | "finished" | "threshold" | "timed-out";
|
|
664
|
+
/**
|
|
665
|
+
* Props for the `StatusIcon` component.
|
|
666
|
+
*
|
|
667
|
+
* @public
|
|
668
|
+
*/
|
|
669
|
+
interface StatusIconProps {
|
|
670
|
+
/** The status to render as a colored glyph. */
|
|
671
|
+
readonly status: StatusIconKind;
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Renders a single colored status glyph for a test, module, or run.
|
|
675
|
+
*
|
|
676
|
+
* @public
|
|
677
|
+
*/
|
|
678
|
+
export declare const StatusIcon: FC<StatusIconProps>;
|
|
679
|
+
//#endregion
|
|
680
|
+
//#region src/ink/StreamApp.d.ts
|
|
681
|
+
/**
|
|
682
|
+
* Props for the `StreamApp` component.
|
|
683
|
+
*
|
|
684
|
+
* @public
|
|
685
|
+
*/
|
|
686
|
+
interface StreamAppProps {
|
|
687
|
+
/** The current reduced render state to display. */
|
|
688
|
+
readonly state: RenderState;
|
|
689
|
+
/** Current spinner frame index (the live view's `frame`: wall-clock ticks of `SPINNER_FRAME_MS`). */
|
|
690
|
+
readonly frameIndex: number;
|
|
691
|
+
/** Current wall-clock time in milliseconds; defaults to `Date.now()`. */
|
|
692
|
+
readonly nowMs?: number;
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Root Ink component for the `stream` live renderer. Classifies the run
|
|
696
|
+
* shape and renders the appropriate per-shape live region.
|
|
697
|
+
*
|
|
698
|
+
* @public
|
|
699
|
+
*/
|
|
700
|
+
export declare const StreamApp: FC<StreamAppProps>;
|
|
701
|
+
//#endregion
|
|
702
|
+
//#region src/ink/SuggestedActions.d.ts
|
|
703
|
+
/**
|
|
704
|
+
* Props for the `SuggestedActions` component.
|
|
705
|
+
*
|
|
706
|
+
* @public
|
|
707
|
+
*/
|
|
708
|
+
interface SuggestedActionsProps {
|
|
709
|
+
/** The list of suggested actions to display. */
|
|
710
|
+
readonly actions: ReadonlyArray<SuggestedActionRecord>;
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Renders the suggested-actions queue as severity-prefixed rows with
|
|
714
|
+
* optional tool hints. Returns `null` when the actions list is empty.
|
|
715
|
+
*
|
|
716
|
+
* @public
|
|
717
|
+
*/
|
|
718
|
+
export declare const SuggestedActions: FC<SuggestedActionsProps>;
|
|
719
|
+
//#endregion
|
|
720
|
+
//#region src/ink/TagColumns.d.ts
|
|
721
|
+
/**
|
|
722
|
+
* Compute the view-level tag union: the alphabetically sorted set of tag
|
|
723
|
+
* names across every row's tag counts. A union of a single tag carries no
|
|
724
|
+
* signal (the whole view is one kind), so it collapses to empty and the
|
|
725
|
+
* view renders no tag columns at all.
|
|
726
|
+
*
|
|
727
|
+
* @public
|
|
728
|
+
*/
|
|
729
|
+
export declare const tagUnion: (rows: ReadonlyArray<Record<string, number> | undefined>) => ReadonlyArray<string>;
|
|
730
|
+
/**
|
|
731
|
+
* Props for the `TagColumns` component.
|
|
732
|
+
*
|
|
733
|
+
* @public
|
|
734
|
+
*/
|
|
735
|
+
interface TagColumnsProps {
|
|
736
|
+
/** The view-level tag union — every row renders every tag in it. */
|
|
737
|
+
readonly tags: ReadonlyArray<string>;
|
|
738
|
+
/** This row's per-tag test counts; tags absent here render a dimmed 0. */
|
|
739
|
+
readonly counts?: Record<string, number> | undefined;
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Renders one row's fixed-width tag cells for the given tag union.
|
|
743
|
+
* Renders nothing when the union is empty.
|
|
744
|
+
*
|
|
745
|
+
* @public
|
|
746
|
+
*/
|
|
747
|
+
export declare const TagColumns: FC<TagColumnsProps>;
|
|
748
|
+
//#endregion
|
|
749
|
+
//#region src/ink/TestRow.d.ts
|
|
750
|
+
/**
|
|
751
|
+
* Props for the `TestRow` component.
|
|
752
|
+
*
|
|
753
|
+
* @public
|
|
754
|
+
*/
|
|
755
|
+
interface TestRowProps {
|
|
756
|
+
/** The test record to display. */
|
|
757
|
+
readonly test: TestRecord;
|
|
758
|
+
/** Leading indentation in spaces; defaults to 2. */
|
|
759
|
+
readonly indent?: number;
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
762
|
+
* Renders one test row: status glyph, optional suite prefix, test name, and duration.
|
|
763
|
+
*
|
|
764
|
+
* @public
|
|
765
|
+
*/
|
|
766
|
+
export declare const TestRow: FC<TestRowProps>;
|
|
767
|
+
//#endregion
|
|
768
|
+
//#region src/ink/TrendLine.d.ts
|
|
769
|
+
/**
|
|
770
|
+
* Props for the `TrendLine` component.
|
|
771
|
+
*
|
|
772
|
+
* @public
|
|
773
|
+
*/
|
|
774
|
+
interface TrendLineProps {
|
|
775
|
+
/** The trend summary to display. */
|
|
776
|
+
readonly trend: {
|
|
777
|
+
readonly direction: "improving" | "regressing" | "stable";
|
|
778
|
+
readonly runCount: number;
|
|
779
|
+
};
|
|
780
|
+
}
|
|
781
|
+
/**
|
|
782
|
+
* Renders the one-line trend signal: direction (colored) and run count.
|
|
783
|
+
*
|
|
784
|
+
* @public
|
|
785
|
+
*/
|
|
786
|
+
export declare const TrendLine: FC<TrendLineProps>;
|
|
787
|
+
//#endregion
|
|
788
|
+
export type { CellOptions, CountColumnsProps, CoverageBlockProps, CoverageRenderState, DispatchInputs, FailureRecord, FailureSectionProps, FailuresSectionProps, FileCoverageReport, InkCellFn, ModuleHeaderProps, ModuleRecord, ProjectRowProps, ProjectSummary, RenderState, RunOutcome, RunShape, StatusIconKind, StatusIconProps, StreamAppProps, SuggestedActionRecord, SuggestedActionsProps, TagColumnsProps, TestRecord, TestRowProps, TrendLineProps, TrendSummary };
|
|
789
|
+
//# sourceMappingURL=ink.d.ts.map
|