@forge-cms/runtime 0.5.0 → 0.6.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.
Files changed (63) hide show
  1. package/dist/auth-managed.d.ts +19 -0
  2. package/dist/auth-managed.d.ts.map +1 -0
  3. package/dist/auth-managed.js +24 -0
  4. package/dist/auth-managed.js.map +1 -0
  5. package/dist/concurrency.d.ts +8 -0
  6. package/dist/concurrency.d.ts.map +1 -0
  7. package/dist/concurrency.js +15 -0
  8. package/dist/concurrency.js.map +1 -0
  9. package/dist/context.d.ts +5 -0
  10. package/dist/context.d.ts.map +1 -1
  11. package/dist/errors.d.ts +29 -1
  12. package/dist/errors.d.ts.map +1 -1
  13. package/dist/errors.js +38 -0
  14. package/dist/errors.js.map +1 -1
  15. package/dist/files.d.ts +15 -1
  16. package/dist/files.d.ts.map +1 -1
  17. package/dist/files.js +55 -14
  18. package/dist/files.js.map +1 -1
  19. package/dist/globals.d.ts +21 -3
  20. package/dist/globals.d.ts.map +1 -1
  21. package/dist/globals.js +216 -28
  22. package/dist/globals.js.map +1 -1
  23. package/dist/handlers.d.ts +3 -2
  24. package/dist/handlers.d.ts.map +1 -1
  25. package/dist/handlers.js +36 -47
  26. package/dist/handlers.js.map +1 -1
  27. package/dist/index.d.ts +3 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +4 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/localization.d.ts +17 -0
  32. package/dist/localization.d.ts.map +1 -1
  33. package/dist/localization.js +56 -0
  34. package/dist/localization.js.map +1 -1
  35. package/dist/operations.d.ts +51 -12
  36. package/dist/operations.d.ts.map +1 -1
  37. package/dist/operations.js +728 -125
  38. package/dist/operations.js.map +1 -1
  39. package/dist/relation-integrity.d.ts +31 -13
  40. package/dist/relation-integrity.d.ts.map +1 -1
  41. package/dist/relation-integrity.js +62 -6
  42. package/dist/relation-integrity.js.map +1 -1
  43. package/dist/relation-lifecycle.d.ts +95 -0
  44. package/dist/relation-lifecycle.d.ts.map +1 -0
  45. package/dist/relation-lifecycle.js +424 -0
  46. package/dist/relation-lifecycle.js.map +1 -0
  47. package/dist/runtime.d.ts +21 -0
  48. package/dist/runtime.d.ts.map +1 -1
  49. package/dist/runtime.js +112 -20
  50. package/dist/runtime.js.map +1 -1
  51. package/dist/storage-intents.d.ts +96 -0
  52. package/dist/storage-intents.d.ts.map +1 -0
  53. package/dist/storage-intents.js +217 -0
  54. package/dist/storage-intents.js.map +1 -0
  55. package/dist/system-fields.d.ts +27 -0
  56. package/dist/system-fields.d.ts.map +1 -0
  57. package/dist/system-fields.js +74 -0
  58. package/dist/system-fields.js.map +1 -0
  59. package/dist/versions.d.ts +73 -1
  60. package/dist/versions.d.ts.map +1 -1
  61. package/dist/versions.js +204 -17
  62. package/dist/versions.js.map +1 -1
  63. package/package.json +9 -7
@@ -0,0 +1,424 @@
1
+ import { ATOMIC_WRITE_MAX_OPERATIONS } from '@forge-cms/db';
2
+ import { isAuthManagedCollection } from './auth-managed.js';
3
+ import { InvalidInputError } from './errors.js';
4
+ import { versionsEnabled } from './versions.js';
5
+ function referenceFieldsOf(fields) {
6
+ const result = [];
7
+ for (const [fieldName, field] of Object.entries(fields)) {
8
+ if (field.kind === 'relation') {
9
+ const options = field.options;
10
+ result.push({
11
+ fieldName,
12
+ target: options.collection,
13
+ many: options.many === true,
14
+ onDelete: options.onDelete ?? 'restrict',
15
+ required: options.required === true
16
+ });
17
+ }
18
+ else if (field.kind === 'upload') {
19
+ const options = field.options;
20
+ result.push({
21
+ fieldName,
22
+ target: options.collection,
23
+ many: false,
24
+ onDelete: 'restrict',
25
+ required: options.required === true
26
+ });
27
+ }
28
+ }
29
+ return result;
30
+ }
31
+ // --- startup validation -----------------------------------------------------------------------------
32
+ function nestedFields(field) {
33
+ switch (field.kind) {
34
+ case 'group':
35
+ case 'array':
36
+ return [field.options.fields];
37
+ case 'blocks':
38
+ return field.options.blocks.map((block) => block.fields);
39
+ default:
40
+ return [];
41
+ }
42
+ }
43
+ /** Every relation/upload field below a composite field, with a readable path. */
44
+ function nestedReferences(fields, prefix) {
45
+ const found = [];
46
+ for (const [name, field] of Object.entries(fields)) {
47
+ const path = `${prefix}.${name}`;
48
+ if (field.kind === 'relation' || field.kind === 'upload')
49
+ found.push(path);
50
+ for (const inner of nestedFields(field))
51
+ found.push(...nestedReferences(inner, path));
52
+ }
53
+ return found;
54
+ }
55
+ /**
56
+ * The reference shapes relation integrity cannot enforce (spec 064 §2), found at startup so they are
57
+ * refused instead of silently ignored. Returns one message per problem (empty = supported). Reads the
58
+ * schema only — never persisted data.
59
+ *
60
+ * `isAuthManaged` answers `AuthAdapter.managesCollection` (spec 061); `onDelete: 'cascade' | 'set-null'`
61
+ * onto such a collection could never run, because its documents are only ever deleted by the auth
62
+ * adapter's own user lifecycle.
63
+ */
64
+ export function validateRelationSchema(collections, globals = [], isAuthManaged = () => false) {
65
+ const registered = new Set(collections.map((c) => c.slug));
66
+ const errors = [];
67
+ const owners = [
68
+ ...collections.map((c) => ({
69
+ label: `Collection '${c.slug}'`,
70
+ fields: c.fields,
71
+ global: false
72
+ })),
73
+ ...globals.map((g) => ({ label: `Global '${g.slug}'`, fields: g.fields, global: true }))
74
+ ];
75
+ for (const owner of owners) {
76
+ for (const [name, field] of Object.entries(owner.fields)) {
77
+ for (const inner of nestedFields(field)) {
78
+ for (const path of nestedReferences(inner, name)) {
79
+ errors.push(`${owner.label}: field '${path}' is a relation/upload inside a ${field.kind} field. ` +
80
+ `Nested references are stored inside a JSON column that ForgeCMS cannot query, so neither ` +
81
+ `onDelete nor target existence can be enforced (spec 064). Move it to a top-level field, ` +
82
+ `or store the id in a text/json field as an explicit unchecked reference.`);
83
+ }
84
+ }
85
+ }
86
+ for (const reference of referenceFieldsOf(owner.fields)) {
87
+ const label = `${owner.label}: field '${reference.fieldName}'`;
88
+ const field = owner.fields[reference.fieldName];
89
+ if (field?.options.localized === true) {
90
+ errors.push(`${label} is a localized relation/upload. A localized reference stores a per-locale map that ` +
91
+ `relation integrity and the query language cannot address (and that relation validation ` +
92
+ `rejects), so it is not supported (spec 064). Use one non-localized reference field per locale.`);
93
+ continue;
94
+ }
95
+ if (!registered.has(reference.target)) {
96
+ errors.push(`${label} references collection '${reference.target}', which is not registered, so its ` +
97
+ `targets can never be validated (spec 064).`);
98
+ continue;
99
+ }
100
+ if (owner.global && reference.onDelete !== 'restrict') {
101
+ errors.push(`${label} sets onDelete '${reference.onDelete}'. A global is never deleted or detached by a ` +
102
+ `relation cascade; its references always restrict deletion of their target (spec 064).`);
103
+ }
104
+ if (reference.onDelete !== 'restrict' && isAuthManaged(reference.target)) {
105
+ errors.push(`${label} sets onDelete '${reference.onDelete}' on a reference to '${reference.target}', which ` +
106
+ `is managed by the configured auth adapter. Its documents are deleted only through the auth ` +
107
+ `adapter's user lifecycle, which never runs relation cascades, so this option could never ` +
108
+ `apply (spec 064).`);
109
+ }
110
+ }
111
+ }
112
+ return errors;
113
+ }
114
+ function referrersOf(ctx, target) {
115
+ const result = [];
116
+ for (const collection of ctx.getCollections()) {
117
+ for (const reference of referenceFieldsOf(collection.fields)) {
118
+ if (reference.target === target) {
119
+ result.push({ ...reference, table: collection.slug, collection });
120
+ }
121
+ }
122
+ }
123
+ for (const global of ctx.getGlobals?.() ?? []) {
124
+ for (const reference of referenceFieldsOf(global.fields)) {
125
+ if (reference.target === target) {
126
+ result.push({ ...reference, table: `_global_${global.slug}`, global });
127
+ }
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ /** Rows whose `referrer` field references any of `ids`. */
133
+ function referencesAny(referrer, ids) {
134
+ if (referrer.many) {
135
+ return { or: ids.map((id) => ({ [referrer.fieldName]: { containsValue: id } })) };
136
+ }
137
+ return { [referrer.fieldName]: { in: [...ids] } };
138
+ }
139
+ /**
140
+ * "No row references any of `ids` in `target` any more" — one `assertCount(…, 0)` per referring field of
141
+ * a collection or global. The single definition of the final-state reference guard, shared by a content
142
+ * delete's plan and by the guard an auth adapter commits with its own user delete (spec 065).
143
+ */
144
+ export function noReferenceAssertions(ctx, target, ids) {
145
+ return referrersOf(ctx, target).map((referrer) => ({
146
+ type: 'assertCount',
147
+ collection: referrer.table,
148
+ where: referencesAny(referrer, ids),
149
+ equals: 0
150
+ }));
151
+ }
152
+ /** Whether any supported relation/upload field of a collection or global references `target`. */
153
+ export function isReferenced(ctx, target) {
154
+ return referrersOf(ctx, target).length > 0;
155
+ }
156
+ /**
157
+ * The relation targets a write introduces. On update (`existing` given) only values that change count:
158
+ * a single reference different from the stored one, and for `many` only ids not already stored — so a
159
+ * partial update that leaves a (possibly historically orphaned) reference alone validates nothing.
160
+ */
161
+ export function collectWrittenTargets(fields, data, existing) {
162
+ const targets = new Map();
163
+ const add = (target, field, id) => {
164
+ let entry = targets.get(target);
165
+ if (!entry) {
166
+ entry = { ids: new Set(), fields: new Set() };
167
+ targets.set(target, entry);
168
+ }
169
+ entry.ids.add(id);
170
+ entry.fields.add(field);
171
+ };
172
+ for (const reference of referenceFieldsOf(fields)) {
173
+ if (!Object.hasOwn(data, reference.fieldName))
174
+ continue;
175
+ const value = data[reference.fieldName];
176
+ const stored = existing?.[reference.fieldName];
177
+ if (reference.many) {
178
+ if (!Array.isArray(value))
179
+ continue;
180
+ const kept = new Set(Array.isArray(stored) ? stored : []);
181
+ for (const id of value) {
182
+ if (typeof id === 'string' && !kept.has(id))
183
+ add(reference.target, reference.fieldName, id);
184
+ }
185
+ }
186
+ else if (typeof value === 'string' && value !== stored) {
187
+ add(reference.target, reference.fieldName, value);
188
+ }
189
+ }
190
+ return targets;
191
+ }
192
+ /**
193
+ * The references an update **re-sends unchanged** (spec 064 §4): single values equal to the stored one,
194
+ * and ids of a `many` value already stored. They are not target-checked (a historical orphan must stay
195
+ * saveable), so instead the write only commits while the row **still holds them**. Otherwise a relation
196
+ * delete that cleared them after this update read the row (set-null) would be silently undone, leaving a
197
+ * reference to the deleted document. `undefined` when nothing is re-sent.
198
+ */
199
+ export function echoedReferenceGuard(fields, data, existing) {
200
+ const clauses = [];
201
+ for (const reference of referenceFieldsOf(fields)) {
202
+ if (!Object.hasOwn(data, reference.fieldName))
203
+ continue;
204
+ const value = data[reference.fieldName];
205
+ const stored = existing[reference.fieldName];
206
+ if (reference.many) {
207
+ if (!Array.isArray(value) || !Array.isArray(stored))
208
+ continue;
209
+ const kept = new Set(stored);
210
+ for (const id of new Set(value)) {
211
+ if (typeof id === 'string' && kept.has(id)) {
212
+ clauses.push({ [reference.fieldName]: { containsValue: id } });
213
+ }
214
+ }
215
+ }
216
+ else if (typeof value === 'string' && value === stored) {
217
+ clauses.push({ [reference.fieldName]: value });
218
+ }
219
+ }
220
+ return clauses.length > 0 ? { and: clauses } : undefined;
221
+ }
222
+ /**
223
+ * The deterministic answer for a write naming a target that does not exist: one `count` per target
224
+ * collection (an `in` over the unique ids, not a read per id), then a `400` naming the field and the
225
+ * missing ids. This is the only place "missing" is reported as bad input — a target that disappears
226
+ * after this read fails the write's own `assertCount` instead (a `409`, see {@link targetAssertions}).
227
+ */
228
+ export async function verifyTargetsExist(ctx, targets) {
229
+ for (const [target, { ids, fields }] of targets) {
230
+ const missing = [];
231
+ for (const list of chunks([...ids])) {
232
+ const found = await ctx.adapters.database.count(target, { id: { in: list } });
233
+ if (found === list.length)
234
+ continue;
235
+ const present = new Set((await ctx.adapters.database.findMany({ collection: target, where: { id: { in: list } } })).map((row) => row.id));
236
+ missing.push(...list.filter((id) => !present.has(id)));
237
+ }
238
+ if (missing.length === 0)
239
+ continue;
240
+ throw new InvalidInputError(`Field ${[...fields].map((f) => `'${f}'`).join(', ')} references ${missing.length === 1 ? 'a document' : 'documents'} ` +
241
+ `that ${missing.length === 1 ? 'does' : 'do'} not exist in '${target}': ${missing.map((id) => `'${id}'`).join(', ')}`);
242
+ }
243
+ }
244
+ /**
245
+ * Ids per `in` list. D1 allows 100 bound parameters per statement and an `assertCount` also binds
246
+ * `equals`, so a larger id set is checked in several statements instead of failing with a raw driver
247
+ * error.
248
+ */
249
+ const IDS_PER_STATEMENT = 90;
250
+ function chunks(ids) {
251
+ const result = [];
252
+ for (let i = 0; i < ids.length; i += IDS_PER_STATEMENT) {
253
+ result.push(ids.slice(i, i + IDS_PER_STATEMENT));
254
+ }
255
+ return result;
256
+ }
257
+ /**
258
+ * `assertCount`s proving every written target still exists when the write commits: one per target
259
+ * collection, or one per 90 ids of a very large `many` write (each counts against the batch cap).
260
+ */
261
+ export function targetAssertions(targets) {
262
+ return [...targets].flatMap(([target, { ids }]) => chunks([...ids]).map((list) => ({
263
+ type: 'assertCount',
264
+ collection: target,
265
+ where: { id: { in: list } },
266
+ equals: list.length
267
+ })));
268
+ }
269
+ const MAX = ATOMIC_WRITE_MAX_OPERATIONS;
270
+ function tooLarge(root) {
271
+ return new InvalidInputError(`Cannot delete document '${root.id}' from '${root.slug}': together with its cascade deletes, ` +
272
+ `set-null updates, version snapshots, storage-cleanup records and reference checks it needs more ` +
273
+ `than ${MAX} database ` +
274
+ `operations, the most ForgeCMS commits atomically in one operation. Nothing was changed. Delete or ` +
275
+ `detach the dependent documents in smaller steps first.`);
276
+ }
277
+ function keyOf(slug, id) {
278
+ return `${slug}:${id}`;
279
+ }
280
+ /**
281
+ * Plans a delete's complete relation consequences **with reads only** — nothing is written and no hook
282
+ * runs here. Breadth-first over `collection:id` keys, each scheduled at most once, so self references,
283
+ * cycles and diamonds terminate. Every referencing-row query is bounded (`limit: MAX + 1`): a plan that
284
+ * could not fit in one batch is refused, never truncated or chunked.
285
+ *
286
+ * Restrict and required set-null are judged against the **final** state: a reference only blocks the
287
+ * delete if the document holding it survives (a restrict referrer that is itself cascade-deleted in the
288
+ * same plan does not block). Throws `InvalidInputError` for a blocking restrict, a surviving required
289
+ * set-null, a cascade/set-null into an auth-managed collection (spec 061), or an oversized plan.
290
+ */
291
+ export async function planRelationDelete(ctx, root) {
292
+ const rootId = root.doc.id;
293
+ const rootRef = { slug: root.collection.slug, id: rootId };
294
+ const deletes = new Map();
295
+ const deletedIds = new Map();
296
+ const queue = [];
297
+ const schedule = (planned) => {
298
+ const id = planned.doc.id;
299
+ deletes.set(keyOf(planned.collection.slug, id), planned);
300
+ let ids = deletedIds.get(planned.collection.slug);
301
+ if (!ids)
302
+ deletedIds.set(planned.collection.slug, (ids = new Set()));
303
+ ids.add(id);
304
+ queue.push(planned);
305
+ if (deletes.size > MAX)
306
+ throw tooLarge(rootRef);
307
+ };
308
+ const restrictions = [];
309
+ const setNullEdges = new Map();
310
+ schedule(root);
311
+ for (let next = queue.shift(); next !== undefined; next = queue.shift()) {
312
+ const node = { slug: next.collection.slug, id: next.doc.id };
313
+ for (const referrer of referrersOf(ctx, node.slug)) {
314
+ const rows = await ctx.adapters.database.findMany({
315
+ collection: referrer.table,
316
+ where: referencesAny(referrer, [node.id]),
317
+ limit: MAX + 1
318
+ });
319
+ if (rows.length === 0)
320
+ continue;
321
+ const { collection } = referrer;
322
+ if (!collection) {
323
+ // A global is never deleted: its reference always blocks.
324
+ throw new InvalidInputError(`Cannot delete document '${node.id}' from '${node.slug}': referenced by global ` +
325
+ `'${referrer.global?.slug ?? referrer.table}' (field '${referrer.fieldName}')`);
326
+ }
327
+ if (referrer.onDelete !== 'restrict' && isAuthManagedCollection(ctx, collection.slug)) {
328
+ throw new InvalidInputError(`Cannot delete document '${node.id}' from '${node.slug}': ` +
329
+ `${rows.length} document(s) in '${collection.slug}' reference it with ` +
330
+ `onDelete '${referrer.onDelete}', but '${collection.slug}' is managed by the configured auth adapter, ` +
331
+ `so a relation cascade cannot change it. Clearing the reference on those document(s) is not ` +
332
+ `possible through generic collection CRUD or the auth adapter's user-management operations; ` +
333
+ `it requires direct database access, which is outside runtime guarantees`);
334
+ }
335
+ if (referrer.onDelete === 'cascade') {
336
+ for (const row of rows) {
337
+ if (!deletes.has(keyOf(collection.slug, row.id))) {
338
+ schedule({ collection, doc: row });
339
+ }
340
+ }
341
+ }
342
+ else if (referrer.onDelete === 'set-null') {
343
+ for (const row of rows) {
344
+ const key = keyOf(collection.slug, row.id);
345
+ const edges = setNullEdges.get(key) ?? [];
346
+ edges.push({ referrer, collection, id: row.id, node: node.id });
347
+ setNullEdges.set(key, edges);
348
+ }
349
+ if (setNullEdges.size > MAX)
350
+ throw tooLarge(rootRef);
351
+ }
352
+ else {
353
+ restrictions.push({
354
+ node,
355
+ referrer,
356
+ keys: rows.map((row) => keyOf(collection.slug, row.id)),
357
+ overflow: rows.length > MAX
358
+ });
359
+ }
360
+ }
361
+ }
362
+ // Final-state evaluation: only a surviving document's reference can block or need clearing.
363
+ for (const { node, referrer, keys, overflow } of restrictions) {
364
+ const surviving = keys.filter((key) => !deletes.has(key));
365
+ if (overflow || surviving.length > 0) {
366
+ throw new InvalidInputError(`Cannot delete document '${node.id}' from '${node.slug}': ` +
367
+ `referenced by ${overflow ? `more than ${MAX}` : surviving.length} document(s) in '${referrer.table}'`);
368
+ }
369
+ }
370
+ const setNulls = [];
371
+ for (const [key, edges] of setNullEdges) {
372
+ if (deletes.has(key))
373
+ continue;
374
+ const first = edges[0];
375
+ if (!first)
376
+ continue;
377
+ const removals = new Map();
378
+ for (const { referrer, node } of edges) {
379
+ if (referrer.required) {
380
+ throw new InvalidInputError(`Cannot delete document '${node}' from '${referrer.target}': field '${referrer.fieldName}' ` +
381
+ `on '${first.collection.slug}' is required and configured 'onDelete: set-null', which cannot ` +
382
+ `satisfy the referencing document(s) without violating that requirement`);
383
+ }
384
+ const entry = removals.get(referrer.fieldName) ?? {
385
+ many: referrer.many,
386
+ ids: new Set()
387
+ };
388
+ entry.ids.add(node);
389
+ removals.set(referrer.fieldName, entry);
390
+ }
391
+ setNulls.push({ collection: first.collection, id: first.id, removals });
392
+ }
393
+ const assertions = [...deletedIds].flatMap(([target, ids]) => noReferenceAssertions(ctx, target, [...ids]));
394
+ // One storage-cleanup intent per deleted upload document joins the batch (spec 067).
395
+ const storageIntents = [...deletes.values()].filter((d) => d.collection.upload === true).length;
396
+ const operations = deletes.size +
397
+ storageIntents +
398
+ setNulls.reduce((sum, s) => sum + (versionsEnabled(s.collection) ? 2 : 1), 0) +
399
+ assertions.length;
400
+ if (operations > MAX)
401
+ throw tooLarge(rootRef);
402
+ return { deletes: [...deletes.values()], setNulls, assertions };
403
+ }
404
+ /**
405
+ * The set-null patch for `doc` as it is now: single references to a deleted id become `null`, deleted
406
+ * ids are removed from `many` arrays. `null` when the document no longer references any of them (it
407
+ * changed since planning) — then there is nothing to write.
408
+ */
409
+ export function setNullPatch(planned, doc) {
410
+ const patch = {};
411
+ for (const [field, { many, ids }] of planned.removals) {
412
+ const value = doc[field];
413
+ if (many) {
414
+ if (Array.isArray(value) && value.some((id) => ids.has(id))) {
415
+ patch[field] = value.filter((id) => !ids.has(id));
416
+ }
417
+ }
418
+ else if (typeof value === 'string' && ids.has(value)) {
419
+ patch[field] = null;
420
+ }
421
+ }
422
+ return Object.keys(patch).length > 0 ? patch : null;
423
+ }
424
+ //# sourceMappingURL=relation-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-lifecycle.js","sourceRoot":"","sources":["../src/relation-lifecycle.ts"],"names":[],"mappings":"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"}
package/dist/runtime.d.ts CHANGED
@@ -2,6 +2,7 @@ import type { ForgeCmsConfig, AdapterSet } from './config.js';
2
2
  import type { CollectionBySlug, CollectionDefinition, CollectionDocument, CollectionRegistry, CollectionSlug, GlobalDefinition } from '@forge-cms/core';
3
3
  import type { DatabaseRecord } from '@forge-cms/db';
4
4
  import type { OperationContext } from './context.js';
5
+ import type { ReconcileStorageOptions, ReconcileStorageReport } from './storage-intents.js';
5
6
  import type { TypedCountArgs, TypedCreateArgs, TypedDeleteArgs, TypedFindArgs, TypedFindByIDArgs, TypedFindOneArgs, TypedPaginatedDocs, TypedPreviewArgs, TypedUpdateArgs } from './typed-api.js';
6
7
  import type { GetGlobalArgs, UpdateGlobalArgs } from './globals.js';
7
8
  import type { ListVersionsArgs, GetVersionArgs, RestoreVersionArgs, CreateVersionArgs } from './versions.js';
@@ -23,10 +24,24 @@ export declare class ForgeCmsRuntime<TEnv = unknown, TCollections extends Collec
23
24
  readonly config: ForgeCmsConfig<TEnv, TCollections>;
24
25
  readonly adapters: AdapterSet;
25
26
  constructor(config: ForgeCmsConfig<TEnv, TCollections>);
27
+ /**
28
+ * Hands every auth-managed collection's relation guard to the auth adapter (spec 065), so its own
29
+ * user delete commits "nothing references this document" in the same batch — no setup code needed.
30
+ * An adapter that manages a referenced collection but cannot enforce the guard is refused here: it
31
+ * would otherwise delete documents that content still references.
32
+ */
33
+ private wireManagedDeleteGuards;
26
34
  /** Initialise all adapters with the runtime environment */
27
35
  init(): this;
28
36
  /** Sync database schema for all registered collections and globals */
29
37
  syncSchema(): Promise<void>;
38
+ /**
39
+ * Creates/extends one `_versions_<slug>` table additively. Adding its unique
40
+ * `(documentId, versionNumber)` index fails on a database that already holds duplicate version
41
+ * identities (only the pre-062 read-then-insert race produced them): history is then reported, never
42
+ * deleted, renumbered or merged — the operator decides (spec 062 §8, roadmap 0.7 / M03).
43
+ */
44
+ private syncVersionTable;
30
45
  /** Find a collection definition by slug */
31
46
  getCollection(slug: string): CollectionDefinition | undefined;
32
47
  /** Get all registered collection definitions */
@@ -52,6 +67,12 @@ export declare class ForgeCmsRuntime<TEnv = unknown, TCollections extends Collec
52
67
  getVersion(args: GetVersionArgs): Promise<Version>;
53
68
  restoreVersion(args: RestoreVersionArgs): Promise<DatabaseRecord>;
54
69
  createVersion(args: CreateVersionArgs): Promise<Version>;
70
+ /**
71
+ * Deletes the stored objects that crashed or failed uploads and deletes left owned by no document, as
72
+ * recorded by their durable storage intents (spec 067). Safe to run repeatedly and concurrently; run it
73
+ * from a scheduled job or an operator script. See `reconcileStorage` for the exact guarantees.
74
+ */
75
+ reconcileStorage(options?: ReconcileStorageOptions): Promise<ReconcileStorageReport>;
55
76
  /**
56
77
  * A non-persistent simulation of a permitted create/update (spec 058 §3) — merges stored data with
57
78
  * unsaved changes for an existing document, or previews a new one. Delegates to `operations.preview`,
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAWrD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAe,CAC1B,IAAI,GAAG,OAAO,EACd,YAAY,SAAS,kBAAkB,GAAG,oBAAoB,EAAE,CAChE,YAAW,gBAAgB;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAElB,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC;IAKtD,2DAA2D;IAC3D,IAAI,IAAI,IAAI;IAQZ,sEAAsE;IAChE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC,2CAA2C;IAC3C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAI7D,gDAAgD;IAChD,cAAc,IAAI,SAAS,oBAAoB,EAAE;IAIjD,uCAAuC;IACvC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIrD,4CAA4C;IAC5C,UAAU,IAAI,SAAS,gBAAgB,EAAE;IAYzC,IAAI,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EAC7C,IAAI,EAAE,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,GACvC,OAAO,CAAC,kBAAkB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAMnD,QAAQ,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EACjD,IAAI,EAAE,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,GAC3C,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAMrE;;;OAGG;IACH,OAAO,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EAChD,IAAI,EAAE,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,GAC1C,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;IAM5E,KAAK,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EAC9C,IAAI,EAAE,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC;IAIlB,MAAM,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EAC/C,IAAI,EAAE,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,GACzC,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAMrE,MAAM,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EAC/C,IAAI,EAAE,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,GACzC,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAMrE,MAAM,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EAC/C,IAAI,EAAE,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,GACzC,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAQrE,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAItE,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAMrE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAIxD,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlD,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIjE,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAMxD;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,SAAS,cAAc,CAAC,YAAY,CAAC,EAChD,IAAI,EAAE,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,GAC1C,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;CAKtE;AAED;;;;;;;;GAQG;AAEH,MAAM,MAAM,kBAAkB,CAAC,IAAI,GAAG,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}