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,65 +1,31 @@
1
1
  /**
2
- * Editor State Context
3
- *
4
- * Consolidates editor-wide state that was previously scattered across
5
- * the Editor component. This reduces prop drilling and makes state
6
- * management more explicit.
7
- *
8
- * Manages:
9
- * - Loading states (branches, entries, comments)
10
- * - Modal/drawer open states
11
- * - Preview data and loading state
2
+ * Consolidates editor-wide loading, modal, and preview state in one place
3
+ * instead of prop-drilling it through the Editor component.
12
4
  */
13
5
  import React from 'react';
14
6
  import type { FormValue } from '../FormRenderer.js';
15
- export interface LoadingState {
7
+ interface LoadingState {
16
8
  branches: boolean;
17
9
  entries: boolean;
18
10
  comments: boolean;
19
11
  }
20
- export interface ModalState {
12
+ interface ModalState {
21
13
  navigator: boolean;
22
14
  branchManager: boolean;
23
15
  groupManager: boolean;
24
16
  permissionManager: boolean;
25
17
  commentsPanel: boolean;
26
18
  }
27
- export interface PreviewState {
28
- data: FormValue;
29
- loading: FormValue;
30
- }
31
- export interface EditorState {
32
- loading: LoadingState;
33
- modals: ModalState;
34
- preview: PreviewState;
35
- /** True if any resource is loading */
36
- busy: boolean;
37
- }
38
- export interface EditorStateActions {
39
- setLoading: (key: keyof LoadingState, value: boolean) => void;
40
- openModal: (key: keyof ModalState) => void;
41
- closeModal: (key: keyof ModalState) => void;
42
- toggleModal: (key: keyof ModalState) => void;
43
- setPreviewData: (data: FormValue) => void;
44
- setPreviewLoading: (loading: FormValue) => void;
45
- }
46
- export interface EditorStateContextValue {
47
- state: EditorState;
48
- actions: EditorStateActions;
49
- }
50
- export interface EditorStateProviderProps {
19
+ interface EditorStateProviderProps {
51
20
  children: React.ReactNode;
52
21
  /** Initial modal states (useful for deep linking) */
53
22
  initialModals?: Partial<ModalState>;
54
23
  }
24
+ /** @internal No importer; deletion candidate in editor-state-context-migration.md. */
55
25
  export declare function EditorStateProvider({ children, initialModals }: EditorStateProviderProps): import("react/jsx-runtime").JSX.Element;
56
- /**
57
- * Access the full editor state context.
58
- * Must be used within an EditorStateProvider.
59
- */
60
- export declare function useEditorState(): EditorStateContextValue;
61
26
  /**
62
27
  * Convenience hook for loading states only.
28
+ * @internal No importer; deletion candidate in editor-state-context-migration.md.
63
29
  */
64
30
  export declare function useEditorLoading(): {
65
31
  busy: boolean;
@@ -70,6 +36,7 @@ export declare function useEditorLoading(): {
70
36
  };
71
37
  /**
72
38
  * Convenience hook for modal states only.
39
+ * @internal No importer; deletion candidate in editor-state-context-migration.md.
73
40
  */
74
41
  export declare function useEditorModals(): {
75
42
  openModal: (key: keyof ModalState) => void;
@@ -83,6 +50,7 @@ export declare function useEditorModals(): {
83
50
  };
84
51
  /**
85
52
  * Convenience hook for preview state only.
53
+ * @internal No importer; deletion candidate in editor-state-context-migration.md.
86
54
  */
87
55
  export declare function useEditorPreview(): {
88
56
  data: FormValue;
@@ -90,3 +58,4 @@ export declare function useEditorPreview(): {
90
58
  setData: (data: FormValue) => void;
91
59
  setLoading: (loading: FormValue) => void;
92
60
  };
61
+ export {};
@@ -1,30 +1,18 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  /**
4
- * Editor State Context
5
- *
6
- * Consolidates editor-wide state that was previously scattered across
7
- * the Editor component. This reduces prop drilling and makes state
8
- * management more explicit.
9
- *
10
- * Manages:
11
- * - Loading states (branches, entries, comments)
12
- * - Modal/drawer open states
13
- * - Preview data and loading state
4
+ * Consolidates editor-wide loading, modal, and preview state in one place
5
+ * instead of prop-drilling it through the Editor component.
14
6
  */
15
7
  import { createContext, useContext, useCallback, useState, useMemo } from 'react';
16
- // ============================================================================
17
- // Context
18
- // ============================================================================
19
8
  const EditorStateContext = createContext(null);
9
+ /** @internal No importer; deletion candidate in editor-state-context-migration.md. */
20
10
  export function EditorStateProvider({ children, initialModals }) {
21
- // Loading states
22
11
  const [loading, setLoadingState] = useState({
23
12
  branches: false,
24
13
  entries: false,
25
14
  comments: false,
26
15
  });
27
- // Modal states
28
16
  const [modals, setModals] = useState({
29
17
  navigator: false,
30
18
  branchManager: false,
@@ -33,12 +21,9 @@ export function EditorStateProvider({ children, initialModals }) {
33
21
  commentsPanel: false,
34
22
  ...initialModals,
35
23
  });
36
- // Preview states
37
24
  const [previewData, setPreviewDataState] = useState({});
38
25
  const [previewLoading, setPreviewLoadingState] = useState({});
39
- // Computed busy state
40
26
  const busy = loading.branches || loading.entries || loading.comments;
41
- // Actions
42
27
  const setLoading = useCallback((key, value) => {
43
28
  setLoadingState((prev) => ({ ...prev, [key]: value }));
44
29
  }, []);
@@ -57,7 +42,6 @@ export function EditorStateProvider({ children, initialModals }) {
57
42
  const setPreviewLoading = useCallback((loading) => {
58
43
  setPreviewLoadingState(loading);
59
44
  }, []);
60
- // Memoize context value
61
45
  const value = useMemo(() => ({
62
46
  state: {
63
47
  loading,
@@ -91,14 +75,11 @@ export function EditorStateProvider({ children, initialModals }) {
91
75
  ]);
92
76
  return _jsx(EditorStateContext.Provider, { value: value, children: children });
93
77
  }
94
- // ============================================================================
95
- // Hooks
96
- // ============================================================================
97
78
  /**
98
79
  * Access the full editor state context.
99
80
  * Must be used within an EditorStateProvider.
100
81
  */
101
- export function useEditorState() {
82
+ function useEditorState() {
102
83
  const context = useContext(EditorStateContext);
103
84
  if (!context) {
104
85
  throw new Error('useEditorState must be used within an EditorStateProvider');
@@ -107,6 +88,7 @@ export function useEditorState() {
107
88
  }
108
89
  /**
109
90
  * Convenience hook for loading states only.
91
+ * @internal No importer; deletion candidate in editor-state-context-migration.md.
110
92
  */
111
93
  export function useEditorLoading() {
112
94
  const { state, actions } = useEditorState();
@@ -118,6 +100,7 @@ export function useEditorLoading() {
118
100
  }
119
101
  /**
120
102
  * Convenience hook for modal states only.
103
+ * @internal No importer; deletion candidate in editor-state-context-migration.md.
121
104
  */
122
105
  export function useEditorModals() {
123
106
  const { state, actions } = useEditorState();
@@ -130,6 +113,7 @@ export function useEditorModals() {
130
113
  }
131
114
  /**
132
115
  * Convenience hook for preview state only.
116
+ * @internal No importer; deletion candidate in editor-state-context-migration.md.
133
117
  */
134
118
  export function useEditorPreview() {
135
119
  const { state, actions } = useEditorState();
@@ -13,15 +13,12 @@
13
13
  * - provider: () => new Map() -- gives the editor its own cache instead of
14
14
  * SWR's module-global one, so editor keys ("canopy:entries:main", ...) can
15
15
  * never collide with an SWR cache the host app is running for its own data.
16
- * `editor/hooks/__test__/test-utils.tsx` already mandates this for tests,
17
- * with a comment about exactly that collision; production had been relying
18
- * on the module global. Mounted once (CanopyEditor.tsx), so the cache spans
19
- * the whole editor session.
16
+ * Mounted by EditorAuthGate and keyed by user id, so the cache spans
17
+ * one identity's session and a different user starts empty.
20
18
  * - dedupingInterval: 2000 -- collapses the duplicate requests React Strict
21
19
  * Mode's mount -> cleanup -> remount cycle produces (each hook's
22
20
  * automatic on-mount fetch runs twice), plus any accidental
23
- * near-simultaneous mounts of the same resource. See swr.md /
24
- * editor-async-patterns.md (2026-07-24 decision) for the background.
21
+ * near-simultaneous mounts of the same resource.
25
22
  */
26
23
  import React from 'react';
27
24
  export interface SWRProviderProps {
@@ -1,23 +1,4 @@
1
- /**
2
- * Editor Context Providers
3
- *
4
- * These contexts consolidate editor-wide state and dependencies:
5
- *
6
- * - ApiClientContext: Dependency injection for API client (context-based pattern)
7
- * - EditorStateContext: Loading states, modal states, preview data
8
- * - SWRProvider: SWR cache config for the fetch-on-load data hooks (see
9
- * hooks/useBranchesData.ts, useEntriesData.ts, useCommentsData.ts)
10
- *
11
- * Usage:
12
- * ```tsx
13
- * <ApiClientProvider>
14
- * <EditorStateProvider>
15
- * <Editor />
16
- * </EditorStateProvider>
17
- * </ApiClientProvider>
18
- * ```
19
- */
20
1
  export { ApiClientProvider, useApiClient, useOptionalApiClient, type ApiClient, type ApiClientProviderProps, } from './ApiClientContext.js';
21
2
  export { AssetContextProvider, useAssetContext, type AssetContextValue, type AssetContextProviderProps, } from './AssetContext.js';
22
3
  export { SWRProvider, type SWRProviderProps } from './SWRProvider.js';
23
- export { EditorStateProvider, useEditorState, useEditorLoading, useEditorModals, useEditorPreview, type EditorState, type EditorStateActions, type EditorStateContextValue, type EditorStateProviderProps, type LoadingState, type ModalState, type PreviewState, } from './EditorStateContext.js';
4
+ export { useEditorLoading, useEditorModals, useEditorPreview } from './EditorStateContext.js';
@@ -1,23 +1,4 @@
1
- /**
2
- * Editor Context Providers
3
- *
4
- * These contexts consolidate editor-wide state and dependencies:
5
- *
6
- * - ApiClientContext: Dependency injection for API client (context-based pattern)
7
- * - EditorStateContext: Loading states, modal states, preview data
8
- * - SWRProvider: SWR cache config for the fetch-on-load data hooks (see
9
- * hooks/useBranchesData.ts, useEntriesData.ts, useCommentsData.ts)
10
- *
11
- * Usage:
12
- * ```tsx
13
- * <ApiClientProvider>
14
- * <EditorStateProvider>
15
- * <Editor />
16
- * </EditorStateProvider>
17
- * </ApiClientProvider>
18
- * ```
19
- */
20
1
  export { ApiClientProvider, useApiClient, useOptionalApiClient, } from './ApiClientContext.js';
21
2
  export { AssetContextProvider, useAssetContext, } from './AssetContext.js';
22
3
  export { SWRProvider } from './SWRProvider.js';
23
- export { EditorStateProvider, useEditorState, useEditorLoading, useEditorModals, useEditorPreview, } from './EditorStateContext.js';
4
+ export { useEditorLoading, useEditorModals, useEditorPreview } from './EditorStateContext.js';
@@ -4,25 +4,24 @@ import type { FormValue } from './FormRenderer.js';
4
4
  import type { EditorEntry, EditorCollection } from './Editor.js';
5
5
  import type { TreeNodeData } from '@mantine/core';
6
6
  import { normalizeCollectionPath } from '../paths/normalize.js';
7
+ /** @internal Exported for tests. */
7
8
  export { normalizeCollectionPath };
8
9
  export interface PreviewContext {
9
10
  branchName?: string;
10
11
  previewBaseByCollection?: Record<string, string>;
11
12
  }
12
- export declare const encodeSlug: (value?: string) => string;
13
13
  /**
14
14
  * Builds the preview iframe `src` for an entry, prefixed with the deployment `basePath`
15
15
  * (`CanopyClientConfig.basePath`, e.g. `/preview-123`) when configured.
16
16
  *
17
- * This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s without
18
- * the prefix when the host app is served under a basePath, AND `resolvePreviewPath` there compares
19
- * the SAME string against `window.location.pathname` -- which browsers report WITH the basePath
20
- * included -- so an unprefixed `previewSrc` also breaks draft sync / click-to-focus even when the
21
- * iframe itself happens to resolve. One prefix, applied uniformly here, fixes both.
17
+ * This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s
18
+ * without the prefix under a basePath, and `resolvePreviewPath` there compares the same
19
+ * string against `window.location.pathname` -- which browsers report WITH the basePath --
20
+ * so an unprefixed `previewSrc` also breaks draft sync / click-to-focus even when the
21
+ * iframe itself resolves.
22
22
  *
23
- * Applied via `joinUrlPrefix`, so it's a no-op when `basePath` is unset (default), and it passes an
24
- * already-absolute `previewSrc` (a fully custom, e.g. cross-origin, override) through untouched --
25
- * matching `joinUrlPrefix`'s own absolute-URL passthrough rule.
23
+ * Applied via `joinUrlPrefix`: a no-op when `basePath` is unset, and passes an
24
+ * already-absolute `previewSrc` (a cross-origin override) through untouched.
26
25
  */
27
26
  export declare const buildPreviewSrc: (entry: {
28
27
  collectionPath?: string;
@@ -46,13 +45,6 @@ interface BuildEntriesFromListParams {
46
45
  flatSchema: FlatSchemaItem[];
47
46
  }
48
47
  export declare const buildEntriesFromListResponse: ({ response, resolvePreviewSrc, flatSchema, }: BuildEntriesFromListParams) => EditorEntry[];
49
- /**
50
- * Builds a map of collection IDs to their labels for breadcrumb display.
51
- * Recursively walks through nested collections to build a flat map.
52
- *
53
- * @param collections - The collection tree structure
54
- * @returns A Map where keys are collection IDs (paths) and values are labels
55
- */
56
48
  export declare const buildCollectionLabels: (collections?: EditorCollection[]) => Map<string, string>;
57
49
  /**
58
50
  * Builds breadcrumb segments for an entry based on its collection hierarchy.
@@ -60,19 +52,6 @@ export declare const buildCollectionLabels: (collections?: EditorCollection[]) =
60
52
  * @param currentEntry - The entry to build breadcrumbs for (or undefined for root)
61
53
  * @param collectionLabels - Map of collection IDs to labels
62
54
  * @returns Array of breadcrumb segment strings, starting with 'All Files'
63
- *
64
- * @example
65
- * ```ts
66
- * // Entry in nested collection
67
- * const entry = { collectionPath: 'content/docs/guides', slug: 'config' }
68
- * const labels = new Map([
69
- * ['content', 'Content'],
70
- * ['content/docs', 'Documentation'],
71
- * ['content/docs/guides', 'Guides']
72
- * ])
73
- * buildBreadcrumbSegments(entry, labels)
74
- * // Returns: ['All Files', 'Documentation', 'Guides']
75
- * ```
76
55
  */
77
56
  export declare const buildBreadcrumbSegments: (currentEntry: EditorEntry | undefined, collectionLabels: Map<string, string>) => string[];
78
57
  /**
@@ -82,23 +61,5 @@ export declare const buildBreadcrumbSegments: (currentEntry: EditorEntry | undef
82
61
  * @param entryPath - The entry path to find (e.g., "blog/my-post")
83
62
  * @param treeData - The tree data structure from Mantine Tree
84
63
  * @returns Record<string, boolean> - Expanded state object where keys are collection node values
85
- *
86
- * @example
87
- * ```ts
88
- * const treeData = [
89
- * {
90
- * value: 'collection:blog',
91
- * children: [
92
- * { value: 'blog/post-1' },
93
- * {
94
- * value: 'collection:blog/featured',
95
- * children: [{ value: 'blog/featured/my-post' }]
96
- * }
97
- * ]
98
- * }
99
- * ]
100
- * calculatePathToEntry('blog/featured/my-post', treeData)
101
- * // Returns: { 'collection:blog': true, 'collection:blog/featured': true }
102
- * ```
103
64
  */
104
65
  export declare const calculatePathToEntry: (entryPath: string | undefined, treeData: TreeNodeData[]) => Record<string, boolean>;
@@ -3,21 +3,21 @@ import { normalizeCollectionPath } from '../paths/normalize.js';
3
3
  import { isIndexSlug } from '../utils/entry-url.js';
4
4
  import { isDataOnlyFormat } from '../utils/format.js';
5
5
  import { joinUrlPrefix } from '../utils/url-prefix.js';
6
+ /** @internal Exported for tests. */
6
7
  export { normalizeCollectionPath };
7
8
  /**
8
- * The slug portion of a preview URL, or '' for an index entry.
9
+ * The slug portion of a preview URL, or '' for an index entry -- `resolveUrlPathCandidates`
10
+ * refuses `/x/index`, so a preview built that way 404s.
9
11
  *
10
- * An index entry's URL is its COLLECTION's path -- the same collapse `computeEntryUrl`,
11
- * `listEntries` and `defaultBuildPath` apply. Without it this builder pointed the preview iframe
12
- * at `/x/index`, which `resolveUrlPathCandidates` deliberately refuses to resolve, so the host
13
- * app answered the editor's own preview with notFound().
12
+ * An index entry's URL is its COLLECTION's path, the same collapse `computeEntryUrl`,
13
+ * `listEntries`, and `defaultBuildPath` apply.
14
14
  *
15
- * Kept separate from `computeEntryUrl` rather than delegating wholesale because this builder must
16
- * percent-encode each segment and must NOT lowercase (a preview base is adopter-supplied and
17
- * case-sensitive). Only the index decision is shared -- which is the part that drifted.
15
+ * Kept separate from `computeEntryUrl`, which shares only the index decision: this builder
16
+ * must percent-encode each segment and must NOT lowercase, since a preview base is
17
+ * adopter-supplied and case-sensitive.
18
18
  */
19
19
  const encodePreviewSlug = (slug) => (isIndexSlug(slug) ? '' : encodeSlug(slug));
20
- export const encodeSlug = (value) => (value ?? '')
20
+ const encodeSlug = (value) => (value ?? '')
21
21
  .split('/')
22
22
  .filter(Boolean)
23
23
  .map((segment) => encodeURIComponent(segment))
@@ -39,22 +39,18 @@ const buildRawPreviewSrc = (entry, { branchName, previewBaseByCollection, conten
39
39
  // Root-level entries have collectionPath === contentRoot (e.g., 'content')
40
40
  const isRootEntry = contentRoot && entry.collectionPath === contentRoot;
41
41
  if (isRootEntry) {
42
- // Check for custom preview URL in previewBaseByCollection
43
42
  const customPreview = previewBaseByCollection?.[`${contentRoot}/${entry.slug}`];
44
43
  if (customPreview) {
45
44
  return appendBranch(customPreview);
46
45
  }
47
- // Default root entries to root path
48
46
  return appendBranch('/');
49
47
  }
50
48
  const base = (entry.collectionPath && previewBaseByCollection?.[entry.collectionPath]) ??
51
49
  (entry.collectionName && previewBaseByCollection?.[entry.collectionName]);
52
50
  if (!base) {
53
- // Build URL from collection path + slug. Pass contentRoot through so a
54
- // non-default (or multi-segment, e.g. "cms/content") configured root is
55
- // stripped too -- normalizeCollectionPath defaults to 'content' when
56
- // contentRoot is undefined here, which matches the pre-existing behavior
57
- // for adopters who never set it.
51
+ // Pass contentRoot through so a non-default (or multi-segment, e.g.
52
+ // "cms/content") configured root is stripped too; normalizeCollectionPath
53
+ // defaults to 'content' when contentRoot is undefined.
58
54
  const collectionPath = entry.collectionPath
59
55
  ? normalizeCollectionPath(entry.collectionPath, contentRoot)
60
56
  : '';
@@ -72,15 +68,14 @@ const buildRawPreviewSrc = (entry, { branchName, previewBaseByCollection, conten
72
68
  * Builds the preview iframe `src` for an entry, prefixed with the deployment `basePath`
73
69
  * (`CanopyClientConfig.basePath`, e.g. `/preview-123`) when configured.
74
70
  *
75
- * This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s without
76
- * the prefix when the host app is served under a basePath, AND `resolvePreviewPath` there compares
77
- * the SAME string against `window.location.pathname` -- which browsers report WITH the basePath
78
- * included -- so an unprefixed `previewSrc` also breaks draft sync / click-to-focus even when the
79
- * iframe itself happens to resolve. One prefix, applied uniformly here, fixes both.
71
+ * This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s
72
+ * without the prefix under a basePath, and `resolvePreviewPath` there compares the same
73
+ * string against `window.location.pathname` -- which browsers report WITH the basePath --
74
+ * so an unprefixed `previewSrc` also breaks draft sync / click-to-focus even when the
75
+ * iframe itself resolves.
80
76
  *
81
- * Applied via `joinUrlPrefix`, so it's a no-op when `basePath` is unset (default), and it passes an
82
- * already-absolute `previewSrc` (a fully custom, e.g. cross-origin, override) through untouched --
83
- * matching `joinUrlPrefix`'s own absolute-URL passthrough rule.
77
+ * Applied via `joinUrlPrefix`: a no-op when `basePath` is unset, and passes an
78
+ * already-absolute `previewSrc` (a cross-origin override) through untouched.
84
79
  */
85
80
  export const buildPreviewSrc = (entry, context) => {
86
81
  return joinUrlPrefix(context.basePath, buildRawPreviewSrc(entry, context));
@@ -149,13 +144,6 @@ export const buildEntriesFromListResponse = ({ response, resolvePreviewSrc, flat
149
144
  };
150
145
  });
151
146
  };
152
- /**
153
- * Builds a map of collection IDs to their labels for breadcrumb display.
154
- * Recursively walks through nested collections to build a flat map.
155
- *
156
- * @param collections - The collection tree structure
157
- * @returns A Map where keys are collection IDs (paths) and values are labels
158
- */
159
147
  export const buildCollectionLabels = (collections) => {
160
148
  const map = new Map();
161
149
  if (!collections)
@@ -177,19 +165,6 @@ export const buildCollectionLabels = (collections) => {
177
165
  * @param currentEntry - The entry to build breadcrumbs for (or undefined for root)
178
166
  * @param collectionLabels - Map of collection IDs to labels
179
167
  * @returns Array of breadcrumb segment strings, starting with 'All Files'
180
- *
181
- * @example
182
- * ```ts
183
- * // Entry in nested collection
184
- * const entry = { collectionPath: 'content/docs/guides', slug: 'config' }
185
- * const labels = new Map([
186
- * ['content', 'Content'],
187
- * ['content/docs', 'Documentation'],
188
- * ['content/docs/guides', 'Guides']
189
- * ])
190
- * buildBreadcrumbSegments(entry, labels)
191
- * // Returns: ['All Files', 'Documentation', 'Guides']
192
- * ```
193
168
  */
194
169
  export const buildBreadcrumbSegments = (currentEntry, collectionLabels) => {
195
170
  if (!currentEntry)
@@ -222,51 +197,23 @@ export const buildBreadcrumbSegments = (currentEntry, collectionLabels) => {
222
197
  * @param entryPath - The entry path to find (e.g., "blog/my-post")
223
198
  * @param treeData - The tree data structure from Mantine Tree
224
199
  * @returns Record<string, boolean> - Expanded state object where keys are collection node values
225
- *
226
- * @example
227
- * ```ts
228
- * const treeData = [
229
- * {
230
- * value: 'collection:blog',
231
- * children: [
232
- * { value: 'blog/post-1' },
233
- * {
234
- * value: 'collection:blog/featured',
235
- * children: [{ value: 'blog/featured/my-post' }]
236
- * }
237
- * ]
238
- * }
239
- * ]
240
- * calculatePathToEntry('blog/featured/my-post', treeData)
241
- * // Returns: { 'collection:blog': true, 'collection:blog/featured': true }
242
- * ```
243
200
  */
244
201
  export const calculatePathToEntry = (entryPath, treeData) => {
245
202
  if (!entryPath)
246
203
  return {};
247
204
  const pathToExpand = {};
248
- /**
249
- * Recursive function to find entry and mark parent collections as expanded.
250
- * @param nodes - Current level of tree nodes to search
251
- * @param ancestors - Accumulated ancestor node values (collection IDs) from root to current position
252
- * @returns true if the target entry was found in this subtree
253
- */
254
205
  const findAndMarkPath = (nodes, ancestors) => {
255
206
  for (const node of nodes) {
256
- // Found the target entry
257
207
  if (node.value === entryPath) {
258
- // Mark all ancestors as expanded
259
208
  for (const ancestor of ancestors) {
260
209
  pathToExpand[ancestor] = true;
261
210
  }
262
211
  return true;
263
212
  }
264
- // Search children recursively if they exist
265
213
  if (node.children && node.children.length > 0) {
266
214
  const currentPath = [...ancestors, node.value];
267
215
  const found = findAndMarkPath(node.children, currentPath);
268
216
  if (found) {
269
- // Mark this node as expanded since the target was found in its subtree
270
217
  pathToExpand[node.value] = true;
271
218
  return true;
272
219
  }
@@ -4,7 +4,7 @@ export interface BlockInstance {
4
4
  template: string;
5
5
  value: Record<string, unknown>;
6
6
  }
7
- export type RenderField = (field: FieldConfig, value: unknown, onChange: (v: unknown) => void, path: Array<string | number>) => React.ReactNode;
7
+ type RenderField = (field: FieldConfig, value: unknown, onChange: (v: unknown) => void, path: Array<string | number>) => React.ReactNode;
8
8
  export interface BlockFieldProps {
9
9
  label?: string;
10
10
  templates: BlockConfig[];
@@ -15,4 +15,4 @@ export interface BlockFieldProps {
15
15
  dataCanopyField?: string;
16
16
  }
17
17
  export declare const BlockField: React.FC<BlockFieldProps>;
18
- export default BlockField;
18
+ export {};
@@ -22,7 +22,7 @@ const SortableBlock = ({ id, children }) => {
22
22
  export const BlockField = ({ label, templates, value, onChange, renderField, path, dataCanopyField, }) => {
23
23
  const [itemKeys, setItemKeys] = useState(() => value.map(() => `block-${blockKeyCounter++}`));
24
24
  const [pendingTemplate, setPendingTemplate] = useState(null);
25
- // Sync itemKeys length with value length (adjust state during render)
25
+ // Keeps itemKeys in sync with value's length; setState runs directly in render, not an effect.
26
26
  if (value.length > itemKeys.length) {
27
27
  const extras = Array.from({ length: value.length - itemKeys.length }, () => `block-${blockKeyCounter++}`);
28
28
  setItemKeys((prev) => [...prev, ...extras]);
@@ -83,4 +83,3 @@ export const BlockField = ({ label, templates, value, onChange, renderField, pat
83
83
  }), [...currentPath, f.name]) }, f.name))) })) : (_jsxs(Text, { size: "xs", c: "red", children: ["No template found for \"", block.template, "\""] }))] }) }, itemKeys[idx]));
84
84
  }) }) }) })] }) }));
85
85
  };
86
- export default BlockField;
@@ -8,4 +8,3 @@ export interface CodeFieldProps {
8
8
  dataCanopyField?: string;
9
9
  }
10
10
  export declare const CodeField: React.FC<CodeFieldProps>;
11
- export default CodeField;
@@ -7,4 +7,3 @@ export const CodeField = ({ id, label, value, onChange, language, dataCanopyFiel
7
7
  const inputId = id ?? generatedId;
8
8
  return (_jsx(Textarea, { id: inputId, label: label, value: value, onChange: (e) => onChange(e.currentTarget.value), placeholder: language ? `Code (${language})` : 'Code', autosize: true, minRows: 6, size: "sm", "data-canopy-field": dataCanopyField, styles: { input: { fontFamily: 'Menlo, Consolas, monospace' } } }));
9
9
  };
10
- export default CodeField;
@@ -7,39 +7,32 @@ export interface DateTimeFieldProps {
7
7
  dataCanopyField?: string;
8
8
  }
9
9
  /**
10
- * Convert a stored value (ISO 8601 UTC, e.g. "2024-03-15T14:30:00.000Z")
11
- * into the "local wall-clock" string a `datetime-local` input expects
12
- * (`YYYY-MM-DDTHH:mm:ss`, no timezone). Returns '' for '' or an unparsable
13
- * value.
10
+ * Converts a stored value (ISO 8601 UTC, e.g. `YYYY-MM-DDTHH:mm:ss.sssZ`)
11
+ * into the local wall-clock string a `datetime-local` input expects
12
+ * (`YYYY-MM-DDTHH:mm:ss`, no timezone). Returns '' for '' or an unparsable value.
13
+ * @internal Exported for tests.
14
14
  */
15
15
  export declare function isoToDatetimeLocalValue(iso: string): string;
16
16
  /**
17
17
  * Convert a `datetime-local` input's local wall-clock string back into the
18
18
  * ISO 8601 UTC storage format. Returns '' for '' or an unparsable value.
19
+ * @internal Exported for tests.
19
20
  */
20
21
  export declare function datetimeLocalValueToIso(local: string): string;
21
22
  /**
22
23
  * Editor for `type: 'datetime'` fields.
23
24
  *
24
- * Storage format: ISO 8601 UTC string (e.g. "2024-03-15T14:30:00.000Z") —
25
- * what `Date.prototype.toISOString()` produces and what
26
- * `validation/entry-validator.ts`'s datetime check (`Date.parse`) accepts.
27
- * Empty string means "not set" (matches entry-validator's empty-string
28
- * check for required fields).
25
+ * Storage format: ISO 8601 UTC string (e.g. `YYYY-MM-DDTHH:mm:ss.sssZ`) — what
26
+ * `Date.prototype.toISOString()` produces and `validation/entry-validator.ts`'s
27
+ * datetime check (`Date.parse`) accepts. Empty string means "not set".
29
28
  *
30
- * `@mantine/dates` is not a dependency of this package, so per house rules
31
- * we don't add one just for this field: a native `<input
32
- * type="datetime-local">` wrapped in Mantine's `Input`/`Input.Wrapper`
33
- * gives a real date+time picker with zero new dependencies.
29
+ * Uses a native `datetime-local` input in Mantine's `Input.Wrapper` rather than
30
+ * `@mantine/dates` (not a dependency here) — a real picker with zero new deps.
34
31
  *
35
- * `datetime-local` has no timezone concept — it shows/accepts local
36
- * "wall-clock" time. We convert UTC ISO -> local for display and local ->
37
- * UTC ISO on change, so loading a value and saving it unedited round-trips
38
- * to the exact same stored string instead of drifting by the browser's UTC
39
- * offset. `step={1}` keeps seconds in that round trip; sub-second
40
- * precision in the source data is not preserved (`datetime-local` has no
41
- * milliseconds field), so a stored value with non-zero milliseconds will
42
- * have them zeroed out once resaved.
32
+ * `datetime-local` has no timezone: converts UTC ISO -> local for display and
33
+ * back on change, so an unedited load-then-save round-trips exactly instead of
34
+ * drifting by the browser's offset. `step={1}` preserves seconds in that
35
+ * round-trip; sub-second precision is not preserved (no milliseconds field),
36
+ * so a value with non-zero milliseconds is zeroed out once resaved.
43
37
  */
44
38
  export declare const DateTimeField: React.FC<DateTimeFieldProps>;
45
- export default DateTimeField;