@substrat-run/contract-tests 0.176.0 → 0.178.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/counter-runner.d.ts +23 -4
- package/dist/counter-runner.d.ts.map +1 -1
- package/dist/counter-runner.js +122 -20
- package/dist/counter-runner.js.map +1 -1
- package/dist/directory-audit-suite.d.ts.map +1 -1
- package/dist/directory-audit-suite.js +15 -0
- package/dist/directory-audit-suite.js.map +1 -1
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +69 -0
- package/dist/scope-host-suite.js.map +1 -1
- package/dist/scope-store-runner-suite.d.ts +24 -1
- package/dist/scope-store-runner-suite.d.ts.map +1 -1
- package/dist/scope-store-runner-suite.js +347 -10
- package/dist/scope-store-runner-suite.js.map +1 -1
- package/dist/scope-store-suite.d.ts.map +1 -1
- package/dist/scope-store-suite.js +44 -3
- package/dist/scope-store-suite.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type StoreRequest } from '@substrat-run/contracts';
|
|
1
|
+
import { type ScopeDumpTable, type StoreRequest } from '@substrat-run/contracts';
|
|
2
2
|
import { type ScopeStoreRunner } from '@substrat-run/kernel';
|
|
3
3
|
/**
|
|
4
4
|
* What a driver hands the runner suite. The suite knows nothing about the driver beyond
|
|
@@ -9,12 +9,34 @@ export interface ScopeStoreRunnerFixture {
|
|
|
9
9
|
makeRunner(): ScopeStoreRunner | Promise<ScopeStoreRunner>;
|
|
10
10
|
/** A driver operation that changes the object. Each call must change what `read` answers. */
|
|
11
11
|
readonly write: StoreRequest;
|
|
12
|
+
/**
|
|
13
|
+
* A driver operation that writes the n-th distinct row, so a dump of the object grows by one row
|
|
14
|
+
* for each n. `write` may only ever touch one row; this is what lets the suite fill a store with
|
|
15
|
+
* many.
|
|
16
|
+
*/
|
|
17
|
+
writeRow(n: number): StoreRequest;
|
|
12
18
|
/** A driver operation that reads the object back. Equal answers mean equal objects. */
|
|
13
19
|
readonly read: StoreRequest;
|
|
20
|
+
/**
|
|
21
|
+
* Optional: tables the driver stages and then refuses at commit (a row it cannot take, or a table
|
|
22
|
+
* it has no name for). With it the suite proves a refused stage leaves the object as it was.
|
|
23
|
+
* Without it that check is skipped, and its name says so.
|
|
24
|
+
*/
|
|
25
|
+
readonly refusedStage?: readonly ScopeDumpTable[];
|
|
26
|
+
/**
|
|
27
|
+
* Optional: a driver operation that writes a row held against `subjectId`, so that
|
|
28
|
+
* `substrat.erase` of it erases something. With it the suite proves an erase that erased moves
|
|
29
|
+
* the revision. Without it that check is skipped, and its name says so.
|
|
30
|
+
*/
|
|
31
|
+
writeSubject?(subjectId: string): StoreRequest;
|
|
32
|
+
/** Every catalog operation the driver serves: what its `substrat.selfcheck` must answer (#2814). */
|
|
33
|
+
readonly catalog: readonly string[];
|
|
14
34
|
}
|
|
15
35
|
/** One check of the runner contract. It throws when the runner breaks it. */
|
|
16
36
|
export interface ScopeStoreRunnerCheck {
|
|
17
37
|
readonly name: string;
|
|
38
|
+
/** Set on a check that needs a fixture hook the driver did not give: it is listed, and skipped. */
|
|
39
|
+
readonly skip?: true;
|
|
18
40
|
run(): Promise<void>;
|
|
19
41
|
}
|
|
20
42
|
/**
|
|
@@ -38,6 +60,7 @@ export declare function scopeStoreRunnerChecks(fixture: ScopeStoreRunnerFixture)
|
|
|
38
60
|
* scopeStoreRunnerContractSuite('graph', {
|
|
39
61
|
* makeRunner: () => graphRunner({ dir }),
|
|
40
62
|
* write: { operation: 'apply', input: { … } },
|
|
63
|
+
* writeRow: (n) => ({ operation: 'apply', input: { …, n } }),
|
|
41
64
|
* read: { operation: 'inspect' },
|
|
42
65
|
* });
|
|
43
66
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-store-runner-suite.d.ts","sourceRoot":"","sources":["../src/scope-store-runner-suite.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"scope-store-runner-suite.d.ts","sourceRoot":"","sources":["../src/scope-store-runner-suite.ts"],"names":[],"mappings":"AACA,OAAO,EAA0E,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzJ,OAAO,EAOL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,UAAU,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAClC,uFAAuF;IACvF,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAClD;;;;OAIG;IACH,YAAY,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/C,oGAAoG;IACpG,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAkED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,qBAAqB,EAAE,CA2bhG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAOpG"}
|
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { storeResponse } from '@substrat-run/contracts';
|
|
3
|
-
import { callReservedStoreOperation, callScopeStore, ulid, } from '@substrat-run/kernel';
|
|
2
|
+
import { mergeDumpPages, StoreError, storeResponse } from '@substrat-run/contracts';
|
|
3
|
+
import { callReservedStoreOperation, callScopeStore, readStoreDump, ulid, writeStoreDump, } from '@substrat-run/kernel';
|
|
4
|
+
/** A page size no test dump needs more than one page of. */
|
|
5
|
+
const LARGE_PAGE = 1024 * 1024;
|
|
6
|
+
const sizeOf = (value) => new TextEncoder().encode(JSON.stringify(value)).length;
|
|
7
|
+
const rowCount = (tables) => tables.reduce((sum, table) => sum + table.rows.length, 0);
|
|
8
|
+
async function chainOf(runner, address, maxBytes) {
|
|
9
|
+
const pages = [];
|
|
10
|
+
const revisions = new Set();
|
|
11
|
+
let cursor = null;
|
|
12
|
+
do {
|
|
13
|
+
const page = await callReservedStoreOperation((r) => runner.invoke(address, r), 'substrat.export-page', { cursor, maxBytes });
|
|
14
|
+
pages.push(page.tables);
|
|
15
|
+
revisions.add(page.revision);
|
|
16
|
+
expect(page.next === null || page.next !== cursor, 'a chain moves on').toBe(true);
|
|
17
|
+
expect(pages.length, 'a chain ends').toBeLessThan(10_000);
|
|
18
|
+
cursor = page.next;
|
|
19
|
+
} while (cursor !== null);
|
|
20
|
+
return { pages, tables: mergeDumpPages(pages), revisions };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The revision a chain carries, read to its end: a driver that refuses writes while a chain is open
|
|
24
|
+
* is not left with one.
|
|
25
|
+
*/
|
|
26
|
+
async function revisionOf(runner, address) {
|
|
27
|
+
return (await chainOf(runner, address, LARGE_PAGE)).revisions.values().next().value;
|
|
28
|
+
}
|
|
29
|
+
/** A stage the object does not hold, or will not take again, is refused with 409 `stage_refused`. */
|
|
30
|
+
const refused = (answer) => expect(answer).rejects.toMatchObject({ storeCode: 'stage_refused', storeStatus: 409 });
|
|
31
|
+
/** A dump cut into `parts` pages, each table's rows spread over them, every table named on every page. */
|
|
32
|
+
function spreadOver(tables, parts) {
|
|
33
|
+
return Array.from({ length: parts }, (_, part) => tables.map((table) => {
|
|
34
|
+
const size = Math.ceil(table.rows.length / parts);
|
|
35
|
+
return { ...table, rows: table.rows.slice(part * size, (part + 1) * size) };
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
4
38
|
/** An address no other check, and no earlier run, has used. */
|
|
5
39
|
function freshAddress() {
|
|
6
40
|
return { tenantId: ulid(), vertical: 'conformance', scopeId: ulid(), binding: 'STORE' };
|
|
@@ -34,6 +68,7 @@ export function scopeStoreRunnerChecks(fixture) {
|
|
|
34
68
|
const call = (runner, address, request) => callScopeStore((r) => runner.invoke(address, r), request.operation, request.input);
|
|
35
69
|
const read = (runner, address) => call(runner, address, fixture.read);
|
|
36
70
|
const write = (runner, address) => call(runner, address, fixture.write);
|
|
71
|
+
const writeRow = (runner, address, n) => call(runner, address, fixture.writeRow(n));
|
|
37
72
|
const reserved = (runner, address, operation, input) => callReservedStoreOperation((r) => runner.invoke(address, r), operation, input);
|
|
38
73
|
return [
|
|
39
74
|
{
|
|
@@ -110,18 +145,99 @@ export function scopeStoreRunnerChecks(fixture) {
|
|
|
110
145
|
},
|
|
111
146
|
},
|
|
112
147
|
{
|
|
113
|
-
|
|
148
|
+
// What the rollout's canary does (#2814): rows loaded first, so the runtime is built over
|
|
149
|
+
// data, and the answer compared exactly with the catalog the release is approved with.
|
|
150
|
+
name: 'substrat.selfcheck, on an object that loaded rows, answers exactly the catalog',
|
|
151
|
+
async run() {
|
|
152
|
+
await withRunner(async (runner) => {
|
|
153
|
+
const source = freshAddress();
|
|
154
|
+
const target = freshAddress();
|
|
155
|
+
await write(runner, source);
|
|
156
|
+
const dump = await readStoreDump((operation, input) => reserved(runner, source, operation, input), 1);
|
|
157
|
+
await writeStoreDump((operation, input) => reserved(runner, target, operation, input), dump, 1);
|
|
158
|
+
const { operations } = await reserved(runner, target, 'substrat.selfcheck');
|
|
159
|
+
expect([...operations].sort()).toEqual([...fixture.catalog].sort());
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: 'substrat.export-page answers a chain that ends, one revision, and the same dump at any page size',
|
|
114
165
|
async run() {
|
|
115
166
|
await withRunner(async (runner) => {
|
|
116
167
|
const address = freshAddress();
|
|
117
168
|
await write(runner, address);
|
|
118
|
-
const
|
|
119
|
-
|
|
169
|
+
const large = await chainOf(runner, address, LARGE_PAGE);
|
|
170
|
+
const small = await chainOf(runner, address, 1);
|
|
171
|
+
expect(large.tables.length).toBeGreaterThan(0);
|
|
172
|
+
expect(large.revisions.size, 'one revision along a chain with no write').toBe(1);
|
|
173
|
+
expect(small.revisions.size, 'one revision along a chain with no write').toBe(1);
|
|
174
|
+
expect(small.tables).toEqual(large.tables);
|
|
175
|
+
expect([...small.revisions], 'the revision does not depend on the page size').toEqual([...large.revisions]);
|
|
176
|
+
await write(runner, address);
|
|
177
|
+
expect((await chainOf(runner, address, LARGE_PAGE)).revisions, 'a write changes the revision').not.toEqual(large.revisions);
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'substrat.export-page cuts many rows into pages within maxBytes, and loses none between them',
|
|
183
|
+
async run() {
|
|
184
|
+
await withRunner(async (runner) => {
|
|
185
|
+
const address = freshAddress();
|
|
186
|
+
for (let n = 0; n < 12; n += 1)
|
|
187
|
+
await writeRow(runner, address, n);
|
|
188
|
+
const large = await chainOf(runner, address, LARGE_PAGE);
|
|
189
|
+
const rows = rowCount(large.tables);
|
|
190
|
+
expect(rows, 'writeRow writes distinct rows').toBeGreaterThanOrEqual(12);
|
|
191
|
+
for (const maxBytes of [1, 150, 400]) {
|
|
192
|
+
const chain = await chainOf(runner, address, maxBytes);
|
|
193
|
+
// A page holds at least one table heading and one row, and is otherwise within maxBytes.
|
|
194
|
+
for (const page of chain.pages) {
|
|
195
|
+
const lone = page.length <= 1 && rowCount(page) <= 1;
|
|
196
|
+
expect(sizeOf(page) <= maxBytes || lone, `a page of ${sizeOf(page)} bytes at maxBytes ${maxBytes}`).toBe(true);
|
|
197
|
+
}
|
|
198
|
+
expect(chain.tables, `maxBytes ${maxBytes}: the merged pages are the large read`).toEqual(large.tables);
|
|
199
|
+
}
|
|
200
|
+
// The smallest page holds one row, so the rows are spread over at least as many pages.
|
|
201
|
+
expect((await chainOf(runner, address, 1)).pages.length).toBeGreaterThanOrEqual(rows);
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: 'a chain is one moment: a wipe between two of its pages cannot tear it',
|
|
207
|
+
async run() {
|
|
208
|
+
await withRunner(async (runner) => {
|
|
209
|
+
const address = freshAddress();
|
|
210
|
+
for (let n = 0; n < 4; n += 1)
|
|
211
|
+
await writeRow(runner, address, n);
|
|
212
|
+
const whole = (await chainOf(runner, address, LARGE_PAGE)).tables;
|
|
213
|
+
const first = await reserved(runner, address, 'substrat.export-page', { cursor: null, maxBytes: 1 });
|
|
214
|
+
// A driver may refuse the write while the chain is open, refuse the cursor after it, move the
|
|
215
|
+
// revision, or answer the dump from before the wipe. It may not answer a torn one under the
|
|
216
|
+
// revision it began with.
|
|
217
|
+
if (!(await reserved(runner, address, 'substrat.wipe').then(() => true, () => false)))
|
|
218
|
+
return;
|
|
219
|
+
const pages = [first.tables];
|
|
220
|
+
let cursor = first.next;
|
|
221
|
+
for (let seen = 0; cursor !== null; seen += 1) {
|
|
222
|
+
expect(seen, 'a chain ends').toBeLessThan(10_000);
|
|
223
|
+
let page;
|
|
224
|
+
try {
|
|
225
|
+
page = await reserved(runner, address, 'substrat.export-page', { cursor, maxBytes: 1 });
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (page.revision !== first.revision)
|
|
231
|
+
return;
|
|
232
|
+
pages.push(page.tables);
|
|
233
|
+
cursor = page.next;
|
|
234
|
+
}
|
|
235
|
+
expect(mergeDumpPages(pages), 'a chain under one revision is the dump from before the wipe').toEqual(whole);
|
|
120
236
|
});
|
|
121
237
|
},
|
|
122
238
|
},
|
|
123
239
|
{
|
|
124
|
-
name: 'substrat.
|
|
240
|
+
name: 'substrat.commit-stage replaces the whole object and answers the distinct tables it wrote',
|
|
125
241
|
async run() {
|
|
126
242
|
await withRunner(async (runner) => {
|
|
127
243
|
const source = freshAddress();
|
|
@@ -131,13 +247,230 @@ export function scopeStoreRunnerChecks(fixture) {
|
|
|
131
247
|
await write(runner, target);
|
|
132
248
|
// The target holds more than the source, so a merge cannot pass for a replace.
|
|
133
249
|
expect(await read(runner, target)).not.toEqual(await read(runner, source));
|
|
134
|
-
const
|
|
135
|
-
const
|
|
136
|
-
|
|
250
|
+
const tables = await readStoreDump((operation, input) => reserved(runner, source, operation, input), LARGE_PAGE);
|
|
251
|
+
const before = await read(runner, target);
|
|
252
|
+
const stageId = ulid();
|
|
253
|
+
expect(await reserved(runner, target, 'substrat.stage-page', { stageId, seq: 0, tables })).toEqual({ staged: true });
|
|
254
|
+
expect(await read(runner, target), 'a stage changes nothing a call can see').toEqual(before);
|
|
255
|
+
const { tables: wrote } = await reserved(runner, target, 'substrat.commit-stage', { stageId });
|
|
256
|
+
expect(wrote).toBe(tables.length);
|
|
257
|
+
expect(await read(runner, target)).toEqual(await read(runner, source));
|
|
258
|
+
});
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
name: 'a stage spread over several pages commits whole, not only its first page',
|
|
263
|
+
async run() {
|
|
264
|
+
await withRunner(async (runner) => {
|
|
265
|
+
const source = freshAddress();
|
|
266
|
+
const target = freshAddress();
|
|
267
|
+
for (let n = 0; n < 6; n += 1)
|
|
268
|
+
await writeRow(runner, source, n);
|
|
269
|
+
for (let n = 50; n < 53; n += 1)
|
|
270
|
+
await writeRow(runner, target, n);
|
|
271
|
+
const tables = (await chainOf(runner, source, LARGE_PAGE)).tables;
|
|
272
|
+
const pages = spreadOver(tables, 3);
|
|
273
|
+
const stageId = ulid();
|
|
274
|
+
for (const [seq, page] of pages.entries()) {
|
|
275
|
+
expect(await reserved(runner, target, 'substrat.stage-page', { stageId, seq, tables: page })).toEqual({ staged: true });
|
|
276
|
+
}
|
|
277
|
+
expect(await reserved(runner, target, 'substrat.commit-stage', { stageId })).toEqual({ tables: tables.length });
|
|
278
|
+
expect((await chainOf(runner, target, LARGE_PAGE)).tables).toEqual(tables);
|
|
137
279
|
expect(await read(runner, target)).toEqual(await read(runner, source));
|
|
138
280
|
});
|
|
139
281
|
},
|
|
140
282
|
},
|
|
283
|
+
{
|
|
284
|
+
name: 'a page already staged answers staged: false, and a gap is refused',
|
|
285
|
+
async run() {
|
|
286
|
+
await withRunner(async (runner) => {
|
|
287
|
+
const address = freshAddress();
|
|
288
|
+
await write(runner, address);
|
|
289
|
+
const tables = await readStoreDump((operation, input) => reserved(runner, address, operation, input), LARGE_PAGE);
|
|
290
|
+
const before = await read(runner, address);
|
|
291
|
+
const stageId = ulid();
|
|
292
|
+
expect(await reserved(runner, address, 'substrat.stage-page', { stageId, seq: 0, tables })).toEqual({ staged: true });
|
|
293
|
+
// The resend carries other content: the first version is the one held.
|
|
294
|
+
const emptied = tables.map((table) => ({ ...table, rows: [] }));
|
|
295
|
+
expect(await reserved(runner, address, 'substrat.stage-page', { stageId, seq: 0, tables: emptied })).toEqual({ staged: false });
|
|
296
|
+
await expect(reserved(runner, address, 'substrat.stage-page', { stageId, seq: 5, tables })).rejects.toBeInstanceOf(StoreError);
|
|
297
|
+
await reserved(runner, address, 'substrat.commit-stage', { stageId });
|
|
298
|
+
expect(await read(runner, address), 'the resent page is not held twice, and does not replace the first').toEqual(before);
|
|
299
|
+
});
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
name: 'page 0 of a new stage drops the old one, which then cannot stage or commit; discarding another id leaves the held stage',
|
|
304
|
+
async run() {
|
|
305
|
+
await withRunner(async (runner) => {
|
|
306
|
+
const address = freshAddress();
|
|
307
|
+
await write(runner, address);
|
|
308
|
+
const tables = await readStoreDump((operation, input) => reserved(runner, address, operation, input), LARGE_PAGE);
|
|
309
|
+
const before = await read(runner, address);
|
|
310
|
+
const old = ulid();
|
|
311
|
+
const held = ulid();
|
|
312
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId: old, seq: 0, tables: [] });
|
|
313
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId: held, seq: 0, tables });
|
|
314
|
+
await refused(reserved(runner, address, 'substrat.stage-page', { stageId: old, seq: 1, tables: [] }));
|
|
315
|
+
await refused(reserved(runner, address, 'substrat.commit-stage', { stageId: old }));
|
|
316
|
+
expect(await reserved(runner, address, 'substrat.discard-stage', { stageId: ulid() })).toEqual({ discarded: false });
|
|
317
|
+
expect(await reserved(runner, address, 'substrat.stage-page', { stageId: held, seq: 1, tables: [] })).toEqual({ staged: true });
|
|
318
|
+
await reserved(runner, address, 'substrat.commit-stage', { stageId: held });
|
|
319
|
+
expect(await read(runner, address), 'the held stage is the one that committed').toEqual(before);
|
|
320
|
+
});
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: 'substrat.discard-stage drops a stage, which then cannot commit, and leaves the object',
|
|
325
|
+
async run() {
|
|
326
|
+
await withRunner(async (runner) => {
|
|
327
|
+
const address = freshAddress();
|
|
328
|
+
await write(runner, address);
|
|
329
|
+
const before = await read(runner, address);
|
|
330
|
+
const stageId = ulid();
|
|
331
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId, seq: 0, tables: [] });
|
|
332
|
+
expect(await reserved(runner, address, 'substrat.discard-stage', { stageId })).toEqual({ discarded: true });
|
|
333
|
+
expect(await reserved(runner, address, 'substrat.discard-stage', { stageId })).toEqual({ discarded: false });
|
|
334
|
+
await refused(reserved(runner, address, 'substrat.commit-stage', { stageId }));
|
|
335
|
+
expect(await read(runner, address)).toEqual(before);
|
|
336
|
+
});
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
name: 'a commit and a wipe move the revision, and a read does not',
|
|
341
|
+
async run() {
|
|
342
|
+
await withRunner(async (runner) => {
|
|
343
|
+
const address = freshAddress();
|
|
344
|
+
await write(runner, address);
|
|
345
|
+
const first = await revisionOf(runner, address);
|
|
346
|
+
await read(runner, address);
|
|
347
|
+
expect(await revisionOf(runner, address), 'the same state reads the same revision').toBe(first);
|
|
348
|
+
const tables = await readStoreDump((operation, input) => reserved(runner, address, operation, input), LARGE_PAGE);
|
|
349
|
+
// The object changes after the dump was taken, so the commit of that dump changes it back.
|
|
350
|
+
await write(runner, address);
|
|
351
|
+
const changed = await revisionOf(runner, address);
|
|
352
|
+
expect(changed, 'a write moves the revision').not.toBe(first);
|
|
353
|
+
const stageId = ulid();
|
|
354
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId, seq: 0, tables });
|
|
355
|
+
expect(await revisionOf(runner, address), 'a stage changes nothing').toBe(changed);
|
|
356
|
+
await reserved(runner, address, 'substrat.commit-stage', { stageId });
|
|
357
|
+
const committed = await revisionOf(runner, address);
|
|
358
|
+
expect(committed, 'a commit that changes the dump moves the revision').not.toBe(changed);
|
|
359
|
+
await reserved(runner, address, 'substrat.wipe');
|
|
360
|
+
expect(await revisionOf(runner, address), 'a wipe moves the revision').not.toBe(committed);
|
|
361
|
+
});
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: 'substrat.size counts what is staged',
|
|
366
|
+
async run() {
|
|
367
|
+
await withRunner(async (runner) => {
|
|
368
|
+
const source = freshAddress();
|
|
369
|
+
const target = freshAddress();
|
|
370
|
+
for (let n = 0; n < 6; n += 1)
|
|
371
|
+
await writeRow(runner, source, n);
|
|
372
|
+
await write(runner, target);
|
|
373
|
+
const tables = (await chainOf(runner, source, LARGE_PAGE)).tables;
|
|
374
|
+
const before = await reserved(runner, target, 'substrat.size');
|
|
375
|
+
await reserved(runner, target, 'substrat.stage-page', { stageId: ulid(), seq: 0, tables });
|
|
376
|
+
const staged = await reserved(runner, target, 'substrat.size');
|
|
377
|
+
expect(staged.bytes, 'a stage of more rows than the object holds makes it larger').toBeGreaterThan(before.bytes);
|
|
378
|
+
});
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
name: 'a wipe and an erase drop every stage: its commit is refused, and nothing comes back',
|
|
383
|
+
async run() {
|
|
384
|
+
await withRunner(async (runner) => {
|
|
385
|
+
const address = freshAddress();
|
|
386
|
+
const empty = await read(runner, freshAddress());
|
|
387
|
+
await write(runner, address);
|
|
388
|
+
const tables = await readStoreDump((operation, input) => reserved(runner, address, operation, input), LARGE_PAGE);
|
|
389
|
+
const stageId = ulid();
|
|
390
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId, seq: 0, tables });
|
|
391
|
+
await reserved(runner, address, 'substrat.wipe');
|
|
392
|
+
await refused(reserved(runner, address, 'substrat.commit-stage', { stageId }));
|
|
393
|
+
expect(await read(runner, address)).toEqual(empty);
|
|
394
|
+
// An erase drops a stage too, since the stage may hold the subject, even one that erased nothing.
|
|
395
|
+
await write(runner, address);
|
|
396
|
+
const before = await read(runner, address);
|
|
397
|
+
const second = ulid();
|
|
398
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId: second, seq: 0, tables });
|
|
399
|
+
await reserved(runner, address, 'substrat.erase', { subjectId: ulid() });
|
|
400
|
+
await refused(reserved(runner, address, 'substrat.commit-stage', { stageId: second }));
|
|
401
|
+
expect(await read(runner, address)).toEqual(before);
|
|
402
|
+
});
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
name: 'a commit asked again answers the same count and changes nothing; a stage never held is refused',
|
|
407
|
+
async run() {
|
|
408
|
+
await withRunner(async (runner) => {
|
|
409
|
+
const address = freshAddress();
|
|
410
|
+
await write(runner, address);
|
|
411
|
+
const tables = await readStoreDump((operation, input) => reserved(runner, address, operation, input), LARGE_PAGE);
|
|
412
|
+
const stageId = ulid();
|
|
413
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId, seq: 0, tables });
|
|
414
|
+
const first = await reserved(runner, address, 'substrat.commit-stage', { stageId });
|
|
415
|
+
await write(runner, address);
|
|
416
|
+
const after = await read(runner, address);
|
|
417
|
+
const revision = await revisionOf(runner, address);
|
|
418
|
+
expect(await reserved(runner, address, 'substrat.commit-stage', { stageId }), 'a lost answer is retried').toEqual(first);
|
|
419
|
+
expect(await read(runner, address), 'the repeat changes nothing').toEqual(after);
|
|
420
|
+
expect(await revisionOf(runner, address)).toBe(revision);
|
|
421
|
+
await refused(reserved(runner, address, 'substrat.commit-stage', { stageId: ulid() }));
|
|
422
|
+
// A wipe ends the memory of the last commit.
|
|
423
|
+
await reserved(runner, address, 'substrat.wipe');
|
|
424
|
+
await refused(reserved(runner, address, 'substrat.commit-stage', { stageId }));
|
|
425
|
+
// Only the stage last committed answers again: an older one is refused.
|
|
426
|
+
const [older, newer] = [ulid(), ulid()];
|
|
427
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId: older, seq: 0, tables });
|
|
428
|
+
await reserved(runner, address, 'substrat.commit-stage', { stageId: older });
|
|
429
|
+
await reserved(runner, address, 'substrat.stage-page', { stageId: newer, seq: 0, tables });
|
|
430
|
+
const latest = await reserved(runner, address, 'substrat.commit-stage', { stageId: newer });
|
|
431
|
+
await refused(reserved(runner, address, 'substrat.commit-stage', { stageId: older }));
|
|
432
|
+
expect(await reserved(runner, address, 'substrat.commit-stage', { stageId: newer })).toEqual(latest);
|
|
433
|
+
// A stage id that was committed is not used again.
|
|
434
|
+
await refused(reserved(runner, address, 'substrat.stage-page', { stageId: newer, seq: 0, tables }));
|
|
435
|
+
});
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
fixture.refusedStage
|
|
439
|
+
? {
|
|
440
|
+
name: 'a stage the driver refuses leaves the object as it was',
|
|
441
|
+
async run() {
|
|
442
|
+
await withRunner(async (runner) => {
|
|
443
|
+
const address = freshAddress();
|
|
444
|
+
await write(runner, address);
|
|
445
|
+
const before = await read(runner, address);
|
|
446
|
+
const dump = (await chainOf(runner, address, LARGE_PAGE)).tables;
|
|
447
|
+
const stageId = ulid();
|
|
448
|
+
// Refused when staged or when committed: either way it did not land.
|
|
449
|
+
const landed = await reserved(runner, address, 'substrat.stage-page', { stageId, seq: 0, tables: [...fixture.refusedStage] })
|
|
450
|
+
.then(() => reserved(runner, address, 'substrat.commit-stage', { stageId }))
|
|
451
|
+
.then(() => true, () => false);
|
|
452
|
+
expect(landed, 'the driver refuses this stage').toBe(false);
|
|
453
|
+
expect(await read(runner, address), 'a refused stage changes nothing').toEqual(before);
|
|
454
|
+
expect((await chainOf(runner, address, LARGE_PAGE)).tables).toEqual(dump);
|
|
455
|
+
});
|
|
456
|
+
},
|
|
457
|
+
}
|
|
458
|
+
: { name: 'skipped: a stage the driver refuses leaves the object as it was (the fixture gives no refusedStage)', skip: true, async run() { } },
|
|
459
|
+
fixture.writeSubject
|
|
460
|
+
? {
|
|
461
|
+
name: 'an erase that erased something moves the revision',
|
|
462
|
+
async run() {
|
|
463
|
+
await withRunner(async (runner) => {
|
|
464
|
+
const address = freshAddress();
|
|
465
|
+
const subjectId = ulid();
|
|
466
|
+
await call(runner, address, fixture.writeSubject(subjectId));
|
|
467
|
+
const before = await revisionOf(runner, address);
|
|
468
|
+
expect((await reserved(runner, address, 'substrat.erase', { subjectId })).erased, 'writeSubject writes a row to erase').toBeGreaterThan(0);
|
|
469
|
+
expect(await revisionOf(runner, address)).not.toBe(before);
|
|
470
|
+
});
|
|
471
|
+
},
|
|
472
|
+
}
|
|
473
|
+
: { name: 'skipped: an erase that erased something moves the revision (the fixture gives no writeSubject)', skip: true, async run() { } },
|
|
141
474
|
{
|
|
142
475
|
name: 'substrat.wipe answers {} and leaves an empty object, also where nothing was written',
|
|
143
476
|
async run() {
|
|
@@ -173,6 +506,7 @@ export function scopeStoreRunnerChecks(fixture) {
|
|
|
173
506
|
* scopeStoreRunnerContractSuite('graph', {
|
|
174
507
|
* makeRunner: () => graphRunner({ dir }),
|
|
175
508
|
* write: { operation: 'apply', input: { … } },
|
|
509
|
+
* writeRow: (n) => ({ operation: 'apply', input: { …, n } }),
|
|
176
510
|
* read: { operation: 'inspect' },
|
|
177
511
|
* });
|
|
178
512
|
* ```
|
|
@@ -180,7 +514,10 @@ export function scopeStoreRunnerChecks(fixture) {
|
|
|
180
514
|
export function scopeStoreRunnerContractSuite(driver, fixture) {
|
|
181
515
|
describe(`scope-store runner (#2213): ${driver}`, () => {
|
|
182
516
|
for (const check of scopeStoreRunnerChecks(fixture)) {
|
|
183
|
-
|
|
517
|
+
if (check.skip)
|
|
518
|
+
it.skip(check.name, () => check.run());
|
|
519
|
+
else
|
|
520
|
+
it(check.name, () => check.run());
|
|
184
521
|
}
|
|
185
522
|
});
|
|
186
523
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-store-runner-suite.js","sourceRoot":"","sources":["../src/scope-store-runner-suite.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scope-store-runner-suite.js","sourceRoot":"","sources":["../src/scope-store-runner-suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAuE,MAAM,yBAAyB,CAAC;AACzJ,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,aAAa,EACb,IAAI,EACJ,cAAc,GAGf,MAAM,sBAAsB,CAAC;AA6C9B,4DAA4D;AAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/B,MAAM,MAAM,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAClG,MAAM,QAAQ,GAAG,CAAC,MAAiC,EAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAU1H,KAAK,UAAU,OAAO,CAAC,MAAwB,EAAE,OAA0B,EAAE,QAAgB;IAC3F,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,GAAG,CAAC;QACF,MAAM,IAAI,GAAwE,MAAM,0BAA0B,CAChH,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAChC,sBAAsB,EACtB,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC,QAAQ,MAAM,KAAK,IAAI,EAAE;IAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,MAAwB,EAAE,OAA0B;IAC5E,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC;AAChG,CAAC;AAED,qGAAqG;AACrG,MAAM,OAAO,GAAG,CAAC,MAAwB,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;AAErI,0GAA0G;AAC1G,SAAS,UAAU,CAAC,MAAiC,EAAE,KAAa;IAClE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;QAClD,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9E,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,SAAS,YAAY;IACnB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC1F,CAAC;AAED,qEAAqE;AACrE,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,yEAAyE;IACzE,MAAM,UAAU,GAAG,KAAK,EAAE,IAAiD,EAAiB,EAAE;QAC5F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,MAAwB,EAAE,OAA0B,EAAE,OAAqB,EAAE,EAAE,CAC3F,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,CAAC,MAAwB,EAAE,OAA0B,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3G,MAAM,KAAK,GAAG,CAAC,MAAwB,EAAE,OAA0B,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7G,MAAM,QAAQ,GAAG,CAAC,MAAwB,EAAE,OAA0B,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACjI,MAAM,QAAQ,GAAG,CACf,MAAwB,EACxB,OAA0B,EAC1B,SAAY,EACZ,KAAe,EACf,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAEpF,OAAO;QACL;YACE,IAAI,EAAE,iCAAiC;YACvC,KAAK,CAAC,GAAG;gBACP,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;SACF;QACD;YACE,IAAI,EAAE,gFAAgF;YACtF,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/F,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;oBACpG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,yCAAyC;YAC/C,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,+EAA+E;YACrF,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;oBACjD,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,wEAAwE;oBACxE,MAAM,UAAU,GAAwB;wBACtC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;wBAChC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE;wBAC7C,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;wBAC/B,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;qBACjC,CAAC;oBACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;wBACnC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAClF,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,gDAAgD;YACtD,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC5C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBACpB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACvD,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,iCAAiC;YACvC,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;oBACnE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,0FAA0F;YAC1F,uFAAuF;YACvF,IAAI,EAAE,gFAAgF;YACtF,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC5B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;oBACtG,MAAM,cAAc,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBAChG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;oBAC5E,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,kGAAkG;YACxG,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;oBACzD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAChD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3C,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,+CAA+C,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC5G,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC9H,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,6FAA6F;YACnG,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;wBAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBACnE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;oBACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACpC,MAAM,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;oBACzE,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;wBACrC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;wBACvD,yFAAyF;wBACzF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;4BAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,IAAI,EAAE,aAAa,MAAM,CAAC,IAAI,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACjH,CAAC;wBACD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,QAAQ,uCAAuC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC1G,CAAC;oBACD,uFAAuF;oBACvF,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACxF,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,uEAAuE;YAC7E,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;wBAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAClE,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;oBACrG,8FAA8F;oBAC9F,4FAA4F;oBAC5F,0BAA0B;oBAC1B,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;wBAAE,OAAO;oBAC9F,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC7B,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;wBAC9C,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;wBAClD,IAAI,IAAI,CAAC;wBACT,IAAI,CAAC;4BACH,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;wBAC1F,CAAC;wBAAC,MAAM,CAAC;4BACP,OAAO;wBACT,CAAC;wBACD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;4BAAE,OAAO;wBAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACxB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;oBACrB,CAAC;oBACD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,6DAA6D,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC9G,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,0FAA0F;YAChG,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC5B,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC5B,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC5B,+EAA+E;oBAC/E,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC3E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;oBACjH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC1C,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;oBACvB,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrH,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,wCAAwC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC7F,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC/F,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAClC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,0EAA0E;YAChF,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;wBAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;oBACjE,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;wBAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;oBACnE,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;oBACpC,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;oBACvB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;wBAC1C,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1H,CAAC;oBACD,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;oBAChH,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC3E,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,mEAAmE;YACzE,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;oBAClH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;oBACvB,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtH,uEAAuE;oBACvE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;oBAChE,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChI,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;oBAC/H,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtE,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,mEAAmE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC3H,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,yHAAyH;YAC/H,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;oBAClH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC;oBACnB,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;oBACpB,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC7F,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC1F,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;oBACtG,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBACpF,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;oBACrH,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAChI,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5E,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,0CAA0C,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClG,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,uFAAuF;YAC7F,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;oBACvB,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBACxF,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5G,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC7G,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC/E,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,4DAA4D;YAClE,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAChD,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC5B,MAAM,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,wCAAwC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAChG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;oBAClH,2FAA2F;oBAC3F,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAClD,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9D,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;oBACvB,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBACpF,MAAM,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACnF,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtE,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACpD,MAAM,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzF,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;oBACjD,MAAM,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7F,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,qCAAqC;YAC3C,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;wBAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;oBACjE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC5B,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;oBAC/D,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;oBAC/D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,4DAA4D,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnH,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,qFAAqF;YAC3F,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;oBACjD,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;oBAClH,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;oBACvB,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBACpF,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;oBACjD,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC/E,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAEnD,kGAAkG;oBAClG,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC;oBACtB,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC5F,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;oBACzE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;oBACvF,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,gGAAgG;YACtG,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;oBAClH,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;oBACvB,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBACpF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;oBACpF,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC1C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACnD,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,0BAA0B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACzH,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACjF,MAAM,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzD,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;oBACvF,6CAA6C;oBAC7C,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;oBACjD,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC/E,wEAAwE;oBACxE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3F,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC7E,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5F,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;oBACtF,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACrG,mDAAmD;oBACnD,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBACtG,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD,OAAO,CAAC,YAAY;YAClB,CAAC,CAAC;gBACE,IAAI,EAAE,wDAAwD;gBAC9D,KAAK,CAAC,GAAG;oBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;wBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;wBAC/B,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;wBAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;wBAC3C,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;wBACjE,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;wBACvB,qEAAqE;wBACrE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,YAAa,CAAC,EAAE,CAAC;6BAC3H,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;6BAC3E,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;wBACjC,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC5D,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,iCAAiC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBACvF,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC5E,CAAC,CAAC,CAAC;gBACL,CAAC;aACF;YACH,CAAC,CAAC,EAAE,IAAI,EAAE,qGAAqG,EAAE,IAAI,EAAE,IAAa,EAAE,KAAK,CAAC,GAAG,KAAI,CAAC,EAAE;QACxJ,OAAO,CAAC,YAAY;YAClB,CAAC,CAAC;gBACE,IAAI,EAAE,mDAAmD;gBACzD,KAAK,CAAC,GAAG;oBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;wBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;wBAC/B,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC;wBACzB,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAa,CAAC,SAAS,CAAC,CAAC,CAAC;wBAC9D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;wBACjD,MAAM,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;wBAC3I,MAAM,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC7D,CAAC,CAAC,CAAC;gBACL,CAAC;aACF;YACH,CAAC,CAAC,EAAE,IAAI,EAAE,gGAAgG,EAAE,IAAI,EAAE,IAAa,EAAE,KAAK,CAAC,GAAG,KAAI,CAAC,EAAE;QACnJ;YACE,IAAI,EAAE,qFAAqF;YAC3F,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;oBACjD,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACrE,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACnD,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC9E,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,IAAI,EAAE,qEAAqE;YAC3E,KAAK,CAAC,GAAG;gBACP,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAChC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;oBAC/B,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC;oBACzB,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;oBACjE,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClG,CAAC,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAc,EAAE,OAAgC;IAC5F,QAAQ,CAAC,+BAA+B,MAAM,EAAE,EAAE,GAAG,EAAE;QACrD,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,IAAI,KAAK,CAAC,IAAI;gBAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;;gBAClD,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-store-suite.d.ts","sourceRoot":"","sources":["../src/scope-store-suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,gBAAgB,EAAwB,MAAM,sBAAsB,CAAC;AAGzG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"scope-store-suite.d.ts","sourceRoot":"","sources":["../src/scope-store-suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,gBAAgB,EAAwB,MAAM,sBAAsB,CAAC;AAGzG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA0D9D;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,CACX,WAAW,EAAE;IAAE,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,EAAE,CAAA;CAAE,KACtE,OAAO,CAAC,gBAAgB,CAAC,GAC7B,IAAI,CAkmBN"}
|
|
@@ -1,23 +1,30 @@
|
|
|
1
1
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
2
|
-
import { errorCodeOf, platformActorId, principalId, scopeId, storeEraseInput, tenantId } from '@substrat-run/contracts';
|
|
2
|
+
import { errorCodeOf, platformActorId, principalId, scopeId, storeDriverDumpPageBytes, storeEraseInput, tenantId } from '@substrat-run/contracts';
|
|
3
3
|
import { ulid } from '@substrat-run/kernel';
|
|
4
4
|
import { STORE_CALL_SINK_KEY, tallyStoreCall } from '@substrat-run/kernel/invocation-line';
|
|
5
5
|
import { counterScopeStoreRunner, invalidStoreInput, objectNameOf } from './counter-runner.js';
|
|
6
6
|
/**
|
|
7
7
|
* The trivial driver, with what this suite reads back about the host's calls:
|
|
8
8
|
* `address` (what the host handed in), `erased` (the subjects erased on this object),
|
|
9
|
-
* `wiped` (every object wiped),
|
|
10
|
-
* answer 503, until `false`)
|
|
9
|
+
* `wiped` (every object wiped), `fail-wipe` (`true` makes each later `substrat.wipe`
|
|
10
|
+
* answer 503, until `false`), and `page-calls` (each paged dump call on this object, in order:
|
|
11
|
+
* its operation, and the cursor, `maxBytes` or `seq` it carried).
|
|
11
12
|
*/
|
|
12
13
|
function instrumentedCounterRunner() {
|
|
13
14
|
const counter = counterScopeStoreRunner();
|
|
14
15
|
const erased = new Map();
|
|
15
16
|
const wiped = new Set();
|
|
16
17
|
let failWipe = false;
|
|
18
|
+
const pageCalls = new Map();
|
|
17
19
|
return {
|
|
18
20
|
...counter,
|
|
19
21
|
async invoke(address, request) {
|
|
20
22
|
const id = objectNameOf(address);
|
|
23
|
+
if (/^substrat\.(export-page|stage-page|commit-stage|discard-stage)$/.test(request.operation)) {
|
|
24
|
+
const input = (request.input ?? {});
|
|
25
|
+
const line = { operation: request.operation, cursor: input.cursor, maxBytes: input.maxBytes, seq: input.seq };
|
|
26
|
+
pageCalls.set(id, [...(pageCalls.get(id) ?? []), line]);
|
|
27
|
+
}
|
|
21
28
|
switch (request.operation) {
|
|
22
29
|
case 'address': {
|
|
23
30
|
const { tenantId, vertical, scopeId, binding } = address;
|
|
@@ -25,6 +32,8 @@ function instrumentedCounterRunner() {
|
|
|
25
32
|
}
|
|
26
33
|
case 'erased':
|
|
27
34
|
return { result: [...(erased.get(id) ?? [])] };
|
|
35
|
+
case 'page-calls':
|
|
36
|
+
return { result: pageCalls.get(id) ?? [] };
|
|
28
37
|
case 'wiped':
|
|
29
38
|
return { result: [...wiped] };
|
|
30
39
|
case 'fail-wipe':
|
|
@@ -204,6 +213,38 @@ export function scopeStoreContractSuite(adapterName, makeFixture) {
|
|
|
204
213
|
await host.restoreScope(staff, tenant, scopeB, dump);
|
|
205
214
|
expect(await store.invoke('read')).toBe(4);
|
|
206
215
|
});
|
|
216
|
+
it('a store too large for one page crosses in pages and back, and a restore replaces it whole (D-69)', async () => {
|
|
217
|
+
const scope = scopeId.parse(ulid());
|
|
218
|
+
await host.provisionScope(staff, { tenantId: tenant, scopeId: scope, vertical: 'docs' });
|
|
219
|
+
await host.admin.activateScope(staff, tenant, scope);
|
|
220
|
+
const store = await host.getScopeStore(principal, tenant, scope, 'GRAPH');
|
|
221
|
+
// Nine subjects of about a megabyte each: more than a dump page holds, so the store is a chain.
|
|
222
|
+
const subjects = Array.from({ length: 9 }, (_, i) => `${i}:`.padEnd(1_000_000, 'x'));
|
|
223
|
+
for (const [i, subjectId] of subjects.entries())
|
|
224
|
+
await store.invoke('increment', { by: i + 1, subjectId });
|
|
225
|
+
const total = await store.invoke('read');
|
|
226
|
+
const dump = await host.admin.exportScope(staff, tenant, scope);
|
|
227
|
+
const [held] = dump.stores;
|
|
228
|
+
expect(held.tables).toHaveLength(1);
|
|
229
|
+
expect(held.tables[0].rows.map((row) => String(row[0]).slice(0, 2))).toEqual(subjects.map((s) => s.slice(0, 2)));
|
|
230
|
+
const exports = (await store.invoke('page-calls')).filter((call) => call.operation === 'substrat.export-page');
|
|
231
|
+
expect(exports.length).toBeGreaterThan(1);
|
|
232
|
+
expect(exports[0].cursor).toBeNull();
|
|
233
|
+
expect(exports.every((call) => call.maxBytes === storeDriverDumpPageBytes('counter'))).toBe(true);
|
|
234
|
+
await store.invoke('increment', { by: 100, subjectId: 'later' });
|
|
235
|
+
await host.restoreScope(staff, tenant, scope, dump);
|
|
236
|
+
expect(await store.invoke('read')).toBe(total);
|
|
237
|
+
const calls = (await store.invoke('page-calls'));
|
|
238
|
+
const staged = calls.filter((call) => call.operation === 'substrat.stage-page');
|
|
239
|
+
expect(staged.length).toBeGreaterThan(1);
|
|
240
|
+
expect(staged.map((call) => call.seq)).toEqual(staged.map((_, i) => i));
|
|
241
|
+
expect(calls.filter((call) => call.operation === 'substrat.commit-stage')).toHaveLength(1);
|
|
242
|
+
expect(calls.at(-1).operation).toBe('substrat.commit-stage');
|
|
243
|
+
// The stage is the store's alone to drop: the restore committed it, so none is left to discard.
|
|
244
|
+
expect(calls.some((call) => call.operation === 'substrat.discard-stage')).toBe(false);
|
|
245
|
+
// The later subject was replaced, not merged: the store holds exactly what the dump held.
|
|
246
|
+
expect(await host.admin.exportScope(staff, tenant, scope)).toMatchObject({ stores: [{ tables: [{ rows: held.tables[0].rows }] }] });
|
|
247
|
+
}, 60_000);
|
|
207
248
|
it('a restore that names an unbound store writes nothing', async () => {
|
|
208
249
|
const store = await host.getScopeStore(principal, tenant, scopeB, 'GRAPH');
|
|
209
250
|
// scopeB carries the counter the tests above left behind.
|