@webda/core 4.0.0-beta.7 → 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.
- package/lib/application/application.d.ts +19 -0
- package/lib/application/application.d.ts.map +1 -1
- package/lib/application/application.js +52 -9
- package/lib/application/application.js.map +1 -1
- package/lib/application/model-types.d.ts +63 -0
- package/lib/application/model-types.d.ts.map +1 -0
- package/lib/application/model-types.js +59 -0
- package/lib/application/model-types.js.map +1 -0
- package/lib/application/unpackedapplication.d.ts.map +1 -1
- package/lib/application/unpackedapplication.js +5 -4
- package/lib/application/unpackedapplication.js.map +1 -1
- package/lib/bin/cli.d.ts +18 -0
- package/lib/bin/cli.d.ts.map +1 -1
- package/lib/bin/cli.js +38 -3
- package/lib/bin/cli.js.map +1 -1
- package/lib/core/operations.d.ts +17 -0
- package/lib/core/operations.d.ts.map +1 -1
- package/lib/core/operations.js +1 -1
- package/lib/core/operations.js.map +1 -1
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -1
- package/lib/index.js.map +1 -1
- package/lib/models/decorator.d.ts +21 -0
- package/lib/models/decorator.d.ts.map +1 -1
- package/lib/models/decorator.js +18 -0
- package/lib/models/decorator.js.map +1 -1
- package/lib/rest/restoperationstransport.service.d.ts +6 -0
- package/lib/rest/restoperationstransport.service.d.ts.map +1 -1
- package/lib/rest/restoperationstransport.service.js +31 -2
- package/lib/rest/restoperationstransport.service.js.map +1 -1
- package/lib/rest/router.service.d.ts.map +1 -1
- package/lib/rest/router.service.js +5 -2
- package/lib/rest/router.service.js.map +1 -1
- package/lib/services/binary.service.d.ts +1 -1
- package/lib/services/binary.service.d.ts.map +1 -1
- package/lib/services/binary.service.js.map +1 -1
- package/lib/services/httpserver.service.d.ts.map +1 -1
- package/lib/services/httpserver.service.js +5 -0
- package/lib/services/httpserver.service.js.map +1 -1
- package/lib/services/service.d.ts.map +1 -1
- package/lib/services/service.js +4 -1
- package/lib/services/service.js.map +1 -1
- package/lib/services/servicecommands.d.ts.map +1 -1
- package/lib/services/servicecommands.js +14 -1
- package/lib/services/servicecommands.js.map +1 -1
- package/lib/stores/capability.d.ts +16 -0
- package/lib/stores/capability.d.ts.map +1 -0
- package/lib/stores/capability.js +5 -0
- package/lib/stores/capability.js.map +1 -0
- package/lib/stores/memory.service.d.ts +30 -1
- package/lib/stores/memory.service.d.ts.map +1 -1
- package/lib/stores/memory.service.js +47 -1
- package/lib/stores/memory.service.js.map +1 -1
- package/lib/stores/migration.d.ts +306 -0
- package/lib/stores/migration.d.ts.map +1 -0
- package/lib/stores/migration.js +280 -0
- package/lib/stores/migration.js.map +1 -0
- package/lib/stores/store.d.ts +151 -17
- package/lib/stores/store.d.ts.map +1 -1
- package/lib/stores/store.js +421 -21
- package/lib/stores/store.js.map +1 -1
- package/lib/test/index.d.ts +2 -0
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js +3 -0
- package/lib/test/index.js.map +1 -1
- package/lib/test/legacy-types.d.ts +146 -0
- package/lib/test/legacy-types.d.ts.map +1 -0
- package/lib/test/legacy-types.fixture.model.d.ts +38 -0
- package/lib/test/legacy-types.fixture.model.d.ts.map +1 -0
- package/lib/test/legacy-types.fixture.model.js +38 -0
- package/lib/test/legacy-types.fixture.model.js.map +1 -0
- package/lib/test/legacy-types.js +481 -0
- package/lib/test/legacy-types.js.map +1 -0
- package/package.json +11 -11
- 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.
|
|
3
|
+
"version": "4.0.0-beta.9",
|
|
4
4
|
"description": "Expose API with Lambda",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"aws",
|
|
@@ -55,18 +55,18 @@
|
|
|
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.9",
|
|
58
59
|
"@webda/decorators": "^4.0.0-beta.5",
|
|
59
|
-
"@webda/models": "^4.0.0-beta.
|
|
60
|
-
"@webda/ql": "4.0.0-beta.
|
|
61
|
-
"@webda/
|
|
62
|
-
"@webda/
|
|
63
|
-
"@webda/utils": "^4.0.0-beta.
|
|
64
|
-
"@webda/workout": "4.0.0-beta.5"
|
|
60
|
+
"@webda/models": "^4.0.0-beta.9",
|
|
61
|
+
"@webda/ql": "4.0.0-beta.8",
|
|
62
|
+
"@webda/tsc-esm": "4.0.0-beta.8",
|
|
63
|
+
"@webda/workout": "4.0.0-beta.5",
|
|
64
|
+
"@webda/utils": "^4.0.0-beta.9"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
67
|
"sinon": "^21.0.3",
|
|
68
68
|
"vitest": "^4.1.2",
|
|
69
|
-
"@webda/test": "^4.0.0-beta.
|
|
69
|
+
"@webda/test": "^4.0.0-beta.7"
|
|
70
70
|
},
|
|
71
71
|
"peerDependenciesMeta": {
|
|
72
72
|
"sinon": {
|
|
@@ -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/compiler": "^4.0.0-beta.
|
|
104
|
-
"@webda/
|
|
105
|
-
"@webda/
|
|
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",
|