canopycms 0.0.68-int.98 → 0.1.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 (688) hide show
  1. package/CHANGELOG.md +2131 -0
  2. package/README.md +47 -63
  3. package/dist/ai/generate.d.ts +5 -0
  4. package/dist/ai/generate.js +244 -115
  5. package/dist/ai/index.d.ts +1 -1
  6. package/dist/ai/json-to-markdown.d.ts +21 -1
  7. package/dist/ai/json-to-markdown.js +120 -57
  8. package/dist/ai/references.d.ts +72 -0
  9. package/dist/ai/references.js +223 -0
  10. package/dist/ai/resolve-branch.js +9 -2
  11. package/dist/ai/to-plain-text.d.ts +17 -8
  12. package/dist/ai/to-plain-text.js +18 -15
  13. package/dist/ai/types.d.ts +84 -3
  14. package/dist/api/admin-branch-health.d.ts +24 -1
  15. package/dist/api/admin-branch-health.js +52 -20
  16. package/dist/api/admin.d.ts +23 -5
  17. package/dist/api/admin.js +36 -1
  18. package/dist/api/assets.js +88 -78
  19. package/dist/api/branch-create-window.d.ts +12 -0
  20. package/dist/api/branch-create-window.js +13 -0
  21. package/dist/api/branch-merge.d.ts +1 -1
  22. package/dist/api/branch-merge.js +1 -1
  23. package/dist/api/branch-review.d.ts +3 -3
  24. package/dist/api/branch-review.js +16 -7
  25. package/dist/api/branch-status.d.ts +16 -6
  26. package/dist/api/branch-status.js +57 -12
  27. package/dist/api/branch-withdraw.d.ts +2 -2
  28. package/dist/api/branch-withdraw.js +8 -3
  29. package/dist/api/branch.d.ts +25 -12
  30. package/dist/api/branch.js +164 -103
  31. package/dist/api/client.d.ts +78 -58
  32. package/dist/api/client.js +150 -117
  33. package/dist/api/comments.d.ts +12 -3
  34. package/dist/api/comments.js +118 -9
  35. package/dist/api/content.d.ts +9 -9
  36. package/dist/api/content.js +131 -22
  37. package/dist/api/entries-constants.d.ts +14 -3
  38. package/dist/api/entries-constants.js +14 -3
  39. package/dist/api/entries.d.ts +40 -2
  40. package/dist/api/entries.js +102 -6
  41. package/dist/api/github-sync.d.ts +19 -0
  42. package/dist/api/github-sync.js +50 -3
  43. package/dist/api/groups.d.ts +4 -4
  44. package/dist/api/groups.js +2 -1
  45. package/dist/api/guards.js +23 -3
  46. package/dist/api/index.d.ts +3 -1
  47. package/dist/api/index.js +1 -0
  48. package/dist/api/permissions.d.ts +21 -2
  49. package/dist/api/permissions.js +50 -3
  50. package/dist/api/request-deadline.d.ts +59 -0
  51. package/dist/api/request-deadline.js +73 -0
  52. package/dist/api/resolve-references.js +8 -7
  53. package/dist/api/route-builder.d.ts +14 -0
  54. package/dist/api/route-builder.js +14 -1
  55. package/dist/api/schema.d.ts +11 -9
  56. package/dist/api/schema.js +2 -0
  57. package/dist/api/settings-helpers.d.ts +5 -1
  58. package/dist/api/settings-helpers.js +10 -2
  59. package/dist/api/types.d.ts +18 -0
  60. package/dist/api/users-constants.d.ts +6 -0
  61. package/dist/api/users-constants.js +6 -0
  62. package/dist/assets/asset-url.d.ts +28 -16
  63. package/dist/assets/asset-url.js +51 -25
  64. package/dist/assets/finalize.js +3 -0
  65. package/dist/assets/index.d.ts +1 -1
  66. package/dist/assets/materialize.d.ts +153 -0
  67. package/dist/assets/materialize.js +402 -0
  68. package/dist/assets/store-local.d.ts +19 -5
  69. package/dist/assets/store-local.js +69 -10
  70. package/dist/assets/store-s3.d.ts +38 -7
  71. package/dist/assets/store-s3.js +128 -22
  72. package/dist/assets/transform-directives.d.ts +52 -13
  73. package/dist/assets/transform-directives.js +87 -27
  74. package/dist/assets/transform.d.ts +3 -3
  75. package/dist/assets/transform.js +13 -8
  76. package/dist/assets/types.d.ts +31 -4
  77. package/dist/auth/cache.d.ts +1 -1
  78. package/dist/auth/cache.js +1 -1
  79. package/dist/auth/caching-auth-plugin.d.ts +2 -0
  80. package/dist/auth/caching-auth-plugin.js +12 -2
  81. package/dist/auth/file-based-auth-cache.d.ts +8 -0
  82. package/dist/auth/file-based-auth-cache.js +18 -8
  83. package/dist/auth/person-name.d.ts +5 -0
  84. package/dist/auth/person-name.js +8 -0
  85. package/dist/auth/plugin.d.ts +10 -1
  86. package/dist/auth/types.d.ts +2 -0
  87. package/dist/auth/user-metadata-lookup.d.ts +21 -0
  88. package/dist/auth/user-metadata-lookup.js +116 -0
  89. package/dist/authorization/branch.d.ts +1 -1
  90. package/dist/authorization/branch.js +12 -13
  91. package/dist/authorization/groups/schema.d.ts +4 -4
  92. package/dist/authorization/helpers.d.ts +8 -0
  93. package/dist/authorization/helpers.js +8 -0
  94. package/dist/authorization/index.d.ts +1 -1
  95. package/dist/authorization/index.js +1 -1
  96. package/dist/authorization/protected-branch.d.ts +5 -4
  97. package/dist/authorization/protected-branch.js +7 -5
  98. package/dist/branch-health.d.ts +35 -8
  99. package/dist/branch-health.js +54 -18
  100. package/dist/branch-metadata-error.d.ts +27 -0
  101. package/dist/branch-metadata-error.js +23 -0
  102. package/dist/branch-metadata-file.d.ts +205 -24
  103. package/dist/branch-metadata-file.js +126 -25
  104. package/dist/branch-metadata.d.ts +45 -6
  105. package/dist/branch-metadata.js +142 -50
  106. package/dist/branch-provisioning.d.ts +167 -0
  107. package/dist/branch-provisioning.js +501 -0
  108. package/dist/branch-registry.d.ts +8 -0
  109. package/dist/branch-registry.js +61 -9
  110. package/dist/branch-schema-cache.d.ts +29 -12
  111. package/dist/branch-schema-cache.js +64 -21
  112. package/dist/branch-sparse.d.ts +23 -0
  113. package/dist/branch-sparse.js +118 -0
  114. package/dist/branch-workspace.d.ts +42 -3
  115. package/dist/branch-workspace.js +239 -100
  116. package/dist/build/asset-refs.d.ts +94 -0
  117. package/dist/build/asset-refs.js +267 -0
  118. package/dist/build/generate-ai-content.js +5 -0
  119. package/dist/build/inline-flight.d.ts +37 -0
  120. package/dist/build/inline-flight.js +142 -0
  121. package/dist/cli/asset-refs.d.ts +52 -0
  122. package/dist/cli/asset-refs.js +194 -0
  123. package/dist/cli/cli.d.ts +15 -1
  124. package/dist/cli/cli.js +8543 -3193
  125. package/dist/cli/configured-asset-store.d.ts +12 -0
  126. package/dist/cli/configured-asset-store.js +46 -0
  127. package/dist/cli/generate-ai-content.js +4244 -1072
  128. package/dist/cli/init.js +217 -126
  129. package/dist/cli/project-detect.d.ts +2 -0
  130. package/dist/cli/project-detect.js +2 -0
  131. package/dist/cli/template-files/Dockerfile.cms.template +13 -5
  132. package/dist/cli/template-files/cms-stack.ts.template +16 -13
  133. package/dist/client.d.ts +1 -2
  134. package/dist/client.js +1 -2
  135. package/dist/comment-store.d.ts +25 -0
  136. package/dist/comment-store.js +43 -8
  137. package/dist/config/flatten.js +2 -0
  138. package/dist/config/helpers.js +2 -2
  139. package/dist/config/index.d.ts +1 -1
  140. package/dist/config/schemas/config.d.ts +12 -29
  141. package/dist/config/schemas/config.js +9 -12
  142. package/dist/config/schemas/field.d.ts +3 -0
  143. package/dist/config/schemas/field.js +58 -4
  144. package/dist/config/schemas/media.d.ts +4 -13
  145. package/dist/config/schemas/media.js +5 -8
  146. package/dist/config/schemas/url.d.ts +2 -20
  147. package/dist/config/schemas/url.js +2 -25
  148. package/dist/config/types.d.ts +116 -22
  149. package/dist/config/types.js +3 -9
  150. package/dist/config/validation.d.ts +25 -4
  151. package/dist/config/validation.js +116 -3
  152. package/dist/content-id-index.js +2 -2
  153. package/dist/content-index-generation.d.ts +1 -1
  154. package/dist/content-index-generation.js +1 -1
  155. package/dist/content-listing.d.ts +10 -1
  156. package/dist/content-listing.js +22 -5
  157. package/dist/content-reader.d.ts +9 -0
  158. package/dist/content-reader.js +16 -11
  159. package/dist/content-store.d.ts +75 -12
  160. package/dist/content-store.js +249 -86
  161. package/dist/content-tree.js +2 -2
  162. package/dist/context.js +5 -2
  163. package/dist/dangling-reference-log.d.ts +17 -0
  164. package/dist/dangling-reference-log.js +29 -0
  165. package/dist/dev-content-watcher.d.ts +1 -1
  166. package/dist/dev-content-watcher.js +1 -1
  167. package/dist/editor/BranchManager.d.ts +23 -7
  168. package/dist/editor/BranchManager.js +119 -54
  169. package/dist/editor/CanopyEditor.d.ts +1 -1
  170. package/dist/editor/CanopyEditor.js +1 -2
  171. package/dist/editor/CommentsPanel.d.ts +14 -0
  172. package/dist/editor/CommentsPanel.js +68 -43
  173. package/dist/editor/Editor.d.ts +11 -5
  174. package/dist/editor/Editor.js +891 -218
  175. package/dist/editor/EditorAuthGate.d.ts +7 -1
  176. package/dist/editor/EditorAuthGate.js +41 -9
  177. package/dist/editor/EntryNavigator.d.ts +22 -0
  178. package/dist/editor/EntryNavigator.js +353 -105
  179. package/dist/editor/FormHeader.d.ts +25 -0
  180. package/dist/editor/FormHeader.js +82 -0
  181. package/dist/editor/FormRenderer.d.ts +27 -3
  182. package/dist/editor/FormRenderer.js +171 -76
  183. package/dist/editor/PreviewFrame.d.ts +40 -0
  184. package/dist/editor/PreviewFrame.js +215 -0
  185. package/dist/editor/PreviewPane.d.ts +47 -0
  186. package/dist/editor/PreviewPane.js +147 -0
  187. package/dist/editor/PreviewToolbarTools.d.ts +22 -0
  188. package/dist/editor/PreviewToolbarTools.js +73 -0
  189. package/dist/editor/admin/SystemHealthPanel.d.ts +2 -1
  190. package/dist/editor/admin/SystemHealthPanel.js +163 -33
  191. package/dist/editor/admin/useSystemHealth.d.ts +18 -0
  192. package/dist/editor/admin/useSystemHealth.js +70 -1
  193. package/dist/editor/branch-status.d.ts +17 -0
  194. package/dist/editor/branch-status.js +29 -0
  195. package/dist/editor/canopy-path.d.ts +9 -6
  196. package/dist/editor/canopy-path.js +8 -11
  197. package/dist/editor/client-reference-resolver.d.ts +43 -16
  198. package/dist/editor/client-reference-resolver.js +155 -64
  199. package/dist/editor/comments/BranchComments.d.ts +1 -1
  200. package/dist/editor/comments/BranchComments.js +2 -2
  201. package/dist/editor/comments/CloseRefusedNotice.d.ts +4 -0
  202. package/dist/editor/comments/CloseRefusedNotice.js +7 -0
  203. package/dist/editor/comments/CommentThreadsPopover.d.ts +47 -0
  204. package/dist/editor/comments/CommentThreadsPopover.js +274 -0
  205. package/dist/editor/comments/CommentWriteAlert.d.ts +11 -0
  206. package/dist/editor/comments/CommentWriteAlert.js +13 -0
  207. package/dist/editor/comments/EntryComments.d.ts +10 -4
  208. package/dist/editor/comments/EntryComments.js +14 -17
  209. package/dist/editor/comments/FieldWrapper.d.ts +18 -4
  210. package/dist/editor/comments/FieldWrapper.js +62 -28
  211. package/dist/editor/comments/InlineCommentThread.d.ts +9 -2
  212. package/dist/editor/comments/InlineCommentThread.js +11 -47
  213. package/dist/editor/comments/ThreadCarousel.d.ts +1 -1
  214. package/dist/editor/comments/ThreadCarousel.js +18 -21
  215. package/dist/editor/comments/ThreadReplyControls.d.ts +28 -0
  216. package/dist/editor/comments/ThreadReplyControls.js +92 -0
  217. package/dist/editor/comments/field-comment-context.d.ts +14 -0
  218. package/dist/editor/comments/field-comment-context.js +14 -0
  219. package/dist/editor/comments/form-comments.d.ts +48 -0
  220. package/dist/editor/comments/form-comments.js +178 -0
  221. package/dist/editor/comments/item-anchor-copy.d.ts +6 -0
  222. package/dist/editor/comments/item-anchor-copy.js +6 -0
  223. package/dist/editor/comments/move-focus-if-unmoved.d.ts +6 -0
  224. package/dist/editor/comments/move-focus-if-unmoved.js +11 -0
  225. package/dist/editor/comments/popover-placement.d.ts +18 -0
  226. package/dist/editor/comments/popover-placement.js +58 -0
  227. package/dist/editor/comments/use-tracked-writes.d.ts +16 -0
  228. package/dist/editor/comments/use-tracked-writes.js +53 -0
  229. package/dist/editor/components/BranchAccessList.d.ts +15 -0
  230. package/dist/editor/components/BranchAccessList.js +52 -0
  231. package/dist/editor/components/BranchLockBanner.d.ts +22 -0
  232. package/dist/editor/components/BranchLockBanner.js +39 -0
  233. package/dist/editor/components/BranchPill.d.ts +32 -0
  234. package/dist/editor/components/BranchPill.js +33 -0
  235. package/dist/editor/components/BranchesDrawer.d.ts +11 -0
  236. package/dist/editor/components/BranchesDrawer.js +5 -0
  237. package/dist/editor/components/ConfirmDeleteModal.d.ts +6 -1
  238. package/dist/editor/components/ConfirmDeleteModal.js +3 -2
  239. package/dist/editor/components/DestructiveMenuItem.d.ts +7 -0
  240. package/dist/editor/components/DestructiveMenuItem.js +8 -0
  241. package/dist/editor/components/EditorCrashScreen.d.ts +17 -0
  242. package/dist/editor/components/EditorCrashScreen.js +22 -0
  243. package/dist/editor/components/EditorErrorBoundary.d.ts +38 -0
  244. package/dist/editor/components/EditorErrorBoundary.js +40 -0
  245. package/dist/editor/components/EditorHeader.d.ts +56 -106
  246. package/dist/editor/components/EditorHeader.js +130 -131
  247. package/dist/editor/components/EditorRail.d.ts +49 -0
  248. package/dist/editor/components/EditorRail.js +65 -0
  249. package/dist/editor/components/EntryBreadcrumb.d.ts +33 -0
  250. package/dist/editor/components/EntryBreadcrumb.js +56 -0
  251. package/dist/editor/components/EntryCreateModal.d.ts +12 -7
  252. package/dist/editor/components/EntryCreateModal.js +51 -57
  253. package/dist/editor/components/NoEditPermissionNotice.d.ts +6 -5
  254. package/dist/editor/components/NoEditPermissionNotice.js +5 -4
  255. package/dist/editor/components/QuickOpenPalette.d.ts +22 -0
  256. package/dist/editor/components/QuickOpenPalette.js +66 -0
  257. package/dist/editor/components/ReadOnlyDraftNotice.d.ts +11 -0
  258. package/dist/editor/components/ReadOnlyDraftNotice.js +12 -0
  259. package/dist/editor/components/ReasonedMenuItem.d.ts +15 -0
  260. package/dist/editor/components/ReasonedMenuItem.js +15 -0
  261. package/dist/editor/components/ReferencedByList.d.ts +11 -0
  262. package/dist/editor/components/ReferencedByList.js +28 -0
  263. package/dist/editor/components/RelativeTime.d.ts +10 -0
  264. package/dist/editor/components/RelativeTime.js +10 -0
  265. package/dist/editor/components/RenameEntryModal.d.ts +9 -1
  266. package/dist/editor/components/RenameEntryModal.js +19 -31
  267. package/dist/editor/components/RetryToastMessage.d.ts +9 -0
  268. package/dist/editor/components/RetryToastMessage.js +6 -0
  269. package/dist/editor/components/SaveAllResult.d.ts +25 -0
  270. package/dist/editor/components/SaveAllResult.js +86 -0
  271. package/dist/editor/components/SaveSplitButton.d.ts +30 -0
  272. package/dist/editor/components/SaveSplitButton.js +108 -0
  273. package/dist/editor/components/StagedChangesDrawer.d.ts +39 -0
  274. package/dist/editor/components/StagedChangesDrawer.js +92 -0
  275. package/dist/editor/components/UnavailableEntryNotice.d.ts +6 -0
  276. package/dist/editor/components/UnavailableEntryNotice.js +9 -0
  277. package/dist/editor/components/UnavailableTypeMessage.d.ts +6 -0
  278. package/dist/editor/components/UnavailableTypeMessage.js +9 -0
  279. package/dist/editor/components/UndoToastMessage.d.ts +18 -0
  280. package/dist/editor/components/UndoToastMessage.js +10 -0
  281. package/dist/editor/components/UserBadge.d.ts +2 -5
  282. package/dist/editor/components/UserBadge.js +62 -33
  283. package/dist/editor/components/ValidationSummary.d.ts +14 -0
  284. package/dist/editor/components/ValidationSummary.js +24 -0
  285. package/dist/editor/components/index.d.ts +2 -2
  286. package/dist/editor/components/index.js +2 -2
  287. package/dist/editor/context/ApiClientContext.d.ts +8 -2
  288. package/dist/editor/context/ApiClientContext.js +19 -8
  289. package/dist/editor/context/AssetContext.d.ts +13 -35
  290. package/dist/editor/context/AssetContext.js +12 -31
  291. package/dist/editor/context/EditorStateContext.d.ts +4 -4
  292. package/dist/editor/context/EditorStateContext.js +4 -4
  293. package/dist/editor/context/SWRProvider.d.ts +3 -3
  294. package/dist/editor/context/SiteMdxAllowContext.d.ts +4 -0
  295. package/dist/editor/context/SiteMdxAllowContext.js +7 -0
  296. package/dist/editor/context/index.d.ts +2 -1
  297. package/dist/editor/context/index.js +2 -1
  298. package/dist/editor/contrast.d.ts +19 -0
  299. package/dist/editor/contrast.js +41 -0
  300. package/dist/editor/copy.d.ts +18 -0
  301. package/dist/editor/copy.js +18 -0
  302. package/dist/editor/editor-config.js +16 -0
  303. package/dist/editor/editor-utils.d.ts +34 -8
  304. package/dist/editor/editor-utils.js +42 -20
  305. package/dist/editor/entry-search.d.ts +20 -0
  306. package/dist/editor/entry-search.js +34 -0
  307. package/dist/editor/field-breadcrumb.d.ts +12 -0
  308. package/dist/editor/field-breadcrumb.js +85 -0
  309. package/dist/editor/field-props.d.ts +86 -0
  310. package/dist/editor/field-props.js +27 -0
  311. package/dist/editor/field-target.d.ts +30 -0
  312. package/dist/editor/field-target.js +77 -0
  313. package/dist/editor/fields/BlockField.d.ts +12 -0
  314. package/dist/editor/fields/BlockField.js +89 -73
  315. package/dist/editor/fields/CodeField.d.ts +2 -0
  316. package/dist/editor/fields/CodeField.js +6 -2
  317. package/dist/editor/fields/DateTimeField.d.ts +4 -29
  318. package/dist/editor/fields/DateTimeField.js +79 -41
  319. package/dist/editor/fields/ExpandAllButton.d.ts +6 -0
  320. package/dist/editor/fields/ExpandAllButton.js +4 -0
  321. package/dist/editor/fields/FieldCrashFallback.d.ts +17 -0
  322. package/dist/editor/fields/FieldCrashFallback.js +30 -0
  323. package/dist/editor/fields/FieldLabel.d.ts +37 -0
  324. package/dist/editor/fields/FieldLabel.js +19 -0
  325. package/dist/editor/fields/ImageField.d.ts +4 -0
  326. package/dist/editor/fields/ImageField.js +29 -14
  327. package/dist/editor/fields/InlineGroupField.js +4 -3
  328. package/dist/editor/fields/ItemList.d.ts +42 -0
  329. package/dist/editor/fields/ItemList.js +130 -0
  330. package/dist/editor/fields/MarkdownField.d.ts +32 -0
  331. package/dist/editor/fields/MarkdownField.js +223 -46
  332. package/dist/editor/fields/MdxImageDialog.js +1 -1
  333. package/dist/editor/fields/NumberField.d.ts +2 -0
  334. package/dist/editor/fields/NumberField.js +8 -5
  335. package/dist/editor/fields/NumberListField.d.ts +2 -0
  336. package/dist/editor/fields/NumberListField.js +19 -16
  337. package/dist/editor/fields/ObjectField.d.ts +2 -7
  338. package/dist/editor/fields/ObjectField.js +15 -5
  339. package/dist/editor/fields/ObjectListField.d.ts +29 -0
  340. package/dist/editor/fields/ObjectListField.js +57 -0
  341. package/dist/editor/fields/ReferenceField.d.ts +2 -0
  342. package/dist/editor/fields/ReferenceField.js +34 -9
  343. package/dist/editor/fields/SelectField.d.ts +2 -0
  344. package/dist/editor/fields/SelectField.js +11 -2
  345. package/dist/editor/fields/StringListField.d.ts +4 -1
  346. package/dist/editor/fields/StringListField.js +22 -8
  347. package/dist/editor/fields/TextField.d.ts +2 -0
  348. package/dist/editor/fields/TextField.js +6 -2
  349. package/dist/editor/fields/ToggleField.d.ts +2 -0
  350. package/dist/editor/fields/ToggleField.js +8 -3
  351. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +1 -1
  352. package/dist/editor/fields/entry-link/InsertEntryLink.js +1 -1
  353. package/dist/editor/fields/form-expansion.d.ts +9 -0
  354. package/dist/editor/fields/form-expansion.js +2 -0
  355. package/dist/editor/fields/item-expansion.d.ts +15 -0
  356. package/dist/editor/fields/item-expansion.js +60 -0
  357. package/dist/editor/fields/list-item-keys.d.ts +8 -0
  358. package/dist/editor/fields/list-item-keys.js +50 -0
  359. package/dist/editor/fields/list-item-title.d.ts +20 -0
  360. package/dist/editor/fields/list-item-title.js +85 -0
  361. package/dist/editor/fields/markdown-export-options.d.ts +2 -0
  362. package/dist/editor/fields/markdown-export-options.js +8 -0
  363. package/dist/editor/fields/markdown-fidelity-visitors.d.ts +11 -0
  364. package/dist/editor/fields/markdown-fidelity-visitors.js +160 -0
  365. package/dist/editor/fields/mdx-jsx-support.d.ts +5 -1
  366. package/dist/editor/fields/mdx-jsx-support.js +157 -69
  367. package/dist/editor/fields/rich-text-failures.d.ts +5 -0
  368. package/dist/editor/fields/rich-text-failures.js +26 -0
  369. package/dist/editor/fields/toolbar-wrap.d.ts +7 -0
  370. package/dist/editor/fields/toolbar-wrap.js +35 -0
  371. package/dist/editor/form-outline.d.ts +13 -0
  372. package/dist/editor/form-outline.js +70 -0
  373. package/dist/editor/group-manager/GroupCard.d.ts +4 -1
  374. package/dist/editor/group-manager/GroupCard.js +12 -3
  375. package/dist/editor/group-manager/GroupForm.js +1 -1
  376. package/dist/editor/group-manager/InternalGroupsTab.d.ts +2 -1
  377. package/dist/editor/group-manager/InternalGroupsTab.js +4 -4
  378. package/dist/editor/group-manager/MemberList.d.ts +2 -1
  379. package/dist/editor/group-manager/MemberList.js +15 -4
  380. package/dist/editor/group-manager/hooks/useGroupState.d.ts +5 -0
  381. package/dist/editor/group-manager/hooks/useGroupState.js +30 -7
  382. package/dist/editor/group-manager/index.js +34 -5
  383. package/dist/editor/group-manager/types.d.ts +5 -2
  384. package/dist/editor/hooks/create-branch-request.d.ts +20 -0
  385. package/dist/editor/hooks/create-branch-request.js +54 -0
  386. package/dist/editor/hooks/save-all.d.ts +68 -0
  387. package/dist/editor/hooks/save-all.js +61 -0
  388. package/dist/editor/hooks/useBranchActions.d.ts +11 -1
  389. package/dist/editor/hooks/useBranchActions.js +42 -19
  390. package/dist/editor/hooks/useBranchManager.d.ts +21 -0
  391. package/dist/editor/hooks/useBranchManager.js +321 -125
  392. package/dist/editor/hooks/useBranchesData.d.ts +8 -4
  393. package/dist/editor/hooks/useBranchesData.js +9 -5
  394. package/dist/editor/hooks/useCommentSystem.d.ts +14 -2
  395. package/dist/editor/hooks/useCommentSystem.js +79 -55
  396. package/dist/editor/hooks/useCommentsData.d.ts +11 -7
  397. package/dist/editor/hooks/useCommentsData.js +20 -19
  398. package/dist/editor/hooks/useDraftManager.d.ts +77 -3
  399. package/dist/editor/hooks/useDraftManager.js +887 -94
  400. package/dist/editor/hooks/useEditorLayout.d.ts +53 -7
  401. package/dist/editor/hooks/useEditorLayout.js +98 -20
  402. package/dist/editor/hooks/useEntriesData.d.ts +2 -1
  403. package/dist/editor/hooks/useEntriesData.js +18 -4
  404. package/dist/editor/hooks/useEntryManager.d.ts +41 -2
  405. package/dist/editor/hooks/useEntryManager.js +227 -41
  406. package/dist/editor/hooks/useGroupManager.js +13 -16
  407. package/dist/editor/hooks/usePermissionManager.js +14 -6
  408. package/dist/editor/hooks/usePreviewMarks.d.ts +21 -0
  409. package/dist/editor/hooks/usePreviewMarks.js +33 -0
  410. package/dist/editor/hooks/useReferenceResolution.d.ts +10 -3
  411. package/dist/editor/hooks/useReferenceResolution.js +34 -177
  412. package/dist/editor/hooks/useSchemaManager.d.ts +25 -6
  413. package/dist/editor/hooks/useSchemaManager.js +97 -39
  414. package/dist/editor/hooks/useUserMetadata.d.ts +14 -4
  415. package/dist/editor/hooks/useUserMetadata.js +76 -47
  416. package/dist/editor/hooks/user-metadata-batcher.d.ts +8 -0
  417. package/dist/editor/hooks/user-metadata-batcher.js +33 -0
  418. package/dist/editor/media/AssetCard.d.ts +6 -7
  419. package/dist/editor/media/AssetCard.js +24 -31
  420. package/dist/editor/media/AssetListRow.d.ts +16 -0
  421. package/dist/editor/media/AssetListRow.js +41 -0
  422. package/dist/editor/media/CropStep.js +6 -1
  423. package/dist/editor/media/MediaLibrary.d.ts +4 -3
  424. package/dist/editor/media/MediaLibrary.js +11 -4
  425. package/dist/editor/media/MediaLibraryBody.d.ts +3 -3
  426. package/dist/editor/media/MediaLibraryBody.js +195 -80
  427. package/dist/editor/media/MediaLibrarySkeleton.d.ts +6 -0
  428. package/dist/editor/media/MediaLibrarySkeleton.js +14 -0
  429. package/dist/editor/media/crop-math.d.ts +3 -4
  430. package/dist/editor/media/crop-math.js +11 -22
  431. package/dist/editor/media/editor-image-src.d.ts +8 -0
  432. package/dist/editor/media/editor-image-src.js +10 -0
  433. package/dist/editor/media/format-bytes.d.ts +2 -0
  434. package/dist/editor/media/format-bytes.js +23 -0
  435. package/dist/editor/media/media-library-prefs.d.ts +23 -0
  436. package/dist/editor/media/media-library-prefs.js +49 -0
  437. package/dist/editor/media/media-library-view.d.ts +34 -0
  438. package/dist/editor/media/media-library-view.js +40 -0
  439. package/dist/editor/media/useAssetLibrary.d.ts +30 -0
  440. package/dist/editor/media/useAssetLibrary.js +126 -0
  441. package/dist/editor/media/useStableAssetOrder.d.ts +11 -0
  442. package/dist/editor/media/useStableAssetOrder.js +37 -0
  443. package/dist/editor/media/useThumbnailFailure.d.ts +6 -0
  444. package/dist/editor/media/useThumbnailFailure.js +16 -0
  445. package/dist/editor/permission-manager/GroupSelector.js +2 -2
  446. package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -1
  447. package/dist/editor/permission-manager/PermissionEditor.js +15 -4
  448. package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
  449. package/dist/editor/permission-manager/PermissionTree.d.ts +1 -1
  450. package/dist/editor/permission-manager/UserSelector.d.ts +1 -1
  451. package/dist/editor/permission-manager/UserSelector.js +3 -3
  452. package/dist/editor/permission-manager/index.js +12 -3
  453. package/dist/editor/permission-manager/types.d.ts +5 -2
  454. package/dist/editor/platform.d.ts +3 -0
  455. package/dist/editor/platform.js +9 -0
  456. package/dist/editor/preview-asset-base.d.ts +9 -0
  457. package/dist/editor/preview-asset-base.js +17 -0
  458. package/dist/editor/preview-bridge.d.ts +51 -27
  459. package/dist/editor/preview-bridge.js +103 -144
  460. package/dist/editor/preview-marks.d.ts +15 -0
  461. package/dist/editor/preview-marks.js +74 -0
  462. package/dist/editor/preview-path.d.ts +12 -0
  463. package/dist/editor/preview-path.js +45 -1
  464. package/dist/editor/preview-scale.d.ts +27 -0
  465. package/dist/editor/preview-scale.js +34 -0
  466. package/dist/editor/raw-asset-base.d.ts +5 -0
  467. package/dist/editor/raw-asset-base.js +14 -0
  468. package/dist/editor/relative-time.d.ts +4 -4
  469. package/dist/editor/relative-time.js +16 -8
  470. package/dist/editor/schema-editor/CollectionEditor.d.ts +20 -3
  471. package/dist/editor/schema-editor/CollectionEditor.js +361 -62
  472. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +5 -1
  473. package/dist/editor/schema-editor/EntryTypeEditor.js +11 -6
  474. package/dist/editor/schema-editor/collection-draft.d.ts +22 -0
  475. package/dist/editor/schema-editor/collection-draft.js +40 -0
  476. package/dist/editor/schema-editor/index.d.ts +1 -1
  477. package/dist/editor/schema-label.d.ts +10 -0
  478. package/dist/editor/schema-label.js +17 -0
  479. package/dist/editor/settings-conflict.d.ts +5 -0
  480. package/dist/editor/settings-conflict.js +8 -0
  481. package/dist/editor/shell/ActivityRail.d.ts +37 -0
  482. package/dist/editor/shell/ActivityRail.js +91 -0
  483. package/dist/editor/shell/EditorShell.d.ts +17 -0
  484. package/dist/editor/shell/EditorShell.js +31 -0
  485. package/dist/editor/shell/PaneLayout.d.ts +28 -0
  486. package/dist/editor/shell/PaneLayout.js +116 -0
  487. package/dist/editor/shell/SidePanelHost.d.ts +35 -0
  488. package/dist/editor/shell/SidePanelHost.js +184 -0
  489. package/dist/editor/shell/TopBar.d.ts +12 -0
  490. package/dist/editor/shell/TopBar.js +14 -0
  491. package/dist/editor/shell/host-chrome.d.ts +16 -0
  492. package/dist/editor/shell/host-chrome.js +69 -0
  493. package/dist/editor/slug.d.ts +16 -0
  494. package/dist/editor/slug.js +43 -0
  495. package/dist/editor/theme.d.ts +2 -1
  496. package/dist/editor/theme.js +314 -13
  497. package/dist/editor/unanswered.d.ts +17 -0
  498. package/dist/editor/unanswered.js +26 -0
  499. package/dist/editor/unavailable-entry-type.d.ts +20 -0
  500. package/dist/editor/unavailable-entry-type.js +28 -0
  501. package/dist/editor/undo-removal.d.ts +57 -0
  502. package/dist/editor/undo-removal.js +163 -0
  503. package/dist/editor/user-display.d.ts +4 -0
  504. package/dist/editor/user-display.js +5 -0
  505. package/dist/editor/utils/confirm-modal.d.ts +8 -0
  506. package/dist/editor/utils/confirm-modal.js +12 -0
  507. package/dist/editor/utils/editor-errors.d.ts +19 -0
  508. package/dist/editor/utils/editor-errors.js +32 -0
  509. package/dist/editor/utils/focus-return.d.ts +56 -0
  510. package/dist/editor/utils/focus-return.js +106 -0
  511. package/dist/entry-link-resolver.d.ts +11 -1
  512. package/dist/entry-link-resolver.js +65 -5
  513. package/dist/entry-schema-registry.d.ts +3 -3
  514. package/dist/entry-schema-registry.js +7 -4
  515. package/dist/entry-schema.d.ts +49 -3
  516. package/dist/entry-schema.js +18 -0
  517. package/dist/git-manager.d.ts +172 -10
  518. package/dist/git-manager.js +449 -107
  519. package/dist/github-service.d.ts +39 -2
  520. package/dist/github-service.js +101 -7
  521. package/dist/http/handler.js +74 -9
  522. package/dist/http/types.d.ts +2 -0
  523. package/dist/http/worker-not-ready.d.ts +9 -4
  524. package/dist/http/worker-not-ready.js +59 -6
  525. package/dist/index.d.ts +2 -0
  526. package/dist/index.js +3 -0
  527. package/dist/item-keys.d.ts +46 -0
  528. package/dist/item-keys.js +235 -0
  529. package/dist/operating-mode/editor-mode-check.d.ts +15 -0
  530. package/dist/operating-mode/editor-mode-check.js +24 -0
  531. package/dist/operating-mode/mode-env.d.ts +13 -14
  532. package/dist/operating-mode/mode-env.js +13 -14
  533. package/dist/operating-mode/types.d.ts +2 -2
  534. package/dist/paths/branch.d.ts +0 -1
  535. package/dist/paths/branch.js +1 -8
  536. package/dist/paths/index.d.ts +1 -1
  537. package/dist/paths/index.js +1 -1
  538. package/dist/paths/validation.js +0 -2
  539. package/dist/preview.d.ts +8 -0
  540. package/dist/preview.js +7 -0
  541. package/dist/reference-resolver.js +1 -0
  542. package/dist/resolve-canopy-user.d.ts +1 -1
  543. package/dist/resolve-canopy-user.js +1 -1
  544. package/dist/schema/meta-loader.d.ts +18 -8
  545. package/dist/schema/meta-loader.js +42 -9
  546. package/dist/schema/registry-fingerprint.d.ts +14 -0
  547. package/dist/schema/registry-fingerprint.js +63 -0
  548. package/dist/schema/resolver.d.ts +7 -4
  549. package/dist/schema/resolver.js +7 -6
  550. package/dist/schema/schema-store.d.ts +7 -10
  551. package/dist/schema/schema-store.js +13 -11
  552. package/dist/schema/schema-unavailable-error.d.ts +11 -0
  553. package/dist/schema/schema-unavailable-error.js +15 -0
  554. package/dist/schema/types.d.ts +22 -0
  555. package/dist/schema-registry-record.d.ts +35 -0
  556. package/dist/schema-registry-record.js +134 -0
  557. package/dist/server.d.ts +79 -9
  558. package/dist/server.js +62 -8
  559. package/dist/services.d.ts +33 -5
  560. package/dist/services.js +155 -37
  561. package/dist/settings-workspace.d.ts +23 -3
  562. package/dist/settings-workspace.js +159 -45
  563. package/dist/stamp-on-publish.d.ts +36 -0
  564. package/dist/stamp-on-publish.js +71 -0
  565. package/dist/static/index.d.ts +58 -5
  566. package/dist/static/index.js +133 -3
  567. package/dist/static/seo.d.ts +5 -5
  568. package/dist/static/seo.js +5 -5
  569. package/dist/submission-attribution.d.ts +8 -0
  570. package/dist/submission-attribution.js +22 -0
  571. package/dist/system-users.d.ts +12 -0
  572. package/dist/system-users.js +12 -0
  573. package/dist/task-queue/cms-task-queue.d.ts +1 -1
  574. package/dist/task-queue/cms-task-queue.js +1 -1
  575. package/dist/task-queue/index.d.ts +1 -1
  576. package/dist/task-queue/index.js +1 -1
  577. package/dist/task-queue/task-queue.d.ts +6 -0
  578. package/dist/task-queue/task-queue.js +29 -0
  579. package/dist/task-queue/worker-status.d.ts +35 -9
  580. package/dist/task-queue/worker-status.js +84 -17
  581. package/dist/types.d.ts +90 -9
  582. package/dist/url-collision.js +3 -3
  583. package/dist/url-exclusivity-fixtures.d.ts +8 -1
  584. package/dist/url-exclusivity-fixtures.js +11 -1
  585. package/dist/user.js +2 -1
  586. package/dist/utils/atomic-write.js +2 -1
  587. package/dist/utils/base-branch.d.ts +13 -0
  588. package/dist/utils/base-branch.js +23 -0
  589. package/dist/utils/content-serialize.d.ts +15 -7
  590. package/dist/utils/content-serialize.js +353 -51
  591. package/dist/utils/content-write-lock.d.ts +6 -1
  592. package/dist/utils/content-write-lock.js +21 -6
  593. package/dist/utils/debug.d.ts +1 -1
  594. package/dist/utils/debug.js +5 -3
  595. package/dist/utils/error.js +13 -2
  596. package/dist/utils/escape-text.d.ts +7 -0
  597. package/dist/utils/escape-text.js +27 -0
  598. package/dist/utils/fs.d.ts +12 -4
  599. package/dist/utils/fs.js +18 -5
  600. package/dist/utils/git.d.ts +21 -1
  601. package/dist/utils/git.js +63 -8
  602. package/dist/utils/json-source-splice.d.ts +14 -0
  603. package/dist/utils/json-source-splice.js +120 -0
  604. package/dist/utils/markdown-body-splice.d.ts +39 -0
  605. package/dist/utils/markdown-body-splice.js +421 -0
  606. package/dist/utils/occ-json-write.js +18 -12
  607. package/dist/utils/provision-log.d.ts +25 -0
  608. package/dist/utils/provision-log.js +49 -0
  609. package/dist/utils/provisioning-lock.d.ts +32 -1
  610. package/dist/utils/provisioning-lock.js +78 -32
  611. package/dist/utils/sanitize-href.d.ts +9 -23
  612. package/dist/utils/sanitize-href.js +14 -28
  613. package/dist/utils/title-field.d.ts +10 -0
  614. package/dist/utils/title-field.js +47 -0
  615. package/dist/utils/yaml-source-splice.d.ts +58 -0
  616. package/dist/utils/yaml-source-splice.js +515 -0
  617. package/dist/validation/block-structural-keys.d.ts +1 -1
  618. package/dist/validation/block-structural-keys.js +1 -1
  619. package/dist/validation/deletion-checker.d.ts +21 -29
  620. package/dist/validation/deletion-checker.js +41 -117
  621. package/dist/validation/entry-validator.d.ts +6 -10
  622. package/dist/validation/entry-validator.js +19 -26
  623. package/dist/validation/field-traversal.d.ts +22 -0
  624. package/dist/validation/field-traversal.js +39 -8
  625. package/dist/validation/markdown-safety.d.ts +68 -0
  626. package/dist/validation/markdown-safety.js +596 -0
  627. package/dist/validation/mdx-allowlist.d.ts +55 -0
  628. package/dist/validation/mdx-allowlist.js +183 -0
  629. package/dist/validation/reference-validator.d.ts +2 -0
  630. package/dist/validation/reference-validator.js +3 -0
  631. package/dist/version.d.ts +1 -1
  632. package/dist/version.js +1 -1
  633. package/dist/worker/branch-policy.d.ts +124 -0
  634. package/dist/worker/branch-policy.js +243 -0
  635. package/dist/worker/bundle-header.d.ts +117 -0
  636. package/dist/worker/bundle-header.js +253 -0
  637. package/dist/worker/cms-worker.d.ts +236 -142
  638. package/dist/worker/cms-worker.js +772 -285
  639. package/dist/worker/gateway-egress.d.ts +43 -0
  640. package/dist/worker/gateway-egress.js +209 -0
  641. package/dist/worker/gateway-instance.d.ts +42 -0
  642. package/dist/worker/gateway-instance.js +129 -0
  643. package/dist/worker/git-process.d.ts +81 -0
  644. package/dist/worker/git-process.js +234 -0
  645. package/dist/worker/git-sync.d.ts +34 -17
  646. package/dist/worker/git-sync.js +394 -131
  647. package/dist/worker/github-auth.d.ts +9 -9
  648. package/dist/worker/github-auth.js +13 -15
  649. package/dist/worker/github-gateway-http.d.ts +62 -0
  650. package/dist/worker/github-gateway-http.js +977 -0
  651. package/dist/worker/github-gateway-wire.d.ts +590 -0
  652. package/dist/worker/github-gateway-wire.js +488 -0
  653. package/dist/worker/github-gateway.d.ts +238 -0
  654. package/dist/worker/github-gateway.js +726 -0
  655. package/dist/worker/github-mirror-upkeep.d.ts +75 -0
  656. package/dist/worker/github-mirror-upkeep.js +266 -0
  657. package/dist/worker/github-mirror.d.ts +364 -0
  658. package/dist/worker/github-mirror.js +1030 -0
  659. package/dist/worker/github-transfer.d.ts +56 -0
  660. package/dist/worker/github-transfer.js +444 -0
  661. package/dist/worker/history-rewrite.d.ts +4 -5
  662. package/dist/worker/history-rewrite.js +12 -17
  663. package/dist/worker/provisioned-workspace.d.ts +5 -5
  664. package/dist/worker/provisioned-workspace.js +5 -5
  665. package/dist/worker/rebase.d.ts +1 -1
  666. package/dist/worker/rebase.js +58 -54
  667. package/dist/worker/remote-git-maintenance.d.ts +3 -0
  668. package/dist/worker/remote-git-maintenance.js +12 -0
  669. package/dist/worker/schema-gate.d.ts +49 -0
  670. package/dist/worker/schema-gate.js +226 -0
  671. package/dist/worker/self-checks.d.ts +107 -0
  672. package/dist/worker/self-checks.js +358 -0
  673. package/dist/worker/shared-repo-git.d.ts +96 -0
  674. package/dist/worker/shared-repo-git.js +459 -0
  675. package/dist/worker/sparse-cone.d.ts +20 -0
  676. package/dist/worker/sparse-cone.js +136 -0
  677. package/dist/worker/stale-mirror.d.ts +82 -0
  678. package/dist/worker/stale-mirror.js +130 -0
  679. package/dist/worker/task-runner.d.ts +5 -3
  680. package/dist/worker/task-runner.js +287 -186
  681. package/dist/worker/worker-context.d.ts +36 -37
  682. package/package.json +35 -7
  683. package/dist/editor/EditorPanes.d.ts +0 -10
  684. package/dist/editor/EditorPanes.js +0 -98
  685. package/dist/editor/components/EditorFooter.d.ts +0 -11
  686. package/dist/editor/components/EditorFooter.js +0 -9
  687. package/dist/editor/components/EditorSidebar.d.ts +0 -67
  688. package/dist/editor/components/EditorSidebar.js +0 -22
@@ -151,8 +151,9 @@ export class CmsStack extends Stack {
151
151
  githubRepo: props.githubRepo,
152
152
  deploymentName: props.deploymentName,
153
153
 
154
- // Derived from canopycms.config.ts (imported above), not hardcoded or
155
- // left to CanopyCmsService's own 'main' default. A wrong baseBranch
154
+ // Derived from canopycms.config.ts (imported above), not hardcoded, so the
155
+ // worker and the Lambda agree. Unset in both, the worker detects the base
156
+ // branch and the Lambda reads what it chose. A wrong baseBranch
156
157
  // crash-loops the worker forever: verifyBaseBranchExists throws when the
157
158
  // named branch doesn't exist in the cloned remote, and systemd restarts
158
159
  // into the same failure indefinitely. See CanopyCmsServiceProps.baseBranch's
@@ -198,19 +199,15 @@ export class CmsStack extends Stack {
198
199
  reservedConcurrency: 50,
199
200
  })
200
201
 
201
- // Media support (uploads, on-demand image transforms). To enable it:
202
+ // Media support (uploads and image derivatives). To enable it:
202
203
  //
203
204
  // 1. add `AssetSupport` to the `canopycms-cdk` import at the top;
204
205
  // 2. uncomment the block below, moving it ABOVE `cmsService` (it has to
205
206
  // exist before you can pass its bucket);
206
207
  // 3. pass `assetBucket: assetSupport.bucket` to CanopyCmsService;
207
208
  // 4. pass `assetSupport` to CanopyCmsDistribution below - it attaches
208
- // both CloudFront behaviors in the only order that is safe
209
- // (`/assets/t/*` before `/assets/*`; CloudFront matches path
210
- // patterns in order, so the general pattern would otherwise
211
- // swallow the transform one). `cdk synth` fails loudly if a
212
- // hand-written `additionalBehaviors` ever gets that order wrong
213
- // instead.
209
+ // `/assets/t/*` before `/assets/*`, the order CloudFront needs, and
210
+ // `cdk synth` fails if a hand-written `additionalBehaviors` does not.
214
211
  //
215
212
  // `editorOrigins` is the S3 CORS allowlist for the editor's presigned
216
213
  // uploads, so it must list the origin the editor is served from. Include
@@ -220,11 +217,17 @@ export class CmsStack extends Stack {
220
217
  // CloudFront edge instead); with neither, a construct-created bucket
221
218
  // refuses to synth.
222
219
  //
223
- // Run `pnpm --filter canopycms-cdk run build:lambda` before deploying --
224
- // the transform Lambda needs its native sharp binary, and the construct
225
- // refuses to synth without it.
220
+ // `/assets/*` and `/assets/t/*` serve only what is in the bucket and
221
+ // compute nothing: an image derivative no one wrote is a 403. Write every
222
+ // derivative a site build references before releasing that build, with
223
+ // `canopycms collect-asset-refs <outDir>` after the build and then
224
+ // `canopycms materialize-assets --refs <outDir>/canopy-asset-refs.json`.
225
+ // To compute missing derivatives on request instead, pass
226
+ // `lazyPublicTransforms: true`; that deploys a transform Lambda, so inside
227
+ // this monorepo run `pnpm --filter canopycms-cdk run build:lambda` first
228
+ // (the published package ships it built).
226
229
  //
227
- // See the assets section of docs/deploying-to-aws.md.
230
+ // See "Media: the public image path" in docs/deploying-to-aws.md.
228
231
  //
229
232
  // const assetSupport = new AssetSupport(this, 'Assets', {
230
233
  // editorOrigins: [`https://${props.domainName}`],
package/dist/client.d.ts CHANGED
@@ -1,9 +1,8 @@
1
1
  export type { CanopyClientConfig, EditorSignInProps } from './config/index.js';
2
2
  export type { CustomFieldRenderers, CustomFieldRenderProps } from './editor/FormRenderer.js';
3
- export * from './editor/EditorPanes.js';
4
3
  export * from './editor/EntryNavigator.js';
5
4
  export * from './editor/Editor.js';
6
- export * from './editor/preview-bridge.js';
5
+ export { PreviewFrame } from './editor/PreviewFrame.js';
7
6
  export * from './editor/canopy-path.js';
8
7
  export * from './editor/theme.js';
9
8
  export * from './editor/editor-config.js';
package/dist/client.js CHANGED
@@ -1,8 +1,7 @@
1
1
  'use client';
2
- export * from './editor/EditorPanes.js';
3
2
  export * from './editor/EntryNavigator.js';
4
3
  export * from './editor/Editor.js';
5
- export * from './editor/preview-bridge.js';
4
+ export { PreviewFrame } from './editor/PreviewFrame.js';
6
5
  export * from './editor/canopy-path.js';
7
6
  export * from './editor/theme.js';
8
7
  export * from './editor/editor-config.js';
@@ -17,6 +17,17 @@ export interface CommentThread {
17
17
  authorId: string;
18
18
  entryPath?: string;
19
19
  canopyPath?: string;
20
+ /**
21
+ * For a field thread inside list items or blocks: the key (`item-keys.ts`) of each item on
22
+ * `canopyPath`, outermost first. The thread follows those items wherever they move; the
23
+ * indexes in `canopyPath` are only where they were when it was made.
24
+ */
25
+ itemKeys?: string[];
26
+ /**
27
+ * Set by the editor, never stored: an item named by `itemKeys` is gone from the value it shows,
28
+ * so the thread stays on the entry rather than on whichever item holds its old index.
29
+ */
30
+ onRemovedItem?: boolean;
20
31
  }
21
32
  export interface CommentsFile {
22
33
  schemaVersion: number;
@@ -82,10 +93,24 @@ export declare class CommentStore {
82
93
  type: CommentType;
83
94
  entryPath?: string;
84
95
  canopyPath?: string;
96
+ itemKeys?: string[];
85
97
  }): Promise<{
86
98
  threadId: string;
87
99
  commentId: string;
88
100
  }>;
101
+ /**
102
+ * Append a comment to an existing thread, or return null when `threadId` names none at write
103
+ * time. Unlike {@link addComment}, a missing thread is never created, so a reply cannot plant
104
+ * a thread under an id or entry path nobody checked.
105
+ */
106
+ addReply(options: {
107
+ userId: string;
108
+ text: string;
109
+ threadId: string;
110
+ }): Promise<{
111
+ threadId: string;
112
+ commentId: string;
113
+ } | null>;
89
114
  resolveThread(threadId: string, userId: string): Promise<boolean>;
90
115
  listThreads(options?: {
91
116
  includeResolved?: boolean;
@@ -10,6 +10,15 @@ class CommentStoreConflictError extends Error {
10
10
  this.name = 'CommentStoreConflictError';
11
11
  }
12
12
  }
13
+ /**
14
+ * A thread by id, own properties only: `threads` is a JSON-parsed plain object, so an id such
15
+ * as `__proto__` or `constructor` would otherwise reach `Object.prototype` or `Object`.
16
+ */
17
+ function ownThread(data, threadId) {
18
+ return Object.prototype.hasOwnProperty.call(data.threads, threadId)
19
+ ? data.threads[threadId]
20
+ : undefined;
21
+ }
13
22
  /**
14
23
  * Comment storage for a branch workspace, in .canopy-meta/comments.json and
15
24
  * never committed to git.
@@ -115,7 +124,8 @@ export class CommentStore {
115
124
  timestamp,
116
125
  text: options.text,
117
126
  };
118
- if (!data.threads[threadId]) {
127
+ const existing = ownThread(data, threadId);
128
+ if (!existing) {
119
129
  data.threads[threadId] = {
120
130
  id: threadId,
121
131
  comments: [comment],
@@ -125,23 +135,48 @@ export class CommentStore {
125
135
  authorId: options.userId,
126
136
  entryPath: options.entryPath,
127
137
  canopyPath: options.canopyPath,
138
+ ...(options.itemKeys?.length ? { itemKeys: options.itemKeys } : {}),
128
139
  };
129
140
  }
130
141
  else {
131
- data.threads[threadId].comments.push(comment);
142
+ existing.comments.push(comment);
132
143
  }
133
144
  await this.writeData(data, version);
134
145
  return { threadId, commentId };
135
146
  });
136
147
  }
148
+ /**
149
+ * Append a comment to an existing thread, or return null when `threadId` names none at write
150
+ * time. Unlike {@link addComment}, a missing thread is never created, so a reply cannot plant
151
+ * a thread under an id or entry path nobody checked.
152
+ */
153
+ async addReply(options) {
154
+ const commentId = randomUUID();
155
+ return this.withMutation(async (data, version) => {
156
+ const thread = ownThread(data, options.threadId);
157
+ if (!thread) {
158
+ return null;
159
+ }
160
+ thread.comments.push({
161
+ id: commentId,
162
+ threadId: options.threadId,
163
+ userId: options.userId,
164
+ timestamp: new Date().toISOString(),
165
+ text: options.text,
166
+ });
167
+ await this.writeData(data, version);
168
+ return { threadId: options.threadId, commentId };
169
+ });
170
+ }
137
171
  async resolveThread(threadId, userId) {
138
172
  return this.withMutation(async (data, version) => {
139
- if (!data.threads[threadId]) {
173
+ const thread = ownThread(data, threadId);
174
+ if (!thread) {
140
175
  return false;
141
176
  }
142
- data.threads[threadId].resolved = true;
143
- data.threads[threadId].resolvedBy = userId;
144
- data.threads[threadId].resolvedAt = new Date().toISOString();
177
+ thread.resolved = true;
178
+ thread.resolvedBy = userId;
179
+ thread.resolvedAt = new Date().toISOString();
145
180
  await this.writeData(data, version);
146
181
  return true;
147
182
  });
@@ -156,11 +191,11 @@ export class CommentStore {
156
191
  }
157
192
  async getThread(threadId) {
158
193
  const data = await this.load();
159
- return data.threads[threadId] || null;
194
+ return ownThread(data, threadId) ?? null;
160
195
  }
161
196
  async deleteThread(threadId) {
162
197
  return this.withMutation(async (data, version) => {
163
- if (!data.threads[threadId]) {
198
+ if (!ownThread(data, threadId)) {
164
199
  return false;
165
200
  }
166
201
  delete data.threads[threadId];
@@ -62,6 +62,7 @@ export const flattenSchema = (root, basePath = '') => {
62
62
  schemaRef: entryType.schemaRef,
63
63
  default: entryType.default,
64
64
  maxItems: entryType.maxItems,
65
+ ...(entryType.unavailable && { unavailable: entryType.unavailable }),
65
66
  });
66
67
  }
67
68
  }
@@ -101,6 +102,7 @@ export const flattenSchema = (root, basePath = '') => {
101
102
  schemaRef: entryType.schemaRef,
102
103
  default: entryType.default,
103
104
  maxItems: entryType.maxItems,
105
+ ...(entryType.unavailable && { unavailable: entryType.unavailable }),
104
106
  });
105
107
  }
106
108
  }
@@ -33,7 +33,7 @@ export function defineCanopyConfig(config) {
33
33
  server: validated,
34
34
  // Client config helper - extracts safe subset and merges overrides
35
35
  client: (clientOverrides) => {
36
- const { defaultBaseBranch, defaultActiveBranch, contentRoot, editor, mode, entryLinkUrl, media, basePath, } = validated;
36
+ const { defaultBaseBranch, defaultActiveBranch, contentRoot, editor, mode, entryLinkUrl, basePath, mdxAllow, } = validated;
37
37
  // flatSchema is loaded dynamically by the editor via API (from .collection.json files)
38
38
  const clientConfig = {
39
39
  defaultBaseBranch,
@@ -42,8 +42,8 @@ export function defineCanopyConfig(config) {
42
42
  editor,
43
43
  mode,
44
44
  entryLinkUrl,
45
- assetBaseUrl: media?.publicBaseUrl,
46
45
  basePath,
46
+ mdxAllow,
47
47
  flatSchema: [],
48
48
  };
49
49
  // Merge client overrides (e.g., auth handlers from useClerkAuthConfig)
@@ -8,7 +8,7 @@
8
8
  * import { defineCanopyConfig, type FieldConfig } from 'canopycms'
9
9
  * ```
10
10
  */
11
- export type { PrimitiveFieldType, FieldType, ContentFormat, MediaAdapterKind, PermissionLevel, PermissionTarget, PathPermission, SelectOption, ReferenceOption, FieldConfig, BlockConfig, BlockFieldConfig, SelectFieldConfig, ReferenceFieldConfig, ImageFieldConfig, ImageFieldValue, ObjectFieldConfig, InlineGroupFieldConfig, CustomFieldConfig, EntrySchema, BranchSchema, EntryTypeConfig, CollectionConfig, RootCollectionConfig, MediaConfig, CanopyEditorConfig, DefaultBranchAccess, DefaultPathAccess, DefaultPathAccessLevel, DefaultPathAccessLevels, DefaultBaseBranch, DefaultRemoteName, DefaultRemoteUrl, GitBotAuthorName, GitBotAuthorEmail, GithubTokenEnvVar, CanopyOperatingMode, ContentRoot, SourceRoot, CanopyConfig, CanopyConfigInput, CanopyConfigFragment, FlatSchemaItem, CanopyClientConfig, ClientOnlyFields, EditorSignInProps, EntryValidationIssue, ValidateEntryInput, ValidateEntryHook, } from './types.js';
11
+ export type { PrimitiveFieldType, FieldType, ContentFormat, MediaAdapterKind, PermissionLevel, PermissionTarget, PathPermission, SelectOption, ReferenceOption, FieldConfig, BlockConfig, BlockFieldConfig, SelectFieldConfig, ReferenceFieldConfig, ImageFieldConfig, MarkdownFieldConfig, MdxAllowlist, MdxComponentAllow, MdxPropAllow, ImageFieldValue, ObjectFieldConfig, InlineGroupFieldConfig, CustomFieldConfig, EntrySchema, BranchSchema, EntryTypeConfig, EntryTypeUnavailable, CollectionConfig, RootCollectionConfig, MediaConfig, CanopyEditorConfig, DefaultBranchAccess, DefaultPathAccess, DefaultPathAccessLevel, DefaultPathAccessLevels, DefaultBaseBranch, DefaultRemoteName, DefaultRemoteUrl, GitBotAuthorName, GitBotAuthorEmail, GithubTokenEnvVar, CanopyOperatingMode, ContentRoot, SourceRoot, CanopyConfig, CanopyConfigInput, CanopyConfigFragment, FlatSchemaItem, CanopyClientConfig, ClientOnlyFields, EditorSignInProps, EntryValidationIssue, ValidateEntryInput, ValidateEntryHook, } from './types.js';
12
12
  export { primitiveFieldTypes, fieldTypes } from './types.js';
13
13
  export { CanopyConfigSchema, getConfigDefaults, DEFAULT_PROD_WORKSPACE } from './schemas/config.js';
14
14
  export { fieldSchema, blockSchema, selectOptionSchema, referenceOptionSchema, imageFieldSchema, } from './schemas/field.js';
@@ -8,46 +8,37 @@ import type { EditorSignInProps, ValidateEntryHook } from '../types.js';
8
8
  export declare const CanopyConfigSchema: z.ZodObject<{
9
9
  media: z.ZodOptional<z.ZodDiscriminatedUnion<"adapter", [z.ZodObject<{
10
10
  adapter: z.ZodLiteral<"local">;
11
- publicBaseUrl: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
12
11
  directory: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>>;
13
12
  }, "strict", z.ZodTypeAny, {
14
13
  adapter: "local";
15
- publicBaseUrl?: string | undefined;
16
14
  directory?: string | undefined;
17
15
  }, {
18
16
  adapter: "local";
19
- publicBaseUrl?: string | undefined;
20
17
  directory?: string | undefined;
21
18
  }>, z.ZodObject<{
22
19
  adapter: z.ZodLiteral<"s3">;
23
20
  bucket: z.ZodString;
24
21
  region: z.ZodString;
25
- publicBaseUrl: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
26
22
  uploadUrl: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
27
23
  maxUploadBytes: z.ZodOptional<z.ZodNumber>;
28
24
  }, "strict", z.ZodTypeAny, {
29
25
  adapter: "s3";
30
26
  bucket: string;
31
27
  region: string;
32
- publicBaseUrl?: string | undefined;
33
28
  uploadUrl?: string | undefined;
34
29
  maxUploadBytes?: number | undefined;
35
30
  }, {
36
31
  adapter: "s3";
37
32
  bucket: string;
38
33
  region: string;
39
- publicBaseUrl?: string | undefined;
40
34
  uploadUrl?: string | undefined;
41
35
  maxUploadBytes?: number | undefined;
42
36
  }>, z.ZodObject<{
43
37
  adapter: z.ZodLiteral<"lfs">;
44
- publicBaseUrl: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
45
38
  }, "strict", z.ZodTypeAny, {
46
39
  adapter: "lfs";
47
- publicBaseUrl?: string | undefined;
48
40
  }, {
49
41
  adapter: "lfs";
50
- publicBaseUrl?: string | undefined;
51
42
  }>]>>;
52
43
  defaultBranchAccess: z.ZodDefault<z.ZodEnum<["allow", "deny"]>>;
53
44
  defaultPathAccess: z.ZodDefault<z.ZodUnion<[z.ZodEnum<["allow", "deny"]>, z.ZodObject<{
@@ -80,9 +71,10 @@ export declare const CanopyConfigSchema: z.ZodObject<{
80
71
  contentRoot: z.ZodDefault<z.ZodDefault<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>>>;
81
72
  sourceRoot: z.ZodOptional<z.ZodOptional<z.ZodString>>;
82
73
  basePath: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
74
+ unauthenticatedStatus: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<401>, z.ZodLiteral<419>]>>;
75
+ danglingReferences: z.ZodOptional<z.ZodEnum<["error", "warn"]>>;
83
76
  editor: z.ZodOptional<z.ZodObject<{
84
77
  title: z.ZodOptional<z.ZodString>;
85
- subtitle: z.ZodOptional<z.ZodString>;
86
78
  theme: z.ZodOptional<z.ZodUnknown>;
87
79
  previewBase: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodLiteral<false>]>>>;
88
80
  previewPrefix: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
@@ -92,7 +84,6 @@ export declare const CanopyConfigSchema: z.ZodObject<{
92
84
  SignInComponent: z.ZodOptional<z.ZodType<import("react").ComponentType<EditorSignInProps>, z.ZodTypeDef, import("react").ComponentType<EditorSignInProps>>>;
93
85
  }, "strip", z.ZodTypeAny, {
94
86
  title?: string | undefined;
95
- subtitle?: string | undefined;
96
87
  theme?: unknown;
97
88
  previewBase?: Record<string, string | false> | undefined;
98
89
  previewPrefix?: string | undefined;
@@ -102,7 +93,6 @@ export declare const CanopyConfigSchema: z.ZodObject<{
102
93
  SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
103
94
  }, {
104
95
  title?: string | undefined;
105
- subtitle?: string | undefined;
106
96
  theme?: unknown;
107
97
  previewBase?: Record<string, string | false> | undefined;
108
98
  previewPrefix?: string | undefined;
@@ -114,6 +104,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
114
104
  authPlugin: z.ZodOptional<z.ZodType<AuthPlugin, z.ZodTypeDef, AuthPlugin>>;
115
105
  entryLinkUrl: z.ZodOptional<z.ZodType<EntryLinkUrlResolver, z.ZodTypeDef, EntryLinkUrlResolver>>;
116
106
  validateEntry: z.ZodOptional<z.ZodType<ValidateEntryHook, z.ZodTypeDef, ValidateEntryHook>>;
107
+ mdxAllow: z.ZodOptional<z.ZodType<import("../index.js").MdxAllowlist, z.ZodTypeDef, import("../index.js").MdxAllowlist>>;
117
108
  dev: z.ZodOptional<z.ZodObject<{
118
109
  contentSync: z.ZodOptional<z.ZodDefault<z.ZodEnum<["off", "warn"]>>>;
119
110
  }, "strip", z.ZodTypeAny, {
@@ -139,18 +130,15 @@ export declare const CanopyConfigSchema: z.ZodObject<{
139
130
  settingsBranch?: string | undefined;
140
131
  media?: {
141
132
  adapter: "local";
142
- publicBaseUrl?: string | undefined;
143
133
  directory?: string | undefined;
144
134
  } | {
145
135
  adapter: "s3";
146
136
  bucket: string;
147
137
  region: string;
148
- publicBaseUrl?: string | undefined;
149
138
  uploadUrl?: string | undefined;
150
139
  maxUploadBytes?: number | undefined;
151
140
  } | {
152
141
  adapter: "lfs";
153
- publicBaseUrl?: string | undefined;
154
142
  } | undefined;
155
143
  defaultBaseBranch?: string | undefined;
156
144
  defaultActiveBranch?: string | undefined;
@@ -163,9 +151,10 @@ export declare const CanopyConfigSchema: z.ZodObject<{
163
151
  deploymentName?: string | undefined;
164
152
  sourceRoot?: string | undefined;
165
153
  basePath?: string | undefined;
154
+ unauthenticatedStatus?: 401 | 419 | undefined;
155
+ danglingReferences?: "error" | "warn" | undefined;
166
156
  editor?: {
167
157
  title?: string | undefined;
168
- subtitle?: string | undefined;
169
158
  theme?: unknown;
170
159
  previewBase?: Record<string, string | false> | undefined;
171
160
  previewPrefix?: string | undefined;
@@ -177,6 +166,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
177
166
  authPlugin?: AuthPlugin | undefined;
178
167
  entryLinkUrl?: EntryLinkUrlResolver | undefined;
179
168
  validateEntry?: ValidateEntryHook | undefined;
169
+ mdxAllow?: import("../index.js").MdxAllowlist | undefined;
180
170
  }, {
181
171
  gitBotAuthorName: string;
182
172
  gitBotAuthorEmail: string;
@@ -187,18 +177,15 @@ export declare const CanopyConfigSchema: z.ZodObject<{
187
177
  settingsBranch?: string | undefined;
188
178
  media?: {
189
179
  adapter: "local";
190
- publicBaseUrl?: string | undefined;
191
180
  directory?: string | undefined;
192
181
  } | {
193
182
  adapter: "s3";
194
183
  bucket: string;
195
184
  region: string;
196
- publicBaseUrl?: string | undefined;
197
185
  uploadUrl?: string | undefined;
198
186
  maxUploadBytes?: number | undefined;
199
187
  } | {
200
188
  adapter: "lfs";
201
- publicBaseUrl?: string | undefined;
202
189
  } | undefined;
203
190
  defaultBranchAccess?: "allow" | "deny" | undefined;
204
191
  defaultPathAccess?: "allow" | "deny" | {
@@ -219,9 +206,10 @@ export declare const CanopyConfigSchema: z.ZodObject<{
219
206
  contentRoot?: string | undefined;
220
207
  sourceRoot?: string | undefined;
221
208
  basePath?: string | undefined;
209
+ unauthenticatedStatus?: 401 | 419 | undefined;
210
+ danglingReferences?: "error" | "warn" | undefined;
222
211
  editor?: {
223
212
  title?: string | undefined;
224
- subtitle?: string | undefined;
225
213
  theme?: unknown;
226
214
  previewBase?: Record<string, string | false> | undefined;
227
215
  previewPrefix?: string | undefined;
@@ -233,18 +221,13 @@ export declare const CanopyConfigSchema: z.ZodObject<{
233
221
  authPlugin?: AuthPlugin | undefined;
234
222
  entryLinkUrl?: EntryLinkUrlResolver | undefined;
235
223
  validateEntry?: ValidateEntryHook | undefined;
224
+ mdxAllow?: import("../index.js").MdxAllowlist | undefined;
236
225
  }>;
237
226
  /**
238
- * Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set).
239
- *
240
- * WARNING: this fallback assumes a ROOT mount of EFS at /mnt/efs. CanopyCmsService
241
- * mounts EFS in both the Lambda and the worker THROUGH an access point already
242
- * rooted at /workspace and therefore sets CANOPYCMS_WORKSPACE_ROOT=/mnt/efs
243
- * explicitly; if that env were ever unset this default would resolve to
244
- * /mnt/efs/workspace = EFS:/workspace/workspace (a wrong, nested dir). The CDK
245
- * always sets the env, so this only bites a hand-rolled misconfiguration.
227
+ * Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set): where
228
+ * CanopyCmsService mounts the EFS `/workspace` access point in both the Lambda and the worker.
246
229
  */
247
- export declare const DEFAULT_PROD_WORKSPACE = "/mnt/efs/workspace";
230
+ export declare const DEFAULT_PROD_WORKSPACE = "/mnt/efs";
248
231
  export declare const getConfigDefaults: () => {
249
232
  baseBranch: string;
250
233
  remoteName: string;
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  import { relativePathSchema } from './collection.js';
6
+ import { mdxAllowlistSchema } from './field.js';
6
7
  import { mediaSchema } from './media.js';
7
8
  import { previewPrefixSchema } from './url.js';
8
9
  const defaultBranchAccessSchema = z.enum(['allow', 'deny']).default('deny');
@@ -49,7 +50,6 @@ const devConfigSchema = z.object({
49
50
  });
50
51
  const editorConfigSchema = z.object({
51
52
  title: z.string().optional(),
52
- subtitle: z.string().optional(),
53
53
  theme: z.unknown().optional(),
54
54
  previewBase: z.record(z.union([z.string(), z.literal(false)])).optional(),
55
55
  previewPrefix: previewPrefixSchema.optional(),
@@ -73,8 +73,8 @@ export const CanopyConfigSchema = z
73
73
  defaultBranchAccess: defaultBranchAccessSchema,
74
74
  defaultPathAccess: defaultPathAccessSchema,
75
75
  // .optional() deliberately defeats defaultBaseBranchSchema's .default('main'):
76
- // unset must stay undefined after parsing so dev mode can detect the fork
77
- // point from git HEAD (see resolveBaseBranch in utils/git.ts).
76
+ // unset must stay undefined after parsing so dev and prod can detect the
77
+ // fork point (see resolveBaseBranch in utils/git.ts).
78
78
  defaultBaseBranch: defaultBaseBranchSchema.optional(),
79
79
  defaultActiveBranch: z.string().min(1).optional(),
80
80
  defaultRemoteName: defaultRemoteNameSchema.optional(),
@@ -103,24 +103,21 @@ export const CanopyConfigSchema = z
103
103
  contentRoot: contentRootSchema.default('content'),
104
104
  sourceRoot: sourceRootSchema.optional(),
105
105
  basePath: basePathSchema,
106
+ unauthenticatedStatus: z.union([z.literal(401), z.literal(419)]).optional(),
107
+ danglingReferences: z.enum(['error', 'warn']).optional(),
106
108
  editor: editorConfigSchema.optional(),
107
109
  authPlugin: z.custom().optional(),
108
110
  entryLinkUrl: z.custom().optional(),
109
111
  validateEntry: z.custom().optional(),
112
+ mdxAllow: mdxAllowlistSchema.optional(),
110
113
  dev: devConfigSchema.optional(),
111
114
  })
112
115
  .strict();
113
116
  /**
114
- * Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set).
115
- *
116
- * WARNING: this fallback assumes a ROOT mount of EFS at /mnt/efs. CanopyCmsService
117
- * mounts EFS in both the Lambda and the worker THROUGH an access point already
118
- * rooted at /workspace and therefore sets CANOPYCMS_WORKSPACE_ROOT=/mnt/efs
119
- * explicitly; if that env were ever unset this default would resolve to
120
- * /mnt/efs/workspace = EFS:/workspace/workspace (a wrong, nested dir). The CDK
121
- * always sets the env, so this only bites a hand-rolled misconfiguration.
117
+ * Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set): where
118
+ * CanopyCmsService mounts the EFS `/workspace` access point in both the Lambda and the worker.
122
119
  */
123
- export const DEFAULT_PROD_WORKSPACE = '/mnt/efs/workspace';
120
+ export const DEFAULT_PROD_WORKSPACE = '/mnt/efs';
124
121
  // Note: `mode` has no default by design (SEC-C1) and is intentionally omitted here —
125
122
  // operatingModeSchema.parse(undefined) would throw.
126
123
  //
@@ -2,6 +2,7 @@
2
2
  * Zod schemas for field configuration validation.
3
3
  */
4
4
  import { z } from 'zod';
5
+ import type { MdxAllowlist } from '../types.js';
5
6
  export declare const selectOptionSchema: z.ZodUnion<[z.ZodString, z.ZodObject<{
6
7
  label: z.ZodString;
7
8
  value: z.ZodString;
@@ -22,6 +23,8 @@ export declare const referenceOptionSchema: z.ZodUnion<[z.ZodString, z.ZodObject
22
23
  value: string;
23
24
  label: string;
24
25
  }>]>;
26
+ /** Strict, so a misspelt key is an error rather than a silently wider policy. */
27
+ export declare const mdxAllowlistSchema: z.ZodType<MdxAllowlist>;
25
28
  export declare const imageFieldSchema: z.ZodObject<{
26
29
  name: z.ZodString;
27
30
  label: z.ZodOptional<z.ZodString>;
@@ -2,7 +2,8 @@
2
2
  * Zod schemas for field configuration validation.
3
3
  */
4
4
  import { z } from 'zod';
5
- import { primitiveFieldTypes, fieldTypes } from '../types.js';
5
+ import { fieldTypes, markdownFieldTypes, primitiveFieldTypes } from '../types.js';
6
+ import { SAFE_HTML_TAGS, isComponentName, isRefusedComponentProp, markdownFieldOptionsError, } from '../../validation/mdx-allowlist.js';
6
7
  const fieldBaseSchema = z.object({
7
8
  name: z.string().min(1),
8
9
  label: z.string().optional(),
@@ -27,7 +28,50 @@ export const referenceOptionSchema = z.union([
27
28
  }),
28
29
  ]);
29
30
  const primitiveFieldSchema = fieldBaseSchema.extend({
30
- type: z.enum(primitiveFieldTypes),
31
+ type: z.enum(primitiveFieldTypes).exclude([...markdownFieldTypes]),
32
+ // Listed so a parse keeps it (zod strips unknown keys); which fields may carry it is
33
+ // `ensureStampOnPublishPlacement`'s call (config/validation.ts).
34
+ stampOnPublish: z.boolean().optional(),
35
+ });
36
+ const mdxPropAllowSchema = z.union([
37
+ z.literal(true),
38
+ z.literal('string'),
39
+ z.object({ type: z.literal('string'), maxLength: z.number().int().min(1).optional() }).strict(),
40
+ z.array(z.union([z.string(), z.number(), z.boolean()])).min(1),
41
+ ]);
42
+ /** Strict, so a misspelt key is an error rather than a silently wider policy. */
43
+ export const mdxAllowlistSchema = z
44
+ .object({
45
+ components: z
46
+ .record(z.string().refine(isComponentName, {
47
+ message: 'must be a component name: capitalised, with no dot, and not MDXContent or MDXLayout',
48
+ }), z
49
+ .object({
50
+ props: z
51
+ .record(z
52
+ .string()
53
+ .min(1)
54
+ .refine((name) => !isRefusedComponentProp(name), {
55
+ message: 'event handlers, srcdoc and dangerouslySetInnerHTML are always refused',
56
+ }), mdxPropAllowSchema)
57
+ .optional(),
58
+ })
59
+ .strict())
60
+ .optional(),
61
+ htmlTags: z
62
+ .array(z.string().refine((tag) => SAFE_HTML_TAGS.has(tag), {
63
+ message: 'must be one of the HTML tags the base MDX policy accepts',
64
+ }))
65
+ .optional(),
66
+ expressions: z.boolean().optional(),
67
+ fragments: z.boolean().optional(),
68
+ })
69
+ .strict();
70
+ const markdownFieldSchema = fieldBaseSchema.extend({
71
+ type: z.enum(markdownFieldTypes),
72
+ executable: z.boolean().optional(),
73
+ renderAs: z.literal('mdx').optional(),
74
+ mdxAllow: mdxAllowlistSchema.optional(),
31
75
  });
32
76
  // "W:H" aspect ratio, e.g. "16:9" or "1:1" — positive integers on both sides,
33
77
  // no leading zeros (leading zero would parse as `0` via Number(), which the
@@ -82,6 +126,7 @@ const objectFieldSchema = fieldBaseSchema.extend({
82
126
  type: z.literal('object'),
83
127
  fields: z.array(z.lazy(() => fieldHolder[0])).min(1),
84
128
  itemTitleField: z.string().min(1).optional(),
129
+ itemLabel: z.string().trim().min(1).optional(),
85
130
  });
86
131
  // Inline group field: visual grouping only, no data nesting
87
132
  const inlineGroupFieldSchema = z.object({
@@ -101,15 +146,24 @@ const customFieldSchema = z.lazy(() => fieldBaseSchema
101
146
  }),
102
147
  })
103
148
  .passthrough());
104
- const knownFieldSchema = z.discriminatedUnion('type', [
149
+ const knownFieldSchema = z
150
+ .discriminatedUnion('type', [
105
151
  primitiveFieldSchema,
152
+ markdownFieldSchema,
106
153
  selectFieldSchema,
107
154
  referenceFieldSchema,
108
155
  imageFieldSchema,
109
156
  objectFieldSchema,
110
157
  blockFieldSchema,
111
158
  inlineGroupFieldSchema,
112
- ]);
159
+ ])
160
+ .superRefine((field, ctx) => {
161
+ if (field.type !== 'markdown' && field.type !== 'mdx')
162
+ return;
163
+ const message = markdownFieldOptionsError(field);
164
+ if (message !== undefined)
165
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message });
166
+ });
113
167
  const fieldSchema = z.lazy(() => z.union([knownFieldSchema, customFieldSchema]));
114
168
  fieldHolder[0] = fieldSchema;
115
169
  export { fieldSchema };