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,130 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises'
|
|
2
|
-
import os from 'node:os'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import { simpleGit } from 'simple-git'
|
|
5
|
-
import { vi } from 'vitest'
|
|
6
|
-
import type { CanopyConfig } from '../../config'
|
|
7
|
-
import { defineCanopyTestConfig } from '../../config-test'
|
|
8
|
-
import { initTestRepo } from '../../test-utils'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Initialize a bare git repository with the specified default branch.
|
|
12
|
-
* This ensures the bare repo's HEAD points to the correct branch when cloning.
|
|
13
|
-
*
|
|
14
|
-
* @param remotePath - Path where the bare repository should be created
|
|
15
|
-
* @param defaultBranch - The default branch name (defaults to 'main')
|
|
16
|
-
* @returns A simpleGit instance configured for the bare repository
|
|
17
|
-
*/
|
|
18
|
-
export async function initBareRepo(remotePath: string, defaultBranch = 'main') {
|
|
19
|
-
await simpleGit().raw(['init', '--bare', `--initial-branch=${defaultBranch}`, remotePath])
|
|
20
|
-
return simpleGit({ baseDir: remotePath })
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface TestWorkspace {
|
|
24
|
-
/** Root temporary directory for this workspace */
|
|
25
|
-
tmpRoot: string
|
|
26
|
-
/** Path to bare git remote */
|
|
27
|
-
remotePath: string
|
|
28
|
-
/** Path to seed clone (initial commit) */
|
|
29
|
-
seedPath: string
|
|
30
|
-
/** Full Canopy configuration */
|
|
31
|
-
config: CanopyConfig
|
|
32
|
-
/** Cleanup function to remove all temp files and restore cwd mock */
|
|
33
|
-
cleanup: () => Promise<void>
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Creates an isolated test environment with temp directory and bare git remote.
|
|
38
|
-
*
|
|
39
|
-
* Directory structure created:
|
|
40
|
-
* ```
|
|
41
|
-
* tmpRoot/
|
|
42
|
-
* ├── remote.git/ (bare git remote)
|
|
43
|
-
* ├── seed/ (initial clone with content/)
|
|
44
|
-
* └── branches/ (workspace clones will be created here)
|
|
45
|
-
* ```
|
|
46
|
-
*
|
|
47
|
-
* Based on the pattern from branch-workflow.integration.test.ts
|
|
48
|
-
*/
|
|
49
|
-
// Warnings to suppress in integration tests (expected when using local git repos)
|
|
50
|
-
const suppressedWarnings: (string | RegExp)[] = [
|
|
51
|
-
'CanopyCMS: GitHub token not found',
|
|
52
|
-
'CanopyCMS: Failed to parse GitHub remote URL',
|
|
53
|
-
'CanopyCMS: GitHub service requires remoteUrl',
|
|
54
|
-
]
|
|
55
|
-
|
|
56
|
-
export async function createTestWorkspace(
|
|
57
|
-
configOverrides?: Partial<Parameters<typeof defineCanopyTestConfig>[0]>,
|
|
58
|
-
): Promise<TestWorkspace> {
|
|
59
|
-
// Suppress known CanopyCMS warnings that are expected in integration tests
|
|
60
|
-
const originalWarn = console.warn
|
|
61
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation((...args) => {
|
|
62
|
-
const message = String(args[0] ?? '')
|
|
63
|
-
const shouldSuppress = suppressedWarnings.some((pattern) =>
|
|
64
|
-
typeof pattern === 'string' ? message.includes(pattern) : pattern.test(message),
|
|
65
|
-
)
|
|
66
|
-
if (!shouldSuppress) {
|
|
67
|
-
originalWarn.apply(console, args)
|
|
68
|
-
}
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
// Create root temp directory
|
|
72
|
-
const tmpRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'canopy-test-'))
|
|
73
|
-
const remotePath = path.join(tmpRoot, 'remote.git')
|
|
74
|
-
const seedPath = path.join(tmpRoot, 'seed')
|
|
75
|
-
|
|
76
|
-
try {
|
|
77
|
-
// Initialize bare remote
|
|
78
|
-
await initBareRepo(remotePath)
|
|
79
|
-
|
|
80
|
-
// Create and configure seed clone
|
|
81
|
-
await fs.mkdir(seedPath, { recursive: true })
|
|
82
|
-
const seedGit = await initTestRepo(seedPath)
|
|
83
|
-
await seedGit.raw(['branch', '-M', 'main'])
|
|
84
|
-
|
|
85
|
-
// Create initial content directory
|
|
86
|
-
await fs.mkdir(path.join(seedPath, 'content'), { recursive: true })
|
|
87
|
-
|
|
88
|
-
// Create initial commit with README
|
|
89
|
-
await fs.writeFile(path.join(seedPath, 'README.md'), '# Test Repository\n', 'utf8')
|
|
90
|
-
await seedGit.add(['.'])
|
|
91
|
-
await seedGit.commit('Initial commit')
|
|
92
|
-
|
|
93
|
-
// Push to remote
|
|
94
|
-
await seedGit.addRemote('origin', remotePath)
|
|
95
|
-
await seedGit.push('origin', 'main', { '--set-upstream': null })
|
|
96
|
-
|
|
97
|
-
// Create config
|
|
98
|
-
const config = defineCanopyTestConfig({
|
|
99
|
-
mode: 'prod-sim',
|
|
100
|
-
defaultBranchAccess: 'allow',
|
|
101
|
-
defaultPathAccess: 'allow',
|
|
102
|
-
defaultBaseBranch: 'main',
|
|
103
|
-
defaultRemoteName: 'origin',
|
|
104
|
-
defaultRemoteUrl: remotePath,
|
|
105
|
-
schema: { collections: [] },
|
|
106
|
-
...configOverrides,
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
// Mock process.cwd() to return tmpRoot so BranchRegistry uses isolated path
|
|
110
|
-
// This prevents parallel tests from corrupting shared registry files
|
|
111
|
-
const cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(tmpRoot)
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
tmpRoot,
|
|
115
|
-
remotePath,
|
|
116
|
-
seedPath,
|
|
117
|
-
config,
|
|
118
|
-
cleanup: async () => {
|
|
119
|
-
warnSpy.mockRestore()
|
|
120
|
-
cwdSpy.mockRestore()
|
|
121
|
-
await fs.rm(tmpRoot, { recursive: true, force: true })
|
|
122
|
-
},
|
|
123
|
-
}
|
|
124
|
-
} catch (error) {
|
|
125
|
-
// Cleanup on error
|
|
126
|
-
warnSpy.mockRestore()
|
|
127
|
-
await fs.rm(tmpRoot, { recursive: true, force: true }).catch(() => {})
|
|
128
|
-
throw error
|
|
129
|
-
}
|
|
130
|
-
}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for user context API endpoint.
|
|
3
|
-
* Tests the /whoami endpoint that returns current user info.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
7
|
-
|
|
8
|
-
import { createTestWorkspace, type TestWorkspace } from '../test-utils/test-workspace'
|
|
9
|
-
import { createMockAuthPlugin } from '../test-utils/multi-user'
|
|
10
|
-
import { createApiClient } from '../test-utils/api-client'
|
|
11
|
-
import { BLOG_SCHEMA } from '../fixtures/schemas'
|
|
12
|
-
import type { UserInfoResponse } from '../../api/user'
|
|
13
|
-
import type { AuthPlugin } from '../../auth/plugin'
|
|
14
|
-
import type { AuthenticationResult } from '../../auth/types'
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Helper to create a mock auth plugin with custom userId and groups
|
|
18
|
-
*/
|
|
19
|
-
function createCustomAuthPlugin(userId: string, groups: string[]): AuthPlugin {
|
|
20
|
-
return {
|
|
21
|
-
async authenticate(_context: unknown): Promise<AuthenticationResult> {
|
|
22
|
-
return {
|
|
23
|
-
success: true,
|
|
24
|
-
user: {
|
|
25
|
-
userId: `test-${userId}`,
|
|
26
|
-
email: `${userId}@test.local`,
|
|
27
|
-
name: `Test ${userId}`,
|
|
28
|
-
externalGroups: groups,
|
|
29
|
-
},
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
async searchUsers() {
|
|
33
|
-
return []
|
|
34
|
-
},
|
|
35
|
-
async getUserMetadata() {
|
|
36
|
-
return null
|
|
37
|
-
},
|
|
38
|
-
async getGroupMetadata() {
|
|
39
|
-
return null
|
|
40
|
-
},
|
|
41
|
-
async listGroups() {
|
|
42
|
-
return []
|
|
43
|
-
},
|
|
44
|
-
async searchExternalGroups() {
|
|
45
|
-
return []
|
|
46
|
-
},
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
describe('User Context API Integration', () => {
|
|
51
|
-
let workspace: TestWorkspace
|
|
52
|
-
let adminClient: Awaited<ReturnType<typeof createApiClient>>
|
|
53
|
-
let editorClient: Awaited<ReturnType<typeof createApiClient>>
|
|
54
|
-
let reviewerClient: Awaited<ReturnType<typeof createApiClient>>
|
|
55
|
-
|
|
56
|
-
beforeEach(async () => {
|
|
57
|
-
workspace = await createTestWorkspace({
|
|
58
|
-
schema: BLOG_SCHEMA,
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
// Create API clients for different users with different group memberships
|
|
62
|
-
adminClient = await createApiClient({
|
|
63
|
-
config: workspace.config,
|
|
64
|
-
authPlugin: createMockAuthPlugin('admin'),
|
|
65
|
-
schema: BLOG_SCHEMA,
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
editorClient = await createApiClient({
|
|
69
|
-
config: workspace.config,
|
|
70
|
-
authPlugin: createMockAuthPlugin('editor'),
|
|
71
|
-
schema: BLOG_SCHEMA,
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
reviewerClient = await createApiClient({
|
|
75
|
-
config: workspace.config,
|
|
76
|
-
authPlugin: createMockAuthPlugin('reviewer'),
|
|
77
|
-
schema: BLOG_SCHEMA,
|
|
78
|
-
})
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
afterEach(async () => {
|
|
82
|
-
await workspace.cleanup()
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
it('returns correct user info for admin user', async () => {
|
|
86
|
-
const response = await adminClient.get('/api/canopycms/whoami')
|
|
87
|
-
|
|
88
|
-
expect(response.status).toBe(200)
|
|
89
|
-
expect(response.ok).toBe(true)
|
|
90
|
-
|
|
91
|
-
const data = await response.json<UserInfoResponse>()
|
|
92
|
-
expect(data.ok).toBe(true)
|
|
93
|
-
expect(data.data?.userId).toBe('test-admin')
|
|
94
|
-
expect(data.data?.groups).toContain('Admins')
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
it('returns correct user info for editor user', async () => {
|
|
98
|
-
const response = await editorClient.get('/api/canopycms/whoami')
|
|
99
|
-
|
|
100
|
-
expect(response.status).toBe(200)
|
|
101
|
-
expect(response.ok).toBe(true)
|
|
102
|
-
|
|
103
|
-
const data = await response.json<UserInfoResponse>()
|
|
104
|
-
expect(data.ok).toBe(true)
|
|
105
|
-
expect(data.data?.userId).toBe('test-editor')
|
|
106
|
-
expect(data.data?.groups).toContain('ContentEditors')
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('returns correct user info for reviewer user', async () => {
|
|
110
|
-
const response = await reviewerClient.get('/api/canopycms/whoami')
|
|
111
|
-
|
|
112
|
-
expect(response.status).toBe(200)
|
|
113
|
-
expect(response.ok).toBe(true)
|
|
114
|
-
|
|
115
|
-
const data = await response.json<UserInfoResponse>()
|
|
116
|
-
expect(data.ok).toBe(true)
|
|
117
|
-
expect(data.data?.userId).toBe('test-reviewer')
|
|
118
|
-
expect(data.data?.groups).toContain('Reviewers')
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
it('returns all groups when user belongs to multiple', async () => {
|
|
122
|
-
// Create a client for a user with multiple groups
|
|
123
|
-
const multiGroupClient = await createApiClient({
|
|
124
|
-
config: workspace.config,
|
|
125
|
-
authPlugin: createCustomAuthPlugin('multi-group-user', ['ContentEditors', 'Reviewers']),
|
|
126
|
-
schema: BLOG_SCHEMA,
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
const response = await multiGroupClient.get('/api/canopycms/whoami')
|
|
130
|
-
|
|
131
|
-
expect(response.status).toBe(200)
|
|
132
|
-
const data = await response.json<UserInfoResponse>()
|
|
133
|
-
expect(data.ok).toBe(true)
|
|
134
|
-
expect(data.data?.userId).toBe('test-multi-group-user')
|
|
135
|
-
expect(data.data?.groups).toContain('ContentEditors')
|
|
136
|
-
expect(data.data?.groups).toContain('Reviewers')
|
|
137
|
-
expect(data.data?.groups).toHaveLength(2)
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
it('endpoint is accessible without special permissions', async () => {
|
|
141
|
-
// All authenticated users should be able to call /whoami
|
|
142
|
-
const responses = await Promise.all([
|
|
143
|
-
adminClient.get('/api/canopycms/whoami'),
|
|
144
|
-
editorClient.get('/api/canopycms/whoami'),
|
|
145
|
-
reviewerClient.get('/api/canopycms/whoami'),
|
|
146
|
-
])
|
|
147
|
-
|
|
148
|
-
// All should succeed
|
|
149
|
-
responses.forEach((response) => {
|
|
150
|
-
expect(response.status).toBe(200)
|
|
151
|
-
expect(response.ok).toBe(true)
|
|
152
|
-
})
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
it('integrates with BranchManager permissions via user context', async () => {
|
|
156
|
-
// Create a branch as editor
|
|
157
|
-
const createResponse = await editorClient.post('/api/canopycms/branches', {
|
|
158
|
-
branch: 'feature/editor-branch',
|
|
159
|
-
title: 'Test Branch',
|
|
160
|
-
})
|
|
161
|
-
expect(createResponse.status).toBe(200)
|
|
162
|
-
|
|
163
|
-
// Verify the branch was created by the correct user
|
|
164
|
-
const branchData = await createResponse.json<any>()
|
|
165
|
-
expect(branchData.data?.branch.createdBy).toBe('test-editor')
|
|
166
|
-
|
|
167
|
-
// Get user info to confirm it matches
|
|
168
|
-
const whoamiResponse = await editorClient.get('/api/canopycms/whoami')
|
|
169
|
-
const whoamiData = await whoamiResponse.json<UserInfoResponse>()
|
|
170
|
-
|
|
171
|
-
expect(whoamiData.data?.userId).toBe('test-editor')
|
|
172
|
-
expect(branchData.data?.branch.createdBy).toBe(whoamiData.data?.userId)
|
|
173
|
-
})
|
|
174
|
-
})
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for HTTP-level input validation.
|
|
3
|
-
* Tests Zod schema validation that happens in the handler layer.
|
|
4
|
-
* Tests go through the HTTP API layer.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
8
|
-
|
|
9
|
-
import { createTestWorkspace, type TestWorkspace } from '../test-utils/test-workspace'
|
|
10
|
-
import { createMockAuthPlugin } from '../test-utils/multi-user'
|
|
11
|
-
import { createApiClient } from '../test-utils/api-client'
|
|
12
|
-
import { BLOG_SCHEMA } from '../fixtures/schemas'
|
|
13
|
-
import type { ApiResponse } from '../../api/types'
|
|
14
|
-
|
|
15
|
-
describe('Input Validation', () => {
|
|
16
|
-
let workspace: TestWorkspace
|
|
17
|
-
let editorClient: Awaited<ReturnType<typeof createApiClient>>
|
|
18
|
-
|
|
19
|
-
beforeEach(async () => {
|
|
20
|
-
workspace = await createTestWorkspace({
|
|
21
|
-
schema: BLOG_SCHEMA,
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
editorClient = await createApiClient({
|
|
25
|
-
config: workspace.config,
|
|
26
|
-
authPlugin: createMockAuthPlugin('editor'),
|
|
27
|
-
schema: BLOG_SCHEMA,
|
|
28
|
-
})
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
afterEach(async () => {
|
|
32
|
-
await workspace.cleanup()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
describe('Branch Creation', () => {
|
|
36
|
-
it('rejects missing branch name', async () => {
|
|
37
|
-
// Try to create branch with empty branch name
|
|
38
|
-
const response = await editorClient.post('/api/canopycms/branches', {
|
|
39
|
-
branch: '',
|
|
40
|
-
title: 'Test Branch',
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
expect(response.status).toBe(400)
|
|
44
|
-
expect(response.ok).toBe(false)
|
|
45
|
-
const error = await response.json<ApiResponse>()
|
|
46
|
-
expect(error.error).toBeDefined()
|
|
47
|
-
expect(error.error).toContain('branch')
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
describe('Branch Deletion', () => {
|
|
52
|
-
it('returns 404 if branch param missing', async () => {
|
|
53
|
-
// Try to delete with empty branch parameter
|
|
54
|
-
// Note: Router returns 404 when path params are missing (not matched route)
|
|
55
|
-
const response = await editorClient.delete('/api/canopycms/')
|
|
56
|
-
|
|
57
|
-
expect(response.status).toBe(404)
|
|
58
|
-
expect(response.ok).toBe(false)
|
|
59
|
-
const error = await response.json<ApiResponse>()
|
|
60
|
-
expect(error.error).toBeDefined()
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
describe('Branch Access Update', () => {
|
|
65
|
-
it('returns 404 if branch param missing', async () => {
|
|
66
|
-
// First create a branch
|
|
67
|
-
await editorClient.post('/api/canopycms/branches', {
|
|
68
|
-
branch: 'test-branch',
|
|
69
|
-
title: 'Test Branch',
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
// Try to update access with empty branch parameter
|
|
73
|
-
// Note: Router returns 404 when path params are missing (not matched route)
|
|
74
|
-
const response = await editorClient.patch('/api/canopycms//access', {
|
|
75
|
-
allowedUsers: ['user1'],
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
expect(response.status).toBe(404)
|
|
79
|
-
expect(response.ok).toBe(false)
|
|
80
|
-
const error = await response.json<ApiResponse>()
|
|
81
|
-
expect(error.error).toBeDefined()
|
|
82
|
-
})
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
describe('Comment Creation', () => {
|
|
86
|
-
beforeEach(async () => {
|
|
87
|
-
// Create a test branch for comment tests
|
|
88
|
-
await editorClient.post('/api/canopycms/branches', {
|
|
89
|
-
branch: 'feature/comments',
|
|
90
|
-
title: 'Comments Test',
|
|
91
|
-
})
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
it('returns 400 if text is missing', async () => {
|
|
95
|
-
// Try to add comment without text field
|
|
96
|
-
const response = await editorClient.post('/api/canopycms/feature-comments/comments', {
|
|
97
|
-
type: 'field',
|
|
98
|
-
entryPath: 'posts/test',
|
|
99
|
-
canopyPath: 'title',
|
|
100
|
-
// Missing: text
|
|
101
|
-
} as any)
|
|
102
|
-
|
|
103
|
-
expect(response.status).toBe(400)
|
|
104
|
-
expect(response.ok).toBe(false)
|
|
105
|
-
const error = await response.json<ApiResponse>()
|
|
106
|
-
expect(error.error).toBeDefined()
|
|
107
|
-
expect(error.error).toContain('text')
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('returns 400 if type is missing', async () => {
|
|
111
|
-
// Try to add comment without type field
|
|
112
|
-
const response = await editorClient.post('/api/canopycms/feature-comments/comments', {
|
|
113
|
-
text: 'This is a test comment',
|
|
114
|
-
entryPath: 'posts/test',
|
|
115
|
-
canopyPath: 'title',
|
|
116
|
-
// Missing: type
|
|
117
|
-
} as any)
|
|
118
|
-
|
|
119
|
-
expect(response.status).toBe(400)
|
|
120
|
-
expect(response.ok).toBe(false)
|
|
121
|
-
const error = await response.json<ApiResponse>()
|
|
122
|
-
expect(error.error).toBeDefined()
|
|
123
|
-
expect(error.error).toContain('type')
|
|
124
|
-
})
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
describe('Additional Validation', () => {
|
|
128
|
-
it('validates comment type enum values', async () => {
|
|
129
|
-
// Create test branch
|
|
130
|
-
await editorClient.post('/api/canopycms/branches', {
|
|
131
|
-
branch: 'feature/enum-test',
|
|
132
|
-
title: 'Enum Test',
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
// Try to add comment with invalid type
|
|
136
|
-
const response = await editorClient.post('/api/canopycms/feature-enum-test/comments', {
|
|
137
|
-
text: 'Test comment',
|
|
138
|
-
type: 'invalid-type',
|
|
139
|
-
entryPath: 'posts/test',
|
|
140
|
-
} as any)
|
|
141
|
-
|
|
142
|
-
expect(response.status).toBe(400)
|
|
143
|
-
expect(response.ok).toBe(false)
|
|
144
|
-
const error = await response.json<ApiResponse>()
|
|
145
|
-
expect(error.error).toBeDefined()
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('validates required threadId parameter for resolve', async () => {
|
|
149
|
-
// Create test branch
|
|
150
|
-
await editorClient.post('/api/canopycms/branches', {
|
|
151
|
-
branch: 'feature/resolve-test',
|
|
152
|
-
title: 'Resolve Test',
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
// Try to resolve with empty threadId
|
|
156
|
-
// Note: Router returns 404 when path params are missing (not matched route)
|
|
157
|
-
const response = await editorClient.post(
|
|
158
|
-
'/api/canopycms/feature-resolve-test/comments//resolve',
|
|
159
|
-
{},
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
expect(response.status).toBe(404)
|
|
163
|
-
expect(response.ok).toBe(false)
|
|
164
|
-
})
|
|
165
|
-
})
|
|
166
|
-
})
|