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.
- package/dist/auth/plugin.d.ts +8 -0
- package/dist/auth/plugin.d.ts.map +1 -1
- package/dist/build-mode.d.ts +15 -5
- package/dist/build-mode.d.ts.map +1 -1
- package/dist/build-mode.js +18 -8
- package/dist/build-mode.js.map +1 -1
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +37 -36
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/template-files/ai-config.ts.template +21 -0
- package/dist/cli/template-files/ai-route.ts.template +10 -0
- package/dist/cli/template-files/canopy.ts.template +24 -0
- package/dist/cli/templates.d.ts +5 -1
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +9 -2
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/schemas/config.d.ts +4 -0
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +2 -0
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config/types.d.ts +5 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/content-reader.js +2 -2
- package/dist/content-reader.js.map +1 -1
- package/dist/context.js +5 -5
- package/dist/context.js.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.js +15 -18
- package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
- package/dist/operating-mode/types.d.ts +8 -0
- package/dist/operating-mode/types.d.ts.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/package.json +5 -4
- package/src/cli/init.ts +43 -38
- package/dist/__integration__/fixtures/content-seeds.d.ts +0 -43
- package/dist/__integration__/fixtures/content-seeds.d.ts.map +0 -1
- package/dist/__integration__/fixtures/content-seeds.js +0 -99
- package/dist/__integration__/fixtures/content-seeds.js.map +0 -1
- package/dist/__integration__/fixtures/schemas.d.ts +0 -12
- package/dist/__integration__/fixtures/schemas.d.ts.map +0 -1
- package/dist/__integration__/fixtures/schemas.js +0 -65
- package/dist/__integration__/fixtures/schemas.js.map +0 -1
- package/dist/__integration__/test-utils/api-client.d.ts +0 -123
- package/dist/__integration__/test-utils/api-client.d.ts.map +0 -1
- package/dist/__integration__/test-utils/api-client.js +0 -118
- package/dist/__integration__/test-utils/api-client.js.map +0 -1
- package/dist/__integration__/test-utils/multi-user.d.ts +0 -25
- package/dist/__integration__/test-utils/multi-user.d.ts.map +0 -1
- package/dist/__integration__/test-utils/multi-user.js +0 -105
- package/dist/__integration__/test-utils/multi-user.js.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.d.ts +0 -25
- package/dist/__integration__/test-utils/test-workspace.d.ts.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.js +0 -102
- package/dist/__integration__/test-utils/test-workspace.js.map +0 -1
- package/dist/editor/BranchManager.stories.d.ts +0 -8
- package/dist/editor/BranchManager.stories.d.ts.map +0 -1
- package/dist/editor/BranchManager.stories.js +0 -74
- package/dist/editor/BranchManager.stories.js.map +0 -1
- package/dist/editor/CanopyEditor.stories.d.ts +0 -7
- package/dist/editor/CanopyEditor.stories.d.ts.map +0 -1
- package/dist/editor/CanopyEditor.stories.js +0 -99
- package/dist/editor/CanopyEditor.stories.js.map +0 -1
- package/dist/editor/CommentsPanel.stories.d.ts +0 -10
- package/dist/editor/CommentsPanel.stories.d.ts.map +0 -1
- package/dist/editor/CommentsPanel.stories.js +0 -175
- package/dist/editor/CommentsPanel.stories.js.map +0 -1
- package/dist/editor/Editor.stories.d.ts +0 -7
- package/dist/editor/Editor.stories.d.ts.map +0 -1
- package/dist/editor/Editor.stories.js +0 -95
- package/dist/editor/Editor.stories.js.map +0 -1
- package/dist/editor/EditorPanes.stories.d.ts +0 -7
- package/dist/editor/EditorPanes.stories.d.ts.map +0 -1
- package/dist/editor/EditorPanes.stories.js +0 -116
- package/dist/editor/EditorPanes.stories.js.map +0 -1
- package/dist/editor/EntryNavigator.stories.d.ts +0 -8
- package/dist/editor/EntryNavigator.stories.d.ts.map +0 -1
- package/dist/editor/EntryNavigator.stories.js +0 -42
- package/dist/editor/EntryNavigator.stories.js.map +0 -1
- package/dist/editor/FormRenderer.stories.d.ts +0 -7
- package/dist/editor/FormRenderer.stories.d.ts.map +0 -1
- package/dist/editor/FormRenderer.stories.js +0 -115
- package/dist/editor/FormRenderer.stories.js.map +0 -1
- package/dist/editor/GroupManager.stories.d.ts +0 -19
- package/dist/editor/GroupManager.stories.d.ts.map +0 -1
- package/dist/editor/GroupManager.stories.js +0 -265
- package/dist/editor/GroupManager.stories.js.map +0 -1
- package/dist/editor/PermissionManager.stories.d.ts +0 -20
- package/dist/editor/PermissionManager.stories.d.ts.map +0 -1
- package/dist/editor/PermissionManager.stories.js +0 -506
- package/dist/editor/PermissionManager.stories.js.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.d.ts +0 -10
- package/dist/editor/comments/FieldWrapper.stories.d.ts.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.js +0 -173
- package/dist/editor/comments/FieldWrapper.stories.js.map +0 -1
- package/dist/editor/fields/BlockField.stories.d.ts +0 -7
- package/dist/editor/fields/BlockField.stories.d.ts.map +0 -1
- package/dist/editor/fields/BlockField.stories.js +0 -50
- package/dist/editor/fields/BlockField.stories.js.map +0 -1
- package/dist/editor/fields/fields.stories.d.ts +0 -8
- package/dist/editor/fields/fields.stories.d.ts.map +0 -1
- package/dist/editor/fields/fields.stories.js +0 -34
- package/dist/editor/fields/fields.stories.js.map +0 -1
- package/dist/test-utils/api-test-helpers.d.ts +0 -238
- package/dist/test-utils/api-test-helpers.d.ts.map +0 -1
- package/dist/test-utils/api-test-helpers.js +0 -347
- package/dist/test-utils/api-test-helpers.js.map +0 -1
- package/dist/test-utils/console-spy.d.ts +0 -56
- package/dist/test-utils/console-spy.d.ts.map +0 -1
- package/dist/test-utils/console-spy.js +0 -81
- package/dist/test-utils/console-spy.js.map +0 -1
- package/dist/test-utils/git-helpers.d.ts +0 -21
- package/dist/test-utils/git-helpers.d.ts.map +0 -1
- package/dist/test-utils/git-helpers.js +0 -23
- package/dist/test-utils/git-helpers.js.map +0 -1
- package/dist/test-utils/index.d.ts +0 -5
- package/dist/test-utils/index.d.ts.map +0 -1
- package/dist/test-utils/index.js +0 -4
- package/dist/test-utils/index.js.map +0 -1
- package/src/__integration__/errors/invalid-content.test.ts +0 -238
- package/src/__integration__/errors/permission-denied.test.ts +0 -220
- package/src/__integration__/fixtures/content-seeds.ts +0 -105
- package/src/__integration__/fixtures/schemas.ts +0 -67
- package/src/__integration__/initialization/prod-sim-init.test.ts +0 -139
- package/src/__integration__/permissions/path-permissions.test.ts +0 -314
- package/src/__integration__/permissions/role-permissions.test.ts +0 -354
- package/src/__integration__/permissions/settings-branch-isolation.test.ts +0 -317
- package/src/__integration__/settings/groups-api.test.ts +0 -403
- package/src/__integration__/test-utils/api-client.ts +0 -167
- package/src/__integration__/test-utils/multi-user.ts +0 -129
- package/src/__integration__/test-utils/test-workspace.ts +0 -130
- package/src/__integration__/user/user-context.test.ts +0 -174
- package/src/__integration__/validation/input-validation.test.ts +0 -166
- package/src/__integration__/workflows/api-editing-workflow.test.ts +0 -244
- package/src/__integration__/workflows/conflict-resolution.test.ts +0 -259
- package/src/__integration__/workflows/editing-workflow.test.ts +0 -205
- package/src/__integration__/workflows/review-workflow.test.ts +0 -260
- package/src/ai/__tests__/build.integration.test.ts +0 -224
- package/src/ai/__tests__/generate.integration.test.ts +0 -495
- package/src/ai/__tests__/handler.integration.test.ts +0 -212
- package/src/ai/__tests__/json-to-markdown.test.ts +0 -553
- package/src/ai/generate.ts +0 -410
- package/src/ai/handler.ts +0 -123
- package/src/ai/index.ts +0 -26
- package/src/ai/json-to-markdown.ts +0 -424
- package/src/ai/resolve-branch.ts +0 -34
- package/src/ai/types.ts +0 -160
- package/src/api/AGENTS.md +0 -81
- package/src/api/__test__/mock-client.ts +0 -404
- package/src/api/assets.test.ts +0 -140
- package/src/api/assets.ts +0 -154
- package/src/api/branch-merge.test.ts +0 -163
- package/src/api/branch-merge.ts +0 -113
- package/src/api/branch-review.test.ts +0 -297
- package/src/api/branch-review.ts +0 -136
- package/src/api/branch-status.test.ts +0 -85
- package/src/api/branch-status.ts +0 -153
- package/src/api/branch-withdraw.test.ts +0 -146
- package/src/api/branch-withdraw.ts +0 -81
- package/src/api/branch-workflow.integration.test.ts +0 -578
- package/src/api/branch.test.ts +0 -620
- package/src/api/branch.ts +0 -492
- package/src/api/client.test.ts +0 -349
- package/src/api/client.ts +0 -506
- package/src/api/comments.test.ts +0 -285
- package/src/api/comments.ts +0 -210
- package/src/api/content.test.ts +0 -345
- package/src/api/content.ts +0 -454
- package/src/api/entries.test.ts +0 -1339
- package/src/api/entries.ts +0 -650
- package/src/api/github-sync.ts +0 -144
- package/src/api/groups.test.ts +0 -1013
- package/src/api/groups.ts +0 -375
- package/src/api/guards.test.ts +0 -533
- package/src/api/guards.ts +0 -271
- package/src/api/index.ts +0 -87
- package/src/api/permissions.test.ts +0 -766
- package/src/api/permissions.ts +0 -334
- package/src/api/reference-options.ts +0 -118
- package/src/api/resolve-references.ts +0 -107
- package/src/api/route-builder.ts +0 -289
- package/src/api/schema.test.ts +0 -840
- package/src/api/schema.ts +0 -936
- package/src/api/security.test.ts +0 -233
- package/src/api/settings-helpers.ts +0 -84
- package/src/api/types.ts +0 -40
- package/src/api/user.test.ts +0 -127
- package/src/api/user.ts +0 -42
- package/src/api/validators.test.ts +0 -275
- package/src/api/validators.ts +0 -176
- package/src/asset-store.test.ts +0 -37
- package/src/asset-store.ts +0 -110
- package/src/auth/cache.ts +0 -7
- package/src/auth/caching-auth-plugin.test.ts +0 -154
- package/src/auth/caching-auth-plugin.ts +0 -109
- package/src/auth/context-helpers.ts +0 -75
- package/src/auth/file-based-auth-cache.test.ts +0 -257
- package/src/auth/file-based-auth-cache.ts +0 -279
- package/src/auth/index.ts +0 -12
- package/src/auth/plugin.ts +0 -51
- package/src/auth/types.ts +0 -38
- package/src/authorization/__tests__/branch.test.ts +0 -260
- package/src/authorization/__tests__/content.test.ts +0 -142
- package/src/authorization/__tests__/path.test.ts +0 -133
- package/src/authorization/__tests__/permissions-loader.test.ts +0 -200
- package/src/authorization/branch.ts +0 -94
- package/src/authorization/content.ts +0 -93
- package/src/authorization/groups/index.ts +0 -11
- package/src/authorization/groups/loader.ts +0 -127
- package/src/authorization/groups/schema.ts +0 -48
- package/src/authorization/helpers.ts +0 -48
- package/src/authorization/index.ts +0 -84
- package/src/authorization/path.ts +0 -112
- package/src/authorization/permissions/index.ts +0 -11
- package/src/authorization/permissions/loader.ts +0 -116
- package/src/authorization/permissions/schema.ts +0 -66
- package/src/authorization/test-utils.ts +0 -15
- package/src/authorization/types.ts +0 -66
- package/src/authorization/validation.test.ts +0 -100
- package/src/authorization/validation.ts +0 -62
- package/src/branch-metadata.test.ts +0 -168
- package/src/branch-metadata.ts +0 -166
- package/src/branch-registry.test.ts +0 -248
- package/src/branch-registry.ts +0 -152
- package/src/branch-schema-cache.test.ts +0 -275
- package/src/branch-schema-cache.ts +0 -189
- package/src/branch-workspace.test.ts +0 -183
- package/src/branch-workspace.ts +0 -124
- package/src/build/generate-ai-content.ts +0 -78
- package/src/build/index.ts +0 -8
- package/src/build-mode.ts +0 -27
- package/src/cli/generate-ai-content.ts +0 -100
- package/src/cli/init.test.ts +0 -240
- package/src/cli/templates/canopy.ts.template +0 -55
- package/src/cli/templates.ts +0 -47
- package/src/client.ts +0 -12
- package/src/comment-store.test.ts +0 -442
- package/src/comment-store.ts +0 -301
- package/src/config/__tests__/config.test.ts +0 -513
- package/src/config/flatten.ts +0 -174
- package/src/config/helpers.ts +0 -167
- package/src/config/index.ts +0 -86
- package/src/config/schemas/collection.ts +0 -67
- package/src/config/schemas/config.ts +0 -77
- package/src/config/schemas/field.ts +0 -108
- package/src/config/schemas/media.ts +0 -27
- package/src/config/schemas/permissions.ts +0 -21
- package/src/config/types.ts +0 -321
- package/src/config/validation.ts +0 -70
- package/src/config-test.ts +0 -65
- package/src/config.ts +0 -11
- package/src/content-id-index.test.ts +0 -512
- package/src/content-id-index.ts +0 -479
- package/src/content-reader.test.ts +0 -478
- package/src/content-reader.ts +0 -214
- package/src/content-store.test.ts +0 -1126
- package/src/content-store.ts +0 -793
- package/src/context.ts +0 -111
- package/src/editor/BranchManager.stories.tsx +0 -80
- package/src/editor/BranchManager.test.tsx +0 -324
- package/src/editor/BranchManager.tsx +0 -461
- package/src/editor/CanopyEditor.stories.tsx +0 -128
- package/src/editor/CanopyEditor.test.tsx +0 -81
- package/src/editor/CanopyEditor.tsx +0 -73
- package/src/editor/CanopyEditorPage.test.tsx +0 -59
- package/src/editor/CanopyEditorPage.tsx +0 -25
- package/src/editor/CommentsPanel.stories.tsx +0 -184
- package/src/editor/CommentsPanel.tsx +0 -338
- package/src/editor/Editor.integration.test.tsx +0 -227
- package/src/editor/Editor.stories.tsx +0 -119
- package/src/editor/Editor.tsx +0 -1221
- package/src/editor/EditorPanes.stories.tsx +0 -256
- package/src/editor/EditorPanes.test.tsx +0 -77
- package/src/editor/EditorPanes.tsx +0 -180
- package/src/editor/EntryNavigator.stories.tsx +0 -65
- package/src/editor/EntryNavigator.test.tsx +0 -598
- package/src/editor/EntryNavigator.tsx +0 -665
- package/src/editor/FormRenderer.stories.tsx +0 -212
- package/src/editor/FormRenderer.test.tsx +0 -194
- package/src/editor/FormRenderer.tsx +0 -432
- package/src/editor/GroupManager.stories.tsx +0 -301
- package/src/editor/GroupManager.test.tsx +0 -682
- package/src/editor/GroupManager.tsx +0 -9
- package/src/editor/PermissionManager.stories.tsx +0 -539
- package/src/editor/PermissionManager.test.tsx +0 -864
- package/src/editor/PermissionManager.tsx +0 -12
- package/src/editor/canopy-path.test.ts +0 -23
- package/src/editor/canopy-path.ts +0 -52
- package/src/editor/client-reference-resolver.ts +0 -118
- package/src/editor/comments/BranchComments.tsx +0 -93
- package/src/editor/comments/EntryComments.tsx +0 -94
- package/src/editor/comments/FieldWrapper.stories.tsx +0 -210
- package/src/editor/comments/FieldWrapper.tsx +0 -129
- package/src/editor/comments/InlineCommentThread.test.tsx +0 -384
- package/src/editor/comments/InlineCommentThread.tsx +0 -246
- package/src/editor/comments/ThreadCarousel.test.tsx +0 -393
- package/src/editor/comments/ThreadCarousel.tsx +0 -525
- package/src/editor/components/ConfirmDeleteModal.tsx +0 -49
- package/src/editor/components/EditorContext.tsx +0 -49
- package/src/editor/components/EditorFooter.tsx +0 -47
- package/src/editor/components/EditorHeader.tsx +0 -492
- package/src/editor/components/EditorSidebar.tsx +0 -193
- package/src/editor/components/EntryCreateModal.tsx +0 -193
- package/src/editor/components/RenameEntryModal.tsx +0 -152
- package/src/editor/components/UserBadge.test.tsx +0 -274
- package/src/editor/components/UserBadge.tsx +0 -240
- package/src/editor/components/index.ts +0 -6
- package/src/editor/context/ApiClientContext.tsx +0 -56
- package/src/editor/context/EditorStateContext.tsx +0 -221
- package/src/editor/context/index.ts +0 -40
- package/src/editor/editor-config.test.ts +0 -385
- package/src/editor/editor-config.ts +0 -94
- package/src/editor/editor-utils.test.ts +0 -772
- package/src/editor/editor-utils.ts +0 -303
- package/src/editor/env.ts +0 -4
- package/src/editor/fields/BlockField.stories.tsx +0 -79
- package/src/editor/fields/BlockField.tsx +0 -267
- package/src/editor/fields/CodeField.tsx +0 -41
- package/src/editor/fields/MarkdownField.tsx +0 -205
- package/src/editor/fields/ObjectField.tsx +0 -71
- package/src/editor/fields/ReferenceField.tsx +0 -138
- package/src/editor/fields/SelectField.tsx +0 -76
- package/src/editor/fields/TextField.tsx +0 -35
- package/src/editor/fields/ToggleField.tsx +0 -37
- package/src/editor/fields/fields.stories.tsx +0 -40
- package/src/editor/group-manager/ExternalGroupsTab.tsx +0 -114
- package/src/editor/group-manager/GroupCard.tsx +0 -102
- package/src/editor/group-manager/GroupForm.tsx +0 -66
- package/src/editor/group-manager/InternalGroupsTab.tsx +0 -147
- package/src/editor/group-manager/MemberList.tsx +0 -184
- package/src/editor/group-manager/hooks/useExternalGroupSearch.ts +0 -63
- package/src/editor/group-manager/hooks/useGroupState.ts +0 -134
- package/src/editor/group-manager/hooks/useUserSearch.ts +0 -84
- package/src/editor/group-manager/index.tsx +0 -210
- package/src/editor/group-manager/types.ts +0 -28
- package/src/editor/hooks/README.md +0 -26
- package/src/editor/hooks/__test__/test-utils.tsx +0 -183
- package/src/editor/hooks/index.ts +0 -23
- package/src/editor/hooks/useBranchActions.test.tsx +0 -267
- package/src/editor/hooks/useBranchActions.tsx +0 -121
- package/src/editor/hooks/useBranchManager.test.tsx +0 -391
- package/src/editor/hooks/useBranchManager.tsx +0 -326
- package/src/editor/hooks/useCommentSystem.test.ts +0 -615
- package/src/editor/hooks/useCommentSystem.ts +0 -347
- package/src/editor/hooks/useDraftManager.test.ts +0 -375
- package/src/editor/hooks/useDraftManager.ts +0 -259
- package/src/editor/hooks/useEditorLayout.test.ts +0 -147
- package/src/editor/hooks/useEditorLayout.ts +0 -67
- package/src/editor/hooks/useEntryManager.test.ts +0 -588
- package/src/editor/hooks/useEntryManager.ts +0 -387
- package/src/editor/hooks/useGroupManager.test.ts +0 -277
- package/src/editor/hooks/useGroupManager.ts +0 -139
- package/src/editor/hooks/usePermissionManager.test.ts +0 -211
- package/src/editor/hooks/usePermissionManager.ts +0 -113
- package/src/editor/hooks/useReferenceResolution.ts +0 -248
- package/src/editor/hooks/useSchemaManager.test.ts +0 -370
- package/src/editor/hooks/useSchemaManager.ts +0 -310
- package/src/editor/hooks/useUserContext.tsx +0 -57
- package/src/editor/hooks/useUserMetadata.test.ts +0 -191
- package/src/editor/hooks/useUserMetadata.ts +0 -71
- package/src/editor/permission-manager/GroupSelector.tsx +0 -73
- package/src/editor/permission-manager/PermissionEditor.tsx +0 -321
- package/src/editor/permission-manager/PermissionLevelBadge.tsx +0 -53
- package/src/editor/permission-manager/PermissionTree.tsx +0 -237
- package/src/editor/permission-manager/UserSelector.tsx +0 -95
- package/src/editor/permission-manager/constants.tsx +0 -18
- package/src/editor/permission-manager/hooks/useGroupsAndUsers.ts +0 -153
- package/src/editor/permission-manager/hooks/usePermissionTree.ts +0 -200
- package/src/editor/permission-manager/index.tsx +0 -294
- package/src/editor/permission-manager/types.ts +0 -58
- package/src/editor/permission-manager/utils.ts +0 -179
- package/src/editor/preview-bridge.test.tsx +0 -50
- package/src/editor/preview-bridge.tsx +0 -294
- package/src/editor/schema-editor/CollectionEditor.test.tsx +0 -238
- package/src/editor/schema-editor/CollectionEditor.tsx +0 -520
- package/src/editor/schema-editor/EntryTypeEditor.test.tsx +0 -215
- package/src/editor/schema-editor/EntryTypeEditor.tsx +0 -367
- package/src/editor/schema-editor/index.ts +0 -19
- package/src/editor/setup-test-dom.ts +0 -10
- package/src/editor/test-setup.ts +0 -33
- package/src/editor/theme.tsx +0 -119
- package/src/editor/utils/env.ts +0 -39
- package/src/entry-schema-registry.test.ts +0 -281
- package/src/entry-schema-registry.ts +0 -121
- package/src/entry-schema.ts +0 -84
- package/src/git-manager.test.ts +0 -552
- package/src/git-manager.ts +0 -667
- package/src/github-service.test.ts +0 -312
- package/src/github-service.ts +0 -295
- package/src/http/handler.test.ts +0 -275
- package/src/http/handler.ts +0 -280
- package/src/http/index.ts +0 -11
- package/src/http/router.ts +0 -164
- package/src/http/types.ts +0 -44
- package/src/id.test.ts +0 -48
- package/src/id.ts +0 -22
- package/src/index.ts +0 -26
- package/src/operating-mode/__tests__/strategies.test.ts +0 -511
- package/src/operating-mode/client-safe-strategy.ts +0 -184
- package/src/operating-mode/client-unsafe-strategy.ts +0 -303
- package/src/operating-mode/client.ts +0 -13
- package/src/operating-mode/index.ts +0 -34
- package/src/operating-mode/types.ts +0 -186
- package/src/paths/__tests__/branch.test.ts +0 -53
- package/src/paths/__tests__/normalize.test.ts +0 -141
- package/src/paths/__tests__/resolve.test.ts +0 -207
- package/src/paths/__tests__/validation.test.ts +0 -61
- package/src/paths/branch.ts +0 -115
- package/src/paths/index.ts +0 -73
- package/src/paths/normalize-server.ts +0 -40
- package/src/paths/normalize.ts +0 -107
- package/src/paths/resolve.ts +0 -61
- package/src/paths/test-utils.ts +0 -37
- package/src/paths/types.ts +0 -68
- package/src/paths/validation.test.ts +0 -480
- package/src/paths/validation.ts +0 -391
- package/src/reference-resolver.test.ts +0 -107
- package/src/reference-resolver.ts +0 -157
- package/src/schema/index.ts +0 -29
- package/src/schema/meta-loader.ts +0 -366
- package/src/schema/resolver.ts +0 -83
- package/src/schema/schema-store-types.ts +0 -56
- package/src/schema/schema-store.test.ts +0 -816
- package/src/schema/schema-store.ts +0 -795
- package/src/schema/types.ts +0 -33
- package/src/schema-meta-loader.test.ts +0 -447
- package/src/server.ts +0 -15
- package/src/services.test.ts +0 -559
- package/src/services.ts +0 -373
- package/src/settings-branch-utils.ts +0 -53
- package/src/settings-workspace.ts +0 -156
- package/src/task-queue/README.md +0 -144
- package/src/task-queue/index.ts +0 -14
- package/src/task-queue/task-queue.test.ts +0 -524
- package/src/task-queue/task-queue.ts +0 -514
- package/src/task-queue/types.ts +0 -41
- package/src/test-utils/api-test-helpers.ts +0 -445
- package/src/test-utils/console-spy.test.ts +0 -14
- package/src/test-utils/console-spy.ts +0 -125
- package/src/test-utils/git-helpers.ts +0 -31
- package/src/test-utils/index.ts +0 -4
- package/src/types.ts +0 -54
- package/src/user.ts +0 -118
- package/src/utils/debug.test.ts +0 -114
- package/src/utils/debug.ts +0 -127
- package/src/utils/error.test.ts +0 -92
- package/src/utils/error.ts +0 -83
- package/src/utils/format.ts +0 -12
- package/src/validation/__tests__/field-traversal.test.ts +0 -263
- package/src/validation/deletion-checker.ts +0 -234
- package/src/validation/field-traversal.ts +0 -146
- package/src/validation/reference-validator.ts +0 -168
- package/src/worker/cms-worker-rebase.test.ts +0 -473
- package/src/worker/cms-worker.ts +0 -777
- package/src/worker/integration.test.ts +0 -289
- package/src/worker/task-queue-config.ts +0 -25
- package/src/worker/task-queue.test.ts +0 -452
- package/src/worker/task-queue.ts +0 -58
- /package/{src/cli/templates → dist/cli/template-files}/Dockerfile.cms.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/canopycms.config.ts.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/deploy-cms.yml.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/edit-page.tsx.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/route.ts.template +0 -0
- /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
|
-
})
|