canopycms 0.0.54 → 0.0.55

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 (205) hide show
  1. package/dist/api/assets.d.ts +14 -2
  2. package/dist/api/assets.d.ts.map +1 -1
  3. package/dist/api/assets.js +14 -3
  4. package/dist/api/assets.js.map +1 -1
  5. package/dist/api/branch-status.d.ts.map +1 -1
  6. package/dist/api/branch-status.js +8 -2
  7. package/dist/api/branch-status.js.map +1 -1
  8. package/dist/api/client.d.ts +2 -2
  9. package/dist/api/client.d.ts.map +1 -1
  10. package/dist/api/client.js +29 -14
  11. package/dist/api/client.js.map +1 -1
  12. package/dist/api/content.d.ts +2 -2
  13. package/dist/api/content.d.ts.map +1 -1
  14. package/dist/api/content.js +160 -26
  15. package/dist/api/content.js.map +1 -1
  16. package/dist/api/entries.d.ts.map +1 -1
  17. package/dist/api/entries.js +8 -4
  18. package/dist/api/entries.js.map +1 -1
  19. package/dist/api/github-sync.d.ts.map +1 -1
  20. package/dist/api/github-sync.js +21 -4
  21. package/dist/api/github-sync.js.map +1 -1
  22. package/dist/api/groups.d.ts.map +1 -1
  23. package/dist/api/groups.js +15 -5
  24. package/dist/api/groups.js.map +1 -1
  25. package/dist/api/permissions.d.ts +6 -6
  26. package/dist/api/permissions.d.ts.map +1 -1
  27. package/dist/api/permissions.js +24 -9
  28. package/dist/api/permissions.js.map +1 -1
  29. package/dist/api/request-body-hash.d.ts +33 -0
  30. package/dist/api/request-body-hash.d.ts.map +1 -0
  31. package/dist/api/request-body-hash.js +43 -0
  32. package/dist/api/request-body-hash.js.map +1 -0
  33. package/dist/api/resolve-references.d.ts.map +1 -1
  34. package/dist/api/resolve-references.js +8 -1
  35. package/dist/api/resolve-references.js.map +1 -1
  36. package/dist/api/schema.js +9 -9
  37. package/dist/api/schema.js.map +1 -1
  38. package/dist/api/settings-helpers.d.ts +14 -1
  39. package/dist/api/settings-helpers.d.ts.map +1 -1
  40. package/dist/api/settings-helpers.js +11 -2
  41. package/dist/api/settings-helpers.js.map +1 -1
  42. package/dist/api/types.d.ts +10 -0
  43. package/dist/api/types.d.ts.map +1 -1
  44. package/dist/auth/index.d.ts +1 -0
  45. package/dist/auth/index.d.ts.map +1 -1
  46. package/dist/auth/index.js +1 -0
  47. package/dist/auth/index.js.map +1 -1
  48. package/dist/auth/plugin.d.ts +26 -0
  49. package/dist/auth/plugin.d.ts.map +1 -1
  50. package/dist/auth/plugin.js +25 -1
  51. package/dist/auth/plugin.js.map +1 -1
  52. package/dist/authorization/helpers.d.ts +16 -0
  53. package/dist/authorization/helpers.d.ts.map +1 -1
  54. package/dist/authorization/helpers.js +18 -0
  55. package/dist/authorization/helpers.js.map +1 -1
  56. package/dist/authorization/index.d.ts +1 -1
  57. package/dist/authorization/index.d.ts.map +1 -1
  58. package/dist/authorization/index.js +1 -1
  59. package/dist/authorization/index.js.map +1 -1
  60. package/dist/cli/cli.d.ts.map +1 -1
  61. package/dist/cli/cli.js +2 -1
  62. package/dist/cli/cli.js.map +1 -1
  63. package/dist/cli/generate-ai-content.js +744 -349
  64. package/dist/cli/init.d.ts +1 -1
  65. package/dist/cli/init.d.ts.map +1 -1
  66. package/dist/cli/init.js +28 -9
  67. package/dist/cli/init.js.map +1 -1
  68. package/dist/cli/sync.d.ts.map +1 -1
  69. package/dist/cli/sync.js +88 -60
  70. package/dist/cli/sync.js.map +1 -1
  71. package/dist/cli/template-files/canopy.ts.template +2 -1
  72. package/dist/cli/template-files/edit-page.tsx.template +8 -1
  73. package/dist/cli/template-files/middleware.ts.template +18 -0
  74. package/dist/cli/templates.d.ts.map +1 -1
  75. package/dist/cli/templates.js +16 -4
  76. package/dist/cli/templates.js.map +1 -1
  77. package/dist/config/helpers.d.ts +9 -1
  78. package/dist/config/helpers.d.ts.map +1 -1
  79. package/dist/config/helpers.js +30 -75
  80. package/dist/config/helpers.js.map +1 -1
  81. package/dist/config/schemas/config.d.ts +5 -20
  82. package/dist/config/schemas/config.d.ts.map +1 -1
  83. package/dist/config/schemas/config.js +6 -2
  84. package/dist/config/schemas/config.js.map +1 -1
  85. package/dist/config/schemas/media.d.ts +1 -10
  86. package/dist/config/schemas/media.d.ts.map +1 -1
  87. package/dist/config/schemas/media.js +8 -6
  88. package/dist/config/schemas/media.js.map +1 -1
  89. package/dist/config/types.d.ts +0 -3
  90. package/dist/config/types.d.ts.map +1 -1
  91. package/dist/content-id-index.d.ts +12 -6
  92. package/dist/content-id-index.d.ts.map +1 -1
  93. package/dist/content-id-index.js +12 -6
  94. package/dist/content-id-index.js.map +1 -1
  95. package/dist/content-index-generation.d.ts +30 -0
  96. package/dist/content-index-generation.d.ts.map +1 -0
  97. package/dist/content-index-generation.js +131 -0
  98. package/dist/content-index-generation.js.map +1 -0
  99. package/dist/content-index-registry.d.ts +38 -0
  100. package/dist/content-index-registry.d.ts.map +1 -0
  101. package/dist/content-index-registry.js +53 -0
  102. package/dist/content-index-registry.js.map +1 -0
  103. package/dist/content-store.d.ts +130 -6
  104. package/dist/content-store.d.ts.map +1 -1
  105. package/dist/content-store.js +333 -31
  106. package/dist/content-store.js.map +1 -1
  107. package/dist/editor/Editor.d.ts.map +1 -1
  108. package/dist/editor/Editor.js +8 -4
  109. package/dist/editor/Editor.js.map +1 -1
  110. package/dist/editor/FormRenderer.d.ts +7 -0
  111. package/dist/editor/FormRenderer.d.ts.map +1 -1
  112. package/dist/editor/FormRenderer.js +12 -3
  113. package/dist/editor/FormRenderer.js.map +1 -1
  114. package/dist/editor/components/EditorHeader.d.ts.map +1 -1
  115. package/dist/editor/components/EditorHeader.js +3 -4
  116. package/dist/editor/components/EditorHeader.js.map +1 -1
  117. package/dist/editor/components/EditorSidebar.d.ts.map +1 -1
  118. package/dist/editor/components/EditorSidebar.js +2 -4
  119. package/dist/editor/components/EditorSidebar.js.map +1 -1
  120. package/dist/editor/fields/ReferenceField.d.ts.map +1 -1
  121. package/dist/editor/fields/ReferenceField.js +19 -2
  122. package/dist/editor/fields/ReferenceField.js.map +1 -1
  123. package/dist/editor/group-manager/hooks/useGroupState.d.ts.map +1 -1
  124. package/dist/editor/group-manager/hooks/useGroupState.js +5 -2
  125. package/dist/editor/group-manager/hooks/useGroupState.js.map +1 -1
  126. package/dist/editor/hooks/useDraftManager.d.ts +8 -0
  127. package/dist/editor/hooks/useDraftManager.d.ts.map +1 -1
  128. package/dist/editor/hooks/useDraftManager.js +102 -1
  129. package/dist/editor/hooks/useDraftManager.js.map +1 -1
  130. package/dist/editor/hooks/useEntryManager.d.ts +9 -2
  131. package/dist/editor/hooks/useEntryManager.d.ts.map +1 -1
  132. package/dist/editor/hooks/useEntryManager.js +9 -3
  133. package/dist/editor/hooks/useEntryManager.js.map +1 -1
  134. package/dist/editor/hooks/useSchemaManager.d.ts.map +1 -1
  135. package/dist/editor/hooks/useSchemaManager.js +2 -1
  136. package/dist/editor/hooks/useSchemaManager.js.map +1 -1
  137. package/dist/editor/schema-editor/CollectionEditor.d.ts +4 -4
  138. package/dist/editor/schema-editor/CollectionEditor.d.ts.map +1 -1
  139. package/dist/editor/schema-editor/CollectionEditor.js +32 -12
  140. package/dist/editor/schema-editor/CollectionEditor.js.map +1 -1
  141. package/dist/entry-link-resolver.d.ts.map +1 -1
  142. package/dist/entry-link-resolver.js +5 -0
  143. package/dist/entry-link-resolver.js.map +1 -1
  144. package/dist/git-manager.d.ts +38 -3
  145. package/dist/git-manager.d.ts.map +1 -1
  146. package/dist/git-manager.js +141 -33
  147. package/dist/git-manager.js.map +1 -1
  148. package/dist/github-service.d.ts +13 -3
  149. package/dist/github-service.d.ts.map +1 -1
  150. package/dist/github-service.js +23 -7
  151. package/dist/github-service.js.map +1 -1
  152. package/dist/http/handler.d.ts +1 -1
  153. package/dist/http/handler.d.ts.map +1 -1
  154. package/dist/http/handler.js +36 -7
  155. package/dist/http/handler.js.map +1 -1
  156. package/dist/http/router.d.ts +11 -0
  157. package/dist/http/router.d.ts.map +1 -1
  158. package/dist/http/router.js +80 -16
  159. package/dist/http/router.js.map +1 -1
  160. package/dist/paths/validation.d.ts.map +1 -1
  161. package/dist/paths/validation.js +12 -0
  162. package/dist/paths/validation.js.map +1 -1
  163. package/dist/schema/schema-store.d.ts +9 -0
  164. package/dist/schema/schema-store.d.ts.map +1 -1
  165. package/dist/schema/schema-store.js +57 -8
  166. package/dist/schema/schema-store.js.map +1 -1
  167. package/dist/services.d.ts +1 -0
  168. package/dist/services.d.ts.map +1 -1
  169. package/dist/services.js +5 -2
  170. package/dist/services.js.map +1 -1
  171. package/dist/sync-core.d.ts.map +1 -1
  172. package/dist/sync-core.js +22 -9
  173. package/dist/sync-core.js.map +1 -1
  174. package/dist/user.d.ts +0 -18
  175. package/dist/user.d.ts.map +1 -1
  176. package/dist/user.js +7 -22
  177. package/dist/user.js.map +1 -1
  178. package/dist/utils/error.d.ts +8 -0
  179. package/dist/utils/error.d.ts.map +1 -1
  180. package/dist/utils/error.js +35 -7
  181. package/dist/utils/error.js.map +1 -1
  182. package/dist/validation/deletion-checker.d.ts.map +1 -1
  183. package/dist/validation/deletion-checker.js +6 -5
  184. package/dist/validation/deletion-checker.js.map +1 -1
  185. package/dist/validation/entry-validator.d.ts +67 -0
  186. package/dist/validation/entry-validator.d.ts.map +1 -0
  187. package/dist/validation/entry-validator.js +277 -0
  188. package/dist/validation/entry-validator.js.map +1 -0
  189. package/dist/validation/field-traversal.d.ts +23 -1
  190. package/dist/validation/field-traversal.d.ts.map +1 -1
  191. package/dist/validation/field-traversal.js +29 -9
  192. package/dist/validation/field-traversal.js.map +1 -1
  193. package/dist/worker/cms-worker.d.ts +67 -6
  194. package/dist/worker/cms-worker.d.ts.map +1 -1
  195. package/dist/worker/cms-worker.js +190 -67
  196. package/dist/worker/cms-worker.js.map +1 -1
  197. package/package.json +1 -2
  198. package/dist/editor/components/EditorContext.d.ts +0 -35
  199. package/dist/editor/components/EditorContext.d.ts.map +0 -1
  200. package/dist/editor/components/EditorContext.js +0 -19
  201. package/dist/editor/components/EditorContext.js.map +0 -1
  202. package/dist/editor/env.d.ts +0 -5
  203. package/dist/editor/env.d.ts.map +0 -1
  204. package/dist/editor/env.js +0 -5
  205. package/dist/editor/env.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"deletion-checker.d.ts","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAqB,MAAM,UAAU,CAAA;AAEzE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,WAAW,CAAA;IACvB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,aAAa,EAAE,CAAA;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBAFX,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;QAAE,MAAM,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAGlE;;;;;OAKG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQzD;;;;;OAKG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAYhE;;OAEG;YACW,cAAc;IAkC5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IA4FpB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAgChC"}
1
+ {"version":3,"file":"deletion-checker.d.ts","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAqB,MAAM,UAAU,CAAA;AAGzE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,WAAW,CAAA;IACvB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,aAAa,EAAE,CAAA;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBAFX,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;QAAE,MAAM,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAGlE;;;;;OAKG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQzD;;;;;OAKG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAYhE;;OAEG;YACW,cAAc;IAkC5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IA4FpB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAgChC"}
@@ -1,3 +1,4 @@
1
+ import { resolveBlockItem } from './field-traversal.js';
1
2
  /**
2
3
  * DeletionChecker finds all references to an entry before deletion.
3
4
  *
@@ -121,15 +122,15 @@ export class DeletionChecker {
121
122
  }
122
123
  }
123
124
  else if (field.type === 'block') {
124
- // Handle block fields
125
+ // Handle block fields — real block items are { template, value }, with
126
+ // nested field values under `value` (resolved by resolveBlockItem)
125
127
  const blockField = field;
126
128
  if (Array.isArray(value)) {
127
129
  value.forEach((item, index) => {
128
130
  if (typeof item === 'object' && item !== null) {
129
- const blockType = item._type;
130
- const blockDef = blockField.templates?.find((b) => b.name === blockType);
131
- if (blockDef && blockDef.fields) {
132
- found.push(...this.findIdInData(item, targetId, blockDef.fields, `${fieldPath}[${index}]`));
131
+ const resolved = resolveBlockItem(blockField, item);
132
+ if (resolved) {
133
+ found.push(...this.findIdInData(resolved.data, targetId, resolved.fields, `${fieldPath}[${index}]`));
133
134
  }
134
135
  }
135
136
  });
@@ -1 +1 @@
1
- {"version":3,"file":"deletion-checker.js","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deletion-checker.js","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Pure, isomorphic schema validation for entry data.
3
+ *
4
+ * This module is the single source of the schema-driven validation rules that
5
+ * run BOTH client-side (pre-save UX in the editor) and server-side (the
6
+ * authoritative write boundary in api/content.ts). It therefore must stay free
7
+ * of server-only imports (node:fs, ContentStore, ContentIdIndex, ...) — it may
8
+ * only depend on config types and other pure modules.
9
+ *
10
+ * What it checks (pure rules — no filesystem access):
11
+ * - required fields are present and non-empty
12
+ * - values match their field type (string/number/boolean/datetime/select/...)
13
+ * - `list` fields hold arrays; non-list fields hold single values
14
+ * - select values are one of the configured options
15
+ * - reference values are well-formed (id string or resolved `{ id }` object)
16
+ * and non-empty when required
17
+ * - block items resolve to a known template (via the shared `resolveBlockItem`
18
+ * from field-traversal, so `{ template, value }`-nested fields are validated)
19
+ *
20
+ * Reference EXISTENCE is intentionally NOT checked here: it requires the
21
+ * content ID index (filesystem) and is enforced server-side only, by running
22
+ * `ReferenceValidator` at the write boundary.
23
+ */
24
+ import type { ContentFormat, EntrySchema } from '../config';
25
+ /**
26
+ * One per-field validation error. `fieldPath` uses the canonical CanopyCMS
27
+ * path format shared with field-traversal and the editor's canopy-path
28
+ * helpers: dot notation with bracketed indices (e.g. `blocks[0].title`).
29
+ */
30
+ export interface EntryFieldError {
31
+ fieldPath: string;
32
+ message: string;
33
+ }
34
+ /**
35
+ * Extract the id from a reference value. The editor holds references either
36
+ * as an id string or as a resolved object `{ id, slug, collection, ... }`
37
+ * (content reads resolve references by default). Returns undefined for any
38
+ * other shape.
39
+ */
40
+ export declare function referenceValueId(value: unknown): string | undefined;
41
+ /**
42
+ * Merge an md/mdx body string into the data record under the schema's body
43
+ * field name (`isBody: true`, defaulting to `'body'`), so required/type checks
44
+ * apply to the body like any other field.
45
+ */
46
+ export declare function mergeBodyIntoData(fields: EntrySchema, data: Record<string, unknown>, body: string | undefined): Record<string, unknown>;
47
+ /**
48
+ * Validate entry data against an entry schema. Pure — safe to run in the
49
+ * browser. Returns one error per offending field path; an empty array means
50
+ * the data is structurally valid.
51
+ */
52
+ export declare function validateEntryData(fields: EntrySchema, data: Record<string, unknown>, pathPrefix?: string): EntryFieldError[];
53
+ /**
54
+ * Validate an editor FormValue (client-side entry point). For md/mdx formats
55
+ * the editor keeps the body under the literal `body` key; remap it to the
56
+ * schema's body field before validating so required/type checks see it.
57
+ */
58
+ export declare function validateEntryFormValue(fields: EntrySchema, format: ContentFormat | undefined, value: Record<string, unknown>): EntryFieldError[];
59
+ /**
60
+ * Return a copy of `data` with resolved reference objects (`{ id, ... }`)
61
+ * collapsed back to their id strings, recursing through objects, lists, and
62
+ * block `{ template, value }` items. Used server-side so `ReferenceValidator`
63
+ * (which expects id strings) can check reference existence on editor payloads
64
+ * that may still carry resolved objects from a prior read.
65
+ */
66
+ export declare function normalizeReferenceValues(fields: EntrySchema, data: Record<string, unknown>): Record<string, unknown>;
67
+ //# sourceMappingURL=entry-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-validator.d.ts","sourceRoot":"","sources":["../../src/validation/entry-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAEV,aAAa,EACb,WAAW,EAMZ,MAAM,WAAW,CAAA;AAMlB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAWD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAInE;AAKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAyDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,SAAK,GACd,eAAe,EAAE,CAiGnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,eAAe,EAAE,CASnB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqDzB"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Pure, isomorphic schema validation for entry data.
3
+ *
4
+ * This module is the single source of the schema-driven validation rules that
5
+ * run BOTH client-side (pre-save UX in the editor) and server-side (the
6
+ * authoritative write boundary in api/content.ts). It therefore must stay free
7
+ * of server-only imports (node:fs, ContentStore, ContentIdIndex, ...) — it may
8
+ * only depend on config types and other pure modules.
9
+ *
10
+ * What it checks (pure rules — no filesystem access):
11
+ * - required fields are present and non-empty
12
+ * - values match their field type (string/number/boolean/datetime/select/...)
13
+ * - `list` fields hold arrays; non-list fields hold single values
14
+ * - select values are one of the configured options
15
+ * - reference values are well-formed (id string or resolved `{ id }` object)
16
+ * and non-empty when required
17
+ * - block items resolve to a known template (via the shared `resolveBlockItem`
18
+ * from field-traversal, so `{ template, value }`-nested fields are validated)
19
+ *
20
+ * Reference EXISTENCE is intentionally NOT checked here: it requires the
21
+ * content ID index (filesystem) and is enforced server-side only, by running
22
+ * `ReferenceValidator` at the write boundary.
23
+ */
24
+ import { fieldTypes } from '../config/index.js';
25
+ import { resolveBlockItem } from './field-traversal.js';
26
+ import { findBodyFieldName } from '../utils/body-field.js';
27
+ import { isDataOnlyFormat } from '../utils/format.js';
28
+ const KNOWN_FIELD_TYPES = new Set(fieldTypes);
29
+ /** Field types whose value is a plain string. */
30
+ const STRING_FIELD_TYPES = new Set(['string', 'rich-text', 'markdown', 'mdx', 'image', 'code']);
31
+ function isPlainRecord(value) {
32
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
33
+ }
34
+ /**
35
+ * Extract the id from a reference value. The editor holds references either
36
+ * as an id string or as a resolved object `{ id, slug, collection, ... }`
37
+ * (content reads resolve references by default). Returns undefined for any
38
+ * other shape.
39
+ */
40
+ export function referenceValueId(value) {
41
+ if (typeof value === 'string')
42
+ return value;
43
+ if (isPlainRecord(value) && typeof value.id === 'string')
44
+ return value.id;
45
+ return undefined;
46
+ }
47
+ const selectOptionValues = (field) => (field.options ?? []).map((opt) => (typeof opt === 'string' ? opt : opt.value));
48
+ /**
49
+ * Merge an md/mdx body string into the data record under the schema's body
50
+ * field name (`isBody: true`, defaulting to `'body'`), so required/type checks
51
+ * apply to the body like any other field.
52
+ */
53
+ export function mergeBodyIntoData(fields, data, body) {
54
+ if (body === undefined)
55
+ return data;
56
+ return { ...data, [findBodyFieldName(fields)]: body };
57
+ }
58
+ /** Validate a single scalar (non-object, non-block) value against its field type. */
59
+ function validateScalar(field, value, path) {
60
+ switch (field.type) {
61
+ case 'number':
62
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
63
+ return [{ fieldPath: path, message: 'Expected a number' }];
64
+ }
65
+ return [];
66
+ case 'boolean':
67
+ if (typeof value !== 'boolean') {
68
+ return [{ fieldPath: path, message: 'Expected true or false' }];
69
+ }
70
+ return [];
71
+ case 'datetime':
72
+ if (typeof value !== 'string' || (value !== '' && Number.isNaN(Date.parse(value)))) {
73
+ return [{ fieldPath: path, message: 'Expected a valid date/time string' }];
74
+ }
75
+ return [];
76
+ case 'select': {
77
+ if (typeof value !== 'string') {
78
+ return [{ fieldPath: path, message: 'Expected a selection' }];
79
+ }
80
+ const options = selectOptionValues(field);
81
+ if (value !== '' && !options.includes(value)) {
82
+ return [{ fieldPath: path, message: `Must be one of: ${options.join(', ')}` }];
83
+ }
84
+ return [];
85
+ }
86
+ case 'reference':
87
+ if (referenceValueId(value) === undefined) {
88
+ return [{ fieldPath: path, message: 'Expected a reference id' }];
89
+ }
90
+ return [];
91
+ default:
92
+ if (STRING_FIELD_TYPES.has(field.type)) {
93
+ if (typeof value !== 'string') {
94
+ return [{ fieldPath: path, message: 'Expected text' }];
95
+ }
96
+ }
97
+ // Custom (adopter-defined) field types: semantics unknown, skip type checks.
98
+ return [];
99
+ }
100
+ }
101
+ /** True when a required field should be considered missing/empty. */
102
+ function isEmptyForRequired(field, value) {
103
+ if (value === undefined || value === null)
104
+ return true;
105
+ if (Array.isArray(value))
106
+ return value.length === 0;
107
+ if (typeof value === 'string') {
108
+ // Strings, selects, references, datetimes: empty string means "not filled in".
109
+ return value.trim() === '';
110
+ }
111
+ return false;
112
+ }
113
+ /**
114
+ * Validate entry data against an entry schema. Pure — safe to run in the
115
+ * browser. Returns one error per offending field path; an empty array means
116
+ * the data is structurally valid.
117
+ */
118
+ export function validateEntryData(fields, data, pathPrefix = '') {
119
+ const errors = [];
120
+ for (const field of fields) {
121
+ // Inline groups are transparent to the data — children live at this level.
122
+ if (field.type === 'group') {
123
+ errors.push(...validateEntryData(field.fields, data, pathPrefix));
124
+ continue;
125
+ }
126
+ const path = pathPrefix ? `${pathPrefix}.${field.name}` : field.name;
127
+ const value = data[field.name];
128
+ const isRequired = 'required' in field && field.required === true;
129
+ if (isRequired && isEmptyForRequired(field, value)) {
130
+ const message = Array.isArray(value)
131
+ ? 'At least one item is required'
132
+ : 'This field is required';
133
+ errors.push({ fieldPath: path, message });
134
+ continue;
135
+ }
136
+ // Optional and absent: nothing further to check.
137
+ if (value === undefined || value === null)
138
+ continue;
139
+ if (field.type === 'block') {
140
+ const blockField = field;
141
+ if (!Array.isArray(value)) {
142
+ errors.push({ fieldPath: path, message: 'Expected a list of blocks' });
143
+ continue;
144
+ }
145
+ value.forEach((item, index) => {
146
+ const itemPath = `${path}[${index}]`;
147
+ if (!isPlainRecord(item)) {
148
+ errors.push({ fieldPath: itemPath, message: 'Expected a block object' });
149
+ return;
150
+ }
151
+ const resolved = resolveBlockItem(blockField, item);
152
+ if (!resolved) {
153
+ const template = typeof item.template === 'string' ? item.template : undefined;
154
+ errors.push({
155
+ fieldPath: itemPath,
156
+ message: template ? `Unknown block template "${template}"` : 'Missing block template',
157
+ });
158
+ return;
159
+ }
160
+ errors.push(...validateEntryData(resolved.fields, resolved.data, itemPath));
161
+ });
162
+ continue;
163
+ }
164
+ if (field.type === 'object') {
165
+ const objectField = field;
166
+ if (objectField.list) {
167
+ if (!Array.isArray(value)) {
168
+ errors.push({ fieldPath: path, message: 'Expected a list of items' });
169
+ continue;
170
+ }
171
+ value.forEach((item, index) => {
172
+ const itemPath = `${path}[${index}]`;
173
+ if (!isPlainRecord(item)) {
174
+ errors.push({ fieldPath: itemPath, message: 'Expected an object' });
175
+ return;
176
+ }
177
+ if (objectField.fields) {
178
+ errors.push(...validateEntryData(objectField.fields, item, itemPath));
179
+ }
180
+ });
181
+ }
182
+ else if (!isPlainRecord(value)) {
183
+ errors.push({ fieldPath: path, message: 'Expected an object' });
184
+ }
185
+ else if (objectField.fields) {
186
+ errors.push(...validateEntryData(objectField.fields, value, path));
187
+ }
188
+ continue;
189
+ }
190
+ // Scalar (and list-of-scalar) fields.
191
+ if ('list' in field && field.list) {
192
+ if (!Array.isArray(value)) {
193
+ errors.push({ fieldPath: path, message: 'Expected a list of values' });
194
+ continue;
195
+ }
196
+ value.forEach((item, index) => {
197
+ errors.push(...validateScalar(field, item, `${path}[${index}]`));
198
+ });
199
+ continue;
200
+ }
201
+ if (Array.isArray(value) && KNOWN_FIELD_TYPES.has(field.type)) {
202
+ errors.push({ fieldPath: path, message: 'Expected a single value, not a list' });
203
+ continue;
204
+ }
205
+ errors.push(...validateScalar(field, value, path));
206
+ }
207
+ return errors;
208
+ }
209
+ /**
210
+ * Validate an editor FormValue (client-side entry point). For md/mdx formats
211
+ * the editor keeps the body under the literal `body` key; remap it to the
212
+ * schema's body field before validating so required/type checks see it.
213
+ */
214
+ export function validateEntryFormValue(fields, format, value) {
215
+ if (format && !isDataOnlyFormat(format)) {
216
+ const { body, ...rest } = value;
217
+ return validateEntryData(fields, mergeBodyIntoData(fields, rest, typeof body === 'string' ? body : ''));
218
+ }
219
+ return validateEntryData(fields, value);
220
+ }
221
+ /**
222
+ * Return a copy of `data` with resolved reference objects (`{ id, ... }`)
223
+ * collapsed back to their id strings, recursing through objects, lists, and
224
+ * block `{ template, value }` items. Used server-side so `ReferenceValidator`
225
+ * (which expects id strings) can check reference existence on editor payloads
226
+ * that may still carry resolved objects from a prior read.
227
+ */
228
+ export function normalizeReferenceValues(fields, data) {
229
+ const result = { ...data };
230
+ for (const field of fields) {
231
+ if (field.type === 'group') {
232
+ Object.assign(result, normalizeReferenceValues(field.fields, result));
233
+ continue;
234
+ }
235
+ const value = result[field.name];
236
+ if (value === undefined || value === null)
237
+ continue;
238
+ if (field.type === 'reference') {
239
+ const refField = field;
240
+ if (refField.list && Array.isArray(value)) {
241
+ result[field.name] = value.map((item) => referenceValueId(item) ?? item);
242
+ }
243
+ else {
244
+ result[field.name] = referenceValueId(value) ?? value;
245
+ }
246
+ continue;
247
+ }
248
+ if (field.type === 'object') {
249
+ const objectField = field;
250
+ if (!objectField.fields)
251
+ continue;
252
+ if (objectField.list && Array.isArray(value)) {
253
+ result[field.name] = value.map((item) => isPlainRecord(item) ? normalizeReferenceValues(objectField.fields, item) : item);
254
+ }
255
+ else if (isPlainRecord(value)) {
256
+ result[field.name] = normalizeReferenceValues(objectField.fields, value);
257
+ }
258
+ continue;
259
+ }
260
+ if (field.type === 'block' && Array.isArray(value)) {
261
+ const blockField = field;
262
+ result[field.name] = value.map((item) => {
263
+ if (!isPlainRecord(item))
264
+ return item;
265
+ const resolved = resolveBlockItem(blockField, item);
266
+ if (!resolved)
267
+ return item;
268
+ const normalized = normalizeReferenceValues(resolved.fields, resolved.data);
269
+ // Canonical `{ template, value }` shape keeps nested values under `value`;
270
+ // the inline `_type` shape keeps them on the item itself.
271
+ return isPlainRecord(item.value) ? { ...item, value: normalized } : normalized;
272
+ });
273
+ }
274
+ }
275
+ return result;
276
+ }
277
+ //# sourceMappingURL=entry-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-validator.js","sourceRoot":"","sources":["../../src/validation/entry-validator.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * according to a schema, handling objects, blocks, and arrays with their
6
6
  * own schemas.
7
7
  */
8
- import type { FieldConfig } from '../config';
8
+ import type { FieldConfig, BlockFieldConfig } from '../config';
9
9
  /**
10
10
  * Context provided to the visitor function for each field.
11
11
  */
@@ -22,6 +22,28 @@ export interface TraversalContext {
22
22
  * Return an empty array to skip this field, or return items to collect.
23
23
  */
24
24
  export type FieldVisitor<T> = (context: TraversalContext) => T[];
25
+ /**
26
+ * A block item resolved to its template fields and the data record that
27
+ * holds the nested field values.
28
+ */
29
+ export interface ResolvedBlockItem {
30
+ /** The template's field schema */
31
+ fields: FieldConfig[];
32
+ /** The record containing the block's nested field values */
33
+ data: Record<string, unknown>;
34
+ }
35
+ /**
36
+ * Resolve a block item to its template fields and nested data record.
37
+ *
38
+ * Real block data — as produced by the editor (BlockField.tsx) and persisted
39
+ * by ContentStore — has the shape `{ template: string, value: {...} }`:
40
+ * the template name lives on `template` and the nested field values live
41
+ * under `value`. A `_type` discriminator with inline field values is also
42
+ * accepted defensively (mirroring ai/json-to-markdown.ts).
43
+ *
44
+ * Returns undefined when the item has no resolvable template.
45
+ */
46
+ export declare function resolveBlockItem(blockField: BlockFieldConfig, item: Record<string, unknown>): ResolvedBlockItem | undefined;
25
47
  /**
26
48
  * Recursively traverse fields in data according to schema.
27
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"field-traversal.d.ts","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,WAAW,CAAA;AAElB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,KAAK,EAAE,WAAW,CAAA;IAClB,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAA;IACd,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,KAAK,CAAC,EAAE,CAAA;AAiBhE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,UAAU,SAAK,GACd,CAAC,EAAE,CA0EL;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAOpB"}
1
+ {"version":3,"file":"field-traversal.d.ts","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EAEX,gBAAgB,EAEjB,MAAM,WAAW,CAAA;AAElB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,KAAK,EAAE,WAAW,CAAA;IAClB,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAA;IACd,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,KAAK,CAAC,EAAE,CAAA;AAEhE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,iBAAiB,GAAG,SAAS,CAkB/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,UAAU,SAAK,GACd,CAAC,EAAE,CA0EL;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAOpB"}
@@ -5,16 +5,36 @@
5
5
  * according to a schema, handling objects, blocks, and arrays with their
6
6
  * own schemas.
7
7
  */
8
+ function isPlainRecord(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
8
11
  /**
9
- * Get the nested fields for a block template by looking up _type.
12
+ * Resolve a block item to its template fields and nested data record.
13
+ *
14
+ * Real block data — as produced by the editor (BlockField.tsx) and persisted
15
+ * by ContentStore — has the shape `{ template: string, value: {...} }`:
16
+ * the template name lives on `template` and the nested field values live
17
+ * under `value`. A `_type` discriminator with inline field values is also
18
+ * accepted defensively (mirroring ai/json-to-markdown.ts).
19
+ *
20
+ * Returns undefined when the item has no resolvable template.
10
21
  */
11
- function getBlockTemplateFields(blockField, item) {
12
- const blockType = item._type;
13
- if (!blockType)
22
+ export function resolveBlockItem(blockField, item) {
23
+ const templateName = typeof item.template === 'string'
24
+ ? item.template
25
+ : typeof item._type === 'string'
26
+ ? item._type
27
+ : undefined;
28
+ if (!templateName)
14
29
  return undefined;
15
30
  // Block fields use 'templates' property
16
- const template = blockField.templates?.find((t) => t.name === blockType);
17
- return template?.fields;
31
+ const template = blockField.templates?.find((t) => t.name === templateName);
32
+ if (!template?.fields)
33
+ return undefined;
34
+ // Nested field values live under `value` in the canonical shape; fall back
35
+ // to the item itself for the inline `_type` shape.
36
+ const data = isPlainRecord(item.value) ? item.value : item;
37
+ return { fields: template.fields, data };
18
38
  }
19
39
  /**
20
40
  * Recursively traverse fields in data according to schema.
@@ -81,9 +101,9 @@ export function traverseFields(fields, data, visitor, pathPrefix = '') {
81
101
  if (Array.isArray(value)) {
82
102
  value.forEach((item, index) => {
83
103
  if (typeof item === 'object' && item !== null) {
84
- const blockFields = getBlockTemplateFields(blockField, item);
85
- if (blockFields) {
86
- results.push(...traverseFields(blockFields, item, visitor, `${fieldPath}[${index}]`));
104
+ const resolved = resolveBlockItem(blockField, item);
105
+ if (resolved) {
106
+ results.push(...traverseFields(resolved.fields, resolved.data, visitor, `${fieldPath}[${index}]`));
87
107
  }
88
108
  }
89
109
  });
@@ -1 +1 @@
1
- {"version":3,"file":"field-traversal.js","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"field-traversal.js","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"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"}