@forge-cms/runtime 0.0.1

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -0
  3. package/dist/access.d.ts +30 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +64 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/config.d.ts +20 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +2 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context.d.ts +16 -0
  12. package/dist/context.d.ts.map +1 -0
  13. package/dist/context.js +2 -0
  14. package/dist/context.js.map +1 -0
  15. package/dist/defaults.d.ts +20 -0
  16. package/dist/defaults.d.ts.map +1 -0
  17. package/dist/defaults.js +73 -0
  18. package/dist/defaults.js.map +1 -0
  19. package/dist/describe.d.ts +54 -0
  20. package/dist/describe.d.ts.map +1 -0
  21. package/dist/describe.js +88 -0
  22. package/dist/describe.js.map +1 -0
  23. package/dist/errors.d.ts +39 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +68 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/field-access.d.ts +14 -0
  28. package/dist/field-access.d.ts.map +1 -0
  29. package/dist/field-access.js +49 -0
  30. package/dist/field-access.js.map +1 -0
  31. package/dist/files.d.ts +24 -0
  32. package/dist/files.d.ts.map +1 -0
  33. package/dist/files.js +46 -0
  34. package/dist/files.js.map +1 -0
  35. package/dist/globals.d.ts +24 -0
  36. package/dist/globals.d.ts.map +1 -0
  37. package/dist/globals.js +161 -0
  38. package/dist/globals.js.map +1 -0
  39. package/dist/handlers.d.ts +37 -0
  40. package/dist/handlers.d.ts.map +1 -0
  41. package/dist/handlers.js +611 -0
  42. package/dist/handlers.js.map +1 -0
  43. package/dist/hooks.d.ts +60 -0
  44. package/dist/hooks.d.ts.map +1 -0
  45. package/dist/hooks.js +193 -0
  46. package/dist/hooks.js.map +1 -0
  47. package/dist/index.d.ts +18 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +26 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/localization.d.ts +52 -0
  52. package/dist/localization.d.ts.map +1 -0
  53. package/dist/localization.js +163 -0
  54. package/dist/localization.js.map +1 -0
  55. package/dist/operations.d.ts +70 -0
  56. package/dist/operations.d.ts.map +1 -0
  57. package/dist/operations.js +402 -0
  58. package/dist/operations.js.map +1 -0
  59. package/dist/populate.d.ts +6 -0
  60. package/dist/populate.d.ts.map +1 -0
  61. package/dist/populate.js +65 -0
  62. package/dist/populate.js.map +1 -0
  63. package/dist/relation-integrity.d.ts +39 -0
  64. package/dist/relation-integrity.d.ts.map +1 -0
  65. package/dist/relation-integrity.js +150 -0
  66. package/dist/relation-integrity.js.map +1 -0
  67. package/dist/runtime.d.ts +61 -0
  68. package/dist/runtime.d.ts.map +1 -0
  69. package/dist/runtime.js +155 -0
  70. package/dist/runtime.js.map +1 -0
  71. package/dist/versions.d.ts +51 -0
  72. package/dist/versions.d.ts.map +1 -0
  73. package/dist/versions.js +122 -0
  74. package/dist/versions.js.map +1 -0
  75. package/package.json +56 -0
@@ -0,0 +1,402 @@
1
+ import { validateCollection } from '@forge-cms/core';
2
+ import { AccessDeniedError, ForgeError, InvalidInputError, NotFoundError, ValidationFailedError } from './errors.js';
3
+ import { documentMatches, mergeWhere, resolveAccess } from './access.js';
4
+ import { applyAutoSlugs, applyFieldDefaults } from './defaults.js';
5
+ import { runAfterChangeHooks, runAfterDeleteHooks, runAfterOperationHooks, runAfterReadHooks, runBeforeChangeHooks, runBeforeDeleteHooks, runBeforeOperationHooks, runBeforeReadHooks, runBeforeValidateHooks, runFieldHooks } from './hooks.js';
6
+ import { assertWritableFields, filterReadableFields, FieldAccessError } from './field-access.js';
7
+ import { populateRecord, populateRecords } from './populate.js';
8
+ import { createVersion, versionsEnabled } from './versions.js';
9
+ import { isLocalizedCollection, storeLocalizedDocument, resolveLocalizedDocument } from './localization.js';
10
+ import { checkDeleteRestrictions, handleCascadeDelete, handleSetNullOnDelete } from './relation-integrity.js';
11
+ function getCollectionOrThrow(ctx, slug) {
12
+ const collection = ctx.getCollection(slug);
13
+ if (!collection)
14
+ throw new NotFoundError(`Collection '${slug}' not found`);
15
+ return collection;
16
+ }
17
+ function notFound(slug, id) {
18
+ return new NotFoundError(`Record '${id}' not found in '${slug}'`);
19
+ }
20
+ /**
21
+ * Resolves the collection's access rule for an operation.
22
+ *
23
+ * A rule that is not configured yields `undefined`, which every caller treats as "allowed" — the
24
+ * Local API has no route-level fallback to defer to, and the HTTP layer applies its own
25
+ * `allowedRoles` gate *before* calling in.
26
+ */
27
+ async function checkAccess(collection, operation, args) {
28
+ if (args.overrideAccess !== false)
29
+ return { allowed: true };
30
+ const decision = await resolveAccess(collection.access?.[operation], {
31
+ user: args.user ?? null,
32
+ operation,
33
+ collection,
34
+ ...(args.id !== undefined && { id: args.id }),
35
+ ...(args.data !== undefined && { data: args.data }),
36
+ ...(args.doc !== undefined && { doc: args.doc })
37
+ });
38
+ if (decision === undefined)
39
+ return { allowed: true };
40
+ if (!decision.allowed)
41
+ throw new AccessDeniedError();
42
+ return decision;
43
+ }
44
+ /**
45
+ * The `_status` constraint for a read. Anonymous callers only ever see published documents,
46
+ * whatever they ask for.
47
+ *
48
+ * `defaultStatus` differs by operation, preserving spec 017's behaviour: a **list** stays
49
+ * published-only unless the caller opts in (`?status=draft|all`), because a listing is the surface
50
+ * that leaks unfinished content; a **single read by id** shows drafts to any authenticated caller,
51
+ * since they had to know the id already.
52
+ */
53
+ function statusConstraint(collection, status, user, overrideAccess, defaultStatus) {
54
+ if (collection.drafts !== true)
55
+ return undefined;
56
+ // Trusted server-side calls see everything unless they ask for a specific status.
57
+ if (overrideAccess) {
58
+ if (status === undefined || status === 'all')
59
+ return undefined;
60
+ return { _status: status };
61
+ }
62
+ if (!user)
63
+ return { _status: 'published' };
64
+ const effective = status ?? defaultStatus;
65
+ if (effective === 'all')
66
+ return undefined;
67
+ return { _status: effective };
68
+ }
69
+ /**
70
+ * Runs a stage that may reject the write. A hook throwing a plain `Error` is a rejection of the
71
+ * caller's payload (400), not a server fault — preserving the spec-013 contract that a throwing
72
+ * `beforeChange` hook fails the request with its own message.
73
+ */
74
+ async function runRejectableStage(stage, label) {
75
+ try {
76
+ return await stage();
77
+ }
78
+ catch (err) {
79
+ if (err instanceof ForgeError)
80
+ throw err;
81
+ throw new InvalidInputError(err instanceof Error ? err.message : `${label} failed`);
82
+ }
83
+ }
84
+ function assertDraftStatus(collection, data) {
85
+ if (collection.drafts !== true || data._status === undefined)
86
+ return;
87
+ if (data._status !== 'draft' && data._status !== 'published') {
88
+ throw new InvalidInputError(`Invalid status '${String(data._status)}', expected 'draft' or 'published'`);
89
+ }
90
+ }
91
+ /** The shared read-side tail: populate relations, strip unreadable fields, run read hooks. */
92
+ async function prepareForRead(ctx, collection, records, args) {
93
+ const user = args.user ?? null;
94
+ const overrideAccess = args.overrideAccess !== false;
95
+ let docs = records;
96
+ if (args.depth === 1) {
97
+ docs = await populateRecords(docs, collection, ctx);
98
+ }
99
+ if (args.overrideAccess === false) {
100
+ docs = await Promise.all(docs.map((doc) => filterReadableFields(doc, collection, user)));
101
+ }
102
+ // Resolve localized fields if locale is specified
103
+ if (args.locale && isLocalizedCollection(collection)) {
104
+ docs = docs.map((doc) => resolveLocalizedDocument(doc, collection, args.locale));
105
+ }
106
+ docs = await Promise.all(docs.map(async (doc) => {
107
+ const withFieldHooks = await runFieldHooks(collection, 'afterRead', {
108
+ data: doc,
109
+ operation: 'read',
110
+ user,
111
+ overrideAccess
112
+ });
113
+ return runAfterReadHooks(collection, { user, overrideAccess, doc: withFieldHooks });
114
+ }));
115
+ return docs;
116
+ }
117
+ async function prepareReadQuery(collection, args, defaultStatus) {
118
+ const user = args.user ?? null;
119
+ const overrideAccess = args.overrideAccess !== false;
120
+ const decision = await checkAccess(collection, 'read', args);
121
+ let where = mergeWhere(args.where, decision.where);
122
+ where = mergeWhere(where, statusConstraint(collection, args.status, user, args.overrideAccess !== false, defaultStatus));
123
+ where = (await runBeforeReadHooks(collection, {
124
+ user,
125
+ overrideAccess,
126
+ query: where ?? {}
127
+ }));
128
+ return where !== undefined && Object.keys(where).length > 0 ? where : undefined;
129
+ }
130
+ export async function find(ctx, args) {
131
+ const collection = getCollectionOrThrow(ctx, args.collection);
132
+ const user = args.user ?? null;
133
+ const overrideAccess = args.overrideAccess !== false;
134
+ await runBeforeOperationHooks(collection, { operation: 'read', user, overrideAccess });
135
+ const where = await prepareReadQuery(collection, args, 'published');
136
+ const findOptions = {
137
+ collection: args.collection,
138
+ ...(args.limit !== undefined && { limit: args.limit }),
139
+ ...(args.offset !== undefined && { offset: args.offset }),
140
+ ...(where !== undefined && { where }),
141
+ ...(args.sort !== undefined && { sort: args.sort }),
142
+ ...(args.order !== undefined && { order: args.order })
143
+ };
144
+ const [records, totalDocs] = await Promise.all([
145
+ ctx.adapters.database.findMany(findOptions),
146
+ ctx.adapters.database.count(args.collection, where)
147
+ ]);
148
+ const docs = await prepareForRead(ctx, collection, records, args);
149
+ const result = paginate(docs, totalDocs, args.limit, args.offset ?? 0);
150
+ await runAfterOperationHooks(collection, { operation: 'read', user, overrideAccess, result });
151
+ return result;
152
+ }
153
+ function paginate(docs, totalDocs, limit, offset) {
154
+ const totalPages = limit !== undefined && limit > 0 ? Math.ceil(totalDocs / limit) : 1;
155
+ const page = limit !== undefined && limit > 0 ? Math.floor(offset / limit) + 1 : 1;
156
+ return {
157
+ docs,
158
+ totalDocs,
159
+ limit,
160
+ offset,
161
+ page,
162
+ totalPages,
163
+ hasNextPage: offset + docs.length < totalDocs,
164
+ hasPrevPage: offset > 0
165
+ };
166
+ }
167
+ export async function findByID(ctx, args) {
168
+ const collection = getCollectionOrThrow(ctx, args.collection);
169
+ const user = args.user ?? null;
170
+ const overrideAccess = args.overrideAccess !== false;
171
+ await runBeforeOperationHooks(collection, { operation: 'read', user, overrideAccess });
172
+ const decision = await checkAccess(collection, 'read', { ...args, id: args.id });
173
+ const record = await ctx.adapters.database.findById(args.collection, args.id);
174
+ if (!record)
175
+ throw notFound(args.collection, args.id);
176
+ // A document the caller may not reach must 404, not 403: a 403 confirms the id exists.
177
+ if (decision.where && !documentMatches(record, decision.where)) {
178
+ throw notFound(args.collection, args.id);
179
+ }
180
+ const status = statusConstraint(collection, args.status, user, args.overrideAccess !== false, 'all');
181
+ if (status && !documentMatches(record, status)) {
182
+ throw notFound(args.collection, args.id);
183
+ }
184
+ const [doc] = await prepareForRead(ctx, collection, [record], args);
185
+ const result = doc ?? record;
186
+ await runAfterOperationHooks(collection, { operation: 'read', user, overrideAccess, result });
187
+ return result;
188
+ }
189
+ export async function count(ctx, args) {
190
+ const collection = getCollectionOrThrow(ctx, args.collection);
191
+ const user = args.user ?? null;
192
+ const overrideAccess = args.overrideAccess !== false;
193
+ await runBeforeOperationHooks(collection, { operation: 'read', user, overrideAccess });
194
+ const where = await prepareReadQuery(collection, args, 'published');
195
+ const result = await ctx.adapters.database.count(args.collection, where);
196
+ await runAfterOperationHooks(collection, { operation: 'read', user, overrideAccess, result });
197
+ return result;
198
+ }
199
+ export async function create(ctx, args) {
200
+ const collection = getCollectionOrThrow(ctx, args.collection);
201
+ const user = args.user ?? null;
202
+ const overrideAccess = args.overrideAccess !== false;
203
+ await runBeforeOperationHooks(collection, { operation: 'create', user, overrideAccess });
204
+ await checkAccess(collection, 'create', { ...args, data: args.data });
205
+ if (args.overrideAccess === false) {
206
+ try {
207
+ await assertWritableFields(args.data, collection, user, 'create');
208
+ }
209
+ catch (err) {
210
+ if (err instanceof FieldAccessError)
211
+ throw new AccessDeniedError(err.message);
212
+ throw err;
213
+ }
214
+ }
215
+ // Defaults and auto-slugs are resolved before any hook runs, so a hook still gets the last word
216
+ // and validation only ever sees the final value.
217
+ const seeded = applyAutoSlugs(collection, applyFieldDefaults(collection, args.data));
218
+ // Process localized fields if the collection has locales configured
219
+ const processedData = isLocalizedCollection(collection) && args.locale
220
+ ? storeLocalizedDocument(seeded, collection, args.locale)
221
+ : seeded;
222
+ let data = await runRejectableStage(async () => runBeforeValidateHooks(collection, {
223
+ operation: 'create',
224
+ data: await runFieldHooks(collection, 'beforeValidate', {
225
+ data: processedData,
226
+ operation: 'create',
227
+ user,
228
+ overrideAccess
229
+ }),
230
+ user,
231
+ overrideAccess
232
+ }), 'beforeValidate hook');
233
+ assertDraftStatus(collection, data);
234
+ if (collection.drafts === true && data._status === undefined) {
235
+ data = { ...data, _status: 'draft' };
236
+ }
237
+ const validation = validateCollection(collection, data);
238
+ if (!validation.valid)
239
+ throw new ValidationFailedError(validation.errors);
240
+ data = await runRejectableStage(async () => runBeforeChangeHooks(collection, {
241
+ operation: 'create',
242
+ data: await runFieldHooks(collection, 'beforeChange', {
243
+ data,
244
+ operation: 'create',
245
+ user,
246
+ overrideAccess
247
+ }),
248
+ user,
249
+ overrideAccess
250
+ }), 'beforeChange hook');
251
+ const record = await ctx.adapters.database.create(args.collection, data);
252
+ // Create initial version if versions are enabled
253
+ if (versionsEnabled(collection)) {
254
+ await createVersion(ctx, {
255
+ collection: args.collection,
256
+ documentId: record.id,
257
+ data,
258
+ user
259
+ });
260
+ }
261
+ await runAfterChangeHooks(collection, {
262
+ operation: 'create',
263
+ data,
264
+ result: record,
265
+ doc: record,
266
+ user,
267
+ overrideAccess
268
+ });
269
+ const [doc] = await prepareForRead(ctx, collection, [record], args);
270
+ const result = doc ?? record;
271
+ await runAfterOperationHooks(collection, { operation: 'create', user, overrideAccess, result });
272
+ return result;
273
+ }
274
+ export async function update(ctx, args) {
275
+ const collection = getCollectionOrThrow(ctx, args.collection);
276
+ const user = args.user ?? null;
277
+ const overrideAccess = args.overrideAccess !== false;
278
+ await runBeforeOperationHooks(collection, { operation: 'update', user, overrideAccess });
279
+ const existing = await ctx.adapters.database.findById(args.collection, args.id);
280
+ if (!existing)
281
+ throw notFound(args.collection, args.id);
282
+ const decision = await checkAccess(collection, 'update', {
283
+ ...args,
284
+ id: args.id,
285
+ data: args.data,
286
+ doc: existing
287
+ });
288
+ if (decision.where && !documentMatches(existing, decision.where)) {
289
+ throw new AccessDeniedError();
290
+ }
291
+ if (args.overrideAccess === false) {
292
+ try {
293
+ await assertWritableFields(args.data, collection, user, 'update');
294
+ }
295
+ catch (err) {
296
+ if (err instanceof FieldAccessError)
297
+ throw new AccessDeniedError(err.message);
298
+ throw err;
299
+ }
300
+ }
301
+ // Process localized fields if the collection has locales configured
302
+ const processedData = isLocalizedCollection(collection) && args.locale
303
+ ? storeLocalizedDocument(args.data, collection, args.locale, existing)
304
+ : args.data;
305
+ let data = await runRejectableStage(async () => runBeforeValidateHooks(collection, {
306
+ operation: 'update',
307
+ data: await runFieldHooks(collection, 'beforeValidate', {
308
+ data: applyAutoSlugs(collection, processedData, existing),
309
+ previousData: existing,
310
+ operation: 'update',
311
+ user,
312
+ overrideAccess
313
+ }),
314
+ previousData: existing,
315
+ user,
316
+ overrideAccess
317
+ }), 'beforeValidate hook');
318
+ assertDraftStatus(collection, data);
319
+ // Validate the merged document so required fields already stored do not fail a partial update,
320
+ // then report only the errors the caller can actually act on: fields they are touching, or fields
321
+ // that are still missing entirely.
322
+ const merged = { ...existing, ...data };
323
+ const validation = validateCollection(collection, merged);
324
+ if (!validation.valid) {
325
+ const relevant = validation.errors.filter((e) => {
326
+ const top = e.field.split('.')[0] ?? e.field;
327
+ return data[top] !== undefined || existing[top] === undefined;
328
+ });
329
+ if (relevant.length > 0)
330
+ throw new ValidationFailedError(relevant);
331
+ }
332
+ data = await runRejectableStage(async () => runBeforeChangeHooks(collection, {
333
+ operation: 'update',
334
+ data: await runFieldHooks(collection, 'beforeChange', {
335
+ data,
336
+ previousData: existing,
337
+ operation: 'update',
338
+ user,
339
+ overrideAccess
340
+ }),
341
+ previousData: existing,
342
+ user,
343
+ overrideAccess
344
+ }), 'beforeChange hook');
345
+ const record = await ctx.adapters.database.update(args.collection, args.id, data);
346
+ // Create a version snapshot if versions are enabled
347
+ if (versionsEnabled(collection)) {
348
+ await createVersion(ctx, {
349
+ collection: args.collection,
350
+ documentId: args.id,
351
+ data,
352
+ user
353
+ });
354
+ }
355
+ await runAfterChangeHooks(collection, {
356
+ operation: 'update',
357
+ data,
358
+ previousData: existing,
359
+ result: record,
360
+ doc: record,
361
+ user,
362
+ overrideAccess
363
+ });
364
+ const [doc] = await prepareForRead(ctx, collection, [record], args);
365
+ const result = doc ?? record;
366
+ await runAfterOperationHooks(collection, { operation: 'update', user, overrideAccess, result });
367
+ return result;
368
+ }
369
+ export async function deleteDocument(ctx, args) {
370
+ const collection = getCollectionOrThrow(ctx, args.collection);
371
+ const user = args.user ?? null;
372
+ const overrideAccess = args.overrideAccess !== false;
373
+ await runBeforeOperationHooks(collection, { operation: 'delete', user, overrideAccess });
374
+ const existing = await ctx.adapters.database.findById(args.collection, args.id);
375
+ if (!existing)
376
+ throw notFound(args.collection, args.id);
377
+ const decision = await checkAccess(collection, 'delete', {
378
+ ...args,
379
+ id: args.id,
380
+ doc: existing
381
+ });
382
+ if (decision.where && !documentMatches(existing, decision.where)) {
383
+ throw new AccessDeniedError();
384
+ }
385
+ await runRejectableStage(() => runBeforeDeleteHooks(collection, { user, overrideAccess, id: args.id, doc: existing }), 'beforeDelete hook');
386
+ // Check relation integrity constraints
387
+ await checkDeleteRestrictions(ctx, collection, args.id);
388
+ // Handle cascade and set-null before deleting
389
+ await handleCascadeDelete(ctx, collection, args.id);
390
+ await handleSetNullOnDelete(ctx, collection, args.id);
391
+ await ctx.adapters.database.delete(args.collection, args.id);
392
+ await runAfterDeleteHooks(collection, { user, overrideAccess, id: args.id, doc: existing });
393
+ await runAfterOperationHooks(collection, {
394
+ operation: 'delete',
395
+ user,
396
+ overrideAccess,
397
+ result: existing
398
+ });
399
+ return existing;
400
+ }
401
+ export { populateRecord, populateRecords };
402
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CollectionDefinition } from '@forge-cms/core';
2
+ import type { DatabaseRecord } from '@forge-cms/db';
3
+ import type { OperationContext } from './context.js';
4
+ export declare function populateRecords(records: DatabaseRecord[], collection: CollectionDefinition, ctx: OperationContext): Promise<DatabaseRecord[]>;
5
+ export declare function populateRecord(record: DatabaseRecord, collection: CollectionDefinition, ctx: OperationContext): Promise<DatabaseRecord>;
6
+ //# sourceMappingURL=populate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../src/populate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AA0BrD,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,EAAE,oBAAoB,EAChC,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CA0C3B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,oBAAoB,EAChC,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,CAAC,CAGzB"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Every field `depth: 1` resolves: `relation` and — since spec 040 — `upload`, which is a single
3
+ * relation to an upload-enabled collection in everything but name. Leaving `upload` out meant every
4
+ * image in a populated response came back as a bare id, which no client can render.
5
+ */
6
+ function getRelationFields(collection) {
7
+ return Object.entries(collection.fields)
8
+ .filter(([, field]) => field.kind === 'relation' || field.kind === 'upload')
9
+ .map(([name, field]) => {
10
+ if (field.kind === 'upload') {
11
+ const options = field.options;
12
+ return { name, targetSlug: options.collection, many: false };
13
+ }
14
+ const options = field.options;
15
+ return { name, targetSlug: options.collection, many: options.many === true };
16
+ });
17
+ }
18
+ export async function populateRecords(records, collection, ctx) {
19
+ const relationFields = getRelationFields(collection);
20
+ if (relationFields.length === 0 || records.length === 0)
21
+ return records;
22
+ const populated = records.map((record) => ({ ...record }));
23
+ for (const { name, targetSlug, many } of relationFields) {
24
+ if (!ctx.getCollection(targetSlug))
25
+ continue;
26
+ const ids = new Set();
27
+ for (const record of populated) {
28
+ const value = record[name];
29
+ if (many && Array.isArray(value)) {
30
+ for (const id of value) {
31
+ if (typeof id === 'string')
32
+ ids.add(id);
33
+ }
34
+ }
35
+ else if (typeof value === 'string') {
36
+ ids.add(value);
37
+ }
38
+ }
39
+ if (ids.size === 0)
40
+ continue;
41
+ const related = await ctx.adapters.database.findMany({
42
+ collection: targetSlug,
43
+ where: { id: { in: Array.from(ids) } }
44
+ });
45
+ const byId = new Map(related.map((r) => [r.id, r]));
46
+ for (const record of populated) {
47
+ const value = record[name];
48
+ if (many && Array.isArray(value)) {
49
+ record[name] = value
50
+ .filter((id) => typeof id === 'string')
51
+ .map((id) => byId.get(id))
52
+ .filter((related) => related !== undefined);
53
+ }
54
+ else if (typeof value === 'string') {
55
+ record[name] = byId.get(value) ?? null;
56
+ }
57
+ }
58
+ }
59
+ return populated;
60
+ }
61
+ export async function populateRecord(record, collection, ctx) {
62
+ const [result] = await populateRecords([record], collection, ctx);
63
+ return result ?? record;
64
+ }
65
+ //# sourceMappingURL=populate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate.js","sourceRoot":"","sources":["../src/populate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { CollectionDefinition, RelationFieldOptions } from '@forge-cms/core';
2
+ import type { DatabaseRecord } from '@forge-cms/db';
3
+ import type { OperationContext } from './context.js';
4
+ /**
5
+ * Relation integrity utilities for handling cascade, restrict, and set-null on delete.
6
+ */
7
+ /**
8
+ * Finds all relation fields in a collection that reference a target collection.
9
+ */
10
+ export declare function findRelationFields(collection: CollectionDefinition, targetCollection: string): Array<{
11
+ fieldName: string;
12
+ options: RelationFieldOptions;
13
+ }>;
14
+ /**
15
+ * Finds all documents in a collection that reference a specific document ID.
16
+ */
17
+ export declare function findReferencingDocuments(ctx: OperationContext, collection: CollectionDefinition, fieldName: string, documentId: string, many: boolean): Promise<DatabaseRecord[]>;
18
+ /**
19
+ * Checks if a document can be deleted based on relation constraints.
20
+ * Throws InvalidInputError if deletion is restricted.
21
+ */
22
+ export declare function checkDeleteRestrictions(ctx: OperationContext, targetCollection: CollectionDefinition, documentId: string): Promise<void>;
23
+ /**
24
+ * Handles cascade delete: deletes all documents that reference the deleted document.
25
+ */
26
+ export declare function handleCascadeDelete(ctx: OperationContext, targetCollection: CollectionDefinition, documentId: string): Promise<void>;
27
+ /**
28
+ * Handles set-null: sets relation fields to null in all referencing documents.
29
+ */
30
+ export declare function handleSetNullOnDelete(ctx: OperationContext, targetCollection: CollectionDefinition, documentId: string): Promise<void>;
31
+ /**
32
+ * Finds orphaned documents: documents with relation fields pointing to non-existent documents.
33
+ */
34
+ export declare function findOrphanedDocuments(ctx: OperationContext, collection: CollectionDefinition): Promise<Array<{
35
+ document: DatabaseRecord;
36
+ fieldName: string;
37
+ missingId: string;
38
+ }>>;
39
+ //# sourceMappingURL=relation-integrity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-integrity.d.ts","sourceRoot":"","sources":["../src/relation-integrity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,oBAAoB,EAChC,gBAAgB,EAAE,MAAM,GACvB,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAa7D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,gBAAgB,EACrB,UAAU,EAAE,oBAAoB,EAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,cAAc,EAAE,CAAC,CAe3B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,gBAAgB,EACrB,gBAAgB,EAAE,oBAAoB,EACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,gBAAgB,EACrB,gBAAgB,EAAE,oBAAoB,EACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,gBAAgB,EACrB,gBAAgB,EAAE,oBAAoB,EACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,gBAAgB,EACrB,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAkCpF"}