@webda/core 4.0.0-beta.8 → 4.0.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/lib/application/application.d.ts +1 -0
  2. package/lib/application/application.d.ts.map +1 -1
  3. package/lib/application/application.js +9 -3
  4. package/lib/application/application.js.map +1 -1
  5. package/lib/application/model-types.d.ts +63 -0
  6. package/lib/application/model-types.d.ts.map +1 -0
  7. package/lib/application/model-types.js +59 -0
  8. package/lib/application/model-types.js.map +1 -0
  9. package/lib/bin/cli.d.ts +18 -0
  10. package/lib/bin/cli.d.ts.map +1 -1
  11. package/lib/bin/cli.js +38 -3
  12. package/lib/bin/cli.js.map +1 -1
  13. package/lib/core/operations.d.ts +17 -0
  14. package/lib/core/operations.d.ts.map +1 -1
  15. package/lib/core/operations.js +1 -1
  16. package/lib/core/operations.js.map +1 -1
  17. package/lib/index.d.ts +5 -2
  18. package/lib/index.d.ts.map +1 -1
  19. package/lib/index.js +4 -1
  20. package/lib/index.js.map +1 -1
  21. package/lib/models/decorator.d.ts +21 -0
  22. package/lib/models/decorator.d.ts.map +1 -1
  23. package/lib/models/decorator.js +18 -0
  24. package/lib/models/decorator.js.map +1 -1
  25. package/lib/rest/restoperationstransport.service.d.ts +6 -0
  26. package/lib/rest/restoperationstransport.service.d.ts.map +1 -1
  27. package/lib/rest/restoperationstransport.service.js +19 -1
  28. package/lib/rest/restoperationstransport.service.js.map +1 -1
  29. package/lib/services/service.d.ts.map +1 -1
  30. package/lib/services/service.js +4 -1
  31. package/lib/services/service.js.map +1 -1
  32. package/lib/services/servicecommands.d.ts.map +1 -1
  33. package/lib/services/servicecommands.js +14 -1
  34. package/lib/services/servicecommands.js.map +1 -1
  35. package/lib/stores/capability.d.ts +16 -0
  36. package/lib/stores/capability.d.ts.map +1 -0
  37. package/lib/stores/capability.js +5 -0
  38. package/lib/stores/capability.js.map +1 -0
  39. package/lib/stores/memory.service.d.ts +30 -1
  40. package/lib/stores/memory.service.d.ts.map +1 -1
  41. package/lib/stores/memory.service.js +47 -1
  42. package/lib/stores/memory.service.js.map +1 -1
  43. package/lib/stores/migration.d.ts +306 -0
  44. package/lib/stores/migration.d.ts.map +1 -0
  45. package/lib/stores/migration.js +280 -0
  46. package/lib/stores/migration.js.map +1 -0
  47. package/lib/stores/store.d.ts +151 -17
  48. package/lib/stores/store.d.ts.map +1 -1
  49. package/lib/stores/store.js +421 -21
  50. package/lib/stores/store.js.map +1 -1
  51. package/lib/test/index.d.ts +2 -0
  52. package/lib/test/index.d.ts.map +1 -1
  53. package/lib/test/index.js +3 -0
  54. package/lib/test/index.js.map +1 -1
  55. package/lib/test/legacy-types.d.ts +146 -0
  56. package/lib/test/legacy-types.d.ts.map +1 -0
  57. package/lib/test/legacy-types.fixture.model.d.ts +38 -0
  58. package/lib/test/legacy-types.fixture.model.d.ts.map +1 -0
  59. package/lib/test/legacy-types.fixture.model.js +38 -0
  60. package/lib/test/legacy-types.fixture.model.js.map +1 -0
  61. package/lib/test/legacy-types.js +481 -0
  62. package/lib/test/legacy-types.js.map +1 -0
  63. package/package.json +8 -8
  64. package/webda.module.json +48 -22
@@ -0,0 +1,481 @@
1
+ import * as assert from "node:assert";
2
+ import { useApplication } from "../application/hooks.js";
3
+ import { formatMigrationReport } from "../stores/migration.js";
4
+ import { V3Animal, V3Dog, V3Plant, V3Puppy } from "./legacy-types.fixture.model.js";
5
+ // This module may be loaded from `src` while the store under test comes from `lib` (store packages alias
6
+ // `@webda/core/lib/test`): it never touches the Registry or a class of `@webda/core` directly, only the store
7
+ // methods and the fixture models.
8
+ /**
9
+ * `models` of a store holding the fixture: two models sharing one table, V3Animal its root
10
+ */
11
+ export const LEGACY_TYPE_MODELS = ["Webda/V3Animal", "Webda/V3Plant"];
12
+ /**
13
+ * Rows as Webda 3 stored them: short, lower-case, upper-case, aliased, untyped and unknown types, and a type of an
14
+ * ancestor of the table root (`UuidModel`), which belongs to the root like an untyped row
15
+ */
16
+ export const LEGACY_TYPE_ROWS = [
17
+ { key: "a1", data: { uuid: "a1", __type: "Webda/V3Animal", name: "current animal" } },
18
+ { key: "a2", data: { uuid: "a2", __type: "V3Animal", name: "short animal" } },
19
+ { key: "a3", data: { uuid: "a3", __type: "webda/v3animal", name: "lower animal" } },
20
+ { key: "a4", data: { uuid: "a4", name: "untyped animal" } },
21
+ { key: "a5", data: { uuid: "a5", __type: "UuidModel", name: "ancestor animal" } },
22
+ { key: "d1", data: { uuid: "d1", __type: "v3dog", name: "lower short dog" } },
23
+ { key: "p1", data: { uuid: "p1", __type: "WEBDA/V3PUPPY", name: "upper puppy" } },
24
+ { key: "p2", data: { uuid: "p2", __type: "Webda/V3Puppy", name: "current puppy" } },
25
+ { key: "g1", data: { uuid: "g1", __type: "Webda/Flora", name: "alias plant" } },
26
+ { key: "g2", data: { uuid: "g2", __type: "Flora", name: "short alias plant" } },
27
+ { key: "g3", data: { uuid: "g3", __type: "Webda/V3Plant", name: "current plant" } },
28
+ { key: "u1", data: { uuid: "u1", __type: "Gone/Model", name: "unknown" } }
29
+ ];
30
+ /**
31
+ * Row whose type matches two models (both declare the alias `Webda/Creature`): ambiguous, so left untouched
32
+ *
33
+ * Not part of {@link LEGACY_TYPE_ROWS}: only the migration check seeds it.
34
+ */
35
+ export const LEGACY_TYPE_AMBIGUOUS_ROW = {
36
+ key: "x1",
37
+ data: { uuid: "x1", __type: "Webda/Creature", name: "ambiguous" }
38
+ };
39
+ /**
40
+ * Exact `types` migration totals over {@link LEGACY_TYPE_ROWS}
41
+ */
42
+ export const LEGACY_TYPE_REPORT = {
43
+ scanned: 12,
44
+ updated: 8,
45
+ byChange: {
46
+ "(untyped) → Webda/V3Animal": 1,
47
+ "Flora → Webda/V3Plant": 1,
48
+ "UuidModel → Webda/V3Animal": 1,
49
+ "V3Animal → Webda/V3Animal": 1,
50
+ "WEBDA/V3PUPPY → Webda/V3Puppy": 1,
51
+ "Webda/Flora → Webda/V3Plant": 1,
52
+ "v3dog → Webda/V3Dog": 1,
53
+ "webda/v3animal → Webda/V3Animal": 1
54
+ },
55
+ unknown: { "Gone/Model": 1 }
56
+ };
57
+ /**
58
+ * Register the fixture models in the current application (once), with the runtime Metadata the module loader sets
59
+ */
60
+ export function registerLegacyTypeFixtures() {
61
+ const app = useApplication();
62
+ if (app.getModels()["Webda/V3Animal"] === V3Animal) {
63
+ return;
64
+ }
65
+ const metadata = (identifier, ancestors, subclasses, aliases = []) => ({
66
+ Identifier: identifier,
67
+ Import: "",
68
+ Plural: `${identifier.split("/").pop()}s`,
69
+ Schemas: {},
70
+ Relations: {},
71
+ Ancestors: ancestors,
72
+ Subclasses: subclasses,
73
+ PrimaryKey: ["uuid"],
74
+ Events: [],
75
+ Reflection: {},
76
+ Actions: {},
77
+ Aliases: aliases
78
+ });
79
+ const models = [
80
+ ["Webda/V3Puppy", V3Puppy, metadata("Webda/V3Puppy", ["Webda/V3Dog", "Webda/V3Animal"], [])],
81
+ ["Webda/V3Dog", V3Dog, metadata("Webda/V3Dog", ["Webda/V3Animal"], [V3Puppy])],
82
+ ["Webda/V3Animal", V3Animal, metadata("Webda/V3Animal", [], [V3Dog], ["Webda/Creature"])],
83
+ ["Webda/V3Plant", V3Plant, metadata("Webda/V3Plant", [], [], ["Webda/Flora", "Webda/Creature"])]
84
+ ];
85
+ for (const [identifier, clazz, meta] of models) {
86
+ app.addModel(identifier, clazz, meta);
87
+ clazz.registerSerializer(true, identifier);
88
+ }
89
+ }
90
+ /**
91
+ * Sum a migration report over its tables
92
+ * @param report - the report
93
+ * @returns the totals
94
+ */
95
+ export function sumMigrationReport(report) {
96
+ const sum = { scanned: 0, updated: 0, byChange: {}, unknown: {} };
97
+ for (const table of Object.values(report.tables)) {
98
+ sum.scanned += table.scanned;
99
+ sum.updated += table.updated;
100
+ for (const [change, n] of Object.entries(table.byChange)) {
101
+ sum.byChange[change] = (sum.byChange[change] ?? 0) + n;
102
+ }
103
+ for (const [type, n] of Object.entries(table.unknown)) {
104
+ sum.unknown[type] = (sum.unknown[type] ?? 0) + n;
105
+ }
106
+ }
107
+ return sum;
108
+ }
109
+ /** Store names must be unique: their migration progress is keyed by name */
110
+ let storeCounter = 0;
111
+ /**
112
+ * @param ms - delay
113
+ * @returns a promise resolved after the delay
114
+ */
115
+ const pause = (ms) => new Promise(resolve => setTimeout(resolve, ms));
116
+ /**
117
+ * @param harness - the harness
118
+ * @param store - the store
119
+ * @returns the table of the fixture rows
120
+ */
121
+ function fixtureTable(harness, store) {
122
+ return harness.tableOf ? harness.tableOf(store, V3Animal) : store.getRawTables()[0].name;
123
+ }
124
+ /**
125
+ * Create a store of the fixture models and seed the Webda 3 rows
126
+ * @param harness - the harness
127
+ * @param label - name prefix
128
+ * @returns the store
129
+ */
130
+ async function seedLegacyStore(harness, label) {
131
+ registerLegacyTypeFixtures();
132
+ const store = await harness.createStore(`LegacyTypes${label}${++storeCounter}`, LEGACY_TYPE_MODELS);
133
+ await harness.seedRaw(store, fixtureTable(harness, store), structuredClone(LEGACY_TYPE_ROWS));
134
+ return store;
135
+ }
136
+ /**
137
+ * Stored data of every row of a table, as the backend holds it
138
+ * @param store - the store
139
+ * @param table - the table
140
+ * @returns data by key
141
+ */
142
+ async function readRawRows(store, table) {
143
+ const rows = {};
144
+ let token;
145
+ do {
146
+ const page = await store.rawPages(table, 100, token);
147
+ for (const row of page.rows)
148
+ rows[row.key] = row.data;
149
+ token = page.continuationToken;
150
+ } while (token);
151
+ return rows;
152
+ }
153
+ /**
154
+ * @param rows - rows by key, from {@link readRawRows}
155
+ * @returns the stored `__type` by key
156
+ */
157
+ function typesOf(rows) {
158
+ return Object.fromEntries(Object.entries(rows).map(([key, data]) => [key, data.__type]));
159
+ }
160
+ /**
161
+ * @param model - the model
162
+ * @param query - the query
163
+ * @returns the sorted uuids of the query results
164
+ */
165
+ async function uuids(model, query = "") {
166
+ return (await model.query(query)).results.map((item) => item.uuid).sort();
167
+ }
168
+ /**
169
+ * @param model - the model
170
+ * @returns the row count of the model, through the aggregation
171
+ */
172
+ async function countOf(model) {
173
+ const repository = model.getRepository();
174
+ repository.configureAggregation({ fallback: "allow" });
175
+ return (await repository.aggregate({ metrics: { n: { count: "*" } } })).rows[0].n;
176
+ }
177
+ /**
178
+ * Reads see exactly the rows of each model, as the right class; bulk statements and deletes too
179
+ * @param harness - the harness
180
+ */
181
+ export async function checkLegacyTypeVisibility(harness) {
182
+ await seedLegacyStore(harness, "Visibility");
183
+ assert.deepStrictEqual(await uuids(V3Animal), ["a1", "a2", "a3", "a4", "a5", "d1", "p1", "p2"]);
184
+ assert.deepStrictEqual(await uuids(V3Dog), ["d1", "p1", "p2"]);
185
+ assert.deepStrictEqual(await uuids(V3Puppy), ["p1", "p2"]);
186
+ assert.deepStrictEqual(await uuids(V3Plant), ["g1", "g2", "g3"]);
187
+ assert.deepStrictEqual(await uuids(V3Animal, "name = 'short animal'"), ["a2"]);
188
+ const animals = Object.fromEntries((await V3Animal.query("")).results.map(a => [a.uuid, a]));
189
+ assert.ok(animals.d1 instanceof V3Dog && !(animals.d1 instanceof V3Puppy), "d1 loads as V3Dog");
190
+ assert.ok(animals.p1 instanceof V3Puppy, "p1 loads as V3Puppy");
191
+ assert.strictEqual(animals.a2.constructor, V3Animal);
192
+ assert.strictEqual(animals.p1.__type, "Webda/V3Puppy");
193
+ assert.strictEqual(animals.a3.__type, "Webda/V3Animal");
194
+ // A row typed as an ancestor of the table root loads as the root
195
+ assert.strictEqual(animals.a5.constructor, V3Animal);
196
+ assert.strictEqual(animals.a5.__type, "Webda/V3Animal");
197
+ assert.strictEqual(await countOf(V3Animal), 8);
198
+ assert.strictEqual(await countOf(V3Dog), 3);
199
+ assert.strictEqual(await countOf(V3Plant), 3);
200
+ const iterated = [];
201
+ for await (const item of V3Dog.iterate(""))
202
+ iterated.push(item.uuid);
203
+ assert.deepStrictEqual(iterated.sort(), ["d1", "p1", "p2"]);
204
+ // get by key is unfiltered: the resolved class, or the repository model keeping an unknown type
205
+ assert.ok((await V3Animal.ref("d1").get()) instanceof V3Dog);
206
+ const unknown = await V3Animal.ref("u1").get();
207
+ assert.strictEqual(unknown.constructor, V3Animal);
208
+ assert.strictEqual(unknown.__type, "Gone/Model");
209
+ // Bulk statements only touch the rows of the model
210
+ assert.strictEqual(await V3Dog.getRepository().updateMany("UPDATE SET name = 'dog' WHERE name != ''"), 3);
211
+ assert.deepStrictEqual(await uuids(V3Animal, "name = 'dog'"), ["d1", "p1", "p2"]);
212
+ assert.strictEqual(await V3Animal.getRepository().updateMany("UPDATE SET name = 'ancestor' WHERE name = 'ancestor animal'"), 1);
213
+ assert.deepStrictEqual(await uuids(V3Animal, "name = 'ancestor'"), ["a5"]);
214
+ assert.strictEqual(await V3Plant.getRepository().deleteMany("DELETE WHERE name != ''"), 3);
215
+ assert.deepStrictEqual(await uuids(V3Plant), []);
216
+ assert.deepStrictEqual(await uuids(V3Animal), ["a1", "a2", "a3", "a4", "a5", "d1", "p1", "p2"]);
217
+ // A single delete removes the row of a legacy type, whatever its stored type, and only that row
218
+ await V3Animal.ref("a2").delete();
219
+ await V3Animal.ref("p1").delete();
220
+ assert.deepStrictEqual(await uuids(V3Animal), ["a1", "a3", "a4", "a5", "d1", "p2"]);
221
+ assert.deepStrictEqual(await uuids(V3Dog), ["d1", "p2"]);
222
+ }
223
+ /**
224
+ * Saving a legacy row writes its current identifier; a subclass row keeps its subclass identifier
225
+ * @param harness - the harness
226
+ */
227
+ export async function checkLegacyTypeNormalization(harness) {
228
+ const store = await seedLegacyStore(harness, "Normalization");
229
+ const table = fixtureTable(harness, store);
230
+ await V3Animal.ref("a2").patch({ name: "patched" });
231
+ await V3Animal.ref("p1").patch({ name: "patched puppy" });
232
+ await V3Plant.ref("g2").patch({ name: "patched plant" });
233
+ await V3Animal.getRepository().update({ uuid: "a3", name: "updated" });
234
+ await V3Animal.ref("a5").patch({ name: "patched ancestor" });
235
+ const types = typesOf(await readRawRows(store, table));
236
+ assert.strictEqual(types.a2, "Webda/V3Animal");
237
+ assert.strictEqual(types.p1, "Webda/V3Puppy");
238
+ assert.strictEqual(types.g2, "Webda/V3Plant");
239
+ assert.strictEqual(types.a3, "Webda/V3Animal");
240
+ assert.strictEqual(types.a5, "Webda/V3Animal");
241
+ assert.strictEqual(types.u1, "Gone/Model");
242
+ assert.strictEqual(types.a4, undefined);
243
+ const puppy = await V3Animal.ref("p1").get();
244
+ assert.ok(puppy instanceof V3Puppy);
245
+ assert.strictEqual(puppy.name, "patched puppy");
246
+ }
247
+ /**
248
+ * The `types` report is exact; a dry run writes nothing; a second run updates nothing; a Webda 4 envelope keeps its
249
+ * value; an ambiguous type is counted and left alone
250
+ * @param harness - the harness
251
+ */
252
+ export async function checkLegacyTypeMigration(harness) {
253
+ const store = await seedLegacyStore(harness, "Migration");
254
+ const table = fixtureTable(harness, store);
255
+ await harness.seedRaw(store, table, [structuredClone(LEGACY_TYPE_AMBIGUOUS_ROW)]);
256
+ const expected = {
257
+ ...LEGACY_TYPE_REPORT,
258
+ scanned: LEGACY_TYPE_REPORT.scanned + 1,
259
+ unknown: { ...LEGACY_TYPE_REPORT.unknown, [LEGACY_TYPE_AMBIGUOUS_ROW.data.__type]: 1 }
260
+ };
261
+ const before = await readRawRows(store, table);
262
+ const dry = await store.migrateTypes({ dryRun: true, batchSize: 4 });
263
+ assert.strictEqual(dry.dryRun, true);
264
+ assert.deepStrictEqual(sumMigrationReport(dry), expected);
265
+ assert.deepStrictEqual(await readRawRows(store, table), before, "a dry run writes no row");
266
+ assert.strictEqual(await store.getMigrationProgress("types"), undefined, "a dry run writes no progress");
267
+ const report = await store.migrateTypes({ batchSize: 4 });
268
+ assert.strictEqual(report.resumed, false);
269
+ assert.deepStrictEqual(sumMigrationReport(report), expected);
270
+ assert.ok(formatMigrationReport(report)
271
+ .split("\n")
272
+ .includes(` ambiguous ${LEGACY_TYPE_AMBIGUOUS_ROW.data.__type}: 1`), "the report lists the ambiguous type");
273
+ const rows = await readRawRows(store, table);
274
+ assert.deepStrictEqual(typesOf(rows), {
275
+ a1: "Webda/V3Animal",
276
+ a2: "Webda/V3Animal",
277
+ a3: "Webda/V3Animal",
278
+ a4: "Webda/V3Animal",
279
+ a5: "Webda/V3Animal",
280
+ d1: "Webda/V3Dog",
281
+ p1: "Webda/V3Puppy",
282
+ p2: "Webda/V3Puppy",
283
+ g1: "Webda/V3Plant",
284
+ g2: "Webda/V3Plant",
285
+ g3: "Webda/V3Plant",
286
+ u1: "Gone/Model",
287
+ x1: "Webda/Creature"
288
+ });
289
+ assert.deepStrictEqual(rows.x1, before.x1, "an ambiguous row is left untouched");
290
+ const progress = (await store.getMigrationProgress("types"));
291
+ assert.strictEqual(progress.done, true);
292
+ assert.strictEqual(progress.leaseUntil, 0);
293
+ const again = await store.migrateTypes({ batchSize: 4 });
294
+ assert.deepStrictEqual(sumMigrationReport(again), {
295
+ scanned: expected.scanned,
296
+ updated: 0,
297
+ byChange: {},
298
+ unknown: expected.unknown
299
+ });
300
+ assert.deepStrictEqual(await uuids(V3Dog), ["d1", "p1", "p2"]);
301
+ // A row written by Webda 4 through the repository: only its __type is rewritten
302
+ await V3Animal.getRepository().create({ uuid: "e1", name: "envelope" });
303
+ const envelope = (await readRawRows(store, table)).e1;
304
+ assert.ok(envelope, "e1 was written");
305
+ await harness.seedRaw(store, table, [{ key: "e1", data: { ...structuredClone(envelope), __type: "V3Animal" } }]);
306
+ const enveloped = await store.migrateTypes({ batchSize: 4 });
307
+ assert.deepStrictEqual(sumMigrationReport(enveloped), {
308
+ scanned: expected.scanned + 1,
309
+ updated: 1,
310
+ byChange: { "V3Animal → Webda/V3Animal": 1 },
311
+ unknown: expected.unknown
312
+ });
313
+ assert.deepStrictEqual((await readRawRows(store, table)).e1, envelope, "only the __type changed, back to current");
314
+ const loaded = await V3Animal.ref("e1").get();
315
+ assert.strictEqual(loaded.name, "envelope");
316
+ }
317
+ /**
318
+ * A run interrupted after one page resumes and ends with the same totals
319
+ * @param harness - the harness
320
+ */
321
+ export async function checkLegacyTypeResume(harness) {
322
+ const store = await seedLegacyStore(harness, "Resume");
323
+ const original = store.rawPages.bind(store);
324
+ let served = 0;
325
+ store.rawPages = async (table, batchSize, token) => {
326
+ if (served > 0)
327
+ throw new Error("Interrupted");
328
+ const page = await original(table, batchSize, token);
329
+ served += page.rows.length;
330
+ return page;
331
+ };
332
+ try {
333
+ await assert.rejects(() => store.migrateTypes({ batchSize: 4 }), /Interrupted/);
334
+ }
335
+ finally {
336
+ delete store.rawPages;
337
+ }
338
+ const interrupted = (await store.getMigrationProgress("types"));
339
+ assert.strictEqual(interrupted.done, false);
340
+ assert.strictEqual(interrupted.scanned, 4);
341
+ assert.strictEqual(interrupted.leaseUntil, 0);
342
+ const resumed = await store.migrateTypes({ batchSize: 4 });
343
+ assert.strictEqual(resumed.resumed, true);
344
+ assert.deepStrictEqual(sumMigrationReport(resumed), LEGACY_TYPE_REPORT);
345
+ }
346
+ /**
347
+ * A second runner fails fast; an expired lease is taken over; the stale runner stops without writing
348
+ *
349
+ * Both runners use a patcher that always patches, so a stale runner that kept writing would be caught.
350
+ * @param harness - the harness
351
+ */
352
+ export async function checkLegacyTypeLease(harness) {
353
+ const store = await seedLegacyStore(harness, "Lease");
354
+ const table = fixtureTable(harness, store);
355
+ const original = store.rawPages.bind(store);
356
+ let release;
357
+ const hung = new Promise(resolve => (release = resolve));
358
+ let served = 0;
359
+ store.rawPages = async (name, batchSize, token) => {
360
+ if (served > 0)
361
+ await hung;
362
+ const page = await original(name, batchSize, token);
363
+ served += page.rows.length;
364
+ return page;
365
+ };
366
+ const mark = (runner) => () => ({ runner });
367
+ const leaseDuration = harness.leaseDuration ?? 1000;
368
+ let first;
369
+ let firstError;
370
+ try {
371
+ first = store.migration("lease", mark("stale"), { batchSize: 4, leaseDuration });
372
+ first.catch(err => (firstError = err));
373
+ let progress = await store.getMigrationProgress("lease");
374
+ const deadline = Date.now() + Math.max(10000, leaseDuration * 5);
375
+ while (!progress?.scanned) {
376
+ if (firstError)
377
+ throw firstError;
378
+ assert.ok(Date.now() < deadline, "the first runner never saved its first page");
379
+ await pause(5);
380
+ progress = await store.getMigrationProgress("lease");
381
+ }
382
+ await assert.rejects(() => store.migration("lease", mark("second"), { batchSize: 4 }), (err) => err?.code === "MIGRATION_ALREADY_RUNNING");
383
+ await pause(Math.max(0, progress.leaseUntil - Date.now()) + 20);
384
+ }
385
+ catch (err) {
386
+ release();
387
+ await first?.catch(() => undefined);
388
+ throw err;
389
+ }
390
+ finally {
391
+ delete store.rawPages;
392
+ }
393
+ const takeover = await store.migration("lease", mark("takeover"), { batchSize: 4 });
394
+ assert.strictEqual(takeover.resumed, true);
395
+ const totals = sumMigrationReport(takeover);
396
+ assert.strictEqual(totals.scanned, LEGACY_TYPE_ROWS.length);
397
+ assert.strictEqual(totals.updated, LEGACY_TYPE_ROWS.length);
398
+ const before = await readRawRows(store, table);
399
+ const runners = Object.values(before).map(data => data.runner);
400
+ assert.strictEqual(runners.filter(runner => runner === "stale").length, 4, "the stale runner wrote its first page");
401
+ assert.strictEqual(runners.filter(runner => runner === "takeover").length, LEGACY_TYPE_ROWS.length - 4);
402
+ release();
403
+ await assert.rejects(first, (err) => err?.code === "MIGRATION_ALREADY_RUNNING");
404
+ assert.deepStrictEqual(await readRawRows(store, table), before, "the stale runner writes nothing");
405
+ }
406
+ /**
407
+ * The startup check WARNs once with the counts; a clean store stays silent
408
+ * @param harness - the harness
409
+ */
410
+ export async function checkLegacyTypeStartup(harness) {
411
+ const store = await seedLegacyStore(harness, "Startup");
412
+ const warnings = [];
413
+ store.log = (level, ...args) => {
414
+ const message = args.join(" ");
415
+ if (level === "WARN" && message.includes("legacy, untyped or unknown types"))
416
+ warnings.push(message);
417
+ };
418
+ try {
419
+ const summary = (await store.checkStoredTypes());
420
+ assert.deepStrictEqual({ legacy: summary.legacy, untyped: summary.untyped, unknown: summary.unknown, truncated: summary.truncated }, { legacy: 7, untyped: 1, unknown: 1, truncated: false });
421
+ assert.strictEqual(warnings.length, 1, warnings.join("\n"));
422
+ for (const part of [
423
+ "'V3Animal' → Webda/V3Animal: 1",
424
+ "untyped → Webda/V3Animal: 1",
425
+ "'Flora' → Webda/V3Plant: 1",
426
+ "'UuidModel' → Webda/V3Animal: 1",
427
+ "unknown 'Gone/Model': 1",
428
+ "webda migrate"
429
+ ]) {
430
+ assert.ok(warnings[0].includes(part), `${part} in ${warnings[0]}`);
431
+ }
432
+ }
433
+ finally {
434
+ delete store.log;
435
+ }
436
+ registerLegacyTypeFixtures();
437
+ const clean = await harness.createStore(`LegacyTypesClean${++storeCounter}`, LEGACY_TYPE_MODELS);
438
+ await harness.seedRaw(clean, fixtureTable(harness, clean), structuredClone(LEGACY_TYPE_ROWS.filter(row => ["a1", "p2", "g3"].includes(row.key))));
439
+ const cleanWarnings = [];
440
+ clean.log = (level, ...args) => {
441
+ const message = args.join(" ");
442
+ if (level === "WARN" && message.includes("legacy, untyped or unknown types"))
443
+ cleanWarnings.push(message);
444
+ };
445
+ try {
446
+ const summary = (await clean.checkStoredTypes());
447
+ assert.strictEqual(summary.message, undefined);
448
+ assert.deepStrictEqual(cleanWarnings, []);
449
+ }
450
+ finally {
451
+ delete clean.log;
452
+ }
453
+ }
454
+ /**
455
+ * Every check of the suite, by name
456
+ */
457
+ export const LEGACY_TYPE_CHECKS = [
458
+ { name: "visibility", check: checkLegacyTypeVisibility },
459
+ { name: "normalization", check: checkLegacyTypeNormalization },
460
+ { name: "migration", check: checkLegacyTypeMigration },
461
+ { name: "resume", check: checkLegacyTypeResume },
462
+ { name: "lease", check: checkLegacyTypeLease },
463
+ { name: "startup", check: checkLegacyTypeStartup }
464
+ ];
465
+ /**
466
+ * Run the whole suite
467
+ *
468
+ * A plain function rather than a test suite so store packages share it without duplicating test classes across
469
+ * module resolutions.
470
+ * @param harness - the harness
471
+ * @param options - names of the checks to skip, with a documented reason
472
+ * @param options.skip - check names
473
+ */
474
+ export async function checkLegacyTypes(harness, options = {}) {
475
+ for (const { name, check } of LEGACY_TYPE_CHECKS) {
476
+ if (options.skip?.includes(name))
477
+ continue;
478
+ await check(harness);
479
+ }
480
+ }
481
+ //# sourceMappingURL=legacy-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-types.js","sourceRoot":"","sources":["../../src/test/legacy-types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webda/core",
3
- "version": "4.0.0-beta.8",
3
+ "version": "4.0.0-beta.9",
4
4
  "description": "Expose API with Lambda",
5
5
  "keywords": [
6
6
  "aws",
@@ -55,13 +55,13 @@
55
55
  "ws": "^8.20.0",
56
56
  "yaml": "^2.8.3",
57
57
  "yargs": "^18.0.0",
58
- "@webda/cache": "^4.0.0-beta.8",
59
- "@webda/models": "^4.0.0-beta.8",
58
+ "@webda/cache": "^4.0.0-beta.9",
60
59
  "@webda/decorators": "^4.0.0-beta.5",
60
+ "@webda/models": "^4.0.0-beta.9",
61
+ "@webda/ql": "4.0.0-beta.8",
61
62
  "@webda/tsc-esm": "4.0.0-beta.8",
62
- "@webda/ql": "4.0.0-beta.7",
63
63
  "@webda/workout": "4.0.0-beta.5",
64
- "@webda/utils": "^4.0.0-beta.8"
64
+ "@webda/utils": "^4.0.0-beta.9"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "sinon": "^21.0.3",
@@ -100,9 +100,9 @@
100
100
  "typescript": "7.1.0-dev.20260929.1",
101
101
  "vite": "^6.0.0",
102
102
  "vitest": "^4.1.2",
103
- "@webda/test": "^4.0.0-beta.7",
104
- "@webda/content-mapper": "^4.0.0-beta.7",
105
- "@webda/compiler": "^4.0.0-beta.8"
103
+ "@webda/compiler": "^4.0.0-beta.9",
104
+ "@webda/content-mapper": "^4.0.0-beta.8",
105
+ "@webda/test": "^4.0.0-beta.7"
106
106
  },
107
107
  "files": [
108
108
  "lib",