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,54 +1,41 @@
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
  import { canopyLogWarn } from '../utils/logger.js';
26
19
  let warned = false;
27
20
  /**
28
21
  * Conservative charset for a deployment name. The resolved value is
29
22
  * interpolated straight into a git ref (`canopycms-settings-{name}`), and the
30
- * env var route bypasses the config schema entirely — nothing else validates
31
- * an infra-stamped value before it becomes a branch name. Rejecting anything
32
- * outside this set keeps the result a single, well-formed ref component:
33
- * no `/` (would add a ref hierarchy level and break sanitizeBranchName
34
- * round-trips), no whitespace, no `..`/`~`/`^`/`:` (git-forbidden), no
35
- * leading `-` (would parse as a git option).
36
- *
37
- * The charset alone is not sufficient: `..`, a trailing `.`, and a `.lock`
38
- * suffix are all built from allowed characters but are still rejected by
39
- * git's own ref rules (git-check-ref-format), so they are excluded separately.
23
+ * env var route bypasses the config schema entirely — nothing else validates an
24
+ * infra-stamped value before it becomes a branch name. So the result must stay
25
+ * a single well-formed ref component: no `/` (would add a ref hierarchy level
26
+ * and break sanitizeBranchName round-trips), no whitespace, no `..`/`~`/`^`/`:`
27
+ * (git-forbidden), no leading `-` (would parse as a git option). `..`, a
28
+ * trailing `.` and a `.lock` suffix are built from allowed characters but are
29
+ * still rejected by git-check-ref-format, so they are excluded separately below.
40
30
  */
41
31
  const VALID_DEPLOYMENT_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
42
32
  /**
43
- * Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy
44
- * of this rule (constructs/cms-service.ts) still agrees with this one. The
45
- * construct deliberately does not import this directly — see
46
- * `isValidDeploymentName`'s doc comment in cms-service.ts for the real reason
47
- * (not, as this comment used to say, that the published construct lacks a
48
- * runtime dependency on `canopycms` — it doesn't: `canopycms` is a
49
- * non-optional peerDependency there, and the package's own main entry already
50
- * imports it at runtime). The drift check is therefore test-only — see
51
- * `deployment-name-fixtures.ts`.
33
+ * Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy of
34
+ * this rule (constructs/cms-service.ts) still agrees with this one. The
35
+ * construct deliberately does not import this directly — see its own
36
+ * `isValidDeploymentName` doc comment. The drift check is therefore test-only,
37
+ * over `deployment-name-fixtures.ts`.
38
+ * @internal Exported for tests.
52
39
  */
53
40
  export const isValidDeploymentName = (name) => VALID_DEPLOYMENT_NAME.test(name) &&
54
41
  !name.includes('..') &&
@@ -58,14 +45,9 @@ export function resolveDeploymentName(config, modeDefault) {
58
45
  const envValue = process.env.CANOPYCMS_DEPLOYMENT_NAME?.trim();
59
46
  const configValue = config.deploymentName;
60
47
  if (envValue && configValue && envValue !== configValue && !warned) {
61
- // canopyLogWarn, not console.warn: cms-worker.ts imports this module and
62
- // resolves through it inside start(), so this line lands in worker.log,
63
- // where an unprefixed line is folded into the previous CloudWatch event.
64
- // The mismatch this reports is exactly what an operator would be grepping
65
- // for. Plain console under Lambda/dev, as everywhere else. See
66
- // utils/logger.ts. (Missed by the worker-log sweep, which went by directory
67
- // name and by the modules the finding named, rather than by the worker's
68
- // real import graph.)
48
+ // canopyLogWarn, not console.warn: cms-worker.ts resolves through this
49
+ // inside start(), so the line lands in worker.log, where an unprefixed line
50
+ // is folded into the previous CloudWatch event (utils/logger.ts).
69
51
  canopyLogWarn(`CanopyCMS: CANOPYCMS_DEPLOYMENT_NAME ("${envValue}") differs from config.deploymentName ` +
70
52
  `("${configValue}") — using the env var (infra-stamped env wins over shared-repo config ` +
71
53
  `by design; see resolveDeploymentName's doc comment). Update config.deploymentName to ` +
@@ -1,32 +1,11 @@
1
1
  /**
2
- * Operating Mode Strategy Pattern - Public API
3
- *
4
- * Two-layer architecture:
5
- * 1. Client-safe strategies - safe for 'use client' React components (no Node.js imports)
6
- * 2. Client-unsafe strategies - full server-side functionality (uses fs, path, process)
7
- *
8
- * Usage:
9
- *
10
- * Client components:
11
- * import { clientOperatingStrategy } from '@/operating-mode'
12
- * const strategy = clientOperatingStrategy(mode)
13
- * if (strategy.supportsBranching()) { ... }
14
- *
15
- * Server code:
16
- * import { operatingStrategy } from '@/operating-mode'
17
- * const strategy = operatingStrategy(mode)
18
- * // contentRoot is REQUIRED: pass config.contentRoot (falling back to 'content'
19
- * // at the call site), never a bare call — see getContentRoot's doc comment in
20
- * // types.ts for why a default here would silently disarm a caller.
21
- * const contentRoot = strategy.getContentRoot(config.contentRoot ?? 'content')
22
- * const branchesRoot = strategy.getContentBranchesRoot()
23
- * const branchRoot = strategy.getContentBranchRoot('my-branch')
24
- * const settingsRoot = strategy.getSettingsRoot()
25
- * if (strategy.supportsBranching()) { ... } // can also use client-safe methods
2
+ * Operating mode strategies, in two layers: client-safe ones carry no Node.js
3
+ * imports and are usable from 'use client' components; client-unsafe ones add
4
+ * the server-side surface (fs, path, process) and must stay off the client.
26
5
  */
27
6
  export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy.js';
28
7
  export { operatingStrategy, clearStrategyCache } from './client-unsafe-strategy.js';
29
8
  export { resolveDeploymentName, isValidDeploymentName } from './deployment-name.js';
30
- export { resolveOperatingMode, SERVER_MODE_ENV_VAR, BROWSER_MODE_ENV_VAR } from './mode-env.js';
9
+ export { resolveOperatingMode } from './mode-env.js';
31
10
  export type OperatingMode = 'prod' | 'dev';
32
11
  export type { ClientSafeStrategy, ClientUnsafeStrategy, ResolveRemoteUrlOptions } from './types.js';
@@ -1,36 +1,14 @@
1
1
  /**
2
- * Operating Mode Strategy Pattern - Public API
3
- *
4
- * Two-layer architecture:
5
- * 1. Client-safe strategies - safe for 'use client' React components (no Node.js imports)
6
- * 2. Client-unsafe strategies - full server-side functionality (uses fs, path, process)
7
- *
8
- * Usage:
9
- *
10
- * Client components:
11
- * import { clientOperatingStrategy } from '@/operating-mode'
12
- * const strategy = clientOperatingStrategy(mode)
13
- * if (strategy.supportsBranching()) { ... }
14
- *
15
- * Server code:
16
- * import { operatingStrategy } from '@/operating-mode'
17
- * const strategy = operatingStrategy(mode)
18
- * // contentRoot is REQUIRED: pass config.contentRoot (falling back to 'content'
19
- * // at the call site), never a bare call — see getContentRoot's doc comment in
20
- * // types.ts for why a default here would silently disarm a caller.
21
- * const contentRoot = strategy.getContentRoot(config.contentRoot ?? 'content')
22
- * const branchesRoot = strategy.getContentBranchesRoot()
23
- * const branchRoot = strategy.getContentBranchRoot('my-branch')
24
- * const settingsRoot = strategy.getSettingsRoot()
25
- * if (strategy.supportsBranching()) { ... } // can also use client-safe methods
2
+ * Operating mode strategies, in two layers: client-safe ones carry no Node.js
3
+ * imports and are usable from 'use client' components; client-unsafe ones add
4
+ * the server-side surface (fs, path, process) and must stay off the client.
26
5
  */
27
- // Client-safe factory and strategy (safe for client bundles)
28
6
  export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy.js';
29
- // Client-unsafe factory and strategy (server-side only)
7
+ // Server-side only.
30
8
  export { operatingStrategy, clearStrategyCache } from './client-unsafe-strategy.js';
31
- // Single resolution point for deploymentName (env > config > mode default) —
32
- // server-only (reads process.env), used by the strategies' getSettingsBranchName.
9
+ // Single resolution point for deploymentName — server-only (reads process.env),
10
+ // used by the strategies' getSettingsBranchName.
33
11
  export { resolveDeploymentName, isValidDeploymentName } from './deployment-name.js';
34
- // Single resolution point for `mode` (env > config.mode) — isomorphic, applied
35
- // inside validateCanopyConfig so every config-authoring path gets it.
36
- export { resolveOperatingMode, SERVER_MODE_ENV_VAR, BROWSER_MODE_ENV_VAR } from './mode-env.js';
12
+ // Single resolution point for `mode` — isomorphic, applied inside
13
+ // validateCanopyConfig so every config-authoring path gets it.
14
+ export { resolveOperatingMode } from './mode-env.js';
@@ -1,62 +1,40 @@
1
1
  /**
2
- * Single resolution point for the operating `mode`.
3
- *
4
- * `mode` is required in `canopycms.config.ts` (SEC-C1) and that file lives in
5
- * the adopter's repo — the SAME file is loaded by `next dev` locally, by
6
- * `next build` inside the image builder, and by the deployed Lambda. Those
7
- * three want different answers, so a literal in the config file cannot be
8
- * right for all of them:
9
- *
10
- * - `next dev` must be `dev` (workspace at `<cwd>/.canopy-dev`).
11
- * - `next build` should stay `dev` too. Build-time reads come from the
12
- * working tree in either mode (`readsFromCheckout` in `build-mode.ts`), so
13
- * nothing in a build needs prod, while prod mode would hold the image
14
- * builder to checks it has no reason to meet: `gitBotAuthorName`/
15
- * `gitBotAuthorEmail` (the prod strategy's `validateConfig`, run by
16
- * `createCanopyServices`) and an auth plugin that verifies credentials
17
- * (`assertAuthPluginAllowedForMode`). See the note in
18
- * `cli/template-files/Dockerfile.cms.template`.
19
- * - The deployed Lambda must be `prod`: dev mode resolves the workspace to
20
- * `<cwd>/.canopy-dev`, and Lambda's filesystem is read-only outside /tmp,
21
- * so the first write fails with EROFS.
22
- *
23
- * Only a value resolved at RUN time can satisfy all three, which is why this
24
- * is an environment override rather than a flag baked into the generated
25
- * config file. `CANOPY_MODE` is the name the deployment templates already
26
- * referred to; before this module existed nothing read it.
27
- *
28
- * Precedence (highest wins):
29
- * 1. the environment value for the current runtime (see `readModeEnv`)
30
- * 2. `config.mode` (the literal in `canopycms.config.ts`)
31
- *
32
- * ## Two variable names, on purpose
33
- *
34
- * Server code reads `CANOPY_MODE`, which the CDK construct stamps onto the
35
- * Lambda (`CanopyCmsService` sets `CANOPY_MODE=prod`). It is deliberately NOT
36
- * set during `next build` (see above).
37
- *
38
- * Browser code cannot read a runtime environment at all — the editor page
39
- * imports `canopycms.config.ts` directly (`config.client()`), so the browser's
40
- * copy of `mode` is whatever was inlined when the bundle was built. Next.js
41
- * only inlines `NEXT_PUBLIC_*`, so the browser reads
42
- * `NEXT_PUBLIC_CANOPY_MODE`, which the generated CDK stack passes as a Docker
43
- * build arg. Both names must be spelled as literal `process.env.X` member
44
- * expressions here or the bundler cannot substitute them.
45
- *
46
- * An unrecognized value throws rather than falling back. Falling back would
2
+ * Single resolution point for the operating `mode`: the environment value for
3
+ * the current runtime wins (see `readModeEnv`), else `config.mode`.
4
+ *
5
+ * One `canopycms.config.ts` (where `mode` is required, SEC-C1) is loaded by
6
+ * `next dev`, by `next build` in the image builder and by the deployed Lambda,
7
+ * and those three need different answers, so only a RUN-time value works:
8
+ * - `next dev` and `next build` are both `dev`. Build-time reads come from
9
+ * the working tree in either mode (`readsFromCheckout` in build-mode.ts),
10
+ * while prod would hold the image builder to checks it has no reason to
11
+ * meet: `gitBotAuthorName`/`gitBotAuthorEmail` (the prod strategy's
12
+ * `validateConfig`) and a credential-verifying auth plugin
13
+ * (`assertAuthPluginAllowedForMode`). See Dockerfile.cms.template.
14
+ * - The Lambda is `prod`: dev resolves the workspace to `<cwd>/.canopy-dev`,
15
+ * and Lambda's filesystem is read-only outside /tmp, so the first write
16
+ * fails with EROFS.
17
+ *
18
+ * Two variable names, on purpose. Server code reads `CANOPY_MODE`, stamped on
19
+ * the Lambda by `CanopyCmsService` and deliberately NOT set during
20
+ * `next build`. Browser code has no runtime environment — the editor page
21
+ * imports the config directly (`config.client()`), so its `mode` is whatever
22
+ * was inlined at build time, and Next inlines only `NEXT_PUBLIC_*`. Both names
23
+ * MUST appear as literal `process.env.X` member expressions here or the
24
+ * bundler cannot substitute them.
25
+ *
26
+ * An unrecognized value throws rather than falling back: falling back would
47
27
  * turn a typo (`CANOPY_MODE=production`) into a silent dev-mode deployment
48
- * running header-trusting dev auth semantics — the exact failure SEC-C1 made
49
- * `mode` required to prevent.
28
+ * running header-trusting dev auth semantics.
50
29
  */
51
30
  import type { OperatingMode } from './types.js';
52
- export declare const SERVER_MODE_ENV_VAR = "CANOPY_MODE";
53
- export declare const BROWSER_MODE_ENV_VAR = "NEXT_PUBLIC_CANOPY_MODE";
54
- /** Reset the once-per-process warning latch. Test-only. */
31
+ /**
32
+ * Reset the once-per-process warning latch. Test-only.
33
+ * @internal Exported for tests.
34
+ */
55
35
  export declare function resetModeWarning(): void;
56
36
  /**
57
- * Resolve the effective operating mode from the environment and the config
58
- * literal. Called from `validateCanopyConfig`, the one point every documented
59
- * config-authoring path (`defineCanopyConfig`, `composeCanopyConfig`) funnels
60
- * through.
37
+ * Called from `validateCanopyConfig`, the one point every config-authoring path
38
+ * (`defineCanopyConfig`, `composeCanopyConfig`) funnels through.
61
39
  */
62
40
  export declare function resolveOperatingMode(configMode: OperatingMode): OperatingMode;
@@ -1,67 +1,47 @@
1
1
  /**
2
- * Single resolution point for the operating `mode`.
2
+ * Single resolution point for the operating `mode`: the environment value for
3
+ * the current runtime wins (see `readModeEnv`), else `config.mode`.
3
4
  *
4
- * `mode` is required in `canopycms.config.ts` (SEC-C1) and that file lives in
5
- * the adopter's repo — the SAME file is loaded by `next dev` locally, by
6
- * `next build` inside the image builder, and by the deployed Lambda. Those
7
- * three want different answers, so a literal in the config file cannot be
8
- * right for all of them:
5
+ * One `canopycms.config.ts` (where `mode` is required, SEC-C1) is loaded by
6
+ * `next dev`, by `next build` in the image builder and by the deployed Lambda,
7
+ * and those three need different answers, so only a RUN-time value works:
8
+ * - `next dev` and `next build` are both `dev`. Build-time reads come from
9
+ * the working tree in either mode (`readsFromCheckout` in build-mode.ts),
10
+ * while prod would hold the image builder to checks it has no reason to
11
+ * meet: `gitBotAuthorName`/`gitBotAuthorEmail` (the prod strategy's
12
+ * `validateConfig`) and a credential-verifying auth plugin
13
+ * (`assertAuthPluginAllowedForMode`). See Dockerfile.cms.template.
14
+ * - The Lambda is `prod`: dev resolves the workspace to `<cwd>/.canopy-dev`,
15
+ * and Lambda's filesystem is read-only outside /tmp, so the first write
16
+ * fails with EROFS.
9
17
  *
10
- * - `next dev` must be `dev` (workspace at `<cwd>/.canopy-dev`).
11
- * - `next build` should stay `dev` too. Build-time reads come from the
12
- * working tree in either mode (`readsFromCheckout` in `build-mode.ts`), so
13
- * nothing in a build needs prod, while prod mode would hold the image
14
- * builder to checks it has no reason to meet: `gitBotAuthorName`/
15
- * `gitBotAuthorEmail` (the prod strategy's `validateConfig`, run by
16
- * `createCanopyServices`) and an auth plugin that verifies credentials
17
- * (`assertAuthPluginAllowedForMode`). See the note in
18
- * `cli/template-files/Dockerfile.cms.template`.
19
- * - The deployed Lambda must be `prod`: dev mode resolves the workspace to
20
- * `<cwd>/.canopy-dev`, and Lambda's filesystem is read-only outside /tmp,
21
- * so the first write fails with EROFS.
18
+ * Two variable names, on purpose. Server code reads `CANOPY_MODE`, stamped on
19
+ * the Lambda by `CanopyCmsService` and deliberately NOT set during
20
+ * `next build`. Browser code has no runtime environment — the editor page
21
+ * imports the config directly (`config.client()`), so its `mode` is whatever
22
+ * was inlined at build time, and Next inlines only `NEXT_PUBLIC_*`. Both names
23
+ * MUST appear as literal `process.env.X` member expressions here or the
24
+ * bundler cannot substitute them.
22
25
  *
23
- * Only a value resolved at RUN time can satisfy all three, which is why this
24
- * is an environment override rather than a flag baked into the generated
25
- * config file. `CANOPY_MODE` is the name the deployment templates already
26
- * referred to; before this module existed nothing read it.
27
- *
28
- * Precedence (highest wins):
29
- * 1. the environment value for the current runtime (see `readModeEnv`)
30
- * 2. `config.mode` (the literal in `canopycms.config.ts`)
31
- *
32
- * ## Two variable names, on purpose
33
- *
34
- * Server code reads `CANOPY_MODE`, which the CDK construct stamps onto the
35
- * Lambda (`CanopyCmsService` sets `CANOPY_MODE=prod`). It is deliberately NOT
36
- * set during `next build` (see above).
37
- *
38
- * Browser code cannot read a runtime environment at all — the editor page
39
- * imports `canopycms.config.ts` directly (`config.client()`), so the browser's
40
- * copy of `mode` is whatever was inlined when the bundle was built. Next.js
41
- * only inlines `NEXT_PUBLIC_*`, so the browser reads
42
- * `NEXT_PUBLIC_CANOPY_MODE`, which the generated CDK stack passes as a Docker
43
- * build arg. Both names must be spelled as literal `process.env.X` member
44
- * expressions here or the bundler cannot substitute them.
45
- *
46
- * An unrecognized value throws rather than falling back. Falling back would
26
+ * An unrecognized value throws rather than falling back: falling back would
47
27
  * turn a typo (`CANOPY_MODE=production`) into a silent dev-mode deployment
48
- * running header-trusting dev auth semantics — the exact failure SEC-C1 made
49
- * `mode` required to prevent.
28
+ * running header-trusting dev auth semantics.
50
29
  */
51
30
  import { canopyLogWarn } from '../utils/logger.js';
52
- export const SERVER_MODE_ENV_VAR = 'CANOPY_MODE';
53
- export const BROWSER_MODE_ENV_VAR = 'NEXT_PUBLIC_CANOPY_MODE';
31
+ const SERVER_MODE_ENV_VAR = 'CANOPY_MODE';
32
+ const BROWSER_MODE_ENV_VAR = 'NEXT_PUBLIC_CANOPY_MODE';
54
33
  let warned = false;
55
- /** Reset the once-per-process warning latch. Test-only. */
34
+ /**
35
+ * Reset the once-per-process warning latch. Test-only.
36
+ * @internal Exported for tests.
37
+ */
56
38
  export function resetModeWarning() {
57
39
  warned = false;
58
40
  }
59
41
  /**
60
- * The environment value for the current runtime, or undefined when unset.
61
- *
62
42
  * Guarded with `typeof process` because a non-Next bundler may leave no
63
- * `process` shim in the browser at all; the member expressions themselves stay
64
- * literal so Next's DefinePlugin substitution still applies.
43
+ * `process` shim in the browser; the member expressions stay literal so Next's
44
+ * DefinePlugin substitution still applies.
65
45
  */
66
46
  function readModeEnv() {
67
47
  if (typeof process === 'undefined' || typeof process.env === 'undefined')
@@ -73,10 +53,8 @@ function readModeEnv() {
73
53
  return value ? { name, value } : undefined;
74
54
  }
75
55
  /**
76
- * Resolve the effective operating mode from the environment and the config
77
- * literal. Called from `validateCanopyConfig`, the one point every documented
78
- * config-authoring path (`defineCanopyConfig`, `composeCanopyConfig`) funnels
79
- * through.
56
+ * Called from `validateCanopyConfig`, the one point every config-authoring path
57
+ * (`defineCanopyConfig`, `composeCanopyConfig`) funnels through.
80
58
  */
81
59
  export function resolveOperatingMode(configMode) {
82
60
  const env = readModeEnv();
@@ -88,9 +66,9 @@ export function resolveOperatingMode(configMode) {
88
66
  `(${JSON.stringify(configMode)}): a typo here would silently deploy dev auth semantics.`);
89
67
  }
90
68
  if (env.value !== configMode && !warned) {
91
- // canopyLogWarn, not console.warn: shared modules can run inside the
92
- // worker daemon, where an unprefixed line is folded into the previous
93
- // CloudWatch event (see utils/logger.ts).
69
+ // canopyLogWarn, not console.warn: shared modules can run inside the worker
70
+ // daemon, where an unprefixed line is folded into the previous CloudWatch
71
+ // event (utils/logger.ts).
94
72
  canopyLogWarn(`CanopyCMS: ${env.name}="${env.value}" overrides config.mode="${configMode}". ` +
95
73
  `The environment wins by design — it is the per-deployment value, while ` +
96
74
  `canopycms.config.ts is shared by local dev, the image build and the deployment. ` +
@@ -1,16 +1,8 @@
1
- /**
2
- * Operating Mode Strategy Types
3
- *
4
- * This module defines the two-layer strategy pattern for operating modes:
5
- * - ClientSafeStrategy: Methods safe for client-side bundles (no Node.js APIs)
6
- * - ClientUnsafeStrategy: Full strategy with Node.js APIs (server-side only)
7
- */
1
+ /** Operating-mode strategy types. */
8
2
  import type { OperatingMode as OM } from './index.js';
9
3
  import type { CanopyConfig } from '../config/index.js';
10
4
  export type OperatingMode = OM;
11
- /**
12
- * Options for resolving git remote URL
13
- */
5
+ /** @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md. */
14
6
  export interface ResolveRemoteUrlOptions {
15
7
  mode: OperatingMode;
16
8
  remoteUrl?: string;
@@ -18,41 +10,29 @@ export interface ResolveRemoteUrlOptions {
18
10
  baseBranch?: string;
19
11
  sourceRoot?: string;
20
12
  }
21
- /**
22
- * Configuration for remote URL resolution
23
- * Strategies return this data; GitManager executes the logic
24
- */
13
+ /** Strategies return this data; GitManager executes the logic. */
25
14
  export interface RemoteUrlConfig {
26
- /** Whether to auto-initialize a local remote */
27
15
  shouldAutoInitLocal: boolean;
28
16
  /** Default path for local remote (e.g., '.canopycms/remote.git') */
29
17
  defaultRemotePath: string;
30
- /** Environment variable name for remote URL */
31
18
  envVarName: string;
32
19
  /**
33
- * Absolute path to check for auto-detection of a pre-existing local remote.
34
- * If this path exists on disk, it's used as the remote URL (file:// protocol).
35
- * Used in prod mode where the EC2 worker creates remote.git on EFS.
36
- * Unlike shouldAutoInitLocal, this does NOT create the remote — just detects it.
20
+ * If this absolute path exists on disk it becomes the remote URL (file://).
21
+ * Set in prod, where the EC2 worker creates remote.git on EFS. Unlike
22
+ * shouldAutoInitLocal, this only DETECTS a remote; it never creates one.
37
23
  */
38
24
  autoDetectRemotePath?: string;
39
25
  }
40
26
  /**
41
- * Client-Safe Strategy
42
- *
43
- * Methods that can be safely imported in 'use client' React components.
44
- * NO Node.js APIs (fs, path, process, etc.) - only pure logic and simple data.
27
+ * Methods safe to import in 'use client' React components: pure logic and
28
+ * simple data, NO Node.js APIs (fs, path, process).
45
29
  */
46
30
  export interface ClientSafeStrategy {
47
- /** The operating mode this strategy represents */
48
31
  readonly mode: OperatingMode;
49
32
  /** Whether this mode supports multiple branch workspaces */
50
33
  supportsBranching(): boolean;
51
- /** Whether to show status badge in UI */
52
34
  supportsStatusBadge(): boolean;
53
- /** Whether comments/collaboration features are enabled */
54
35
  supportsComments(): boolean;
55
- /** Whether pull request features are available */
56
36
  supportsPullRequests(): boolean;
57
37
  /** Get the permissions file name (e.g., 'permissions.json' or 'permissions.local.json') */
58
38
  getPermissionsFileName(): string;
@@ -63,80 +43,52 @@ export interface ClientSafeStrategy {
63
43
  /** Whether git pushes should be made in this mode */
64
44
  shouldPush(): boolean;
65
45
  }
66
- /**
67
- * Client-Unsafe Strategy
68
- *
69
- * Full strategy including Node.js APIs. Can only be imported server-side.
70
- * Extends ClientSafeStrategy, so all client-safe methods are available.
71
- */
46
+ /** The full strategy, including Node.js APIs. Server-side imports only. */
72
47
  export interface ClientUnsafeStrategy extends ClientSafeStrategy {
73
48
  /**
74
- * Get the root directory for this mode's workspace.
75
- * All mode-specific subdirectories (content-branches, settings, .cache, etc.) live under this.
76
- * - prod: CANOPYCMS_WORKSPACE_ROOT ?? /mnt/efs/workspace
77
- * - dev: {sourceRoot ?? cwd}/.canopy-dev
49
+ * The mode's workspace root; content-branches, settings and .cache all live
50
+ * under it. prod: CANOPYCMS_WORKSPACE_ROOT ?? /mnt/efs/workspace.
51
+ * dev: {sourceRoot ?? cwd}/.canopy-dev.
78
52
  */
79
53
  getWorkspaceRoot(sourceRoot?: string): string;
80
54
  /**
81
- * Get the content directory path (at project/workspace root).
82
- * - dev: {sourceRoot ?? cwd}/{contentRoot}
83
- * - prod (in workspaces): {sourceRoot ?? cwd}/{contentRoot}
55
+ * The content directory, `{sourceRoot ?? cwd}/{contentRoot}` in both modes.
84
56
  *
85
57
  * `contentRoot` is REQUIRED and must be the caller's already-resolved
86
58
  * `config.contentRoot` (falling back to 'content' at the call site, not here).
87
- * A default here is deliberately not provided: this method used to hardcode
88
- * the literal 'content', which silently disarmed callers configured with a
89
- * non-default contentRoot (e.g. dev-content-watcher.ts's divergence watcher
90
- * resolved a content directory that never existed, hit its existsSync guard,
91
- * and permanently no-op'd — with no error, since a missing directory looks
92
- * like "nothing to watch yet"). Making the parameter required means a future
93
- * caller cannot silently reintroduce that bug by omitting it.
59
+ * Defaulting it here would silently disarm any caller configured with a
60
+ * non-default contentRoot: it would resolve a directory that never exists,
61
+ * and a missing content directory reads as "nothing to do" rather than as an
62
+ * error. Requiring the parameter makes that mistake impossible.
94
63
  */
95
64
  getContentRoot(contentRoot: string, sourceRoot?: string): string;
96
65
  /**
97
- * Get the parent directory of all content branch workspaces (contains branches.json and branch directories).
98
- * - dev: {cwd}/.canopy-dev/content-branches
99
- * - prod: $CANOPYCMS_WORKSPACE_ROOT/content-branches or /mnt/efs/workspace/content-branches
66
+ * `{workspaceRoot}/content-branches`: the parent of every content branch
67
+ * workspace, and the home of branches.json.
100
68
  */
101
69
  getContentBranchesRoot(sourceRoot?: string): string;
102
- /**
103
- * Get individual content branch workspace directory.
104
- * Returns: {contentBranchesRoot}/{branchName}
105
- */
70
+ /** `{contentBranchesRoot}/{branchName}`. */
106
71
  getContentBranchRoot(branchName: string, sourceRoot?: string): string;
107
72
  /**
108
- * Get the git exclude pattern for runtime metadata (e.g., '.canopy-meta/').
109
- * Used by GitManager to add to .git/info/exclude in content branch workspaces.
73
+ * Runtime-metadata pattern (e.g. '.canopy-meta/') that GitManager adds to
74
+ * .git/info/exclude in every content branch workspace.
110
75
  */
111
76
  getGitExcludePattern(): string;
112
- /** Get the full path to the permissions file */
113
77
  getPermissionsFilePath(root: string): string;
114
- /** Get the full path to the groups file */
115
78
  getGroupsFilePath(root: string): string;
116
- /** Get configuration for remote URL resolution (GitManager executes the logic) */
117
79
  getRemoteUrlConfig(): RemoteUrlConfig;
118
80
  /** Whether this mode requires an existing git repository */
119
81
  requiresExistingRepo(): boolean;
120
- /**
121
- * Get the branch name to use for settings (permissions/groups).
122
- * Returns: canopycms-settings-{deploymentName}
123
- */
82
+ /** The permissions/groups branch: `canopycms-settings-{deploymentName}`. */
124
83
  getSettingsBranchName(config: {
125
84
  settingsBranch?: string;
126
85
  deploymentName?: string;
127
86
  defaultBaseBranch?: string;
128
87
  }): string;
129
- /**
130
- * Get the root directory for settings storage.
131
- * - prod: $CANOPYCMS_WORKSPACE_ROOT/settings or /mnt/efs/workspace/settings
132
- * - dev: {cwd}/.canopy-dev/settings
133
- */
88
+ /** `{workspaceRoot}/settings`, where settings storage lives. */
134
89
  getSettingsRoot(sourceRoot?: string): string;
135
- /** Whether settings should be stored in a separate branch */
136
90
  usesSeparateSettingsBranch(): boolean;
137
- /** Validate configuration for this mode */
138
91
  validateConfig(config: Partial<CanopyConfig>): void;
139
- /** Whether PRs should be auto-created for permissions/groups changes */
140
92
  shouldCreateSettingsPR(config: {
141
93
  autoCreateSettingsPR?: boolean;
142
94
  }): boolean;
@@ -1,8 +1,2 @@
1
- /**
2
- * Operating Mode Strategy Types
3
- *
4
- * This module defines the two-layer strategy pattern for operating modes:
5
- * - ClientSafeStrategy: Methods safe for client-side bundles (no Node.js APIs)
6
- * - ClientUnsafeStrategy: Full strategy with Node.js APIs (server-side only)
7
- */
1
+ /** Operating-mode strategy types. */
8
2
  export {};