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
@@ -0,0 +1,14 @@
1
+ import type { EntrySchemaRegistry } from './types.js';
2
+ /**
3
+ * A sha256 digest of an entry schema registry: equal for registries with equal content, so it
4
+ * is stable across cold starts of one image, and different when any definition differs.
5
+ *
6
+ * Object keys are sorted, so declaration order cannot change it. Every value is tagged with
7
+ * its type and every string carries its length, so distinct JSON-shaped values never write the
8
+ * same bytes. A custom field may hold anything, so a function contributes its source text rather
9
+ * than being dropped the way JSON drops it; any other object is walked by its own enumerable
10
+ * keys (a Date, Map or Set writes like `{}`), and a value already on the walk's path is written
11
+ * as a cycle marker rather than recursed into. Memoized per registry object, which the code
12
+ * builds once.
13
+ */
14
+ export declare function registryFingerprint(registry: EntrySchemaRegistry): string;
@@ -0,0 +1,63 @@
1
+ import { createHash } from 'node:crypto';
2
+ const fingerprints = new WeakMap();
3
+ /**
4
+ * A sha256 digest of an entry schema registry: equal for registries with equal content, so it
5
+ * is stable across cold starts of one image, and different when any definition differs.
6
+ *
7
+ * Object keys are sorted, so declaration order cannot change it. Every value is tagged with
8
+ * its type and every string carries its length, so distinct JSON-shaped values never write the
9
+ * same bytes. A custom field may hold anything, so a function contributes its source text rather
10
+ * than being dropped the way JSON drops it; any other object is walked by its own enumerable
11
+ * keys (a Date, Map or Set writes like `{}`), and a value already on the walk's path is written
12
+ * as a cycle marker rather than recursed into. Memoized per registry object, which the code
13
+ * builds once.
14
+ */
15
+ export function registryFingerprint(registry) {
16
+ const memo = fingerprints.get(registry);
17
+ if (memo)
18
+ return memo;
19
+ const hash = createHash('sha256');
20
+ const ancestors = new Set();
21
+ const text = (tag, value) => hash.update(`${tag}${value.length}:${value}`);
22
+ const write = (value) => {
23
+ switch (typeof value) {
24
+ case 'string':
25
+ return void text('s', value);
26
+ case 'number':
27
+ case 'bigint':
28
+ case 'boolean':
29
+ return void text(typeof value, String(value));
30
+ case 'undefined':
31
+ return void hash.update('u');
32
+ case 'symbol':
33
+ return void text('y', value.toString());
34
+ case 'function':
35
+ return void text('f', Function.prototype.toString.call(value));
36
+ }
37
+ if (value === null)
38
+ return void hash.update('n');
39
+ const object = value;
40
+ if (ancestors.has(object))
41
+ return void hash.update('c');
42
+ ancestors.add(object);
43
+ if (Array.isArray(object)) {
44
+ hash.update(`[${object.length}`);
45
+ for (const item of object)
46
+ write(item);
47
+ }
48
+ else {
49
+ const record = object;
50
+ const keys = Object.keys(record).sort();
51
+ hash.update(`{${keys.length}`);
52
+ for (const key of keys) {
53
+ text('k', key);
54
+ write(record[key]);
55
+ }
56
+ }
57
+ ancestors.delete(object);
58
+ };
59
+ write(registry);
60
+ const digest = hash.digest('hex');
61
+ fingerprints.set(registry, digest);
62
+ return digest;
63
+ }
@@ -8,22 +8,25 @@
8
8
  * in .collection.json files for reusability and type safety.
9
9
  */
10
10
  import type { RootCollectionConfig } from '../config/index.js';
11
- import type { EntrySchemaRegistry, SchemaResolutionResult } from './types.js';
11
+ import type { EntrySchemaRegistry, SchemaResolutionResult, UnknownSchemaPolicy } from './types.js';
12
12
  /**
13
13
  * Resolve schema from .collection.json files.
14
14
  *
15
15
  * @param contentRoot - Path to the content directory
16
16
  * @param entrySchemaRegistry - Map of entry schema names to field definitions
17
+ * @param options.unknownSchema - 'throw' (the default) or 'degrade'; see `resolveCollectionMetaFiles`
17
18
  * @returns Resolved schema configuration
18
- * @throws Error if schema references cannot be resolved
19
+ * @throws Error if schema references cannot be resolved under the 'throw' policy
19
20
  */
20
- export declare function resolveSchema(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry): Promise<SchemaResolutionResult>;
21
+ export declare function resolveSchema(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry, options?: {
22
+ unknownSchema?: UnknownSchemaPolicy;
23
+ }): Promise<SchemaResolutionResult>;
21
24
  /**
22
25
  * Check if content root has any .collection.json files.
23
26
  *
24
27
  * @param contentRoot - Path to the content directory
25
28
  * @returns true if at least one .collection.json file exists
26
- * @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md.
29
+ * @internal No importer; deletion candidate in safeinsights/canopycms#725.
27
30
  */
28
31
  export declare function hasSchemaFiles(contentRoot: string): Promise<boolean>;
29
32
  /**
@@ -7,16 +7,17 @@
7
7
  * Field schemas are defined in the entry schema registry and referenced by name
8
8
  * in .collection.json files for reusability and type safety.
9
9
  */
10
- import { loadCollectionMetaFiles, resolveCollectionReferences } from './meta-loader.js';
10
+ import { loadCollectionMetaFiles, resolveCollectionMetaFiles } from './meta-loader.js';
11
11
  /**
12
12
  * Resolve schema from .collection.json files.
13
13
  *
14
14
  * @param contentRoot - Path to the content directory
15
15
  * @param entrySchemaRegistry - Map of entry schema names to field definitions
16
+ * @param options.unknownSchema - 'throw' (the default) or 'degrade'; see `resolveCollectionMetaFiles`
16
17
  * @returns Resolved schema configuration
17
- * @throws Error if schema references cannot be resolved
18
+ * @throws Error if schema references cannot be resolved under the 'throw' policy
18
19
  */
19
- export async function resolveSchema(contentRoot, entrySchemaRegistry) {
20
+ export async function resolveSchema(contentRoot, entrySchemaRegistry, options = {}) {
20
21
  const metaFiles = await loadCollectionMetaFiles(contentRoot);
21
22
  // Build source info for debugging
22
23
  const sources = [];
@@ -34,15 +35,15 @@ export async function resolveSchema(contentRoot, entrySchemaRegistry) {
34
35
  collections: [collection.name],
35
36
  });
36
37
  }
37
- const schema = resolveCollectionReferences(metaFiles, entrySchemaRegistry);
38
- return { schema, sources };
38
+ const { schema, issues } = resolveCollectionMetaFiles(metaFiles, entrySchemaRegistry, options.unknownSchema ?? 'throw');
39
+ return { schema, sources, issues };
39
40
  }
40
41
  /**
41
42
  * Check if content root has any .collection.json files.
42
43
  *
43
44
  * @param contentRoot - Path to the content directory
44
45
  * @returns true if at least one .collection.json file exists
45
- * @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md.
46
+ * @internal No importer; deletion candidate in safeinsights/canopycms#725.
46
47
  */
47
48
  export async function hasSchemaFiles(contentRoot) {
48
49
  const metaFiles = await loadCollectionMetaFiles(contentRoot);
@@ -235,15 +235,12 @@ export declare class SchemaOps {
235
235
  * why `updateOrderInner` calls `updateCollectionInner` directly instead of
236
236
  * the public `updateCollection`.
237
237
  *
238
- * Phantom-resurrection guard: `branchRoot` can be removed by a concurrent
239
- * `deleteBranch` between the caller resolving its BranchContext and this
240
- * call's own lock acquisition, which would otherwise let
241
- * `withOccFileLock`'s `mkdir({recursive:true})` silently recreate
242
- * `.canopy-meta/` in an otherwise-deleted tree. Checking BEFORE the lock
243
- * fails fast instead. Residual (accepted, same shape as
244
- * branch-metadata.ts's): a call that passes this check can still race a
245
- * `deleteBranch` `rm` starting moments later — not closed here either,
246
- * since `deleteBranch` never takes this lock (see the module doc comment).
238
+ * `branchRoot` can be removed by a concurrent `deleteBranch` between the
239
+ * caller resolving its BranchContext and this call's lock acquisition. The
240
+ * stat below fails fast before any lock; past it, neither lock recreates a
241
+ * missing root (each creates only its own directory), so a later removal
242
+ * fails the acquisition, and any failure on a vanished root is reported as
243
+ * `SchemaStoreBusyError` below.
247
244
  *
248
245
  * Translation happens ONLY at this boundary: inner code always sees the
249
246
  * raw {@link OccWriteConflictError} bubble up here untranslated, and a
@@ -320,7 +317,7 @@ export declare class SchemaOps {
320
317
  * root can re-normalise to the ROOT collection on a second call, mutating
321
318
  * the wrong one instead of reporting not-found. Every entry point calls
322
319
  * this exactly once today, so the ambiguity is unreachable; see
323
- * .claude/future-tasks/collection-path-content-root-ambiguity.md. A future
320
+ * safeinsights/canopycms#623. A future
324
321
  * method that accepts a logical collection path must do the same.
325
322
  */
326
323
  private normalizeCollectionPath;
@@ -165,15 +165,12 @@ export class SchemaOps {
165
165
  * why `updateOrderInner` calls `updateCollectionInner` directly instead of
166
166
  * the public `updateCollection`.
167
167
  *
168
- * Phantom-resurrection guard: `branchRoot` can be removed by a concurrent
169
- * `deleteBranch` between the caller resolving its BranchContext and this
170
- * call's own lock acquisition, which would otherwise let
171
- * `withOccFileLock`'s `mkdir({recursive:true})` silently recreate
172
- * `.canopy-meta/` in an otherwise-deleted tree. Checking BEFORE the lock
173
- * fails fast instead. Residual (accepted, same shape as
174
- * branch-metadata.ts's): a call that passes this check can still race a
175
- * `deleteBranch` `rm` starting moments later — not closed here either,
176
- * since `deleteBranch` never takes this lock (see the module doc comment).
168
+ * `branchRoot` can be removed by a concurrent `deleteBranch` between the
169
+ * caller resolving its BranchContext and this call's lock acquisition. The
170
+ * stat below fails fast before any lock; past it, neither lock recreates a
171
+ * missing root (each creates only its own directory), so a later removal
172
+ * fails the acquisition, and any failure on a vanished root is reported as
173
+ * `SchemaStoreBusyError` below.
177
174
  *
178
175
  * Translation happens ONLY at this boundary: inner code always sees the
179
176
  * raw {@link OccWriteConflictError} bubble up here untranslated, and a
@@ -219,6 +216,11 @@ export class SchemaOps {
219
216
  ? 'This branch was being synced while the schema change was written, so it may or may not have been recorded. Reload before changing the schema again.'
220
217
  : err.message, err.outcome);
221
218
  }
219
+ // A delete that removes the branch root mid-operation fails it wherever it is (a lock's
220
+ // mkdir ENOENT, a vanished collection meta); the deletion is the cause, whatever the symptom.
221
+ const rootGone = await fs.stat(this.branchRoot).then(() => false, (statErr) => isNotFoundError(statErr));
222
+ if (rootGone)
223
+ throw new SchemaStoreBusyError('Branch no longer exists');
222
224
  throw err;
223
225
  }
224
226
  }
@@ -302,7 +304,7 @@ export class SchemaOps {
302
304
  * root can re-normalise to the ROOT collection on a second call, mutating
303
305
  * the wrong one instead of reporting not-found. Every entry point calls
304
306
  * this exactly once today, so the ambiguity is unreachable; see
305
- * .claude/future-tasks/collection-path-content-root-ambiguity.md. A future
307
+ * safeinsights/canopycms#623. A future
306
308
  * method that accepts a logical collection path must do the same.
307
309
  */
308
310
  normalizeCollectionPath(collectionPath) {
@@ -578,7 +580,7 @@ export class SchemaOps {
578
580
  // already rules out a `{slug}.{id}` directory at the destination — but that check is
579
581
  // case-SENSITIVE and lets an ID-less `docs/`-style directory through, so a case or
580
582
  // ID-less collision can still slip past it for entries deeper than the index; see
581
- // .claude/future-tasks/collection-sibling-name-uniqueness.md.
583
+ // safeinsights/canopycms#624.
582
584
  if (await findIndexEntryIn(physicalPath)) {
583
585
  // Renaming TO "index" collapses this collection onto its OWN new path, not the
584
586
  // parent's — see url-collision.ts's findUrlPathClaimant for the equivalent create-time
@@ -0,0 +1,11 @@
1
+ import type { EntryTypeUnavailable } from '../config/index.js';
2
+ /**
3
+ * Thrown for an entry whose entry type is `unavailable` (see `EntryTypeConfig.unavailable`):
4
+ * nothing may be written against a schema the running code does not have. The API answers it
5
+ * with a retriable 503 (`http/worker-not-ready.ts`), since a deploy usually clears it.
6
+ */
7
+ export declare class SchemaUnavailableError extends Error {
8
+ readonly entryType: string;
9
+ readonly unavailable: EntryTypeUnavailable;
10
+ constructor(entryType: string, unavailable: EntryTypeUnavailable);
11
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Thrown for an entry whose entry type is `unavailable` (see `EntryTypeConfig.unavailable`):
3
+ * nothing may be written against a schema the running code does not have. The API answers it
4
+ * with a retriable 503 (`http/worker-not-ready.ts`), since a deploy usually clears it.
5
+ */
6
+ export class SchemaUnavailableError extends Error {
7
+ constructor(entryType, unavailable) {
8
+ super(`Entry type "${entryType}" uses a content type this editor version doesn't know yet ` +
9
+ `("${unavailable.schemaRef}", named in ${unavailable.metaFile}). It usually appears ` +
10
+ 'after the editor finishes updating; reload in a few minutes.');
11
+ this.name = 'SchemaUnavailableError';
12
+ this.entryType = entryType;
13
+ this.unavailable = unavailable;
14
+ }
15
+ }
@@ -22,4 +22,26 @@ export interface SchemaResolutionResult {
22
22
  schema: RootCollectionConfig;
23
23
  /** Information about schema sources for debugging */
24
24
  sources: SchemaSourceInfo[];
25
+ /** What a degraded resolve left out; always empty for a strict one. */
26
+ issues: SchemaIssue[];
25
27
  }
28
+ /**
29
+ * A part of a branch's schema the running code could not resolve, contained rather than thrown
30
+ * (see `BranchSchemaCache` for where that applies). `unknown-schema` marks one entry type
31
+ * unavailable; `reference-entry-type` leaves a reference field scoped to a type the content does
32
+ * not declare, which offers no options until it does.
33
+ */
34
+ export type SchemaIssue = {
35
+ kind: 'unknown-schema';
36
+ /** The collection's path relative to the content root; '' for the root collection. */
37
+ collectionPath: string;
38
+ entryType: string;
39
+ schemaRef: string;
40
+ metaFile: string;
41
+ message: string;
42
+ } | {
43
+ kind: 'reference-entry-type';
44
+ message: string;
45
+ };
46
+ /** How resolution treats a `.collection.json` naming an entry schema the registry lacks. */
47
+ export type UnknownSchemaPolicy = 'throw' | 'degrade';
@@ -0,0 +1,35 @@
1
+ import { type BuildIdentity } from './build-identity.js';
2
+ import type { CanopyConfig } from './config/index.js';
3
+ import type { EntrySchemaRegistry } from './schema/types.js';
4
+ /** @internal Exported for tests. */
5
+ export declare const SCHEMA_REGISTRY_RECORD = ".schema-registry.json";
6
+ export interface SchemaRegistryRecord {
7
+ version: 1;
8
+ /** The registry's keys, sorted: the names a `.collection.json` entry type may reference. */
9
+ schemas: string[];
10
+ /** `registryFingerprint` of the registry, which the branch schema cache is also stamped with. */
11
+ fingerprint: string;
12
+ /** Content root relative to the repository root, as the editor resolves it. */
13
+ contentRoot: string;
14
+ build: BuildIdentity;
15
+ recordedAt: string;
16
+ }
17
+ /** The record, or undefined when none is recorded or it does not parse. */
18
+ export declare function readSchemaRegistryRecord(contentBranchesRoot: string): Promise<SchemaRegistryRecord | undefined>;
19
+ /**
20
+ * Record `schemas` unless the record already says the same, by temp file and rename. Does not
21
+ * create the branches root: a deployment without one has no worker syncing into it.
22
+ * @internal Exported for tests; `recordServedSchemaRegistry` is the caller.
23
+ */
24
+ export declare function recordSchemaRegistry(contentBranchesRoot: string, entry: {
25
+ schemas: readonly string[];
26
+ fingerprint: string;
27
+ contentRoot: string;
28
+ build: BuildIdentity;
29
+ }): Promise<void>;
30
+ /**
31
+ * Record the registry this process serves, once per process start. A process with an empty
32
+ * registry speaks for no editor (a config-only handler resolves no schema at all), so it records
33
+ * nothing rather than make the worker hold every new reference. Best-effort: a failure is logged.
34
+ */
35
+ export declare function recordServedSchemaRegistry(config: CanopyConfig, registry: EntrySchemaRegistry): Promise<void>;
@@ -0,0 +1,134 @@
1
+ /**
2
+ * The entry schema registry the serving editor was built with, recorded beside the branch
3
+ * directories for the worker, which has no adopter config. The worker's git sync holds the base
4
+ * branch while incoming content names a schema this record lacks (worker/schema-gate.ts), so a
5
+ * merge that adds a schema and content using it waits for the image carrying the schema.
6
+ *
7
+ * Last write wins. Each API process records once, at its first API request, so with one API
8
+ * deployment per workspace the newest process start names the serving image. An old image
9
+ * starting during a rollout leaves the record behind, and the gate then holds until the next
10
+ * new-image start, the safe direction.
11
+ */
12
+ import fs from 'node:fs/promises';
13
+ import path from 'node:path';
14
+ import { readsFromCheckout } from './build-mode.js';
15
+ import { getBuildIdentity } from './build-identity.js';
16
+ import { operatingStrategy } from './operating-mode/index.js';
17
+ import { registryFingerprint } from './schema/registry-fingerprint.js';
18
+ import { getErrorMessage, isNodeError } from './utils/error.js';
19
+ import { canopyLogWarn } from './utils/logger.js';
20
+ /** @internal Exported for tests. */
21
+ export const SCHEMA_REGISTRY_RECORD = '.schema-registry.json';
22
+ function isStringArray(value) {
23
+ return Array.isArray(value) && value.every((item) => typeof item === 'string');
24
+ }
25
+ function isBuildIdentity(value) {
26
+ if (typeof value !== 'object' || value === null)
27
+ return false;
28
+ if (!('canopycmsVersion' in value) || typeof value.canopycmsVersion !== 'string')
29
+ return false;
30
+ return !('sourceRevision' in value) || typeof value.sourceRevision === 'string';
31
+ }
32
+ /** The record, or undefined when none is recorded or it does not parse. */
33
+ export async function readSchemaRegistryRecord(contentBranchesRoot) {
34
+ let raw;
35
+ try {
36
+ raw = await fs.readFile(path.join(contentBranchesRoot, SCHEMA_REGISTRY_RECORD), 'utf8');
37
+ }
38
+ catch (err) {
39
+ if (isNodeError(err) && err.code === 'ENOENT')
40
+ return undefined;
41
+ throw err;
42
+ }
43
+ let parsed;
44
+ try {
45
+ parsed = JSON.parse(raw);
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ if (typeof parsed !== 'object' || parsed === null)
51
+ return undefined;
52
+ if (!('version' in parsed) || parsed.version !== 1)
53
+ return undefined;
54
+ if (!('schemas' in parsed) || !isStringArray(parsed.schemas))
55
+ return undefined;
56
+ if (!('fingerprint' in parsed) || typeof parsed.fingerprint !== 'string')
57
+ return undefined;
58
+ if (!('contentRoot' in parsed) || typeof parsed.contentRoot !== 'string')
59
+ return undefined;
60
+ if (!('build' in parsed) || !isBuildIdentity(parsed.build))
61
+ return undefined;
62
+ if (!('recordedAt' in parsed) || typeof parsed.recordedAt !== 'string')
63
+ return undefined;
64
+ return {
65
+ version: 1,
66
+ schemas: parsed.schemas,
67
+ fingerprint: parsed.fingerprint,
68
+ contentRoot: parsed.contentRoot,
69
+ build: parsed.build,
70
+ recordedAt: parsed.recordedAt,
71
+ };
72
+ }
73
+ function sameRecord(a, b) {
74
+ return (a.fingerprint === b.fingerprint &&
75
+ a.contentRoot === b.contentRoot &&
76
+ a.build.canopycmsVersion === b.build.canopycmsVersion &&
77
+ a.build.sourceRevision === b.build.sourceRevision);
78
+ }
79
+ /**
80
+ * Record `schemas` unless the record already says the same, by temp file and rename. Does not
81
+ * create the branches root: a deployment without one has no worker syncing into it.
82
+ * @internal Exported for tests; `recordServedSchemaRegistry` is the caller.
83
+ */
84
+ export async function recordSchemaRegistry(contentBranchesRoot, entry) {
85
+ const next = { ...entry, schemas: [...entry.schemas].sort() };
86
+ const current = await readSchemaRegistryRecord(contentBranchesRoot);
87
+ if (current && sameRecord(current, next))
88
+ return;
89
+ const record = {
90
+ version: 1,
91
+ ...next,
92
+ recordedAt: new Date().toISOString(),
93
+ };
94
+ const target = path.join(contentBranchesRoot, SCHEMA_REGISTRY_RECORD);
95
+ const temp = `${target}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
96
+ try {
97
+ await fs.writeFile(temp, `${JSON.stringify(record)}\n`, 'utf8');
98
+ }
99
+ catch (err) {
100
+ if (isNodeError(err) && err.code === 'ENOENT')
101
+ return;
102
+ throw err;
103
+ }
104
+ try {
105
+ await fs.rename(temp, target);
106
+ }
107
+ catch (err) {
108
+ await fs.unlink(temp).catch(() => { });
109
+ throw err;
110
+ }
111
+ }
112
+ /**
113
+ * Record the registry this process serves, once per process start. A process with an empty
114
+ * registry speaks for no editor (a config-only handler resolves no schema at all), so it records
115
+ * nothing rather than make the worker hold every new reference. Best-effort: a failure is logged.
116
+ */
117
+ export async function recordServedSchemaRegistry(config, registry) {
118
+ try {
119
+ if (readsFromCheckout(config))
120
+ return;
121
+ const schemas = Object.keys(registry);
122
+ if (schemas.length === 0)
123
+ return;
124
+ await recordSchemaRegistry(operatingStrategy(config.mode).getContentBranchesRoot(config.sourceRoot), {
125
+ schemas,
126
+ fingerprint: registryFingerprint(registry),
127
+ contentRoot: config.contentRoot || 'content',
128
+ build: getBuildIdentity(),
129
+ });
130
+ }
131
+ catch (err) {
132
+ canopyLogWarn(`[canopy] Could not record the entry schema registry: ${getErrorMessage(err)}`);
133
+ }
134
+ }
package/dist/server.d.ts CHANGED
@@ -105,6 +105,12 @@ export type { RoutableEntry, CollectRoutableEntriesOptions } from './static/inde
105
105
  */
106
106
  export { findDuplicateUrlPaths } from './static/index.js';
107
107
  export type { DuplicateUrlPath } from './static/index.js';
108
+ /**
109
+ * Find every reference naming no entry — the check a production build runs and fails on unless
110
+ * `danglingReferences: 'warn'`. Pass an unscoped `listEntries()`.
111
+ */
112
+ export { findDanglingReferences } from './static/index.js';
113
+ export type { DanglingReference } from './static/index.js';
108
114
  /**
109
115
  * SEO field extraction and URL shaping, framework-agnostic. `isNoindexEntry` is the single
110
116
  * predicate behind both `robots: noindex` and sitemap exclusion.
@@ -126,32 +132,96 @@ export { createAssetStore } from './assets/factory.js';
126
132
  /**
127
133
  * The five S3/local bucket-prefix strings (`asset-originals/`, `asset-staging/`, `asset-meta/`,
128
134
  * `assets/`, `assets/t/`). Exported so server-only consumers outside this package — notably the
129
- * prod transform Lambda (`packages/canopycms-cdk/lambda/asset-transform`) — build and parse
135
+ * lazy transform Lambda (`packages/canopycms-cdk/lambda/asset-transform`) — build and parse
130
136
  * asset keys through the same constants `S3AssetStore` uses rather than duplicating the strings.
131
137
  */
132
138
  export { ASSET_PREFIXES, type AssetPrefixes } from './assets/keys.js';
133
- /** Asset metadata sidecar shape (`asset-meta/{hash32}.json`), written by the finalize pipeline and read by the transform layer (dev-mode emulation and the prod transform Lambda). */
139
+ /** Asset metadata sidecar shape (`asset-meta/{hash32}.json`), written by the finalize pipeline and read by `storeTransform`. */
134
140
  export type { AssetMeta } from './assets/types.js';
135
141
  /**
136
142
  * Parse the three path segments after `assets/t/` (`{directives}/{hash32}/{slug}.{ext}`) into a
137
- * validated `TransformDirectives` set, or a structured parse error. Reused unchanged by the
138
- * dev-mode lazy `/assets/t/*` emulation (`api/assets.ts`) and the prod transform Lambda, so the
139
- * URL grammar is defined in exactly one place.
143
+ * validated `TransformDirectives` set, or a structured parse error, so the URL grammar is
144
+ * defined in exactly one place.
140
145
  */
141
146
  export { parseTransformPath } from './assets/transform-directives.js';
142
147
  export type { ParsedTransformPath, ParseTransformPathResult } from './assets/transform-directives.js';
143
148
  /**
144
149
  * Canonical string form of a `TransformDirectives` set — the cache key every transform output is
145
150
  * stored under (`assets/t/{formatDirectives(...)}/{hash32}/{slug}.{ext}`). Equivalent directive
146
- * sets (different key order or float formatting) always format to the same string. Reused by the
147
- * prod transform Lambda so its writes agree with the dev-mode emulation and `assetUrl()`.
151
+ * sets (different key order or float formatting) always format to the same string.
148
152
  */
149
153
  export { formatDirectives } from './assets/transform-directives.js';
154
+ /**
155
+ * Parse `assets/t/` path segments and resolve them to the canonical spelling their output is
156
+ * stored under, with directives re-parsed from that spelling. The lazy transform Lambda 301s a
157
+ * non-canonical request to it; the authenticated raw route serves the canonical bytes.
158
+ */
159
+ export { canonicalizeTransformPath } from './assets/transform-directives.js';
160
+ export type { CanonicalTransformPathResult, TransformWidthPolicy, } from './assets/transform-directives.js';
150
161
  /**
151
162
  * Apply a parsed `TransformDirectives` set to source image bytes with sharp:
152
163
  * resize/format/quality/crop, EXIF stripped on every re-encode, identity included. Server-only
153
- * (sharp); reused unchanged by the dev-mode lazy `/assets/t/*` emulation and the prod transform
154
- * Lambda.
164
+ * (sharp); `storeTransform` below wraps it for every caller that stores the output.
155
165
  */
156
166
  export { applyTransform } from './assets/transform.js';
157
167
  export type { ApplyTransformInput, TransformResult } from './assets/transform.js';
168
+ /**
169
+ * Compute the transform a canonical `assets/t/` path names and store it under that key: meta
170
+ * lookup, raster-only, slug and ext checks, then `applyTransform`. Shared by the authenticated raw
171
+ * route, `materialize-assets` and the lazy transform Lambda. A 404's `error` names hashes and
172
+ * slugs, so a caller answering a browser replaces it.
173
+ */
174
+ export { storeTransform, type StoreTransformResult } from './assets/materialize.js';
175
+ /** The `Cache-Control` every stored transform output carries: content-addressed, so immutable. */
176
+ export { TRANSFORM_CACHE_CONTROL } from './assets/materialize.js';
177
+ /** The object tag the lazy transform Lambda's outputs carry, which its `assets/t/` expiry filters on. */
178
+ export { LAZY_TRANSFORM_TAG } from './assets/materialize.js';
179
+ /**
180
+ * Make every `assets/t/` key a build references exist in `store` (transforming only the missing
181
+ * ones from the stored originals) and check every referenced svg/pdf key exists. Under an
182
+ * `outputPrefix`, keys are written beneath it, and those production already stores are copied. A
183
+ * release job that bundles its own tool calls this with a store from `createAssetStore` and gates
184
+ * on the returned report; no site config is involved. Needs sharp only when something is missing.
185
+ */
186
+ export { materializeAssets } from './assets/materialize.js';
187
+ /**
188
+ * The live preview's asset prefix on the server: the signed-in raw route under a `basePath`, the
189
+ * same-origin check every preview prefix passes, and the hook registering the request-scoped getter
190
+ * `assetUrl` reads.
191
+ * @internal `canopycms-next`'s preview page is their consumer.
192
+ */
193
+ export { authenticatedAssetBase, readAssetBase } from './editor/raw-asset-base.js';
194
+ /** @internal */
195
+ export { setServerPreviewAssetBaseGetter } from './editor/preview-asset-base.js';
196
+ /** The asset store `createAssetStore` returns and `materializeAssets` takes. */
197
+ export type { AssetStore } from './assets/types.js';
198
+ /** What a create-only store write did: `created`, or `already-exists` (the stored object was kept). */
199
+ export type { CreateOnlyResult } from './assets/types.js';
200
+ /** Thrown by `materializeAssets` when sharp cannot load and keys are missing, so none can be produced. */
201
+ export { SharpUnavailableError } from './assets/materialize.js';
202
+ /**
203
+ * Thrown by `materializeAssets` before any store request when `outputPrefix` is not a relative,
204
+ * `/`-terminated run of `[A-Za-z0-9._-]` segments outside every canopy prefix.
205
+ */
206
+ export { InvalidOutputPrefixError } from './assets/materialize.js';
207
+ /** The `schemaVersion` carried by every `MaterializeReport`. */
208
+ export { MATERIALIZE_REPORT_SCHEMA_VERSION } from './assets/materialize.js';
209
+ /** Options for `materializeAssets`: the store, the referenced keys, an output prefix, and concurrency/retry limits. */
210
+ export type { MaterializeOptions } from './assets/materialize.js';
211
+ /** What `materializeAssets` returns: a versioned summary and one result per key, sorted by key. */
212
+ export type { MaterializeReport } from './assets/materialize.js';
213
+ /** One key's outcome in a `MaterializeReport`: `existed`, `created`, `copied` or `failed` (`content` or `store`). */
214
+ export type { MaterializeResult } from './assets/materialize.js';
215
+ /** One key a build references, with the pages and output files that reference it. */
216
+ export type { MaterializeTarget } from './assets/materialize.js';
217
+ /**
218
+ * Scan a static build's output for `/assets/…` URLs and write `canopy-asset-refs.json` into it.
219
+ * Throws `AssetRefsError` for a URL no stored object can answer (non-canonical or malformed).
220
+ */
221
+ export { collectAssetRefs, type CollectAssetRefsResult } from './build/asset-refs.js';
222
+ /** Read and validate a `canopy-asset-refs.json`; throws when it is unreadable or malformed. */
223
+ export { readAssetRefsFile } from './build/asset-refs.js';
224
+ /** Thrown by `collectAssetRefs`; `problems` lists each offending file and URL. */
225
+ export { AssetRefsError } from './build/asset-refs.js';
226
+ /** The shape of `canopy-asset-refs.json`: the transform and static keys a build references. */
227
+ export type { AssetRefsFile } from './build/asset-refs.js';