canopycms 0.0.67-int.90 → 0.0.67

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 (539) hide show
  1. package/README.md +30 -3
  2. package/dist/ai/generate.js +1 -27
  3. package/dist/ai/handler.d.ts +0 -4
  4. package/dist/ai/handler.js +0 -11
  5. package/dist/ai/index.d.ts +1 -8
  6. package/dist/ai/index.js +1 -8
  7. package/dist/ai/json-to-markdown.js +15 -58
  8. package/dist/ai/resolve-branch.d.ts +2 -7
  9. package/dist/ai/resolve-branch.js +2 -8
  10. package/dist/ai/strip-mdx.d.ts +5 -13
  11. package/dist/ai/strip-mdx.js +5 -17
  12. package/dist/ai/to-plain-text.d.ts +10 -28
  13. package/dist/ai/to-plain-text.js +10 -28
  14. package/dist/ai/transform-components.d.ts +2 -4
  15. package/dist/ai/transform-components.js +8 -19
  16. package/dist/ai/types.d.ts +5 -10
  17. package/dist/api/admin-branch-health.d.ts +4 -12
  18. package/dist/api/admin-branch-health.js +26 -66
  19. package/dist/api/admin.d.ts +4 -12
  20. package/dist/api/admin.js +10 -26
  21. package/dist/api/assets.d.ts +0 -25
  22. package/dist/api/assets.js +50 -91
  23. package/dist/api/branch-merge.d.ts +1 -1
  24. package/dist/api/branch-merge.js +0 -2
  25. package/dist/api/branch-review.d.ts +0 -8
  26. package/dist/api/branch-review.js +0 -13
  27. package/dist/api/branch-status.d.ts +0 -3
  28. package/dist/api/branch-status.js +8 -33
  29. package/dist/api/branch-withdraw.d.ts +0 -1
  30. package/dist/api/branch-withdraw.js +6 -9
  31. package/dist/api/branch.d.ts +7 -12
  32. package/dist/api/branch.js +7 -44
  33. package/dist/api/client.d.ts +71 -224
  34. package/dist/api/client.js +82 -233
  35. package/dist/api/comments.d.ts +2 -4
  36. package/dist/api/comments.js +0 -17
  37. package/dist/api/content.d.ts +0 -6
  38. package/dist/api/content.js +66 -142
  39. package/dist/api/entries-constants.d.ts +5 -9
  40. package/dist/api/entries-constants.js +5 -9
  41. package/dist/api/entries.d.ts +8 -13
  42. package/dist/api/entries.js +20 -51
  43. package/dist/api/github-sync.d.ts +2 -4
  44. package/dist/api/github-sync.js +4 -8
  45. package/dist/api/groups.d.ts +3 -0
  46. package/dist/api/groups.js +8 -21
  47. package/dist/api/guards.d.ts +4 -16
  48. package/dist/api/guards.js +3 -22
  49. package/dist/api/index.d.ts +4 -4
  50. package/dist/api/permissions.d.ts +2 -0
  51. package/dist/api/permissions.js +18 -40
  52. package/dist/api/reference-options.d.ts +0 -1
  53. package/dist/api/reference-options.js +3 -11
  54. package/dist/api/request-body-hash.d.ts +12 -23
  55. package/dist/api/request-body-hash.js +12 -23
  56. package/dist/api/resolve-references.d.ts +0 -1
  57. package/dist/api/resolve-references.js +13 -28
  58. package/dist/api/route-builder.d.ts +3 -7
  59. package/dist/api/route-builder.js +1 -1
  60. package/dist/api/routes.d.ts +12 -0
  61. package/dist/api/routes.js +47 -0
  62. package/dist/api/schema.d.ts +23 -33
  63. package/dist/api/schema.js +20 -74
  64. package/dist/api/settings-helpers.js +4 -5
  65. package/dist/api/types.d.ts +0 -5
  66. package/dist/api/user.js +0 -5
  67. package/dist/api/validators.d.ts +14 -52
  68. package/dist/api/validators.js +14 -52
  69. package/dist/assets/asset-prefixes.d.ts +4 -8
  70. package/dist/assets/asset-prefixes.js +4 -8
  71. package/dist/assets/asset-src.d.ts +5 -22
  72. package/dist/assets/asset-src.js +5 -21
  73. package/dist/assets/factory.d.ts +1 -2
  74. package/dist/assets/factory.js +1 -2
  75. package/dist/assets/finalize.d.ts +3 -1
  76. package/dist/assets/finalize.js +3 -1
  77. package/dist/assets/index.d.ts +3 -3
  78. package/dist/assets/index.js +1 -1
  79. package/dist/assets/keys.d.ts +5 -3
  80. package/dist/assets/keys.js +6 -3
  81. package/dist/assets/pipeline.d.ts +3 -2
  82. package/dist/assets/pipeline.js +22 -56
  83. package/dist/assets/sharp-loader.d.ts +2 -10
  84. package/dist/assets/sharp-loader.js +2 -10
  85. package/dist/assets/store-local.d.ts +1 -2
  86. package/dist/assets/store-local.js +1 -2
  87. package/dist/assets/store-s3.d.ts +3 -4
  88. package/dist/assets/svg-sanitizer.d.ts +6 -14
  89. package/dist/assets/svg-sanitizer.js +6 -14
  90. package/dist/assets/transform-directives.d.ts +3 -4
  91. package/dist/assets/transform-directives.js +1 -1
  92. package/dist/assets/transform.d.ts +19 -30
  93. package/dist/assets/transform.js +18 -31
  94. package/dist/auth/cache.d.ts +2 -3
  95. package/dist/auth/cache.js +2 -3
  96. package/dist/auth/caching-auth-plugin.d.ts +11 -22
  97. package/dist/auth/caching-auth-plugin.js +12 -14
  98. package/dist/auth/context-helpers.d.ts +6 -20
  99. package/dist/auth/context-helpers.js +5 -17
  100. package/dist/auth/file-based-auth-cache.d.ts +10 -21
  101. package/dist/auth/file-based-auth-cache.js +23 -51
  102. package/dist/auth/plugin.d.ts +29 -61
  103. package/dist/auth/plugin.js +9 -13
  104. package/dist/auth/types.d.ts +11 -20
  105. package/dist/authorization/branch.d.ts +30 -49
  106. package/dist/authorization/branch.js +16 -42
  107. package/dist/authorization/content.d.ts +11 -40
  108. package/dist/authorization/content.js +13 -45
  109. package/dist/authorization/groups/index.d.ts +0 -3
  110. package/dist/authorization/groups/index.js +0 -3
  111. package/dist/authorization/groups/loader.d.ts +14 -28
  112. package/dist/authorization/groups/loader.js +14 -38
  113. package/dist/authorization/groups/schema.d.ts +0 -6
  114. package/dist/authorization/groups/schema.js +4 -7
  115. package/dist/authorization/helpers.d.ts +9 -28
  116. package/dist/authorization/helpers.js +9 -28
  117. package/dist/authorization/index.d.ts +3 -25
  118. package/dist/authorization/index.js +3 -35
  119. package/dist/authorization/path.d.ts +6 -13
  120. package/dist/authorization/path.js +8 -25
  121. package/dist/authorization/permissions/index.d.ts +0 -3
  122. package/dist/authorization/permissions/index.js +0 -3
  123. package/dist/authorization/permissions/loader.d.ts +14 -27
  124. package/dist/authorization/permissions/loader.js +14 -32
  125. package/dist/authorization/permissions/schema.d.ts +1 -6
  126. package/dist/authorization/permissions/schema.js +6 -13
  127. package/dist/authorization/protected-branch.d.ts +36 -65
  128. package/dist/authorization/protected-branch.js +29 -41
  129. package/dist/authorization/settings-file-store.d.ts +38 -81
  130. package/dist/authorization/settings-file-store.js +38 -79
  131. package/dist/authorization/types.d.ts +4 -26
  132. package/dist/authorization/types.js +0 -6
  133. package/dist/authorization/validation.d.ts +1 -23
  134. package/dist/authorization/validation.js +1 -24
  135. package/dist/branch-health.d.ts +39 -67
  136. package/dist/branch-health.js +27 -43
  137. package/dist/branch-metadata-file.d.ts +16 -32
  138. package/dist/branch-metadata-file.js +13 -26
  139. package/dist/branch-metadata.d.ts +49 -80
  140. package/dist/branch-metadata.js +57 -87
  141. package/dist/branch-registry.d.ts +26 -64
  142. package/dist/branch-registry.js +44 -93
  143. package/dist/branch-schema-cache.d.ts +34 -124
  144. package/dist/branch-schema-cache.js +49 -155
  145. package/dist/branch-workspace.d.ts +4 -4
  146. package/dist/branch-workspace.js +15 -19
  147. package/dist/build/generate-ai-content.d.ts +1 -0
  148. package/dist/build/generate-ai-content.js +12 -25
  149. package/dist/build-canopy.d.ts +17 -27
  150. package/dist/build-canopy.js +16 -23
  151. package/dist/build-mode.d.ts +25 -27
  152. package/dist/build-mode.js +25 -29
  153. package/dist/cli/cli.d.ts +15 -26
  154. package/dist/cli/cli.js +601 -978
  155. package/dist/cli/generate-ai-content.js +351 -628
  156. package/dist/cli/github-app-manifest.d.ts +84 -0
  157. package/dist/cli/github-app-manifest.js +161 -0
  158. package/dist/cli/init-github-app.d.ts +110 -444
  159. package/dist/cli/init-github-app.js +236 -773
  160. package/dist/cli/init.js +39 -80
  161. package/dist/cli/migrate.d.ts +13 -10
  162. package/dist/cli/migrate.js +22 -30
  163. package/dist/cli/project-detect.d.ts +17 -31
  164. package/dist/cli/project-detect.js +31 -42
  165. package/dist/cli/project-root.d.ts +4 -11
  166. package/dist/cli/project-root.js +4 -11
  167. package/dist/cli/prompt.d.ts +10 -0
  168. package/dist/cli/prompt.js +67 -0
  169. package/dist/cli/sync.d.ts +0 -8
  170. package/dist/cli/sync.js +8 -28
  171. package/dist/cli/template-files/middleware.ts.template +15 -29
  172. package/dist/cli/templates.d.ts +2 -12
  173. package/dist/cli/templates.js +4 -4
  174. package/dist/client.d.ts +1 -1
  175. package/dist/comment-store.d.ts +32 -53
  176. package/dist/comment-store.js +32 -52
  177. package/dist/config/flatten.d.ts +0 -3
  178. package/dist/config/flatten.js +2 -12
  179. package/dist/config/helpers.js +2 -2
  180. package/dist/config/index.d.ts +2 -2
  181. package/dist/config/index.js +1 -4
  182. package/dist/config/schemas/collection.d.ts +0 -8
  183. package/dist/config/schemas/collection.js +0 -10
  184. package/dist/config/schemas/config.d.ts +6 -78
  185. package/dist/config/schemas/config.js +38 -54
  186. package/dist/config/schemas/field.d.ts +2 -242
  187. package/dist/config/schemas/field.js +9 -20
  188. package/dist/config/schemas/media.js +1 -1
  189. package/dist/config/schemas/permissions.js +0 -2
  190. package/dist/config/schemas/url.d.ts +5 -6
  191. package/dist/config/schemas/url.js +5 -6
  192. package/dist/config/types.d.ts +45 -33
  193. package/dist/config/types.js +0 -1
  194. package/dist/config.d.ts +1 -8
  195. package/dist/config.js +1 -9
  196. package/dist/content-id-index.d.ts +76 -188
  197. package/dist/content-id-index.js +79 -230
  198. package/dist/content-index-generation.d.ts +27 -48
  199. package/dist/content-index-generation.js +35 -84
  200. package/dist/content-index-registry.d.ts +15 -24
  201. package/dist/content-index-registry.js +5 -9
  202. package/dist/content-listing.d.ts +64 -107
  203. package/dist/content-listing.js +68 -118
  204. package/dist/content-reader.d.ts +20 -29
  205. package/dist/content-reader.js +10 -18
  206. package/dist/content-store.d.ts +210 -336
  207. package/dist/content-store.js +413 -657
  208. package/dist/content-tree.d.ts +44 -86
  209. package/dist/content-tree.js +26 -54
  210. package/dist/context.d.ts +67 -94
  211. package/dist/context.js +53 -72
  212. package/dist/dev-content-watcher.d.ts +18 -18
  213. package/dist/dev-content-watcher.js +41 -44
  214. package/dist/editor/BranchManager.d.ts +3 -6
  215. package/dist/editor/BranchManager.js +24 -44
  216. package/dist/editor/CanopyEditor.js +5 -2
  217. package/dist/editor/CommentsPanel.js +0 -2
  218. package/dist/editor/Editor.js +19 -76
  219. package/dist/editor/EditorAuthGate.d.ts +27 -0
  220. package/dist/editor/EditorAuthGate.js +140 -0
  221. package/dist/editor/EntryNavigator.js +0 -20
  222. package/dist/editor/FormRenderer.d.ts +1 -2
  223. package/dist/editor/FormRenderer.js +8 -23
  224. package/dist/editor/admin/SystemHealthPanel.js +20 -37
  225. package/dist/editor/admin/useSystemHealth.d.ts +2 -3
  226. package/dist/editor/admin/useSystemHealth.js +10 -12
  227. package/dist/editor/client-reference-resolver.d.ts +2 -5
  228. package/dist/editor/client-reference-resolver.js +2 -19
  229. package/dist/editor/comments/BranchComments.js +0 -4
  230. package/dist/editor/comments/EntryComments.js +0 -4
  231. package/dist/editor/comments/FieldWrapper.js +0 -4
  232. package/dist/editor/comments/InlineCommentThread.js +0 -2
  233. package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
  234. package/dist/editor/comments/ThreadCarousel.js +0 -12
  235. package/dist/editor/components/EditorFooter.d.ts +0 -8
  236. package/dist/editor/components/EditorFooter.js +0 -5
  237. package/dist/editor/components/EditorHeader.d.ts +0 -31
  238. package/dist/editor/components/EditorHeader.js +21 -71
  239. package/dist/editor/components/EditorSidebar.d.ts +0 -19
  240. package/dist/editor/components/EditorSidebar.js +0 -16
  241. package/dist/editor/components/EntryCreateModal.d.ts +4 -4
  242. package/dist/editor/components/EntryCreateModal.js +7 -22
  243. package/dist/editor/components/RenameEntryModal.js +0 -4
  244. package/dist/editor/components/UserBadge.js +0 -10
  245. package/dist/editor/components/index.js +0 -2
  246. package/dist/editor/context/ApiClientContext.d.ts +8 -7
  247. package/dist/editor/context/ApiClientContext.js +39 -11
  248. package/dist/editor/context/AssetContext.d.ts +7 -17
  249. package/dist/editor/context/AssetContext.js +7 -17
  250. package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
  251. package/dist/editor/context/EditorIdentityContext.js +7 -0
  252. package/dist/editor/context/EditorStateContext.d.ts +10 -41
  253. package/dist/editor/context/EditorStateContext.js +7 -23
  254. package/dist/editor/context/SWRProvider.d.ts +3 -6
  255. package/dist/editor/context/index.d.ts +1 -20
  256. package/dist/editor/context/index.js +1 -20
  257. package/dist/editor/editor-utils.d.ts +8 -47
  258. package/dist/editor/editor-utils.js +19 -72
  259. package/dist/editor/fields/BlockField.d.ts +2 -2
  260. package/dist/editor/fields/BlockField.js +1 -2
  261. package/dist/editor/fields/CodeField.d.ts +0 -1
  262. package/dist/editor/fields/CodeField.js +0 -1
  263. package/dist/editor/fields/DateTimeField.d.ts +15 -22
  264. package/dist/editor/fields/DateTimeField.js +17 -26
  265. package/dist/editor/fields/ImageField.d.ts +2 -2
  266. package/dist/editor/fields/ImageField.js +8 -14
  267. package/dist/editor/fields/InlineGroupField.d.ts +0 -1
  268. package/dist/editor/fields/InlineGroupField.js +0 -1
  269. package/dist/editor/fields/MarkdownField.d.ts +0 -1
  270. package/dist/editor/fields/MarkdownField.js +6 -11
  271. package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
  272. package/dist/editor/fields/MdxImageDialog.js +0 -1
  273. package/dist/editor/fields/NumberField.d.ts +9 -19
  274. package/dist/editor/fields/NumberField.js +11 -22
  275. package/dist/editor/fields/NumberListField.d.ts +7 -10
  276. package/dist/editor/fields/NumberListField.js +7 -10
  277. package/dist/editor/fields/ObjectField.d.ts +5 -8
  278. package/dist/editor/fields/ObjectField.js +0 -1
  279. package/dist/editor/fields/ReferenceField.d.ts +1 -1
  280. package/dist/editor/fields/ReferenceField.js +11 -16
  281. package/dist/editor/fields/SelectField.d.ts +2 -2
  282. package/dist/editor/fields/SelectField.js +0 -1
  283. package/dist/editor/fields/StringListField.d.ts +0 -4
  284. package/dist/editor/fields/StringListField.js +4 -9
  285. package/dist/editor/fields/TextField.d.ts +0 -1
  286. package/dist/editor/fields/TextField.js +0 -1
  287. package/dist/editor/fields/ToggleField.d.ts +0 -1
  288. package/dist/editor/fields/ToggleField.js +0 -1
  289. package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
  290. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
  291. package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
  292. package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
  293. package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
  294. package/dist/editor/group-manager/GroupCard.d.ts +0 -3
  295. package/dist/editor/group-manager/GroupForm.d.ts +0 -3
  296. package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
  297. package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
  298. package/dist/editor/group-manager/MemberList.d.ts +0 -3
  299. package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
  300. package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
  301. package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
  302. package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
  303. package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
  304. package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
  305. package/dist/editor/group-manager/index.d.ts +0 -6
  306. package/dist/editor/group-manager/index.js +0 -10
  307. package/dist/editor/group-manager/types.d.ts +2 -5
  308. package/dist/editor/group-manager/types.js +0 -3
  309. package/dist/editor/hooks/index.d.ts +6 -11
  310. package/dist/editor/hooks/index.js +6 -12
  311. package/dist/editor/hooks/useBranchActions.d.ts +0 -14
  312. package/dist/editor/hooks/useBranchActions.js +0 -22
  313. package/dist/editor/hooks/useBranchManager.d.ts +2 -48
  314. package/dist/editor/hooks/useBranchManager.js +4 -64
  315. package/dist/editor/hooks/useBranchesData.d.ts +7 -6
  316. package/dist/editor/hooks/useBranchesData.js +7 -6
  317. package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
  318. package/dist/editor/hooks/useCommentSystem.js +1 -36
  319. package/dist/editor/hooks/useDraftManager.d.ts +2 -35
  320. package/dist/editor/hooks/useDraftManager.js +23 -64
  321. package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
  322. package/dist/editor/hooks/useEditorLayout.js +0 -23
  323. package/dist/editor/hooks/useEntriesData.d.ts +1 -0
  324. package/dist/editor/hooks/useEntriesData.js +2 -3
  325. package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
  326. package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
  327. package/dist/editor/hooks/useEntryManager.d.ts +2 -27
  328. package/dist/editor/hooks/useEntryManager.js +29 -78
  329. package/dist/editor/hooks/useGroupManager.d.ts +0 -21
  330. package/dist/editor/hooks/useGroupManager.js +0 -21
  331. package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
  332. package/dist/editor/hooks/usePermissionManager.js +0 -20
  333. package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
  334. package/dist/editor/hooks/useReferenceResolution.js +1 -48
  335. package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
  336. package/dist/editor/hooks/useSchemaManager.js +0 -19
  337. package/dist/editor/hooks/useUserContext.d.ts +2 -9
  338. package/dist/editor/hooks/useUserContext.js +10 -10
  339. package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
  340. package/dist/editor/hooks/useUserMetadata.js +0 -3
  341. package/dist/editor/media/AssetCard.d.ts +0 -1
  342. package/dist/editor/media/AssetCard.js +1 -2
  343. package/dist/editor/media/CropStep.d.ts +0 -1
  344. package/dist/editor/media/CropStep.js +0 -1
  345. package/dist/editor/media/MediaLibrary.d.ts +1 -2
  346. package/dist/editor/media/MediaLibrary.js +1 -2
  347. package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
  348. package/dist/editor/media/MediaLibraryBody.js +0 -1
  349. package/dist/editor/media/crop-math.d.ts +1 -1
  350. package/dist/editor/media/crop-math.js +1 -1
  351. package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
  352. package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
  353. package/dist/editor/permission-manager/PermissionEditor.js +0 -1
  354. package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
  355. package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
  356. package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
  357. package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
  358. package/dist/editor/permission-manager/constants.d.ts +0 -3
  359. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
  360. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
  361. package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
  362. package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
  363. package/dist/editor/permission-manager/index.d.ts +0 -7
  364. package/dist/editor/permission-manager/index.js +0 -16
  365. package/dist/editor/permission-manager/types.d.ts +2 -12
  366. package/dist/editor/permission-manager/types.js +0 -3
  367. package/dist/editor/permission-manager/utils.d.ts +0 -28
  368. package/dist/editor/permission-manager/utils.js +9 -23
  369. package/dist/editor/preview-bridge.d.ts +5 -1
  370. package/dist/editor/preview-bridge.js +4 -4
  371. package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
  372. package/dist/editor/schema-editor/CollectionEditor.js +9 -31
  373. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
  374. package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
  375. package/dist/editor/schema-editor/index.d.ts +0 -7
  376. package/dist/editor/schema-editor/index.js +0 -7
  377. package/dist/editor/utils/env.d.ts +3 -18
  378. package/dist/editor/utils/env.js +6 -25
  379. package/dist/entry-link-resolver.d.ts +13 -35
  380. package/dist/entry-link-resolver.js +20 -53
  381. package/dist/entry-schema-registry.d.ts +20 -60
  382. package/dist/entry-schema-registry.js +20 -69
  383. package/dist/entry-schema.d.ts +118 -223
  384. package/dist/entry-schema.js +46 -91
  385. package/dist/git-manager.d.ts +101 -200
  386. package/dist/git-manager.js +211 -384
  387. package/dist/github-service.d.ts +34 -75
  388. package/dist/github-service.js +37 -91
  389. package/dist/http/handler.d.ts +6 -37
  390. package/dist/http/handler.js +65 -120
  391. package/dist/http/router.d.ts +15 -32
  392. package/dist/http/router.js +34 -99
  393. package/dist/http/types.d.ts +15 -40
  394. package/dist/http/types.js +3 -7
  395. package/dist/id.d.ts +4 -10
  396. package/dist/id.js +4 -10
  397. package/dist/index.js +6 -9
  398. package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
  399. package/dist/operating-mode/client-safe-strategy.js +8 -28
  400. package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
  401. package/dist/operating-mode/client-unsafe-strategy.js +9 -34
  402. package/dist/operating-mode/client.d.ts +3 -10
  403. package/dist/operating-mode/client.js +3 -8
  404. package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
  405. package/dist/operating-mode/deployment-name-fixtures.js +14 -18
  406. package/dist/operating-mode/deployment-name.d.ts +19 -29
  407. package/dist/operating-mode/deployment-name.js +29 -47
  408. package/dist/operating-mode/index.d.ts +4 -25
  409. package/dist/operating-mode/index.js +9 -31
  410. package/dist/operating-mode/mode-env.d.ts +32 -54
  411. package/dist/operating-mode/mode-env.js +36 -58
  412. package/dist/operating-mode/types.d.ts +24 -72
  413. package/dist/operating-mode/types.js +1 -7
  414. package/dist/paths/branch-name.d.ts +30 -40
  415. package/dist/paths/branch-name.js +30 -40
  416. package/dist/paths/branch.d.ts +4 -18
  417. package/dist/paths/branch.js +6 -22
  418. package/dist/paths/index.d.ts +2 -13
  419. package/dist/paths/index.js +3 -23
  420. package/dist/paths/normalize-server.d.ts +3 -15
  421. package/dist/paths/normalize-server.js +3 -15
  422. package/dist/paths/normalize.d.ts +13 -33
  423. package/dist/paths/normalize.js +13 -33
  424. package/dist/paths/resolve.d.ts +4 -17
  425. package/dist/paths/resolve.js +4 -22
  426. package/dist/paths/types.d.ts +12 -34
  427. package/dist/paths/types.js +5 -7
  428. package/dist/paths/validation.d.ts +22 -119
  429. package/dist/paths/validation.js +30 -148
  430. package/dist/reference-resolver.d.ts +0 -13
  431. package/dist/reference-resolver.js +0 -18
  432. package/dist/resolve-canopy-user.d.ts +16 -18
  433. package/dist/resolve-canopy-user.js +17 -26
  434. package/dist/resource-generation.d.ts +16 -25
  435. package/dist/resource-generation.js +34 -97
  436. package/dist/schema/meta-loader.d.ts +2 -14
  437. package/dist/schema/meta-loader.js +15 -64
  438. package/dist/schema/resolver.d.ts +1 -4
  439. package/dist/schema/resolver.js +1 -6
  440. package/dist/schema/schema-store-types.d.ts +0 -12
  441. package/dist/schema/schema-store.d.ts +61 -138
  442. package/dist/schema/schema-store.js +85 -282
  443. package/dist/schema/types.d.ts +0 -4
  444. package/dist/server.d.ts +62 -93
  445. package/dist/server.js +63 -94
  446. package/dist/services.d.ts +23 -47
  447. package/dist/services.js +55 -98
  448. package/dist/settings-workspace.d.ts +17 -30
  449. package/dist/settings-workspace.js +51 -81
  450. package/dist/static/index.d.ts +26 -52
  451. package/dist/static/index.js +33 -67
  452. package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
  453. package/dist/task-queue/cms-task-queue.js +13 -0
  454. package/dist/task-queue/task-queue-config.d.ts +3 -0
  455. package/dist/{worker → task-queue}/task-queue-config.js +1 -6
  456. package/dist/task-queue/task-queue.d.ts +16 -22
  457. package/dist/task-queue/task-queue.js +20 -44
  458. package/dist/task-queue/types.d.ts +0 -1
  459. package/dist/task-queue/worker-status.d.ts +35 -0
  460. package/dist/task-queue/worker-status.js +40 -0
  461. package/dist/types.d.ts +40 -51
  462. package/dist/url-collision.d.ts +26 -40
  463. package/dist/url-collision.js +47 -63
  464. package/dist/url-exclusivity-fixtures.d.ts +15 -20
  465. package/dist/url-exclusivity-fixtures.js +14 -19
  466. package/dist/url-path-resolver.d.ts +8 -16
  467. package/dist/url-path-resolver.js +19 -29
  468. package/dist/user.d.ts +8 -21
  469. package/dist/user.js +10 -19
  470. package/dist/utils/async-mutex.js +4 -6
  471. package/dist/utils/atomic-write.d.ts +2 -11
  472. package/dist/utils/atomic-write.js +2 -11
  473. package/dist/utils/body-field.d.ts +8 -15
  474. package/dist/utils/body-field.js +8 -15
  475. package/dist/utils/content-serialize.d.ts +18 -24
  476. package/dist/utils/content-serialize.js +109 -160
  477. package/dist/utils/content-write-lock.d.ts +51 -106
  478. package/dist/utils/content-write-lock.js +66 -111
  479. package/dist/utils/debug.d.ts +7 -23
  480. package/dist/utils/debug.js +7 -23
  481. package/dist/utils/entry-url.d.ts +11 -23
  482. package/dist/utils/entry-url.js +11 -26
  483. package/dist/utils/error.d.ts +25 -90
  484. package/dist/utils/error.js +60 -147
  485. package/dist/utils/flatten-group-fields.d.ts +5 -7
  486. package/dist/utils/flatten-group-fields.js +5 -7
  487. package/dist/utils/format.d.ts +1 -5
  488. package/dist/utils/format.js +1 -5
  489. package/dist/utils/fs.d.ts +3 -4
  490. package/dist/utils/fs.js +3 -4
  491. package/dist/utils/git.d.ts +52 -83
  492. package/dist/utils/git.js +79 -125
  493. package/dist/utils/logger.d.ts +35 -50
  494. package/dist/utils/logger.js +35 -52
  495. package/dist/utils/provisioning-lock.d.ts +23 -35
  496. package/dist/utils/provisioning-lock.js +49 -69
  497. package/dist/utils/sanitize-href.d.ts +5 -10
  498. package/dist/utils/sanitize-href.js +8 -18
  499. package/dist/utils/title-field.d.ts +17 -20
  500. package/dist/utils/title-field.js +18 -27
  501. package/dist/utils/typed-filename.d.ts +20 -48
  502. package/dist/utils/typed-filename.js +25 -61
  503. package/dist/utils/url-prefix.d.ts +3 -3
  504. package/dist/utils/url-prefix.js +3 -3
  505. package/dist/validation/block-structural-keys.d.ts +16 -31
  506. package/dist/validation/block-structural-keys.js +19 -29
  507. package/dist/validation/deletion-checker.d.ts +0 -34
  508. package/dist/validation/deletion-checker.js +1 -43
  509. package/dist/validation/entry-link-validator.d.ts +6 -13
  510. package/dist/validation/entry-link-validator.js +4 -13
  511. package/dist/validation/entry-type-reference-validator.d.ts +13 -18
  512. package/dist/validation/entry-type-reference-validator.js +13 -18
  513. package/dist/validation/entry-validator.d.ts +13 -25
  514. package/dist/validation/entry-validator.js +15 -32
  515. package/dist/validation/field-traversal.d.ts +3 -30
  516. package/dist/validation/field-traversal.js +1 -32
  517. package/dist/validation/reference-validator.d.ts +5 -24
  518. package/dist/validation/reference-validator.js +5 -30
  519. package/dist/worker/cms-worker.d.ts +172 -232
  520. package/dist/worker/cms-worker.js +241 -333
  521. package/dist/worker/git-sync.d.ts +32 -133
  522. package/dist/worker/git-sync.js +129 -191
  523. package/dist/worker/github-auth.d.ts +13 -19
  524. package/dist/worker/github-auth.js +13 -19
  525. package/dist/worker/history-rewrite.d.ts +53 -66
  526. package/dist/worker/history-rewrite.js +54 -60
  527. package/dist/worker/log.d.ts +24 -41
  528. package/dist/worker/log.js +25 -42
  529. package/dist/worker/rebase.d.ts +20 -110
  530. package/dist/worker/rebase.js +279 -354
  531. package/dist/worker/task-runner.d.ts +32 -66
  532. package/dist/worker/task-runner.js +126 -162
  533. package/dist/worker/worker-context.d.ts +41 -81
  534. package/package.json +4 -4
  535. package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
  536. package/dist/worker/task-queue-config.d.ts +0 -8
  537. package/dist/worker/task-queue.js +0 -19
  538. package/dist/worker/worker-status.d.ts +0 -47
  539. package/dist/worker/worker-status.js +0 -52
@@ -7,16 +7,6 @@
7
7
  * of server-only imports (node:fs, ContentStore, ContentIdIndex, ...) — it may
8
8
  * only depend on config types and other pure modules.
9
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
10
  * Reference EXISTENCE is intentionally NOT checked here: it requires the
21
11
  * content ID index (filesystem) and is enforced server-side only, by running
22
12
  * `ReferenceValidator` at the write boundary.
@@ -36,6 +26,7 @@ export interface EntryFieldError {
36
26
  * as an id string or as a resolved object `{ id, slug, collection, ... }`
37
27
  * (content reads resolve references by default). Returns undefined for any
38
28
  * other shape.
29
+ * @internal Exported for tests.
39
30
  */
40
31
  export declare function referenceValueId(value: unknown): string | undefined;
41
32
  /**
@@ -58,24 +49,21 @@ export declare function validateEntryData(fields: EntrySchema, data: Record<stri
58
49
  export declare function validateEntryFormValue(fields: EntrySchema, format: ContentFormat | undefined, value: Record<string, unknown>): EntryFieldError[];
59
50
  /**
60
51
  * Find data keys that have no counterpart in the schema, as canonical field paths
61
- * (`author.nickname`, `blocks[2].headline`).
62
- *
63
- * `validateEntryData` iterates the SCHEMA, so it can only ever report fields the schema knows
64
- * about. Nothing reported the inverse: rename or reshape a field and the old key persists on
65
- * disk forever, because the editor's form state is the whole record verbatim and every save
66
- * posts it back. The only symptom is a component quietly receiving `undefined`.
52
+ * (`author.nickname`, `blocks[2].headline`). `validateEntryData` iterates the SCHEMA
53
+ * so it can't report the inverse: rename or reshape a field and the old key persists
54
+ * on disk forever, since the editor's form state is the whole record verbatim and
55
+ * every save posts it back — the only symptom is a component quietly receiving
56
+ * `undefined`.
67
57
  *
68
- * Pure — safe in the browser. Reports rather than rejects: a save carrying a stale key still
69
- * succeeds (and now the write path even preserves the key and its comments), so this feeds the
58
+ * Pure — safe in the browser. Reports rather than rejects (a stale key doesn't fail
59
+ * a save, and the write path now preserves it and its comments), so this feeds the
70
60
  * non-blocking `validationWarnings` channel, not the 422 path.
71
61
  *
72
- * Two things it deliberately does not report:
73
- *
74
- * - **A container with no fields at all.** `api/content.ts` falls back to `[]` for a collection
75
- * with no configured entry type; "no schema" is not "every key is unknown".
76
- * - **Anything inside a `reference` value.** Reads resolve references by default, so a reference
77
- * field's value is `{ ...target data, id, slug, collection, urlPath }`. The traversal only
78
- * descends into `object` and `block`, so it never looks inside one.
62
+ * Deliberately not reported: a container with no fields at all (`api/content.ts`
63
+ * falls back to `[]` for a collection with no configured entry type — "no schema"
64
+ * isn't "every key is unknown"), and anything inside a `reference` value (a resolved
65
+ * reference's value is `{ ...target data, id, slug, collection, urlPath }`; the
66
+ * traversal only descends into `object` and `block`, so it never looks inside one).
79
67
  */
80
68
  export declare function findUnknownKeys(fields: EntrySchema, data: Record<string, unknown>): string[];
81
69
  /**
@@ -7,16 +7,6 @@
7
7
  * of server-only imports (node:fs, ContentStore, ContentIdIndex, ...) — it may
8
8
  * only depend on config types and other pure modules.
9
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
10
  * Reference EXISTENCE is intentionally NOT checked here: it requires the
21
11
  * content ID index (filesystem) and is enforced server-side only, by running
22
12
  * `ReferenceValidator` at the write boundary.
@@ -52,10 +42,7 @@ function isValidImageCropValue(value) {
52
42
  }
53
43
  /**
54
44
  * Validate a structured `image` field value: `{ src, alt, width?, height?, crop? }`
55
- * (see `ImageFieldValue` in config/types.ts). `src` and `alt` are required
56
- * whenever a value is present; `alt` may be an empty string only when the
57
- * field config sets `altOptional: true`. `width`/`height` must be positive
58
- * integers when present; `crop` must satisfy the same normalized-rect
45
+ * (see `ImageFieldValue` in config/types.ts). `crop` must satisfy the same normalized-rect
59
46
  * constraints as the transform directive parser (assets/transform-directives.ts).
60
47
  */
61
48
  function validateImageValue(field, value, path) {
@@ -91,6 +78,7 @@ function validateImageValue(field, value, path) {
91
78
  * as an id string or as a resolved object `{ id, slug, collection, ... }`
92
79
  * (content reads resolve references by default). Returns undefined for any
93
80
  * other shape.
81
+ * @internal Exported for tests.
94
82
  */
95
83
  export function referenceValueId(value) {
96
84
  if (typeof value === 'string')
@@ -175,7 +163,7 @@ function isEmptyForRequired(field, value) {
175
163
  export function validateEntryData(fields, data, pathPrefix = '') {
176
164
  const errors = [];
177
165
  for (const field of fields) {
178
- // Inline groups are transparent to the data — children live at this level.
166
+ // Inline groups are transparent (walkFields, ./field-traversal) — children live at this level.
179
167
  if (field.type === 'group') {
180
168
  errors.push(...validateEntryData(field.fields, data, pathPrefix));
181
169
  continue;
@@ -190,7 +178,6 @@ export function validateEntryData(fields, data, pathPrefix = '') {
190
178
  errors.push({ fieldPath: path, message });
191
179
  continue;
192
180
  }
193
- // Optional and absent: nothing further to check.
194
181
  if (value === undefined || value === null)
195
182
  continue;
196
183
  if (field.type === 'block') {
@@ -244,7 +231,6 @@ export function validateEntryData(fields, data, pathPrefix = '') {
244
231
  }
245
232
  continue;
246
233
  }
247
- // Scalar (and list-of-scalar) fields.
248
234
  if ('list' in field && field.list) {
249
235
  if (!Array.isArray(value)) {
250
236
  errors.push({ fieldPath: path, message: 'Expected a list of values' });
@@ -277,24 +263,21 @@ export function validateEntryFormValue(fields, format, value) {
277
263
  }
278
264
  /**
279
265
  * Find data keys that have no counterpart in the schema, as canonical field paths
280
- * (`author.nickname`, `blocks[2].headline`).
281
- *
282
- * `validateEntryData` iterates the SCHEMA, so it can only ever report fields the schema knows
283
- * about. Nothing reported the inverse: rename or reshape a field and the old key persists on
284
- * disk forever, because the editor's form state is the whole record verbatim and every save
285
- * posts it back. The only symptom is a component quietly receiving `undefined`.
266
+ * (`author.nickname`, `blocks[2].headline`). `validateEntryData` iterates the SCHEMA
267
+ * so it can't report the inverse: rename or reshape a field and the old key persists
268
+ * on disk forever, since the editor's form state is the whole record verbatim and
269
+ * every save posts it back — the only symptom is a component quietly receiving
270
+ * `undefined`.
286
271
  *
287
- * Pure — safe in the browser. Reports rather than rejects: a save carrying a stale key still
288
- * succeeds (and now the write path even preserves the key and its comments), so this feeds the
272
+ * Pure — safe in the browser. Reports rather than rejects (a stale key doesn't fail
273
+ * a save, and the write path now preserves it and its comments), so this feeds the
289
274
  * non-blocking `validationWarnings` channel, not the 422 path.
290
275
  *
291
- * Two things it deliberately does not report:
292
- *
293
- * - **A container with no fields at all.** `api/content.ts` falls back to `[]` for a collection
294
- * with no configured entry type; "no schema" is not "every key is unknown".
295
- * - **Anything inside a `reference` value.** Reads resolve references by default, so a reference
296
- * field's value is `{ ...target data, id, slug, collection, urlPath }`. The traversal only
297
- * descends into `object` and `block`, so it never looks inside one.
276
+ * Deliberately not reported: a container with no fields at all (`api/content.ts`
277
+ * falls back to `[]` for a collection with no configured entry type — "no schema"
278
+ * isn't "every key is unknown"), and anything inside a `reference` value (a resolved
279
+ * reference's value is `{ ...target data, id, slug, collection, urlPath }`; the
280
+ * traversal only descends into `object` and `block`, so it never looks inside one).
298
281
  */
299
282
  export function findUnknownKeys(fields, data) {
300
283
  return traverseFields(fields, data, () => [], '', ({ fields: containerFields, data: record, path }) => {
@@ -29,7 +29,7 @@ export type FieldVisitor<T> = (context: TraversalContext) => T[];
29
29
  * knows about. A container visitor sees the record itself, which is what a check on the data's
30
30
  * OWN keys needs (`findUnknownKeys` in entry-validator.ts).
31
31
  */
32
- export interface ContainerContext {
32
+ interface ContainerContext {
33
33
  /** The schema fields governing this record. Inline groups are NOT flattened. */
34
34
  fields: readonly FieldConfig[];
35
35
  /** The data record those fields govern. */
@@ -67,42 +67,15 @@ export declare function resolveBlockItem(blockField: BlockFieldConfig, item: Rec
67
67
  /**
68
68
  * Recursively traverse fields in data according to schema.
69
69
  *
70
- * This function walks through data following the schema structure, calling
71
- * the visitor function for each field. It handles:
72
- * - Simple fields (string, number, boolean, reference, etc.)
73
- * - Object fields with nested schemas
74
- * - Block fields (arrays of typed objects with different schemas)
75
- * - Array fields containing objects with schemas
76
- *
77
70
  * @param fields - The schema fields to traverse
78
71
  * @param data - The data object to traverse
79
72
  * @param visitor - Function called for each field, returns items to collect
80
73
  * @param pathPrefix - Current path prefix for nested fields
81
74
  * @param onContainer - Optional, called once per container (this record plus the fields
82
75
  * governing it) before its fields are walked: the top level, each object value, each
83
- * object-list item, and each block item's resolved data. Inline groups do NOT fire it — a
84
- * group is transparent to the data and shares its parent's record, so its children are already
85
- * covered by the parent's container call.
76
+ * object-list item, and each block item's resolved data.
86
77
  * @returns Array of all items returned by the visitors
87
- *
88
- * @example
89
- * ```ts
90
- * // Find all reference field values
91
- * const refs = traverseFields(schema, data, ({ field, value, path }) => {
92
- * if (field.type === 'reference') {
93
- * return [{ path, ids: Array.isArray(value) ? value : [value] }]
94
- * }
95
- * return []
96
- * })
97
- * ```
98
78
  */
99
79
  export declare function traverseFields<T>(fields: readonly FieldConfig[], data: Record<string, unknown>, visitor: FieldVisitor<T>, pathPrefix?: string, onContainer?: ContainerVisitor<T>): T[];
100
- /**
101
- * Find all fields of a specific type in the data.
102
- *
103
- * @param fields - The schema fields
104
- * @param data - The data to search
105
- * @param fieldType - The field type to find (e.g., 'reference', 'string')
106
- * @returns Array of { field, value, path } for matching fields
107
- */
108
80
  export declare function findFieldsByType(fields: readonly FieldConfig[], data: Record<string, unknown>, fieldType: string): TraversalContext[];
81
+ export {};
@@ -39,34 +39,14 @@ export function resolveBlockItem(blockField, item) {
39
39
  /**
40
40
  * Recursively traverse fields in data according to schema.
41
41
  *
42
- * This function walks through data following the schema structure, calling
43
- * the visitor function for each field. It handles:
44
- * - Simple fields (string, number, boolean, reference, etc.)
45
- * - Object fields with nested schemas
46
- * - Block fields (arrays of typed objects with different schemas)
47
- * - Array fields containing objects with schemas
48
- *
49
42
  * @param fields - The schema fields to traverse
50
43
  * @param data - The data object to traverse
51
44
  * @param visitor - Function called for each field, returns items to collect
52
45
  * @param pathPrefix - Current path prefix for nested fields
53
46
  * @param onContainer - Optional, called once per container (this record plus the fields
54
47
  * governing it) before its fields are walked: the top level, each object value, each
55
- * object-list item, and each block item's resolved data. Inline groups do NOT fire it — a
56
- * group is transparent to the data and shares its parent's record, so its children are already
57
- * covered by the parent's container call.
48
+ * object-list item, and each block item's resolved data.
58
49
  * @returns Array of all items returned by the visitors
59
- *
60
- * @example
61
- * ```ts
62
- * // Find all reference field values
63
- * const refs = traverseFields(schema, data, ({ field, value, path }) => {
64
- * if (field.type === 'reference') {
65
- * return [{ path, ids: Array.isArray(value) ? value : [value] }]
66
- * }
67
- * return []
68
- * })
69
- * ```
70
50
  */
71
51
  export function traverseFields(fields, data, visitor, pathPrefix = '', onContainer) {
72
52
  return walkFields(fields, data, visitor, pathPrefix, onContainer, true);
@@ -92,12 +72,9 @@ function walkFields(fields, data, visitor, pathPrefix, onContainer, fireContaine
92
72
  results.push(...walkFields(field.fields, data, visitor, pathPrefix, onContainer, false));
93
73
  continue;
94
74
  }
95
- // Skip undefined/null values for all other field types
96
75
  if (value === undefined || value === null)
97
76
  continue;
98
- // Let visitor handle this field first
99
77
  results.push(...visitor({ field, value, path: fieldPath }));
100
- // Then recurse into nested structures
101
78
  if (field.type === 'object') {
102
79
  const objectField = field;
103
80
  if (objectField.fields) {
@@ -130,14 +107,6 @@ function walkFields(fields, data, visitor, pathPrefix, onContainer, fireContaine
130
107
  }
131
108
  return results;
132
109
  }
133
- /**
134
- * Find all fields of a specific type in the data.
135
- *
136
- * @param fields - The schema fields
137
- * @param data - The data to search
138
- * @param fieldType - The field type to find (e.g., 'reference', 'string')
139
- * @returns Array of { field, value, path } for matching fields
140
- */
141
110
  export function findFieldsByType(fields, data, fieldType) {
142
111
  return traverseFields(fields, data, (ctx) => {
143
112
  if (ctx.field.type === fieldType) {
@@ -12,30 +12,17 @@ export interface ValidationResult {
12
12
  }
13
13
  /**
14
14
  * ReferenceValidator validates that referenced content IDs exist and match collection constraints.
15
- *
16
- * This class provides validation for:
17
- * - ID format validation (valid short UUID)
18
- * - ID existence validation (entry actually exists)
19
- * - Collection constraint validation (entry is in allowed collections)
20
- *
21
- * Usage:
22
- * const validator = new ReferenceValidator(idIndex, schema)
23
- * const result = await validator.validate(entryData)
24
- * if (!result.valid) {
25
- * console.error('Validation errors:', result.errors)
26
- * }
27
15
  */
28
16
  export declare class ReferenceValidator {
29
17
  private idIndex;
30
18
  private schema;
31
19
  private resolveCollection?;
32
20
  /**
33
- * @param resolveCollection - Resolves a schema-declared collection name
34
- * (the documented unprefixed form, e.g. 'posts') to its canonical logical
35
- * path (e.g. 'content/posts'), typically `ContentStore.resolveCollectionItem`.
36
- * Keeps the write boundary consistent with reference-option loading: any
37
- * entry the dropdown offers must also pass validation. Without a resolver,
38
- * names are compared as-is against the index's logical collection paths.
21
+ * @param resolveCollection - Resolves a schema-declared collection name (e.g.
22
+ * 'posts') to its canonical logical path (e.g. 'content/posts'), typically
23
+ * `ContentStore.resolveCollectionItem` — keeps validation consistent with
24
+ * reference-option loading, so any entry the dropdown offers also passes.
25
+ * Without it, names are compared as-is against the index's logical paths.
39
26
  */
40
27
  constructor(idIndex: ContentIdIndex, schema: readonly FieldConfig[], resolveCollection?: ((name: string) => string | undefined) | undefined);
41
28
  /**
@@ -45,12 +32,6 @@ export declare class ReferenceValidator {
45
32
  * allowed collection are allowed.
46
33
  */
47
34
  private collectionAllowed;
48
- /**
49
- * Validate all reference fields in the provided data.
50
- *
51
- * @param data - The entry data to validate
52
- * @returns Validation result with any errors found
53
- */
54
35
  validate(data: Record<string, unknown>): Promise<ValidationResult>;
55
36
  /**
56
37
  * Validate a single reference ID.
@@ -4,27 +4,14 @@ import { isValidId } from '../id.js';
4
4
  import { findFieldsByType } from './field-traversal.js';
5
5
  /**
6
6
  * ReferenceValidator validates that referenced content IDs exist and match collection constraints.
7
- *
8
- * This class provides validation for:
9
- * - ID format validation (valid short UUID)
10
- * - ID existence validation (entry actually exists)
11
- * - Collection constraint validation (entry is in allowed collections)
12
- *
13
- * Usage:
14
- * const validator = new ReferenceValidator(idIndex, schema)
15
- * const result = await validator.validate(entryData)
16
- * if (!result.valid) {
17
- * console.error('Validation errors:', result.errors)
18
- * }
19
7
  */
20
8
  export class ReferenceValidator {
21
9
  /**
22
- * @param resolveCollection - Resolves a schema-declared collection name
23
- * (the documented unprefixed form, e.g. 'posts') to its canonical logical
24
- * path (e.g. 'content/posts'), typically `ContentStore.resolveCollectionItem`.
25
- * Keeps the write boundary consistent with reference-option loading: any
26
- * entry the dropdown offers must also pass validation. Without a resolver,
27
- * names are compared as-is against the index's logical collection paths.
10
+ * @param resolveCollection - Resolves a schema-declared collection name (e.g.
11
+ * 'posts') to its canonical logical path (e.g. 'content/posts'), typically
12
+ * `ContentStore.resolveCollectionItem` — keeps validation consistent with
13
+ * reference-option loading, so any entry the dropdown offers also passes.
14
+ * Without it, names are compared as-is against the index's logical paths.
28
15
  */
29
16
  constructor(idIndex, schema, resolveCollection) {
30
17
  this.idIndex = idIndex;
@@ -44,15 +31,8 @@ export class ReferenceValidator {
44
31
  return entryCollection === canonical || entryCollection?.startsWith(canonical + '/');
45
32
  });
46
33
  }
47
- /**
48
- * Validate all reference fields in the provided data.
49
- *
50
- * @param data - The entry data to validate
51
- * @returns Validation result with any errors found
52
- */
53
34
  async validate(data) {
54
35
  const errors = [];
55
- // Use shared field traversal to find all reference fields
56
36
  const refContexts = findFieldsByType(this.schema, data, 'reference');
57
37
  const refs = refContexts.map((ctx) => ({
58
38
  field: ctx.field,
@@ -68,7 +48,6 @@ export class ReferenceValidator {
68
48
  // means "no reference", not a malformed ID.
69
49
  if (id == null || id === '')
70
50
  continue;
71
- // Validate ID format
72
51
  if (typeof id !== 'string' || !isValidId(id)) {
73
52
  errors.push({
74
53
  field: field.name,
@@ -78,7 +57,6 @@ export class ReferenceValidator {
78
57
  });
79
58
  continue;
80
59
  }
81
- // Validate ID exists
82
60
  const location = this.idIndex.findById(id);
83
61
  if (!location) {
84
62
  errors.push({
@@ -89,7 +67,6 @@ export class ReferenceValidator {
89
67
  });
90
68
  continue;
91
69
  }
92
- // Validate location is an entry (not a collection)
93
70
  if (location.type !== 'entry') {
94
71
  errors.push({
95
72
  field: field.name,
@@ -99,7 +76,6 @@ export class ReferenceValidator {
99
76
  });
100
77
  continue;
101
78
  }
102
- // Validate collection constraint
103
79
  if (field.collections && field.collections.length > 0) {
104
80
  const allowed = this.collectionAllowed(location.collection, field.collections);
105
81
  if (!allowed) {
@@ -112,7 +88,6 @@ export class ReferenceValidator {
112
88
  continue;
113
89
  }
114
90
  }
115
- // Validate entry type constraint
116
91
  if (field.entryTypes && field.entryTypes.length > 0) {
117
92
  const entryType = extractEntryTypeFromFilename(path.basename(location.relativePath));
118
93
  if (!entryType || !field.entryTypes.includes(entryType)) {