@workflow/cli 5.0.0-beta.46 → 5.0.0-beta.48
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/dist/commands/cancel.d.ts +10 -1
- package/dist/commands/cancel.d.ts.map +1 -1
- package/dist/commands/cancel.js +20 -7
- package/dist/commands/inspect-flag-forwarding.test.d.ts +2 -0
- package/dist/commands/inspect-flag-forwarding.test.d.ts.map +1 -0
- package/dist/commands/inspect-flag-forwarding.test.js +121 -0
- package/dist/commands/inspect-flag-scope.test.d.ts +2 -0
- package/dist/commands/inspect-flag-scope.test.d.ts.map +1 -0
- package/dist/commands/inspect-flag-scope.test.js +161 -0
- package/dist/commands/inspect.d.ts +13 -1
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +70 -10
- package/dist/commands/start.d.ts +1 -1
- package/dist/commands/web.d.ts +1 -1
- package/dist/lib/bulk-cancel.d.ts +15 -2
- package/dist/lib/bulk-cancel.d.ts.map +1 -1
- package/dist/lib/bulk-cancel.js +49 -18
- package/dist/lib/bulk-cancel.test.js +80 -8
- package/dist/lib/config/types.d.ts +6 -1
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/config/types.js +1 -1
- package/dist/lib/inspect/attribute-filter.d.ts +15 -0
- package/dist/lib/inspect/attribute-filter.d.ts.map +1 -0
- package/dist/lib/inspect/attribute-filter.js +51 -0
- package/dist/lib/inspect/attribute-filter.test.d.ts +2 -0
- package/dist/lib/inspect/attribute-filter.test.d.ts.map +1 -0
- package/dist/lib/inspect/attribute-filter.test.js +65 -0
- package/dist/lib/inspect/errors.d.ts +28 -0
- package/dist/lib/inspect/errors.d.ts.map +1 -1
- package/dist/lib/inspect/errors.js +59 -1
- package/dist/lib/inspect/errors.test.d.ts +2 -0
- package/dist/lib/inspect/errors.test.d.ts.map +1 -0
- package/dist/lib/inspect/errors.test.js +48 -0
- package/dist/lib/inspect/flag-bounds.d.ts +57 -0
- package/dist/lib/inspect/flag-bounds.d.ts.map +1 -0
- package/dist/lib/inspect/flag-bounds.js +112 -0
- package/dist/lib/inspect/flag-bounds.test.d.ts +2 -0
- package/dist/lib/inspect/flag-bounds.test.d.ts.map +1 -0
- package/dist/lib/inspect/flag-bounds.test.js +126 -0
- package/dist/lib/inspect/flags.d.ts +1 -1
- package/dist/lib/inspect/flags.d.ts.map +1 -1
- package/dist/lib/inspect/flags.js +5 -2
- package/dist/lib/inspect/hydration.d.ts.map +1 -1
- package/dist/lib/inspect/hydration.js +2 -1
- package/dist/lib/inspect/output.d.ts +10 -0
- package/dist/lib/inspect/output.d.ts.map +1 -1
- package/dist/lib/inspect/output.js +138 -24
- package/dist/lib/inspect/output.test.js +223 -2
- package/package.json +13 -13
|
@@ -23,8 +23,24 @@ function makeLogger() {
|
|
|
23
23
|
*/
|
|
24
24
|
function makeWorld(opts) {
|
|
25
25
|
const runsById = new Map(opts.runs.map((r) => [r.runId, r]));
|
|
26
|
+
const windowStart = opts.analyticsWindowStart;
|
|
27
|
+
const analyticsList = windowStart
|
|
28
|
+
? vi.fn(async (params = {}) => ({
|
|
29
|
+
data: params.status
|
|
30
|
+
? opts.runs.filter((r) => r.status === params.status)
|
|
31
|
+
: opts.runs,
|
|
32
|
+
hasMore: opts.hasMore ?? false,
|
|
33
|
+
pageInfo: {
|
|
34
|
+
currentLookbackDays: 30,
|
|
35
|
+
maxLookbackDays: 30,
|
|
36
|
+
currentWindowStart: new Date(windowStart),
|
|
37
|
+
maxWindowStart: new Date(windowStart),
|
|
38
|
+
upgradeAvailable: false,
|
|
39
|
+
},
|
|
40
|
+
}))
|
|
41
|
+
: undefined;
|
|
26
42
|
const world = {
|
|
27
|
-
analytics: undefined,
|
|
43
|
+
analytics: analyticsList ? { runs: { list: analyticsList } } : undefined,
|
|
28
44
|
runs: {
|
|
29
45
|
// Status-aware so tests can seed mixed-status runs and assert that only
|
|
30
46
|
// the requested status is matched. performBulkCancel always passes a
|
|
@@ -52,16 +68,24 @@ function makeWorld(opts) {
|
|
|
52
68
|
return world;
|
|
53
69
|
}
|
|
54
70
|
describe('validateBulkCancelLimit', () => {
|
|
55
|
-
it('accepts integers within [1,
|
|
71
|
+
it('accepts integers within [1, 100]', () => {
|
|
56
72
|
expect(validateBulkCancelLimit(1)).toBeUndefined();
|
|
57
73
|
expect(validateBulkCancelLimit(50)).toBeUndefined();
|
|
58
|
-
expect(validateBulkCancelLimit(
|
|
74
|
+
expect(validateBulkCancelLimit(100)).toBeUndefined();
|
|
59
75
|
});
|
|
60
76
|
it('rejects out-of-range and non-integer values', () => {
|
|
61
|
-
expect(validateBulkCancelLimit(0)).toMatch(/between 1 and
|
|
62
|
-
expect(validateBulkCancelLimit(
|
|
63
|
-
expect(validateBulkCancelLimit(-5)).toMatch(/between 1 and
|
|
64
|
-
expect(validateBulkCancelLimit(1.5)).toMatch(/between 1 and
|
|
77
|
+
expect(validateBulkCancelLimit(0)).toMatch(/between 1 and 100/);
|
|
78
|
+
expect(validateBulkCancelLimit(101)).toMatch(/between 1 and 100/);
|
|
79
|
+
expect(validateBulkCancelLimit(-5)).toMatch(/between 1 and 100/);
|
|
80
|
+
expect(validateBulkCancelLimit(1.5)).toMatch(/between 1 and 100/);
|
|
81
|
+
});
|
|
82
|
+
// 101-500 was advertised and accepted here, and then rejected by whichever
|
|
83
|
+
// path served it: the analytics runs listing rejects it locally, and the
|
|
84
|
+
// storage listing it falls back to caps at 100 server-side. Neither message
|
|
85
|
+
// reached the user, because cancel's catch printed nothing for either.
|
|
86
|
+
it('rejects the range no backend ever served', () => {
|
|
87
|
+
expect(validateBulkCancelLimit(200)).toBeDefined();
|
|
88
|
+
expect(validateBulkCancelLimit(500)).toBeDefined();
|
|
65
89
|
});
|
|
66
90
|
});
|
|
67
91
|
describe('formatBulkCancelSummary', () => {
|
|
@@ -363,4 +387,52 @@ describe('performBulkCancel', () => {
|
|
|
363
387
|
expect(cancelMany).not.toHaveBeenCalled();
|
|
364
388
|
});
|
|
365
389
|
});
|
|
366
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYnVsay1jYW5jZWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHVCQUF1QixHQUN4QixNQUFNLGtCQUFrQixDQUFDO0FBUzFCLDBFQUEwRTtBQUMxRSxTQUFTLFVBQVU7SUFDakIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTztRQUNMLE1BQU0sRUFBRTtZQUNOLEdBQUcsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSTtRQUNKLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsSUFPbEI7SUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMs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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgQnVsa0NhbmNlbFdvcmtmbG93UnVuc1JlcXVlc3QsXG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7XG4gIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMsXG4gIENMSV9DQU5DRUxfUkVBU09OLFxuICBmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeSxcbiAgSEFTX01PUkVfR1VJREFOQ0UsXG4gIHBlcmZvcm1CdWxrQ2FuY2VsLFxuICB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCxcbn0gZnJvbSAnLi9idWxrLWNhbmNlbC5qcyc7XG5cbmludGVyZmFjZSBGYWtlUnVuIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb2xsZWN0cyBsb2dnZXIgb3V0cHV0IHNvIGFzc2VydGlvbnMgY2FuIGluc3BlY3Qgd2hhdCB0aGUgdXNlciBzYXcuICovXG5mdW5jdGlvbiBtYWtlTG9nZ2VyKCkge1xuICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YXJuczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICByZXR1cm4ge1xuICAgIGxvZ2dlcjoge1xuICAgICAgbG9nOiAobTogc3RyaW5nKSA9PiBsb2dzLnB1c2gobSksXG4gICAgICB3YXJuOiAobTogc3RyaW5nKSA9PiB3YXJucy5wdXNoKG0pLFxuICAgICAgZXJyb3I6IChtOiBzdHJpbmcpID0+IGVycm9ycy5wdXNoKG0pLFxuICAgIH0sXG4gICAgbG9ncyxcbiAgICB3YXJucyxcbiAgICBlcnJvcnMsXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBtaW5pbWFsIGZha2Ugd29ybGQuIGBjYW5jZWxNYW55YCBpcyBhdHRhY2hlZCBvbmx5IHdoZW4gcHJvdmlkZWQsXG4gKiB3aGljaCBpcyBob3cge0BsaW5rIHBlcmZvcm1CdWxrQ2FuY2VsfSAodmlhIGBjYW5jZWxSdW5zYCkgZGVjaWRlcyBiZXR3ZWVuXG4gKiB0aGUgc2luZ2xlLXJlcXVlc3QgZmFzdCBwYXRoIGFuZCB0aGUgcGVyLXJ1biBmYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gbWFrZVdvcmxkKG9wdHM6IHtcbiAgcnVuczogRmFrZVJ1bltdO1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgY2FuY2VsTWFueT86IChcbiAgICByZXF1ZXN0OiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICApID0+IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD47XG4gIGV2ZW50c0NyZWF0ZT86IChydW5JZDogc3RyaW5nKSA9PiBQcm9taXNlPHVua25vd24+O1xufSk6IFdvcmxkIHtcbiAgY29uc3QgcnVuc0J5SWQgPSBuZXcgTWFwKG9wdHMucnVucy5tYXAoKHIpID0+IFtyLnJ1bklkLCByXSkpO1xuICBjb25zdCB3b3JsZDogYW55ID0ge1xuICAgIGFuYWx5dGljczogdW5kZWZpbmVkLFxuICAgIHJ1bnM6IHtcbiAgICAgIC8vIFN0YXR1cy1hd2FyZSBzbyB0ZXN0cyBjYW4gc2VlZCBtaXhlZC1zdGF0dXMgcnVucyBhbmQgYXNzZXJ0IHRoYXQgb25seVxuICAgICAgLy8gdGhlIHJlcXVlc3RlZCBzdGF0dXMgaXMgbWF0Y2hlZC4gcGVyZm9ybUJ1bGtDYW5jZWwgYWx3YXlzIHBhc3NlcyBhXG4gICAgICAvLyBjb25jcmV0ZSBzdGF0dXMgcGVyIGNhbGwgKHRoZSBwaW5uZWQgb25lLCBvciBlYWNoIGNhbmNlbGxhYmxlIHN0YXR1cykuXG4gICAgICBsaXN0OiB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICB9KSksXG4gICAgICBnZXQ6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IHJ1bnNCeUlkLmdldChydW5JZCk7XG4gICAgICAgIGlmICghcnVuKSB0aHJvdyBuZXcgRXJyb3IoYHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjcmVhdGU6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiBvcHRzLmV2ZW50c0NyZWF0ZT8uKHJ1bklkKSksXG4gICAgfSxcbiAgfTtcbiAgaWYgKG9wdHMuY2FuY2VsTWFueSkge1xuICAgIHdvcmxkLnJ1bnMuY2FuY2VsTWFueSA9IHZpLmZuKG9wdHMuY2FuY2VsTWFueSk7XG4gIH1cbiAgcmV0dXJuIHdvcmxkIGFzIFdvcmxkO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGludGVnZXJzIHdpdGhpbiBbMSwgNTAwXScsICgpID0+IHtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoMSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoNTApKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDUwMCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgb3V0LW9mLXJhbmdlIGFuZCBub24taW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDApKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCg1MDEpKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgtNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEuNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeScsICgpID0+IHtcbiAgaXQoJ3JlbmRlcnMgZXZlcnkgb3V0Y29tZSBjYXRlZ29yeSBzbyBjb3VudHMgYWRkIHVwIHRvIHJlcXVlc3RlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkoe1xuICAgICAgc3VtbWFyeToge1xuICAgICAgICByZXF1ZXN0ZWQ6IDcsXG4gICAgICAgIGNhbmNlbGxlZDogMixcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMSxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDEsXG4gICAgICAgIG5vdEZvdW5kOiAzLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogW10sXG4gICAgfSk7XG4gICAgZXhwZWN0KHN1bW1hcnkpLnRvQmUoXG4gICAgICBbXG4gICAgICAgICdEb25lOicsXG4gICAgICAgICcgIDIgY2FuY2VsbGVkJyxcbiAgICAgICAgJyAgMSBhbHJlYWR5IGNhbmNlbGxlZCcsXG4gICAgICAgICcgIDEgbm90IGNhbmNlbGxhYmxlJyxcbiAgICAgICAgJyAgMyBub3QgZm91bmQnLFxuICAgICAgICAnICAwIGZhaWxlZCcsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2J1bGtDYW5jZWxGYWlsdXJlTGluZXMnLCAoKSA9PiB7XG4gIGl0KCdzdXJmYWNlcyBvbmx5IG5vdF9mb3VuZCwgbm90X2NhbmNlbGxhYmxlLCBhbmQgZmFpbGVkIHJ1bnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiA1LFxuICAgICAgICBjYW5jZWxsZWQ6IDEsXG4gICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDEsXG4gICAgICAgIG5vdENhbmNlbGxhYmxlOiAxLFxuICAgICAgICBub3RGb3VuZDogMSxcbiAgICAgICAgZmFpbGVkOiAxLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgeyBydW5JZDogJ2EnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnYicsIG91dGNvbWU6ICdhbHJlYWR5X2NhbmNlbGxlZCcgfSxcbiAgICAgICAgeyBydW5JZDogJ2MnLCBvdXRjb21lOiAnbm90X2NhbmNlbGxhYmxlJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnZCcsIG91dGNvbWU6ICdub3RfZm91bmQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZDogJ2UnLFxuICAgICAgICAgIG91dGNvbWU6ICdmYWlsZWQnLFxuICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgcmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBleHBlY3QobGluZXMpLnRvRXF1YWwoW1xuICAgICAgJyAg4pyXIGM6IG5vdCBjYW5jZWxsYWJsZSAoY29tcGxldGVkKScsXG4gICAgICAnICDinJcgZDogbm90IGZvdW5kJyxcbiAgICAgICcgIOKclyBlOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BlcmZvcm1CdWxrQ2FuY2VsJywgKCkgPT4ge1xuICBpdCgnd2FybnMgYW5kIGV4aXRzIDAgd2hlbiBubyBydW5zIG1hdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHsgcnVuczogW10gfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlLCByZXN1bHQgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUwLFxuICAgICAgY29uZmlybTogdHJ1ZSxcbiAgICAgIGxvZ2dlcixcbiAgICB9KTtcblxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJ05vIG1hdGNoaW5nIHJ1bnMgZm91bmQuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZXN0cmljdHMgdG8gY2FuY2VsbGFibGUgc3RhdHVzZXMgYW5kIGV4Y2x1ZGVzIHRlcm1pbmFsIHJ1bnMgd2hlbiBubyBzdGF0dXMgaXMgcGlubmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKFxuICAgICAgICByZXE6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICAgICApOiBQcm9taXNlPEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQ+ID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGNhbmNlbGxlZDogcmVxLnJ1bklkcy5sZW5ndGgsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IHJlcS5ydW5JZHMubWFwKChydW5JZCkgPT4gKHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBvdXRjb21lOiAnY2FuY2VsbGVkJyBhcyBjb25zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFtcbiAgICAgICAgeyBydW5JZDogJ3AxJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIC8vIFRlcm1pbmFsIOKAlCBtdXN0IG5ldmVyIGJlIGZldGNoZWQgb3IgY2FuY2VsbGVkLlxuICAgICAgICB7IHJ1bklkOiAnZG9uZScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgXSxcbiAgICAgIGNhbmNlbE1hbnksXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgcmVxdWVzdGVkU3RhdHVzZXMgPSAod29ybGQucnVucy5saXN0IGFzIGFueSkubW9jay5jYWxscy5tYXAoXG4gICAgICAoYzogW3sgc3RhdHVzPzogc3RyaW5nIH1dKSA9PiBjWzBdPy5zdGF0dXNcbiAgICApO1xuICAgIGV4cGVjdChyZXF1ZXN0ZWRTdGF0dXNlcykudG9Db250YWluKCdwZW5kaW5nJyk7XG4gICAgZXhwZWN0KHJlcXVlc3RlZFN0YXR1c2VzKS50b0NvbnRhaW4oJ3J1bm5pbmcnKTtcbiAgICBleHBlY3QocmVxdWVzdGVkU3RhdHVzZXMpLm5vdC50b0NvbnRhaW4oJ2NvbXBsZXRlZCcpO1xuICAgIC8vIE9ubHkgdGhlIGNhbmNlbGxhYmxlIHJ1bnMgcmVhY2ggY2FuY2VsTWFueTsgdGhlIGNvbXBsZXRlZCBydW4gaXMgZXhjbHVkZWQuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoWy4uLmNhbmNlbE1hbnkubW9jay5jYWxsc1swXVswXS5ydW5JZHNdLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICAncDEnLFxuICAgICAgJ3IxJyxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXJvYmlucyBzdGF0dXMgcGFnZXMgYmVmb3JlIGFwcGx5aW5nIHRoZSBiYXRjaCBsaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGxvZ2dlciB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IGNhbmNlbE1hbnkgPSB2aS5mbihcbiAgICAgIGFzeW5jIChcbiAgICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICAgKTogUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PiA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgICBjYW5jZWxsZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiByZXEucnVuSWRzLm1hcCgocnVuSWQpID0+ICh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgciR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoMjAyNiwgMCwgaW5kZXggKyAxKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KSksXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDMgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgcCR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICB9KSksXG4gICAgICBdLFxuICAgICAgY2FuY2VsTWFueSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUsXG4gICAgICBjb25maXJtOiB0cnVlLFxuICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkczogWydwMScsICdyMScsICdwMicsICdyMicsICdwMyddLFxuICAgICAgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgdGhlIGNhbmNlbE1hbnkgZmFzdCBwYXRoIGluIGEgc2luZ2xlIGNhbGwgYW5kIHNraXBzIHBlci1ydW4gZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKCk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgIHJlcXVlc3RlZDogMixcbiAgICAgICAgICBjYW5jZWxsZWQ6IDIsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgICB7IHJ1bklkOiAncjEnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICAgIHsgcnVuSWQ6ICdyMicsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoY2FuY2VsTWFueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWRzOiBbJ3IxJywgJ3IyJ10sXG4gICAgICBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OLFxuICAgIH0pO1xuICAgIC8vIEZhc3QgcGF0aCBtdXN0IG5vdCBmYWxsIGJhY2sgdG8gcGVyLXJ1biBldmVudCBjcmVhdGlvbi5cbiAgICBleHBlY3Qod29ybGQuZXZlbnRzLmNyZWF0ZSBhcyBhbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHBlci1ydW4gY2FuY2VsbGF0aW9uIHdoZW4gY2FuY2VsTWFueSBpcyBhYnNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIGxvZ3MgfSA9IG1ha2VMb2dnZXIoKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgICAgeyBydW5JZDogJ3IyJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdydW5uaW5nJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUsIHJlc3VsdCB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdyMScsXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OIH0sXG4gICAgICB9KSxcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0Py5zdW1tYXJ5LmNhbmNlbGxlZCkudG9CZSgyKTtcbiAgICBleHBlY3QobG9ncy5qb2luKCdcXG4nKSkudG9Db250YWluKCcyIGNhbmNlbGxlZCcpO1xuICB9KTtcblxuICBpdCgncHJpbnRzIHJlcnVuIGd1aWRhbmNlIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFt7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH1dLFxuICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgIGNhbmNlbE1hbnk6IGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IDEsXG4gICAgICAgICAgY2FuY2VsbGVkOiAxLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiBbeyBydW5JZDogJ3IxJywgb3V0Y29tZTogJ2NhbmNlbGxlZCcgfV0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogMSxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod2FybnMpLnRvQ29udGFpbihIQVNfTU9SRV9HVUlEQU5DRSk7XG4gIH0pO1xuXG4gIGl0KCdleGl0cyAxIGFuZCBzdXJmYWNlcyBwZXItcnVuIGZhaWx1cmVzIHdoZW4gYSBydW4gZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIHdhcm5zIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55OiBhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiAyLFxuICAgICAgICAgIGNhbmNlbGxlZDogMSxcbiAgICAgICAgICBhbHJlYWR5Q2FuY2VsbGVkOiAwLFxuICAgICAgICAgIG5vdENhbmNlbGxhYmxlOiAwLFxuICAgICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICAgIGZhaWxlZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgIHsgcnVuSWQ6ICdyMScsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQ6ICdyMicsXG4gICAgICAgICAgICBvdXRjb21lOiAnZmFpbGVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgICByZXRyeWFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJyAg4pyXIHIyOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyk7XG4gIH0pO1xuXG4gIGl0KCdhYm9ydHMgd2l0aG91dCBjYW5jZWxsaW5nIHdoZW4gY29uZmlybWF0aW9uIGlzIGRlY2xpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCBsb2dzIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW3sgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfV0sXG4gICAgICBjYW5jZWxNYW55OiBjYW5jZWxNYW55IGFzIGFueSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogNTAsXG4gICAgICBjb25maXJtOiBmYWxzZSxcbiAgICAgIGxvZ2dlcixcbiAgICAgIHByb21wdENvbmZpcm06IGFzeW5jICgpID0+IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICAgIGV4cGVjdChsb2dzKS50b0NvbnRhaW4oJ0Fib3J0ZWQuJyk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
390
|
+
describe('performBulkCancel analytics window probe', () => {
|
|
391
|
+
it('probes the plan window once for the whole status fan-out', async () => {
|
|
392
|
+
const windowStart = '2026-08-03T00:00:00.000Z';
|
|
393
|
+
const cancelMany = async (req) => ({
|
|
394
|
+
summary: {
|
|
395
|
+
requested: req.runIds.length,
|
|
396
|
+
cancelled: req.runIds.length,
|
|
397
|
+
alreadyCancelled: 0,
|
|
398
|
+
notCancellable: 0,
|
|
399
|
+
notFound: 0,
|
|
400
|
+
failed: 0,
|
|
401
|
+
},
|
|
402
|
+
results: req.runIds.map((runId) => ({
|
|
403
|
+
runId,
|
|
404
|
+
outcome: 'cancelled',
|
|
405
|
+
})),
|
|
406
|
+
});
|
|
407
|
+
const world = makeWorld({
|
|
408
|
+
analyticsWindowStart: windowStart,
|
|
409
|
+
runs: [
|
|
410
|
+
{ runId: 'p1', workflowName: 'wf', status: 'pending' },
|
|
411
|
+
{ runId: 'r1', workflowName: 'wf', status: 'running' },
|
|
412
|
+
],
|
|
413
|
+
cancelMany,
|
|
414
|
+
});
|
|
415
|
+
const { logger } = makeLogger();
|
|
416
|
+
const { exitCode } = await performBulkCancel({
|
|
417
|
+
world,
|
|
418
|
+
limit: 50,
|
|
419
|
+
confirm: true,
|
|
420
|
+
logger,
|
|
421
|
+
});
|
|
422
|
+
expect(exitCode).toBe(0);
|
|
423
|
+
const calls = (world.analytics?.runs.list).mock.calls.map((c) => c[0]);
|
|
424
|
+
// Exactly one probe, regardless of how many statuses are fanned out.
|
|
425
|
+
const probes = calls.filter((c) => c.pagination?.limit === 1);
|
|
426
|
+
expect(probes).toHaveLength(1);
|
|
427
|
+
// Every real listing is bounded by the window the probe resolved.
|
|
428
|
+
const listings = calls.filter((c) => c.pagination?.limit !== 1);
|
|
429
|
+
expect(listings.length).toBeGreaterThan(1);
|
|
430
|
+
for (const listing of listings) {
|
|
431
|
+
expect(listing.startTime).toBe(windowStart);
|
|
432
|
+
expect(listing.endTime).toBeDefined();
|
|
433
|
+
}
|
|
434
|
+
// Storage is not consulted when analytics is available.
|
|
435
|
+
expect(world.runs.list).not.toHaveBeenCalled();
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYnVsay1jYW5jZWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHVCQUF1QixHQUN4QixNQUFNLGtCQUFrQixDQUFDO0FBUzFCLDBFQUEwRTtBQUMxRSxTQUFTLFVBQVU7SUFDakIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTztRQUNMLE1BQU0sRUFBRTtZQUNOLEdBQUcsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSTtRQUNKLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsSUFhbEI7SUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMs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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdCxcbiAgQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdCxcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHtcbiAgYnVsa0NhbmNlbEZhaWx1cmVMaW5lcyxcbiAgQ0xJX0NBTkNFTF9SRUFTT04sXG4gIGZvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5LFxuICBIQVNfTU9SRV9HVUlEQU5DRSxcbiAgcGVyZm9ybUJ1bGtDYW5jZWwsXG4gIHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0LFxufSBmcm9tICcuL2J1bGstY2FuY2VsLmpzJztcblxuaW50ZXJmYWNlIEZha2VSdW4ge1xuICBydW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbn1cblxuLyoqIENvbGxlY3RzIGxvZ2dlciBvdXRwdXQgc28gYXNzZXJ0aW9ucyBjYW4gaW5zcGVjdCB3aGF0IHRoZSB1c2VyIHNhdy4gKi9cbmZ1bmN0aW9uIG1ha2VMb2dnZXIoKSB7XG4gIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHdhcm5zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIHJldHVybiB7XG4gICAgbG9nZ2VyOiB7XG4gICAgICBsb2c6IChtOiBzdHJpbmcpID0+IGxvZ3MucHVzaChtKSxcbiAgICAgIHdhcm46IChtOiBzdHJpbmcpID0+IHdhcm5zLnB1c2gobSksXG4gICAgICBlcnJvcjogKG06IHN0cmluZykgPT4gZXJyb3JzLnB1c2gobSksXG4gICAgfSxcbiAgICBsb2dzLFxuICAgIHdhcm5zLFxuICAgIGVycm9ycyxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIG1pbmltYWwgZmFrZSB3b3JsZC4gYGNhbmNlbE1hbnlgIGlzIGF0dGFjaGVkIG9ubHkgd2hlbiBwcm92aWRlZCxcbiAqIHdoaWNoIGlzIGhvdyB7QGxpbmsgcGVyZm9ybUJ1bGtDYW5jZWx9ICh2aWEgYGNhbmNlbFJ1bnNgKSBkZWNpZGVzIGJldHdlZW5cbiAqIHRoZSBzaW5nbGUtcmVxdWVzdCBmYXN0IHBhdGggYW5kIHRoZSBwZXItcnVuIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBtYWtlV29ybGQob3B0czoge1xuICBydW5zOiBGYWtlUnVuW107XG4gIGhhc01vcmU/OiBib29sZWFuO1xuICBjYW5jZWxNYW55PzogKFxuICAgIHJlcXVlc3Q6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICkgPT4gUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PjtcbiAgZXZlbnRzQ3JlYXRlPzogKHJ1bklkOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYW5hbHl0aWNzIG5hbWVzcGFjZSB3aG9zZSBsaXN0aW5ncyByZXBvcnQgYSBwbGFuIHdpbmRvdywgc28gYVxuICAgKiB0ZXN0IGNhbiBleGVyY2lzZSB0aGUgcHJvYmUtYW5kLXdpZGVuIHBhdGguIExlZnQgb2ZmIGJ5IGRlZmF1bHQ6IHdpdGhvdXRcbiAgICogaXQgYHBlcmZvcm1CdWxrQ2FuY2VsYCByZWFkcyBzdG9yYWdlLlxuICAgKi9cbiAgYW5hbHl0aWNzV2luZG93U3RhcnQ/OiBzdHJpbmc7XG59KTogV29ybGQge1xuICBjb25zdCBydW5zQnlJZCA9IG5ldyBNYXAob3B0cy5ydW5zLm1hcCgocikgPT4gW3IucnVuSWQsIHJdKSk7XG4gIGNvbnN0IHdpbmRvd1N0YXJ0ID0gb3B0cy5hbmFseXRpY3NXaW5kb3dTdGFydDtcbiAgY29uc3QgYW5hbHl0aWNzTGlzdCA9IHdpbmRvd1N0YXJ0XG4gICAgPyB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICAgIHBhZ2VJbmZvOiB7XG4gICAgICAgICAgY3VycmVudExvb2tiYWNrRGF5czogMzAsXG4gICAgICAgICAgbWF4TG9va2JhY2tEYXlzOiAzMCxcbiAgICAgICAgICBjdXJyZW50V2luZG93U3RhcnQ6IG5ldyBEYXRlKHdpbmRvd1N0YXJ0KSxcbiAgICAgICAgICBtYXhXaW5kb3dTdGFydDogbmV3IERhdGUod2luZG93U3RhcnQpLFxuICAgICAgICAgIHVwZ3JhZGVBdmFpbGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSkpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmxkOiBhbnkgPSB7XG4gICAgYW5hbHl0aWNzOiBhbmFseXRpY3NMaXN0ID8geyBydW5zOiB7IGxpc3Q6IGFuYWx5dGljc0xpc3QgfSB9IDogdW5kZWZpbmVkLFxuICAgIHJ1bnM6IHtcbiAgICAgIC8vIFN0YXR1cy1hd2FyZSBzbyB0ZXN0cyBjYW4gc2VlZCBtaXhlZC1zdGF0dXMgcnVucyBhbmQgYXNzZXJ0IHRoYXQgb25seVxuICAgICAgLy8gdGhlIHJlcXVlc3RlZCBzdGF0dXMgaXMgbWF0Y2hlZC4gcGVyZm9ybUJ1bGtDYW5jZWwgYWx3YXlzIHBhc3NlcyBhXG4gICAgICAvLyBjb25jcmV0ZSBzdGF0dXMgcGVyIGNhbGwgKHRoZSBwaW5uZWQgb25lLCBvciBlYWNoIGNhbmNlbGxhYmxlIHN0YXR1cykuXG4gICAgICBsaXN0OiB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICB9KSksXG4gICAgICBnZXQ6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IHJ1bnNCeUlkLmdldChydW5JZCk7XG4gICAgICAgIGlmICghcnVuKSB0aHJvdyBuZXcgRXJyb3IoYHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjcmVhdGU6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiBvcHRzLmV2ZW50c0NyZWF0ZT8uKHJ1bklkKSksXG4gICAgfSxcbiAgfTtcbiAgaWYgKG9wdHMuY2FuY2VsTWFueSkge1xuICAgIHdvcmxkLnJ1bnMuY2FuY2VsTWFueSA9IHZpLmZuKG9wdHMuY2FuY2VsTWFueSk7XG4gIH1cbiAgcmV0dXJuIHdvcmxkIGFzIFdvcmxkO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGludGVnZXJzIHdpdGhpbiBbMSwgMTAwXScsICgpID0+IHtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoMSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoNTApKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEwMCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgb3V0LW9mLXJhbmdlIGFuZCBub24taW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDApKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDEwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgxMDEpKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDEwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgtNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgMTAwLyk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEuNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgMTAwLyk7XG4gIH0pO1xuXG4gIC8vIDEwMS01MDAgd2FzIGFkdmVydGlzZWQgYW5kIGFjY2VwdGVkIGhlcmUsIGFuZCB0aGVuIHJlamVjdGVkIGJ5IHdoaWNoZXZlclxuICAvLyBwYXRoIHNlcnZlZCBpdDogdGhlIGFuYWx5dGljcyBydW5zIGxpc3RpbmcgcmVqZWN0cyBpdCBsb2NhbGx5LCBhbmQgdGhlXG4gIC8vIHN0b3JhZ2UgbGlzdGluZyBpdCBmYWxscyBiYWNrIHRvIGNhcHMgYXQgMTAwIHNlcnZlci1zaWRlLiBOZWl0aGVyIG1lc3NhZ2VcbiAgLy8gcmVhY2hlZCB0aGUgdXNlciwgYmVjYXVzZSBjYW5jZWwncyBjYXRjaCBwcmludGVkIG5vdGhpbmcgZm9yIGVpdGhlci5cbiAgaXQoJ3JlamVjdHMgdGhlIHJhbmdlIG5vIGJhY2tlbmQgZXZlciBzZXJ2ZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDIwMCkpLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDUwMCkpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeScsICgpID0+IHtcbiAgaXQoJ3JlbmRlcnMgZXZlcnkgb3V0Y29tZSBjYXRlZ29yeSBzbyBjb3VudHMgYWRkIHVwIHRvIHJlcXVlc3RlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkoe1xuICAgICAgc3VtbWFyeToge1xuICAgICAgICByZXF1ZXN0ZWQ6IDcsXG4gICAgICAgIGNhbmNlbGxlZDogMixcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMSxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDEsXG4gICAgICAgIG5vdEZvdW5kOiAzLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogW10sXG4gICAgfSk7XG4gICAgZXhwZWN0KHN1bW1hcnkpLnRvQmUoXG4gICAgICBbXG4gICAgICAgICdEb25lOicsXG4gICAgICAgICcgIDIgY2FuY2VsbGVkJyxcbiAgICAgICAgJyAgMSBhbHJlYWR5IGNhbmNlbGxlZCcsXG4gICAgICAgICcgIDEgbm90IGNhbmNlbGxhYmxlJyxcbiAgICAgICAgJyAgMyBub3QgZm91bmQnLFxuICAgICAgICAnICAwIGZhaWxlZCcsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2J1bGtDYW5jZWxGYWlsdXJlTGluZXMnLCAoKSA9PiB7XG4gIGl0KCdzdXJmYWNlcyBvbmx5IG5vdF9mb3VuZCwgbm90X2NhbmNlbGxhYmxlLCBhbmQgZmFpbGVkIHJ1bnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiA1LFxuICAgICAgICBjYW5jZWxsZWQ6IDEsXG4gICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDEsXG4gICAgICAgIG5vdENhbmNlbGxhYmxlOiAxLFxuICAgICAgICBub3RGb3VuZDogMSxcbiAgICAgICAgZmFpbGVkOiAxLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgeyBydW5JZDogJ2EnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnYicsIG91dGNvbWU6ICdhbHJlYWR5X2NhbmNlbGxlZCcgfSxcbiAgICAgICAgeyBydW5JZDogJ2MnLCBvdXRjb21lOiAnbm90X2NhbmNlbGxhYmxlJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnZCcsIG91dGNvbWU6ICdub3RfZm91bmQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZDogJ2UnLFxuICAgICAgICAgIG91dGNvbWU6ICdmYWlsZWQnLFxuICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgcmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBleHBlY3QobGluZXMpLnRvRXF1YWwoW1xuICAgICAgJyAg4pyXIGM6IG5vdCBjYW5jZWxsYWJsZSAoY29tcGxldGVkKScsXG4gICAgICAnICDinJcgZDogbm90IGZvdW5kJyxcbiAgICAgICcgIOKclyBlOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BlcmZvcm1CdWxrQ2FuY2VsJywgKCkgPT4ge1xuICBpdCgnd2FybnMgYW5kIGV4aXRzIDAgd2hlbiBubyBydW5zIG1hdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHsgcnVuczogW10gfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlLCByZXN1bHQgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUwLFxuICAgICAgY29uZmlybTogdHJ1ZSxcbiAgICAgIGxvZ2dlcixcbiAgICB9KTtcblxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJ05vIG1hdGNoaW5nIHJ1bnMgZm91bmQuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZXN0cmljdHMgdG8gY2FuY2VsbGFibGUgc3RhdHVzZXMgYW5kIGV4Y2x1ZGVzIHRlcm1pbmFsIHJ1bnMgd2hlbiBubyBzdGF0dXMgaXMgcGlubmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKFxuICAgICAgICByZXE6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICAgICApOiBQcm9taXNlPEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQ+ID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGNhbmNlbGxlZDogcmVxLnJ1bklkcy5sZW5ndGgsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IHJlcS5ydW5JZHMubWFwKChydW5JZCkgPT4gKHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBvdXRjb21lOiAnY2FuY2VsbGVkJyBhcyBjb25zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFtcbiAgICAgICAgeyBydW5JZDogJ3AxJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIC8vIFRlcm1pbmFsIOKAlCBtdXN0IG5ldmVyIGJlIGZldGNoZWQgb3IgY2FuY2VsbGVkLlxuICAgICAgICB7IHJ1bklkOiAnZG9uZScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgXSxcbiAgICAgIGNhbmNlbE1hbnksXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgcmVxdWVzdGVkU3RhdHVzZXMgPSAod29ybGQucnVucy5saXN0IGFzIGFueSkubW9jay5jYWxscy5tYXAoXG4gICAgICAoYzogW3sgc3RhdHVzPzogc3RyaW5nIH1dKSA9PiBjWzBdPy5zdGF0dXNcbiAgICApO1xuICAgIGV4cGVjdChyZXF1ZXN0ZWRTdGF0dXNlcykudG9Db250YWluKCdwZW5kaW5nJyk7XG4gICAgZXhwZWN0KHJlcXVlc3RlZFN0YXR1c2VzKS50b0NvbnRhaW4oJ3J1bm5pbmcnKTtcbiAgICBleHBlY3QocmVxdWVzdGVkU3RhdHVzZXMpLm5vdC50b0NvbnRhaW4oJ2NvbXBsZXRlZCcpO1xuICAgIC8vIE9ubHkgdGhlIGNhbmNlbGxhYmxlIHJ1bnMgcmVhY2ggY2FuY2VsTWFueTsgdGhlIGNvbXBsZXRlZCBydW4gaXMgZXhjbHVkZWQuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoWy4uLmNhbmNlbE1hbnkubW9jay5jYWxsc1swXVswXS5ydW5JZHNdLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICAncDEnLFxuICAgICAgJ3IxJyxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXJvYmlucyBzdGF0dXMgcGFnZXMgYmVmb3JlIGFwcGx5aW5nIHRoZSBiYXRjaCBsaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGxvZ2dlciB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IGNhbmNlbE1hbnkgPSB2aS5mbihcbiAgICAgIGFzeW5jIChcbiAgICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICAgKTogUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PiA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgICBjYW5jZWxsZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiByZXEucnVuSWRzLm1hcCgocnVuSWQpID0+ICh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgciR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoMjAyNiwgMCwgaW5kZXggKyAxKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KSksXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDMgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgcCR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICB9KSksXG4gICAgICBdLFxuICAgICAgY2FuY2VsTWFueSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUsXG4gICAgICBjb25maXJtOiB0cnVlLFxuICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkczogWydwMScsICdyMScsICdwMicsICdyMicsICdwMyddLFxuICAgICAgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgdGhlIGNhbmNlbE1hbnkgZmFzdCBwYXRoIGluIGEgc2luZ2xlIGNhbGwgYW5kIHNraXBzIHBlci1ydW4gZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKCk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgIHJlcXVlc3RlZDogMixcbiAgICAgICAgICBjYW5jZWxsZWQ6IDIsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgICB7IHJ1bklkOiAncjEnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICAgIHsgcnVuSWQ6ICdyMicsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoY2FuY2VsTWFueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWRzOiBbJ3IxJywgJ3IyJ10sXG4gICAgICBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OLFxuICAgIH0pO1xuICAgIC8vIEZhc3QgcGF0aCBtdXN0IG5vdCBmYWxsIGJhY2sgdG8gcGVyLXJ1biBldmVudCBjcmVhdGlvbi5cbiAgICBleHBlY3Qod29ybGQuZXZlbnRzLmNyZWF0ZSBhcyBhbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHBlci1ydW4gY2FuY2VsbGF0aW9uIHdoZW4gY2FuY2VsTWFueSBpcyBhYnNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIGxvZ3MgfSA9IG1ha2VMb2dnZXIoKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgICAgeyBydW5JZDogJ3IyJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdydW5uaW5nJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUsIHJlc3VsdCB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdyMScsXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OIH0sXG4gICAgICB9KSxcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0Py5zdW1tYXJ5LmNhbmNlbGxlZCkudG9CZSgyKTtcbiAgICBleHBlY3QobG9ncy5qb2luKCdcXG4nKSkudG9Db250YWluKCcyIGNhbmNlbGxlZCcpO1xuICB9KTtcblxuICBpdCgncHJpbnRzIHJlcnVuIGd1aWRhbmNlIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFt7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH1dLFxuICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgIGNhbmNlbE1hbnk6IGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IDEsXG4gICAgICAgICAgY2FuY2VsbGVkOiAxLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiBbeyBydW5JZDogJ3IxJywgb3V0Y29tZTogJ2NhbmNlbGxlZCcgfV0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogMSxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod2FybnMpLnRvQ29udGFpbihIQVNfTU9SRV9HVUlEQU5DRSk7XG4gIH0pO1xuXG4gIGl0KCdleGl0cyAxIGFuZCBzdXJmYWNlcyBwZXItcnVuIGZhaWx1cmVzIHdoZW4gYSBydW4gZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIHdhcm5zIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55OiBhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiAyLFxuICAgICAgICAgIGNhbmNlbGxlZDogMSxcbiAgICAgICAgICBhbHJlYWR5Q2FuY2VsbGVkOiAwLFxuICAgICAgICAgIG5vdENhbmNlbGxhYmxlOiAwLFxuICAgICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICAgIGZhaWxlZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgIHsgcnVuSWQ6ICdyMScsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQ6ICdyMicsXG4gICAgICAgICAgICBvdXRjb21lOiAnZmFpbGVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgICByZXRyeWFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJyAg4pyXIHIyOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyk7XG4gIH0pO1xuXG4gIGl0KCdhYm9ydHMgd2l0aG91dCBjYW5jZWxsaW5nIHdoZW4gY29uZmlybWF0aW9uIGlzIGRlY2xpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCBsb2dzIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW3sgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfV0sXG4gICAgICBjYW5jZWxNYW55OiBjYW5jZWxNYW55IGFzIGFueSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogNTAsXG4gICAgICBjb25maXJtOiBmYWxzZSxcbiAgICAgIGxvZ2dlcixcbiAgICAgIHByb21wdENvbmZpcm06IGFzeW5jICgpID0+IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICAgIGV4cGVjdChsb2dzKS50b0NvbnRhaW4oJ0Fib3J0ZWQuJyk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdwZXJmb3JtQnVsa0NhbmNlbCBhbmFseXRpY3Mgd2luZG93IHByb2JlJywgKCkgPT4ge1xuICBpdCgncHJvYmVzIHRoZSBwbGFuIHdpbmRvdyBvbmNlIGZvciB0aGUgd2hvbGUgc3RhdHVzIGZhbi1vdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd2luZG93U3RhcnQgPSAnMjAyNi0wOC0wM1QwMDowMDowMC4wMDBaJztcbiAgICBjb25zdCBjYW5jZWxNYW55ID0gYXN5bmMgKFxuICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgY2FuY2VsbGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogcmVxLnJ1bklkcy5tYXAoKHJ1bklkKSA9PiAoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICB9KSksXG4gICAgfSk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgYW5hbHl0aWNzV2luZG93U3RhcnQ6IHdpbmRvd1N0YXJ0LFxuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncDEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3BlbmRpbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgY2FsbHMgPSAod29ybGQuYW5hbHl0aWNzPy5ydW5zLmxpc3QgYXMgYW55KS5tb2NrLmNhbGxzLm1hcChcbiAgICAgIChcbiAgICAgICAgYzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAgICAgICAgIHN0YXJ0VGltZT86IHN0cmluZztcbiAgICAgICAgICAgIHBhZ2luYXRpb24/OiB7IGxpbWl0PzogbnVtYmVyIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgKSA9PiBjWzBdXG4gICAgKTtcblxuICAgIC8vIEV4YWN0bHkgb25lIHByb2JlLCByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHN0YXR1c2VzIGFyZSBmYW5uZWQgb3V0LlxuICAgIGNvbnN0IHByb2JlcyA9IGNhbGxzLmZpbHRlcihcbiAgICAgIChjOiB7IHBhZ2luYXRpb24/OiB7IGxpbWl0PzogbnVtYmVyIH0gfSkgPT4gYy5wYWdpbmF0aW9uPy5saW1pdCA9PT0gMVxuICAgICk7XG4gICAgZXhwZWN0KHByb2JlcykudG9IYXZlTGVuZ3RoKDEpO1xuXG4gICAgLy8gRXZlcnkgcmVhbCBsaXN0aW5nIGlzIGJvdW5kZWQgYnkgdGhlIHdpbmRvdyB0aGUgcHJvYmUgcmVzb2x2ZWQuXG4gICAgY29uc3QgbGlzdGluZ3MgPSBjYWxscy5maWx0ZXIoXG4gICAgICAoYzogeyBwYWdpbmF0aW9uPzogeyBsaW1pdD86IG51bWJlciB9IH0pID0+IGMucGFnaW5hdGlvbj8ubGltaXQgIT09IDFcbiAgICApO1xuICAgIGV4cGVjdChsaXN0aW5ncy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICBmb3IgKGNvbnN0IGxpc3Rpbmcgb2YgbGlzdGluZ3MpIHtcbiAgICAgIGV4cGVjdChsaXN0aW5nLnN0YXJ0VGltZSkudG9CZSh3aW5kb3dTdGFydCk7XG4gICAgICBleHBlY3QobGlzdGluZy5lbmRUaW1lKS50b0JlRGVmaW5lZCgpO1xuICAgIH1cbiAgICAvLyBTdG9yYWdlIGlzIG5vdCBjb25zdWx0ZWQgd2hlbiBhbmFseXRpY3MgaXMgYXZhaWxhYmxlLlxuICAgIGV4cGVjdCh3b3JsZC5ydW5zLmxpc3QpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -12,7 +12,12 @@ export type InspectCLIOptions = {
|
|
|
12
12
|
limit?: number;
|
|
13
13
|
workflowName?: string;
|
|
14
14
|
status?: WorkflowRunStatus;
|
|
15
|
-
/**
|
|
15
|
+
/** Attribute prefilter for run listings, from repeated `--attribute k=v` */
|
|
16
|
+
attributes?: Record<string, string>;
|
|
17
|
+
/**
|
|
18
|
+
* Listing window start: relative duration (12h, 7d) or timestamp.
|
|
19
|
+
* Applies to the runs and attribute-key listings.
|
|
20
|
+
*/
|
|
16
21
|
since?: string;
|
|
17
22
|
/** Listing window end: relative duration or timestamp; requires --since */
|
|
18
23
|
until?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/config/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,YAAY,EACV,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/config/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,YAAY,EACV,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC"}
|
package/dist/lib/config/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { isValidBuildTarget, validBuildTargets, } from '@workflow/builders';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbmZpZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUmUtZXhwb3J0IGJ1aWxkZXIgdHlwZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93UnVuU3RhdHVzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuZXhwb3J0IHR5cGUge1xuICBCdWlsZFRhcmdldCxcbiAgV29ya2Zsb3dDb25maWcsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5leHBvcnQge1xuICBpc1ZhbGlkQnVpbGRUYXJnZXQsXG4gIHZhbGlkQnVpbGRUYXJnZXRzLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuXG5leHBvcnQgdHlwZSBJbnNwZWN0Q0xJT3B0aW9ucyA9IHtcbiAganNvbj86IGJvb2xlYW47XG4gIHdhdGNoPzogYm9vbGVhbjtcbiAgcnVuSWQ/OiBzdHJpbmc7XG4gIHN0ZXBJZD86IHN0cmluZztcbiAgaG9va0lkPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIHNvcnQ/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbmZpZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gUmUtZXhwb3J0IGJ1aWxkZXIgdHlwZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93UnVuU3RhdHVzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuZXhwb3J0IHR5cGUge1xuICBCdWlsZFRhcmdldCxcbiAgV29ya2Zsb3dDb25maWcsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5leHBvcnQge1xuICBpc1ZhbGlkQnVpbGRUYXJnZXQsXG4gIHZhbGlkQnVpbGRUYXJnZXRzLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuXG5leHBvcnQgdHlwZSBJbnNwZWN0Q0xJT3B0aW9ucyA9IHtcbiAganNvbj86IGJvb2xlYW47XG4gIHdhdGNoPzogYm9vbGVhbjtcbiAgcnVuSWQ/OiBzdHJpbmc7XG4gIHN0ZXBJZD86IHN0cmluZztcbiAgaG9va0lkPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIHNvcnQ/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgc3RhdHVzPzogV29ya2Zsb3dSdW5TdGF0dXM7XG4gIC8qKiBBdHRyaWJ1dGUgcHJlZmlsdGVyIGZvciBydW4gbGlzdGluZ3MsIGZyb20gcmVwZWF0ZWQgYC0tYXR0cmlidXRlIGs9dmAgKi9cbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBMaXN0aW5nIHdpbmRvdyBzdGFydDogcmVsYXRpdmUgZHVyYXRpb24gKDEyaCwgN2QpIG9yIHRpbWVzdGFtcC5cbiAgICogQXBwbGllcyB0byB0aGUgcnVucyBhbmQgYXR0cmlidXRlLWtleSBsaXN0aW5ncy5cbiAgICovXG4gIHNpbmNlPzogc3RyaW5nO1xuICAvKiogTGlzdGluZyB3aW5kb3cgZW5kOiByZWxhdGl2ZSBkdXJhdGlvbiBvciB0aW1lc3RhbXA7IHJlcXVpcmVzIC0tc2luY2UgKi9cbiAgdW50aWw/OiBzdHJpbmc7XG4gIHdpdGhEYXRhPzogYm9vbGVhbjtcbiAgYmFja2VuZD86IHN0cmluZztcbiAgZGlzYWJsZVJlbGF0aXZlRGF0ZXM/OiBib29sZWFuO1xuICBpbnRlcmFjdGl2ZT86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGRlY3J5cHQgZW5jcnlwdGVkIHZhbHVlcyAodHJpZ2dlcnMgYXVkaXQtbG9nZ2VkIGtleSByZXRyaWV2YWwpICovXG4gIGRlY3J5cHQ/OiBib29sZWFuO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse repeated `--attribute key=value` flags into the filter the analytics
|
|
3
|
+
* runs listing takes.
|
|
4
|
+
*
|
|
5
|
+
* Bounds are checked here as well as in the World so the message names the
|
|
6
|
+
* flag the user typed rather than the parameter it becomes. Only the first
|
|
7
|
+
* `=` splits, since an attribute value may contain one. An empty value is
|
|
8
|
+
* meaningful — it matches runs whose attribute was set to the empty string —
|
|
9
|
+
* so only an empty key is rejected. A key given twice is rejected rather
|
|
10
|
+
* than resolved: matching is per-key, so one of the two values would have to
|
|
11
|
+
* be discarded, and silently picking either would answer a question the
|
|
12
|
+
* caller did not ask.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseAttributeFilters(values: string[] | undefined): Record<string, string> | undefined;
|
|
15
|
+
//# sourceMappingURL=attribute-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-filter.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/attribute-filter.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CA6BpC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cap on `--attribute` flags, mirroring the bound the backend applies to an
|
|
3
|
+
* attribute prefilter.
|
|
4
|
+
*
|
|
5
|
+
* `@workflow/world` exports the same value as
|
|
6
|
+
* `ANALYTICS_MAX_ATTRIBUTE_FILTERS` and `@workflow/world-vercel` asserts it,
|
|
7
|
+
* so this copy is not the authority. It exists only so the error can name
|
|
8
|
+
* the flag the user typed rather than the parameter it becomes, and is kept
|
|
9
|
+
* local so the command does not fail to build against a World that predates
|
|
10
|
+
* that export.
|
|
11
|
+
*/
|
|
12
|
+
const MAX_ATTRIBUTE_FLAGS = 8;
|
|
13
|
+
/**
|
|
14
|
+
* Parse repeated `--attribute key=value` flags into the filter the analytics
|
|
15
|
+
* runs listing takes.
|
|
16
|
+
*
|
|
17
|
+
* Bounds are checked here as well as in the World so the message names the
|
|
18
|
+
* flag the user typed rather than the parameter it becomes. Only the first
|
|
19
|
+
* `=` splits, since an attribute value may contain one. An empty value is
|
|
20
|
+
* meaningful — it matches runs whose attribute was set to the empty string —
|
|
21
|
+
* so only an empty key is rejected. A key given twice is rejected rather
|
|
22
|
+
* than resolved: matching is per-key, so one of the two values would have to
|
|
23
|
+
* be discarded, and silently picking either would answer a question the
|
|
24
|
+
* caller did not ask.
|
|
25
|
+
*/
|
|
26
|
+
export function parseAttributeFilters(values) {
|
|
27
|
+
if (!values?.length)
|
|
28
|
+
return undefined;
|
|
29
|
+
if (values.length > MAX_ATTRIBUTE_FLAGS) {
|
|
30
|
+
throw new Error(`--attribute may be given at most ${MAX_ATTRIBUTE_FLAGS} times (received ${values.length})`);
|
|
31
|
+
}
|
|
32
|
+
// Null-prototype, so an attribute key that happens to name an
|
|
33
|
+
// `Object.prototype` member is an ordinary key. On a plain object literal
|
|
34
|
+
// `'toString' in attributes` is true before anything is stored, which
|
|
35
|
+
// rejected such a key as a duplicate on first sight, and assigning
|
|
36
|
+
// `__proto__` would have set the prototype instead of storing a value.
|
|
37
|
+
const attributes = Object.create(null);
|
|
38
|
+
for (const value of values) {
|
|
39
|
+
const separator = value.indexOf('=');
|
|
40
|
+
if (separator < 1) {
|
|
41
|
+
throw new Error(`--attribute must be key=value, received ${JSON.stringify(value)}`);
|
|
42
|
+
}
|
|
43
|
+
const key = value.slice(0, separator);
|
|
44
|
+
if (Object.hasOwn(attributes, key)) {
|
|
45
|
+
throw new Error(`--attribute ${JSON.stringify(key)} was given more than once; a run matches one value per key`);
|
|
46
|
+
}
|
|
47
|
+
attributes[key] = value.slice(separator + 1);
|
|
48
|
+
}
|
|
49
|
+
return attributes;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaW5zcGVjdC9hdHRyaWJ1dGUtZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUU5Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE1BQTRCO0lBRTVCLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQ2Isb0NBQW9DLG1CQUFtQixvQkFBb0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUM1RixDQUFDO0lBQ0osQ0FBQztJQUNELDhEQUE4RDtJQUM5RCwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQ3RFLG1FQUFtRTtJQUNuRSx1RUFBdUU7SUFDdkUsTUFBTSxVQUFVLEdBQTJCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkNBQTJDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDbkUsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYixlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDREQUE0RCxDQUMvRixDQUFDO1FBQ0osQ0FBQztRQUNELFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FwIG9uIGAtLWF0dHJpYnV0ZWAgZmxhZ3MsIG1pcnJvcmluZyB0aGUgYm91bmQgdGhlIGJhY2tlbmQgYXBwbGllcyB0byBhblxuICogYXR0cmlidXRlIHByZWZpbHRlci5cbiAqXG4gKiBgQHdvcmtmbG93L3dvcmxkYCBleHBvcnRzIHRoZSBzYW1lIHZhbHVlIGFzXG4gKiBgQU5BTFlUSUNTX01BWF9BVFRSSUJVVEVfRklMVEVSU2AgYW5kIGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCBhc3NlcnRzIGl0LFxuICogc28gdGhpcyBjb3B5IGlzIG5vdCB0aGUgYXV0aG9yaXR5LiBJdCBleGlzdHMgb25seSBzbyB0aGUgZXJyb3IgY2FuIG5hbWVcbiAqIHRoZSBmbGFnIHRoZSB1c2VyIHR5cGVkIHJhdGhlciB0aGFuIHRoZSBwYXJhbWV0ZXIgaXQgYmVjb21lcywgYW5kIGlzIGtlcHRcbiAqIGxvY2FsIHNvIHRoZSBjb21tYW5kIGRvZXMgbm90IGZhaWwgdG8gYnVpbGQgYWdhaW5zdCBhIFdvcmxkIHRoYXQgcHJlZGF0ZXNcbiAqIHRoYXQgZXhwb3J0LlxuICovXG5jb25zdCBNQVhfQVRUUklCVVRFX0ZMQUdTID0gODtcblxuLyoqXG4gKiBQYXJzZSByZXBlYXRlZCBgLS1hdHRyaWJ1dGUga2V5PXZhbHVlYCBmbGFncyBpbnRvIHRoZSBmaWx0ZXIgdGhlIGFuYWx5dGljc1xuICogcnVucyBsaXN0aW5nIHRha2VzLlxuICpcbiAqIEJvdW5kcyBhcmUgY2hlY2tlZCBoZXJlIGFzIHdlbGwgYXMgaW4gdGhlIFdvcmxkIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZVxuICogZmxhZyB0aGUgdXNlciB0eXBlZCByYXRoZXIgdGhhbiB0aGUgcGFyYW1ldGVyIGl0IGJlY29tZXMuIE9ubHkgdGhlIGZpcnN0XG4gKiBgPWAgc3BsaXRzLCBzaW5jZSBhbiBhdHRyaWJ1dGUgdmFsdWUgbWF5IGNvbnRhaW4gb25lLiBBbiBlbXB0eSB2YWx1ZSBpc1xuICogbWVhbmluZ2Z1bCDigJQgaXQgbWF0Y2hlcyBydW5zIHdob3NlIGF0dHJpYnV0ZSB3YXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcg4oCUXG4gKiBzbyBvbmx5IGFuIGVtcHR5IGtleSBpcyByZWplY3RlZC4gQSBrZXkgZ2l2ZW4gdHdpY2UgaXMgcmVqZWN0ZWQgcmF0aGVyXG4gKiB0aGFuIHJlc29sdmVkOiBtYXRjaGluZyBpcyBwZXIta2V5LCBzbyBvbmUgb2YgdGhlIHR3byB2YWx1ZXMgd291bGQgaGF2ZSB0b1xuICogYmUgZGlzY2FyZGVkLCBhbmQgc2lsZW50bHkgcGlja2luZyBlaXRoZXIgd291bGQgYW5zd2VyIGEgcXVlc3Rpb24gdGhlXG4gKiBjYWxsZXIgZGlkIG5vdCBhc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoXG4gIHZhbHVlczogc3RyaW5nW10gfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlcz8ubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWVzLmxlbmd0aCA+IE1BWF9BVFRSSUJVVEVfRkxBR1MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgLS1hdHRyaWJ1dGUgbWF5IGJlIGdpdmVuIGF0IG1vc3QgJHtNQVhfQVRUUklCVVRFX0ZMQUdTfSB0aW1lcyAocmVjZWl2ZWQgJHt2YWx1ZXMubGVuZ3RofSlgXG4gICAgKTtcbiAgfVxuICAvLyBOdWxsLXByb3RvdHlwZSwgc28gYW4gYXR0cmlidXRlIGtleSB0aGF0IGhhcHBlbnMgdG8gbmFtZSBhblxuICAvLyBgT2JqZWN0LnByb3RvdHlwZWAgbWVtYmVyIGlzIGFuIG9yZGluYXJ5IGtleS4gT24gYSBwbGFpbiBvYmplY3QgbGl0ZXJhbFxuICAvLyBgJ3RvU3RyaW5nJyBpbiBhdHRyaWJ1dGVzYCBpcyB0cnVlIGJlZm9yZSBhbnl0aGluZyBpcyBzdG9yZWQsIHdoaWNoXG4gIC8vIHJlamVjdGVkIHN1Y2ggYSBrZXkgYXMgYSBkdXBsaWNhdGUgb24gZmlyc3Qgc2lnaHQsIGFuZCBhc3NpZ25pbmdcbiAgLy8gYF9fcHJvdG9fX2Agd291bGQgaGF2ZSBzZXQgdGhlIHByb3RvdHlwZSBpbnN0ZWFkIG9mIHN0b3JpbmcgYSB2YWx1ZS5cbiAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gdmFsdWUuaW5kZXhPZignPScpO1xuICAgIGlmIChzZXBhcmF0b3IgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAtLWF0dHJpYnV0ZSBtdXN0IGJlIGtleT12YWx1ZSwgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gdmFsdWUuc2xpY2UoMCwgc2VwYXJhdG9yKTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihhdHRyaWJ1dGVzLCBrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAtLWF0dHJpYnV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IHdhcyBnaXZlbiBtb3JlIHRoYW4gb25jZTsgYSBydW4gbWF0Y2hlcyBvbmUgdmFsdWUgcGVyIGtleWBcbiAgICAgICk7XG4gICAgfVxuICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlLnNsaWNlKHNlcGFyYXRvciArIDEpO1xuICB9XG4gIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-filter.test.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/attribute-filter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { parseAttributeFilters } from './attribute-filter.js';
|
|
3
|
+
describe('parseAttributeFilters', () => {
|
|
4
|
+
it('is undefined when the flag is absent or empty', () => {
|
|
5
|
+
expect(parseAttributeFilters(undefined)).toBeUndefined();
|
|
6
|
+
expect(parseAttributeFilters([])).toBeUndefined();
|
|
7
|
+
});
|
|
8
|
+
it('collects repeated pairs', () => {
|
|
9
|
+
expect(parseAttributeFilters(['application=next-benchmarks', 'tenant=acme'])).toEqual({ application: 'next-benchmarks', tenant: 'acme' });
|
|
10
|
+
});
|
|
11
|
+
// Attribute values are arbitrary user strings and may contain '='.
|
|
12
|
+
it('splits on the first separator only', () => {
|
|
13
|
+
expect(parseAttributeFilters(['url=https://x.test/?a=1&b=2'])).toEqual({
|
|
14
|
+
url: 'https://x.test/?a=1&b=2',
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
// Matches runs whose attribute was explicitly set to the empty string,
|
|
18
|
+
// which is different from not filtering at all.
|
|
19
|
+
it('keeps an empty value', () => {
|
|
20
|
+
expect(parseAttributeFilters(['tenant='])).toEqual({ tenant: '' });
|
|
21
|
+
});
|
|
22
|
+
it('accepts reserved $-prefixed keys, which are filterable', () => {
|
|
23
|
+
expect(parseAttributeFilters(['$parentRunId=wrun_1'])).toEqual({
|
|
24
|
+
$parentRunId: 'wrun_1',
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it.each([
|
|
28
|
+
['no separator', 'tenant'],
|
|
29
|
+
['empty key', '=acme'],
|
|
30
|
+
])('rejects %s', (_label, value) => {
|
|
31
|
+
expect(() => parseAttributeFilters([value])).toThrow('--attribute must be key=value');
|
|
32
|
+
});
|
|
33
|
+
it('rejects more pairs than the backend accepts, naming the flag', () => {
|
|
34
|
+
const nine = Array.from({ length: 9 }, (_, i) => `k${i}=v`);
|
|
35
|
+
expect(() => parseAttributeFilters(nine)).toThrow('--attribute may be given at most 8 times (received 9)');
|
|
36
|
+
});
|
|
37
|
+
// Matching is per-key, so resolving this would mean discarding one of two
|
|
38
|
+
// filters the caller typed.
|
|
39
|
+
it('rejects a repeated key rather than picking one value', () => {
|
|
40
|
+
expect(() => parseAttributeFilters(['tenant=a', 'tenant=b'])).toThrow('--attribute "tenant" was given more than once');
|
|
41
|
+
});
|
|
42
|
+
// On a plain object literal these are truthy for `in` before anything is
|
|
43
|
+
// stored, so each was rejected as a duplicate on first sight; `__proto__`
|
|
44
|
+
// would additionally have set the prototype instead of storing a value.
|
|
45
|
+
it.each([
|
|
46
|
+
'toString',
|
|
47
|
+
'constructor',
|
|
48
|
+
'hasOwnProperty',
|
|
49
|
+
'__proto__',
|
|
50
|
+
])('accepts %s as an ordinary key', (key) => {
|
|
51
|
+
const parsed = parseAttributeFilters([`${key}=v`]);
|
|
52
|
+
expect(Object.hasOwn(parsed ?? {}, key)).toBe(true);
|
|
53
|
+
expect(parsed[key]).toBe('v');
|
|
54
|
+
});
|
|
55
|
+
it('still rejects a prototype-named key given twice', () => {
|
|
56
|
+
expect(() => parseAttributeFilters(['toString=a', 'toString=b'])).toThrow('was given more than once');
|
|
57
|
+
});
|
|
58
|
+
it('allows the same value under different keys', () => {
|
|
59
|
+
expect(parseAttributeFilters(['tenant=a', 'region=a'])).toEqual({
|
|
60
|
+
tenant: 'a',
|
|
61
|
+
region: 'a',
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWZpbHRlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L2F0dHJpYnV0ZS1maWx0ZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxFQUFFLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUNqQyxNQUFNLENBQ0oscUJBQXFCLENBQUMsQ0FBQyw2QkFBNkIsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUN0RSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUMsQ0FBQztJQUVILG1FQUFtRTtJQUNuRSxFQUFFLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyRSxHQUFHLEVBQUUseUJBQXlCO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsdUVBQXVFO0lBQ3ZFLGdEQUFnRDtJQUNoRCxFQUFFLENBQUMsc0JBQXNC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QUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMgfSBmcm9tICcuL2F0dHJpYnV0ZS1maWx0ZXIuanMnO1xuXG5kZXNjcmliZSgncGFyc2VBdHRyaWJ1dGVGaWx0ZXJzJywgKCkgPT4ge1xuICBpdCgnaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZsYWcgaXMgYWJzZW50IG9yIGVtcHR5JywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnModW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoW10pKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjb2xsZWN0cyByZXBlYXRlZCBwYWlycycsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoWydhcHBsaWNhdGlvbj1uZXh0LWJlbmNobWFya3MnLCAndGVuYW50PWFjbWUnXSlcbiAgICApLnRvRXF1YWwoeyBhcHBsaWNhdGlvbjogJ25leHQtYmVuY2htYXJrcycsIHRlbmFudDogJ2FjbWUnIH0pO1xuICB9KTtcblxuICAvLyBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBhcmJpdHJhcnkgdXNlciBzdHJpbmdzIGFuZCBtYXkgY29udGFpbiAnPScuXG4gIGl0KCdzcGxpdHMgb24gdGhlIGZpcnN0IHNlcGFyYXRvciBvbmx5JywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoWyd1cmw9aHR0cHM6Ly94LnRlc3QvP2E9MSZiPTInXSkpLnRvRXF1YWwoe1xuICAgICAgdXJsOiAnaHR0cHM6Ly94LnRlc3QvP2E9MSZiPTInLFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBNYXRjaGVzIHJ1bnMgd2hvc2UgYXR0cmlidXRlIHdhcyBleHBsaWNpdGx5IHNldCB0byB0aGUgZW1wdHkgc3RyaW5nLFxuICAvLyB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBub3QgZmlsdGVyaW5nIGF0IGFsbC5cbiAgaXQoJ2tlZXBzIGFuIGVtcHR5IHZhbHVlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoWyd0ZW5hbnQ9J10pKS50b0VxdWFsKHsgdGVuYW50OiAnJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FjY2VwdHMgcmVzZXJ2ZWQgJC1wcmVmaXhlZCBrZXlzLCB3aGljaCBhcmUgZmlsdGVyYWJsZScsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBdHRyaWJ1dGVGaWx0ZXJzKFsnJHBhcmVudFJ1bklkPXdydW5fMSddKSkudG9FcXVhbCh7XG4gICAgICAkcGFyZW50UnVuSWQ6ICd3cnVuXzEnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICBbJ25vIHNlcGFyYXRvcicsICd0ZW5hbnQnXSxcbiAgICBbJ2VtcHR5IGtleScsICc9YWNtZSddLFxuICBdKSgncmVqZWN0cyAlcycsIChfbGFiZWwsIHZhbHVlKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHBhcnNlQXR0cmlidXRlRmlsdGVycyhbdmFsdWVdKSkudG9UaHJvdyhcbiAgICAgICctLWF0dHJpYnV0ZSBtdXN0IGJlIGtleT12YWx1ZSdcbiAgICApO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBtb3JlIHBhaXJzIHRoYW4gdGhlIGJhY2tlbmQgYWNjZXB0cywgbmFtaW5nIHRoZSBmbGFnJywgKCkgPT4ge1xuICAgIGNvbnN0IG5pbmUgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA5IH0sIChfLCBpKSA9PiBgayR7aX09dmApO1xuICAgIGV4cGVjdCgoKSA9PiBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMobmluZSkpLnRvVGhyb3coXG4gICAgICAnLS1hdHRyaWJ1dGUgbWF5IGJlIGdpdmVuIGF0IG1vc3QgOCB0aW1lcyAocmVjZWl2ZWQgOSknXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gTWF0Y2hpbmcgaXMgcGVyLWtleSwgc28gcmVzb2x2aW5nIHRoaXMgd291bGQgbWVhbiBkaXNjYXJkaW5nIG9uZSBvZiB0d29cbiAgLy8gZmlsdGVycyB0aGUgY2FsbGVyIHR5cGVkLlxuICBpdCgncmVqZWN0cyBhIHJlcGVhdGVkIGtleSByYXRoZXIgdGhhbiBwaWNraW5nIG9uZSB2YWx1ZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gcGFyc2VBdHRyaWJ1dGVGaWx0ZXJzKFsndGVuYW50PWEnLCAndGVuYW50PWInXSkpLnRvVGhyb3coXG4gICAgICAnLS1hdHRyaWJ1dGUgXCJ0ZW5hbnRcIiB3YXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UnXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gT24gYSBwbGFpbiBvYmplY3QgbGl0ZXJhbCB0aGVzZSBhcmUgdHJ1dGh5IGZvciBgaW5gIGJlZm9yZSBhbnl0aGluZyBpc1xuICAvLyBzdG9yZWQsIHNvIGVhY2ggd2FzIHJlamVjdGVkIGFzIGEgZHVwbGljYXRlIG9uIGZpcnN0IHNpZ2h0OyBgX19wcm90b19fYFxuICAvLyB3b3VsZCBhZGRpdGlvbmFsbHkgaGF2ZSBzZXQgdGhlIHByb3RvdHlwZSBpbnN0ZWFkIG9mIHN0b3JpbmcgYSB2YWx1ZS5cbiAgaXQuZWFjaChbXG4gICAgJ3RvU3RyaW5nJyxcbiAgICAnY29uc3RydWN0b3InLFxuICAgICdoYXNPd25Qcm9wZXJ0eScsXG4gICAgJ19fcHJvdG9fXycsXG4gIF0pKCdhY2NlcHRzICVzIGFzIGFuIG9yZGluYXJ5IGtleScsIChrZXkpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUF0dHJpYnV0ZUZpbHRlcnMoW2Ake2tleX09dmBdKTtcbiAgICBleHBlY3QoT2JqZWN0Lmhhc093bihwYXJzZWQgPz8ge30sIGtleSkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KChwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilba2V5XSkudG9CZSgndicpO1xuICB9KTtcblxuICBpdCgnc3RpbGwgcmVqZWN0cyBhIHByb3RvdHlwZS1uYW1lZCBrZXkgZ2l2ZW4gdHdpY2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHBhcnNlQXR0cmlidXRlRmlsdGVycyhbJ3RvU3RyaW5nPWEnLCAndG9TdHJpbmc9YiddKSkudG9UaHJvdyhcbiAgICAgICd3YXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UnXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2FsbG93cyB0aGUgc2FtZSB2YWx1ZSB1bmRlciBkaWZmZXJlbnQga2V5cycsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBdHRyaWJ1dGVGaWx0ZXJzKFsndGVuYW50PWEnLCAncmVnaW9uPWEnXSkpLnRvRXF1YWwoe1xuICAgICAgdGVuYW50OiAnYScsXG4gICAgICByZWdpb246ICdhJyxcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1,3 +1,31 @@
|
|
|
1
1
|
export declare const isObservabilityUpgradeRequiredError: (error: unknown) => boolean;
|
|
2
2
|
export declare const getObservabilityUpgradeRequiredMessage: () => string;
|
|
3
|
+
/**
|
|
4
|
+
* True for a client-side argument rejection from the World
|
|
5
|
+
* (`code: 'INVALID_ARGUMENT'`).
|
|
6
|
+
*
|
|
7
|
+
* These carry no HTTP status because no request was made, which is exactly
|
|
8
|
+
* why they need naming: status-based branches let them fall through to be
|
|
9
|
+
* rethrown as an unhandled exception, which prints nothing.
|
|
10
|
+
*/
|
|
11
|
+
export declare const isInvalidArgumentError: (error: unknown) => boolean;
|
|
12
|
+
export declare const errorMessage: (error: unknown) => string;
|
|
13
|
+
export declare const checkAndHandleVercelAccessError: (error: unknown, backend?: string) => boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Report the error classes that are actionable whichever read path produced
|
|
16
|
+
* them: a project-access failure, a plan gate, or an argument the World
|
|
17
|
+
* rejected locally. Returns true when one matched and was logged.
|
|
18
|
+
*
|
|
19
|
+
* Three callers need exactly this set, for the same reason in each case —
|
|
20
|
+
* the message names something the caller can fix, so swallowing it or
|
|
21
|
+
* retrying past it replaces an actionable error with a silent one:
|
|
22
|
+
*
|
|
23
|
+
* - `handleApiError` composes it with its HTTP-status arms;
|
|
24
|
+
* - `listSleeps` uses it alone, to decide what it must report rather than
|
|
25
|
+
* degrade to the event log;
|
|
26
|
+
* - `workflow cancel` uses it alone, having no fallback at all.
|
|
27
|
+
*
|
|
28
|
+
* One definition rather than three, so the set cannot drift between them.
|
|
29
|
+
*/
|
|
30
|
+
export declare const reportActionableApiError: (error: unknown, backend?: string) => boolean;
|
|
3
31
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/errors.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,mCAAmC,GAC9C,OAAO,OAAO,KACb,OAUF,CAAC;AAEF,eAAO,MAAM,sCAAsC,QAAO,MAClB,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,OAGG,CAAC;AAE5D,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MACU,CAAC;AAEzD,eAAO,MAAM,+BAA+B,GAC1C,OAAO,OAAO,EACd,UAAU,MAAM,KACf,OASF,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,OAAO,EACd,UAAU,MAAM,KACf,OAiBF,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { VERCEL_403_ERROR_MESSAGE } from '@workflow/errors';
|
|
2
|
+
import { logger } from '../config/log.js';
|
|
1
3
|
const OBSERVABILITY_UPGRADE_REQUIRED_CODE = 'observability-upgrade-required';
|
|
2
4
|
const OBSERVABILITY_UPGRADE_REQUIRED_MESSAGE = 'This workflow observability data is outside your current plan window. Upgrade Observability Plus to view up to 30 days of workflow data.';
|
|
3
5
|
const extractErrorCode = (err) => {
|
|
@@ -24,4 +26,60 @@ export const isObservabilityUpgradeRequiredError = (error) => {
|
|
|
24
26
|
extractErrorCode(err) === OBSERVABILITY_UPGRADE_REQUIRED_CODE);
|
|
25
27
|
};
|
|
26
28
|
export const getObservabilityUpgradeRequiredMessage = () => OBSERVABILITY_UPGRADE_REQUIRED_MESSAGE;
|
|
27
|
-
|
|
29
|
+
/**
|
|
30
|
+
* True for a client-side argument rejection from the World
|
|
31
|
+
* (`code: 'INVALID_ARGUMENT'`).
|
|
32
|
+
*
|
|
33
|
+
* These carry no HTTP status because no request was made, which is exactly
|
|
34
|
+
* why they need naming: status-based branches let them fall through to be
|
|
35
|
+
* rethrown as an unhandled exception, which prints nothing.
|
|
36
|
+
*/
|
|
37
|
+
export const isInvalidArgumentError = (error) => typeof error === 'object' &&
|
|
38
|
+
error !== null &&
|
|
39
|
+
error.code === 'INVALID_ARGUMENT';
|
|
40
|
+
export const errorMessage = (error) => error instanceof Error ? error.message : String(error);
|
|
41
|
+
export const checkAndHandleVercelAccessError = (error, backend) => {
|
|
42
|
+
if (backend === 'vercel' && error && typeof error === 'object') {
|
|
43
|
+
const err = error;
|
|
44
|
+
if (err.status === 403) {
|
|
45
|
+
logger.error(VERCEL_403_ERROR_MESSAGE);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Report the error classes that are actionable whichever read path produced
|
|
53
|
+
* them: a project-access failure, a plan gate, or an argument the World
|
|
54
|
+
* rejected locally. Returns true when one matched and was logged.
|
|
55
|
+
*
|
|
56
|
+
* Three callers need exactly this set, for the same reason in each case —
|
|
57
|
+
* the message names something the caller can fix, so swallowing it or
|
|
58
|
+
* retrying past it replaces an actionable error with a silent one:
|
|
59
|
+
*
|
|
60
|
+
* - `handleApiError` composes it with its HTTP-status arms;
|
|
61
|
+
* - `listSleeps` uses it alone, to decide what it must report rather than
|
|
62
|
+
* degrade to the event log;
|
|
63
|
+
* - `workflow cancel` uses it alone, having no fallback at all.
|
|
64
|
+
*
|
|
65
|
+
* One definition rather than three, so the set cannot drift between them.
|
|
66
|
+
*/
|
|
67
|
+
export const reportActionableApiError = (error, backend) => {
|
|
68
|
+
// Called once: it logs as a side effect when it recognises the error.
|
|
69
|
+
if (checkAndHandleVercelAccessError(error, backend)) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
if (isObservabilityUpgradeRequiredError(error)) {
|
|
73
|
+
logger.error(getObservabilityUpgradeRequiredMessage());
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// An argument the World rejected before sending anything. Report it as
|
|
77
|
+
// given: the message already names the method, the parameter, and what it
|
|
78
|
+
// received.
|
|
79
|
+
if (isInvalidArgumentError(error)) {
|
|
80
|
+
logger.error(errorMessage(error));
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFMUMsTUFBTSxtQ0FBbUMsR0FBRyxnQ0FBZ0MsQ0FBQztBQUM3RSxNQUFNLHNDQUFzQyxHQUMxQywwSUFBMEksQ0FBQztBQUU3SSxNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBNEIsRUFBc0IsRUFBRTtJQUM1RSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBK0IsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxDQUNqRCxLQUFjLEVBQ0wsRUFBRTtJQUNYLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsS0FBZ0MsQ0FBQztJQUM3QyxPQUFPLENBQ0wsR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO1FBQ2xCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLG1DQUFtQyxDQUM5RCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsR0FBVyxFQUFFLENBQ2pFLHNDQUFzQyxDQUFDO0FBRXpDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWMsRUFBVyxFQUFFLENBQ2hFLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFDekIsS0FBSyxLQUFLLElBQUk7SUFDYixLQUE0QixDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFjLEVBQVUsRUFBRSxDQUNyRCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsS0FBYyxFQUNkLE9BQWdCLEVBQ1AsRUFBRTtJQUNYLElBQUksT0FBTyxLQUFLLFFBQVEsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsS0FBZ0MsQ0FBQztRQUM3QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQ3RDLEtBQWMsRUFDZCxPQUFnQixFQUNQLEVBQUU7SUFDWCxzRUFBc0U7SUFDdEUsSUFBSSwrQkFBK0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLG1DQUFtQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsdUVBQXVFO0lBQ3ZFLDBFQUEwRTtJQUMxRSxZQUFZO0lBQ1osSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWRVJDRUxfNDAzX0VSUk9SX01FU1NBR0UgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2NvbmZpZy9sb2cuanMnO1xuXG5jb25zdCBPQlNFUlZBQklMSVRZX1VQR1JBREVfUkVRVUlSRURfQ09ERSA9ICdvYnNlcnZhYmlsaXR5LXVwZ3JhZGUtcmVxdWlyZWQnO1xuY29uc3QgT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX01FU1NBR0UgPVxuICAnVGhpcyB3b3JrZmxvdyBvYnNlcnZhYmlsaXR5IGRhdGEgaXMgb3V0c2lkZSB5b3VyIGN1cnJlbnQgcGxhbiB3aW5kb3cuIFVwZ3JhZGUgT2JzZXJ2YWJpbGl0eSBQbHVzIHRvIHZpZXcgdXAgdG8gMzAgZGF5cyBvZiB3b3JrZmxvdyBkYXRhLic7XG5cbmNvbnN0IGV4dHJhY3RFcnJvckNvZGUgPSAoZXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChlcnIuY29kZSAmJiB0eXBlb2YgZXJyLmNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVyci5jb2RlO1xuICB9XG5cbiAgaWYgKGVyci5ib2R5ICYmIHR5cGVvZiBlcnIuYm9keSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBib2R5ID0gZXJyLmJvZHkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGJvZHkuY29kZSAmJiB0eXBlb2YgYm9keS5jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGJvZHkuY29kZTtcbiAgICB9XG4gICAgaWYgKGJvZHkuZXJyb3IgJiYgdHlwZW9mIGJvZHkuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYm9keS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yID0gKFxuICBlcnJvcjogdW5rbm93blxuKTogYm9vbGVhbiA9PiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVyciA9IGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gKFxuICAgIGVyci5zdGF0dXMgPT09IDQwMiAmJlxuICAgIGV4dHJhY3RFcnJvckNvZGUoZXJyKSA9PT0gT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX0NPREVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSA9ICgpOiBzdHJpbmcgPT5cbiAgT0JTRVJWQUJJTElUWV9VUEdSQURFX1JFUVVJUkVEX01FU1NBR0U7XG5cbi8qKlxuICogVHJ1ZSBmb3IgYSBjbGllbnQtc2lkZSBhcmd1bWVudCByZWplY3Rpb24gZnJvbSB0aGUgV29ybGRcbiAqIChgY29kZTogJ0lOVkFMSURfQVJHVU1FTlQnYCkuXG4gKlxuICogVGhlc2UgY2Fycnkgbm8gSFRUUCBzdGF0dXMgYmVjYXVzZSBubyByZXF1ZXN0IHdhcyBtYWRlLCB3aGljaCBpcyBleGFjdGx5XG4gKiB3aHkgdGhleSBuZWVkIG5hbWluZzogc3RhdHVzLWJhc2VkIGJyYW5jaGVzIGxldCB0aGVtIGZhbGwgdGhyb3VnaCB0byBiZVxuICogcmV0aHJvd24gYXMgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiwgd2hpY2ggcHJpbnRzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ludmFsaWRBcmd1bWVudEVycm9yID0gKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmXG4gIGVycm9yICE9PSBudWxsICYmXG4gIChlcnJvciBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgPT09ICdJTlZBTElEX0FSR1VNRU5UJztcblxuZXhwb3J0IGNvbnN0IGVycm9yTWVzc2FnZSA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PlxuICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cbmV4cG9ydCBjb25zdCBjaGVja0FuZEhhbmRsZVZlcmNlbEFjY2Vzc0Vycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgYmFja2VuZD86IHN0cmluZ1xuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChiYWNrZW5kID09PSAndmVyY2VsJyAmJiBlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMykge1xuICAgICAgbG9nZ2VyLmVycm9yKFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXBvcnQgdGhlIGVycm9yIGNsYXNzZXMgdGhhdCBhcmUgYWN0aW9uYWJsZSB3aGljaGV2ZXIgcmVhZCBwYXRoIHByb2R1Y2VkXG4gKiB0aGVtOiBhIHByb2plY3QtYWNjZXNzIGZhaWx1cmUsIGEgcGxhbiBnYXRlLCBvciBhbiBhcmd1bWVudCB0aGUgV29ybGRcbiAqIHJlamVjdGVkIGxvY2FsbHkuIFJldHVybnMgdHJ1ZSB3aGVuIG9uZSBtYXRjaGVkIGFuZCB3YXMgbG9nZ2VkLlxuICpcbiAqIFRocmVlIGNhbGxlcnMgbmVlZCBleGFjdGx5IHRoaXMgc2V0LCBmb3IgdGhlIHNhbWUgcmVhc29uIGluIGVhY2ggY2FzZSDigJRcbiAqIHRoZSBtZXNzYWdlIG5hbWVzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNhbiBmaXgsIHNvIHN3YWxsb3dpbmcgaXQgb3JcbiAqIHJldHJ5aW5nIHBhc3QgaXQgcmVwbGFjZXMgYW4gYWN0aW9uYWJsZSBlcnJvciB3aXRoIGEgc2lsZW50IG9uZTpcbiAqXG4gKiAgIC0gYGhhbmRsZUFwaUVycm9yYCBjb21wb3NlcyBpdCB3aXRoIGl0cyBIVFRQLXN0YXR1cyBhcm1zO1xuICogICAtIGBsaXN0U2xlZXBzYCB1c2VzIGl0IGFsb25lLCB0byBkZWNpZGUgd2hhdCBpdCBtdXN0IHJlcG9ydCByYXRoZXIgdGhhblxuICogICAgIGRlZ3JhZGUgdG8gdGhlIGV2ZW50IGxvZztcbiAqICAgLSBgd29ya2Zsb3cgY2FuY2VsYCB1c2VzIGl0IGFsb25lLCBoYXZpbmcgbm8gZmFsbGJhY2sgYXQgYWxsLlxuICpcbiAqIE9uZSBkZWZpbml0aW9uIHJhdGhlciB0aGFuIHRocmVlLCBzbyB0aGUgc2V0IGNhbm5vdCBkcmlmdCBiZXR3ZWVuIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCByZXBvcnRBY3Rpb25hYmxlQXBpRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBiYWNrZW5kPzogc3RyaW5nXG4pOiBib29sZWFuID0+IHtcbiAgLy8gQ2FsbGVkIG9uY2U6IGl0IGxvZ3MgYXMgYSBzaWRlIGVmZmVjdCB3aGVuIGl0IHJlY29nbmlzZXMgdGhlIGVycm9yLlxuICBpZiAoY2hlY2tBbmRIYW5kbGVWZXJjZWxBY2Nlc3NFcnJvcihlcnJvciwgYmFja2VuZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLmVycm9yKGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIEFuIGFyZ3VtZW50IHRoZSBXb3JsZCByZWplY3RlZCBiZWZvcmUgc2VuZGluZyBhbnl0aGluZy4gUmVwb3J0IGl0IGFzXG4gIC8vIGdpdmVuOiB0aGUgbWVzc2FnZSBhbHJlYWR5IG5hbWVzIHRoZSBtZXRob2QsIHRoZSBwYXJhbWV0ZXIsIGFuZCB3aGF0IGl0XG4gIC8vIHJlY2VpdmVkLlxuICBpZiAoaXNJbnZhbGlkQXJndW1lbnRFcnJvcihlcnJvcikpIHtcbiAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/errors.test.ts"],"names":[],"mappings":""}
|