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,404 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mock API client for testing hooks and components.
|
|
3
|
-
*
|
|
4
|
-
* AUTO-GENERATED by scripts/generate-client.ts
|
|
5
|
-
* Do not edit this file manually - changes will be overwritten.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { vi, type Mock } from 'vitest'
|
|
9
|
-
import type { CanopyApiClient } from '../client'
|
|
10
|
-
import type { ApiResponse } from '../types'
|
|
11
|
-
import { createLogicalPath, createPhysicalPath } from '../../paths'
|
|
12
|
-
import type { ContentId } from '../../paths'
|
|
13
|
-
import type { BranchDeleteResponse, BranchListResponse, BranchResponse, CreateBranchBody, UpdateBranchAccessBody } from '../branch'
|
|
14
|
-
import type { BranchMergeResponse } from '../branch-status'
|
|
15
|
-
import type { RequestChangesBody } from '../branch-review'
|
|
16
|
-
import type { AddCommentBody, AddCommentResponse, CommentsResponse, ResolveCommentResponse } from '../comments'
|
|
17
|
-
import type { ContentReadResponse, ContentWriteResponse, ReferenceValidationResponse, RenameEntryBody, RenameEntryResponse, ValidateReferencesBody, WriteContentBody } from '../content'
|
|
18
|
-
import type { ReferenceOptionsResponse } from '../reference-options'
|
|
19
|
-
import type { ResolveReferencesBody, ResolveReferencesResponse } from '../resolve-references'
|
|
20
|
-
import type { DeleteEntryResponse, EntriesResponse } from '../entries'
|
|
21
|
-
import type { AssetDeleteResponse, AssetUploadResponse, AssetsListResponse, UploadAssetBody } from '../assets'
|
|
22
|
-
import type { GetUserMetadataResponse, ListGroupsResponse, PermissionsResponse, SearchUsersResponse, UpdatePermissionsBody } from '../permissions'
|
|
23
|
-
import type { ExternalGroupsResponse, InternalGroupsResponse, UpdateInternalGroupsBody, UpdateInternalGroupsResponse } from '../groups'
|
|
24
|
-
import type { UserInfoResponse } from '../user'
|
|
25
|
-
import type { AddEntryTypeApiResponse, CreateCollectionApiResponse, DeleteCollectionApiResponse, GetCollectionApiResponse, GetSchemaApiResponse, InvalidateSchemaCacheApiResponse, RemoveEntryTypeApiResponse, UpdateCollectionApiResponse, UpdateEntryTypeApiResponse, UpdateOrderApiResponse, UpdateOrderBody } from '../schema'
|
|
26
|
-
import type { CreateCollectionInput, CreateEntryTypeInput, UpdateCollectionInput, UpdateEntryTypeInput } from '../../schema/schema-store-types'
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Type utility to convert CanopyApiClient methods to Vitest mocks.
|
|
30
|
-
*/
|
|
31
|
-
export type MockApiClient = {
|
|
32
|
-
[K in keyof CanopyApiClient]: CanopyApiClient[K] extends Record<string, any>
|
|
33
|
-
? {
|
|
34
|
-
[M in keyof CanopyApiClient[K]]: CanopyApiClient[K][M] extends (...args: infer Args) => infer Return
|
|
35
|
-
? Mock<Args, Return>
|
|
36
|
-
: never
|
|
37
|
-
}
|
|
38
|
-
: never
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Create a mock API client with all methods as vi.fn().
|
|
43
|
-
*/
|
|
44
|
-
export function createMockApiClient(): MockApiClient {
|
|
45
|
-
return {
|
|
46
|
-
branches: {
|
|
47
|
-
list: vi.fn().mockResolvedValue(mockSuccess({"branches":[]})),
|
|
48
|
-
create: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"editing","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})),
|
|
49
|
-
delete: vi.fn().mockResolvedValue(mockSuccess({"deleted":true})),
|
|
50
|
-
updateAccess: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"editing","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})),
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
workflow: {
|
|
54
|
-
withdraw: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"editing","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})),
|
|
55
|
-
requestChanges: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"editing","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})),
|
|
56
|
-
approve: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"approved","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})),
|
|
57
|
-
markMerged: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"archived"}})),
|
|
58
|
-
getStatus: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"editing","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})),
|
|
59
|
-
submit: vi.fn().mockResolvedValue(mockSuccess({"branch":{"name":"test-branch","status":"submitted","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})),
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
comments: {
|
|
63
|
-
list: vi.fn().mockResolvedValue(mockSuccess({"threads":[]})),
|
|
64
|
-
add: vi.fn().mockResolvedValue(mockSuccess({"threadId":"mock-thread-id","commentId":"mock-comment-id"})),
|
|
65
|
-
resolve: vi.fn().mockResolvedValue(mockSuccess({"resolved":true})),
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
content: {
|
|
69
|
-
read: vi.fn().mockResolvedValue(mockSuccess({"format":"json","data":{}})),
|
|
70
|
-
write: vi.fn().mockResolvedValue(mockSuccess({"format":"json","data":{}})),
|
|
71
|
-
validateReferences: vi.fn().mockResolvedValue(mockSuccess({"valid":true})),
|
|
72
|
-
renameEntry: vi.fn().mockResolvedValue(mockSuccess({"newPath":"content/posts/new-slug"})),
|
|
73
|
-
getReferenceOptions: vi.fn().mockResolvedValue(mockSuccess({"options":[]})),
|
|
74
|
-
resolveReferences: vi.fn().mockResolvedValue(mockSuccess({"resolved":{}})),
|
|
75
|
-
},
|
|
76
|
-
|
|
77
|
-
entries: {
|
|
78
|
-
list: vi.fn().mockResolvedValue(mockSuccess({"collections":[],"entries":[],"pagination":{"hasMore":false,"limit":50}})),
|
|
79
|
-
delete: vi.fn().mockResolvedValue(mockSuccess({"deleted":true})),
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
assets: {
|
|
83
|
-
list: vi.fn().mockResolvedValue(mockSuccess({"assets":[]})),
|
|
84
|
-
upload: vi.fn().mockResolvedValue(mockSuccess({"asset":{"key":"","url":""}})),
|
|
85
|
-
delete: vi.fn().mockResolvedValue(mockSuccess({"deleted":true})),
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
permissions: {
|
|
89
|
-
get: vi.fn().mockResolvedValue(mockSuccess({"permissions":[]})),
|
|
90
|
-
update: vi.fn().mockResolvedValue(mockSuccess({"permissions":[]})),
|
|
91
|
-
searchUsers: vi.fn().mockResolvedValue(mockSuccess({"users":[]})),
|
|
92
|
-
listGroups: vi.fn().mockResolvedValue(mockSuccess({"groups":[]})),
|
|
93
|
-
getUserMetadata: vi.fn().mockResolvedValue(mockSuccess({"user":null})),
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
groups: {
|
|
97
|
-
getInternal: vi.fn().mockResolvedValue(mockSuccess({"groups":[]})),
|
|
98
|
-
updateInternal: vi.fn().mockResolvedValue(mockSuccess({})),
|
|
99
|
-
searchExternal: vi.fn().mockResolvedValue(mockSuccess({"groups":[]})),
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
user: {
|
|
103
|
-
whoami: vi.fn().mockResolvedValue(mockSuccess({"userId":"mock-user","groups":[]})),
|
|
104
|
-
},
|
|
105
|
-
|
|
106
|
-
schema: {
|
|
107
|
-
get: vi.fn().mockResolvedValue(mockSuccess({"flatSchema":[],"entrySchemas":{}})),
|
|
108
|
-
getCollection: vi.fn().mockResolvedValue(mockSuccess({"collection":null})),
|
|
109
|
-
createCollection: vi.fn().mockResolvedValue(mockSuccess({"collectionPath":"","contentId":""})),
|
|
110
|
-
updateCollection: vi.fn().mockResolvedValue(mockSuccess({"success":true})),
|
|
111
|
-
deleteCollection: vi.fn().mockResolvedValue(mockSuccess({"success":true})),
|
|
112
|
-
addEntryType: vi.fn().mockResolvedValue(mockSuccess({"success":true})),
|
|
113
|
-
updateEntryType: vi.fn().mockResolvedValue(mockSuccess({"success":true})),
|
|
114
|
-
removeEntryType: vi.fn().mockResolvedValue(mockSuccess({"success":true})),
|
|
115
|
-
updateOrder: vi.fn().mockResolvedValue(mockSuccess({"success":true})),
|
|
116
|
-
invalidateSchemaCache: vi.fn().mockResolvedValue(mockSuccess({"success":true,"message":"Cache invalidated"})),
|
|
117
|
-
},
|
|
118
|
-
} as MockApiClient
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ========== Response Helpers ==========
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Create a successful API response
|
|
125
|
-
*/
|
|
126
|
-
export function mockSuccess<T>(data: T): ApiResponse<T> {
|
|
127
|
-
return { ok: true, status: 200, data }
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Create an error API response
|
|
132
|
-
*/
|
|
133
|
-
export function mockError(status: number, error: string): ApiResponse<never> {
|
|
134
|
-
return { ok: false, status, error }
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Create a 404 not found response
|
|
139
|
-
*/
|
|
140
|
-
export function mockNotFound(): ApiResponse<never> {
|
|
141
|
-
return mockError(404, 'Not found')
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Create a 403 forbidden response
|
|
146
|
-
*/
|
|
147
|
-
export function mockForbidden(): ApiResponse<never> {
|
|
148
|
-
return mockError(403, 'Forbidden')
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// ========== Auto-Generated Response Factories ==========
|
|
152
|
-
// Generated by scripts/generate-client.ts - DO NOT EDIT MANUALLY
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Create a BranchListResponse for testing
|
|
156
|
-
*/
|
|
157
|
-
export function mockBranchListResponse(): BranchListResponse {
|
|
158
|
-
return mockSuccess({"branches":[]})
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Create a BranchResponse for testing
|
|
163
|
-
*/
|
|
164
|
-
export function mockBranchResponse(): BranchResponse {
|
|
165
|
-
return mockSuccess({"branch":{"name":"test-branch","status":"editing","access":{},"createdBy":"user-1","createdAt":"2024-01-01","updatedAt":"2024-01-01"}})
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Create a BranchDeleteResponse for testing
|
|
170
|
-
*/
|
|
171
|
-
export function mockBranchDeleteResponse(): BranchDeleteResponse {
|
|
172
|
-
return mockSuccess({"deleted":true})
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Create a BranchMergeResponse for testing
|
|
177
|
-
*/
|
|
178
|
-
export function mockBranchMergeResponse(): BranchMergeResponse {
|
|
179
|
-
return mockSuccess({"branch":{"name":"test-branch","status":"archived"}})
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Create a CommentsResponse for testing
|
|
184
|
-
*/
|
|
185
|
-
export function mockCommentsResponse(): CommentsResponse {
|
|
186
|
-
return mockSuccess({"threads":[]})
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Create a AddCommentResponse for testing
|
|
191
|
-
*/
|
|
192
|
-
export function mockAddCommentResponse(): AddCommentResponse {
|
|
193
|
-
return mockSuccess({"threadId":"mock-thread-id","commentId":"mock-comment-id"})
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Create a ResolveCommentResponse for testing
|
|
198
|
-
*/
|
|
199
|
-
export function mockResolveCommentResponse(): ResolveCommentResponse {
|
|
200
|
-
return mockSuccess({"resolved":true})
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Create a ContentReadResponse for testing
|
|
205
|
-
*/
|
|
206
|
-
export function mockContentReadResponse(): ContentReadResponse {
|
|
207
|
-
return mockSuccess({"format":"json","data":{}})
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Create a ContentWriteResponse for testing
|
|
212
|
-
*/
|
|
213
|
-
export function mockContentWriteResponse(): ContentWriteResponse {
|
|
214
|
-
return mockSuccess({"format":"json","data":{}})
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Create a ReferenceValidationResponse for testing
|
|
219
|
-
*/
|
|
220
|
-
export function mockReferenceValidationResponse(): ReferenceValidationResponse {
|
|
221
|
-
return mockSuccess({"valid":true})
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Create a RenameEntryResponse for testing
|
|
226
|
-
*/
|
|
227
|
-
export function mockRenameEntryResponse(): RenameEntryResponse {
|
|
228
|
-
return mockSuccess({"newPath":"content/posts/new-slug"})
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Create a ReferenceOptionsResponse for testing
|
|
233
|
-
*/
|
|
234
|
-
export function mockReferenceOptionsResponse(): ReferenceOptionsResponse {
|
|
235
|
-
return mockSuccess({"options":[]})
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Create a ResolveReferencesResponse for testing
|
|
240
|
-
*/
|
|
241
|
-
export function mockResolveReferencesResponse(): ResolveReferencesResponse {
|
|
242
|
-
return mockSuccess({"resolved":{}})
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Create a EntriesResponse for testing
|
|
247
|
-
*/
|
|
248
|
-
export function mockEntriesResponse(): EntriesResponse {
|
|
249
|
-
return mockSuccess({"collections":[],"entries":[],"pagination":{"hasMore":false,"limit":50}})
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Create a DeleteEntryResponse for testing
|
|
254
|
-
*/
|
|
255
|
-
export function mockDeleteEntryResponse(): DeleteEntryResponse {
|
|
256
|
-
return mockSuccess({"deleted":true})
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Create a AssetsListResponse for testing
|
|
261
|
-
*/
|
|
262
|
-
export function mockAssetsListResponse(): AssetsListResponse {
|
|
263
|
-
return mockSuccess({"assets":[]})
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Create a AssetUploadResponse for testing
|
|
268
|
-
*/
|
|
269
|
-
export function mockAssetUploadResponse(): AssetUploadResponse {
|
|
270
|
-
return mockSuccess({"asset":{"key":"","url":""}})
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Create a AssetDeleteResponse for testing
|
|
275
|
-
*/
|
|
276
|
-
export function mockAssetDeleteResponse(): AssetDeleteResponse {
|
|
277
|
-
return mockSuccess({"deleted":true})
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Create a PermissionsResponse for testing
|
|
282
|
-
*/
|
|
283
|
-
export function mockPermissionsResponse(): PermissionsResponse {
|
|
284
|
-
return mockSuccess({"permissions":[]})
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Create a SearchUsersResponse for testing
|
|
289
|
-
*/
|
|
290
|
-
export function mockSearchUsersResponse(): SearchUsersResponse {
|
|
291
|
-
return mockSuccess({"users":[]})
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Create a ListGroupsResponse for testing
|
|
296
|
-
*/
|
|
297
|
-
export function mockListGroupsResponse(): ListGroupsResponse {
|
|
298
|
-
return mockSuccess({"groups":[]})
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Create a GetUserMetadataResponse for testing
|
|
303
|
-
*/
|
|
304
|
-
export function mockGetUserMetadataResponse(): GetUserMetadataResponse {
|
|
305
|
-
return mockSuccess({"user":null})
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Create a InternalGroupsResponse for testing
|
|
310
|
-
*/
|
|
311
|
-
export function mockInternalGroupsResponse(): InternalGroupsResponse {
|
|
312
|
-
return mockSuccess({"groups":[]})
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
* Create a UpdateInternalGroupsResponse for testing
|
|
317
|
-
*/
|
|
318
|
-
export function mockUpdateInternalGroupsResponse(): UpdateInternalGroupsResponse {
|
|
319
|
-
return mockSuccess({})
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Create a ExternalGroupsResponse for testing
|
|
324
|
-
*/
|
|
325
|
-
export function mockExternalGroupsResponse(): ExternalGroupsResponse {
|
|
326
|
-
return mockSuccess({"groups":[]})
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* Create a UserInfoResponse for testing
|
|
331
|
-
*/
|
|
332
|
-
export function mockUserInfoResponse(): UserInfoResponse {
|
|
333
|
-
return mockSuccess({"userId":"mock-user","groups":[]})
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* Create a GetSchemaApiResponse for testing
|
|
338
|
-
*/
|
|
339
|
-
export function mockGetSchemaApiResponse(): GetSchemaApiResponse {
|
|
340
|
-
return mockSuccess({"flatSchema":[],"entrySchemas":{}})
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Create a GetCollectionApiResponse for testing
|
|
345
|
-
*/
|
|
346
|
-
export function mockGetCollectionApiResponse(): GetCollectionApiResponse {
|
|
347
|
-
return mockSuccess({"collection":null})
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* Create a CreateCollectionApiResponse for testing
|
|
352
|
-
*/
|
|
353
|
-
export function mockCreateCollectionApiResponse(): CreateCollectionApiResponse {
|
|
354
|
-
return mockSuccess({"collectionPath":createLogicalPath(""),"contentId":"" as ContentId})
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* Create a UpdateCollectionApiResponse for testing
|
|
359
|
-
*/
|
|
360
|
-
export function mockUpdateCollectionApiResponse(): UpdateCollectionApiResponse {
|
|
361
|
-
return mockSuccess({"success":true})
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Create a DeleteCollectionApiResponse for testing
|
|
366
|
-
*/
|
|
367
|
-
export function mockDeleteCollectionApiResponse(): DeleteCollectionApiResponse {
|
|
368
|
-
return mockSuccess({"success":true})
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Create a AddEntryTypeApiResponse for testing
|
|
373
|
-
*/
|
|
374
|
-
export function mockAddEntryTypeApiResponse(): AddEntryTypeApiResponse {
|
|
375
|
-
return mockSuccess({"success":true})
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
/**
|
|
379
|
-
* Create a UpdateEntryTypeApiResponse for testing
|
|
380
|
-
*/
|
|
381
|
-
export function mockUpdateEntryTypeApiResponse(): UpdateEntryTypeApiResponse {
|
|
382
|
-
return mockSuccess({"success":true})
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/**
|
|
386
|
-
* Create a RemoveEntryTypeApiResponse for testing
|
|
387
|
-
*/
|
|
388
|
-
export function mockRemoveEntryTypeApiResponse(): RemoveEntryTypeApiResponse {
|
|
389
|
-
return mockSuccess({"success":true})
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* Create a UpdateOrderApiResponse for testing
|
|
394
|
-
*/
|
|
395
|
-
export function mockUpdateOrderApiResponse(): UpdateOrderApiResponse {
|
|
396
|
-
return mockSuccess({"success":true})
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Create a InvalidateSchemaCacheApiResponse for testing
|
|
401
|
-
*/
|
|
402
|
-
export function mockInvalidateSchemaCacheApiResponse(): InvalidateSchemaCacheApiResponse {
|
|
403
|
-
return mockSuccess({"success":true,"message":"Cache invalidated"})
|
|
404
|
-
}
|
package/src/api/assets.test.ts
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest'
|
|
2
|
-
|
|
3
|
-
import { ASSET_ROUTES } from './assets'
|
|
4
|
-
import type { ApiContext } from './types'
|
|
5
|
-
import { RESERVED_GROUPS } from '../authorization'
|
|
6
|
-
|
|
7
|
-
// Extract handlers for testing
|
|
8
|
-
const listAssets = ASSET_ROUTES.list.handler
|
|
9
|
-
const uploadAsset = ASSET_ROUTES.upload.handler
|
|
10
|
-
const deleteAsset = ASSET_ROUTES.delete.handler
|
|
11
|
-
|
|
12
|
-
const makeCtx = (): ApiContext => ({
|
|
13
|
-
services: {
|
|
14
|
-
config: { schema: [] } as any,
|
|
15
|
-
entrySchemaRegistry: {},
|
|
16
|
-
branchSchemaCache: {
|
|
17
|
-
getSchema: vi.fn().mockResolvedValue({ schema: { collections: [] }, flatSchema: [] }),
|
|
18
|
-
invalidate: vi.fn().mockResolvedValue(undefined),
|
|
19
|
-
clearAll: vi.fn().mockResolvedValue(undefined),
|
|
20
|
-
} as any,
|
|
21
|
-
checkBranchAccess: () => ({ allowed: true, reason: 'no_acl' }),
|
|
22
|
-
checkPathAccess: undefined as any,
|
|
23
|
-
checkContentAccess: async () => ({
|
|
24
|
-
allowed: true,
|
|
25
|
-
branch: { allowed: true, reason: 'no_acl' },
|
|
26
|
-
path: { allowed: true, reason: 'no_acl' },
|
|
27
|
-
}),
|
|
28
|
-
createGitManagerFor: undefined as any,
|
|
29
|
-
bootstrapAdminIds: new Set<string>(),
|
|
30
|
-
registry: undefined as any,
|
|
31
|
-
commitFiles: vi.fn(),
|
|
32
|
-
submitBranch: vi.fn(),
|
|
33
|
-
commitToSettingsBranch: vi.fn().mockResolvedValue({ committed: true, pushed: true }),
|
|
34
|
-
getSettingsBranchRoot: vi.fn().mockResolvedValue('/mock/settings'),
|
|
35
|
-
},
|
|
36
|
-
getBranchContext: async () => null,
|
|
37
|
-
assetStore: {
|
|
38
|
-
list: async () => [{ key: 'a.png', url: 'http://cdn/a.png' }],
|
|
39
|
-
upload: async (key) => ({ key }),
|
|
40
|
-
delete: async () => {},
|
|
41
|
-
},
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
describe('asset api', () => {
|
|
45
|
-
it('returns 501 when asset store missing', async () => {
|
|
46
|
-
const res = await listAssets(
|
|
47
|
-
{ ...makeCtx(), assetStore: undefined },
|
|
48
|
-
{ user: { type: 'authenticated', userId: 'u', groups: [] } },
|
|
49
|
-
)
|
|
50
|
-
expect(res.status).toBe(501)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('lists assets for any user', async () => {
|
|
54
|
-
const res = await listAssets(makeCtx(), {
|
|
55
|
-
user: { type: 'authenticated', userId: 'u', groups: [] },
|
|
56
|
-
})
|
|
57
|
-
expect(res.ok).toBe(true)
|
|
58
|
-
expect(res.data?.assets[0].key).toBe('a.png')
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
describe('uploadAsset', () => {
|
|
62
|
-
it('returns 403 for non-privileged users', async () => {
|
|
63
|
-
const res = await uploadAsset(
|
|
64
|
-
makeCtx(),
|
|
65
|
-
{ user: { type: 'authenticated', userId: 'u', groups: [] } },
|
|
66
|
-
{ key: 'a.png', data: Buffer.from('x') },
|
|
67
|
-
)
|
|
68
|
-
expect(res.ok).toBe(false)
|
|
69
|
-
expect(res.status).toBe(403)
|
|
70
|
-
expect(res.error).toBe('Privileged access required')
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('allows Reviewers to upload', async () => {
|
|
74
|
-
const res = await uploadAsset(
|
|
75
|
-
makeCtx(),
|
|
76
|
-
{
|
|
77
|
-
user: {
|
|
78
|
-
type: 'authenticated',
|
|
79
|
-
userId: 'u',
|
|
80
|
-
groups: [RESERVED_GROUPS.REVIEWERS],
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
{ key: 'a.png', data: Buffer.from('x') },
|
|
84
|
-
)
|
|
85
|
-
expect(res.ok).toBe(true)
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
it('allows Admins to upload', async () => {
|
|
89
|
-
const res = await uploadAsset(
|
|
90
|
-
makeCtx(),
|
|
91
|
-
{
|
|
92
|
-
user: {
|
|
93
|
-
type: 'authenticated',
|
|
94
|
-
userId: 'u',
|
|
95
|
-
groups: [RESERVED_GROUPS.ADMINS],
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
{ key: 'a.png', data: Buffer.from('x') },
|
|
99
|
-
)
|
|
100
|
-
expect(res.ok).toBe(true)
|
|
101
|
-
})
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
describe('deleteAsset', () => {
|
|
105
|
-
it('returns 403 for non-admin users', async () => {
|
|
106
|
-
const res = await deleteAsset(makeCtx(), {
|
|
107
|
-
user: { type: 'authenticated', userId: 'u', groups: [] },
|
|
108
|
-
query: { key: 'a.png' },
|
|
109
|
-
})
|
|
110
|
-
expect(res.ok).toBe(false)
|
|
111
|
-
expect(res.status).toBe(403)
|
|
112
|
-
expect(res.error).toBe('Admin access required')
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
it('returns 403 for Reviewers', async () => {
|
|
116
|
-
const res = await deleteAsset(makeCtx(), {
|
|
117
|
-
user: {
|
|
118
|
-
type: 'authenticated',
|
|
119
|
-
userId: 'u',
|
|
120
|
-
groups: [RESERVED_GROUPS.REVIEWERS],
|
|
121
|
-
},
|
|
122
|
-
query: { key: 'a.png' },
|
|
123
|
-
})
|
|
124
|
-
expect(res.ok).toBe(false)
|
|
125
|
-
expect(res.status).toBe(403)
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
it('allows Admins to delete', async () => {
|
|
129
|
-
const res = await deleteAsset(makeCtx(), {
|
|
130
|
-
user: {
|
|
131
|
-
type: 'authenticated',
|
|
132
|
-
userId: 'u',
|
|
133
|
-
groups: [RESERVED_GROUPS.ADMINS],
|
|
134
|
-
},
|
|
135
|
-
query: { key: 'a.png' },
|
|
136
|
-
})
|
|
137
|
-
expect(res.ok).toBe(true)
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
})
|
package/src/api/assets.ts
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
|
|
3
|
-
import type { ApiContext, ApiRequest, ApiResponse } from './types'
|
|
4
|
-
import { defineEndpoint } from './route-builder'
|
|
5
|
-
|
|
6
|
-
/** Response type for listing assets */
|
|
7
|
-
export type AssetsListResponse = ApiResponse<{
|
|
8
|
-
assets: { key: string; url?: string }[]
|
|
9
|
-
}>
|
|
10
|
-
|
|
11
|
-
/** Response type for uploading an asset */
|
|
12
|
-
export type AssetUploadResponse = ApiResponse<{
|
|
13
|
-
asset: { key: string; url?: string }
|
|
14
|
-
}>
|
|
15
|
-
|
|
16
|
-
/** Response type for deleting an asset */
|
|
17
|
-
export type AssetDeleteResponse = ApiResponse<{ deleted: boolean }>
|
|
18
|
-
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// Zod Schemas for Validation
|
|
21
|
-
// ============================================================================
|
|
22
|
-
|
|
23
|
-
const uploadAssetBodySchema = z.object({
|
|
24
|
-
key: z.string().min(1),
|
|
25
|
-
contentType: z.string().optional(),
|
|
26
|
-
data: z.instanceof(Buffer).or(z.instanceof(Uint8Array)),
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
export interface ListAssetsParams {
|
|
30
|
-
prefix?: string
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface UploadAssetBody {
|
|
34
|
-
key: string
|
|
35
|
-
contentType?: string
|
|
36
|
-
data: Buffer | Uint8Array
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface DeleteAssetBody {
|
|
40
|
-
key: string
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* List assets - any authenticated user can list assets.
|
|
45
|
-
*/
|
|
46
|
-
const listAssetsQuerySchema = z.object({
|
|
47
|
-
prefix: z.string().optional(),
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
const listAssetsHandler = async (ctx: ApiContext, req: ApiRequest): Promise<AssetsListResponse> => {
|
|
51
|
-
if (!ctx.assetStore) return { ok: false, status: 501, error: 'Asset store not configured' }
|
|
52
|
-
const query = listAssetsQuerySchema.safeParse(req.query ?? {})
|
|
53
|
-
if (!query.success) {
|
|
54
|
-
return { ok: false, status: 400, error: query.error.message }
|
|
55
|
-
}
|
|
56
|
-
const assets = await ctx.assetStore.list(query.data.prefix ?? '')
|
|
57
|
-
return { ok: true, status: 200, data: { assets } }
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Upload asset - requires privileged access (Admin or Reviewer).
|
|
62
|
-
*/
|
|
63
|
-
const uploadAssetHandler = async (
|
|
64
|
-
_gc: Record<string, never>,
|
|
65
|
-
ctx: ApiContext,
|
|
66
|
-
req: ApiRequest,
|
|
67
|
-
body: z.infer<typeof uploadAssetBodySchema>,
|
|
68
|
-
): Promise<AssetUploadResponse> => {
|
|
69
|
-
if (!ctx.assetStore) return { ok: false, status: 501, error: 'Asset store not configured' }
|
|
70
|
-
|
|
71
|
-
const asset = await ctx.assetStore.upload(body.key, body.data, body.contentType)
|
|
72
|
-
return { ok: true, status: 200, data: { asset } }
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Delete asset - requires Admin access.
|
|
77
|
-
*/
|
|
78
|
-
const deleteAssetHandler = async (
|
|
79
|
-
_gc: Record<string, never>,
|
|
80
|
-
ctx: ApiContext,
|
|
81
|
-
req: ApiRequest,
|
|
82
|
-
): Promise<AssetDeleteResponse> => {
|
|
83
|
-
if (!ctx.assetStore) return { ok: false, status: 501, error: 'Asset store not configured' }
|
|
84
|
-
|
|
85
|
-
const deleteQuery = z.object({ key: z.string().min(1) }).safeParse(req.query ?? {})
|
|
86
|
-
if (!deleteQuery.success) {
|
|
87
|
-
return { ok: false, status: 400, error: 'key query parameter required' }
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
await ctx.assetStore.delete(deleteQuery.data.key)
|
|
91
|
-
return { ok: true, status: 200, data: { deleted: true } }
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// ============================================================================
|
|
95
|
-
// Route Definitions with defineEndpoint
|
|
96
|
-
// ============================================================================
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* List all assets
|
|
100
|
-
* GET /assets
|
|
101
|
-
*/
|
|
102
|
-
const listAssets = defineEndpoint({
|
|
103
|
-
namespace: 'assets',
|
|
104
|
-
name: 'list',
|
|
105
|
-
method: 'GET',
|
|
106
|
-
path: '/assets',
|
|
107
|
-
responseType: 'AssetsListResponse',
|
|
108
|
-
response: {} as AssetsListResponse,
|
|
109
|
-
defaultMockData: { assets: [] },
|
|
110
|
-
handler: listAssetsHandler,
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Upload an asset
|
|
115
|
-
* POST /assets
|
|
116
|
-
*/
|
|
117
|
-
const uploadAsset = defineEndpoint({
|
|
118
|
-
namespace: 'assets',
|
|
119
|
-
name: 'upload',
|
|
120
|
-
method: 'POST',
|
|
121
|
-
path: '/assets',
|
|
122
|
-
body: uploadAssetBodySchema,
|
|
123
|
-
bodyType: 'UploadAssetBody',
|
|
124
|
-
responseType: 'AssetUploadResponse',
|
|
125
|
-
response: {} as AssetUploadResponse,
|
|
126
|
-
defaultMockData: { asset: { key: '', url: '' } },
|
|
127
|
-
guards: ['privileged'] as const,
|
|
128
|
-
handler: uploadAssetHandler,
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Delete an asset
|
|
133
|
-
* DELETE /assets?key=...
|
|
134
|
-
*/
|
|
135
|
-
const deleteAsset = defineEndpoint({
|
|
136
|
-
namespace: 'assets',
|
|
137
|
-
name: 'delete',
|
|
138
|
-
method: 'DELETE',
|
|
139
|
-
path: '/assets',
|
|
140
|
-
responseType: 'AssetDeleteResponse',
|
|
141
|
-
response: {} as AssetDeleteResponse,
|
|
142
|
-
defaultMockData: { deleted: true },
|
|
143
|
-
guards: ['admin'] as const,
|
|
144
|
-
handler: deleteAssetHandler,
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Exported routes for router registration
|
|
149
|
-
*/
|
|
150
|
-
export const ASSET_ROUTES = {
|
|
151
|
-
list: listAssets,
|
|
152
|
-
upload: uploadAsset,
|
|
153
|
-
delete: deleteAsset,
|
|
154
|
-
} as const
|