@workflow/cli 5.0.0-beta.27 → 5.0.0-beta.29
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/base.d.ts.map +1 -1
- package/dist/base.js +8 -2
- package/dist/commands/cancel.d.ts.map +1 -1
- package/dist/commands/cancel.js +52 -9
- package/dist/commands/inspect.d.ts +2 -0
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +23 -3
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +8 -3
- package/dist/lib/config/types.d.ts +4 -0
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/config/types.js +1 -1
- package/dist/lib/inspect/env.d.ts +1 -1
- package/dist/lib/inspect/env.js +2 -2
- package/dist/lib/inspect/errors.d.ts +3 -0
- package/dist/lib/inspect/errors.d.ts.map +1 -0
- package/dist/lib/inspect/errors.js +27 -0
- package/dist/lib/inspect/output.d.ts +2 -2
- package/dist/lib/inspect/output.d.ts.map +1 -1
- package/dist/lib/inspect/output.js +253 -130
- package/dist/lib/inspect/output.test.js +403 -3
- package/dist/lib/inspect/pagination.d.ts +10 -1
- package/dist/lib/inspect/pagination.d.ts.map +1 -1
- package/dist/lib/inspect/pagination.js +20 -4
- package/dist/lib/inspect/run.d.ts.map +1 -1
- package/dist/lib/inspect/run.js +32 -9
- package/dist/lib/inspect/setup.d.ts.map +1 -1
- package/dist/lib/inspect/setup.js +42 -6
- package/dist/lib/inspect/time-window.d.ts +28 -0
- package/dist/lib/inspect/time-window.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.js +61 -0
- package/dist/lib/inspect/time-window.test.d.ts +2 -0
- package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.test.js +58 -0
- package/package.json +9 -9
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import {
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from './errors.js';
|
|
3
|
+
import { formatTableValue, hasExpiredData, listEvents, listRuns, listSleeps, listSteps, } from './output.js';
|
|
3
4
|
const makeRun = (overrides = {}) => ({
|
|
4
5
|
runId: 'run-1',
|
|
5
6
|
status: 'running',
|
|
@@ -17,6 +18,9 @@ const makeRun = (overrides = {}) => ({
|
|
|
17
18
|
executionContext: {},
|
|
18
19
|
...overrides,
|
|
19
20
|
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
vi.restoreAllMocks();
|
|
23
|
+
});
|
|
20
24
|
describe('hasExpiredData', () => {
|
|
21
25
|
it('returns false when expiredAt is undefined', () => {
|
|
22
26
|
expect(hasExpiredData(makeRun({ expiredAt: undefined }))).toBe(false);
|
|
@@ -49,4 +53,400 @@ describe('formatTableValue expired data handling', () => {
|
|
|
49
53
|
expect(String(result)).not.toContain('expired');
|
|
50
54
|
});
|
|
51
55
|
});
|
|
52
|
-
|
|
56
|
+
describe('isObservabilityUpgradeRequiredError', () => {
|
|
57
|
+
it('detects workflow analytics 402 errors by top-level code', () => {
|
|
58
|
+
expect(isObservabilityUpgradeRequiredError({
|
|
59
|
+
status: 402,
|
|
60
|
+
code: 'observability-upgrade-required',
|
|
61
|
+
})).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('detects workflow analytics 402 errors by response body error', () => {
|
|
64
|
+
expect(isObservabilityUpgradeRequiredError({
|
|
65
|
+
status: 402,
|
|
66
|
+
body: { error: 'observability-upgrade-required' },
|
|
67
|
+
})).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('does not treat 404s as upgrade prompts', () => {
|
|
70
|
+
expect(isObservabilityUpgradeRequiredError({
|
|
71
|
+
status: 404,
|
|
72
|
+
code: 'observability-upgrade-required',
|
|
73
|
+
})).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it('uses an upgrade prompt message', () => {
|
|
76
|
+
expect(getObservabilityUpgradeRequiredMessage()).toContain('Upgrade Observability Plus');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('listRuns', () => {
|
|
80
|
+
it('preserves analytics page metadata in JSON output', async () => {
|
|
81
|
+
const run = {
|
|
82
|
+
runId: 'run-1',
|
|
83
|
+
status: 'running',
|
|
84
|
+
deploymentId: 'dep-1',
|
|
85
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
86
|
+
specVersion: 2,
|
|
87
|
+
attributes: {},
|
|
88
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
89
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
90
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
91
|
+
completedAt: null,
|
|
92
|
+
errorCode: null,
|
|
93
|
+
workflowCoreVersion: null,
|
|
94
|
+
workflowEncryptionEnabled: false,
|
|
95
|
+
};
|
|
96
|
+
const pageInfo = {
|
|
97
|
+
currentLookbackDays: 2,
|
|
98
|
+
maxLookbackDays: 30,
|
|
99
|
+
currentWindowStart: new Date('2026-06-28T00:00:00.000Z'),
|
|
100
|
+
maxWindowStart: new Date('2026-06-01T00:00:00.000Z'),
|
|
101
|
+
upgradeAvailable: true,
|
|
102
|
+
};
|
|
103
|
+
const world = {
|
|
104
|
+
analytics: {
|
|
105
|
+
runs: {
|
|
106
|
+
list: vi.fn().mockResolvedValue({
|
|
107
|
+
data: [run],
|
|
108
|
+
cursor: null,
|
|
109
|
+
hasMore: false,
|
|
110
|
+
pageInfo,
|
|
111
|
+
}),
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
const write = vi
|
|
116
|
+
.spyOn(process.stdout, 'write')
|
|
117
|
+
.mockImplementation(() => true);
|
|
118
|
+
await listRuns(world, { json: true });
|
|
119
|
+
expect(world.analytics?.runs.list).toHaveBeenCalledWith({
|
|
120
|
+
workflowName: undefined,
|
|
121
|
+
status: undefined,
|
|
122
|
+
pagination: {
|
|
123
|
+
sortOrder: 'desc',
|
|
124
|
+
cursor: undefined,
|
|
125
|
+
limit: 20,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
expect(write).toHaveBeenCalledTimes(1);
|
|
129
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual({
|
|
130
|
+
data: [
|
|
131
|
+
{
|
|
132
|
+
...run,
|
|
133
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
134
|
+
updatedAt: '2026-06-30T00:00:00.000Z',
|
|
135
|
+
startedAt: '2026-06-30T00:00:01.000Z',
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
cursor: null,
|
|
139
|
+
hasMore: false,
|
|
140
|
+
pageInfo: {
|
|
141
|
+
currentLookbackDays: 2,
|
|
142
|
+
maxLookbackDays: 30,
|
|
143
|
+
currentWindowStart: '2026-06-28T00:00:00.000Z',
|
|
144
|
+
maxWindowStart: '2026-06-01T00:00:00.000Z',
|
|
145
|
+
upgradeAvailable: true,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe('listSteps', () => {
|
|
151
|
+
it('passes cursors and preserves the JSON array output', async () => {
|
|
152
|
+
const step = {
|
|
153
|
+
runId: 'run-1',
|
|
154
|
+
stepId: 'step-1',
|
|
155
|
+
stepName: 'doWork',
|
|
156
|
+
status: 'completed',
|
|
157
|
+
attempt: 1,
|
|
158
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
159
|
+
updatedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
160
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
161
|
+
completedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
162
|
+
retryAfter: null,
|
|
163
|
+
errorCode: null,
|
|
164
|
+
workflowCoreVersion: null,
|
|
165
|
+
workflowEncryptionEnabled: false,
|
|
166
|
+
};
|
|
167
|
+
const world = {
|
|
168
|
+
analytics: {
|
|
169
|
+
steps: {
|
|
170
|
+
list: vi.fn().mockResolvedValue({
|
|
171
|
+
data: [step],
|
|
172
|
+
cursor: 'next-step-cursor',
|
|
173
|
+
hasMore: true,
|
|
174
|
+
}),
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
const write = vi
|
|
179
|
+
.spyOn(process.stdout, 'write')
|
|
180
|
+
.mockImplementation(() => true);
|
|
181
|
+
await listSteps(world, {
|
|
182
|
+
json: true,
|
|
183
|
+
runId: 'run-1',
|
|
184
|
+
cursor: 'step-cursor',
|
|
185
|
+
limit: 1,
|
|
186
|
+
});
|
|
187
|
+
expect(world.analytics?.steps.list).toHaveBeenCalledWith({
|
|
188
|
+
runId: 'run-1',
|
|
189
|
+
pagination: {
|
|
190
|
+
sortOrder: 'desc',
|
|
191
|
+
cursor: 'step-cursor',
|
|
192
|
+
limit: 1,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
196
|
+
{
|
|
197
|
+
...step,
|
|
198
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
199
|
+
updatedAt: '2026-06-30T00:00:02.000Z',
|
|
200
|
+
startedAt: '2026-06-30T00:00:01.000Z',
|
|
201
|
+
completedAt: '2026-06-30T00:00:02.000Z',
|
|
202
|
+
},
|
|
203
|
+
]);
|
|
204
|
+
});
|
|
205
|
+
it('falls back to storage when the first analytics page is empty', async () => {
|
|
206
|
+
const step = {
|
|
207
|
+
runId: 'run-1',
|
|
208
|
+
stepId: 'step-1',
|
|
209
|
+
stepName: 'step//./src/workflows/test//doWork',
|
|
210
|
+
status: 'completed',
|
|
211
|
+
attempt: 1,
|
|
212
|
+
input: undefined,
|
|
213
|
+
output: undefined,
|
|
214
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
215
|
+
updatedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
216
|
+
startedAt: new Date('2026-06-30T00:00:01.000Z'),
|
|
217
|
+
completedAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
218
|
+
};
|
|
219
|
+
const world = {
|
|
220
|
+
analytics: {
|
|
221
|
+
steps: {
|
|
222
|
+
list: vi.fn().mockResolvedValue({
|
|
223
|
+
data: [],
|
|
224
|
+
cursor: null,
|
|
225
|
+
hasMore: false,
|
|
226
|
+
}),
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
steps: {
|
|
230
|
+
list: vi.fn().mockResolvedValue({
|
|
231
|
+
data: [step],
|
|
232
|
+
cursor: null,
|
|
233
|
+
hasMore: false,
|
|
234
|
+
}),
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
const write = vi
|
|
238
|
+
.spyOn(process.stdout, 'write')
|
|
239
|
+
.mockImplementation(() => true);
|
|
240
|
+
await listSteps(world, { json: true, runId: 'run-1' });
|
|
241
|
+
expect(world.analytics?.steps.list).toHaveBeenCalled();
|
|
242
|
+
expect(world.steps.list).toHaveBeenCalledWith({
|
|
243
|
+
runId: 'run-1',
|
|
244
|
+
pagination: {
|
|
245
|
+
sortOrder: 'desc',
|
|
246
|
+
cursor: undefined,
|
|
247
|
+
limit: 20,
|
|
248
|
+
},
|
|
249
|
+
resolveData: 'none',
|
|
250
|
+
});
|
|
251
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
252
|
+
{
|
|
253
|
+
...step,
|
|
254
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
255
|
+
updatedAt: '2026-06-30T00:00:02.000Z',
|
|
256
|
+
startedAt: '2026-06-30T00:00:01.000Z',
|
|
257
|
+
completedAt: '2026-06-30T00:00:02.000Z',
|
|
258
|
+
},
|
|
259
|
+
]);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe('listEvents', () => {
|
|
263
|
+
it('passes cursors and preserves the JSON array output', async () => {
|
|
264
|
+
const event = {
|
|
265
|
+
runId: 'run-1',
|
|
266
|
+
eventId: 'event-1',
|
|
267
|
+
eventType: 'step_completed',
|
|
268
|
+
correlationId: 'step-1',
|
|
269
|
+
entityId: 'step-1',
|
|
270
|
+
stepName: 'doWork',
|
|
271
|
+
workflowName: 'workflow//./src/workflows/test//myWorkflow',
|
|
272
|
+
deploymentId: 'dep-1',
|
|
273
|
+
specVersion: 2,
|
|
274
|
+
runCreatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
275
|
+
createdAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
276
|
+
region: null,
|
|
277
|
+
vercelId: null,
|
|
278
|
+
requestId: null,
|
|
279
|
+
resumeAt: null,
|
|
280
|
+
retryAfter: null,
|
|
281
|
+
errorCode: null,
|
|
282
|
+
workflowCoreVersion: null,
|
|
283
|
+
isWebhook: false,
|
|
284
|
+
isSystem: false,
|
|
285
|
+
workflowEncryptionEnabled: false,
|
|
286
|
+
};
|
|
287
|
+
const world = {
|
|
288
|
+
analytics: {
|
|
289
|
+
events: {
|
|
290
|
+
list: vi.fn().mockResolvedValue({
|
|
291
|
+
data: [event],
|
|
292
|
+
cursor: 'next-event-cursor',
|
|
293
|
+
hasMore: true,
|
|
294
|
+
}),
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
const write = vi
|
|
299
|
+
.spyOn(process.stdout, 'write')
|
|
300
|
+
.mockImplementation(() => true);
|
|
301
|
+
await listEvents(world, {
|
|
302
|
+
json: true,
|
|
303
|
+
runId: 'run-1',
|
|
304
|
+
cursor: 'event-cursor',
|
|
305
|
+
limit: 1,
|
|
306
|
+
});
|
|
307
|
+
expect(world.analytics?.events.list).toHaveBeenCalledWith({
|
|
308
|
+
runId: 'run-1',
|
|
309
|
+
correlationId: undefined,
|
|
310
|
+
pagination: {
|
|
311
|
+
sortOrder: 'desc',
|
|
312
|
+
cursor: 'event-cursor',
|
|
313
|
+
limit: 1,
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
317
|
+
{
|
|
318
|
+
...event,
|
|
319
|
+
runCreatedAt: '2026-06-30T00:00:00.000Z',
|
|
320
|
+
createdAt: '2026-06-30T00:00:02.000Z',
|
|
321
|
+
},
|
|
322
|
+
]);
|
|
323
|
+
});
|
|
324
|
+
it('falls back to storage when the first analytics page is empty', async () => {
|
|
325
|
+
const event = {
|
|
326
|
+
runId: 'run-1',
|
|
327
|
+
eventId: 'event-1',
|
|
328
|
+
eventType: 'step_completed',
|
|
329
|
+
correlationId: 'step-1',
|
|
330
|
+
eventData: {
|
|
331
|
+
stepName: 'doWork',
|
|
332
|
+
result: undefined,
|
|
333
|
+
},
|
|
334
|
+
createdAt: new Date('2026-06-30T00:00:02.000Z'),
|
|
335
|
+
};
|
|
336
|
+
const world = {
|
|
337
|
+
analytics: {
|
|
338
|
+
events: {
|
|
339
|
+
list: vi.fn().mockResolvedValue({
|
|
340
|
+
data: [],
|
|
341
|
+
cursor: null,
|
|
342
|
+
hasMore: false,
|
|
343
|
+
}),
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
events: {
|
|
347
|
+
list: vi.fn().mockResolvedValue({
|
|
348
|
+
data: [event],
|
|
349
|
+
cursor: null,
|
|
350
|
+
hasMore: false,
|
|
351
|
+
}),
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
const write = vi
|
|
355
|
+
.spyOn(process.stdout, 'write')
|
|
356
|
+
.mockImplementation(() => true);
|
|
357
|
+
await listEvents(world, { json: true, runId: 'run-1' });
|
|
358
|
+
expect(world.analytics?.events.list).toHaveBeenCalled();
|
|
359
|
+
expect(world.events.list).toHaveBeenCalledWith({
|
|
360
|
+
runId: 'run-1',
|
|
361
|
+
pagination: {
|
|
362
|
+
sortOrder: 'desc',
|
|
363
|
+
cursor: undefined,
|
|
364
|
+
limit: 20,
|
|
365
|
+
},
|
|
366
|
+
resolveData: 'none',
|
|
367
|
+
});
|
|
368
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
369
|
+
{
|
|
370
|
+
...event,
|
|
371
|
+
createdAt: '2026-06-30T00:00:02.000Z',
|
|
372
|
+
},
|
|
373
|
+
]);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe('listSleeps', () => {
|
|
377
|
+
const wait = {
|
|
378
|
+
runId: 'run-1',
|
|
379
|
+
waitId: 'wait-1',
|
|
380
|
+
status: 'waiting',
|
|
381
|
+
resumeAt: new Date('2026-06-30T00:01:00.000Z'),
|
|
382
|
+
createdAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
383
|
+
updatedAt: new Date('2026-06-30T00:00:00.000Z'),
|
|
384
|
+
completedAt: null,
|
|
385
|
+
workflowCoreVersion: null,
|
|
386
|
+
workflowEncryptionEnabled: false,
|
|
387
|
+
};
|
|
388
|
+
const pageInfo = {
|
|
389
|
+
currentLookbackDays: 2,
|
|
390
|
+
maxLookbackDays: 30,
|
|
391
|
+
currentWindowStart: new Date('2026-06-28T00:00:00.000Z'),
|
|
392
|
+
maxWindowStart: new Date('2026-06-01T00:00:00.000Z'),
|
|
393
|
+
upgradeAvailable: true,
|
|
394
|
+
};
|
|
395
|
+
it('passes cursors and preserves the JSON array output through analytics', async () => {
|
|
396
|
+
const world = {
|
|
397
|
+
analytics: {
|
|
398
|
+
waits: {
|
|
399
|
+
list: vi.fn().mockResolvedValue({
|
|
400
|
+
data: [wait],
|
|
401
|
+
cursor: 'next-wait-cursor',
|
|
402
|
+
hasMore: true,
|
|
403
|
+
pageInfo,
|
|
404
|
+
}),
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
const write = vi
|
|
409
|
+
.spyOn(process.stdout, 'write')
|
|
410
|
+
.mockImplementation(() => true);
|
|
411
|
+
await listSleeps(world, {
|
|
412
|
+
json: true,
|
|
413
|
+
runId: 'run-1',
|
|
414
|
+
cursor: 'wait-cursor',
|
|
415
|
+
limit: 1,
|
|
416
|
+
});
|
|
417
|
+
expect(world.analytics?.waits.list).toHaveBeenCalledWith({
|
|
418
|
+
runId: 'run-1',
|
|
419
|
+
pagination: {
|
|
420
|
+
sortOrder: 'desc',
|
|
421
|
+
cursor: 'wait-cursor',
|
|
422
|
+
limit: 1,
|
|
423
|
+
},
|
|
424
|
+
});
|
|
425
|
+
expect(JSON.parse(String(write.mock.calls[0][0]))).toEqual([
|
|
426
|
+
{
|
|
427
|
+
...wait,
|
|
428
|
+
resumeAt: '2026-06-30T00:01:00.000Z',
|
|
429
|
+
createdAt: '2026-06-30T00:00:00.000Z',
|
|
430
|
+
updatedAt: '2026-06-30T00:00:00.000Z',
|
|
431
|
+
},
|
|
432
|
+
]);
|
|
433
|
+
});
|
|
434
|
+
it('surfaces the observability upgrade hint in table mode', async () => {
|
|
435
|
+
const world = {
|
|
436
|
+
analytics: {
|
|
437
|
+
waits: {
|
|
438
|
+
list: vi.fn().mockResolvedValue({
|
|
439
|
+
data: [wait],
|
|
440
|
+
cursor: null,
|
|
441
|
+
hasMore: false,
|
|
442
|
+
pageInfo,
|
|
443
|
+
}),
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
const log = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
448
|
+
await listSleeps(world, { runId: 'run-1' });
|
|
449
|
+
expect(log.mock.calls.flat().join('\n')).toContain('Upgrade Observability Plus');
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luc3BlY3Qvb3V0cHV0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDN0QsT0FBTyxFQUNMLHNDQUFzQyxFQUN0QyxtQ0FBbUMsR0FDcEMsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsVUFBVSxFQUNWLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxHQUNWLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sT0FBTyxHQUFHLENBQUMsWUFBa0MsRUFBRSxFQUFlLEVBQUUsQ0FDcEUsQ0FBQztJQUNDLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFNBQVM7SUFDakIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLDRDQUE0QztJQUMxRCxLQUFLLEVBQUUsU0FBUztJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixLQUFLLEVBQUUsU0FBUztJQUNoQixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ2pDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDakMsV0FBVyxFQUFFLFNBQVM7SUFDdEIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsV0FBVyxFQUFFLENBQUM7SUFDZCxnQkFBZ0IsRUFBRSxFQUFFO0lBQ3BCLEdBQUcsU0FBUztDQUNiLENBQTJCLENBQUM7QUFFL0IsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7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O0lBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JFLE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUyxFQUFFO2dCQUNULEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO3dCQUM5QixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ1osTUFBTSxFQUFFLElBQUk7d0JBQ1osT0FBTyxFQUFFLEtBQUs7d0JBQ2QsUUFBUTtxQkFDVCxDQUFDO2lCQUNIO2FBQ0Y7U0FDa0IsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6RSxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUU1QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNoRCw0QkFBNEIsQ0FDN0IsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEFuYWx5dGljc0V2ZW50LFxuICBBbmFseXRpY3NSdW4sXG4gIEFuYWx5dGljc1N0ZXAsXG4gIEFuYWx5dGljc1dhaXQsXG4gIEV2ZW50LFxuICBTdGVwLFxuICBXb3JrZmxvd1J1bixcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQge1xuICBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSxcbiAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7XG4gIGZvcm1hdFRhYmxlVmFsdWUsXG4gIGhhc0V4cGlyZWREYXRhLFxuICBsaXN0RXZlbnRzLFxuICBsaXN0UnVucyxcbiAgbGlzdFNsZWVwcyxcbiAgbGlzdFN0ZXBzLFxufSBmcm9tICcuL291dHB1dC5qcyc7XG5cbmNvbnN0IG1ha2VSdW4gPSAob3ZlcnJpZGVzOiBQYXJ0aWFsPFdvcmtmbG93UnVuPiA9IHt9KTogV29ya2Zsb3dSdW4gPT5cbiAgKHtcbiAgICBydW5JZDogJ3J1bi0xJyxcbiAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgd29ya2Zsb3dOYW1lOiAnd29ya2Zsb3cvLy4vc3JjL3dvcmtmbG93cy90ZXN0Ly9teVdvcmtmbG93JyxcbiAgICBpbnB1dDogdW5kZWZpbmVkLFxuICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNS0wMS0wMScpLFxuICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoJzIwMjUtMDEtMDEnKSxcbiAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIHNwZWNWZXJzaW9uOiAyLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHt9LFxuICAgIC4uLm92ZXJyaWRlcyxcbiAgfSkgYXMgdW5rbm93biBhcyBXb3JrZmxvd1J1bjtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgdmkucmVzdG9yZUFsbE1vY2tzKCk7XG59KTtcblxuZGVzY3JpYmUoJ2hhc0V4cGlyZWREYXRhJywgKCkgPT4ge1xuICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIGV4cGlyZWRBdCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGhhc0V4cGlyZWREYXRhKG1ha2VSdW4oeyBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9KSkpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIGV4cGlyZWRBdCBpcyBpbiB0aGUgZnV0dXJlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZ1dHVyZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBleHBlY3QoaGFzRXhwaXJlZERhdGEobWFrZVJ1bih7IGV4cGlyZWRBdDogZnV0dXJlIH0pKSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIHRydWUgd2hlbiBleHBpcmVkQXQgaXMgaW4gdGhlIHBhc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzdCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBleHBlY3QoaGFzRXhwaXJlZERhdGEobWFrZVJ1bih7IGV4cGlyZWRBdDogcGFzdCB9KSkpLnRvQmUodHJ1ZSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRUYWJsZVZhbHVlIGV4cGlyZWQgZGF0YSBoYW5kbGluZycsICgpID0+IHtcbiAgaXQoJ3JldHVybnMgaW5wdXQgdmFsdWUgd2hlbiBleHBpcmVkQXQgaXMgaW4gdGhlIGZ1dHVyZScsICgpID0+IHtcbiAgICBjb25zdCBmdXR1cmUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgaXRlbSA9IHsgZXhwaXJlZEF0OiBmdXR1cmUudG9JU09TdHJpbmcoKSwgaW5wdXQ6ICdoZWxsbycgfTtcbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUYWJsZVZhbHVlKCdpbnB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oJ2V4cGlyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgZXhwaXJlZCBtZXNzYWdlIHdoZW4gZXhwaXJlZEF0IGlzIGluIHRoZSBwYXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3QgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgaXRlbSA9IHsgZXhwaXJlZEF0OiBwYXN0LnRvSVNPU3RyaW5nKCksIG91dHB1dDogJ2hlbGxvJyB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdFRhYmxlVmFsdWUoJ291dHB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChTdHJpbmcocmVzdWx0KSkudG9Db250YWluKCdkYXRhIGV4cGlyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgaW5wdXQgdmFsdWUgd2hlbiBleHBpcmVkQXQgaXMgbm90IHByZXNlbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgaXRlbSA9IHsgaW5wdXQ6ICdoZWxsbycgfTtcbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRUYWJsZVZhbHVlKCdpbnB1dCcsICdoZWxsbycsIHt9LCB1bmRlZmluZWQsIGl0ZW0pO1xuICAgIGV4cGVjdChTdHJpbmcocmVzdWx0KSkubm90LnRvQ29udGFpbignZXhwaXJlZCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3InLCAoKSA9PiB7XG4gIGl0KCdkZXRlY3RzIHdvcmtmbG93IGFuYWx5dGljcyA0MDIgZXJyb3JzIGJ5IHRvcC1sZXZlbCBjb2RlJywgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yKHtcbiAgICAgICAgc3RhdHVzOiA0MDIsXG4gICAgICAgIGNvZGU6ICdvYnNlcnZhYmlsaXR5LXVwZ3JhZGUtcmVxdWlyZWQnLFxuICAgICAgfSlcbiAgICApLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdkZXRlY3RzIHdvcmtmbG93IGFuYWx5dGljcyA0MDIgZXJyb3JzIGJ5IHJlc3BvbnNlIGJvZHkgZXJyb3InLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IDQwMixcbiAgICAgICAgYm9keTogeyBlcnJvcjogJ29ic2VydmFiaWxpdHktdXBncmFkZS1yZXF1aXJlZCcgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgdHJlYXQgNDA0cyBhcyB1cGdyYWRlIHByb21wdHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgY29kZTogJ29ic2VydmFiaWxpdHktdXBncmFkZS1yZXF1aXJlZCcsXG4gICAgICB9KVxuICAgICkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIGFuIHVwZ3JhZGUgcHJvbXB0IG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpLnRvQ29udGFpbihcbiAgICAgICdVcGdyYWRlIE9ic2VydmFiaWxpdHkgUGx1cydcbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGlzdFJ1bnMnLCAoKSA9PiB7XG4gIGl0KCdwcmVzZXJ2ZXMgYW5hbHl0aWNzIHBhZ2UgbWV0YWRhdGEgaW4gSlNPTiBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcnVuID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGRlcGxveW1lbnRJZDogJ2RlcC0xJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicpLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBlcnJvckNvZGU6IG51bGwsXG4gICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uOiBudWxsLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzUnVuO1xuICAgIGNvbnN0IHBhZ2VJbmZvID0ge1xuICAgICAgY3VycmVudExvb2tiYWNrRGF5czogMixcbiAgICAgIG1heExvb2tiYWNrRGF5czogMzAsXG4gICAgICBjdXJyZW50V2luZG93U3RhcnQ6IG5ldyBEYXRlKCcyMDI2LTA2LTI4VDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIG1heFdpbmRvd1N0YXJ0OiBuZXcgRGF0ZSgnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyksXG4gICAgICB1cGdyYWRlQXZhaWxhYmxlOiB0cnVlLFxuICAgIH07XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgcnVuczoge1xuICAgICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgICAgZGF0YTogW3J1bl0sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCB7IGpzb246IHRydWUgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy5ydW5zLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHdvcmtmbG93TmFtZTogdW5kZWZpbmVkLFxuICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgbGltaXQ6IDIwLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3Qod3JpdGUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKHtcbiAgICAgIGRhdGE6IFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLnJ1bixcbiAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgICAgc3RhcnRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMS4wMDBaJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBjdXJzb3I6IG51bGwsXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIHBhZ2VJbmZvOiB7XG4gICAgICAgIGN1cnJlbnRMb29rYmFja0RheXM6IDIsXG4gICAgICAgIG1heExvb2tiYWNrRGF5czogMzAsXG4gICAgICAgIGN1cnJlbnRXaW5kb3dTdGFydDogJzIwMjYtMDYtMjhUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIG1heFdpbmRvd1N0YXJ0OiAnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgICAgdXBncmFkZUF2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaXN0U3RlcHMnLCAoKSA9PiB7XG4gIGl0KCdwYXNzZXMgY3Vyc29ycyBhbmQgcHJlc2VydmVzIHRoZSBKU09OIGFycmF5IG91dHB1dCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdGVwID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBzdGVwSWQ6ICdzdGVwLTEnLFxuICAgICAgc3RlcE5hbWU6ICdkb1dvcmsnLFxuICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonKSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicpLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMS4wMDBaJyksXG4gICAgICBjb21wbGV0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicpLFxuICAgICAgcmV0cnlBZnRlcjogbnVsbCxcbiAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgIHdvcmtmbG93Q29yZVZlcnNpb246IG51bGwsXG4gICAgICB3b3JrZmxvd0VuY3J5cHRpb25FbmFibGVkOiBmYWxzZSxcbiAgICB9IHNhdGlzZmllcyBBbmFseXRpY3NTdGVwO1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgYW5hbHl0aWNzOiB7XG4gICAgICAgIHN0ZXBzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbc3RlcF0sXG4gICAgICAgICAgICBjdXJzb3I6ICduZXh0LXN0ZXAtY3Vyc29yJyxcbiAgICAgICAgICAgIGhhc01vcmU6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBXb3JsZDtcbiAgICBjb25zdCB3cml0ZSA9IHZpXG4gICAgICAuc3B5T24ocHJvY2Vzcy5zdGRvdXQsICd3cml0ZScpXG4gICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHRydWUpO1xuXG4gICAgYXdhaXQgbGlzdFN0ZXBzKHdvcmxkLCB7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBjdXJzb3I6ICdzdGVwLWN1cnNvcicsXG4gICAgICBsaW1pdDogMSxcbiAgICB9KTtcblxuICAgIGV4cGVjdCh3b3JsZC5hbmFseXRpY3M/LnN0ZXBzLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgY3Vyc29yOiAnc3RlcC1jdXJzb3InLFxuICAgICAgICBsaW1pdDogMSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KEpTT04ucGFyc2UoU3RyaW5nKHdyaXRlLm1vY2suY2FsbHNbMF1bMF0pKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIC4uLnN0ZXAsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICAgIHN0YXJ0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDEuMDAwWicsXG4gICAgICAgIGNvbXBsZXRlZEF0OiAnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHN0b3JhZ2Ugd2hlbiB0aGUgZmlyc3QgYW5hbHl0aWNzIHBhZ2UgaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RlcCA9IHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgc3RlcElkOiAnc3RlcC0xJyxcbiAgICAgIHN0ZXBOYW1lOiAnc3RlcC8vLi9zcmMvd29ya2Zsb3dzL3Rlc3QvL2RvV29yaycsXG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgYXR0ZW1wdDogMSxcbiAgICAgIGlucHV0OiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonKSxcbiAgICAgIGNvbXBsZXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgfSBzYXRpc2ZpZXMgU3RlcDtcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgIGFuYWx5dGljczoge1xuICAgICAgICBzdGVwczoge1xuICAgICAgICAgIGxpc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGVwczoge1xuICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICBkYXRhOiBbc3RlcF0sXG4gICAgICAgICAgY3Vyc29yOiBudWxsLFxuICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIFdvcmxkO1xuICAgIGNvbnN0IHdyaXRlID0gdmlcbiAgICAgIC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJylcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdHJ1ZSk7XG5cbiAgICBhd2FpdCBsaXN0U3RlcHMod29ybGQsIHsganNvbjogdHJ1ZSwgcnVuSWQ6ICdydW4tMScgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy5zdGVwcy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KHdvcmxkLnN0ZXBzLmxpc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgY3Vyc29yOiB1bmRlZmluZWQsXG4gICAgICAgIGxpbWl0OiAyMCxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgIH0pO1xuICAgIGV4cGVjdChKU09OLnBhcnNlKFN0cmluZyh3cml0ZS5tb2NrLmNhbGxzWzBdWzBdKSkpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICAuLi5zdGVwLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonLFxuICAgICAgICBzdGFydGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAxLjAwMFonLFxuICAgICAgICBjb21wbGV0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGlzdEV2ZW50cycsICgpID0+IHtcbiAgaXQoJ3Bhc3NlcyBjdXJzb3JzIGFuZCBwcmVzZXJ2ZXMgdGhlIEpTT04gYXJyYXkgb3V0cHV0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBldmVudElkOiAnZXZlbnQtMScsXG4gICAgICBldmVudFR5cGU6ICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICBjb3JyZWxhdGlvbklkOiAnc3RlcC0xJyxcbiAgICAgIGVudGl0eUlkOiAnc3RlcC0xJyxcbiAgICAgIHN0ZXBOYW1lOiAnZG9Xb3JrJyxcbiAgICAgIHdvcmtmbG93TmFtZTogJ3dvcmtmbG93Ly8uL3NyYy93b3JrZmxvd3MvdGVzdC8vbXlXb3JrZmxvdycsXG4gICAgICBkZXBsb3ltZW50SWQ6ICdkZXAtMScsXG4gICAgICBzcGVjVmVyc2lvbjogMixcbiAgICAgIHJ1bkNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDYtMzBUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMi4wMDBaJyksXG4gICAgICByZWdpb246IG51bGwsXG4gICAgICB2ZXJjZWxJZDogbnVsbCxcbiAgICAgIHJlcXVlc3RJZDogbnVsbCxcbiAgICAgIHJlc3VtZUF0OiBudWxsLFxuICAgICAgcmV0cnlBZnRlcjogbnVsbCxcbiAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgIHdvcmtmbG93Q29yZVZlcnNpb246IG51bGwsXG4gICAgICBpc1dlYmhvb2s6IGZhbHNlLFxuICAgICAgaXNTeXN0ZW06IGZhbHNlLFxuICAgICAgd29ya2Zsb3dFbmNyeXB0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzRXZlbnQ7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbZXZlbnRdLFxuICAgICAgICAgICAgY3Vyc29yOiAnbmV4dC1ldmVudC1jdXJzb3InLFxuICAgICAgICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIFdvcmxkO1xuICAgIGNvbnN0IHdyaXRlID0gdmlcbiAgICAgIC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJylcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdHJ1ZSk7XG5cbiAgICBhd2FpdCBsaXN0RXZlbnRzKHdvcmxkLCB7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBjdXJzb3I6ICdldmVudC1jdXJzb3InLFxuICAgICAgbGltaXQ6IDEsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod29ybGQuYW5hbHl0aWNzPy5ldmVudHMubGlzdCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBjb3JyZWxhdGlvbklkOiB1bmRlZmluZWQsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6ICdldmVudC1jdXJzb3InLFxuICAgICAgICBsaW1pdDogMSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KEpTT04ucGFyc2UoU3RyaW5nKHdyaXRlLm1vY2suY2FsbHNbMF1bMF0pKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBydW5DcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gc3RvcmFnZSB3aGVuIHRoZSBmaXJzdCBhbmFseXRpY3MgcGFnZSBpcyBlbXB0eScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHJ1bklkOiAncnVuLTEnLFxuICAgICAgZXZlbnRJZDogJ2V2ZW50LTEnLFxuICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgY29ycmVsYXRpb25JZDogJ3N0ZXAtMScsXG4gICAgICBldmVudERhdGE6IHtcbiAgICAgICAgc3RlcE5hbWU6ICdkb1dvcmsnLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCcyMDI2LTA2LTMwVDAwOjAwOjAyLjAwMFonKSxcbiAgICB9IGFzIHVua25vd24gYXMgRXZlbnQ7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGV2ZW50czoge1xuICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICBkYXRhOiBbZXZlbnRdLFxuICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBXb3JsZDtcbiAgICBjb25zdCB3cml0ZSA9IHZpXG4gICAgICAuc3B5T24ocHJvY2Vzcy5zdGRvdXQsICd3cml0ZScpXG4gICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHRydWUpO1xuXG4gICAgYXdhaXQgbGlzdEV2ZW50cyh3b3JsZCwgeyBqc29uOiB0cnVlLCBydW5JZDogJ3J1bi0xJyB9KTtcblxuICAgIGV4cGVjdCh3b3JsZC5hbmFseXRpY3M/LmV2ZW50cy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5saXN0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgc29ydE9yZGVyOiAnZGVzYycsXG4gICAgICAgIGN1cnNvcjogdW5kZWZpbmVkLFxuICAgICAgICBsaW1pdDogMjAsXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICB9KTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDYtMzBUMDA6MDA6MDIuMDAwWicsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGlzdFNsZWVwcycsICgpID0+IHtcbiAgY29uc3Qgd2FpdCA9IHtcbiAgICBydW5JZDogJ3J1bi0xJyxcbiAgICB3YWl0SWQ6ICd3YWl0LTEnLFxuICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMTowMC4wMDBaJyksXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNi0zMFQwMDowMDowMC4wMDBaJyksXG4gICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbjogbnVsbCxcbiAgICB3b3JrZmxvd0VuY3J5cHRpb25FbmFibGVkOiBmYWxzZSxcbiAgfSBzYXRpc2ZpZXMgQW5hbHl0aWNzV2FpdDtcbiAgY29uc3QgcGFnZUluZm8gPSB7XG4gICAgY3VycmVudExvb2tiYWNrRGF5czogMixcbiAgICBtYXhMb29rYmFja0RheXM6IDMwLFxuICAgIGN1cnJlbnRXaW5kb3dTdGFydDogbmV3IERhdGUoJzIwMjYtMDYtMjhUMDA6MDA6MDAuMDAwWicpLFxuICAgIG1heFdpbmRvd1N0YXJ0OiBuZXcgRGF0ZSgnMjAyNi0wNi0wMVQwMDowMDowMC4wMDBaJyksXG4gICAgdXBncmFkZUF2YWlsYWJsZTogdHJ1ZSxcbiAgfTtcblxuICBpdCgncGFzc2VzIGN1cnNvcnMgYW5kIHByZXNlcnZlcyB0aGUgSlNPTiBhcnJheSBvdXRwdXQgdGhyb3VnaCBhbmFseXRpY3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ybGQgPSB7XG4gICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgd2FpdHM6IHtcbiAgICAgICAgICBsaXN0OiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGRhdGE6IFt3YWl0XSxcbiAgICAgICAgICAgIGN1cnNvcjogJ25leHQtd2FpdC1jdXJzb3InLFxuICAgICAgICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3Qgd3JpdGUgPSB2aVxuICAgICAgLnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB0cnVlKTtcblxuICAgIGF3YWl0IGxpc3RTbGVlcHMod29ybGQsIHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBydW5JZDogJ3J1bi0xJyxcbiAgICAgIGN1cnNvcjogJ3dhaXQtY3Vyc29yJyxcbiAgICAgIGxpbWl0OiAxLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHdvcmxkLmFuYWx5dGljcz8ud2FpdHMubGlzdCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWQ6ICdydW4tMScsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBjdXJzb3I6ICd3YWl0LWN1cnNvcicsXG4gICAgICAgIGxpbWl0OiAxLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3QoSlNPTi5wYXJzZShTdHJpbmcod3JpdGUubW9jay5jYWxsc1swXVswXSkpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgLi4ud2FpdCxcbiAgICAgICAgcmVzdW1lQXQ6ICcyMDI2LTA2LTMwVDAwOjAxOjAwLjAwMFonLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA2LTMwVDAwOjAwOjAwLjAwMFonLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3N1cmZhY2VzIHRoZSBvYnNlcnZhYmlsaXR5IHVwZ3JhZGUgaGludCBpbiB0YWJsZSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmxkID0ge1xuICAgICAgYW5hbHl0aWNzOiB7XG4gICAgICAgIHdhaXRzOiB7XG4gICAgICAgICAgbGlzdDogdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgICBkYXRhOiBbd2FpdF0sXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhZ2VJbmZvLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgV29ybGQ7XG4gICAgY29uc3QgbG9nID0gdmkuc3B5T24oY29uc29sZSwgJ2xvZycpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB1bmRlZmluZWQpO1xuXG4gICAgYXdhaXQgbGlzdFNsZWVwcyh3b3JsZCwgeyBydW5JZDogJ3J1bi0xJyB9KTtcblxuICAgIGV4cGVjdChsb2cubW9jay5jYWxscy5mbGF0KCkuam9pbignXFxuJykpLnRvQ29udGFpbihcbiAgICAgICdVcGdyYWRlIE9ic2VydmFiaWxpdHkgUGx1cydcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -26,7 +26,16 @@ export interface PageData<T> {
|
|
|
26
26
|
data: T[];
|
|
27
27
|
cursor: string | null | undefined;
|
|
28
28
|
hasMore: boolean;
|
|
29
|
+
pageInfo?: AnalyticsPageInfo;
|
|
29
30
|
}
|
|
31
|
+
export interface AnalyticsPageInfo {
|
|
32
|
+
currentLookbackDays: number;
|
|
33
|
+
maxLookbackDays: number;
|
|
34
|
+
currentWindowStart: Date | string;
|
|
35
|
+
maxWindowStart: Date | string;
|
|
36
|
+
upgradeAvailable: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare const getPageInfoUpgradeHint: (pageInfo: AnalyticsPageInfo | undefined) => string | undefined;
|
|
30
39
|
/**
|
|
31
40
|
* Generic pagination handler for list operations
|
|
32
41
|
*/
|
|
@@ -42,7 +51,7 @@ export interface ListPaginationOptions<TData> {
|
|
|
42
51
|
/**
|
|
43
52
|
* Display function that renders the current page
|
|
44
53
|
*/
|
|
45
|
-
displayPage: (data: TData[], pageIndex: number) => void | Promise<void>;
|
|
54
|
+
displayPage: (data: TData[], pageIndex: number, page: PageData<TData>) => void | Promise<void>;
|
|
46
55
|
/**
|
|
47
56
|
* Optional callback for when fetching starts
|
|
48
57
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/pagination.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,eAAe,EACtB,WAAW,mBAAmB,KAC7B,CAAC,MAAM,IAAI,CAwDb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,eAAe,SAsBzD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/lib/inspect/pagination.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,eAAe,EACtB,WAAW,mBAAmB,KAC7B,CAAC,MAAM,IAAI,CAwDb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,eAAe,SAsBzD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,IAAI,GAAG,MAAM,CAAC;IAClC,cAAc,EAAE,IAAI,GAAG,MAAM,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,sBAAsB,GACjC,UAAU,iBAAiB,GAAG,SAAS,KACtC,MAAM,GAAG,SASX,CAAC;AAWF;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,KAAK;IAC1C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpE;;OAEG;IACH,WAAW,EAAE,CACX,IAAI,EAAE,KAAK,EAAE,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,KAClB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE3C;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAC7C,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAiJf"}
|