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
@@ -3,39 +3,31 @@ import path from 'node:path';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import { withLock } from './utils/async-mutex.js';
5
5
  import { writeOccJsonFile, withOccRetry, withOccFileLock, OccWriteConflictError, } from './utils/occ-json-write.js';
6
- /**
7
- * Error thrown when a concurrent modification is detected.
8
- * Operations that encounter this error will automatically retry.
9
- */
10
- export class CommentStoreConflictError extends Error {
6
+ /** A concurrent modification that survived every OCC retry. */
7
+ class CommentStoreConflictError extends Error {
11
8
  constructor() {
12
9
  super('Concurrent modification detected');
13
10
  this.name = 'CommentStoreConflictError';
14
11
  }
15
12
  }
16
13
  /**
17
- * Manages comment storage for a branch workspace.
18
- * Comments are stored in .canopy-meta/comments.json and are NOT committed to git.
14
+ * Comment storage for a branch workspace, in .canopy-meta/comments.json and
15
+ * never committed to git.
19
16
  *
20
- * Mutators are protected by three layers, outermost to innermost:
17
+ * Mutators run under three layers, outermost to innermost:
21
18
  *
22
- * 1. {@link withLock} - an in-process FIFO mutex keyed by the resolved file
23
- * path. Serializes concurrent mutators on the SAME process/host
24
- * deterministically, so racing `resolveThread`/`deleteThread`/`addComment`
25
- * calls against the same store (or two store instances pointed at the
26
- * same branch) never race each other's load-modify-write cycle.
27
- * 2. {@link withOccFileLock} - a server-enforced, cross-process/cross-host
28
- * lock (proper-lockfile, mkdir-based). This is the actual fix for lost
29
- * comments across two warm Lambda containers on EFS, where rename-based
30
- * OCC verification alone is unreliable (see guarantee doc on
31
- * `utils/occ-json-write.ts`).
32
- * 3. {@link withOccRetry} around {@link writeOccJsonFile} - version/writeId
33
- * based optimistic concurrency control. With layers 1-2 in place this is
34
- * now a defense-in-depth backstop only (e.g. a stale process from a
35
- * rolling deploy writing without the lock), not the primary safety
36
- * mechanism.
19
+ * 1. {@link withLock} — an in-process FIFO mutex keyed by the resolved file
20
+ * path, so mutators racing on one host cannot interleave their
21
+ * load-modify-write cycles, whether they share a store instance or not.
22
+ * 2. {@link withOccFileLock} — a server-enforced, cross-process/cross-host lock
23
+ * (proper-lockfile, mkdir-based). This is what actually prevents lost
24
+ * comments across two warm Lambda containers on EFS, where rename-based OCC
25
+ * verification alone is unreliable.
26
+ * 3. {@link withOccRetry} around {@link writeOccJsonFile} — version/writeId
27
+ * optimistic concurrency. With layers 1-2 in place it is defense in depth
28
+ * only, for a writer that skips the lock (a stale process mid-deploy).
37
29
  *
38
- * See `utils/occ-json-write.ts` for full guarantee documentation of layers 2-3.
30
+ * Guarantees for layers 2-3: `utils/occ-json-write.ts`.
39
31
  */
40
32
  export class CommentStore {
41
33
  constructor(branchRoot, options) {
@@ -44,19 +36,15 @@ export class CommentStore {
44
36
  this.filePath = path.join(path.resolve(branchRoot), '.canopy-meta', 'comments.json');
45
37
  this.settleMs = options?.settleMs;
46
38
  }
47
- /**
48
- * Load comments file for read-only access.
49
- */
39
+ /** Read-only load. */
50
40
  async load() {
51
41
  const { data } = await this.loadWithVersion();
52
42
  return data;
53
43
  }
54
44
  /**
55
- * Load comments file along with the version observed at load time. Used by
56
- * mutators, which need the version as a LOCAL value threaded through their
57
- * load-modify-write cycle rather than shared mutable instance state (so
58
- * concurrent mutate cycles on the same instance never clobber each other's
59
- * expected version).
45
+ * Load, with the version observed at load time. Mutators thread that version
46
+ * through their load-modify-write cycle as a LOCAL value, never as instance
47
+ * state, so concurrent cycles cannot clobber each other's expected version.
60
48
  */
61
49
  async loadWithVersion() {
62
50
  try {
@@ -79,15 +67,15 @@ export class CommentStore {
79
67
  }
80
68
  }
81
69
  /**
82
- * Write comments file via the shared OCC helper.
70
+ * Write comments.json via the shared OCC helper.
83
71
  *
84
- * Throws the helper's raw {@link OccWriteConflictError} so the surrounding
85
- * {@link withOccRetry} in withMutation() recognizes and retries it;
86
- * translation to the public `CommentStoreConflictError` contract happens at
87
- * the withMutation() boundary, after retries are exhausted.
72
+ * Throws the helper's raw {@link OccWriteConflictError}, which is what the
73
+ * surrounding {@link withOccRetry} in withMutation() recognizes and retries;
74
+ * translation to the public `CommentStoreConflictError` happens at the
75
+ * withMutation() boundary, once retries are exhausted.
88
76
  *
89
- * Note: comment-store historically wrote without a trailing newline;
90
- * `writeOccJsonFile`'s default (`trailingNewline: false`) preserves that.
77
+ * comments.json is written without a trailing newline (`writeOccJsonFile`'s
78
+ * default), unlike branch.json.
91
79
  */
92
80
  async writeData(data, expectedVersion) {
93
81
  await writeOccJsonFile(this.filePath, { ...data }, {
@@ -97,8 +85,8 @@ export class CommentStore {
97
85
  }
98
86
  /**
99
87
  * Run a mutate cycle (load -> modify -> write) under the full lock +
100
- * OCC-retry stack described in the class doc comment. A conflict that
101
- * survives every retry surfaces as the public `CommentStoreConflictError`.
88
+ * OCC-retry stack (class doc). A conflict surviving every retry surfaces as
89
+ * `CommentStoreConflictError`.
102
90
  */
103
91
  async withMutation(operation) {
104
92
  try {
@@ -128,7 +116,6 @@ export class CommentStore {
128
116
  text: options.text,
129
117
  };
130
118
  if (!data.threads[threadId]) {
131
- // Create new thread
132
119
  data.threads[threadId] = {
133
120
  id: threadId,
134
121
  comments: [comment],
@@ -141,7 +128,6 @@ export class CommentStore {
141
128
  };
142
129
  }
143
130
  else {
144
- // Add to existing thread
145
131
  data.threads[threadId].comments.push(comment);
146
132
  }
147
133
  await this.writeData(data, version);
@@ -182,27 +168,21 @@ export class CommentStore {
182
168
  return true;
183
169
  });
184
170
  }
185
- /**
186
- * Get all threads for a specific field
187
- */
171
+ /** Threads on one field. */
188
172
  async getThreadsForField(entryPath, canopyPath) {
189
173
  const data = await this.load();
190
174
  return Object.values(data.threads)
191
175
  .filter((t) => t.type === 'field' && t.entryPath === entryPath && t.canopyPath === canopyPath)
192
176
  .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
193
177
  }
194
- /**
195
- * Get all threads for a specific entry (not field-specific)
196
- */
178
+ /** Threads on one entry, excluding its field threads. */
197
179
  async getThreadsForEntry(entryPath) {
198
180
  const data = await this.load();
199
181
  return Object.values(data.threads)
200
182
  .filter((t) => t.type === 'entry' && t.entryPath === entryPath)
201
183
  .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
202
184
  }
203
- /**
204
- * Get all branch-level threads
205
- */
185
+ /** Branch-level threads. */
206
186
  async getBranchThreads() {
207
187
  const data = await this.load();
208
188
  return Object.values(data.threads)
@@ -2,9 +2,6 @@
2
2
  * Schema flattening utilities for O(1) lookups.
3
3
  */
4
4
  import type { FlatSchemaItem, RootCollectionConfig } from './types.js';
5
- /**
6
- * Normalize a path value by splitting, filtering empty segments, and rejoining.
7
- */
8
5
  export declare const normalizePathValue: (val: string) => string;
9
6
  /**
10
7
  * Flatten the root collection schema into a flat array for O(1) lookups.
@@ -4,9 +4,6 @@
4
4
  import { join, normalize } from 'pathe';
5
5
  import { createLogicalPath } from '../paths/normalize.js';
6
6
  import { ROOT_COLLECTION_ID } from '../paths/types.js';
7
- /**
8
- * Normalize a path value by splitting, filtering empty segments, and rejoining.
9
- */
10
7
  export const normalizePathValue = (val) => normalize(val).split('/').filter(Boolean).join('/');
11
8
  /**
12
9
  * Flatten the root collection schema into a flat array for O(1) lookups.
@@ -37,7 +34,6 @@ export const flattenSchema = (root, basePath = '') => {
37
34
  logicalPath = normalizedPath;
38
35
  }
39
36
  const normalizedFull = normalizePathValue(logicalPath);
40
- // Add the collection itself
41
37
  flat.push({
42
38
  type: 'collection',
43
39
  logicalPath: createLogicalPath(normalizedFull),
@@ -50,7 +46,6 @@ export const flattenSchema = (root, basePath = '') => {
50
46
  collections: collection.collections,
51
47
  order: collection.order,
52
48
  });
53
- // Add entry types in this collection
54
49
  if (collection.entries) {
55
50
  for (const entryType of collection.entries) {
56
51
  // Entry type path is collection path + entry type name
@@ -70,15 +65,14 @@ export const flattenSchema = (root, basePath = '') => {
70
65
  });
71
66
  }
72
67
  }
73
- // Recursively process nested collections
74
68
  if (collection.collections) {
75
69
  for (const child of collection.collections) {
76
70
  walkCollection(child, normalizedFull);
77
71
  }
78
72
  }
79
73
  };
80
- // Add the root collection itself as a normal collection (if we have a base path)
81
- // This makes content root behave exactly like any other collection, just without a parent
74
+ // The root collection is pushed here so content root behaves exactly like any other
75
+ // collection, just without a parent.
82
76
  if (base) {
83
77
  flat.push({
84
78
  type: 'collection',
@@ -92,11 +86,8 @@ export const flattenSchema = (root, basePath = '') => {
92
86
  order: root.order,
93
87
  });
94
88
  }
95
- // Add root-level entry types
96
- // Now their parentPath will reference the root collection we just added above
97
89
  if (root.entries) {
98
90
  for (const entryType of root.entries) {
99
- // Root entry type path is base + entry type name
100
91
  const entryTypePath = base ? join(base, entryType.name) : entryType.name;
101
92
  flat.push({
102
93
  type: 'entry-type',
@@ -113,7 +104,6 @@ export const flattenSchema = (root, basePath = '') => {
113
104
  });
114
105
  }
115
106
  }
116
- // Process root-level collections
117
107
  // Pass base as parentPath so they are children of the content root collection
118
108
  if (root.collections) {
119
109
  for (const collection of root.collections) {
@@ -32,9 +32,9 @@ export function defineCanopyConfig(config) {
32
32
  // Full server config - all fields including sensitive data
33
33
  server: validated,
34
34
  // Client config helper - extracts safe subset and merges overrides
35
- // Note: flatSchema is loaded dynamically by the editor via API (from .collection.json files)
36
35
  client: (clientOverrides) => {
37
36
  const { defaultBaseBranch, defaultActiveBranch, contentRoot, editor, mode, entryLinkUrl, media, basePath, } = validated;
37
+ // flatSchema is loaded dynamically by the editor via API (from .collection.json files)
38
38
  const clientConfig = {
39
39
  defaultBaseBranch,
40
40
  defaultActiveBranch,
@@ -44,7 +44,7 @@ export function defineCanopyConfig(config) {
44
44
  entryLinkUrl,
45
45
  assetBaseUrl: media?.publicBaseUrl,
46
46
  basePath,
47
- flatSchema: [], // Loaded dynamically by editor via API
47
+ flatSchema: [],
48
48
  };
49
49
  // Merge client overrides (e.g., auth handlers from useClerkAuthConfig)
50
50
  if (clientOverrides?.editor) {
@@ -5,10 +5,10 @@
5
5
  *
6
6
  * @example
7
7
  * ```ts
8
- * import { defineCanopyConfig, type FieldConfig } from 'canopycms/config'
8
+ * import { defineCanopyConfig, type FieldConfig } from 'canopycms'
9
9
  * ```
10
10
  */
11
- export type { PrimitiveFieldType, FieldType, ContentFormat, MediaAdapterKind, PermissionLevel, PermissionTarget, PathPermission, SelectOption, ReferenceOption, FieldConfig, BlockConfig, BlockFieldConfig, SelectFieldConfig, ReferenceFieldConfig, ImageFieldConfig, ImageFieldValue, ObjectFieldConfig, InlineGroupFieldConfig, CustomFieldConfig, EntrySchema, BranchSchema, EntryTypeConfig, CollectionConfig, RootCollectionConfig, MediaConfig, CanopyEditorConfig, DefaultBranchAccess, DefaultPathAccess, DefaultPathAccessLevel, DefaultPathAccessLevels, DefaultBaseBranch, DefaultRemoteName, DefaultRemoteUrl, GitBotAuthorName, GitBotAuthorEmail, GithubTokenEnvVar, CanopyOperatingMode, ContentRoot, SourceRoot, CanopyConfig, CanopyConfigInput, CanopyConfigFragment, FlatSchemaItem, CanopyClientConfig, ClientOnlyFields, EntryValidationIssue, ValidateEntryInput, ValidateEntryHook, } from './types.js';
11
+ export type { PrimitiveFieldType, FieldType, ContentFormat, MediaAdapterKind, PermissionLevel, PermissionTarget, PathPermission, SelectOption, ReferenceOption, FieldConfig, BlockConfig, BlockFieldConfig, SelectFieldConfig, ReferenceFieldConfig, ImageFieldConfig, ImageFieldValue, ObjectFieldConfig, InlineGroupFieldConfig, CustomFieldConfig, EntrySchema, BranchSchema, EntryTypeConfig, CollectionConfig, RootCollectionConfig, MediaConfig, CanopyEditorConfig, DefaultBranchAccess, DefaultPathAccess, DefaultPathAccessLevel, DefaultPathAccessLevels, DefaultBaseBranch, DefaultRemoteName, DefaultRemoteUrl, GitBotAuthorName, GitBotAuthorEmail, GithubTokenEnvVar, CanopyOperatingMode, ContentRoot, SourceRoot, CanopyConfig, CanopyConfigInput, CanopyConfigFragment, FlatSchemaItem, CanopyClientConfig, ClientOnlyFields, EditorSignInProps, EntryValidationIssue, ValidateEntryInput, ValidateEntryHook, } from './types.js';
12
12
  export { primitiveFieldTypes, fieldTypes } from './types.js';
13
13
  export { CanopyConfigSchema, getConfigDefaults, DEFAULT_PROD_WORKSPACE } from './schemas/config.js';
14
14
  export { fieldSchema, blockSchema, selectOptionSchema, referenceOptionSchema, imageFieldSchema, } from './schemas/field.js';
@@ -5,18 +5,15 @@
5
5
  *
6
6
  * @example
7
7
  * ```ts
8
- * import { defineCanopyConfig, type FieldConfig } from 'canopycms/config'
8
+ * import { defineCanopyConfig, type FieldConfig } from 'canopycms'
9
9
  * ```
10
10
  */
11
- // Re-export type constants
12
11
  export { primitiveFieldTypes, fieldTypes } from './types.js';
13
- // Re-export schemas (for advanced use cases)
14
12
  export { CanopyConfigSchema, getConfigDefaults, DEFAULT_PROD_WORKSPACE } from './schemas/config.js';
15
13
  export { fieldSchema, blockSchema, selectOptionSchema, referenceOptionSchema, imageFieldSchema, } from './schemas/field.js';
16
14
  export { collectionSchema, entryTypeSchema, relativePathSchema } from './schemas/collection.js';
17
15
  export { permissionTargetSchema, pathPermissionSchema } from './schemas/permissions.js';
18
16
  export { mediaSchema } from './schemas/media.js';
19
- // Re-export utilities
20
17
  export { flattenSchema, normalizePathValue } from './flatten.js';
21
18
  export { validateCanopyConfig, ensureSelectFieldsHaveOptions } from './validation.js';
22
19
  export { defineCanopyConfig, composeCanopyConfig } from './helpers.js';
@@ -3,14 +3,6 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  export declare const relativePathSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
6
- /**
7
- * Entry type schema: defines a type of content within a collection.
8
- * Each type has its own schema (fields) and can have cardinality constraints.
9
- *
10
- * Examples:
11
- * - { name: 'post', format: 'mdx', schema: postSchema } - unlimited posts
12
- * - { name: 'settings', format: 'json', schema: settingsSchema, maxItems: 1 } - restricted to one instance
13
- */
14
6
  export declare const entryTypeSchema: z.ZodObject<{
15
7
  name: z.ZodString;
16
8
  format: z.ZodEnum<["md", "mdx", "json", "yaml"]>;
@@ -4,7 +4,6 @@
4
4
  import { z } from 'zod';
5
5
  import { isAbsolute } from 'pathe';
6
6
  import { fieldSchema } from './field.js';
7
- // Relative path schema - validates and normalizes paths
8
7
  export const relativePathSchema = z
9
8
  .string()
10
9
  .min(1)
@@ -16,14 +15,6 @@ export const relativePathSchema = z
16
15
  .split(/[\\/]+/)
17
16
  .filter(Boolean)
18
17
  .join('/'));
19
- /**
20
- * Entry type schema: defines a type of content within a collection.
21
- * Each type has its own schema (fields) and can have cardinality constraints.
22
- *
23
- * Examples:
24
- * - { name: 'post', format: 'mdx', schema: postSchema } - unlimited posts
25
- * - { name: 'settings', format: 'json', schema: settingsSchema, maxItems: 1 } - restricted to one instance
26
- */
27
18
  export const entryTypeSchema = z.object({
28
19
  name: z.string().min(1),
29
20
  format: z.enum(['md', 'mdx', 'json', 'yaml']),
@@ -33,7 +24,6 @@ export const entryTypeSchema = z.object({
33
24
  default: z.boolean().optional(),
34
25
  maxItems: z.number().int().positive().optional(),
35
26
  });
36
- // Recursive collection schema
37
27
  const collectionSchema = z.lazy(() => z
38
28
  .object({
39
29
  name: z.string().min(1),
@@ -4,80 +4,7 @@
4
4
  import { z } from 'zod';
5
5
  import type { AuthPlugin } from '../../auth/plugin.js';
6
6
  import type { EntryLinkUrlResolver } from '../../entry-link-resolver.js';
7
- import type { ValidateEntryHook } from '../types.js';
8
- export declare const defaultBranchAccessSchema: z.ZodDefault<z.ZodEnum<["allow", "deny"]>>;
9
- export declare const defaultPathAccessLevelSchema: z.ZodEnum<["allow", "deny"]>;
10
- export declare const defaultPathAccessLevelsSchema: z.ZodObject<{
11
- read: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
12
- edit: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
13
- review: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
14
- }, "strict", z.ZodTypeAny, {
15
- read?: "allow" | "deny" | undefined;
16
- edit?: "allow" | "deny" | undefined;
17
- review?: "allow" | "deny" | undefined;
18
- }, {
19
- read?: "allow" | "deny" | undefined;
20
- edit?: "allow" | "deny" | undefined;
21
- review?: "allow" | "deny" | undefined;
22
- }>;
23
- export declare const defaultPathAccessSchema: z.ZodDefault<z.ZodUnion<[z.ZodEnum<["allow", "deny"]>, z.ZodObject<{
24
- read: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
25
- edit: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
26
- review: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
27
- }, "strict", z.ZodTypeAny, {
28
- read?: "allow" | "deny" | undefined;
29
- edit?: "allow" | "deny" | undefined;
30
- review?: "allow" | "deny" | undefined;
31
- }, {
32
- read?: "allow" | "deny" | undefined;
33
- edit?: "allow" | "deny" | undefined;
34
- review?: "allow" | "deny" | undefined;
35
- }>]>>;
36
- export declare const defaultBaseBranchSchema: z.ZodDefault<z.ZodString>;
37
- export declare const defaultRemoteNameSchema: z.ZodDefault<z.ZodString>;
38
- export declare const defaultRemoteUrlSchema: z.ZodString;
39
- export declare const gitBotAuthorNameSchema: z.ZodString;
40
- export declare const gitBotAuthorEmailSchema: z.ZodString;
41
- export declare const githubTokenEnvVarSchema: z.ZodDefault<z.ZodString>;
42
- export declare const operatingModeSchema: z.ZodEnum<["prod", "dev"]>;
43
- export declare const deployedAsSchema: z.ZodDefault<z.ZodEnum<["static", "server"]>>;
44
- export declare const contentRootSchema: z.ZodDefault<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>>;
45
- export declare const sourceRootSchema: z.ZodOptional<z.ZodString>;
46
- export declare const basePathSchema: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
47
- export declare const deploymentNameSchema: z.ZodDefault<z.ZodString>;
48
- export declare const devContentSyncSchema: z.ZodDefault<z.ZodEnum<["off", "warn"]>>;
49
- export declare const devConfigSchema: z.ZodObject<{
50
- contentSync: z.ZodOptional<z.ZodDefault<z.ZodEnum<["off", "warn"]>>>;
51
- }, "strip", z.ZodTypeAny, {
52
- contentSync?: "off" | "warn" | undefined;
53
- }, {
54
- contentSync?: "off" | "warn" | undefined;
55
- }>;
56
- export declare const editorConfigSchema: z.ZodObject<{
57
- title: z.ZodOptional<z.ZodString>;
58
- subtitle: z.ZodOptional<z.ZodString>;
59
- theme: z.ZodOptional<z.ZodUnknown>;
60
- previewBase: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
61
- onAccountClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
62
- onLogoutClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
63
- AccountComponent: z.ZodOptional<z.ZodType<import("react").ComponentType<{}>, z.ZodTypeDef, import("react").ComponentType<{}>>>;
64
- }, "strip", z.ZodTypeAny, {
65
- title?: string | undefined;
66
- subtitle?: string | undefined;
67
- theme?: unknown;
68
- previewBase?: Record<string, string> | undefined;
69
- onAccountClick?: ((...args: unknown[]) => void) | undefined;
70
- onLogoutClick?: ((...args: unknown[]) => void) | undefined;
71
- AccountComponent?: import("react").ComponentType<{}> | undefined;
72
- }, {
73
- title?: string | undefined;
74
- subtitle?: string | undefined;
75
- theme?: unknown;
76
- previewBase?: Record<string, string> | undefined;
77
- onAccountClick?: ((...args: unknown[]) => void) | undefined;
78
- onLogoutClick?: ((...args: unknown[]) => void) | undefined;
79
- AccountComponent?: import("react").ComponentType<{}> | undefined;
80
- }>;
7
+ import type { EditorSignInProps, ValidateEntryHook } from '../types.js';
81
8
  export declare const CanopyConfigSchema: z.ZodObject<{
82
9
  media: z.ZodOptional<z.ZodDiscriminatedUnion<"adapter", [z.ZodObject<{
83
10
  adapter: z.ZodLiteral<"local">;
@@ -160,6 +87,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
160
87
  onAccountClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
161
88
  onLogoutClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
162
89
  AccountComponent: z.ZodOptional<z.ZodType<import("react").ComponentType<{}>, z.ZodTypeDef, import("react").ComponentType<{}>>>;
90
+ SignInComponent: z.ZodOptional<z.ZodType<import("react").ComponentType<EditorSignInProps>, z.ZodTypeDef, import("react").ComponentType<EditorSignInProps>>>;
163
91
  }, "strip", z.ZodTypeAny, {
164
92
  title?: string | undefined;
165
93
  subtitle?: string | undefined;
@@ -168,6 +96,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
168
96
  onAccountClick?: ((...args: unknown[]) => void) | undefined;
169
97
  onLogoutClick?: ((...args: unknown[]) => void) | undefined;
170
98
  AccountComponent?: import("react").ComponentType<{}> | undefined;
99
+ SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
171
100
  }, {
172
101
  title?: string | undefined;
173
102
  subtitle?: string | undefined;
@@ -176,6 +105,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
176
105
  onAccountClick?: ((...args: unknown[]) => void) | undefined;
177
106
  onLogoutClick?: ((...args: unknown[]) => void) | undefined;
178
107
  AccountComponent?: import("react").ComponentType<{}> | undefined;
108
+ SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
179
109
  }>>;
180
110
  authPlugin: z.ZodOptional<z.ZodType<AuthPlugin, z.ZodTypeDef, AuthPlugin>>;
181
111
  entryLinkUrl: z.ZodOptional<z.ZodType<EntryLinkUrlResolver, z.ZodTypeDef, EntryLinkUrlResolver>>;
@@ -236,6 +166,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
236
166
  onAccountClick?: ((...args: unknown[]) => void) | undefined;
237
167
  onLogoutClick?: ((...args: unknown[]) => void) | undefined;
238
168
  AccountComponent?: import("react").ComponentType<{}> | undefined;
169
+ SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
239
170
  } | undefined;
240
171
  authPlugin?: AuthPlugin | undefined;
241
172
  entryLinkUrl?: EntryLinkUrlResolver | undefined;
@@ -289,15 +220,12 @@ export declare const CanopyConfigSchema: z.ZodObject<{
289
220
  onAccountClick?: ((...args: unknown[]) => void) | undefined;
290
221
  onLogoutClick?: ((...args: unknown[]) => void) | undefined;
291
222
  AccountComponent?: import("react").ComponentType<{}> | undefined;
223
+ SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
292
224
  } | undefined;
293
225
  authPlugin?: AuthPlugin | undefined;
294
226
  entryLinkUrl?: EntryLinkUrlResolver | undefined;
295
227
  validateEntry?: ValidateEntryHook | undefined;
296
228
  }>;
297
- /**
298
- * Helper to get schema default values.
299
- * This centralizes default value extraction from Zod schemas.
300
- */
301
229
  /**
302
230
  * Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set).
303
231
  *
@@ -4,51 +4,49 @@
4
4
  import { z } from 'zod';
5
5
  import { relativePathSchema } from './collection.js';
6
6
  import { mediaSchema } from './media.js';
7
- // Default value schemas
8
- export const defaultBranchAccessSchema = z.enum(['allow', 'deny']).default('deny');
9
- export const defaultPathAccessLevelSchema = z.enum(['allow', 'deny']);
7
+ const defaultBranchAccessSchema = z.enum(['allow', 'deny']).default('deny');
8
+ const defaultPathAccessLevelSchema = z.enum(['allow', 'deny']);
10
9
  // Per-level object form: an omitted level stays undefined after parse (no per-field
11
10
  // defaults here) so the runtime resolver (resolveDefaultPathAccess) can fail closed to
12
11
  // 'deny' for any level the config author didn't explicitly scope.
13
- export const defaultPathAccessLevelsSchema = z
12
+ const defaultPathAccessLevelsSchema = z
14
13
  .object({
15
14
  read: defaultPathAccessLevelSchema.optional(),
16
15
  edit: defaultPathAccessLevelSchema.optional(),
17
16
  review: defaultPathAccessLevelSchema.optional(),
18
17
  })
19
18
  .strict();
20
- export const defaultPathAccessSchema = z
19
+ const defaultPathAccessSchema = z
21
20
  .union([defaultPathAccessLevelSchema, defaultPathAccessLevelsSchema])
22
21
  .default('deny');
23
- export const defaultBaseBranchSchema = z.string().default('main');
24
- export const defaultRemoteNameSchema = z.string().default('origin');
25
- export const defaultRemoteUrlSchema = z.string().min(1);
26
- export const gitBotAuthorNameSchema = z.string().min(1);
27
- export const gitBotAuthorEmailSchema = z.string().email();
28
- export const githubTokenEnvVarSchema = z.string().default('GITHUB_BOT_TOKEN');
29
- export const operatingModeSchema = z.enum(['prod', 'dev']);
30
- export const deployedAsSchema = z.enum(['static', 'server']).default('server');
31
- export const contentRootSchema = relativePathSchema.default('content');
32
- export const sourceRootSchema = z.string().min(1).optional();
22
+ const defaultBaseBranchSchema = z.string().default('main');
23
+ const defaultRemoteNameSchema = z.string().default('origin');
24
+ const defaultRemoteUrlSchema = z.string().min(1);
25
+ const gitBotAuthorNameSchema = z.string().min(1);
26
+ const gitBotAuthorEmailSchema = z.string().email();
27
+ const githubTokenEnvVarSchema = z.string().default('GITHUB_BOT_TOKEN');
28
+ const operatingModeSchema = z.enum(['prod', 'dev']);
29
+ const deployedAsSchema = z.enum(['static', 'server']).default('server');
30
+ const contentRootSchema = relativePathSchema.default('content');
31
+ const sourceRootSchema = z.string().min(1).optional();
33
32
  // Lenient on shape (leading/trailing slashes, absolute-URL prefixes) -- `joinUrlPrefix`
34
33
  // normalizes all of that at every use site. Only reject a value that is nothing but
35
34
  // whitespace, since that can never be a meaningful deployment prefix and most likely
36
35
  // indicates a copy-paste/templating mistake in the adopter's config.
37
- export const basePathSchema = z
36
+ const basePathSchema = z
38
37
  .string()
39
38
  .transform((value) => value.trim())
40
39
  .refine((value) => value.length > 0, {
41
40
  message: 'basePath must not be empty or only whitespace',
42
41
  })
43
42
  .optional();
44
- export const deploymentNameSchema = z.string().default('prod');
45
- export const devContentSyncSchema = z.enum(['off', 'warn']).default('warn');
43
+ const deploymentNameSchema = z.string().default('prod');
44
+ const devContentSyncSchema = z.enum(['off', 'warn']).default('warn');
46
45
  // Dev-mode-only behavior. Ignored when mode !== 'dev'.
47
- export const devConfigSchema = z.object({
46
+ const devConfigSchema = z.object({
48
47
  contentSync: devContentSyncSchema.optional(),
49
48
  });
50
- // Editor configuration schema
51
- export const editorConfigSchema = z.object({
49
+ const editorConfigSchema = z.object({
52
50
  title: z.string().optional(),
53
51
  subtitle: z.string().optional(),
54
52
  theme: z.unknown().optional(),
@@ -58,19 +56,18 @@ export const editorConfigSchema = z.object({
58
56
  onLogoutClick: z.function().returns(z.void()).optional(),
59
57
  // Optional: custom account component (e.g., Clerk's UserButton)
60
58
  AccountComponent: z.custom().optional(),
59
+ // Optional: provider sign-in UI for signed-out users (see EditorSignInProps)
60
+ SignInComponent: z.custom().optional(),
61
61
  });
62
- // Main CanopyConfig schema.
63
62
  export const CanopyConfigSchema = z
64
63
  .object({
65
64
  media: mediaSchema.optional(),
66
- // No outer .optional() here: defaultBranchAccessSchema/defaultPathAccessSchema already
67
- // have .default('deny'), so the field is optional on input but always resolves to
68
- // 'allow'/'deny' (never undefined) on output. An outer .optional() would short-circuit
69
- // before the inner default runs, defeating the fail-closed default (SCH-M1).
70
- // defaultPathAccessSchema's union keeps the same rule: the .default('deny') sits on the
71
- // OUTER union, not inside defaultPathAccessLevelsSchema, so an omitted top-level field
72
- // still resolves to 'deny' and an omitted level inside the object form stays undefined
73
- // (resolved to 'deny' at read time by resolveDefaultPathAccess).
65
+ // No outer .optional(): both schemas already .default('deny'), so the field is optional on
66
+ // input but always resolves to 'allow'/'deny' (never undefined) on output — an outer
67
+ // .optional() would short-circuit before the inner default runs, defeating the fail-closed
68
+ // default (SCH-M1). defaultPathAccessSchema's .default('deny') sits on the OUTER union, not
69
+ // inside defaultPathAccessLevelsSchema, so an omitted level in the object form stays
70
+ // undefined (resolved to 'deny' at read time by resolveDefaultPathAccess).
74
71
  defaultBranchAccess: defaultBranchAccessSchema,
75
72
  defaultPathAccess: defaultPathAccessSchema,
76
73
  // .optional() deliberately defeats defaultBaseBranchSchema's .default('main'):
@@ -93,16 +90,11 @@ export const CanopyConfigSchema = z
93
90
  allowNetworkRemoteInProd: z.boolean().optional(),
94
91
  settingsBranch: z.string().optional(),
95
92
  autoCreateSettingsPR: z.boolean().optional(),
96
- // Deliberately `deploymentNameSchema.optional()`, NOT `deploymentNameSchema` alone.
97
- // deploymentNameSchema.default('prod') would make `parse(undefined)` resolve to
98
- // the literal 'prod' instead of staying `undefined` — collapsing the
99
- // env > config > modeDefault precedence chain that resolveDeploymentName
100
- // (operating-mode/deployment-name.ts) implements: config would then always
101
- // "win" over modeDefault (masking dev's real default of 'local'), and the env
102
- // var would just be racing config's baked-in 'prod' instead of a true absence.
103
- // `.optional()` here is what keeps an omitted deploymentName reaching
104
- // resolveDeploymentName as `undefined`, so it can fall through to modeDefault.
105
- // Do not "fix" this by removing `.optional()`.
93
+ // `.optional()`, NOT bare `deploymentNameSchema`: its own `.default('prod')` would make
94
+ // `parse(undefined)` resolve to 'prod' instead of staying `undefined`, collapsing the
95
+ // env > config > modeDefault precedence chain `resolveDeploymentName`
96
+ // (operating-mode/deployment-name.ts) implements — config would always "win" over
97
+ // modeDefault, masking dev's real default of 'local'. Do not remove `.optional()`.
106
98
  deploymentName: deploymentNameSchema.optional(),
107
99
  contentRoot: contentRootSchema.default('content'),
108
100
  sourceRoot: sourceRootSchema.optional(),
@@ -114,10 +106,6 @@ export const CanopyConfigSchema = z
114
106
  dev: devConfigSchema.optional(),
115
107
  })
116
108
  .strict();
117
- /**
118
- * Helper to get schema default values.
119
- * This centralizes default value extraction from Zod schemas.
120
- */
121
109
  /**
122
110
  * Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set).
123
111
  *
@@ -132,16 +120,12 @@ export const DEFAULT_PROD_WORKSPACE = '/mnt/efs/workspace';
132
120
  // Note: `mode` has no default by design (SEC-C1) and is intentionally omitted here —
133
121
  // operatingModeSchema.parse(undefined) would throw.
134
122
  //
135
- // `deploymentName` is ALSO deliberately omitted here (checked every caller,
136
- // 2026-07-30: only packages/canopycms/src/services.ts reads from this return
137
- // value, and only `.remoteName`; nothing ever read `.deploymentName`). Unlike
138
- // the defaults below, deploymentName's real default is mode-dependent — 'prod'
139
- // for ProdStrategy, 'local' for DevStrategy (see
140
- // operating-mode/client-unsafe-strategy.ts's getSettingsBranchName, which
141
- // resolves it via resolveDeploymentName) — and this accessor has no mode to
142
- // select between them. Emitting `deploymentNameSchema.parse(undefined)`
143
- // ('prod') here would silently lie for dev mode; better to have no caller of
144
- // this than a mode-blind one.
123
+ // `deploymentName` is ALSO omitted: no caller reads `.deploymentName` off this return value
124
+ // (only `services.ts` reads `.remoteName`), and its real default is mode-dependent — 'prod' for
125
+ // ProdStrategy, 'local' for DevStrategy (see resolveDeploymentName, used by
126
+ // operating-mode/client-unsafe-strategy.ts's getSettingsBranchName) — so this accessor has no
127
+ // mode to pick between them. Emitting `deploymentNameSchema.parse(undefined)` ('prod') here
128
+ // would silently lie for dev mode.
145
129
  export const getConfigDefaults = () => ({
146
130
  baseBranch: defaultBaseBranchSchema.parse(undefined),
147
131
  remoteName: defaultRemoteNameSchema.parse(undefined),