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
package/src/api/branch.ts
DELETED
|
@@ -1,492 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises'
|
|
2
|
-
import path from 'node:path'
|
|
3
|
-
import { z } from 'zod'
|
|
4
|
-
|
|
5
|
-
import type { BranchAccessControl, BranchContext, BranchMetadata } from '../types'
|
|
6
|
-
import { BranchWorkspaceManager } from '../branch-workspace'
|
|
7
|
-
import { getBranchMetadataFileManager } from '../branch-metadata'
|
|
8
|
-
import type { ApiContext, ApiRequest, ApiResponse } from './types'
|
|
9
|
-
import { defineEndpoint } from './route-builder'
|
|
10
|
-
import { createDebugLogger } from '../utils/debug'
|
|
11
|
-
import { clientOperatingStrategy } from '../operating-mode'
|
|
12
|
-
import { isNotFoundError, getErrorMessage } from '../utils/error'
|
|
13
|
-
import { branchNameSchema } from './validators'
|
|
14
|
-
|
|
15
|
-
const log = createDebugLogger({ prefix: 'BranchAPI' })
|
|
16
|
-
|
|
17
|
-
/** Response type for single branch operations (create, update, status) */
|
|
18
|
-
export type BranchResponse = ApiResponse<{ branch: BranchMetadata }>
|
|
19
|
-
|
|
20
|
-
/** Response type for listing branches */
|
|
21
|
-
export type BranchListResponse = ApiResponse<{ branches: BranchMetadata[] }>
|
|
22
|
-
|
|
23
|
-
/** Response type for branch deletion */
|
|
24
|
-
export type BranchDeleteResponse = ApiResponse<{ deleted: boolean }>
|
|
25
|
-
|
|
26
|
-
// ============================================================================
|
|
27
|
-
// Zod Schemas for Validation
|
|
28
|
-
// ============================================================================
|
|
29
|
-
|
|
30
|
-
const branchParamSchema = z.object({
|
|
31
|
-
branch: branchNameSchema,
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
const createBranchBodySchema = z.object({
|
|
35
|
-
branch: branchNameSchema,
|
|
36
|
-
title: z.string().optional(),
|
|
37
|
-
description: z.string().optional(),
|
|
38
|
-
access: z
|
|
39
|
-
.object({
|
|
40
|
-
allowedUsers: z.array(z.string()).optional(),
|
|
41
|
-
allowedGroups: z.array(z.string()).optional(),
|
|
42
|
-
})
|
|
43
|
-
.optional(),
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
const updateBranchAccessBodySchema = z.object({
|
|
47
|
-
allowedUsers: z.array(z.string()).optional(),
|
|
48
|
-
allowedGroups: z.array(z.string()).optional(),
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
import { isPrivileged, isAdmin, loadPathPermissions } from '../authorization'
|
|
52
|
-
import type { PathPermission } from '../config'
|
|
53
|
-
import type { CanopyUser } from '../user'
|
|
54
|
-
import { operatingStrategy } from '../operating-mode'
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Check if a user can create branches.
|
|
58
|
-
* Returns true if:
|
|
59
|
-
* - User is Admin or Reviewer (privileged)
|
|
60
|
-
* - User has edit access to at least one path via pathPermissions rules
|
|
61
|
-
* - No path permissions are defined (open access)
|
|
62
|
-
*/
|
|
63
|
-
export const canCreateBranch = (
|
|
64
|
-
user: CanopyUser,
|
|
65
|
-
pathPermissions: PathPermission[],
|
|
66
|
-
): { allowed: boolean; reason: string } => {
|
|
67
|
-
// Admins and Reviewers can always create branches
|
|
68
|
-
if (isPrivileged(user.groups)) {
|
|
69
|
-
return { allowed: true, reason: 'privileged_user' }
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// If no path permissions defined, anyone can create branches
|
|
73
|
-
if (pathPermissions.length === 0) {
|
|
74
|
-
return { allowed: true, reason: 'no_restrictions' }
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Check if user has edit access to at least one path rule
|
|
78
|
-
for (const rule of pathPermissions) {
|
|
79
|
-
const editTarget = rule.edit
|
|
80
|
-
if (!editTarget) continue
|
|
81
|
-
|
|
82
|
-
// Check if rule has no user/group constraints (open to all)
|
|
83
|
-
const hasUserConstraint = !!editTarget.allowedUsers?.length
|
|
84
|
-
const hasGroupConstraint = !!editTarget.allowedGroups?.length
|
|
85
|
-
if (!hasUserConstraint && !hasGroupConstraint) {
|
|
86
|
-
return { allowed: true, reason: 'open_path_rule' }
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Check if user matches the rule
|
|
90
|
-
const matchesUser = hasUserConstraint && editTarget.allowedUsers?.includes(user.userId)
|
|
91
|
-
const matchesGroup =
|
|
92
|
-
hasGroupConstraint && user.groups?.some((gid) => editTarget.allowedGroups?.includes(gid))
|
|
93
|
-
|
|
94
|
-
if (matchesUser || matchesGroup) {
|
|
95
|
-
return { allowed: true, reason: 'path_access' }
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return { allowed: false, reason: 'no_path_access' }
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export interface CreateBranchBody {
|
|
103
|
-
branch: string
|
|
104
|
-
title?: string
|
|
105
|
-
description?: string
|
|
106
|
-
access?: BranchMetadata['access']
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export const createBranchHandler = async (
|
|
110
|
-
ctx: ApiContext,
|
|
111
|
-
req: ApiRequest,
|
|
112
|
-
body: z.infer<typeof createBranchBodySchema>,
|
|
113
|
-
): Promise<BranchResponse> => {
|
|
114
|
-
return log.timed('api', 'createBranch', async () => {
|
|
115
|
-
const branchName = body.branch
|
|
116
|
-
log.debug('api', 'Create branch request', {
|
|
117
|
-
branchName,
|
|
118
|
-
userId: req.user.userId,
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
// Prevent git branch name collision with settings branch
|
|
122
|
-
// Settings live in separate directory but share same git remote
|
|
123
|
-
const strategy = operatingStrategy(ctx.services.config.mode)
|
|
124
|
-
if (strategy.usesSeparateSettingsBranch()) {
|
|
125
|
-
const settingsBranchName = strategy.getSettingsBranchName(ctx.services.config)
|
|
126
|
-
if (branchName === settingsBranchName) {
|
|
127
|
-
return {
|
|
128
|
-
ok: false,
|
|
129
|
-
status: 400,
|
|
130
|
-
error:
|
|
131
|
-
'Cannot create content branch with settings branch name (git branch name collision)',
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Load path permissions from the main branch's JSON file
|
|
137
|
-
const mainBranch = ctx.services.config.defaultBaseBranch ?? 'main'
|
|
138
|
-
const mainBranchContext = await ctx.getBranchContext(mainBranch)
|
|
139
|
-
|
|
140
|
-
let pathPermissions: PathPermission[] = []
|
|
141
|
-
if (mainBranchContext) {
|
|
142
|
-
const operatingMode = ctx.services.config.mode
|
|
143
|
-
pathPermissions = await loadPathPermissions(mainBranchContext.branchRoot, operatingMode)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Check if user can create branches
|
|
147
|
-
const canCreate = canCreateBranch(req.user, pathPermissions)
|
|
148
|
-
if (!canCreate.allowed) {
|
|
149
|
-
log.debug('api', 'Permission denied', { reason: canCreate.reason })
|
|
150
|
-
return {
|
|
151
|
-
ok: false,
|
|
152
|
-
status: 403,
|
|
153
|
-
error: 'You do not have permission to create branches',
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const manager = new BranchWorkspaceManager(ctx.services.config)
|
|
158
|
-
const operatingMode = ctx.services.config.mode
|
|
159
|
-
const context = await manager.openOrCreateBranch({
|
|
160
|
-
branchName,
|
|
161
|
-
mode: operatingMode,
|
|
162
|
-
createdBy: req.user.userId,
|
|
163
|
-
title: body.title,
|
|
164
|
-
description: body.description,
|
|
165
|
-
access: body.access,
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
log.debug('api', 'Branch created', { branchName: context.branch.name })
|
|
169
|
-
return { ok: true, status: 200, data: { branch: context.branch } }
|
|
170
|
-
})
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
export const listBranchesHandler = async (
|
|
174
|
-
ctx: ApiContext,
|
|
175
|
-
req: ApiRequest,
|
|
176
|
-
): Promise<BranchListResponse> => {
|
|
177
|
-
if (!ctx.services.registry) {
|
|
178
|
-
return {
|
|
179
|
-
ok: false,
|
|
180
|
-
status: 400,
|
|
181
|
-
error: 'Branch operations not available in dev mode',
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const allBranches = await ctx.services.registry.list()
|
|
186
|
-
|
|
187
|
-
// Admins and Reviewers see all branches
|
|
188
|
-
if (isPrivileged(req.user.groups)) {
|
|
189
|
-
return {
|
|
190
|
-
ok: true,
|
|
191
|
-
status: 200,
|
|
192
|
-
data: { branches: allBranches.map((c) => c.branch) },
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Regular users only see branches they created or have explicit access to
|
|
197
|
-
const visibleBranches = allBranches.filter((context) => {
|
|
198
|
-
const branch = context.branch
|
|
199
|
-
// User created the branch
|
|
200
|
-
if (branch.createdBy === req.user.userId) {
|
|
201
|
-
return true
|
|
202
|
-
}
|
|
203
|
-
// User is in allowedUsers
|
|
204
|
-
if (branch.access?.allowedUsers?.includes(req.user.userId)) {
|
|
205
|
-
return true
|
|
206
|
-
}
|
|
207
|
-
// User's group is in allowedGroups
|
|
208
|
-
if (
|
|
209
|
-
branch.access?.allowedGroups?.some((groupId) =>
|
|
210
|
-
(req.user.groups as readonly string[])?.includes(groupId),
|
|
211
|
-
)
|
|
212
|
-
) {
|
|
213
|
-
return true
|
|
214
|
-
}
|
|
215
|
-
return false
|
|
216
|
-
})
|
|
217
|
-
|
|
218
|
-
return {
|
|
219
|
-
ok: true,
|
|
220
|
-
status: 200,
|
|
221
|
-
data: { branches: visibleBranches.map((c) => c.branch) },
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Check if a user can delete a specific branch.
|
|
227
|
-
* Returns true if user is Admin or the branch creator.
|
|
228
|
-
*/
|
|
229
|
-
export const canDeleteBranch = (
|
|
230
|
-
user: CanopyUser,
|
|
231
|
-
branchContext: BranchContext,
|
|
232
|
-
): { allowed: boolean; reason: string } => {
|
|
233
|
-
// Admins can delete any branch
|
|
234
|
-
if (isAdmin(user.groups)) {
|
|
235
|
-
return { allowed: true, reason: 'admin' }
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Branch creator can delete their own branch
|
|
239
|
-
if (branchContext.branch.createdBy === user.userId) {
|
|
240
|
-
return { allowed: true, reason: 'creator' }
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
return { allowed: false, reason: 'not_authorized' }
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
export const deleteBranchHandler = async (
|
|
247
|
-
ctx: ApiContext,
|
|
248
|
-
req: ApiRequest,
|
|
249
|
-
params: z.infer<typeof branchParamSchema>,
|
|
250
|
-
): Promise<BranchDeleteResponse> => {
|
|
251
|
-
const branchName = params.branch
|
|
252
|
-
|
|
253
|
-
// Disallow delete in modes that don't support branching (branch = developer's git checkout)
|
|
254
|
-
const operatingMode = ctx.services.config.mode
|
|
255
|
-
if (!clientOperatingStrategy(operatingMode).supportsBranching()) {
|
|
256
|
-
return {
|
|
257
|
-
ok: false,
|
|
258
|
-
status: 400,
|
|
259
|
-
error: 'Cannot delete branches in this operating mode',
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Get branch context
|
|
264
|
-
const branchContext = await ctx.getBranchContext(branchName)
|
|
265
|
-
if (!branchContext) {
|
|
266
|
-
return { ok: false, status: 404, error: 'Branch not found' }
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Check permission
|
|
270
|
-
const canDelete = canDeleteBranch(req.user, branchContext)
|
|
271
|
-
if (!canDelete.allowed) {
|
|
272
|
-
return {
|
|
273
|
-
ok: false,
|
|
274
|
-
status: 403,
|
|
275
|
-
error: 'You do not have permission to delete this branch',
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Block deletion if branch has open PR (submitted status)
|
|
280
|
-
if (branchContext.branch.status === 'submitted') {
|
|
281
|
-
return {
|
|
282
|
-
ok: false,
|
|
283
|
-
status: 400,
|
|
284
|
-
error: 'Cannot delete branch with open pull request',
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Delete branch metadata file so it disappears from registry scans
|
|
289
|
-
const metadataFile = path.join(branchContext.branchRoot, '.canopy-meta', 'branch.json')
|
|
290
|
-
try {
|
|
291
|
-
await fs.unlink(metadataFile)
|
|
292
|
-
} catch (err: unknown) {
|
|
293
|
-
if (!isNotFoundError(err)) {
|
|
294
|
-
console.error(
|
|
295
|
-
`CanopyCMS: Failed to delete branch metadata for ${branchName}:`,
|
|
296
|
-
getErrorMessage(err),
|
|
297
|
-
)
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// In multi-branch modes, also delete the entire branch directory
|
|
302
|
-
if (branchContext.branchRoot !== branchContext.baseRoot) {
|
|
303
|
-
try {
|
|
304
|
-
await fs.rm(branchContext.branchRoot, { recursive: true, force: true })
|
|
305
|
-
} catch (err: unknown) {
|
|
306
|
-
console.error(
|
|
307
|
-
`CanopyCMS: Failed to delete branch directory for ${branchName}:`,
|
|
308
|
-
getErrorMessage(err),
|
|
309
|
-
)
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// Invalidate registry cache so next list() will regenerate without this branch
|
|
314
|
-
if (!ctx.services.registry) {
|
|
315
|
-
return {
|
|
316
|
-
ok: false,
|
|
317
|
-
status: 400,
|
|
318
|
-
error: 'Branch operations not available in dev mode',
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
await ctx.services.registry.invalidate()
|
|
322
|
-
|
|
323
|
-
return { ok: true, status: 200, data: { deleted: true } }
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
export interface UpdateBranchAccessBody {
|
|
327
|
-
allowedUsers?: string[]
|
|
328
|
-
allowedGroups?: string[]
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Check if a user can modify branch access.
|
|
333
|
-
* Returns true if user is Admin or the branch creator.
|
|
334
|
-
*/
|
|
335
|
-
export const canModifyBranchAccess = (
|
|
336
|
-
user: CanopyUser,
|
|
337
|
-
branchContext: BranchContext,
|
|
338
|
-
): { allowed: boolean; reason: string } => {
|
|
339
|
-
// Admins can modify any branch
|
|
340
|
-
if (isAdmin(user.groups)) {
|
|
341
|
-
return { allowed: true, reason: 'admin' }
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// Branch creator can modify their own branch
|
|
345
|
-
if (branchContext.branch.createdBy === user.userId) {
|
|
346
|
-
return { allowed: true, reason: 'creator' }
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
return { allowed: false, reason: 'not_authorized' }
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
export const updateBranchAccessHandler = async (
|
|
353
|
-
ctx: ApiContext,
|
|
354
|
-
req: ApiRequest,
|
|
355
|
-
params: z.infer<typeof branchParamSchema>,
|
|
356
|
-
body: z.infer<typeof updateBranchAccessBodySchema>,
|
|
357
|
-
): Promise<BranchResponse> => {
|
|
358
|
-
const branchName = params.branch
|
|
359
|
-
|
|
360
|
-
// Get branch context
|
|
361
|
-
const branchContext = await ctx.getBranchContext(branchName)
|
|
362
|
-
if (!branchContext) {
|
|
363
|
-
return { ok: false, status: 404, error: 'Branch not found' }
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
// Check permission
|
|
367
|
-
const canModify = canModifyBranchAccess(req.user, branchContext)
|
|
368
|
-
if (!canModify.allowed) {
|
|
369
|
-
return {
|
|
370
|
-
ok: false,
|
|
371
|
-
status: 403,
|
|
372
|
-
error: 'You do not have permission to modify this branch',
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
// Build new access control
|
|
377
|
-
const newAccess: BranchAccessControl = {
|
|
378
|
-
...branchContext.branch.access,
|
|
379
|
-
}
|
|
380
|
-
if (body.allowedUsers !== undefined) {
|
|
381
|
-
newAccess.allowedUsers = body.allowedUsers
|
|
382
|
-
}
|
|
383
|
-
if (body.allowedGroups !== undefined) {
|
|
384
|
-
newAccess.allowedGroups = body.allowedGroups
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Update metadata (automatically invalidates registry cache)
|
|
388
|
-
const metadata = getBranchMetadataFileManager(branchContext.branchRoot, branchContext.baseRoot)
|
|
389
|
-
const updated = await metadata.save({
|
|
390
|
-
branch: { access: newAccess },
|
|
391
|
-
})
|
|
392
|
-
|
|
393
|
-
return { ok: true, status: 200, data: { branch: updated.branch } }
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// ============================================================================
|
|
397
|
-
// Route Definitions with defineEndpoint
|
|
398
|
-
// ============================================================================
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* List all branches visible to current user
|
|
402
|
-
* GET /branches
|
|
403
|
-
*/
|
|
404
|
-
const listBranches = defineEndpoint({
|
|
405
|
-
namespace: 'branches',
|
|
406
|
-
name: 'list',
|
|
407
|
-
method: 'GET',
|
|
408
|
-
path: '/branches',
|
|
409
|
-
responseType: 'BranchListResponse',
|
|
410
|
-
response: {} as BranchListResponse,
|
|
411
|
-
defaultMockData: { branches: [] },
|
|
412
|
-
handler: listBranchesHandler,
|
|
413
|
-
})
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* Create a new branch
|
|
417
|
-
* POST /branches
|
|
418
|
-
*/
|
|
419
|
-
const createBranch = defineEndpoint({
|
|
420
|
-
namespace: 'branches',
|
|
421
|
-
name: 'create',
|
|
422
|
-
method: 'POST',
|
|
423
|
-
path: '/branches',
|
|
424
|
-
body: createBranchBodySchema,
|
|
425
|
-
bodyType: 'CreateBranchBody',
|
|
426
|
-
responseType: 'BranchResponse',
|
|
427
|
-
response: {} as BranchResponse,
|
|
428
|
-
defaultMockData: {
|
|
429
|
-
branch: {
|
|
430
|
-
name: 'test-branch',
|
|
431
|
-
status: 'editing',
|
|
432
|
-
access: {},
|
|
433
|
-
createdBy: 'user-1',
|
|
434
|
-
createdAt: '2024-01-01',
|
|
435
|
-
updatedAt: '2024-01-01',
|
|
436
|
-
},
|
|
437
|
-
},
|
|
438
|
-
handler: createBranchHandler,
|
|
439
|
-
})
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* Delete a branch
|
|
443
|
-
* DELETE /:branch
|
|
444
|
-
*/
|
|
445
|
-
const deleteBranch = defineEndpoint({
|
|
446
|
-
namespace: 'branches',
|
|
447
|
-
name: 'delete',
|
|
448
|
-
method: 'DELETE',
|
|
449
|
-
path: '/:branch',
|
|
450
|
-
params: branchParamSchema,
|
|
451
|
-
responseType: 'BranchDeleteResponse',
|
|
452
|
-
response: {} as BranchDeleteResponse,
|
|
453
|
-
defaultMockData: { deleted: true },
|
|
454
|
-
handler: deleteBranchHandler,
|
|
455
|
-
})
|
|
456
|
-
|
|
457
|
-
/**
|
|
458
|
-
* Update branch access control
|
|
459
|
-
* PATCH /:branch/access
|
|
460
|
-
*/
|
|
461
|
-
const updateBranchAccess = defineEndpoint({
|
|
462
|
-
namespace: 'branches',
|
|
463
|
-
name: 'updateAccess',
|
|
464
|
-
method: 'PATCH',
|
|
465
|
-
path: '/:branch/access',
|
|
466
|
-
params: branchParamSchema,
|
|
467
|
-
body: updateBranchAccessBodySchema,
|
|
468
|
-
bodyType: 'UpdateBranchAccessBody',
|
|
469
|
-
responseType: 'BranchResponse',
|
|
470
|
-
response: {} as BranchResponse,
|
|
471
|
-
defaultMockData: {
|
|
472
|
-
branch: {
|
|
473
|
-
name: 'test-branch',
|
|
474
|
-
status: 'editing',
|
|
475
|
-
access: {},
|
|
476
|
-
createdBy: 'user-1',
|
|
477
|
-
createdAt: '2024-01-01',
|
|
478
|
-
updatedAt: '2024-01-01',
|
|
479
|
-
},
|
|
480
|
-
},
|
|
481
|
-
handler: updateBranchAccessHandler,
|
|
482
|
-
})
|
|
483
|
-
|
|
484
|
-
/**
|
|
485
|
-
* Exported routes for router registration
|
|
486
|
-
*/
|
|
487
|
-
export const BRANCH_ROUTES = {
|
|
488
|
-
list: listBranches,
|
|
489
|
-
create: createBranch,
|
|
490
|
-
delete: deleteBranch,
|
|
491
|
-
updateAccess: updateBranchAccess,
|
|
492
|
-
} as const
|