canopycms 0.0.67-int.90 → 0.0.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +30 -3
  2. package/dist/ai/generate.js +1 -27
  3. package/dist/ai/handler.d.ts +0 -4
  4. package/dist/ai/handler.js +0 -11
  5. package/dist/ai/index.d.ts +1 -8
  6. package/dist/ai/index.js +1 -8
  7. package/dist/ai/json-to-markdown.js +15 -58
  8. package/dist/ai/resolve-branch.d.ts +2 -7
  9. package/dist/ai/resolve-branch.js +2 -8
  10. package/dist/ai/strip-mdx.d.ts +5 -13
  11. package/dist/ai/strip-mdx.js +5 -17
  12. package/dist/ai/to-plain-text.d.ts +10 -28
  13. package/dist/ai/to-plain-text.js +10 -28
  14. package/dist/ai/transform-components.d.ts +2 -4
  15. package/dist/ai/transform-components.js +8 -19
  16. package/dist/ai/types.d.ts +5 -10
  17. package/dist/api/admin-branch-health.d.ts +4 -12
  18. package/dist/api/admin-branch-health.js +26 -66
  19. package/dist/api/admin.d.ts +4 -12
  20. package/dist/api/admin.js +10 -26
  21. package/dist/api/assets.d.ts +0 -25
  22. package/dist/api/assets.js +50 -91
  23. package/dist/api/branch-merge.d.ts +1 -1
  24. package/dist/api/branch-merge.js +0 -2
  25. package/dist/api/branch-review.d.ts +0 -8
  26. package/dist/api/branch-review.js +0 -13
  27. package/dist/api/branch-status.d.ts +0 -3
  28. package/dist/api/branch-status.js +8 -33
  29. package/dist/api/branch-withdraw.d.ts +0 -1
  30. package/dist/api/branch-withdraw.js +6 -9
  31. package/dist/api/branch.d.ts +7 -12
  32. package/dist/api/branch.js +7 -44
  33. package/dist/api/client.d.ts +71 -224
  34. package/dist/api/client.js +82 -233
  35. package/dist/api/comments.d.ts +2 -4
  36. package/dist/api/comments.js +0 -17
  37. package/dist/api/content.d.ts +0 -6
  38. package/dist/api/content.js +66 -142
  39. package/dist/api/entries-constants.d.ts +5 -9
  40. package/dist/api/entries-constants.js +5 -9
  41. package/dist/api/entries.d.ts +8 -13
  42. package/dist/api/entries.js +20 -51
  43. package/dist/api/github-sync.d.ts +2 -4
  44. package/dist/api/github-sync.js +4 -8
  45. package/dist/api/groups.d.ts +3 -0
  46. package/dist/api/groups.js +8 -21
  47. package/dist/api/guards.d.ts +4 -16
  48. package/dist/api/guards.js +3 -22
  49. package/dist/api/index.d.ts +4 -4
  50. package/dist/api/permissions.d.ts +2 -0
  51. package/dist/api/permissions.js +18 -40
  52. package/dist/api/reference-options.d.ts +0 -1
  53. package/dist/api/reference-options.js +3 -11
  54. package/dist/api/request-body-hash.d.ts +12 -23
  55. package/dist/api/request-body-hash.js +12 -23
  56. package/dist/api/resolve-references.d.ts +0 -1
  57. package/dist/api/resolve-references.js +13 -28
  58. package/dist/api/route-builder.d.ts +3 -7
  59. package/dist/api/route-builder.js +1 -1
  60. package/dist/api/routes.d.ts +12 -0
  61. package/dist/api/routes.js +47 -0
  62. package/dist/api/schema.d.ts +23 -33
  63. package/dist/api/schema.js +20 -74
  64. package/dist/api/settings-helpers.js +4 -5
  65. package/dist/api/types.d.ts +0 -5
  66. package/dist/api/user.js +0 -5
  67. package/dist/api/validators.d.ts +14 -52
  68. package/dist/api/validators.js +14 -52
  69. package/dist/assets/asset-prefixes.d.ts +4 -8
  70. package/dist/assets/asset-prefixes.js +4 -8
  71. package/dist/assets/asset-src.d.ts +5 -22
  72. package/dist/assets/asset-src.js +5 -21
  73. package/dist/assets/factory.d.ts +1 -2
  74. package/dist/assets/factory.js +1 -2
  75. package/dist/assets/finalize.d.ts +3 -1
  76. package/dist/assets/finalize.js +3 -1
  77. package/dist/assets/index.d.ts +3 -3
  78. package/dist/assets/index.js +1 -1
  79. package/dist/assets/keys.d.ts +5 -3
  80. package/dist/assets/keys.js +6 -3
  81. package/dist/assets/pipeline.d.ts +3 -2
  82. package/dist/assets/pipeline.js +22 -56
  83. package/dist/assets/sharp-loader.d.ts +2 -10
  84. package/dist/assets/sharp-loader.js +2 -10
  85. package/dist/assets/store-local.d.ts +1 -2
  86. package/dist/assets/store-local.js +1 -2
  87. package/dist/assets/store-s3.d.ts +3 -4
  88. package/dist/assets/svg-sanitizer.d.ts +6 -14
  89. package/dist/assets/svg-sanitizer.js +6 -14
  90. package/dist/assets/transform-directives.d.ts +3 -4
  91. package/dist/assets/transform-directives.js +1 -1
  92. package/dist/assets/transform.d.ts +19 -30
  93. package/dist/assets/transform.js +18 -31
  94. package/dist/auth/cache.d.ts +2 -3
  95. package/dist/auth/cache.js +2 -3
  96. package/dist/auth/caching-auth-plugin.d.ts +11 -22
  97. package/dist/auth/caching-auth-plugin.js +12 -14
  98. package/dist/auth/context-helpers.d.ts +6 -20
  99. package/dist/auth/context-helpers.js +5 -17
  100. package/dist/auth/file-based-auth-cache.d.ts +10 -21
  101. package/dist/auth/file-based-auth-cache.js +23 -51
  102. package/dist/auth/plugin.d.ts +29 -61
  103. package/dist/auth/plugin.js +9 -13
  104. package/dist/auth/types.d.ts +11 -20
  105. package/dist/authorization/branch.d.ts +30 -49
  106. package/dist/authorization/branch.js +16 -42
  107. package/dist/authorization/content.d.ts +11 -40
  108. package/dist/authorization/content.js +13 -45
  109. package/dist/authorization/groups/index.d.ts +0 -3
  110. package/dist/authorization/groups/index.js +0 -3
  111. package/dist/authorization/groups/loader.d.ts +14 -28
  112. package/dist/authorization/groups/loader.js +14 -38
  113. package/dist/authorization/groups/schema.d.ts +0 -6
  114. package/dist/authorization/groups/schema.js +4 -7
  115. package/dist/authorization/helpers.d.ts +9 -28
  116. package/dist/authorization/helpers.js +9 -28
  117. package/dist/authorization/index.d.ts +3 -25
  118. package/dist/authorization/index.js +3 -35
  119. package/dist/authorization/path.d.ts +6 -13
  120. package/dist/authorization/path.js +8 -25
  121. package/dist/authorization/permissions/index.d.ts +0 -3
  122. package/dist/authorization/permissions/index.js +0 -3
  123. package/dist/authorization/permissions/loader.d.ts +14 -27
  124. package/dist/authorization/permissions/loader.js +14 -32
  125. package/dist/authorization/permissions/schema.d.ts +1 -6
  126. package/dist/authorization/permissions/schema.js +6 -13
  127. package/dist/authorization/protected-branch.d.ts +36 -65
  128. package/dist/authorization/protected-branch.js +29 -41
  129. package/dist/authorization/settings-file-store.d.ts +38 -81
  130. package/dist/authorization/settings-file-store.js +38 -79
  131. package/dist/authorization/types.d.ts +4 -26
  132. package/dist/authorization/types.js +0 -6
  133. package/dist/authorization/validation.d.ts +1 -23
  134. package/dist/authorization/validation.js +1 -24
  135. package/dist/branch-health.d.ts +39 -67
  136. package/dist/branch-health.js +27 -43
  137. package/dist/branch-metadata-file.d.ts +16 -32
  138. package/dist/branch-metadata-file.js +13 -26
  139. package/dist/branch-metadata.d.ts +49 -80
  140. package/dist/branch-metadata.js +57 -87
  141. package/dist/branch-registry.d.ts +26 -64
  142. package/dist/branch-registry.js +44 -93
  143. package/dist/branch-schema-cache.d.ts +34 -124
  144. package/dist/branch-schema-cache.js +49 -155
  145. package/dist/branch-workspace.d.ts +4 -4
  146. package/dist/branch-workspace.js +15 -19
  147. package/dist/build/generate-ai-content.d.ts +1 -0
  148. package/dist/build/generate-ai-content.js +12 -25
  149. package/dist/build-canopy.d.ts +17 -27
  150. package/dist/build-canopy.js +16 -23
  151. package/dist/build-mode.d.ts +25 -27
  152. package/dist/build-mode.js +25 -29
  153. package/dist/cli/cli.d.ts +15 -26
  154. package/dist/cli/cli.js +601 -978
  155. package/dist/cli/generate-ai-content.js +351 -628
  156. package/dist/cli/github-app-manifest.d.ts +84 -0
  157. package/dist/cli/github-app-manifest.js +161 -0
  158. package/dist/cli/init-github-app.d.ts +110 -444
  159. package/dist/cli/init-github-app.js +236 -773
  160. package/dist/cli/init.js +39 -80
  161. package/dist/cli/migrate.d.ts +13 -10
  162. package/dist/cli/migrate.js +22 -30
  163. package/dist/cli/project-detect.d.ts +17 -31
  164. package/dist/cli/project-detect.js +31 -42
  165. package/dist/cli/project-root.d.ts +4 -11
  166. package/dist/cli/project-root.js +4 -11
  167. package/dist/cli/prompt.d.ts +10 -0
  168. package/dist/cli/prompt.js +67 -0
  169. package/dist/cli/sync.d.ts +0 -8
  170. package/dist/cli/sync.js +8 -28
  171. package/dist/cli/template-files/middleware.ts.template +15 -29
  172. package/dist/cli/templates.d.ts +2 -12
  173. package/dist/cli/templates.js +4 -4
  174. package/dist/client.d.ts +1 -1
  175. package/dist/comment-store.d.ts +32 -53
  176. package/dist/comment-store.js +32 -52
  177. package/dist/config/flatten.d.ts +0 -3
  178. package/dist/config/flatten.js +2 -12
  179. package/dist/config/helpers.js +2 -2
  180. package/dist/config/index.d.ts +2 -2
  181. package/dist/config/index.js +1 -4
  182. package/dist/config/schemas/collection.d.ts +0 -8
  183. package/dist/config/schemas/collection.js +0 -10
  184. package/dist/config/schemas/config.d.ts +6 -78
  185. package/dist/config/schemas/config.js +38 -54
  186. package/dist/config/schemas/field.d.ts +2 -242
  187. package/dist/config/schemas/field.js +9 -20
  188. package/dist/config/schemas/media.js +1 -1
  189. package/dist/config/schemas/permissions.js +0 -2
  190. package/dist/config/schemas/url.d.ts +5 -6
  191. package/dist/config/schemas/url.js +5 -6
  192. package/dist/config/types.d.ts +45 -33
  193. package/dist/config/types.js +0 -1
  194. package/dist/config.d.ts +1 -8
  195. package/dist/config.js +1 -9
  196. package/dist/content-id-index.d.ts +76 -188
  197. package/dist/content-id-index.js +79 -230
  198. package/dist/content-index-generation.d.ts +27 -48
  199. package/dist/content-index-generation.js +35 -84
  200. package/dist/content-index-registry.d.ts +15 -24
  201. package/dist/content-index-registry.js +5 -9
  202. package/dist/content-listing.d.ts +64 -107
  203. package/dist/content-listing.js +68 -118
  204. package/dist/content-reader.d.ts +20 -29
  205. package/dist/content-reader.js +10 -18
  206. package/dist/content-store.d.ts +210 -336
  207. package/dist/content-store.js +413 -657
  208. package/dist/content-tree.d.ts +44 -86
  209. package/dist/content-tree.js +26 -54
  210. package/dist/context.d.ts +67 -94
  211. package/dist/context.js +53 -72
  212. package/dist/dev-content-watcher.d.ts +18 -18
  213. package/dist/dev-content-watcher.js +41 -44
  214. package/dist/editor/BranchManager.d.ts +3 -6
  215. package/dist/editor/BranchManager.js +24 -44
  216. package/dist/editor/CanopyEditor.js +5 -2
  217. package/dist/editor/CommentsPanel.js +0 -2
  218. package/dist/editor/Editor.js +19 -76
  219. package/dist/editor/EditorAuthGate.d.ts +27 -0
  220. package/dist/editor/EditorAuthGate.js +140 -0
  221. package/dist/editor/EntryNavigator.js +0 -20
  222. package/dist/editor/FormRenderer.d.ts +1 -2
  223. package/dist/editor/FormRenderer.js +8 -23
  224. package/dist/editor/admin/SystemHealthPanel.js +20 -37
  225. package/dist/editor/admin/useSystemHealth.d.ts +2 -3
  226. package/dist/editor/admin/useSystemHealth.js +10 -12
  227. package/dist/editor/client-reference-resolver.d.ts +2 -5
  228. package/dist/editor/client-reference-resolver.js +2 -19
  229. package/dist/editor/comments/BranchComments.js +0 -4
  230. package/dist/editor/comments/EntryComments.js +0 -4
  231. package/dist/editor/comments/FieldWrapper.js +0 -4
  232. package/dist/editor/comments/InlineCommentThread.js +0 -2
  233. package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
  234. package/dist/editor/comments/ThreadCarousel.js +0 -12
  235. package/dist/editor/components/EditorFooter.d.ts +0 -8
  236. package/dist/editor/components/EditorFooter.js +0 -5
  237. package/dist/editor/components/EditorHeader.d.ts +0 -31
  238. package/dist/editor/components/EditorHeader.js +21 -71
  239. package/dist/editor/components/EditorSidebar.d.ts +0 -19
  240. package/dist/editor/components/EditorSidebar.js +0 -16
  241. package/dist/editor/components/EntryCreateModal.d.ts +4 -4
  242. package/dist/editor/components/EntryCreateModal.js +7 -22
  243. package/dist/editor/components/RenameEntryModal.js +0 -4
  244. package/dist/editor/components/UserBadge.js +0 -10
  245. package/dist/editor/components/index.js +0 -2
  246. package/dist/editor/context/ApiClientContext.d.ts +8 -7
  247. package/dist/editor/context/ApiClientContext.js +39 -11
  248. package/dist/editor/context/AssetContext.d.ts +7 -17
  249. package/dist/editor/context/AssetContext.js +7 -17
  250. package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
  251. package/dist/editor/context/EditorIdentityContext.js +7 -0
  252. package/dist/editor/context/EditorStateContext.d.ts +10 -41
  253. package/dist/editor/context/EditorStateContext.js +7 -23
  254. package/dist/editor/context/SWRProvider.d.ts +3 -6
  255. package/dist/editor/context/index.d.ts +1 -20
  256. package/dist/editor/context/index.js +1 -20
  257. package/dist/editor/editor-utils.d.ts +8 -47
  258. package/dist/editor/editor-utils.js +19 -72
  259. package/dist/editor/fields/BlockField.d.ts +2 -2
  260. package/dist/editor/fields/BlockField.js +1 -2
  261. package/dist/editor/fields/CodeField.d.ts +0 -1
  262. package/dist/editor/fields/CodeField.js +0 -1
  263. package/dist/editor/fields/DateTimeField.d.ts +15 -22
  264. package/dist/editor/fields/DateTimeField.js +17 -26
  265. package/dist/editor/fields/ImageField.d.ts +2 -2
  266. package/dist/editor/fields/ImageField.js +8 -14
  267. package/dist/editor/fields/InlineGroupField.d.ts +0 -1
  268. package/dist/editor/fields/InlineGroupField.js +0 -1
  269. package/dist/editor/fields/MarkdownField.d.ts +0 -1
  270. package/dist/editor/fields/MarkdownField.js +6 -11
  271. package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
  272. package/dist/editor/fields/MdxImageDialog.js +0 -1
  273. package/dist/editor/fields/NumberField.d.ts +9 -19
  274. package/dist/editor/fields/NumberField.js +11 -22
  275. package/dist/editor/fields/NumberListField.d.ts +7 -10
  276. package/dist/editor/fields/NumberListField.js +7 -10
  277. package/dist/editor/fields/ObjectField.d.ts +5 -8
  278. package/dist/editor/fields/ObjectField.js +0 -1
  279. package/dist/editor/fields/ReferenceField.d.ts +1 -1
  280. package/dist/editor/fields/ReferenceField.js +11 -16
  281. package/dist/editor/fields/SelectField.d.ts +2 -2
  282. package/dist/editor/fields/SelectField.js +0 -1
  283. package/dist/editor/fields/StringListField.d.ts +0 -4
  284. package/dist/editor/fields/StringListField.js +4 -9
  285. package/dist/editor/fields/TextField.d.ts +0 -1
  286. package/dist/editor/fields/TextField.js +0 -1
  287. package/dist/editor/fields/ToggleField.d.ts +0 -1
  288. package/dist/editor/fields/ToggleField.js +0 -1
  289. package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
  290. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
  291. package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
  292. package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
  293. package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
  294. package/dist/editor/group-manager/GroupCard.d.ts +0 -3
  295. package/dist/editor/group-manager/GroupForm.d.ts +0 -3
  296. package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
  297. package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
  298. package/dist/editor/group-manager/MemberList.d.ts +0 -3
  299. package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
  300. package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
  301. package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
  302. package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
  303. package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
  304. package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
  305. package/dist/editor/group-manager/index.d.ts +0 -6
  306. package/dist/editor/group-manager/index.js +0 -10
  307. package/dist/editor/group-manager/types.d.ts +2 -5
  308. package/dist/editor/group-manager/types.js +0 -3
  309. package/dist/editor/hooks/index.d.ts +6 -11
  310. package/dist/editor/hooks/index.js +6 -12
  311. package/dist/editor/hooks/useBranchActions.d.ts +0 -14
  312. package/dist/editor/hooks/useBranchActions.js +0 -22
  313. package/dist/editor/hooks/useBranchManager.d.ts +2 -48
  314. package/dist/editor/hooks/useBranchManager.js +4 -64
  315. package/dist/editor/hooks/useBranchesData.d.ts +7 -6
  316. package/dist/editor/hooks/useBranchesData.js +7 -6
  317. package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
  318. package/dist/editor/hooks/useCommentSystem.js +1 -36
  319. package/dist/editor/hooks/useDraftManager.d.ts +2 -35
  320. package/dist/editor/hooks/useDraftManager.js +23 -64
  321. package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
  322. package/dist/editor/hooks/useEditorLayout.js +0 -23
  323. package/dist/editor/hooks/useEntriesData.d.ts +1 -0
  324. package/dist/editor/hooks/useEntriesData.js +2 -3
  325. package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
  326. package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
  327. package/dist/editor/hooks/useEntryManager.d.ts +2 -27
  328. package/dist/editor/hooks/useEntryManager.js +29 -78
  329. package/dist/editor/hooks/useGroupManager.d.ts +0 -21
  330. package/dist/editor/hooks/useGroupManager.js +0 -21
  331. package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
  332. package/dist/editor/hooks/usePermissionManager.js +0 -20
  333. package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
  334. package/dist/editor/hooks/useReferenceResolution.js +1 -48
  335. package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
  336. package/dist/editor/hooks/useSchemaManager.js +0 -19
  337. package/dist/editor/hooks/useUserContext.d.ts +2 -9
  338. package/dist/editor/hooks/useUserContext.js +10 -10
  339. package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
  340. package/dist/editor/hooks/useUserMetadata.js +0 -3
  341. package/dist/editor/media/AssetCard.d.ts +0 -1
  342. package/dist/editor/media/AssetCard.js +1 -2
  343. package/dist/editor/media/CropStep.d.ts +0 -1
  344. package/dist/editor/media/CropStep.js +0 -1
  345. package/dist/editor/media/MediaLibrary.d.ts +1 -2
  346. package/dist/editor/media/MediaLibrary.js +1 -2
  347. package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
  348. package/dist/editor/media/MediaLibraryBody.js +0 -1
  349. package/dist/editor/media/crop-math.d.ts +1 -1
  350. package/dist/editor/media/crop-math.js +1 -1
  351. package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
  352. package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
  353. package/dist/editor/permission-manager/PermissionEditor.js +0 -1
  354. package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
  355. package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
  356. package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
  357. package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
  358. package/dist/editor/permission-manager/constants.d.ts +0 -3
  359. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
  360. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
  361. package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
  362. package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
  363. package/dist/editor/permission-manager/index.d.ts +0 -7
  364. package/dist/editor/permission-manager/index.js +0 -16
  365. package/dist/editor/permission-manager/types.d.ts +2 -12
  366. package/dist/editor/permission-manager/types.js +0 -3
  367. package/dist/editor/permission-manager/utils.d.ts +0 -28
  368. package/dist/editor/permission-manager/utils.js +9 -23
  369. package/dist/editor/preview-bridge.d.ts +5 -1
  370. package/dist/editor/preview-bridge.js +4 -4
  371. package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
  372. package/dist/editor/schema-editor/CollectionEditor.js +9 -31
  373. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
  374. package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
  375. package/dist/editor/schema-editor/index.d.ts +0 -7
  376. package/dist/editor/schema-editor/index.js +0 -7
  377. package/dist/editor/utils/env.d.ts +3 -18
  378. package/dist/editor/utils/env.js +6 -25
  379. package/dist/entry-link-resolver.d.ts +13 -35
  380. package/dist/entry-link-resolver.js +20 -53
  381. package/dist/entry-schema-registry.d.ts +20 -60
  382. package/dist/entry-schema-registry.js +20 -69
  383. package/dist/entry-schema.d.ts +118 -223
  384. package/dist/entry-schema.js +46 -91
  385. package/dist/git-manager.d.ts +101 -200
  386. package/dist/git-manager.js +211 -384
  387. package/dist/github-service.d.ts +34 -75
  388. package/dist/github-service.js +37 -91
  389. package/dist/http/handler.d.ts +6 -37
  390. package/dist/http/handler.js +65 -120
  391. package/dist/http/router.d.ts +15 -32
  392. package/dist/http/router.js +34 -99
  393. package/dist/http/types.d.ts +15 -40
  394. package/dist/http/types.js +3 -7
  395. package/dist/id.d.ts +4 -10
  396. package/dist/id.js +4 -10
  397. package/dist/index.js +6 -9
  398. package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
  399. package/dist/operating-mode/client-safe-strategy.js +8 -28
  400. package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
  401. package/dist/operating-mode/client-unsafe-strategy.js +9 -34
  402. package/dist/operating-mode/client.d.ts +3 -10
  403. package/dist/operating-mode/client.js +3 -8
  404. package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
  405. package/dist/operating-mode/deployment-name-fixtures.js +14 -18
  406. package/dist/operating-mode/deployment-name.d.ts +19 -29
  407. package/dist/operating-mode/deployment-name.js +29 -47
  408. package/dist/operating-mode/index.d.ts +4 -25
  409. package/dist/operating-mode/index.js +9 -31
  410. package/dist/operating-mode/mode-env.d.ts +32 -54
  411. package/dist/operating-mode/mode-env.js +36 -58
  412. package/dist/operating-mode/types.d.ts +24 -72
  413. package/dist/operating-mode/types.js +1 -7
  414. package/dist/paths/branch-name.d.ts +30 -40
  415. package/dist/paths/branch-name.js +30 -40
  416. package/dist/paths/branch.d.ts +4 -18
  417. package/dist/paths/branch.js +6 -22
  418. package/dist/paths/index.d.ts +2 -13
  419. package/dist/paths/index.js +3 -23
  420. package/dist/paths/normalize-server.d.ts +3 -15
  421. package/dist/paths/normalize-server.js +3 -15
  422. package/dist/paths/normalize.d.ts +13 -33
  423. package/dist/paths/normalize.js +13 -33
  424. package/dist/paths/resolve.d.ts +4 -17
  425. package/dist/paths/resolve.js +4 -22
  426. package/dist/paths/types.d.ts +12 -34
  427. package/dist/paths/types.js +5 -7
  428. package/dist/paths/validation.d.ts +22 -119
  429. package/dist/paths/validation.js +30 -148
  430. package/dist/reference-resolver.d.ts +0 -13
  431. package/dist/reference-resolver.js +0 -18
  432. package/dist/resolve-canopy-user.d.ts +16 -18
  433. package/dist/resolve-canopy-user.js +17 -26
  434. package/dist/resource-generation.d.ts +16 -25
  435. package/dist/resource-generation.js +34 -97
  436. package/dist/schema/meta-loader.d.ts +2 -14
  437. package/dist/schema/meta-loader.js +15 -64
  438. package/dist/schema/resolver.d.ts +1 -4
  439. package/dist/schema/resolver.js +1 -6
  440. package/dist/schema/schema-store-types.d.ts +0 -12
  441. package/dist/schema/schema-store.d.ts +61 -138
  442. package/dist/schema/schema-store.js +85 -282
  443. package/dist/schema/types.d.ts +0 -4
  444. package/dist/server.d.ts +62 -93
  445. package/dist/server.js +63 -94
  446. package/dist/services.d.ts +23 -47
  447. package/dist/services.js +55 -98
  448. package/dist/settings-workspace.d.ts +17 -30
  449. package/dist/settings-workspace.js +51 -81
  450. package/dist/static/index.d.ts +26 -52
  451. package/dist/static/index.js +33 -67
  452. package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
  453. package/dist/task-queue/cms-task-queue.js +13 -0
  454. package/dist/task-queue/task-queue-config.d.ts +3 -0
  455. package/dist/{worker → task-queue}/task-queue-config.js +1 -6
  456. package/dist/task-queue/task-queue.d.ts +16 -22
  457. package/dist/task-queue/task-queue.js +20 -44
  458. package/dist/task-queue/types.d.ts +0 -1
  459. package/dist/task-queue/worker-status.d.ts +35 -0
  460. package/dist/task-queue/worker-status.js +40 -0
  461. package/dist/types.d.ts +40 -51
  462. package/dist/url-collision.d.ts +26 -40
  463. package/dist/url-collision.js +47 -63
  464. package/dist/url-exclusivity-fixtures.d.ts +15 -20
  465. package/dist/url-exclusivity-fixtures.js +14 -19
  466. package/dist/url-path-resolver.d.ts +8 -16
  467. package/dist/url-path-resolver.js +19 -29
  468. package/dist/user.d.ts +8 -21
  469. package/dist/user.js +10 -19
  470. package/dist/utils/async-mutex.js +4 -6
  471. package/dist/utils/atomic-write.d.ts +2 -11
  472. package/dist/utils/atomic-write.js +2 -11
  473. package/dist/utils/body-field.d.ts +8 -15
  474. package/dist/utils/body-field.js +8 -15
  475. package/dist/utils/content-serialize.d.ts +18 -24
  476. package/dist/utils/content-serialize.js +109 -160
  477. package/dist/utils/content-write-lock.d.ts +51 -106
  478. package/dist/utils/content-write-lock.js +66 -111
  479. package/dist/utils/debug.d.ts +7 -23
  480. package/dist/utils/debug.js +7 -23
  481. package/dist/utils/entry-url.d.ts +11 -23
  482. package/dist/utils/entry-url.js +11 -26
  483. package/dist/utils/error.d.ts +25 -90
  484. package/dist/utils/error.js +60 -147
  485. package/dist/utils/flatten-group-fields.d.ts +5 -7
  486. package/dist/utils/flatten-group-fields.js +5 -7
  487. package/dist/utils/format.d.ts +1 -5
  488. package/dist/utils/format.js +1 -5
  489. package/dist/utils/fs.d.ts +3 -4
  490. package/dist/utils/fs.js +3 -4
  491. package/dist/utils/git.d.ts +52 -83
  492. package/dist/utils/git.js +79 -125
  493. package/dist/utils/logger.d.ts +35 -50
  494. package/dist/utils/logger.js +35 -52
  495. package/dist/utils/provisioning-lock.d.ts +23 -35
  496. package/dist/utils/provisioning-lock.js +49 -69
  497. package/dist/utils/sanitize-href.d.ts +5 -10
  498. package/dist/utils/sanitize-href.js +8 -18
  499. package/dist/utils/title-field.d.ts +17 -20
  500. package/dist/utils/title-field.js +18 -27
  501. package/dist/utils/typed-filename.d.ts +20 -48
  502. package/dist/utils/typed-filename.js +25 -61
  503. package/dist/utils/url-prefix.d.ts +3 -3
  504. package/dist/utils/url-prefix.js +3 -3
  505. package/dist/validation/block-structural-keys.d.ts +16 -31
  506. package/dist/validation/block-structural-keys.js +19 -29
  507. package/dist/validation/deletion-checker.d.ts +0 -34
  508. package/dist/validation/deletion-checker.js +1 -43
  509. package/dist/validation/entry-link-validator.d.ts +6 -13
  510. package/dist/validation/entry-link-validator.js +4 -13
  511. package/dist/validation/entry-type-reference-validator.d.ts +13 -18
  512. package/dist/validation/entry-type-reference-validator.js +13 -18
  513. package/dist/validation/entry-validator.d.ts +13 -25
  514. package/dist/validation/entry-validator.js +15 -32
  515. package/dist/validation/field-traversal.d.ts +3 -30
  516. package/dist/validation/field-traversal.js +1 -32
  517. package/dist/validation/reference-validator.d.ts +5 -24
  518. package/dist/validation/reference-validator.js +5 -30
  519. package/dist/worker/cms-worker.d.ts +172 -232
  520. package/dist/worker/cms-worker.js +241 -333
  521. package/dist/worker/git-sync.d.ts +32 -133
  522. package/dist/worker/git-sync.js +129 -191
  523. package/dist/worker/github-auth.d.ts +13 -19
  524. package/dist/worker/github-auth.js +13 -19
  525. package/dist/worker/history-rewrite.d.ts +53 -66
  526. package/dist/worker/history-rewrite.js +54 -60
  527. package/dist/worker/log.d.ts +24 -41
  528. package/dist/worker/log.js +25 -42
  529. package/dist/worker/rebase.d.ts +20 -110
  530. package/dist/worker/rebase.js +279 -354
  531. package/dist/worker/task-runner.d.ts +32 -66
  532. package/dist/worker/task-runner.js +126 -162
  533. package/dist/worker/worker-context.d.ts +41 -81
  534. package/package.json +4 -4
  535. package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
  536. package/dist/worker/task-queue-config.d.ts +0 -8
  537. package/dist/worker/task-queue.js +0 -19
  538. package/dist/worker/worker-status.d.ts +0 -47
  539. package/dist/worker/worker-status.js +0 -52
@@ -1,25 +1,17 @@
1
1
  import { trimSlashes } from './paths/normalize.js';
2
2
  import { isIndexSlug } from './utils/entry-url.js';
3
3
  /**
4
- * Resolves a URL path to candidate entryPath/slug pairs for content lookup.
4
+ * Resolve a URL path to the candidate entryPath/slug pairs a lookup should try, in order:
5
5
  *
6
- * Returns an ordered list of attempts:
7
- * 1. Direct entry: last segment is slug, rest is collection path — SKIPPED when that slug is
8
- * literally 'index' (see below)
9
- * 2. Index fallback: full path is collection, slug is 'index'
6
+ * 1. Direct entry: last segment is the slug, the rest is the collection path — SKIPPED when that
7
+ * slug is an index slug (see below).
8
+ * 2. Index fallback: the whole path is a collection and the slug is 'index'.
10
9
  *
11
- * This is the REVERSE of the forward collection+slug -> url rule, and the two must agree on how
12
- * many URLs an entry answers at. The forward rule (`computeEntryUrl` in utils/entry-url.ts, which
10
+ * This is the REVERSE of the forward collection+slug -> url rule and must agree with it about how
11
+ * many URLs an entry answers at. The forward rule — `computeEntryUrl` (utils/entry-url.ts), which
13
12
  * `listEntries` publishes as `item.urlPath` and reference resolution stamps on every resolved
14
- * reference; and `defaultBuildPath` in content-tree.ts for tree nodes) collapses an `index` slug
15
- * onto its collection's path and never emits a trailing `/index`. Candidate 1 used to match it
16
- * anyway, so an index entry ALSO answered at a `.../index` URL that no forward surface publishes
17
- * — enumeration and resolution disagreeing about how many URLs exist. Adopters paid for that with
18
- * per-route entryType gates whose only job was to reject the phantom.
19
- *
20
- * @param urlPath - URL path like '/docs/guides/getting-started' or 'docs/guides'
21
- * @param contentRoot - Content root directory name (default: 'content')
22
- * @returns Array of { entryPath, slug } candidates to try in order
13
+ * reference, plus `defaultBuildPath` (content-tree.ts) for tree nodes — collapses an `index` slug
14
+ * onto its collection's path and never emits a trailing `/index`.
23
15
  */
24
16
  export function resolveUrlPathCandidates(urlPath, contentRoot) {
25
17
  const normalized = trimSlashes(urlPath);
@@ -29,24 +21,23 @@ export function resolveUrlPathCandidates(urlPath, contentRoot) {
29
21
  const candidates = [];
30
22
  // Try 1: last segment is the entry slug, rest is the collection path.
31
23
  //
32
- // Skipped when that slug is an index slug. An index entry's ADVERTISED URL is its collapsed
24
+ // Skipped when that slug is an index slug: an index entry's ADVERTISED URL is its collapsed
33
25
  // collection path, so matching it here would answer at a second URL enumeration never emits.
34
- // `index` is not a contrived segment either — it is the slug the index convention requires on
35
- // disk, so the collision was structural rather than accidental.
26
+ // `index` is the slug the index convention requires on disk, so the collision is structural
27
+ // rather than contrived.
36
28
  //
37
- // This closes the `.../index` spelling only. The other extra URLs an entry answered at —
29
+ // This closes the `.../index` spelling only. The other extra URLs an entry can answer at —
38
30
  // `/<collection>/<entryTypeName>` via candidate 2, and `/<collection>/<entryTypeName>/<slug>`
39
31
  // via candidate 1 — are closed DOWNSTREAM instead, by `readByUrlPath` requiring every
40
32
  // candidate's `entryPath` to be a collection (`ReadContentInput.urlAddressableOnly`). They have
41
- // to be: telling those apart needs the branch's schema, and this module is deliberately pure
42
- // and schema-free so that the candidate shapes stay a fact about URLs rather than about
43
- // content. The consequence to keep in mind when reading this file: the candidates below are
44
- // what is ATTEMPTED, not what can resolve.
33
+ // to be: telling those apart needs the branch's schema, and this module is deliberately pure and
34
+ // schema-free so the candidate shapes stay a fact about URLs rather than about content. So the
35
+ // candidates below are what is ATTEMPTED, not what can resolve.
45
36
  //
46
- // Compared case-INSENSITIVELY, through the shared `isIndexSlug`. This function is the one
47
- // consumer that sees a raw, un-normalized URL segment — everything downstream lowercases
48
- // (`parseSlug`, and ContentStore's directory scan) — so a strict compare here closed
49
- // `/x/index` while leaving `/x/Index` and `/x/INDEX` resolving the very entry it exists to hide.
37
+ // Compared case-INSENSITIVELY through the shared `isIndexSlug`: this function is the one consumer
38
+ // that sees a raw, un-normalized URL segment (`parseSlug` and ContentStore's directory scan
39
+ // lowercase downstream), so a strict compare would close `/x/index` while leaving `/x/Index` and
40
+ // `/x/INDEX` resolving the very entry the skip exists to hide.
50
41
  const slug = segments[segments.length - 1];
51
42
  const collectionSegments = segments.slice(0, -1);
52
43
  const entryPath = collectionSegments.length > 0 ? `${contentRoot}/${collectionSegments.join('/')}` : contentRoot;
@@ -58,7 +49,6 @@ export function resolveUrlPathCandidates(urlPath, contentRoot) {
58
49
  // Kept unconditionally, which is what makes the skip above a skip rather than a removal: a
59
50
  // collection literally NAMED `index` is handed the path `/x/index` by
60
51
  // `defaultBuildPath(kind: 'collection')`, and this candidate is the only one that can answer it.
61
- // (Candidate 1 used to shadow that collection entirely, returning the parent's own index entry.)
62
52
  candidates.push({
63
53
  entryPath: `${contentRoot}/${segments.join('/')}`,
64
54
  slug: 'index',
package/dist/user.d.ts CHANGED
@@ -1,17 +1,13 @@
1
1
  import type { CanopyUserId, CanopyGroupId } from './types.js';
2
2
  import type { AuthenticationResult } from './auth/types.js';
3
3
  import type { InternalGroup } from './authorization/groups/schema.js';
4
- /**
5
- * Anonymous user - explicitly marked for public/unauthenticated access
6
- */
4
+ /** Anonymous user — explicit public/unauthenticated access. */
7
5
  export interface AnonymousUser {
8
6
  type: 'anonymous';
9
7
  userId: 'anonymous';
10
8
  groups: readonly [];
11
9
  }
12
- /**
13
- * Authenticated user - verified identity from auth provider
14
- */
10
+ /** Authenticated user — verified identity from the auth provider. */
15
11
  export interface AuthenticatedUser {
16
12
  type: 'authenticated';
17
13
  userId: CanopyUserId;
@@ -20,24 +16,15 @@ export interface AuthenticatedUser {
20
16
  name?: string;
21
17
  avatarUrl?: string;
22
18
  }
23
- /**
24
- * Unified user type for all CanopyCMS operations
25
- */
19
+ /** Unified user type for all CanopyCMS operations. */
26
20
  export type CanopyUser = AnonymousUser | AuthenticatedUser;
27
- /**
28
- * Branded ANONYMOUS_USER constant - use this for intentional anonymous access.
29
- * Callers must explicitly pass this to indicate anonymous access is intended.
30
- */
21
+ /** Pass this constant explicitly wherever anonymous access is intended. */
31
22
  export declare const ANONYMOUS_USER: AnonymousUser;
32
23
  /**
33
- * Convert authentication result to CanopyUser.
34
- * Applies bootstrap admin groups, merges internal groups, and returns ANONYMOUS_USER if not authenticated.
35
- *
36
- * This is the SINGLE source of truth for converting external auth to CanopyUser.
24
+ * Convert an authentication result to a CanopyUser: applies bootstrap admin groups, merges
25
+ * internal groups, returns ANONYMOUS_USER when not authenticated. The SINGLE source of truth
26
+ * for turning external auth into a CanopyUser.
37
27
  *
38
- * @param authResult - Result from auth plugin's authenticate() method
39
- * @param bootstrapAdminIds - Set of user IDs that should always be admins
40
- * @param internalGroups - Optional internal groups from .canopycms/groups.json (loaded by caller)
41
- * @returns CanopyUser (either authenticated with groups or ANONYMOUS_USER)
28
+ * @param internalGroups - Internal groups from .canopycms/groups.json, loaded by the caller.
42
29
  */
43
30
  export declare function authResultToCanopyUser(authResult: AuthenticationResult, bootstrapAdminIds: Set<string>, internalGroups?: InternalGroup[]): CanopyUser;
package/dist/user.js CHANGED
@@ -1,40 +1,31 @@
1
1
  // Import from client-safe subpaths to avoid pulling in server-only loader code
2
2
  import { RESERVED_GROUPS, stripReservedGroups } from './authorization/helpers.js';
3
- /**
4
- * Branded ANONYMOUS_USER constant - use this for intentional anonymous access.
5
- * Callers must explicitly pass this to indicate anonymous access is intended.
6
- */
3
+ /** Pass this constant explicitly wherever anonymous access is intended. */
7
4
  export const ANONYMOUS_USER = Object.freeze({
8
5
  type: 'anonymous',
9
6
  userId: 'anonymous',
10
7
  groups: [],
11
8
  });
12
9
  /**
13
- * Convert authentication result to CanopyUser.
14
- * Applies bootstrap admin groups, merges internal groups, and returns ANONYMOUS_USER if not authenticated.
15
- *
16
- * This is the SINGLE source of truth for converting external auth to CanopyUser.
10
+ * Convert an authentication result to a CanopyUser: applies bootstrap admin groups, merges
11
+ * internal groups, returns ANONYMOUS_USER when not authenticated. The SINGLE source of truth
12
+ * for turning external auth into a CanopyUser.
17
13
  *
18
- * @param authResult - Result from auth plugin's authenticate() method
19
- * @param bootstrapAdminIds - Set of user IDs that should always be admins
20
- * @param internalGroups - Optional internal groups from .canopycms/groups.json (loaded by caller)
21
- * @returns CanopyUser (either authenticated with groups or ANONYMOUS_USER)
14
+ * @param internalGroups - Internal groups from .canopycms/groups.json, loaded by the caller.
22
15
  */
23
16
  export function authResultToCanopyUser(authResult, bootstrapAdminIds, internalGroups) {
24
17
  if (!authResult.success || !authResult.user) {
25
18
  return ANONYMOUS_USER;
26
19
  }
27
- // Step 1: Start with external groups from the auth provider.
28
- // SECURITY (SEC-H1): reserved privileged group IDs (Admins/Reviewers) are
29
- // stripped here so a provider-controlled group name can never grant
30
- // CanopyCMS privilege. Reserved membership is only added below, from
31
- // bootstrapAdminIds and Canopy-managed internal groups.
20
+ // SECURITY (SEC-H1): the privileged group IDs held in `RESERVED_GROUPS` are stripped from the
21
+ // provider's list here, so a provider-controlled group name can never grant CanopyCMS
22
+ // privilege. Reserved membership is added only below, from bootstrapAdminIds and
23
+ // Canopy-managed internal groups.
32
24
  const groups = stripReservedGroups(authResult.user.externalGroups ?? []);
33
- // Step 2: Add Admins group if user is in bootstrap admin list
34
25
  if (bootstrapAdminIds.has(authResult.user.userId) && !groups.includes(RESERVED_GROUPS.ADMINS)) {
35
26
  groups.push(RESERVED_GROUPS.ADMINS);
36
27
  }
37
- // Step 3: Merge internal groups from .canopycms/groups.json
28
+ // Internal groups from .canopycms/groups.json.
38
29
  if (internalGroups) {
39
30
  for (const group of internalGroups) {
40
31
  if (group.members.includes(authResult.user.userId) && !groups.includes(group.id)) {
@@ -1,11 +1,9 @@
1
1
  /**
2
- * FIFO per-key async mutex.
2
+ * FIFO per-key async mutex, keyed by any string that uniquely identifies the resource (usually
3
+ * an absolute file path). Module-level, so it serializes only within one process.
3
4
  *
4
- * Module-level map so all callers within the same process share the same set of locks.
5
- * Lock key = absolute file path (or any string that uniquely identifies the resource).
6
- *
7
- * Each caller atomically enqueues itself behind the current tail and only ever wakes
8
- * once — guaranteeing strict FIFO order with no thundering-herd on release.
5
+ * Each caller atomically enqueues itself behind the current tail and wakes exactly once: strict
6
+ * FIFO order, no thundering herd on release.
9
7
  */
10
8
  const locks = new Map();
11
9
  export async function withLock(key, fn) {
@@ -1,14 +1,5 @@
1
1
  /**
2
- * Atomic file write utility.
3
- *
4
- * Writes to a temp file first, then renames over the target.
5
- * Prevents partial/interleaved writes that corrupt files on NFS/EFS.
6
- */
7
- /**
8
- * Atomically write content to a file via temp-file + rename.
9
- * Ensures the target file is never partially written.
10
- *
11
- * @param filePath - Absolute path to the target file
12
- * @param content - String or binary content to write
2
+ * Atomic file write: temp file first, then rename over the target, so the file is never
3
+ * partially written. Prevents the interleaved writes that corrupt files on NFS/EFS.
13
4
  */
14
5
  export declare function atomicWriteFile(filePath: string, content: string | Buffer | Uint8Array): Promise<void>;
@@ -1,18 +1,9 @@
1
1
  /**
2
- * Atomic file write utility.
3
- *
4
- * Writes to a temp file first, then renames over the target.
5
- * Prevents partial/interleaved writes that corrupt files on NFS/EFS.
2
+ * Atomic file write: temp file first, then rename over the target, so the file is never
3
+ * partially written. Prevents the interleaved writes that corrupt files on NFS/EFS.
6
4
  */
7
5
  import fs from 'node:fs/promises';
8
6
  import path from 'node:path';
9
- /**
10
- * Atomically write content to a file via temp-file + rename.
11
- * Ensures the target file is never partially written.
12
- *
13
- * @param filePath - Absolute path to the target file
14
- * @param content - String or binary content to write
15
- */
16
7
  export async function atomicWriteFile(filePath, content) {
17
8
  const dir = path.dirname(filePath);
18
9
  await fs.mkdir(dir, { recursive: true });
@@ -1,28 +1,21 @@
1
1
  import type { FieldConfig } from '../config/index.js';
2
2
  /**
3
- * Count the number of top-level fields marked `isBody: true` in a schema.
4
- * Does NOT recurse into objects — isBody only makes sense at the top level
5
- * because it maps to the file's markdown content.
3
+ * Count top-level fields marked `isBody: true`. Does NOT recurse into objects — `isBody` maps
4
+ * to the file's markdown content, which exists only at the top level.
6
5
  */
7
6
  export declare function countBodyFields(fields: readonly FieldConfig[]): number;
8
- /**
9
- * Find the name of the field marked `isBody: true`, or `'body'` as the default.
10
- * Used at read time to map the markdown file's content to the correct data field.
11
- */
7
+ /** Name of the `isBody: true` field, or `'body'`; maps the file's markdown onto a data field. */
12
8
  export declare function findBodyFieldName(fields: readonly FieldConfig[]): string;
13
9
  /**
14
10
  * Find an isBody field whose NAME is reserved by reference resolution.
15
11
  *
16
12
  * A resolved reference reserves `id`/`slug`/`collection`/`urlPath` by applying them after the
17
13
  * target's data. The body is the one value assigned by key rather than spread, so a body field
18
- * named e.g. `id` would be the single way to get around that — and since the write boundary
19
- * recovers a reference's id from `value.id`, re-saving would then persist the prose as the
20
- * reference. Rejected at registry-validation time instead, so the schema fails loudly rather
21
- * than the body being silently dropped at resolution.
14
+ * named e.g. `id` is the one way around that — and the write boundary recovers a reference's id
15
+ * from `value.id`, so re-saving would persist the prose as the reference. Rejected at
16
+ * registry-validation time, so the schema fails loudly instead of the body being silently
17
+ * dropped at resolution.
22
18
  */
23
19
  export declare function findReservedBodyFieldName(fields: readonly FieldConfig[], reserved: readonly string[]): string | undefined;
24
- /**
25
- * Find isBody fields that have an invalid type (not 'markdown' or 'mdx').
26
- * Returns field names that fail validation.
27
- */
20
+ /** Names of isBody fields whose type is neither 'markdown' nor 'mdx'. */
28
21
  export declare function findInvalidBodyFields(fields: readonly FieldConfig[]): string[];
@@ -1,9 +1,8 @@
1
1
  import { flattenGroupFields } from './flatten-group-fields.js';
2
2
  const BODY_FIELD_TYPES = new Set(['markdown', 'mdx']);
3
3
  /**
4
- * Count the number of top-level fields marked `isBody: true` in a schema.
5
- * Does NOT recurse into objects — isBody only makes sense at the top level
6
- * because it maps to the file's markdown content.
4
+ * Count top-level fields marked `isBody: true`. Does NOT recurse into objects — `isBody` maps
5
+ * to the file's markdown content, which exists only at the top level.
7
6
  */
8
7
  export function countBodyFields(fields) {
9
8
  let count = 0;
@@ -13,10 +12,7 @@ export function countBodyFields(fields) {
13
12
  }
14
13
  return count;
15
14
  }
16
- /**
17
- * Find the name of the field marked `isBody: true`, or `'body'` as the default.
18
- * Used at read time to map the markdown file's content to the correct data field.
19
- */
15
+ /** Name of the `isBody: true` field, or `'body'`; maps the file's markdown onto a data field. */
20
16
  export function findBodyFieldName(fields) {
21
17
  for (const field of flattenGroupFields(fields)) {
22
18
  if ('isBody' in field && field.isBody)
@@ -29,10 +25,10 @@ export function findBodyFieldName(fields) {
29
25
  *
30
26
  * A resolved reference reserves `id`/`slug`/`collection`/`urlPath` by applying them after the
31
27
  * target's data. The body is the one value assigned by key rather than spread, so a body field
32
- * named e.g. `id` would be the single way to get around that — and since the write boundary
33
- * recovers a reference's id from `value.id`, re-saving would then persist the prose as the
34
- * reference. Rejected at registry-validation time instead, so the schema fails loudly rather
35
- * than the body being silently dropped at resolution.
28
+ * named e.g. `id` is the one way around that — and the write boundary recovers a reference's id
29
+ * from `value.id`, so re-saving would persist the prose as the reference. Rejected at
30
+ * registry-validation time, so the schema fails loudly instead of the body being silently
31
+ * dropped at resolution.
36
32
  */
37
33
  export function findReservedBodyFieldName(fields, reserved) {
38
34
  for (const field of flattenGroupFields(fields)) {
@@ -41,10 +37,7 @@ export function findReservedBodyFieldName(fields, reserved) {
41
37
  }
42
38
  return undefined;
43
39
  }
44
- /**
45
- * Find isBody fields that have an invalid type (not 'markdown' or 'mdx').
46
- * Returns field names that fail validation.
47
- */
40
+ /** Names of isBody fields whose type is neither 'markdown' nor 'mdx'. */
48
41
  export function findInvalidBodyFields(fields) {
49
42
  const invalid = [];
50
43
  for (const field of flattenGroupFields(fields)) {
@@ -1,37 +1,31 @@
1
1
  /**
2
2
  * Comment-preserving serialisation for YAML content files and md/mdx frontmatter.
3
3
  *
4
- * ContentStore used to write a content file by stringifying a fresh plain object
5
- * (`yamlStringify(data)` / `matter.stringify(body, data)`). Comments live in neither the object
6
- * nor that round trip, so **every editor save silently deleted every comment in the file** —
7
- * invisible to a dev team (`canopycms sync` copies files byte-for-byte) and certain for an
8
- * editorial team. See `.claude/future-tasks/resolved/content-comment-loss-on-editor-save.md`.
4
+ * Stringifying a fresh plain object (`yamlStringify(data)` / `matter.stringify(body, data)`)
5
+ * deletes every comment in the file, because comments live in neither the object nor that round
6
+ * trip. So these functions re-serialise onto the file's OWN parsed document: a node whose value
7
+ * did not change is left untouched, and an untouched node keeps its attached comments and its
8
+ * original quoting/block style. Only what actually changed is rewritten.
9
9
  *
10
- * The fix re-serialises onto the file's OWN parsed document instead of a fresh one: nodes whose
11
- * value did not change are left untouched, and an untouched node keeps its attached comments
12
- * (and its original quoting/block style). Only what actually changed is rewritten.
13
- *
14
- * What this module does NOT do is give the file any authority over its own content. The
15
- * reconciler makes the document's key set match `data` exactly — a key the caller dropped
16
- * disappears, a key the caller kept survives whether or not the schema still knows about it.
17
- * Data authority stays with the payload; comments are the only thing inherited from disk. That
18
- * separation is deliberate: whether a surviving key SHOULD still be there is a schema question,
19
- * answered one layer up by `findUnknownKeys` (validation/entry-validator.ts) at the API
20
- * boundary, not by a serialiser that has no schema.
10
+ * The file gets no authority over its own content. The reconciler makes the document's key set
11
+ * match `data` exactly — a key the caller dropped disappears, a key the caller kept survives
12
+ * whether or not the schema still knows about it. Data authority stays with the payload;
13
+ * comments are the only thing inherited from disk. Whether a surviving key SHOULD still be there
14
+ * is a schema question, answered one layer up by `findUnknownKeys`
15
+ * (validation/entry-validator.ts) at the API boundary, not by a schema-blind serialiser.
21
16
  */
22
17
  /**
23
18
  * Serialise entry data as a YAML file, carrying the comments of `existingRaw` through.
24
19
  *
25
- * Falls back to a plain stringify — byte-identical to the pre-fix behaviour — when there is
26
- * nothing to preserve (a new file) or nothing trustworthy to preserve (the bytes on disk do not
27
- * parse). A save must not fail because the previous content was malformed.
20
+ * Falls back to a plain stringify — byte-identical to serialising without preservation — when
21
+ * there is nothing to preserve (a new file) or nothing trustworthy to preserve (the bytes on disk
22
+ * do not parse). A save must not fail because the previous content was malformed.
28
23
  */
29
24
  export declare function serializeYaml(data: Record<string, unknown>, existingRaw?: string): string;
30
25
  /**
31
- * Serialise an md/mdx entry, carrying the comments of `existingRaw`'s frontmatter through.
32
- *
33
- * The reconciled YAML goes back through `matter.stringify` via a custom stringify engine rather
34
- * than being spliced between hand-written `---` lines, so the delimiters, blank lines and
35
- * trailing newline stay exactly what gray-matter would have produced.
26
+ * Serialise an md/mdx entry, carrying the comments of `existingRaw`'s frontmatter through. The
27
+ * reconciled YAML goes back through `matter.stringify` via a custom stringify engine rather than
28
+ * being spliced between hand-written `---` lines, so delimiters, blank lines and the trailing
29
+ * newline stay exactly what gray-matter would have produced.
36
30
  */
37
31
  export declare function serializeFrontmatter(body: string, data: Record<string, unknown>, existingRaw?: string): string;