@forge-cms/runtime 0.4.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 (73) 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 +240 -31
  22. package/dist/globals.js.map +1 -1
  23. package/dist/handlers.d.ts +16 -9
  24. package/dist/handlers.d.ts.map +1 -1
  25. package/dist/handlers.js +63 -99
  26. package/dist/handlers.js.map +1 -1
  27. package/dist/index.d.ts +6 -4
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +8 -4
  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 +89 -0
  36. package/dist/operations.d.ts.map +1 -1
  37. package/dist/operations.js +824 -116
  38. package/dist/operations.js.map +1 -1
  39. package/dist/populate.d.ts +23 -3
  40. package/dist/populate.d.ts.map +1 -1
  41. package/dist/populate.js +40 -8
  42. package/dist/populate.js.map +1 -1
  43. package/dist/read-policy.d.ts +35 -0
  44. package/dist/read-policy.d.ts.map +1 -0
  45. package/dist/read-policy.js +59 -0
  46. package/dist/read-policy.js.map +1 -0
  47. package/dist/relation-integrity.d.ts +90 -11
  48. package/dist/relation-integrity.d.ts.map +1 -1
  49. package/dist/relation-integrity.js +145 -60
  50. package/dist/relation-integrity.js.map +1 -1
  51. package/dist/relation-lifecycle.d.ts +95 -0
  52. package/dist/relation-lifecycle.d.ts.map +1 -0
  53. package/dist/relation-lifecycle.js +424 -0
  54. package/dist/relation-lifecycle.js.map +1 -0
  55. package/dist/runtime.d.ts +26 -2
  56. package/dist/runtime.d.ts.map +1 -1
  57. package/dist/runtime.js +120 -49
  58. package/dist/runtime.js.map +1 -1
  59. package/dist/storage-intents.d.ts +96 -0
  60. package/dist/storage-intents.d.ts.map +1 -0
  61. package/dist/storage-intents.js +217 -0
  62. package/dist/storage-intents.js.map +1 -0
  63. package/dist/system-fields.d.ts +27 -0
  64. package/dist/system-fields.d.ts.map +1 -0
  65. package/dist/system-fields.js +74 -0
  66. package/dist/system-fields.js.map +1 -0
  67. package/dist/typed-api.d.ts +2 -2
  68. package/dist/typed-api.d.ts.map +1 -1
  69. package/dist/versions.d.ts +76 -6
  70. package/dist/versions.d.ts.map +1 -1
  71. package/dist/versions.js +258 -44
  72. package/dist/versions.js.map +1 -1
  73. package/package.json +9 -7
@@ -2,6 +2,7 @@ import type { CmsUser, DraftStatus } from '@forge-cms/core';
2
2
  import type { DatabaseRecord, DatabaseWhere, SortInput } from '@forge-cms/db';
3
3
  import type { OperationContext } from './context.js';
4
4
  import { populateRecord, populateRecords } from './populate.js';
5
+ import type { RestoreVersionArgs } from './versions.js';
5
6
  /** A page of documents plus everything a paginator needs. */
6
7
  export interface PaginatedDocs<TDoc = DatabaseRecord> {
7
8
  docs: TDoc[];
@@ -62,6 +63,12 @@ export interface CreateArgs extends BaseOperationArgs {
62
63
  export interface UpdateArgs extends BaseOperationArgs {
63
64
  id: string;
64
65
  data: Record<string, unknown>;
66
+ /**
67
+ * Overrides the default (unlabeled) version snapshot's label when this update creates one — used by
68
+ * {@link restoreVersion} so a restore creates exactly one version, labeled, instead of restoring
69
+ * through a second bespoke write path (spec 058 §2).
70
+ */
71
+ versionLabel?: string;
65
72
  }
66
73
  export interface DeleteArgs extends BaseOperationArgs {
67
74
  id: string;
@@ -80,7 +87,89 @@ export declare function findByID(ctx: OperationContext, args: FindByIDArgs & {
80
87
  }): Promise<DatabaseRecord>;
81
88
  export declare function count(ctx: OperationContext, args: CountArgs): Promise<number>;
82
89
  export declare function create(ctx: OperationContext, args: CreateArgs): Promise<DatabaseRecord>;
90
+ /**
91
+ * The multipart upload pipeline's create (spec 063 §5) — **package-private**: exported for
92
+ * `handlers.ts` only, never from the package entry point. `storageKey` is the key Forge itself just
93
+ * generated and stored the object under; it is merged into the persisted row only, outside caller
94
+ * `data` and hook `data`, so no caller of the public mutation surface can choose or rewrite it.
95
+ */
96
+ export declare function createUpload(ctx: OperationContext, args: CreateArgs, upload: {
97
+ storageKey: string;
98
+ intentId: string;
99
+ }): Promise<DatabaseRecord>;
100
+ /**
101
+ * The whole upload create (spec 067) — **package-private**, called by `handleCreate` for a multipart
102
+ * body: records a durable storage intent, stores the object under a Forge-generated key, then creates
103
+ * the document with the key and the intent claim in one batch. Any failure after the intent exists
104
+ * settles it: the object is deleted only while the intent is still there (the document never
105
+ * committed); otherwise the intent stays for `reconcileStorage()`. The file's `filename`, `url`,
106
+ * `contentType` and `filesize` fill whichever of those fields the collection declares, under `args.data`.
107
+ */
108
+ export declare function uploadFile(ctx: OperationContext, args: CreateArgs, file: File): Promise<DatabaseRecord>;
83
109
  export declare function update(ctx: OperationContext, args: UpdateArgs): Promise<DatabaseRecord>;
110
+ /**
111
+ * Restores a document to a specific historical version — spec 058 §2, made atomic by spec 062. The raw
112
+ * snapshot is read (trusted — restore's authorization gate is `update()`'s own update-access check on
113
+ * the *current* document, see spec 058 §2) and handed to this module's own update pipeline, which turns
114
+ * it into a patch of only the fields that differ from the current document (spec 062 §6) and then runs
115
+ * the normal update-access / row-policy / field-write / validation / hook pipeline. The patch and one
116
+ * snapshot labeled `Restored from version N` commit in one atomic batch, so a forbidden, invalid or
117
+ * conflicting restore leaves both the document and its history unchanged.
118
+ *
119
+ * System metadata (`id`, `created_at`, `updated_at`, `_storageKey`) is never restored. A full (spec 062)
120
+ * snapshot sets every currently declared field, so a snapshot that predates a now-required field fails
121
+ * current validation instead of producing an invalid document.
122
+ */
123
+ export declare function restoreVersion(ctx: OperationContext, args: RestoreVersionArgs): Promise<DatabaseRecord>;
124
+ /**
125
+ * Deletes a document together with its whole relation graph (spec 064 §5) — plan, prepare, **one**
126
+ * `atomicWrite`, finalize:
127
+ *
128
+ * 1. **Plan** (reads only): root `beforeOperation`, read, access; then {@link planRelationDelete} walks
129
+ * every cascade/set-null/restrict reference to its fixpoint, judges restrict and required set-null
130
+ * against the final state, and refuses a plan that cannot fit in one batch — before any `before*`
131
+ * hook of the graph and before any write.
132
+ * 2. **Prepare** (hooks, validation; no writes): root `beforeDelete`; each cascaded document's
133
+ * `beforeOperation` + `beforeDelete`; each set-null document through the same {@link prepareUpdate}
134
+ * `update()` uses. Dependents run with `overrideAccess: true` — a consequence of an authorized delete,
135
+ * like a database's own `ON DELETE CASCADE` (spec 058 §5) — but never skip validation or hooks.
136
+ * 3. **Commit**: set-null patches (versioned: spec 062's update + snapshot), cascaded deletes guarded by
137
+ * the `updated_at` they were planned with, the root delete, and finally one "no reference remains"
138
+ * `assertCount` per referring field — all in one batch, so a late failure or a reference created
139
+ * concurrently leaves every row unchanged.
140
+ * 4. **Finalize** (after commit): storage cleanup for deleted upload documents, then after-hooks —
141
+ * dependents first, root last.
142
+ *
143
+ * Before-hooks are not transactional: a side effect they performed outside the database survives a
144
+ * rollback of the batch (roadmap D01).
145
+ */
84
146
  export declare function deleteDocument(ctx: OperationContext, args: DeleteArgs): Promise<DatabaseRecord>;
147
+ export interface PreviewArgs extends BaseOperationArgs {
148
+ data: Record<string, unknown>;
149
+ id?: string;
150
+ }
151
+ /**
152
+ * A non-persistent simulation of a permitted create/update — spec 058 §3. Before this fix, preview
153
+ * read the raw adapter row and merged caller-supplied `data` with **no** access enforcement at all
154
+ * (no collection/row/field-write check, no draft-visibility check, no field-read projection): any
155
+ * caller who could reach the endpoint could preview (and see every hidden field of) any document,
156
+ * and could smuggle a forbidden field into the merged output because it was never persisted.
157
+ *
158
+ * Existing-document preview now requires the same **update** access an actual `update()` call would
159
+ * (row-level policy included) plus the same draft-visibility a normal single-document read applies —
160
+ * stricter than raw `update()` (which has no draft gate), because preview hands the full merged
161
+ * document back to the caller to render, unlike a blind write. New-document preview requires **create**
162
+ * access. Both require field-write access on every field in `data` when untrusted
163
+ * (`overrideAccess: false`), and project the returned document through the same field-read rules a
164
+ * normal read would (hidden fields never appear in the output). Depth-1 population forwards the
165
+ * caller's `user`/`overrideAccess`, so a populated target obeys the §4 population-visibility fix
166
+ * instead of always resolving as a trusted call.
167
+ *
168
+ * Zero adapter writes, zero version creation, zero committed-mutation hooks — unchanged from before
169
+ * this fix; this function never called `create()`/`update()`/`createVersion()`. Full
170
+ * `validateCollection()` is deliberately not run: preview must be able to render an intentionally
171
+ * incomplete draft, not just a document that would actually pass validation.
172
+ */
173
+ export declare function preview(ctx: OperationContext, args: PreviewArgs): Promise<DatabaseRecord>;
85
174
  export { populateRecord, populateRecords };
86
175
  //# sourceMappingURL=operations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}