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,515 @@
1
+ /**
2
+ * Print a reconciled YAML document by editing the source text it was parsed from, so the bytes
3
+ * the reconciler did not change stay as the author wrote them.
4
+ *
5
+ * `Document.toString()` re-emits every scalar from its VALUE: folded and long plain scalars are
6
+ * re-wrapped at the library's line width, so the first CMS save of a hand-written file rewrites
7
+ * lines nobody edited. Here a clean subtree is copied verbatim from the source, and only a slot
8
+ * the reconciler touched is re-rendered, at the column it already occupies:
9
+ *
10
+ * - **Map**: the reconciler keeps retained pairs in source order and appends new ones, so a map
11
+ * becomes a list of local edits — delete a dropped pair's lines, re-render a pair whose value
12
+ * was replaced, recurse into a value edited in place, insert new pairs after the last item.
13
+ * - **Sequence**: items can be reordered, so the item region is rebuilt as a concatenation of
14
+ * per-item chunks, each one either an original item's source (recursively patched) or a freshly
15
+ * rendered item.
16
+ *
17
+ * A chunk is an item's lines plus the comment and blank lines above it, which is where `yaml`
18
+ * attaches those comments (the item's `commentBefore`), so a chunk moves and dies with exactly
19
+ * the comments the reconciler moves and drops. Above a nested collection's FIRST item they
20
+ * belong to the collection instead, and stay put; above the root map's first key they are the
21
+ * key's (`ownLeadingLines`).
22
+ *
23
+ * Anything this does not handle returns `undefined` from that collection, and the parent
24
+ * re-renders the whole slot instead; only at the root does that reach the caller, which falls
25
+ * back to the reconciled document as `yaml` prints it. Every splice is also re-parsed and
26
+ * checked ({@link printsAs}) before it is returned, so a wrong splice costs formatting, never
27
+ * data.
28
+ */
29
+ import { isDeepStrictEqual } from 'node:util';
30
+ import { Document, parseDocument, isAlias, isCollection, isMap, isNode, isPair, isScalar, isSeq, YAMLMap, visit, YAMLSeq, } from 'yaml';
31
+ /** Successor markers: the end of a collection, and an item with no source counterpart. */
32
+ const END = Symbol('end');
33
+ const FRESH = Symbol('fresh');
34
+ /** `yaml`'s default `lineWidth`, which `Document.toString()` folds at. */
35
+ const LINE_WIDTH = 80;
36
+ /** Narrowest fold width a deeply indented fragment is rendered at. */
37
+ const MIN_LINE_WIDTH = 40;
38
+ export function snapshotDocument(doc) {
39
+ const items = new Map();
40
+ const visitNode = (node) => {
41
+ if (isMap(node)) {
42
+ items.set(node, node.items.map((pair) => ({ item: pair, value: pair.value })));
43
+ for (const pair of node.items)
44
+ visitNode(pair.value);
45
+ }
46
+ else if (isSeq(node)) {
47
+ items.set(node, node.items.map((item) => ({ item, value: item })));
48
+ for (const item of node.items)
49
+ visitNode(item);
50
+ }
51
+ };
52
+ visitNode(doc.contents);
53
+ let anchored = false;
54
+ visit(doc, (_key, node) => {
55
+ if (isAlias(node) || (isNode(node) && node.anchor !== undefined)) {
56
+ anchored = true;
57
+ return visit.BREAK;
58
+ }
59
+ return undefined;
60
+ });
61
+ return { items, anchored };
62
+ }
63
+ class SourceSplicer {
64
+ constructor(raw, eol, doc, snapshot, replaced) {
65
+ this.raw = raw;
66
+ this.eol = eol;
67
+ this.doc = doc;
68
+ this.snapshot = snapshot;
69
+ this.replaced = replaced;
70
+ this.dirtyMemo = new Map();
71
+ }
72
+ print() {
73
+ const root = this.doc.contents;
74
+ if (!isCollection(root) || !this.snapshot.items.has(root))
75
+ return undefined;
76
+ if (!this.isDirty(root))
77
+ return this.raw;
78
+ if (this.snapshot.anchored)
79
+ return undefined;
80
+ const edits = this.collectionEdits(root);
81
+ return edits === undefined ? undefined : this.applyEdits(0, this.raw.length, edits);
82
+ }
83
+ /**
84
+ * Did the reconciler change anything under this node? An original scalar is never mutated in
85
+ * place (a changed value gets a fresh node), so only collections can be dirty.
86
+ */
87
+ isDirty(node) {
88
+ if (!isCollection(node))
89
+ return false;
90
+ const memo = this.dirtyMemo.get(node);
91
+ if (memo !== undefined)
92
+ return memo;
93
+ const snap = this.snapshot.items.get(node);
94
+ let dirty = snap === undefined || snap.length !== node.items.length;
95
+ for (let i = 0; !dirty && snap !== undefined && i < snap.length; i++) {
96
+ const now = node.items[i];
97
+ const before = snap[i];
98
+ if (now !== before.item)
99
+ dirty = true;
100
+ else if (isPair(now))
101
+ dirty = now.value !== before.value || this.isDirty(now.value);
102
+ else
103
+ dirty = this.isDirty(now);
104
+ }
105
+ this.dirtyMemo.set(node, dirty);
106
+ return dirty;
107
+ }
108
+ collectionEdits(node) {
109
+ if (node.flow)
110
+ return undefined;
111
+ const snap = this.snapshot.items.get(node);
112
+ // An emptied block collection has no block spelling (`key:` alone reads back as null).
113
+ if (snap === undefined || snap.length === 0 || node.items.length === 0)
114
+ return undefined;
115
+ const geometry = [];
116
+ for (const { item, value } of snap) {
117
+ const g = isPair(item) ? this.pairGeometry(item, value) : this.seqItemGeometry(item);
118
+ if (g === undefined)
119
+ return undefined;
120
+ geometry.push(g);
121
+ }
122
+ if (!this.isBlockLayout(geometry))
123
+ return undefined;
124
+ return isMap(node) ? this.mapEdits(node, snap, geometry) : this.seqEdits(node, snap, geometry);
125
+ }
126
+ mapEdits(map, snap, geometry) {
127
+ const col = this.column(geometry[0].content);
128
+ const original = new Set(snap.map((s) => s.item));
129
+ const kept = new Set(map.items);
130
+ const edits = [];
131
+ // Retained pairs must still be in source order, followed only by new pairs.
132
+ const retainedOrder = map.items.filter((pair) => original.has(pair));
133
+ const expectedOrder = snap.map((s) => s.item).filter((pair) => kept.has(pair));
134
+ if (retainedOrder.some((pair, i) => pair !== expectedOrder[i]))
135
+ return undefined;
136
+ const added = map.items.slice(retainedOrder.length);
137
+ if (added.some((pair) => original.has(pair)))
138
+ return undefined;
139
+ const layout = [...geometry];
140
+ for (let i = 0; i < snap.length; i++) {
141
+ const { item, value: before } = snap[i];
142
+ const g = layout[i];
143
+ if (!isPair(item))
144
+ return undefined;
145
+ if (!kept.has(item)) {
146
+ if (g.inline) {
147
+ const next = this.promoteToInline(snap, layout, kept);
148
+ if (next === undefined)
149
+ return undefined;
150
+ edits.push({ start: g.content, end: layout[next].content, text: '' });
151
+ i = next - 1;
152
+ }
153
+ else {
154
+ const start = i === 0 ? this.ownLeadingLines(map, item, g.lineStart) : this.chunkStart(layout, i);
155
+ edits.push({ start, end: g.end, text: '' });
156
+ }
157
+ continue;
158
+ }
159
+ const now = item.value;
160
+ const clean = now === before && !this.isDirty(now);
161
+ const inner = clean
162
+ ? []
163
+ : now === before && isCollection(now)
164
+ ? this.collectionEdits(now)
165
+ : undefined;
166
+ if (inner !== undefined) {
167
+ const next = map.items[map.items.indexOf(item) + 1] ?? END;
168
+ if ((i + 1 < snap.length ? snap[i + 1].item : END) !== next) {
169
+ edits.push(...uncovered(this.outdentedCommentEdits(g, col), inner));
170
+ }
171
+ edits.push(...inner);
172
+ continue;
173
+ }
174
+ // The key is never replaced, so the comment lines above it stay in the source.
175
+ const text = withoutLeadingComment(item.key, () => this.render(mapOf([item]), col, g.inline));
176
+ edits.push({ start: g.lineStart, end: g.end, text: this.matchFinalNewline(g.end, text) });
177
+ }
178
+ if (added.length > 0) {
179
+ const at = layout[layout.length - 1].end;
180
+ const text = this.render(mapOf(added), col, false);
181
+ edits.push({ start: at, end: at, text: this.raw[at - 1] === '\n' ? text : this.eol + text });
182
+ }
183
+ return edits;
184
+ }
185
+ seqEdits(seq, snap, geometry) {
186
+ if (geometry[0].inline)
187
+ return undefined;
188
+ const col = this.column(geometry[0].content);
189
+ const oldIndex = new Map(snap.map((s, i) => [s.item, i]));
190
+ const parts = [];
191
+ const sourceOf = (item) => oldIndex.has(item) ? item : isNode(item) ? this.replaced.get(item) : undefined;
192
+ for (const [k, item] of seq.items.entries()) {
193
+ const j = oldIndex.get(item);
194
+ let part;
195
+ if (j !== undefined) {
196
+ const start = this.chunkStart(geometry, j);
197
+ const inner = isCollection(item) && this.isDirty(item) ? this.collectionEdits(item) : [];
198
+ const next = k + 1 < seq.items.length ? sourceOf(seq.items[k + 1]) : END;
199
+ const moved = (j + 1 < snap.length ? snap[j + 1].item : END) !== (next ?? FRESH);
200
+ part =
201
+ inner !== undefined
202
+ ? this.applyEdits(start, geometry[j].end, [
203
+ ...inner,
204
+ ...(moved ? uncovered(this.outdentedCommentEdits(geometry[j], col), inner) : []),
205
+ ])
206
+ : this.raw.slice(start, geometry[j].lineStart) +
207
+ withoutLeadingComment(item, () => this.render(seqOf(item), col, false));
208
+ }
209
+ else {
210
+ // A fresh node keeps the comment lines above its slot only if the reconciler carried
211
+ // them across; it does not off a replaced collection.
212
+ const old = isNode(item) ? this.replaced.get(item) : undefined;
213
+ const k = old === undefined ? undefined : oldIndex.get(old);
214
+ part =
215
+ k !== undefined && sameLeadingComment(old, item)
216
+ ? this.raw.slice(this.chunkStart(geometry, k), geometry[k].lineStart) +
217
+ withoutLeadingComment(item, () => this.render(seqOf(item), col, false))
218
+ : this.render(seqOf(item), col, false);
219
+ }
220
+ parts.push(part.endsWith('\n') ? part : part + this.eol);
221
+ }
222
+ const start = geometry[0].lineStart;
223
+ const end = geometry[geometry.length - 1].end;
224
+ return [{ start, end, text: this.matchFinalNewline(end, parts.join('')) }];
225
+ }
226
+ /** Rendered text always ends in a line break; drop it where the source it replaces had none. */
227
+ matchFinalNewline(end, text) {
228
+ return this.raw[end - 1] !== '\n' && text.endsWith(this.eol)
229
+ ? text.slice(0, -this.eol.length)
230
+ : text;
231
+ }
232
+ /**
233
+ * The first pair shares the parent's `- ` line and was dropped: move the first retained pair up
234
+ * onto that line, so the pairs before it go and the rest of the map stays as written. Returns
235
+ * that pair's index, or undefined when no pair is retained or comment lines above it would have
236
+ * to go with the lines being removed.
237
+ */
238
+ promoteToInline(snap, layout, kept) {
239
+ const next = snap.findIndex((s) => kept.has(s.item));
240
+ if (next <= 0)
241
+ return undefined;
242
+ if (this.raw.slice(this.chunkStart(layout, next), layout[next].lineStart).includes('#')) {
243
+ return undefined;
244
+ }
245
+ const g = layout[next];
246
+ layout[next] = { ...g, inline: true, lineStart: g.content };
247
+ return next;
248
+ }
249
+ /**
250
+ * Where a dropped FIRST pair's lines begin. The comment lines above a nested collection's first
251
+ * item are the collection's and stay, but above the root map's first key `yaml` gives them to
252
+ * the key, so the reconciler drops them with it and so must the splice.
253
+ */
254
+ ownLeadingLines(map, pair, start) {
255
+ const key = pair.key;
256
+ if (map !== this.doc.contents || !key.commentBefore || this.doc.commentBefore)
257
+ return start;
258
+ let at = start;
259
+ while (at > 0) {
260
+ const previous = this.lineStart(at - 1);
261
+ if (previous >= at)
262
+ break;
263
+ if (!/^[ \t]*(#.*)?\r?\n?$/.test(this.raw.slice(previous, at)))
264
+ break;
265
+ at = previous;
266
+ }
267
+ return at;
268
+ }
269
+ /**
270
+ * The run of comment lines that ends an item's region reads to a person as being about what
271
+ * comes next, but it is the item's: `yaml`'s parser (`pop()`) keeps a trailing run with the
272
+ * nested collection it ends when that collection is not at column 0 and any line of the run is
273
+ * at or right of its indent. While the neighbour below is unchanged that is harmless; once it
274
+ * changes, indent the run's shallower lines to its deepest comment, so they read as the item's
275
+ * and do not head content they were never about. Where that lands a line in a deeper scalar's comment or content
276
+ * instead, {@link printsAs} refuses the splice. A run at or left of the item's own column is a
277
+ * zero-indented list's tail, and is left alone.
278
+ */
279
+ outdentedCommentEdits(g, col) {
280
+ let run = [];
281
+ let at = this.raw.indexOf('\n', g.content) + 1;
282
+ while (at > 0 && at < g.end) {
283
+ const lineEnd = this.raw.indexOf('\n', at);
284
+ const line = this.raw.slice(at, lineEnd === -1 ? g.end : lineEnd);
285
+ const indent = line.length - line.trimStart().length;
286
+ if (line.trimStart().startsWith('#'))
287
+ run.push({ start: at, indent });
288
+ else if (line.trim() !== '')
289
+ run = [];
290
+ at = lineEnd === -1 ? g.end : lineEnd + 1;
291
+ }
292
+ const pin = Math.max(-1, ...run.map((line) => line.indent));
293
+ if (pin <= col)
294
+ return [];
295
+ return run
296
+ .filter((line) => line.indent < pin)
297
+ .map((line) => ({ start: line.start, end: line.start + line.indent, text: ' '.repeat(pin) }));
298
+ }
299
+ /** Where item `i`'s chunk begins: its own line for the first item, else the previous item's end. */
300
+ chunkStart(geometry, i) {
301
+ return i === 0 ? geometry[0].lineStart : geometry[i - 1].end;
302
+ }
303
+ /**
304
+ * Every item starts at the same column, in order, and only the first may share its line with
305
+ * the parent's `- ` (a compact `- key: value`). Anything else — an explicit `? key`, a
306
+ * multi-line key, a node property on its own line — is not a layout this splices.
307
+ */
308
+ isBlockLayout(geometry) {
309
+ const col = this.column(geometry[0].content);
310
+ let previousEnd = -1;
311
+ for (const [i, g] of geometry.entries()) {
312
+ if (this.column(g.content) !== col)
313
+ return false;
314
+ if (i > 0 && g.inline)
315
+ return false;
316
+ if (g.lineStart < previousEnd || g.end <= g.content)
317
+ return false;
318
+ previousEnd = g.end;
319
+ }
320
+ return true;
321
+ }
322
+ /** `value` is the pair's value as parsed: the reconciler may already have replaced it. */
323
+ pairGeometry(pair, value) {
324
+ const key = pair.key;
325
+ if (!isScalar(key) || key.range == null)
326
+ return undefined;
327
+ const content = key.range[0];
328
+ const range = isNode(value) && value.range != null ? value.range : key.range;
329
+ return this.geometry(content, range[1], range[2]);
330
+ }
331
+ seqItemGeometry(item) {
332
+ if (!isNode(item) || item.range == null)
333
+ return undefined;
334
+ let dash = item.range[0] - 1;
335
+ while (dash >= 0 && ' \t\r\n'.includes(this.raw[dash]))
336
+ dash--;
337
+ if (dash < 0 || this.raw[dash] !== '-')
338
+ return undefined;
339
+ return this.geometry(dash, item.range[1], item.range[2]);
340
+ }
341
+ /**
342
+ * Trailing blank lines are not the item's — `yaml` gives them to whatever follows — unless they
343
+ * are inside the value itself, as a keep-chomped (`|+`) block scalar's are. A node that ends in
344
+ * a comment can end inside the NEXT line's indentation; that line is not the item's either.
345
+ */
346
+ geometry(content, valueEnd, nodeEnd) {
347
+ const nodeEndLine = this.lineStart(nodeEnd);
348
+ if (nodeEndLine > content && /^[ \t]*$/.test(this.raw.slice(nodeEndLine, nodeEnd))) {
349
+ nodeEnd = nodeEndLine;
350
+ valueEnd = Math.min(valueEnd, nodeEnd);
351
+ }
352
+ let last = Math.max(content, nodeEnd - 1);
353
+ while (last > content && last >= valueEnd && ' \t\r\n'.includes(this.raw[last]))
354
+ last--;
355
+ const newline = this.raw.indexOf('\n', last);
356
+ const lineStart = this.lineStart(content);
357
+ const onOwnLine = /^ *$/.test(this.raw.slice(lineStart, content));
358
+ return {
359
+ content,
360
+ inline: !onOwnLine,
361
+ lineStart: onOwnLine ? lineStart : content,
362
+ end: newline === -1 ? this.raw.length : newline + 1,
363
+ };
364
+ }
365
+ lineStart(offset) {
366
+ // `lastIndexOf` clamps a negative index to 0, which would find a newline AT offset 0.
367
+ return offset <= 0 ? 0 : this.raw.lastIndexOf('\n', offset - 1) + 1;
368
+ }
369
+ column(offset) {
370
+ return offset - this.lineStart(offset);
371
+ }
372
+ applyEdits(start, end, edits) {
373
+ const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);
374
+ let out = '';
375
+ let cursor = start;
376
+ for (const edit of sorted) {
377
+ if (edit.start < cursor || edit.end > end)
378
+ throw new Error('overlapping source edits');
379
+ out += this.raw.slice(cursor, edit.start) + edit.text;
380
+ cursor = edit.end;
381
+ }
382
+ return out + this.raw.slice(cursor, end);
383
+ }
384
+ /**
385
+ * Render `items` as a block collection whose items sit at column `col`. `inline` leaves the
386
+ * first line unindented, for a slot that continues the parent's `- ` line. The fold width is
387
+ * reduced by the indent so the lines come out as wide as `toString()` would make them there.
388
+ */
389
+ render(container, col, inline) {
390
+ const fragment = new Document();
391
+ fragment.schema = this.doc.schema;
392
+ fragment.contents = container;
393
+ // A comment parsed from a CRLF file keeps a `\r` on every line but its last; the line ending
394
+ // is this.eol's to write.
395
+ const text = fragment
396
+ .toString({ lineWidth: Math.max(MIN_LINE_WIDTH, LINE_WIDTH - col) })
397
+ .replace(/\r\n?/g, '\n');
398
+ const indent = ' '.repeat(col);
399
+ const lines = text.split('\n');
400
+ if (lines[lines.length - 1] === '')
401
+ lines.pop();
402
+ return lines
403
+ .map((line, i) => (line === '' || (i === 0 && inline) ? line : indent + line))
404
+ .map((line) => line + this.eol)
405
+ .join('');
406
+ }
407
+ }
408
+ /**
409
+ * The edits in `extra` that no edit in `edits` already rewrites. A run of comment lines inside
410
+ * a value that is being deleted or re-rendered goes, or is re-drawn, with that value.
411
+ */
412
+ function uncovered(extra, edits) {
413
+ return extra.filter((e) => !edits.some((x) => x.end > x.start && x.start <= e.start && e.end <= x.end));
414
+ }
415
+ function mapOf(pairs) {
416
+ const map = new YAMLMap();
417
+ map.items = [...pairs];
418
+ return map;
419
+ }
420
+ function seqOf(item) {
421
+ const seq = new YAMLSeq();
422
+ seq.items = [item];
423
+ return seq;
424
+ }
425
+ function sameLeadingComment(a, b) {
426
+ if (!isNode(a) || !isNode(b))
427
+ return false;
428
+ const x = a;
429
+ const y = b;
430
+ return ((x.commentBefore ?? undefined) === (y.commentBefore ?? undefined) &&
431
+ !!x.spaceBefore === !!y.spaceBefore);
432
+ }
433
+ /** Run `fn` with `node`'s leading comment and blank line hidden, because the source keeps them. */
434
+ function withoutLeadingComment(node, fn) {
435
+ if (!isNode(node))
436
+ return fn();
437
+ const target = node;
438
+ const { commentBefore, spaceBefore } = target;
439
+ target.commentBefore = undefined;
440
+ target.spaceBefore = false;
441
+ try {
442
+ return fn();
443
+ }
444
+ finally {
445
+ target.commentBefore = commentBefore;
446
+ target.spaceBefore = spaceBefore;
447
+ }
448
+ }
449
+ /**
450
+ * The line ending a splice must write, or undefined for a file mixing them (or using bare `\r`),
451
+ * which no single choice would reproduce.
452
+ */
453
+ function lineEndingOf(raw) {
454
+ const crlf = (raw.match(/\r\n/g) ?? []).length;
455
+ const lf = (raw.match(/\n/g) ?? []).length;
456
+ const cr = (raw.match(/\r/g) ?? []).length;
457
+ if (crlf === 0)
458
+ return cr === 0 ? '\n' : undefined;
459
+ return crlf === lf && crlf === cr ? '\r\n' : undefined;
460
+ }
461
+ /**
462
+ * `printed` (a `toString()`) written with `raw`'s line endings: CRLF when `raw` is consistently
463
+ * CRLF, else LF. Either way without the stray `\r` that comments parsed from CRLF keep, so a
464
+ * whole-file re-print does not leave the file with mixed line endings.
465
+ */
466
+ export function withSourceLineEndings(printed, raw) {
467
+ const text = printed.replace(/\r\n?/g, '\n');
468
+ return lineEndingOf(raw) === '\r\n' ? text.replace(/\n/g, '\r\n') : text;
469
+ }
470
+ /**
471
+ * The source text of `raw` with only the reconciler's changes applied, or undefined when the
472
+ * document holds a construct this does not splice or the splice fails its self-check.
473
+ * `replaced` maps each node the reconciler created for an existing slot back to the node it
474
+ * replaced; `printed` is the reconciled document's `toString()`.
475
+ */
476
+ export function spliceSource(raw, doc, snapshot, replaced, printed) {
477
+ const eol = lineEndingOf(raw);
478
+ if (eol === undefined)
479
+ return undefined;
480
+ const spliced = new SourceSplicer(raw, eol, doc, snapshot, replaced).print();
481
+ return spliced !== undefined && printsAs(spliced, doc, printed) ? spliced : undefined;
482
+ }
483
+ /**
484
+ * Does `candidate` read back as the text it replaces, `printed`, would? It must parse cleanly,
485
+ * hold the reconciled document's data, and print as `printed` re-parsed prints — the same keys
486
+ * in the same order, the same comments where `yaml` draws them, which is by the node it gives
487
+ * each to.
488
+ *
489
+ * Re-parsed, not `printed` itself: where `yaml` cannot write the reconciled document so that it
490
+ * reads back as itself — a comment following an outdented trailing comment is read as the
491
+ * previous item's, whoever it belonged to — the splice need only be no worse than `printed`.
492
+ * Wherever it can, the two are the same comparison.
493
+ *
494
+ * Blank lines and trailing whitespace are left out: they are formatting the splice copies from
495
+ * the source, and `yaml` prints them inconsistently (a blank line inside an indented block as the
496
+ * indent alone; a blank line before a list's first item doubled; a stray `\r` kept in some
497
+ * comments parsed from a CRLF file).
498
+ */
499
+ function printsAs(candidate, reconciled, printed) {
500
+ if (candidate === printed)
501
+ return true;
502
+ const reparsed = parseDocument(candidate);
503
+ if (reparsed.errors.length > 0)
504
+ return false;
505
+ if (!isDeepStrictEqual(reparsed.toJS(), reconciled.toJS()))
506
+ return false;
507
+ return layoutFree(reparsed.toString()) === layoutFree(parseDocument(printed).toString());
508
+ }
509
+ function layoutFree(text) {
510
+ return text
511
+ .split('\n')
512
+ .map((line) => line.replace(/[ \t\r]+$/, ''))
513
+ .filter((line) => line !== '')
514
+ .join('\n');
515
+ }
@@ -16,7 +16,7 @@
16
16
  * Two other readers still spell the keys out themselves — they read the value
17
17
  * positionally and disagree on precedence (`resolveBlockItem` prefers `template`,
18
18
  * `ai/json-to-markdown.ts` prefers `_type`) — see
19
- * `.claude/future-tasks/block-discriminator-precedence-disagreement.md`.
19
+ * safeinsights/canopycms#584.
20
20
  *
21
21
  * Dependency-free on purpose: both importers reach contexts that must not pull in
22
22
  * schema types or node built-ins.
@@ -16,7 +16,7 @@
16
16
  * Two other readers still spell the keys out themselves — they read the value
17
17
  * positionally and disagree on precedence (`resolveBlockItem` prefers `template`,
18
18
  * `ai/json-to-markdown.ts` prefers `_type`) — see
19
- * `.claude/future-tasks/block-discriminator-precedence-disagreement.md`.
19
+ * safeinsights/canopycms#584.
20
20
  *
21
21
  * Dependency-free on purpose: both importers reach contexts that must not pull in
22
22
  * schema types or node built-ins.
@@ -1,31 +1,23 @@
1
- import type { ContentStore } from '../content-store.js';
2
- import type { ContentIdIndex } from '../content-id-index.js';
3
- import type { FieldConfig } from '../config/index.js';
4
- import { type LogicalPath, type Slug } from '../paths/index.js';
5
- export interface ReferenceInfo {
6
- entryPath: string;
7
- entryTitle?: string;
8
- collection: LogicalPath;
9
- slug: Slug;
10
- fields: string[];
11
- }
12
- export interface DeletionCheckResult {
13
- canDelete: boolean;
14
- referencedBy: ReferenceInfo[];
1
+ import type { EntrySchema } from '../config/index.js';
2
+ import type { ContentId, LogicalPath } from '../paths/index.js';
3
+ /** The parts of a `listEntries` item a reference scan reads. Data must be raw (unresolved). */
4
+ export interface ReferenceScanEntry {
5
+ entryPath: LogicalPath;
6
+ entryId: ContentId;
7
+ schema?: EntrySchema;
8
+ data: Record<string, unknown>;
9
+ /**
10
+ * The entry's type has no schema in the running code (`EntryTypeConfig.unavailable`), so
11
+ * which fields are references is unknown: any string equal to the target id counts as one.
12
+ */
13
+ schemaUnavailable?: boolean;
15
14
  }
16
- /**
17
- * DeletionChecker finds all references to an entry before deletion.
18
- */
19
- export declare class DeletionChecker {
20
- private store;
21
- private idIndex;
22
- private collections;
23
- constructor(store: ContentStore, idIndex: ContentIdIndex, collections: Map<LogicalPath, {
24
- fields: FieldConfig[];
25
- }>);
26
- canDelete(id: string): Promise<DeletionCheckResult>;
27
- findReferences(targetId: string): Promise<ReferenceInfo[]>;
28
- private scanCollection;
29
- private findIdInData;
30
- private listEntriesInCollection;
15
+ export interface ReferencingEntry<E extends ReferenceScanEntry = ReferenceScanEntry> {
16
+ entry: E;
17
+ /** Where its reference fields hold the target id, as `collectReferenceIds` paths. */
18
+ fields: string[];
19
+ /** Raw data paths of the strings, the md/mdx body included, holding an `entry:` link to it. */
20
+ links: string[];
31
21
  }
22
+ /** Entries but the target whose schema's reference fields or `entry:` links hold `targetId`. */
23
+ export declare function findReferencingEntries<E extends ReferenceScanEntry>(entries: Iterable<E>, targetId: string): ReferencingEntry<E>[];