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,40 +1,32 @@
1
1
  /**
2
- * Branch-name sanitization, isolated in a dependency-free module.
2
+ * Branch-name sanitization, isolated in a dependency-free module (imports
3
+ * nothing but types; same pattern as assets/asset-prefixes.ts).
3
4
  *
4
- * Deliberately imports nothing but types: `paths/branch.ts` (the path
5
- * RESOLUTION module) pulls `node:fs` and the operating-mode strategies, so
6
- * isomorphic/client-reachable code (e.g. authorization/protected-branch.ts,
7
- * which the editor bundle reaches via api/guards.ts) must get
8
- * `sanitizeBranchName` from HERE, never from `paths/branch.ts` — a `node:`
9
- * import in that graph breaks adopters' production `next build` of the
10
- * editor bundle. Same pattern as assets/asset-prefixes.ts.
5
+ * Client-reachable code (e.g. authorization/protected-branch.ts, which the
6
+ * editor bundle reaches via api/guards.ts) MUST import `sanitizeBranchName`
7
+ * from HERE, never from `paths/branch.ts` or the `paths` barrel: both pull
8
+ * `node:fs` and the operating-mode strategies, and a `node:` import in that
9
+ * graph breaks adopters' production `next build` of the editor bundle.
10
+ * `pnpm lint:bundle` enforces it.
11
11
  */
12
12
  import type { SanitizedBranchName } from './types.js';
13
- /**
14
- * Sanitize a branch name for use in filesystem paths.
15
- * - Replaces invalid characters with hyphens
16
- * - Collapses multiple hyphens
17
- * - Trims leading/trailing dots
18
- */
13
+ /** Sanitize a branch name for use in filesystem paths. */
19
14
  export declare function sanitizeBranchName(branchName: string): SanitizedBranchName;
20
15
  /**
21
- * Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}`,
22
- * see operating-mode/client-unsafe-strategy.ts's `getSettingsBranchName` and
23
- * operating-mode/deployment-name.ts's `resolveDeploymentName`). Exported from
24
- * this dependency-free module -- not constructed ad hoc at each call site --
25
- * so every consumer that needs to recognize the settings-branch namespace
26
- * agrees on the exact string: worker/git-sync.ts's `pushSettingsBranches`
27
- * (never push a `canopycms-settings-*` branch this deployment doesn't own),
28
- * and api/branch.ts's `createBranchHandler` (reject a user-requested branch
29
- * whose SANITIZED name falls in this namespace).
16
+ * Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}`;
17
+ * built by operating-mode/client-unsafe-strategy.ts's `getSettingsBranchName`).
18
+ * Exported from this dependency-free module -- not rebuilt ad hoc at each call
19
+ * site -- so every consumer of the namespace agrees on the exact string:
20
+ * worker/git-sync.ts's `pushSettingsBranches` never pushes a
21
+ * `canopycms-settings-*` branch this deployment doesn't own, and api/branch.ts's
22
+ * `createBranchHandler` rejects a user-requested branch whose SANITIZED name
23
+ * falls in this namespace.
30
24
  *
31
- * Two CanopyCMS deployments can share one GitHub repo, each with its own
32
- * settings branch under this prefix (`canopycms-settings-prod` vs
33
- * `canopycms-settings-staging`, say). A content-branch request that lands on
34
- * ANOTHER deployment's settings branch name would silently corrupt that
35
- * deployment's permissions/groups the next time its worker treats the ref as
36
- * an orphan settings branch -- so the whole prefix is reserved for branch
37
- * creation, not just this deployment's own settings branch name.
25
+ * The WHOLE prefix is reserved, not just this deployment's own settings branch:
26
+ * two deployments can share one GitHub repo, and a content branch landing on
27
+ * the other's settings-branch name silently corrupts that deployment's
28
+ * permissions/groups once its worker treats the ref as an orphan settings
29
+ * branch.
38
30
  */
39
31
  export declare const RESERVED_SETTINGS_BRANCH_PREFIX = "canopycms-settings-";
40
32
  /**
@@ -42,16 +34,14 @@ export declare const RESERVED_SETTINGS_BRANCH_PREFIX = "canopycms-settings-";
42
34
  *
43
35
  * http/router.ts's `compareSpecificity` ranks a literal pattern segment above a
44
36
  * `:param`, so a branch named e.g. `admin` has its `/:branch/...` routes
45
- * shadowed by the static `/admin/...` ones. The failure is a *partial* one,
46
- * which is what makes it confusing: bare `GET /admin` still reaches the branch
47
- * handler (there is no single-segment static `/admin` route), so the branch
48
- * looks half-alive while every nested route 404s or 403s.
37
+ * shadowed by the static `/admin/...` ones -- and only partially, which is what
38
+ * makes it confusing: bare `GET /admin` still reaches the branch handler, so the
39
+ * branch looks half-alive while every nested route 404s or 403s.
49
40
  *
50
- * Lives in this dependency-free module for the same reason as
51
- * {@link RESERVED_SETTINGS_BRANCH_PREFIX}: api/validators.ts is imported *by*
52
- * the route modules, so nothing on the validation side can import the router to
53
- * derive this at runtime without a cycle. http/router.test.ts derives the same
54
- * set from the live route table and asserts it equals this constant, so adding
55
- * a new top-level namespace fails that test until this list is updated.
41
+ * Listed rather than derived at runtime because api/validators.ts is imported
42
+ * *by* the route modules, so importing the router here would cycle.
43
+ * http/router.test.ts derives the same set from the live route table and asserts
44
+ * it equals this constant, so a new top-level namespace fails that test until
45
+ * this list is updated.
56
46
  */
57
47
  export declare const RESERVED_ROUTE_BRANCH_NAMES: readonly string[];
@@ -1,20 +1,15 @@
1
1
  /**
2
- * Branch-name sanitization, isolated in a dependency-free module.
2
+ * Branch-name sanitization, isolated in a dependency-free module (imports
3
+ * nothing but types; same pattern as assets/asset-prefixes.ts).
3
4
  *
4
- * Deliberately imports nothing but types: `paths/branch.ts` (the path
5
- * RESOLUTION module) pulls `node:fs` and the operating-mode strategies, so
6
- * isomorphic/client-reachable code (e.g. authorization/protected-branch.ts,
7
- * which the editor bundle reaches via api/guards.ts) must get
8
- * `sanitizeBranchName` from HERE, never from `paths/branch.ts` — a `node:`
9
- * import in that graph breaks adopters' production `next build` of the
10
- * editor bundle. Same pattern as assets/asset-prefixes.ts.
11
- */
12
- /**
13
- * Sanitize a branch name for use in filesystem paths.
14
- * - Replaces invalid characters with hyphens
15
- * - Collapses multiple hyphens
16
- * - Trims leading/trailing dots
5
+ * Client-reachable code (e.g. authorization/protected-branch.ts, which the
6
+ * editor bundle reaches via api/guards.ts) MUST import `sanitizeBranchName`
7
+ * from HERE, never from `paths/branch.ts` or the `paths` barrel: both pull
8
+ * `node:fs` and the operating-mode strategies, and a `node:` import in that
9
+ * graph breaks adopters' production `next build` of the editor bundle.
10
+ * `pnpm lint:bundle` enforces it.
17
11
  */
12
+ /** Sanitize a branch name for use in filesystem paths. */
18
13
  export function sanitizeBranchName(branchName) {
19
14
  const replaced = branchName.replace(/[^a-zA-Z0-9._-]/g, '-');
20
15
  const squashed = replaced.replace(/-+/g, '-');
@@ -22,23 +17,20 @@ export function sanitizeBranchName(branchName) {
22
17
  return (trimmedDots || 'branch');
23
18
  }
24
19
  /**
25
- * Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}`,
26
- * see operating-mode/client-unsafe-strategy.ts's `getSettingsBranchName` and
27
- * operating-mode/deployment-name.ts's `resolveDeploymentName`). Exported from
28
- * this dependency-free module -- not constructed ad hoc at each call site --
29
- * so every consumer that needs to recognize the settings-branch namespace
30
- * agrees on the exact string: worker/git-sync.ts's `pushSettingsBranches`
31
- * (never push a `canopycms-settings-*` branch this deployment doesn't own),
32
- * and api/branch.ts's `createBranchHandler` (reject a user-requested branch
33
- * whose SANITIZED name falls in this namespace).
20
+ * Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}`;
21
+ * built by operating-mode/client-unsafe-strategy.ts's `getSettingsBranchName`).
22
+ * Exported from this dependency-free module -- not rebuilt ad hoc at each call
23
+ * site -- so every consumer of the namespace agrees on the exact string:
24
+ * worker/git-sync.ts's `pushSettingsBranches` never pushes a
25
+ * `canopycms-settings-*` branch this deployment doesn't own, and api/branch.ts's
26
+ * `createBranchHandler` rejects a user-requested branch whose SANITIZED name
27
+ * falls in this namespace.
34
28
  *
35
- * Two CanopyCMS deployments can share one GitHub repo, each with its own
36
- * settings branch under this prefix (`canopycms-settings-prod` vs
37
- * `canopycms-settings-staging`, say). A content-branch request that lands on
38
- * ANOTHER deployment's settings branch name would silently corrupt that
39
- * deployment's permissions/groups the next time its worker treats the ref as
40
- * an orphan settings branch -- so the whole prefix is reserved for branch
41
- * creation, not just this deployment's own settings branch name.
29
+ * The WHOLE prefix is reserved, not just this deployment's own settings branch:
30
+ * two deployments can share one GitHub repo, and a content branch landing on
31
+ * the other's settings-branch name silently corrupts that deployment's
32
+ * permissions/groups once its worker treats the ref as an orphan settings
33
+ * branch.
42
34
  */
43
35
  export const RESERVED_SETTINGS_BRANCH_PREFIX = 'canopycms-settings-';
44
36
  /**
@@ -46,17 +38,15 @@ export const RESERVED_SETTINGS_BRANCH_PREFIX = 'canopycms-settings-';
46
38
  *
47
39
  * http/router.ts's `compareSpecificity` ranks a literal pattern segment above a
48
40
  * `:param`, so a branch named e.g. `admin` has its `/:branch/...` routes
49
- * shadowed by the static `/admin/...` ones. The failure is a *partial* one,
50
- * which is what makes it confusing: bare `GET /admin` still reaches the branch
51
- * handler (there is no single-segment static `/admin` route), so the branch
52
- * looks half-alive while every nested route 404s or 403s.
41
+ * shadowed by the static `/admin/...` ones -- and only partially, which is what
42
+ * makes it confusing: bare `GET /admin` still reaches the branch handler, so the
43
+ * branch looks half-alive while every nested route 404s or 403s.
53
44
  *
54
- * Lives in this dependency-free module for the same reason as
55
- * {@link RESERVED_SETTINGS_BRANCH_PREFIX}: api/validators.ts is imported *by*
56
- * the route modules, so nothing on the validation side can import the router to
57
- * derive this at runtime without a cycle. http/router.test.ts derives the same
58
- * set from the live route table and asserts it equals this constant, so adding
59
- * a new top-level namespace fails that test until this list is updated.
45
+ * Listed rather than derived at runtime because api/validators.ts is imported
46
+ * *by* the route modules, so importing the router here would cycle.
47
+ * http/router.test.ts derives the same set from the live route table and asserts
48
+ * it equals this constant, so a new top-level namespace fails that test until
49
+ * this list is updated.
60
50
  */
61
51
  export const RESERVED_ROUTE_BRANCH_NAMES = [
62
52
  'admin',
@@ -1,8 +1,4 @@
1
- /**
2
- * Branch path resolution utilities.
3
- *
4
- * Handles resolving branch names to workspace directories.
5
- */
1
+ /** Branch path resolution utilities. */
6
2
  import type { BranchContext } from '../types.js';
7
3
  import { OperatingMode } from '../operating-mode/index.js';
8
4
  export interface BranchPathOptions {
@@ -15,24 +11,14 @@ export interface BranchPathResult {
15
11
  baseRoot: string;
16
12
  branchName: string;
17
13
  }
14
+ /** @internal Exported for tests. */
18
15
  export declare class BranchPathError extends Error {
19
16
  }
20
17
  import { sanitizeBranchName } from './branch-name.js';
18
+ /** @internal Exported for tests. */
21
19
  export { sanitizeBranchName };
22
- /**
23
- * Resolve branch name to workspace paths.
24
- * Validates for path traversal attacks.
25
- */
20
+ /** Resolve a branch name to workspace paths, rejecting path traversal. */
26
21
  export declare function resolveBranchPath(options: BranchPathOptions): BranchPathResult;
27
- /**
28
- * Ensure the branch workspace directory exists.
29
- */
30
22
  export declare function ensureBranchRoot(options: BranchPathOptions): Promise<BranchPathResult>;
31
- /**
32
- * Get the default base directory for branch workspaces.
33
- */
34
23
  export declare function getDefaultBranchBase(mode: OperatingMode, override?: string): string;
35
- /**
36
- * Resolve branch paths from a branch context.
37
- */
38
24
  export declare function resolveBranchPaths(branchContext: BranchContext, mode: OperatingMode, basePathOverride?: string): BranchPathResult;
@@ -1,26 +1,19 @@
1
- /**
2
- * Branch path resolution utilities.
3
- *
4
- * Handles resolving branch names to workspace directories.
5
- */
1
+ /** Branch path resolution utilities. */
6
2
  import fs from 'node:fs/promises';
7
3
  import path from 'node:path';
8
4
  import { operatingStrategy } from '../operating-mode/index.js';
5
+ /** @internal Exported for tests. */
9
6
  export class BranchPathError extends Error {
10
7
  }
11
- // Moved to ./branch-name (dependency-free) so client-reachable modules can
12
- // use it without dragging this file's node:fs / operating-mode imports into
13
- // browser bundles. Imported for local use + re-exported for existing
14
- // server-side importers.
8
+ // Lives in ./branch-name (dependency-free); re-exported here for server-side
9
+ // importers, who may safely reach this module's node:fs imports.
15
10
  import { sanitizeBranchName } from './branch-name.js';
11
+ /** @internal Exported for tests. */
16
12
  export { sanitizeBranchName };
17
13
  const resolveContentBranchesRoot = (mode, override) => {
18
14
  return operatingStrategy(mode).getContentBranchesRoot(override);
19
15
  };
20
- /**
21
- * Resolve branch name to workspace paths.
22
- * Validates for path traversal attacks.
23
- */
16
+ /** Resolve a branch name to workspace paths, rejecting path traversal. */
24
17
  export function resolveBranchPath(options) {
25
18
  if (options.branchName.includes('..')) {
26
19
  throw new BranchPathError('Branch name cannot contain traversal segments');
@@ -42,23 +35,14 @@ export function resolveBranchPath(options) {
42
35
  }
43
36
  return { branchRoot, baseRoot: normalizedBase, branchName: safeBranch };
44
37
  }
45
- /**
46
- * Ensure the branch workspace directory exists.
47
- */
48
38
  export async function ensureBranchRoot(options) {
49
39
  const result = resolveBranchPath(options);
50
40
  await fs.mkdir(result.branchRoot, { recursive: true });
51
41
  return result;
52
42
  }
53
- /**
54
- * Get the default base directory for branch workspaces.
55
- */
56
43
  export function getDefaultBranchBase(mode, override) {
57
44
  return resolveContentBranchesRoot(mode, override);
58
45
  }
59
- /**
60
- * Resolve branch paths from a branch context.
61
- */
62
46
  export function resolveBranchPaths(branchContext, mode, basePathOverride) {
63
47
  if (branchContext.branchRoot || branchContext.baseRoot) {
64
48
  const baseRoot = path.resolve(branchContext.baseRoot ?? resolveContentBranchesRoot(mode, basePathOverride));
@@ -1,17 +1,6 @@
1
1
  /**
2
- * Path utilities for CanopyCMS
3
- *
4
- * This module consolidates path handling utilities that were previously
5
- * scattered across multiple files:
6
- * - normalize.ts: Path normalization and creation
7
- * - validation.ts: Security validation for paths
8
- * - branch.ts: Branch workspace path resolution
9
- * - types.ts: Branded types for type safety
10
- *
11
- * Usage:
12
- * ```ts
13
- * import { normalizeFilesystemPath, createLogicalPath, parseSlug } from '../paths/index.js'
14
- * ```
2
+ * Path utilities. Client-reachable code deep-imports `./branch-name` instead,
3
+ * because this barrel pulls in node:fs; `pnpm lint:bundle` enforces that.
15
4
  */
16
5
  export type { LogicalPath, PhysicalPath, SanitizedBranchName, BranchName, ContentId, Slug, PathValidationResult, } from './types.js';
17
6
  export { normalizeFilesystemPath, normalizeCollectionPath, hasTraversalSequence, createLogicalPath, createPhysicalPath, joinPath, trimSlashes, } from './normalize.js';
@@ -1,32 +1,12 @@
1
1
  /**
2
- * Path utilities for CanopyCMS
3
- *
4
- * This module consolidates path handling utilities that were previously
5
- * scattered across multiple files:
6
- * - normalize.ts: Path normalization and creation
7
- * - validation.ts: Security validation for paths
8
- * - branch.ts: Branch workspace path resolution
9
- * - types.ts: Branded types for type safety
10
- *
11
- * Usage:
12
- * ```ts
13
- * import { normalizeFilesystemPath, createLogicalPath, parseSlug } from '../paths/index.js'
14
- * ```
2
+ * Path utilities. Client-reachable code deep-imports `./branch-name` instead,
3
+ * because this barrel pulls in node:fs; `pnpm lint:bundle` enforces that.
15
4
  */
16
5
  // Normalization utilities (client-safe)
17
6
  export { normalizeFilesystemPath, normalizeCollectionPath, hasTraversalSequence, createLogicalPath, createPhysicalPath, joinPath, trimSlashes, } from './normalize.js';
18
7
  // Normalization utilities (server-only, requires Node.js path module)
19
8
  export { validateAndNormalizePath } from './normalize-server.js';
20
- // Validation utilities
21
- export { validateContentPath, isValidCollectionPath, sanitizeForPath,
22
- // Path type detection and parsing
23
- hasEmbeddedContentId, looksLikePhysicalPath, looksLikeLogicalPath, parseLogicalPath, parsePhysicalPath, isValidContentId,
24
- // Branded type validation and parsing
25
- parseContentId, parseBranchName, parseSlug, } from './validation.js';
26
- // Path resolution utilities
9
+ export { validateContentPath, isValidCollectionPath, sanitizeForPath, hasEmbeddedContentId, looksLikePhysicalPath, looksLikeLogicalPath, parseLogicalPath, parsePhysicalPath, isValidContentId, parseContentId, parseBranchName, parseSlug, } from './validation.js';
27
10
  export { resolveLogicalPath } from './resolve.js';
28
- // Branch path utilities
29
11
  export { resolveBranchPath, ensureBranchRoot, getDefaultBranchBase, resolveBranchPaths, BranchPathError, } from './branch.js';
30
- // From the dependency-free module (NOT ./branch, which imports node:fs) so
31
- // client-reachable importers of 'canopycms/src/paths' stay browser-safe.
32
12
  export { sanitizeBranchName, RESERVED_SETTINGS_BRANCH_PREFIX, RESERVED_ROUTE_BRANCH_NAMES, } from './branch-name.js';
@@ -1,19 +1,7 @@
1
1
  /**
2
- * Server-only path normalization utilities.
3
- *
4
- * These functions depend on Node.js 'path' module and cannot be used in client code.
5
- * Client-safe functions are in normalize.ts.
2
+ * Server-only path normalization utilities: these depend on `node:path` and
3
+ * must not reach a client bundle. Client-safe equivalents are in normalize.ts.
6
4
  */
7
5
  import type { PathValidationResult } from './types.js';
8
- /**
9
- * Validate and normalize a path relative to a root directory.
10
- * Checks for path traversal attacks.
11
- *
12
- * NOTE: This function uses Node.js path module and is server-only.
13
- * For client code, use the pure functions in normalize.ts.
14
- *
15
- * @param root - The root directory
16
- * @param target - The target path to validate
17
- * @returns Validation result with normalized relative path if valid
18
- */
6
+ /** Normalize `target` relative to `root`, rejecting anything that escapes it. */
19
7
  export declare function validateAndNormalizePath(root: string, target: string): PathValidationResult;
@@ -1,21 +1,9 @@
1
1
  /**
2
- * Server-only path normalization utilities.
3
- *
4
- * These functions depend on Node.js 'path' module and cannot be used in client code.
5
- * Client-safe functions are in normalize.ts.
2
+ * Server-only path normalization utilities: these depend on `node:path` and
3
+ * must not reach a client bundle. Client-safe equivalents are in normalize.ts.
6
4
  */
7
5
  import { sep, resolve, relative } from 'node:path';
8
- /**
9
- * Validate and normalize a path relative to a root directory.
10
- * Checks for path traversal attacks.
11
- *
12
- * NOTE: This function uses Node.js path module and is server-only.
13
- * For client code, use the pure functions in normalize.ts.
14
- *
15
- * @param root - The root directory
16
- * @param target - The target path to validate
17
- * @returns Validation result with normalized relative path if valid
18
- */
6
+ /** Normalize `target` relative to `root`, rejecting anything that escapes it. */
19
7
  export function validateAndNormalizePath(root, target) {
20
8
  const resolvedRoot = resolve(root);
21
9
  const withSep = resolvedRoot.endsWith(sep) ? resolvedRoot : `${resolvedRoot}${sep}`;
@@ -1,66 +1,46 @@
1
1
  /**
2
- * Path normalization utilities (client-safe).
3
- *
4
- * Consolidates the various path normalization patterns used across the codebase
5
- * into a single, well-tested module.
6
- *
7
- * NOTE: These functions are pure and can be used in both client and server code.
8
- * Server-only functions that depend on Node.js 'path' module are in normalize-server.ts.
2
+ * Path normalization utilities. Pure, so client-safe; the ones that need
3
+ * `node:path` live in normalize-server.ts.
9
4
  */
10
5
  import type { LogicalPath, PhysicalPath } from './types.js';
11
6
  /**
12
- * Normalize a filesystem path by:
13
- * - Converting backslashes to forward slashes
14
- * - Removing empty segments
15
- * - Removing leading/trailing slashes
16
- *
17
- * This is the foundational normalization used by most path operations.
7
+ * Split on either separator, dropping empty segments, and rejoin with `/`:
8
+ * backslashes become forward slashes and leading/trailing/repeated slashes go.
9
+ * Most other path operations here build on it.
18
10
  *
19
11
  * @example
20
12
  * normalizeFilesystemPath('content\\posts\\\\my-post') // 'content/posts/my-post'
21
- * normalizeFilesystemPath('/content/posts/') // 'content/posts'
22
13
  */
23
14
  export declare function normalizeFilesystemPath(path: string): string;
24
15
  /**
25
- * Normalize a collection path by removing any content root prefix
26
- * and normalizing separators.
16
+ * Normalize separators and strip any leading content-root prefix.
27
17
  *
28
18
  * @example
29
- * normalizeCollectionPath('content/posts') // 'posts'
30
19
  * normalizeCollectionPath('content\\blog\\posts') // 'blog/posts'
31
- * normalizeCollectionPath('posts') // 'posts'
32
20
  */
33
21
  export declare function normalizeCollectionPath(collectionPath: string, contentRoot?: string): string;
34
22
  /**
35
23
  * Check if a path contains traversal sequences (.., etc.)
36
24
  */
37
25
  export declare function hasTraversalSequence(path: string): boolean;
38
- /**
39
- * Create a logical path from segments.
40
- * Validates that no segment contains path traversal.
41
- *
42
- * @example
43
- * createLogicalPath('content', 'posts', 'my-post') // 'content/posts/my-post' as LogicalPath
44
- */
26
+ /** Join segments into a LogicalPath, throwing on a traversal sequence. */
45
27
  export declare function createLogicalPath(...segments: string[]): LogicalPath;
46
28
  /**
47
- * Create a physical path from segments.
48
- * This is for paths that may contain embedded IDs.
49
- *
50
- * @example
51
- * createPhysicalPath('content', 'posts', 'my-post.ABC123.mdx') // as PhysicalPath
29
+ * Join segments into a PhysicalPath (segments may carry embedded content IDs,
30
+ * e.g. `my-post.ABC123.mdx`), throwing on a traversal sequence.
31
+ * @internal Exported for tests.
52
32
  */
53
33
  export declare function createPhysicalPath(...segments: string[]): PhysicalPath;
54
34
  /**
55
35
  * Strip leading and trailing slashes from a path or URL segment.
56
36
  *
57
37
  * @example
58
- * trimSlashes('/docs/guides/') // 'docs/guides'
59
38
  * trimSlashes('///multi///') // 'multi'
60
39
  */
61
40
  export declare function trimSlashes(path: string): string;
62
41
  /**
63
- * Join path segments with forward slashes.
64
- * Does not validate - use createLogicalPath/createPhysicalPath for validation.
42
+ * Join path segments with forward slashes. Does NOT check for traversal --
43
+ * use createLogicalPath/createPhysicalPath where the result is used as a path.
44
+ * @internal Exported for tests.
65
45
  */
66
46
  export declare function joinPath(...segments: string[]): string;
@@ -1,23 +1,14 @@
1
1
  /**
2
- * Path normalization utilities (client-safe).
3
- *
4
- * Consolidates the various path normalization patterns used across the codebase
5
- * into a single, well-tested module.
6
- *
7
- * NOTE: These functions are pure and can be used in both client and server code.
8
- * Server-only functions that depend on Node.js 'path' module are in normalize-server.ts.
2
+ * Path normalization utilities. Pure, so client-safe; the ones that need
3
+ * `node:path` live in normalize-server.ts.
9
4
  */
10
5
  /**
11
- * Normalize a filesystem path by:
12
- * - Converting backslashes to forward slashes
13
- * - Removing empty segments
14
- * - Removing leading/trailing slashes
15
- *
16
- * This is the foundational normalization used by most path operations.
6
+ * Split on either separator, dropping empty segments, and rejoin with `/`:
7
+ * backslashes become forward slashes and leading/trailing/repeated slashes go.
8
+ * Most other path operations here build on it.
17
9
  *
18
10
  * @example
19
11
  * normalizeFilesystemPath('content\\posts\\\\my-post') // 'content/posts/my-post'
20
- * normalizeFilesystemPath('/content/posts/') // 'content/posts'
21
12
  */
22
13
  export function normalizeFilesystemPath(path) {
23
14
  return path
@@ -26,13 +17,10 @@ export function normalizeFilesystemPath(path) {
26
17
  .join('/');
27
18
  }
28
19
  /**
29
- * Normalize a collection path by removing any content root prefix
30
- * and normalizing separators.
20
+ * Normalize separators and strip any leading content-root prefix.
31
21
  *
32
22
  * @example
33
- * normalizeCollectionPath('content/posts') // 'posts'
34
23
  * normalizeCollectionPath('content\\blog\\posts') // 'blog/posts'
35
- * normalizeCollectionPath('posts') // 'posts'
36
24
  */
37
25
  export function normalizeCollectionPath(collectionPath, contentRoot = 'content') {
38
26
  const normalized = normalizeFilesystemPath(collectionPath);
@@ -49,13 +37,7 @@ export function hasTraversalSequence(path) {
49
37
  const normalized = normalizeFilesystemPath(path);
50
38
  return normalized.includes('..');
51
39
  }
52
- /**
53
- * Create a logical path from segments.
54
- * Validates that no segment contains path traversal.
55
- *
56
- * @example
57
- * createLogicalPath('content', 'posts', 'my-post') // 'content/posts/my-post' as LogicalPath
58
- */
40
+ /** Join segments into a LogicalPath, throwing on a traversal sequence. */
59
41
  export function createLogicalPath(...segments) {
60
42
  const normalized = segments
61
43
  .map((s) => normalizeFilesystemPath(s))
@@ -67,11 +49,9 @@ export function createLogicalPath(...segments) {
67
49
  return normalized;
68
50
  }
69
51
  /**
70
- * Create a physical path from segments.
71
- * This is for paths that may contain embedded IDs.
72
- *
73
- * @example
74
- * createPhysicalPath('content', 'posts', 'my-post.ABC123.mdx') // as PhysicalPath
52
+ * Join segments into a PhysicalPath (segments may carry embedded content IDs,
53
+ * e.g. `my-post.ABC123.mdx`), throwing on a traversal sequence.
54
+ * @internal Exported for tests.
75
55
  */
76
56
  export function createPhysicalPath(...segments) {
77
57
  const normalized = segments
@@ -87,7 +67,6 @@ export function createPhysicalPath(...segments) {
87
67
  * Strip leading and trailing slashes from a path or URL segment.
88
68
  *
89
69
  * @example
90
- * trimSlashes('/docs/guides/') // 'docs/guides'
91
70
  * trimSlashes('///multi///') // 'multi'
92
71
  */
93
72
  export function trimSlashes(path) {
@@ -101,8 +80,9 @@ export function trimSlashes(path) {
101
80
  return path.slice(start, end);
102
81
  }
103
82
  /**
104
- * Join path segments with forward slashes.
105
- * Does not validate - use createLogicalPath/createPhysicalPath for validation.
83
+ * Join path segments with forward slashes. Does NOT check for traversal --
84
+ * use createLogicalPath/createPhysicalPath where the result is used as a path.
85
+ * @internal Exported for tests.
106
86
  */
107
87
  export function joinPath(...segments) {
108
88
  return segments
@@ -4,26 +4,13 @@
4
4
  import type { FlatSchemaItem } from '../config/index.js';
5
5
  import type { LogicalPath } from './types.js';
6
6
  /**
7
- * Resolve a physical collection path to its logical path.
8
- *
9
- * Physical paths contain embedded IDs (e.g., "content/authors.q52DCVPuH4ga"),
10
- * while logical paths are schema-defined (e.g., "content/authors").
11
- *
12
- * This function matches physical path segments to logical path segments,
13
- * accounting for ID suffixes in physical paths.
14
- *
15
- * @param physicalPath - The physical filesystem path with embedded IDs
16
- * @param schemaItems - Iterable of schema items to search
17
- * @returns The matching logical path, or the physical path if no match found
18
- *
19
- * @example
20
- * // Match physical to logical
21
- * resolveLogicalPath("content/authors.q52DCVPuH4ga", schemaItems)
22
- * // Returns: "content/authors"
7
+ * Resolve a physical collection path (segments carry embedded IDs, e.g.
8
+ * "content/authors.q52DCVPuH4ga") to its schema-defined logical path
9
+ * ("content/authors"), or back to the physical path when nothing matches.
23
10
  *
24
11
  * @example
25
- * // Nested collections
26
12
  * resolveLogicalPath("content/docs.ABC/api.DEF", schemaItems)
27
13
  * // Returns: "content/docs/api"
14
+ * @internal Exported for tests.
28
15
  */
29
16
  export declare function resolveLogicalPath(physicalPath: string, schemaItems: Iterable<FlatSchemaItem>): LogicalPath | string;