canopycms 0.0.0 → 0.0.2

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 (467) hide show
  1. package/dist/auth/plugin.d.ts +8 -0
  2. package/dist/auth/plugin.d.ts.map +1 -1
  3. package/dist/build-mode.d.ts +15 -5
  4. package/dist/build-mode.d.ts.map +1 -1
  5. package/dist/build-mode.js +18 -8
  6. package/dist/build-mode.js.map +1 -1
  7. package/dist/cli/init.d.ts +2 -2
  8. package/dist/cli/init.d.ts.map +1 -1
  9. package/dist/cli/init.js +37 -36
  10. package/dist/cli/init.js.map +1 -1
  11. package/dist/cli/template-files/ai-config.ts.template +21 -0
  12. package/dist/cli/template-files/ai-route.ts.template +10 -0
  13. package/dist/cli/template-files/canopy.ts.template +24 -0
  14. package/dist/cli/templates.d.ts +5 -1
  15. package/dist/cli/templates.d.ts.map +1 -1
  16. package/dist/cli/templates.js +9 -2
  17. package/dist/cli/templates.js.map +1 -1
  18. package/dist/config/schemas/config.d.ts +4 -0
  19. package/dist/config/schemas/config.d.ts.map +1 -1
  20. package/dist/config/schemas/config.js +2 -0
  21. package/dist/config/schemas/config.js.map +1 -1
  22. package/dist/config/types.d.ts +5 -0
  23. package/dist/config/types.d.ts.map +1 -1
  24. package/dist/content-reader.js +2 -2
  25. package/dist/content-reader.js.map +1 -1
  26. package/dist/context.js +5 -5
  27. package/dist/context.js.map +1 -1
  28. package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
  29. package/dist/operating-mode/client-unsafe-strategy.js +15 -18
  30. package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
  31. package/dist/operating-mode/types.d.ts +8 -0
  32. package/dist/operating-mode/types.d.ts.map +1 -1
  33. package/dist/server.d.ts +2 -0
  34. package/dist/server.d.ts.map +1 -1
  35. package/dist/server.js +2 -0
  36. package/dist/server.js.map +1 -1
  37. package/package.json +5 -4
  38. package/src/cli/init.ts +43 -38
  39. package/dist/__integration__/fixtures/content-seeds.d.ts +0 -43
  40. package/dist/__integration__/fixtures/content-seeds.d.ts.map +0 -1
  41. package/dist/__integration__/fixtures/content-seeds.js +0 -99
  42. package/dist/__integration__/fixtures/content-seeds.js.map +0 -1
  43. package/dist/__integration__/fixtures/schemas.d.ts +0 -12
  44. package/dist/__integration__/fixtures/schemas.d.ts.map +0 -1
  45. package/dist/__integration__/fixtures/schemas.js +0 -65
  46. package/dist/__integration__/fixtures/schemas.js.map +0 -1
  47. package/dist/__integration__/test-utils/api-client.d.ts +0 -123
  48. package/dist/__integration__/test-utils/api-client.d.ts.map +0 -1
  49. package/dist/__integration__/test-utils/api-client.js +0 -118
  50. package/dist/__integration__/test-utils/api-client.js.map +0 -1
  51. package/dist/__integration__/test-utils/multi-user.d.ts +0 -25
  52. package/dist/__integration__/test-utils/multi-user.d.ts.map +0 -1
  53. package/dist/__integration__/test-utils/multi-user.js +0 -105
  54. package/dist/__integration__/test-utils/multi-user.js.map +0 -1
  55. package/dist/__integration__/test-utils/test-workspace.d.ts +0 -25
  56. package/dist/__integration__/test-utils/test-workspace.d.ts.map +0 -1
  57. package/dist/__integration__/test-utils/test-workspace.js +0 -102
  58. package/dist/__integration__/test-utils/test-workspace.js.map +0 -1
  59. package/dist/editor/BranchManager.stories.d.ts +0 -8
  60. package/dist/editor/BranchManager.stories.d.ts.map +0 -1
  61. package/dist/editor/BranchManager.stories.js +0 -74
  62. package/dist/editor/BranchManager.stories.js.map +0 -1
  63. package/dist/editor/CanopyEditor.stories.d.ts +0 -7
  64. package/dist/editor/CanopyEditor.stories.d.ts.map +0 -1
  65. package/dist/editor/CanopyEditor.stories.js +0 -99
  66. package/dist/editor/CanopyEditor.stories.js.map +0 -1
  67. package/dist/editor/CommentsPanel.stories.d.ts +0 -10
  68. package/dist/editor/CommentsPanel.stories.d.ts.map +0 -1
  69. package/dist/editor/CommentsPanel.stories.js +0 -175
  70. package/dist/editor/CommentsPanel.stories.js.map +0 -1
  71. package/dist/editor/Editor.stories.d.ts +0 -7
  72. package/dist/editor/Editor.stories.d.ts.map +0 -1
  73. package/dist/editor/Editor.stories.js +0 -95
  74. package/dist/editor/Editor.stories.js.map +0 -1
  75. package/dist/editor/EditorPanes.stories.d.ts +0 -7
  76. package/dist/editor/EditorPanes.stories.d.ts.map +0 -1
  77. package/dist/editor/EditorPanes.stories.js +0 -116
  78. package/dist/editor/EditorPanes.stories.js.map +0 -1
  79. package/dist/editor/EntryNavigator.stories.d.ts +0 -8
  80. package/dist/editor/EntryNavigator.stories.d.ts.map +0 -1
  81. package/dist/editor/EntryNavigator.stories.js +0 -42
  82. package/dist/editor/EntryNavigator.stories.js.map +0 -1
  83. package/dist/editor/FormRenderer.stories.d.ts +0 -7
  84. package/dist/editor/FormRenderer.stories.d.ts.map +0 -1
  85. package/dist/editor/FormRenderer.stories.js +0 -115
  86. package/dist/editor/FormRenderer.stories.js.map +0 -1
  87. package/dist/editor/GroupManager.stories.d.ts +0 -19
  88. package/dist/editor/GroupManager.stories.d.ts.map +0 -1
  89. package/dist/editor/GroupManager.stories.js +0 -265
  90. package/dist/editor/GroupManager.stories.js.map +0 -1
  91. package/dist/editor/PermissionManager.stories.d.ts +0 -20
  92. package/dist/editor/PermissionManager.stories.d.ts.map +0 -1
  93. package/dist/editor/PermissionManager.stories.js +0 -506
  94. package/dist/editor/PermissionManager.stories.js.map +0 -1
  95. package/dist/editor/comments/FieldWrapper.stories.d.ts +0 -10
  96. package/dist/editor/comments/FieldWrapper.stories.d.ts.map +0 -1
  97. package/dist/editor/comments/FieldWrapper.stories.js +0 -173
  98. package/dist/editor/comments/FieldWrapper.stories.js.map +0 -1
  99. package/dist/editor/fields/BlockField.stories.d.ts +0 -7
  100. package/dist/editor/fields/BlockField.stories.d.ts.map +0 -1
  101. package/dist/editor/fields/BlockField.stories.js +0 -50
  102. package/dist/editor/fields/BlockField.stories.js.map +0 -1
  103. package/dist/editor/fields/fields.stories.d.ts +0 -8
  104. package/dist/editor/fields/fields.stories.d.ts.map +0 -1
  105. package/dist/editor/fields/fields.stories.js +0 -34
  106. package/dist/editor/fields/fields.stories.js.map +0 -1
  107. package/dist/test-utils/api-test-helpers.d.ts +0 -238
  108. package/dist/test-utils/api-test-helpers.d.ts.map +0 -1
  109. package/dist/test-utils/api-test-helpers.js +0 -347
  110. package/dist/test-utils/api-test-helpers.js.map +0 -1
  111. package/dist/test-utils/console-spy.d.ts +0 -56
  112. package/dist/test-utils/console-spy.d.ts.map +0 -1
  113. package/dist/test-utils/console-spy.js +0 -81
  114. package/dist/test-utils/console-spy.js.map +0 -1
  115. package/dist/test-utils/git-helpers.d.ts +0 -21
  116. package/dist/test-utils/git-helpers.d.ts.map +0 -1
  117. package/dist/test-utils/git-helpers.js +0 -23
  118. package/dist/test-utils/git-helpers.js.map +0 -1
  119. package/dist/test-utils/index.d.ts +0 -5
  120. package/dist/test-utils/index.d.ts.map +0 -1
  121. package/dist/test-utils/index.js +0 -4
  122. package/dist/test-utils/index.js.map +0 -1
  123. package/src/__integration__/errors/invalid-content.test.ts +0 -238
  124. package/src/__integration__/errors/permission-denied.test.ts +0 -220
  125. package/src/__integration__/fixtures/content-seeds.ts +0 -105
  126. package/src/__integration__/fixtures/schemas.ts +0 -67
  127. package/src/__integration__/initialization/prod-sim-init.test.ts +0 -139
  128. package/src/__integration__/permissions/path-permissions.test.ts +0 -314
  129. package/src/__integration__/permissions/role-permissions.test.ts +0 -354
  130. package/src/__integration__/permissions/settings-branch-isolation.test.ts +0 -317
  131. package/src/__integration__/settings/groups-api.test.ts +0 -403
  132. package/src/__integration__/test-utils/api-client.ts +0 -167
  133. package/src/__integration__/test-utils/multi-user.ts +0 -129
  134. package/src/__integration__/test-utils/test-workspace.ts +0 -130
  135. package/src/__integration__/user/user-context.test.ts +0 -174
  136. package/src/__integration__/validation/input-validation.test.ts +0 -166
  137. package/src/__integration__/workflows/api-editing-workflow.test.ts +0 -244
  138. package/src/__integration__/workflows/conflict-resolution.test.ts +0 -259
  139. package/src/__integration__/workflows/editing-workflow.test.ts +0 -205
  140. package/src/__integration__/workflows/review-workflow.test.ts +0 -260
  141. package/src/ai/__tests__/build.integration.test.ts +0 -224
  142. package/src/ai/__tests__/generate.integration.test.ts +0 -495
  143. package/src/ai/__tests__/handler.integration.test.ts +0 -212
  144. package/src/ai/__tests__/json-to-markdown.test.ts +0 -553
  145. package/src/ai/generate.ts +0 -410
  146. package/src/ai/handler.ts +0 -123
  147. package/src/ai/index.ts +0 -26
  148. package/src/ai/json-to-markdown.ts +0 -424
  149. package/src/ai/resolve-branch.ts +0 -34
  150. package/src/ai/types.ts +0 -160
  151. package/src/api/AGENTS.md +0 -81
  152. package/src/api/__test__/mock-client.ts +0 -404
  153. package/src/api/assets.test.ts +0 -140
  154. package/src/api/assets.ts +0 -154
  155. package/src/api/branch-merge.test.ts +0 -163
  156. package/src/api/branch-merge.ts +0 -113
  157. package/src/api/branch-review.test.ts +0 -297
  158. package/src/api/branch-review.ts +0 -136
  159. package/src/api/branch-status.test.ts +0 -85
  160. package/src/api/branch-status.ts +0 -153
  161. package/src/api/branch-withdraw.test.ts +0 -146
  162. package/src/api/branch-withdraw.ts +0 -81
  163. package/src/api/branch-workflow.integration.test.ts +0 -578
  164. package/src/api/branch.test.ts +0 -620
  165. package/src/api/branch.ts +0 -492
  166. package/src/api/client.test.ts +0 -349
  167. package/src/api/client.ts +0 -506
  168. package/src/api/comments.test.ts +0 -285
  169. package/src/api/comments.ts +0 -210
  170. package/src/api/content.test.ts +0 -345
  171. package/src/api/content.ts +0 -454
  172. package/src/api/entries.test.ts +0 -1339
  173. package/src/api/entries.ts +0 -650
  174. package/src/api/github-sync.ts +0 -144
  175. package/src/api/groups.test.ts +0 -1013
  176. package/src/api/groups.ts +0 -375
  177. package/src/api/guards.test.ts +0 -533
  178. package/src/api/guards.ts +0 -271
  179. package/src/api/index.ts +0 -87
  180. package/src/api/permissions.test.ts +0 -766
  181. package/src/api/permissions.ts +0 -334
  182. package/src/api/reference-options.ts +0 -118
  183. package/src/api/resolve-references.ts +0 -107
  184. package/src/api/route-builder.ts +0 -289
  185. package/src/api/schema.test.ts +0 -840
  186. package/src/api/schema.ts +0 -936
  187. package/src/api/security.test.ts +0 -233
  188. package/src/api/settings-helpers.ts +0 -84
  189. package/src/api/types.ts +0 -40
  190. package/src/api/user.test.ts +0 -127
  191. package/src/api/user.ts +0 -42
  192. package/src/api/validators.test.ts +0 -275
  193. package/src/api/validators.ts +0 -176
  194. package/src/asset-store.test.ts +0 -37
  195. package/src/asset-store.ts +0 -110
  196. package/src/auth/cache.ts +0 -7
  197. package/src/auth/caching-auth-plugin.test.ts +0 -154
  198. package/src/auth/caching-auth-plugin.ts +0 -109
  199. package/src/auth/context-helpers.ts +0 -75
  200. package/src/auth/file-based-auth-cache.test.ts +0 -257
  201. package/src/auth/file-based-auth-cache.ts +0 -279
  202. package/src/auth/index.ts +0 -12
  203. package/src/auth/plugin.ts +0 -51
  204. package/src/auth/types.ts +0 -38
  205. package/src/authorization/__tests__/branch.test.ts +0 -260
  206. package/src/authorization/__tests__/content.test.ts +0 -142
  207. package/src/authorization/__tests__/path.test.ts +0 -133
  208. package/src/authorization/__tests__/permissions-loader.test.ts +0 -200
  209. package/src/authorization/branch.ts +0 -94
  210. package/src/authorization/content.ts +0 -93
  211. package/src/authorization/groups/index.ts +0 -11
  212. package/src/authorization/groups/loader.ts +0 -127
  213. package/src/authorization/groups/schema.ts +0 -48
  214. package/src/authorization/helpers.ts +0 -48
  215. package/src/authorization/index.ts +0 -84
  216. package/src/authorization/path.ts +0 -112
  217. package/src/authorization/permissions/index.ts +0 -11
  218. package/src/authorization/permissions/loader.ts +0 -116
  219. package/src/authorization/permissions/schema.ts +0 -66
  220. package/src/authorization/test-utils.ts +0 -15
  221. package/src/authorization/types.ts +0 -66
  222. package/src/authorization/validation.test.ts +0 -100
  223. package/src/authorization/validation.ts +0 -62
  224. package/src/branch-metadata.test.ts +0 -168
  225. package/src/branch-metadata.ts +0 -166
  226. package/src/branch-registry.test.ts +0 -248
  227. package/src/branch-registry.ts +0 -152
  228. package/src/branch-schema-cache.test.ts +0 -275
  229. package/src/branch-schema-cache.ts +0 -189
  230. package/src/branch-workspace.test.ts +0 -183
  231. package/src/branch-workspace.ts +0 -124
  232. package/src/build/generate-ai-content.ts +0 -78
  233. package/src/build/index.ts +0 -8
  234. package/src/build-mode.ts +0 -27
  235. package/src/cli/generate-ai-content.ts +0 -100
  236. package/src/cli/init.test.ts +0 -240
  237. package/src/cli/templates/canopy.ts.template +0 -55
  238. package/src/cli/templates.ts +0 -47
  239. package/src/client.ts +0 -12
  240. package/src/comment-store.test.ts +0 -442
  241. package/src/comment-store.ts +0 -301
  242. package/src/config/__tests__/config.test.ts +0 -513
  243. package/src/config/flatten.ts +0 -174
  244. package/src/config/helpers.ts +0 -167
  245. package/src/config/index.ts +0 -86
  246. package/src/config/schemas/collection.ts +0 -67
  247. package/src/config/schemas/config.ts +0 -77
  248. package/src/config/schemas/field.ts +0 -108
  249. package/src/config/schemas/media.ts +0 -27
  250. package/src/config/schemas/permissions.ts +0 -21
  251. package/src/config/types.ts +0 -321
  252. package/src/config/validation.ts +0 -70
  253. package/src/config-test.ts +0 -65
  254. package/src/config.ts +0 -11
  255. package/src/content-id-index.test.ts +0 -512
  256. package/src/content-id-index.ts +0 -479
  257. package/src/content-reader.test.ts +0 -478
  258. package/src/content-reader.ts +0 -214
  259. package/src/content-store.test.ts +0 -1126
  260. package/src/content-store.ts +0 -793
  261. package/src/context.ts +0 -111
  262. package/src/editor/BranchManager.stories.tsx +0 -80
  263. package/src/editor/BranchManager.test.tsx +0 -324
  264. package/src/editor/BranchManager.tsx +0 -461
  265. package/src/editor/CanopyEditor.stories.tsx +0 -128
  266. package/src/editor/CanopyEditor.test.tsx +0 -81
  267. package/src/editor/CanopyEditor.tsx +0 -73
  268. package/src/editor/CanopyEditorPage.test.tsx +0 -59
  269. package/src/editor/CanopyEditorPage.tsx +0 -25
  270. package/src/editor/CommentsPanel.stories.tsx +0 -184
  271. package/src/editor/CommentsPanel.tsx +0 -338
  272. package/src/editor/Editor.integration.test.tsx +0 -227
  273. package/src/editor/Editor.stories.tsx +0 -119
  274. package/src/editor/Editor.tsx +0 -1221
  275. package/src/editor/EditorPanes.stories.tsx +0 -256
  276. package/src/editor/EditorPanes.test.tsx +0 -77
  277. package/src/editor/EditorPanes.tsx +0 -180
  278. package/src/editor/EntryNavigator.stories.tsx +0 -65
  279. package/src/editor/EntryNavigator.test.tsx +0 -598
  280. package/src/editor/EntryNavigator.tsx +0 -665
  281. package/src/editor/FormRenderer.stories.tsx +0 -212
  282. package/src/editor/FormRenderer.test.tsx +0 -194
  283. package/src/editor/FormRenderer.tsx +0 -432
  284. package/src/editor/GroupManager.stories.tsx +0 -301
  285. package/src/editor/GroupManager.test.tsx +0 -682
  286. package/src/editor/GroupManager.tsx +0 -9
  287. package/src/editor/PermissionManager.stories.tsx +0 -539
  288. package/src/editor/PermissionManager.test.tsx +0 -864
  289. package/src/editor/PermissionManager.tsx +0 -12
  290. package/src/editor/canopy-path.test.ts +0 -23
  291. package/src/editor/canopy-path.ts +0 -52
  292. package/src/editor/client-reference-resolver.ts +0 -118
  293. package/src/editor/comments/BranchComments.tsx +0 -93
  294. package/src/editor/comments/EntryComments.tsx +0 -94
  295. package/src/editor/comments/FieldWrapper.stories.tsx +0 -210
  296. package/src/editor/comments/FieldWrapper.tsx +0 -129
  297. package/src/editor/comments/InlineCommentThread.test.tsx +0 -384
  298. package/src/editor/comments/InlineCommentThread.tsx +0 -246
  299. package/src/editor/comments/ThreadCarousel.test.tsx +0 -393
  300. package/src/editor/comments/ThreadCarousel.tsx +0 -525
  301. package/src/editor/components/ConfirmDeleteModal.tsx +0 -49
  302. package/src/editor/components/EditorContext.tsx +0 -49
  303. package/src/editor/components/EditorFooter.tsx +0 -47
  304. package/src/editor/components/EditorHeader.tsx +0 -492
  305. package/src/editor/components/EditorSidebar.tsx +0 -193
  306. package/src/editor/components/EntryCreateModal.tsx +0 -193
  307. package/src/editor/components/RenameEntryModal.tsx +0 -152
  308. package/src/editor/components/UserBadge.test.tsx +0 -274
  309. package/src/editor/components/UserBadge.tsx +0 -240
  310. package/src/editor/components/index.ts +0 -6
  311. package/src/editor/context/ApiClientContext.tsx +0 -56
  312. package/src/editor/context/EditorStateContext.tsx +0 -221
  313. package/src/editor/context/index.ts +0 -40
  314. package/src/editor/editor-config.test.ts +0 -385
  315. package/src/editor/editor-config.ts +0 -94
  316. package/src/editor/editor-utils.test.ts +0 -772
  317. package/src/editor/editor-utils.ts +0 -303
  318. package/src/editor/env.ts +0 -4
  319. package/src/editor/fields/BlockField.stories.tsx +0 -79
  320. package/src/editor/fields/BlockField.tsx +0 -267
  321. package/src/editor/fields/CodeField.tsx +0 -41
  322. package/src/editor/fields/MarkdownField.tsx +0 -205
  323. package/src/editor/fields/ObjectField.tsx +0 -71
  324. package/src/editor/fields/ReferenceField.tsx +0 -138
  325. package/src/editor/fields/SelectField.tsx +0 -76
  326. package/src/editor/fields/TextField.tsx +0 -35
  327. package/src/editor/fields/ToggleField.tsx +0 -37
  328. package/src/editor/fields/fields.stories.tsx +0 -40
  329. package/src/editor/group-manager/ExternalGroupsTab.tsx +0 -114
  330. package/src/editor/group-manager/GroupCard.tsx +0 -102
  331. package/src/editor/group-manager/GroupForm.tsx +0 -66
  332. package/src/editor/group-manager/InternalGroupsTab.tsx +0 -147
  333. package/src/editor/group-manager/MemberList.tsx +0 -184
  334. package/src/editor/group-manager/hooks/useExternalGroupSearch.ts +0 -63
  335. package/src/editor/group-manager/hooks/useGroupState.ts +0 -134
  336. package/src/editor/group-manager/hooks/useUserSearch.ts +0 -84
  337. package/src/editor/group-manager/index.tsx +0 -210
  338. package/src/editor/group-manager/types.ts +0 -28
  339. package/src/editor/hooks/README.md +0 -26
  340. package/src/editor/hooks/__test__/test-utils.tsx +0 -183
  341. package/src/editor/hooks/index.ts +0 -23
  342. package/src/editor/hooks/useBranchActions.test.tsx +0 -267
  343. package/src/editor/hooks/useBranchActions.tsx +0 -121
  344. package/src/editor/hooks/useBranchManager.test.tsx +0 -391
  345. package/src/editor/hooks/useBranchManager.tsx +0 -326
  346. package/src/editor/hooks/useCommentSystem.test.ts +0 -615
  347. package/src/editor/hooks/useCommentSystem.ts +0 -347
  348. package/src/editor/hooks/useDraftManager.test.ts +0 -375
  349. package/src/editor/hooks/useDraftManager.ts +0 -259
  350. package/src/editor/hooks/useEditorLayout.test.ts +0 -147
  351. package/src/editor/hooks/useEditorLayout.ts +0 -67
  352. package/src/editor/hooks/useEntryManager.test.ts +0 -588
  353. package/src/editor/hooks/useEntryManager.ts +0 -387
  354. package/src/editor/hooks/useGroupManager.test.ts +0 -277
  355. package/src/editor/hooks/useGroupManager.ts +0 -139
  356. package/src/editor/hooks/usePermissionManager.test.ts +0 -211
  357. package/src/editor/hooks/usePermissionManager.ts +0 -113
  358. package/src/editor/hooks/useReferenceResolution.ts +0 -248
  359. package/src/editor/hooks/useSchemaManager.test.ts +0 -370
  360. package/src/editor/hooks/useSchemaManager.ts +0 -310
  361. package/src/editor/hooks/useUserContext.tsx +0 -57
  362. package/src/editor/hooks/useUserMetadata.test.ts +0 -191
  363. package/src/editor/hooks/useUserMetadata.ts +0 -71
  364. package/src/editor/permission-manager/GroupSelector.tsx +0 -73
  365. package/src/editor/permission-manager/PermissionEditor.tsx +0 -321
  366. package/src/editor/permission-manager/PermissionLevelBadge.tsx +0 -53
  367. package/src/editor/permission-manager/PermissionTree.tsx +0 -237
  368. package/src/editor/permission-manager/UserSelector.tsx +0 -95
  369. package/src/editor/permission-manager/constants.tsx +0 -18
  370. package/src/editor/permission-manager/hooks/useGroupsAndUsers.ts +0 -153
  371. package/src/editor/permission-manager/hooks/usePermissionTree.ts +0 -200
  372. package/src/editor/permission-manager/index.tsx +0 -294
  373. package/src/editor/permission-manager/types.ts +0 -58
  374. package/src/editor/permission-manager/utils.ts +0 -179
  375. package/src/editor/preview-bridge.test.tsx +0 -50
  376. package/src/editor/preview-bridge.tsx +0 -294
  377. package/src/editor/schema-editor/CollectionEditor.test.tsx +0 -238
  378. package/src/editor/schema-editor/CollectionEditor.tsx +0 -520
  379. package/src/editor/schema-editor/EntryTypeEditor.test.tsx +0 -215
  380. package/src/editor/schema-editor/EntryTypeEditor.tsx +0 -367
  381. package/src/editor/schema-editor/index.ts +0 -19
  382. package/src/editor/setup-test-dom.ts +0 -10
  383. package/src/editor/test-setup.ts +0 -33
  384. package/src/editor/theme.tsx +0 -119
  385. package/src/editor/utils/env.ts +0 -39
  386. package/src/entry-schema-registry.test.ts +0 -281
  387. package/src/entry-schema-registry.ts +0 -121
  388. package/src/entry-schema.ts +0 -84
  389. package/src/git-manager.test.ts +0 -552
  390. package/src/git-manager.ts +0 -667
  391. package/src/github-service.test.ts +0 -312
  392. package/src/github-service.ts +0 -295
  393. package/src/http/handler.test.ts +0 -275
  394. package/src/http/handler.ts +0 -280
  395. package/src/http/index.ts +0 -11
  396. package/src/http/router.ts +0 -164
  397. package/src/http/types.ts +0 -44
  398. package/src/id.test.ts +0 -48
  399. package/src/id.ts +0 -22
  400. package/src/index.ts +0 -26
  401. package/src/operating-mode/__tests__/strategies.test.ts +0 -511
  402. package/src/operating-mode/client-safe-strategy.ts +0 -184
  403. package/src/operating-mode/client-unsafe-strategy.ts +0 -303
  404. package/src/operating-mode/client.ts +0 -13
  405. package/src/operating-mode/index.ts +0 -34
  406. package/src/operating-mode/types.ts +0 -186
  407. package/src/paths/__tests__/branch.test.ts +0 -53
  408. package/src/paths/__tests__/normalize.test.ts +0 -141
  409. package/src/paths/__tests__/resolve.test.ts +0 -207
  410. package/src/paths/__tests__/validation.test.ts +0 -61
  411. package/src/paths/branch.ts +0 -115
  412. package/src/paths/index.ts +0 -73
  413. package/src/paths/normalize-server.ts +0 -40
  414. package/src/paths/normalize.ts +0 -107
  415. package/src/paths/resolve.ts +0 -61
  416. package/src/paths/test-utils.ts +0 -37
  417. package/src/paths/types.ts +0 -68
  418. package/src/paths/validation.test.ts +0 -480
  419. package/src/paths/validation.ts +0 -391
  420. package/src/reference-resolver.test.ts +0 -107
  421. package/src/reference-resolver.ts +0 -157
  422. package/src/schema/index.ts +0 -29
  423. package/src/schema/meta-loader.ts +0 -366
  424. package/src/schema/resolver.ts +0 -83
  425. package/src/schema/schema-store-types.ts +0 -56
  426. package/src/schema/schema-store.test.ts +0 -816
  427. package/src/schema/schema-store.ts +0 -795
  428. package/src/schema/types.ts +0 -33
  429. package/src/schema-meta-loader.test.ts +0 -447
  430. package/src/server.ts +0 -15
  431. package/src/services.test.ts +0 -559
  432. package/src/services.ts +0 -373
  433. package/src/settings-branch-utils.ts +0 -53
  434. package/src/settings-workspace.ts +0 -156
  435. package/src/task-queue/README.md +0 -144
  436. package/src/task-queue/index.ts +0 -14
  437. package/src/task-queue/task-queue.test.ts +0 -524
  438. package/src/task-queue/task-queue.ts +0 -514
  439. package/src/task-queue/types.ts +0 -41
  440. package/src/test-utils/api-test-helpers.ts +0 -445
  441. package/src/test-utils/console-spy.test.ts +0 -14
  442. package/src/test-utils/console-spy.ts +0 -125
  443. package/src/test-utils/git-helpers.ts +0 -31
  444. package/src/test-utils/index.ts +0 -4
  445. package/src/types.ts +0 -54
  446. package/src/user.ts +0 -118
  447. package/src/utils/debug.test.ts +0 -114
  448. package/src/utils/debug.ts +0 -127
  449. package/src/utils/error.test.ts +0 -92
  450. package/src/utils/error.ts +0 -83
  451. package/src/utils/format.ts +0 -12
  452. package/src/validation/__tests__/field-traversal.test.ts +0 -263
  453. package/src/validation/deletion-checker.ts +0 -234
  454. package/src/validation/field-traversal.ts +0 -146
  455. package/src/validation/reference-validator.ts +0 -168
  456. package/src/worker/cms-worker-rebase.test.ts +0 -473
  457. package/src/worker/cms-worker.ts +0 -777
  458. package/src/worker/integration.test.ts +0 -289
  459. package/src/worker/task-queue-config.ts +0 -25
  460. package/src/worker/task-queue.test.ts +0 -452
  461. package/src/worker/task-queue.ts +0 -58
  462. /package/{src/cli/templates → dist/cli/template-files}/Dockerfile.cms.template +0 -0
  463. /package/{src/cli/templates → dist/cli/template-files}/canopycms.config.ts.template +0 -0
  464. /package/{src/cli/templates → dist/cli/template-files}/deploy-cms.yml.template +0 -0
  465. /package/{src/cli/templates → dist/cli/template-files}/edit-page.tsx.template +0 -0
  466. /package/{src/cli/templates → dist/cli/template-files}/route.ts.template +0 -0
  467. /package/{src/cli/templates → dist/cli/template-files}/schemas.ts.template +0 -0
@@ -1,303 +0,0 @@
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.
8
- */
9
-
10
- import path from 'node:path'
11
- import {
12
- ProdClientSafeStrategy,
13
- LocalProdSimClientSafeStrategy,
14
- LocalSimpleClientSafeStrategy,
15
- } from './client-safe-strategy'
16
- import type { OperatingMode, ClientUnsafeStrategy } from './types'
17
- import type { CanopyConfig } from '../config'
18
- import { DEFAULT_PROD_WORKSPACE } from '../config'
19
-
20
- // ============================================================================
21
- // Production Mode - Full Strategy
22
- // ============================================================================
23
-
24
- class ProdStrategy extends ProdClientSafeStrategy implements ClientUnsafeStrategy {
25
- // All client-safe methods inherited automatically from ProdClientSafeStrategy:
26
- // - mode, supportsBranching(), supportsStatusBadge(), supportsComments()
27
- // - supportsPullRequests(), getPermissionsFileName(), getGroupsFileName()
28
- // - shouldCommit(), shouldPush()
29
-
30
- // Add client-unsafe methods (use Node.js APIs)
31
-
32
- getContentRoot(sourceRoot?: string): string {
33
- // In prod, content is at workspace root (not project root)
34
- // This is called with sourceRoot = workspace path
35
- return path.resolve(sourceRoot ?? process.cwd(), 'content')
36
- }
37
-
38
- getContentBranchesRoot(_sourceRoot?: string): string {
39
- const envWorkspace = process.env.CANOPYCMS_WORKSPACE_ROOT
40
- const workspace = path.resolve(envWorkspace ?? DEFAULT_PROD_WORKSPACE)
41
- return path.join(workspace, 'content-branches')
42
- }
43
-
44
- getContentBranchRoot(branchName: string, sourceRoot?: string): string {
45
- return path.resolve(this.getContentBranchesRoot(sourceRoot), branchName)
46
- }
47
-
48
- getGitExcludePattern(): string {
49
- return '.canopy-meta/'
50
- }
51
-
52
- getPermissionsFilePath(root: string): string {
53
- return path.join(root, this.getPermissionsFileName())
54
- }
55
-
56
- getGroupsFilePath(root: string): string {
57
- return path.join(root, this.getGroupsFileName())
58
- }
59
-
60
- getRemoteUrlConfig(): import('./types').RemoteUrlConfig {
61
- const envWorkspace = process.env.CANOPYCMS_WORKSPACE_ROOT
62
- const workspace = path.resolve(envWorkspace ?? DEFAULT_PROD_WORKSPACE)
63
- return {
64
- shouldAutoInitLocal: false,
65
- defaultRemotePath: '',
66
- envVarName: 'CANOPYCMS_REMOTE_URL',
67
- autoDetectRemotePath: path.join(workspace, 'remote.git'),
68
- }
69
- }
70
-
71
- requiresExistingRepo(): boolean {
72
- return false // Will clone if needed
73
- }
74
-
75
- getSettingsBranchName(config: {
76
- settingsBranch?: string
77
- deploymentName?: string
78
- defaultBaseBranch?: string
79
- }): string {
80
- if (config.settingsBranch) return config.settingsBranch
81
- const deploymentName = config.deploymentName ?? 'prod'
82
- return `canopycms-settings-${deploymentName}`
83
- }
84
-
85
- getSettingsRoot(_sourceRoot?: string): string {
86
- const envWorkspace = process.env.CANOPYCMS_WORKSPACE_ROOT
87
- const workspace = path.resolve(envWorkspace ?? DEFAULT_PROD_WORKSPACE)
88
- return path.join(workspace, 'settings')
89
- }
90
-
91
- usesSeparateSettingsBranch(): boolean {
92
- return true
93
- }
94
-
95
- validateConfig(config: Partial<CanopyConfig>): void {
96
- if (!config.gitBotAuthorName || !config.gitBotAuthorEmail) {
97
- throw new Error('gitBotAuthorName and gitBotAuthorEmail are required in prod mode')
98
- }
99
- }
100
-
101
- shouldCreateSettingsPR(config: { autoCreateSettingsPR?: boolean }): boolean {
102
- return config.autoCreateSettingsPR ?? true
103
- }
104
- }
105
-
106
- // ============================================================================
107
- // Local Production Simulation - Full Strategy
108
- // ============================================================================
109
-
110
- class LocalProdSimStrategy extends LocalProdSimClientSafeStrategy implements ClientUnsafeStrategy {
111
- // Inherits client-safe methods from LocalProdSimClientSafeStrategy
112
-
113
- private getProdSimRoot(sourceRoot?: string): string {
114
- return path.resolve(sourceRoot ?? process.cwd(), '.canopy-prod-sim')
115
- }
116
-
117
- getContentRoot(sourceRoot?: string): string {
118
- return path.resolve(sourceRoot ?? process.cwd(), 'content')
119
- }
120
-
121
- getContentBranchesRoot(sourceRoot?: string): string {
122
- return path.join(this.getProdSimRoot(sourceRoot), 'content-branches')
123
- }
124
-
125
- getContentBranchRoot(branchName: string, sourceRoot?: string): string {
126
- return path.resolve(this.getContentBranchesRoot(sourceRoot), branchName)
127
- }
128
-
129
- getGitExcludePattern(): string {
130
- return '.canopy-meta/'
131
- }
132
-
133
- getPermissionsFilePath(root: string): string {
134
- return path.join(root, this.getPermissionsFileName())
135
- }
136
-
137
- getGroupsFilePath(root: string): string {
138
- return path.join(root, this.getGroupsFileName())
139
- }
140
-
141
- getRemoteUrlConfig(): import('./types').RemoteUrlConfig {
142
- return {
143
- shouldAutoInitLocal: true,
144
- defaultRemotePath: '.canopy-prod-sim/remote.git',
145
- envVarName: 'CANOPYCMS_REMOTE_URL',
146
- }
147
- }
148
-
149
- requiresExistingRepo(): boolean {
150
- return false
151
- }
152
-
153
- getSettingsBranchName(config: {
154
- settingsBranch?: string
155
- deploymentName?: string
156
- defaultBaseBranch?: string
157
- }): string {
158
- if (config.settingsBranch) return config.settingsBranch
159
- const deploymentName = config.deploymentName ?? 'prod'
160
- return `canopycms-settings-${deploymentName}`
161
- }
162
-
163
- getSettingsRoot(sourceRoot?: string): string {
164
- return path.join(this.getProdSimRoot(sourceRoot), 'settings')
165
- }
166
-
167
- usesSeparateSettingsBranch(): boolean {
168
- return true
169
- }
170
-
171
- validateConfig(_config: Partial<CanopyConfig>): void {
172
- // No special validation for prod-sim
173
- }
174
-
175
- shouldCreateSettingsPR(_config: { autoCreateSettingsPR?: boolean }): boolean {
176
- return false // No real GitHub in simulation
177
- }
178
- }
179
-
180
- // ============================================================================
181
- // Local Simple Mode - Full Strategy
182
- // ============================================================================
183
-
184
- class LocalSimpleStrategy extends LocalSimpleClientSafeStrategy implements ClientUnsafeStrategy {
185
- // Inherits: supportsBranching() returns false, getPermissionsFileName() returns 'permissions.local.json'
186
-
187
- private getDevConfigRoot(sourceRoot?: string): string {
188
- return path.resolve(sourceRoot ?? process.cwd(), '.canopy-dev')
189
- }
190
-
191
- getContentRoot(sourceRoot?: string): string {
192
- return path.resolve(sourceRoot ?? process.cwd(), 'content')
193
- }
194
-
195
- getContentBranchesRoot(_sourceRoot?: string): string {
196
- throw new Error('No branching in dev mode')
197
- }
198
-
199
- getContentBranchRoot(_branchName: string, _sourceRoot?: string): string {
200
- throw new Error('No branching in dev mode')
201
- }
202
-
203
- getGitExcludePattern(): string {
204
- return '.canopy-meta/'
205
- }
206
-
207
- getPermissionsFilePath(root: string): string {
208
- // Returns: {projectRoot}/.canopy-dev/settings/permissions.json
209
- return path.join(this.getDevConfigRoot(root), 'settings', 'permissions.json')
210
- }
211
-
212
- getGroupsFilePath(root: string): string {
213
- // Returns: {projectRoot}/.canopy-dev/settings/groups.json
214
- return path.join(this.getDevConfigRoot(root), 'settings', 'groups.json')
215
- }
216
-
217
- getRemoteUrlConfig(): import('./types').RemoteUrlConfig {
218
- return {
219
- shouldAutoInitLocal: false,
220
- defaultRemotePath: '',
221
- envVarName: 'CANOPYCMS_REMOTE_URL',
222
- }
223
- }
224
-
225
- requiresExistingRepo(): boolean {
226
- return true // Must have existing repo
227
- }
228
-
229
- getSettingsBranchName(config: {
230
- settingsBranch?: string
231
- deploymentName?: string
232
- defaultBaseBranch?: string
233
- }): string {
234
- // Use main branch for settings in dev (no separate settings branch)
235
- return config.defaultBaseBranch ?? 'main'
236
- }
237
-
238
- getSettingsRoot(sourceRoot?: string): string {
239
- return path.join(this.getDevConfigRoot(sourceRoot), 'settings')
240
- }
241
-
242
- usesSeparateSettingsBranch(): boolean {
243
- return false
244
- }
245
-
246
- validateConfig(_config: Partial<CanopyConfig>): void {
247
- // No special validation for dev
248
- }
249
-
250
- shouldCreateSettingsPR(_config: { autoCreateSettingsPR?: boolean }): boolean {
251
- return false // No GitHub in dev
252
- }
253
- }
254
-
255
- // ============================================================================
256
- // Factory with Memoization
257
- // ============================================================================
258
-
259
- const strategyCache = new Map<OperatingMode, ClientUnsafeStrategy>()
260
-
261
- /**
262
- * Get the full strategy (client-unsafe) for an operating mode.
263
- *
264
- * Strategies are memoized - one instance per mode for the entire process lifetime.
265
- * Safe to call inline: operatingStrategy(mode).getBaseRoot()
266
- *
267
- * Includes all client-safe methods (inherited) plus client-unsafe methods (Node.js APIs).
268
- *
269
- * @param mode - The operating mode
270
- * @returns Full strategy instance with client-unsafe methods
271
- */
272
- export function operatingStrategy(mode: OperatingMode): ClientUnsafeStrategy {
273
- const cached = strategyCache.get(mode)
274
- if (cached) return cached
275
-
276
- let strategy: ClientUnsafeStrategy
277
- switch (mode) {
278
- case 'prod':
279
- strategy = new ProdStrategy()
280
- break
281
- case 'prod-sim':
282
- strategy = new LocalProdSimStrategy()
283
- break
284
- case 'dev':
285
- strategy = new LocalSimpleStrategy()
286
- break
287
- default: {
288
- // Exhaustiveness check - TypeScript will error if a mode is not handled
289
- const _exhaustive: never = mode
290
- throw new Error(`Unknown operating mode: ${_exhaustive}`)
291
- }
292
- }
293
-
294
- strategyCache.set(mode, strategy)
295
- return strategy
296
- }
297
-
298
- /**
299
- * Clear the strategy cache (mainly for testing)
300
- */
301
- export function clearStrategyCache(): void {
302
- strategyCache.clear()
303
- }
@@ -1,13 +0,0 @@
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'
9
- */
10
-
11
- export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy'
12
- export type { ClientSafeStrategy } from './types'
13
- export type { OperatingMode } from './types'
@@ -1,34 +0,0 @@
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
- * const contentRoot = strategy.getContentRoot()
19
- * const branchesRoot = strategy.getContentBranchesRoot() // throws in dev mode
20
- * const branchRoot = strategy.getContentBranchRoot('my-branch') // throws in dev mode
21
- * const settingsRoot = strategy.getSettingsRoot()
22
- * if (strategy.supportsBranching()) { ... } // can also use client-safe methods
23
- */
24
-
25
- // Client-safe factory and strategy (safe for client bundles)
26
- export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy'
27
-
28
- // Client-unsafe factory and strategy (server-side only)
29
- export { operatingStrategy, clearStrategyCache } from './client-unsafe-strategy'
30
-
31
- export type OperatingMode = 'prod' | 'prod-sim' | 'dev'
32
-
33
- // Type exports
34
- export type { ClientSafeStrategy, ClientUnsafeStrategy, ResolveRemoteUrlOptions } from './types'
@@ -1,186 +0,0 @@
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
- */
8
-
9
- import type { OperatingMode as OM } from '.'
10
- import type { CanopyConfig } from '../config'
11
-
12
- // Re-export OperatingMode so it's available from this module
13
- export type OperatingMode = OM
14
-
15
- /**
16
- * Options for resolving git remote URL
17
- */
18
- export interface ResolveRemoteUrlOptions {
19
- mode: OperatingMode
20
- remoteUrl?: string
21
- defaultRemoteUrl?: string
22
- baseBranch?: string
23
- sourceRoot?: string
24
- }
25
-
26
- /**
27
- * Configuration for remote URL resolution
28
- * Strategies return this data; GitManager executes the logic
29
- */
30
- export interface RemoteUrlConfig {
31
- /** Whether to auto-initialize a local remote */
32
- shouldAutoInitLocal: boolean
33
- /** Default path for local remote (e.g., '.canopycms/remote.git') */
34
- defaultRemotePath: string
35
- /** Environment variable name for remote URL */
36
- envVarName: string
37
- /**
38
- * Absolute path to check for auto-detection of a pre-existing local remote.
39
- * If this path exists on disk, it's used as the remote URL (file:// protocol).
40
- * Used in prod mode where the EC2 worker creates remote.git on EFS.
41
- * Unlike shouldAutoInitLocal, this does NOT create the remote — just detects it.
42
- */
43
- autoDetectRemotePath?: string
44
- }
45
-
46
- /**
47
- * Client-Safe Strategy
48
- *
49
- * Methods that can be safely imported in 'use client' React components.
50
- * NO Node.js APIs (fs, path, process, etc.) - only pure logic and simple data.
51
- */
52
- export interface ClientSafeStrategy {
53
- /** The operating mode this strategy represents */
54
- readonly mode: OperatingMode
55
-
56
- // ========================================================================
57
- // UI Feature Flags
58
- // ========================================================================
59
-
60
- /** Whether this mode supports multiple branch workspaces */
61
- supportsBranching(): boolean
62
-
63
- /** Whether to show status badge in UI */
64
- supportsStatusBadge(): boolean
65
-
66
- /** Whether comments/collaboration features are enabled */
67
- supportsComments(): boolean
68
-
69
- /** Whether pull request features are available */
70
- supportsPullRequests(): boolean
71
-
72
- // ========================================================================
73
- // Simple Data Methods (no I/O)
74
- // ========================================================================
75
-
76
- /** Get the permissions file name (e.g., 'permissions.json' or 'permissions.local.json') */
77
- getPermissionsFileName(): string
78
-
79
- /** Get the groups file name (e.g., 'groups.json' or 'groups.local.json') */
80
- getGroupsFileName(): string
81
-
82
- /** Whether git commits should be made in this mode */
83
- shouldCommit(): boolean
84
-
85
- /** Whether git pushes should be made in this mode */
86
- shouldPush(): boolean
87
- }
88
-
89
- /**
90
- * Client-Unsafe Strategy
91
- *
92
- * Full strategy including Node.js APIs. Can only be imported server-side.
93
- * Extends ClientSafeStrategy, so all client-safe methods are available.
94
- */
95
- export interface ClientUnsafeStrategy extends ClientSafeStrategy {
96
- // ========================================================================
97
- // Path Resolution (needs path, process.cwd, env vars)
98
- // ========================================================================
99
-
100
- /**
101
- * Get the content directory path (at project/workspace root).
102
- * - dev/prod-sim: {cwd}/content
103
- * - prod (in workspaces): {workspaceRoot}/content
104
- */
105
- getContentRoot(sourceRoot?: string): string
106
-
107
- /**
108
- * Get the parent directory of all content branch workspaces (contains branches.json and branch directories).
109
- * - prod-sim: {cwd}/.canopy-prod-sim/content-branches
110
- * - prod: $CANOPYCMS_WORKSPACE_ROOT/content-branches or /mnt/efs/workspace/content-branches
111
- * @throws Error in dev mode (no branching)
112
- */
113
- getContentBranchesRoot(sourceRoot?: string): string
114
-
115
- /**
116
- * Get individual content branch workspace directory.
117
- * Returns: {contentBranchesRoot}/{branchName}
118
- * @throws Error in dev mode (no branching)
119
- */
120
- getContentBranchRoot(branchName: string, sourceRoot?: string): string
121
-
122
- /**
123
- * Get the git exclude pattern for runtime metadata (e.g., '.canopy-meta/').
124
- * Used by GitManager to add to .git/info/exclude in content branch workspaces.
125
- */
126
- getGitExcludePattern(): string
127
-
128
- // ========================================================================
129
- // File Paths (needs path.join)
130
- // ========================================================================
131
-
132
- /** Get the full path to the permissions file */
133
- getPermissionsFilePath(root: string): string
134
-
135
- /** Get the full path to the groups file */
136
- getGroupsFilePath(root: string): string
137
-
138
- // ========================================================================
139
- // Git Operations
140
- // ========================================================================
141
-
142
- /** Get configuration for remote URL resolution (GitManager executes the logic) */
143
- getRemoteUrlConfig(): RemoteUrlConfig
144
-
145
- /** Whether this mode requires an existing git repository */
146
- requiresExistingRepo(): boolean
147
-
148
- // ========================================================================
149
- // Settings
150
- // ========================================================================
151
-
152
- /**
153
- * Get the branch name to use for settings (permissions/groups).
154
- * Returns: canopycms-settings-{deploymentName}
155
- */
156
- getSettingsBranchName(config: {
157
- settingsBranch?: string
158
- deploymentName?: string
159
- defaultBaseBranch?: string
160
- }): string
161
-
162
- /**
163
- * Get the root directory for settings storage.
164
- * - prod: $CANOPYCMS_WORKSPACE_ROOT/settings or /mnt/efs/workspace/settings
165
- * - prod-sim: {cwd}/.canopy-prod-sim/settings
166
- * - dev: {cwd}/.canopy-dev/settings
167
- */
168
- getSettingsRoot(sourceRoot?: string): string
169
-
170
- /** Whether settings should be stored in a separate branch */
171
- usesSeparateSettingsBranch(): boolean
172
-
173
- // ========================================================================
174
- // Validation
175
- // ========================================================================
176
-
177
- /** Validate configuration for this mode */
178
- validateConfig(config: Partial<CanopyConfig>): void
179
-
180
- // ========================================================================
181
- // GitHub
182
- // ========================================================================
183
-
184
- /** Whether PRs should be auto-created for permissions/groups changes */
185
- shouldCreateSettingsPR(config: { autoCreateSettingsPR?: boolean }): boolean
186
- }
@@ -1,53 +0,0 @@
1
- import fs from 'node:fs/promises'
2
- import os from 'node:os'
3
- import path from 'node:path'
4
-
5
- import { describe, expect, it } from 'vitest'
6
-
7
- import {
8
- BranchPathError,
9
- ensureBranchRoot,
10
- getDefaultBranchBase,
11
- resolveBranchPath,
12
- } from '../branch'
13
-
14
- describe('paths', () => {
15
- it('resolves prod content branches root from default workspace', () => {
16
- // In prod mode, uses default workspace path (or CANOPYCMS_WORKSPACE_ROOT env var)
17
- // Override parameter is not used in prod mode - workspace comes from env
18
- const base = getDefaultBranchBase('prod')
19
- expect(base).toContain('content-branches')
20
- })
21
-
22
- it('sanitizes branch names and prevents traversal', () => {
23
- expect(() =>
24
- resolveBranchPath({
25
- mode: 'prod-sim',
26
- branchName: '../evil',
27
- }),
28
- ).toThrow(BranchPathError)
29
- })
30
-
31
- it('ensures branch root is created under base in prod-sim', async () => {
32
- const temp = await fs.mkdtemp(path.join(os.tmpdir(), 'canopycms-branches-'))
33
- const { branchRoot, baseRoot } = await ensureBranchRoot({
34
- mode: 'prod-sim',
35
- branchName: 'feature/test',
36
- basePathOverride: temp,
37
- })
38
- const stat = await fs.stat(branchRoot)
39
- expect(stat.isDirectory()).toBe(true)
40
- // baseRoot is now .canopy-prod-sim/content-branches inside the override path
41
- expect(baseRoot).toBe(path.resolve(temp, '.canopy-prod-sim', 'content-branches'))
42
- expect(branchRoot.startsWith(baseRoot)).toBe(true)
43
- })
44
-
45
- it('throws error when using branching functions in dev mode', () => {
46
- expect(() =>
47
- resolveBranchPath({
48
- mode: 'dev',
49
- branchName: 'current',
50
- }),
51
- ).toThrow('No branching in dev mode')
52
- })
53
- })