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,53 +1,32 @@
1
- /**
2
- * Framework-agnostic HTTP request interface.
3
- * Minimal surface area - only what CanopyCMS actually needs.
4
- */
1
+ /** Framework-agnostic HTTP request: only what CanopyCMS actually needs. */
5
2
  export interface CanopyRequest {
6
- /** HTTP method (GET, POST, PUT, DELETE, etc.) */
7
3
  readonly method: string;
8
- /** Full request URL as string */
9
4
  readonly url: string;
10
- /**
11
- * Get request header value (case-insensitive).
12
- * Returns null if header not present.
13
- */
5
+ /** Case-insensitive; null when the header is absent. */
14
6
  header(name: string): string | null;
15
- /**
16
- * Parse request body as JSON.
17
- * Returns undefined for GET requests or empty bodies.
18
- */
7
+ /** Undefined for GET requests and empty bodies. */
19
8
  json(): Promise<unknown>;
20
9
  /**
21
- * Read the raw request body as bytes, bypassing JSON parsing.
22
- * Optional: only wired by adapters that need to support non-JSON bodies
23
- * (e.g. proxied binary/multipart uploads). Bare CanopyRequest mocks/test
24
- * harnesses that omit this keep compiling.
10
+ * The raw body bytes, bypassing JSON parsing. Optional, so that adapters
11
+ * without non-JSON bodies (and bare test mocks) still compile.
25
12
  *
26
- * Like the underlying platform Request, the body stream can only be
27
- * consumed once - callers must not also call `json()`/`formData()` on the
28
- * same request.
13
+ * As with the platform Request, the body stream is consumed ONCE: a caller
14
+ * using this must not also call `json()` or `formData()`.
29
15
  */
30
16
  rawBody?(): Promise<Uint8Array>;
31
- /**
32
- * Parse the request body as multipart/form-data.
33
- * Optional for the same reason as `rawBody` above.
34
- */
17
+ /** Optional, and single-use, for the same reasons as `rawBody`. */
35
18
  formData?(): Promise<FormData>;
36
19
  }
37
- /**
38
- * Framework-agnostic HTTP response.
39
- * Represents the response data to be sent back.
40
- */
20
+ /** Framework-agnostic HTTP response. */
41
21
  export interface CanopyResponse<T = unknown> {
42
22
  readonly status: number;
43
23
  readonly body: T;
44
24
  readonly headers?: Record<string, string>;
45
25
  }
46
26
  /**
47
- * Framework-agnostic binary HTTP response (e.g. serving image/PDF bytes).
48
- * Distinct from `CanopyResponse` via the `kind` discriminant so adapters can
49
- * dispatch on response shape without a cast: `body` is arbitrary bytes
50
- * (or a stream of them), not a JSON-serializable value.
27
+ * A binary response (image/PDF bytes). The `kind` discriminant lets adapters
28
+ * dispatch without a cast: `body` here is arbitrary bytes or a stream of them,
29
+ * not a JSON-serializable value.
51
30
  */
52
31
  export interface CanopyBinaryResponse {
53
32
  readonly kind: 'binary';
@@ -60,14 +39,10 @@ export interface CanopyBinaryResponse {
60
39
  etag?: string;
61
40
  };
62
41
  }
63
- /**
64
- * Create a JSON response with the given body and status code.
65
- */
66
42
  export declare function jsonResponse<T>(body: T, status?: number, headers?: Record<string, string>): CanopyResponse<T>;
67
43
  /**
68
- * Type guard distinguishing `CanopyBinaryResponse` from any other route
69
- * result (`ApiResponse`/`CanopyResponse`, neither of which declare `kind`).
70
- * Framework adapters and the core handler use this to decide whether to
71
- * pass a route result through untouched or wrap it via `jsonResponse`.
44
+ * Distinguishes `CanopyBinaryResponse` from any other route result (neither
45
+ * `ApiResponse` nor `CanopyResponse` declares `kind`), which is how adapters
46
+ * and the core handler decide to pass a result through or wrap it in JSON.
72
47
  */
73
48
  export declare function isCanopyBinaryResponse(value: unknown): value is CanopyBinaryResponse;
@@ -1,14 +1,10 @@
1
- /**
2
- * Create a JSON response with the given body and status code.
3
- */
4
1
  export function jsonResponse(body, status = 200, headers) {
5
2
  return { status, body, headers };
6
3
  }
7
4
  /**
8
- * Type guard distinguishing `CanopyBinaryResponse` from any other route
9
- * result (`ApiResponse`/`CanopyResponse`, neither of which declare `kind`).
10
- * Framework adapters and the core handler use this to decide whether to
11
- * pass a route result through untouched or wrap it via `jsonResponse`.
5
+ * Distinguishes `CanopyBinaryResponse` from any other route result (neither
6
+ * `ApiResponse` nor `CanopyResponse` declares `kind`), which is how adapters
7
+ * and the core handler decide to pass a result through or wrap it in JSON.
12
8
  */
13
9
  export function isCanopyBinaryResponse(value) {
14
10
  return (typeof value === 'object' && value !== null && value.kind === 'binary');
package/dist/id.d.ts CHANGED
@@ -1,16 +1,10 @@
1
1
  import type { ContentId } from './paths/types.js';
2
2
  import { isValidContentId } from './paths/validation.js';
3
3
  /**
4
- * Generate a new 12-character content ID.
5
- * Uses Base58-encoded UUID, truncated for shorter filenames.
6
- *
7
- * Collision probability with 12 chars:
8
- * - ~58^12 = 2.6 × 10^21 possible IDs
9
- * - With 10,000 entries: collision chance ~0.000000002%
4
+ * Generate a 12-character content ID: a Base58-encoded UUID truncated for
5
+ * shorter filenames. ~58^12 = 2.6 × 10^21 IDs, so 10,000 entries carry a
6
+ * ~0.000000002% collision chance.
10
7
  */
11
8
  export declare function generateId(): ContentId;
12
- /**
13
- * Validate that a string is a valid content ID format.
14
- * Standard format: 12 characters using Base58 alphabet (no ambiguous characters: 0, O, I, l).
15
- */
9
+ /** Is a string a valid content ID? 12 Base58 characters (no ambiguous 0, O, I, l). */
16
10
  export declare const isValidId: typeof isValidContentId;
package/dist/id.js CHANGED
@@ -1,19 +1,13 @@
1
1
  import { generate } from 'short-uuid';
2
2
  import { isValidContentId } from './paths/validation.js';
3
3
  /**
4
- * Generate a new 12-character content ID.
5
- * Uses Base58-encoded UUID, truncated for shorter filenames.
6
- *
7
- * Collision probability with 12 chars:
8
- * - ~58^12 = 2.6 × 10^21 possible IDs
9
- * - With 10,000 entries: collision chance ~0.000000002%
4
+ * Generate a 12-character content ID: a Base58-encoded UUID truncated for
5
+ * shorter filenames. ~58^12 = 2.6 × 10^21 IDs, so 10,000 entries carry a
6
+ * ~0.000000002% collision chance.
10
7
  */
11
8
  export function generateId() {
12
9
  const full = generate(); // 22 chars
13
10
  return full.substring(0, 12); // Truncate to 12 chars
14
11
  }
15
- /**
16
- * Validate that a string is a valid content ID format.
17
- * Standard format: 12 characters using Base58 alphabet (no ambiguous characters: 0, O, I, l).
18
- */
12
+ /** Is a string a valid content ID? 12 Base58 characters (no ambiguous 0, O, I, l). */
19
13
  export const isValidId = isValidContentId;
package/dist/index.js CHANGED
@@ -3,18 +3,15 @@ export * from './config/index.js';
3
3
  export * from './entry-schema.js';
4
4
  export * from './types.js';
5
5
  export * from './user.js';
6
- // Title-derivation fallback chain (schema isTitle field -> data.title/name ->
7
- // entry-type label -> humanized slug -> "Untitled"). Client-safe (its only
8
- // import is `FieldConfig`/`InlineGroupFieldConfig` types, erased at compile
9
- // time, so no runtime dependency at all) — re-exported here as well as from
10
- // 'canopycms/server' so client-side list/preview UI can compute the same
11
- // display title as build scripts without a second implementation.
6
+ // Title-derivation fallback chain (schema isTitle field -> data.title/name -> entry-type label ->
7
+ // humanized slug -> "Untitled"). Client-safe: its only imports are types, erased at compile time.
8
+ // Exported from 'canopycms/server' too, so client list/preview UI and build scripts derive the
9
+ // same display title from one implementation.
12
10
  export { resolveEntryTitle } from './utils/title-field.js';
13
11
  // AI content config helper — client-safe (no node: imports).
14
12
  // Server-only AI features (handler, generator) are in 'canopycms/ai'.
15
13
  export { defineAIContentConfig } from './ai/types.js';
16
14
  export { isCanopyRequest, isHeadersLike, extractHeaders, validateAuthContext, } from './auth/context-helpers.js';
17
- // Asset URL helpers — client-safe (no node: imports). Build/adjust transform
18
- // URLs for <img>/srcset from stored asset refs without pulling in the
19
- // server-only transform engine (canopycms's assets/transform.ts, sharp).
15
+ // Asset URL helpers — client-safe (no node: imports). Build/adjust transform URLs for <img>/srcset
16
+ // from stored asset refs without the server-only transform engine (assets/transform.ts, sharp).
20
17
  export { assetUrl, assetSrcSet } from './assets/asset-url.js';
@@ -1,10 +1,7 @@
1
1
  /**
2
- * Client-Safe Operating Mode Strategies
3
- *
4
- * Base strategy classes that are safe to import in 'use client' React components.
5
- * NO Node.js imports (fs, path, process, etc.) - only pure logic and simple data.
6
- *
7
- * These classes are extended by client-unsafe strategies to add Node.js functionality.
2
+ * Base strategy classes, safe in 'use client' React components: pure logic and
3
+ * simple data, NO Node.js imports. client-unsafe-strategy.ts extends these to
4
+ * add the Node.js surface.
8
5
  */
9
6
  import type { OperatingMode, ClientSafeStrategy } from './types.js';
10
7
  export declare class ProdClientSafeStrategy implements ClientSafeStrategy {
@@ -30,16 +27,12 @@ export declare class DevClientSafeStrategy implements ClientSafeStrategy {
30
27
  shouldPush(): boolean;
31
28
  }
32
29
  /**
33
- * Get the client-safe strategy for an operating mode.
34
- *
35
- * Strategies are memoized - one instance per mode for the entire process lifetime.
36
- * Safe to call inline: clientOperatingStrategy(mode).supportsBranching()
37
- *
38
- * @param mode - The operating mode
39
- * @returns Client-safe strategy instance
30
+ * Memoized: one instance per mode for the process lifetime, so this is safe to
31
+ * call inline — `clientOperatingStrategy(mode).supportsBranching()`.
40
32
  */
41
33
  export declare function clientOperatingStrategy(mode: OperatingMode): ClientSafeStrategy;
42
34
  /**
43
- * Clear the client strategy cache (mainly for testing)
35
+ * Mainly for testing.
36
+ * @internal Exported for tests.
44
37
  */
45
38
  export declare function clearClientStrategyCache(): void;
@@ -1,19 +1,12 @@
1
1
  /**
2
- * Client-Safe Operating Mode Strategies
3
- *
4
- * Base strategy classes that are safe to import in 'use client' React components.
5
- * NO Node.js imports (fs, path, process, etc.) - only pure logic and simple data.
6
- *
7
- * These classes are extended by client-unsafe strategies to add Node.js functionality.
2
+ * Base strategy classes, safe in 'use client' React components: pure logic and
3
+ * simple data, NO Node.js imports. client-unsafe-strategy.ts extends these to
4
+ * add the Node.js surface.
8
5
  */
9
- // ============================================================================
10
- // Production Mode - Client-Safe Strategy
11
- // ============================================================================
12
6
  export class ProdClientSafeStrategy {
13
7
  constructor() {
14
8
  this.mode = 'prod';
15
9
  }
16
- // UI Feature Flags
17
10
  supportsBranching() {
18
11
  return true;
19
12
  }
@@ -26,7 +19,6 @@ export class ProdClientSafeStrategy {
26
19
  supportsPullRequests() {
27
20
  return true;
28
21
  }
29
- // Simple Data
30
22
  getPermissionsFileName() {
31
23
  return 'permissions.json';
32
24
  }
@@ -40,14 +32,10 @@ export class ProdClientSafeStrategy {
40
32
  return true;
41
33
  }
42
34
  }
43
- // ============================================================================
44
- // Dev Mode - Client-Safe Strategy
45
- // ============================================================================
46
35
  export class DevClientSafeStrategy {
47
36
  constructor() {
48
37
  this.mode = 'dev';
49
38
  }
50
- // UI Feature Flags
51
39
  supportsBranching() {
52
40
  return true;
53
41
  }
@@ -60,7 +48,6 @@ export class DevClientSafeStrategy {
60
48
  supportsPullRequests() {
61
49
  return false; // No real GitHub in local dev mode
62
50
  }
63
- // Simple Data
64
51
  getPermissionsFileName() {
65
52
  return 'permissions.json';
66
53
  }
@@ -74,18 +61,10 @@ export class DevClientSafeStrategy {
74
61
  return true;
75
62
  }
76
63
  }
77
- // ============================================================================
78
- // Factory with Memoization
79
- // ============================================================================
80
64
  const clientStrategyCache = new Map();
81
65
  /**
82
- * Get the client-safe strategy for an operating mode.
83
- *
84
- * Strategies are memoized - one instance per mode for the entire process lifetime.
85
- * Safe to call inline: clientOperatingStrategy(mode).supportsBranching()
86
- *
87
- * @param mode - The operating mode
88
- * @returns Client-safe strategy instance
66
+ * Memoized: one instance per mode for the process lifetime, so this is safe to
67
+ * call inline — `clientOperatingStrategy(mode).supportsBranching()`.
89
68
  */
90
69
  export function clientOperatingStrategy(mode) {
91
70
  const cached = clientStrategyCache.get(mode);
@@ -100,7 +79,7 @@ export function clientOperatingStrategy(mode) {
100
79
  strategy = new DevClientSafeStrategy();
101
80
  break;
102
81
  default: {
103
- // Exhaustiveness check - TypeScript will error if a mode is not handled
82
+ // Exhaustiveness check: adding a mode without a case fails to compile.
104
83
  const _exhaustive = mode;
105
84
  throw new Error(`Unknown operating mode: ${_exhaustive}`);
106
85
  }
@@ -109,7 +88,8 @@ export function clientOperatingStrategy(mode) {
109
88
  return strategy;
110
89
  }
111
90
  /**
112
- * Clear the client strategy cache (mainly for testing)
91
+ * Mainly for testing.
92
+ * @internal Exported for tests.
113
93
  */
114
94
  export function clearClientStrategyCache() {
115
95
  clientStrategyCache.clear();
@@ -1,25 +1,15 @@
1
1
  /**
2
- * Client-Unsafe Operating Mode Strategies
3
- *
4
- * Full strategy implementations that extend client-safe base classes.
5
- * INCLUDES Node.js imports (fs, path, process) - can only be imported server-side.
6
- *
7
- * These classes inherit all client-safe methods and add client-unsafe functionality.
2
+ * Full strategies: the client-safe base classes plus the methods that need
3
+ * Node.js (fs, path, process). Server-side imports only.
8
4
  */
9
5
  import type { OperatingMode, ClientUnsafeStrategy } from './types.js';
10
6
  /**
11
- * Get the full strategy (client-unsafe) for an operating mode.
12
- *
13
- * Strategies are memoized - one instance per mode for the entire process lifetime.
14
- * Safe to call inline: operatingStrategy(mode).getBaseRoot()
15
- *
16
- * Includes all client-safe methods (inherited) plus client-unsafe methods (Node.js APIs).
17
- *
18
- * @param mode - The operating mode
19
- * @returns Full strategy instance with client-unsafe methods
7
+ * Memoized: one instance per mode for the process lifetime, so this is safe to
8
+ * call inline — `operatingStrategy(mode).getWorkspaceRoot()`.
20
9
  */
21
10
  export declare function operatingStrategy(mode: OperatingMode): ClientUnsafeStrategy;
22
11
  /**
23
- * Clear the strategy cache (mainly for testing)
12
+ * Mainly for testing.
13
+ * @internal Exported for tests.
24
14
  */
25
15
  export declare function clearStrategyCache(): void;
@@ -1,30 +1,18 @@
1
1
  /**
2
- * Client-Unsafe Operating Mode Strategies
3
- *
4
- * Full strategy implementations that extend client-safe base classes.
5
- * INCLUDES Node.js imports (fs, path, process) - can only be imported server-side.
6
- *
7
- * These classes inherit all client-safe methods and add client-unsafe functionality.
2
+ * Full strategies: the client-safe base classes plus the methods that need
3
+ * Node.js (fs, path, process). Server-side imports only.
8
4
  */
9
5
  import path from 'node:path';
10
6
  import { ProdClientSafeStrategy, DevClientSafeStrategy } from './client-safe-strategy.js';
11
7
  import { resolveDeploymentName } from './deployment-name.js';
12
8
  import { DEFAULT_PROD_WORKSPACE } from '../config/index.js';
13
- // ============================================================================
14
- // Production Mode - Full Strategy
15
- // ============================================================================
16
9
  class ProdStrategy extends ProdClientSafeStrategy {
17
- // All client-safe methods inherited automatically from ProdClientSafeStrategy:
18
- // - mode, supportsBranching(), supportsStatusBadge(), supportsComments()
19
- // - supportsPullRequests(), getPermissionsFileName(), getGroupsFileName()
20
- // - shouldCommit(), shouldPush()
21
- // Add client-unsafe methods (use Node.js APIs)
22
10
  getWorkspaceRoot(_sourceRoot) {
23
11
  return path.resolve(process.env.CANOPYCMS_WORKSPACE_ROOT ?? DEFAULT_PROD_WORKSPACE);
24
12
  }
25
13
  getContentRoot(contentRoot, sourceRoot) {
26
- // In prod, content is at workspace root (not project root)
27
- // This is called with sourceRoot = workspace path
14
+ // In prod the caller passes sourceRoot = the workspace path, because
15
+ // content sits at the workspace root rather than a project root.
28
16
  return path.resolve(sourceRoot ?? process.cwd(), contentRoot);
29
17
  }
30
18
  getContentBranchesRoot(sourceRoot) {
@@ -73,11 +61,7 @@ class ProdStrategy extends ProdClientSafeStrategy {
73
61
  return config.autoCreateSettingsPR ?? true;
74
62
  }
75
63
  }
76
- // ============================================================================
77
- // Dev Mode - Full Strategy
78
- // ============================================================================
79
64
  class DevStrategy extends DevClientSafeStrategy {
80
- // Inherits client-safe methods from DevClientSafeStrategy
81
65
  getWorkspaceRoot(sourceRoot) {
82
66
  return path.resolve(sourceRoot ?? process.cwd(), '.canopy-dev');
83
67
  }
@@ -127,20 +111,10 @@ class DevStrategy extends DevClientSafeStrategy {
127
111
  return false; // No real GitHub in local dev mode
128
112
  }
129
113
  }
130
- // ============================================================================
131
- // Factory with Memoization
132
- // ============================================================================
133
114
  const strategyCache = new Map();
134
115
  /**
135
- * Get the full strategy (client-unsafe) for an operating mode.
136
- *
137
- * Strategies are memoized - one instance per mode for the entire process lifetime.
138
- * Safe to call inline: operatingStrategy(mode).getBaseRoot()
139
- *
140
- * Includes all client-safe methods (inherited) plus client-unsafe methods (Node.js APIs).
141
- *
142
- * @param mode - The operating mode
143
- * @returns Full strategy instance with client-unsafe methods
116
+ * Memoized: one instance per mode for the process lifetime, so this is safe to
117
+ * call inline — `operatingStrategy(mode).getWorkspaceRoot()`.
144
118
  */
145
119
  export function operatingStrategy(mode) {
146
120
  const cached = strategyCache.get(mode);
@@ -155,7 +129,7 @@ export function operatingStrategy(mode) {
155
129
  strategy = new DevStrategy();
156
130
  break;
157
131
  default: {
158
- // Exhaustiveness check - TypeScript will error if a mode is not handled
132
+ // Exhaustiveness check: adding a mode without a case fails to compile.
159
133
  const _exhaustive = mode;
160
134
  throw new Error(`Unknown operating mode: ${_exhaustive}`);
161
135
  }
@@ -164,7 +138,8 @@ export function operatingStrategy(mode) {
164
138
  return strategy;
165
139
  }
166
140
  /**
167
- * Clear the strategy cache (mainly for testing)
141
+ * Mainly for testing.
142
+ * @internal Exported for tests.
168
143
  */
169
144
  export function clearStrategyCache() {
170
145
  strategyCache.clear();
@@ -1,12 +1,5 @@
1
1
  /**
2
- * Client-Safe Operating Mode Strategy - Client Bundle Entry Point
3
- *
4
- * This module ONLY exports client-safe functionality with NO Node.js imports.
5
- * Safe to import in 'use client' React components.
6
- *
7
- * Usage in client components:
8
- * import { clientOperatingStrategy } from '@/operating-mode/client'
2
+ * Client-bundle entry point: exports ONLY client-safe functionality, with no
3
+ * Node.js imports, so it is safe in 'use client' React components.
9
4
  */
10
- export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy.js';
11
- export type { ClientSafeStrategy } from './types.js';
12
- export type { OperatingMode } from './types.js';
5
+ export { clientOperatingStrategy } from './client-safe-strategy.js';
@@ -1,10 +1,5 @@
1
1
  /**
2
- * Client-Safe Operating Mode Strategy - Client Bundle Entry Point
3
- *
4
- * This module ONLY exports client-safe functionality with NO Node.js imports.
5
- * Safe to import in 'use client' React components.
6
- *
7
- * Usage in client components:
8
- * import { clientOperatingStrategy } from '@/operating-mode/client'
2
+ * Client-bundle entry point: exports ONLY client-safe functionality, with no
3
+ * Node.js imports, so it is safe in 'use client' React components.
9
4
  */
10
- export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy.js';
5
+ export { clientOperatingStrategy } from './client-safe-strategy.js';
@@ -1,30 +1,26 @@
1
1
  /**
2
2
  * Shared deployment-name test fixture.
3
3
  *
4
- * The rule that decides whether a `deploymentName` is usable exists TWICE, by
5
- * necessity: once at runtime (`deployment-name.ts`'s `isValidDeploymentName`)
6
- * and once at synth time (`canopycms-cdk`'s `constructs/cms-service.ts`).
7
- * The construct deliberately does not import the real thing — see
8
- * `isValidDeploymentName`'s doc comment in cms-service.ts for why (not, as
9
- * this comment used to say, that the published construct lacks a runtime
10
- * dependency on `canopycms` — it doesn't).
4
+ * The rule deciding whether a `deploymentName` is usable exists TWICE by
5
+ * necessity: at runtime (`deployment-name.ts`'s `isValidDeploymentName`) and at
6
+ * synth time (`canopycms-cdk`'s `constructs/cms-service.ts`, which deliberately
7
+ * does not import the real thing — see its own doc comment for why).
11
8
  *
12
9
  * The dangerous drift is asymmetric: a rule TIGHTENED at runtime but not at
13
- * synth produces a stack that synths clean and then crash-loops the Lambda at
14
- * boot — precisely what the synth guard exists to prevent. So both packages'
15
- * suites assert against this one list, and `canopycms-cdk`'s suite additionally
16
- * asserts that the construct's verdict matches this package's predicate for
17
- * every name here. Add a case here when you change either copy of the rule.
10
+ * synth synths clean and then crash-loops the Lambda at boot, precisely what the
11
+ * synth guard exists to prevent. So both packages' suites assert against this
12
+ * one list, and `canopycms-cdk`'s also asserts that the construct's verdict
13
+ * matches this package's predicate for every name here. Add a case when you
14
+ * change either copy of the rule.
18
15
  *
19
- * Deliberately dependency-free (plain arrays, no vitest import) so the CDK
20
- * suite can import it across the package boundary without dragging anything
21
- * along.
16
+ * Dependency-free (plain arrays, no vitest import) so the CDK suite can import
17
+ * it across the package boundary.
22
18
  */
23
19
  /** Names both copies of the rule must ACCEPT. */
24
20
  export declare const VALID_DEPLOYMENT_NAMES: readonly ["prod", "staging", "acme-prod_2.1", "a", "9lives", "team.prod", "PROD", "x.locked"];
25
21
  /**
26
- * Names both copies of the rule must REJECT, each with the reason it exists —
27
- * every entry is a value git itself would refuse as a ref component, or one
28
- * that would corrupt the worker's `.env` heredoc.
22
+ * Names both copies of the rule must REJECT: each is either a value git itself
23
+ * refuses as a ref component, or one that would corrupt the worker's `.env`
24
+ * heredoc.
29
25
  */
30
26
  export declare const INVALID_DEPLOYMENT_NAMES: readonly [readonly ["a slash (would add a ref hierarchy level)", "team/prod"], readonly ["whitespace", "my prod"], readonly ["a leading dash (parses as a git option)", "-prod"], readonly ["a git-forbidden character", "prod:1"], readonly ["dot-dot", "a..b"], readonly ["a leading dot", ".prod"], readonly ["a trailing dot", "prod."], readonly ["a .lock suffix", "prod.lock"], readonly ["a tilde", "prod~1"], readonly ["a caret", "prod^1"], readonly ["a question mark", "prod?"], readonly ["an asterisk", "prod*"], readonly ["an open bracket", "prod["], readonly ["a backslash", "prod\\1"], readonly ["the empty string", ""], readonly ["a newline (would inject a line into the worker .env)", "prod\nEVIL=1"]];
@@ -1,24 +1,20 @@
1
1
  /**
2
2
  * Shared deployment-name test fixture.
3
3
  *
4
- * The rule that decides whether a `deploymentName` is usable exists TWICE, by
5
- * necessity: once at runtime (`deployment-name.ts`'s `isValidDeploymentName`)
6
- * and once at synth time (`canopycms-cdk`'s `constructs/cms-service.ts`).
7
- * The construct deliberately does not import the real thing — see
8
- * `isValidDeploymentName`'s doc comment in cms-service.ts for why (not, as
9
- * this comment used to say, that the published construct lacks a runtime
10
- * dependency on `canopycms` — it doesn't).
4
+ * The rule deciding whether a `deploymentName` is usable exists TWICE by
5
+ * necessity: at runtime (`deployment-name.ts`'s `isValidDeploymentName`) and at
6
+ * synth time (`canopycms-cdk`'s `constructs/cms-service.ts`, which deliberately
7
+ * does not import the real thing — see its own doc comment for why).
11
8
  *
12
9
  * The dangerous drift is asymmetric: a rule TIGHTENED at runtime but not at
13
- * synth produces a stack that synths clean and then crash-loops the Lambda at
14
- * boot — precisely what the synth guard exists to prevent. So both packages'
15
- * suites assert against this one list, and `canopycms-cdk`'s suite additionally
16
- * asserts that the construct's verdict matches this package's predicate for
17
- * every name here. Add a case here when you change either copy of the rule.
10
+ * synth synths clean and then crash-loops the Lambda at boot, precisely what the
11
+ * synth guard exists to prevent. So both packages' suites assert against this
12
+ * one list, and `canopycms-cdk`'s also asserts that the construct's verdict
13
+ * matches this package's predicate for every name here. Add a case when you
14
+ * change either copy of the rule.
18
15
  *
19
- * Deliberately dependency-free (plain arrays, no vitest import) so the CDK
20
- * suite can import it across the package boundary without dragging anything
21
- * along.
16
+ * Dependency-free (plain arrays, no vitest import) so the CDK suite can import
17
+ * it across the package boundary.
22
18
  */
23
19
  /** Names both copies of the rule must ACCEPT. */
24
20
  export const VALID_DEPLOYMENT_NAMES = [
@@ -32,9 +28,9 @@ export const VALID_DEPLOYMENT_NAMES = [
32
28
  'x.locked',
33
29
  ];
34
30
  /**
35
- * Names both copies of the rule must REJECT, each with the reason it exists —
36
- * every entry is a value git itself would refuse as a ref component, or one
37
- * that would corrupt the worker's `.env` heredoc.
31
+ * Names both copies of the rule must REJECT: each is either a value git itself
32
+ * refuses as a ref component, or one that would corrupt the worker's `.env`
33
+ * heredoc.
38
34
  */
39
35
  export const INVALID_DEPLOYMENT_NAMES = [
40
36
  ['a slash (would add a ref hierarchy level)', 'team/prod'],
@@ -1,37 +1,27 @@
1
1
  /**
2
- * Single resolution point for `deploymentName`.
2
+ * Single resolution point for `deploymentName`, which namespaces the settings
3
+ * branch (`canopycms-settings-{deploymentName}`) so two CanopyCMS deployments
4
+ * can share one GitHub repo without fighting over the same orphan branch.
3
5
  *
4
- * `deploymentName` namespaces the settings branch
5
- * (`canopycms-settings-{deploymentName}`) so two CanopyCMS deployments can
6
- * share one GitHub repo without both resolving to `canopycms-settings-prod`
7
- * and fighting over the same orphan branch.
6
+ * Precedence: `process.env.CANOPYCMS_DEPLOYMENT_NAME` (trimmed, empty ignored),
7
+ * then `config.deploymentName`, then `modeDefault` (the caller's mode-specific
8
+ * fallback, e.g. 'prod'/'local').
8
9
  *
9
- * Precedence (highest wins):
10
- * 1. `process.env.CANOPYCMS_DEPLOYMENT_NAME` (trimmed; empty string ignored)
11
- * 2. `config.deploymentName`
12
- * 3. `modeDefault` (the caller's mode-specific fallback, e.g. 'prod'/'local')
13
- *
14
- * Env wins over config DELIBERATELY. The env var is stamped per-stack by
15
- * infrastructure (CDK's `CanopyCmsServiceProps.deploymentName` ->
16
- * `CANOPYCMS_DEPLOYMENT_NAME`), so it is the value GUARANTEED TO DIFFER
17
- * between two deployments sharing a repo. `config.deploymentName` lives in
18
- * the shared repo's `canopycms.config.ts`, so it is the value GUARANTEED TO
19
- * BE IDENTICAL across both deployments (both Lambdas run the same checked-out
20
- * config). If config won instead, an adopter who already wrote
21
- * `deploymentName` into their shared config would find the CDK
22
- * `deploymentName` prop silently doing nothing — exactly the two-stacks-one-repo
23
- * case this feature exists to fix.
10
+ * Env wins over config DELIBERATELY. Infrastructure stamps the env var
11
+ * per-stack (CDK's `CanopyCmsServiceProps.deploymentName`), so it is the value
12
+ * GUARANTEED TO DIFFER between two deployments sharing a repo, while
13
+ * `config.deploymentName` lives in the shared repo's `canopycms.config.ts` and
14
+ * is GUARANTEED TO BE IDENTICAL across both. If config won, an adopter who had
15
+ * already written `deploymentName` into their shared config would find the CDK
16
+ * prop silently doing nothing — the two-stacks-one-repo case this exists to fix.
24
17
  */
25
18
  /**
26
- * Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy
27
- * of this rule (constructs/cms-service.ts) still agrees with this one. The
28
- * construct deliberately does not import this directly — see
29
- * `isValidDeploymentName`'s doc comment in cms-service.ts for the real reason
30
- * (not, as this comment used to say, that the published construct lacks a
31
- * runtime dependency on `canopycms` — it doesn't: `canopycms` is a
32
- * non-optional peerDependency there, and the package's own main entry already
33
- * imports it at runtime). The drift check is therefore test-only — see
34
- * `deployment-name-fixtures.ts`.
19
+ * Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy of
20
+ * this rule (constructs/cms-service.ts) still agrees with this one. The
21
+ * construct deliberately does not import this directly — see its own
22
+ * `isValidDeploymentName` doc comment. The drift check is therefore test-only,
23
+ * over `deployment-name-fixtures.ts`.
24
+ * @internal Exported for tests.
35
25
  */
36
26
  export declare const isValidDeploymentName: (name: string) => boolean;
37
27
  export declare function resolveDeploymentName(config: {