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,445 +0,0 @@
|
|
|
1
|
-
import { vi } from 'vitest'
|
|
2
|
-
import type { ApiContext } from '../api/types'
|
|
3
|
-
import type { BranchContext, BranchStatus, BranchAccessControl } from '../types'
|
|
4
|
-
import type { CanopyServices } from '../services'
|
|
5
|
-
import type { CanopyUser } from '../user'
|
|
6
|
-
import type { CanopyConfig, PathPermission } from '../config'
|
|
7
|
-
import { RESERVED_GROUPS } from '../authorization'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Options for creating a mock BranchContext
|
|
11
|
-
*/
|
|
12
|
-
export interface MockBranchContextOptions {
|
|
13
|
-
branchName?: string
|
|
14
|
-
status?: BranchStatus
|
|
15
|
-
createdBy?: string
|
|
16
|
-
access?: BranchAccessControl
|
|
17
|
-
baseRoot?: string
|
|
18
|
-
branchRoot?: string
|
|
19
|
-
pullRequestNumber?: number
|
|
20
|
-
pullRequestUrl?: string
|
|
21
|
-
title?: string
|
|
22
|
-
description?: string
|
|
23
|
-
createdAt?: string
|
|
24
|
-
updatedAt?: string
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Create a mock BranchContext with sensible defaults.
|
|
29
|
-
*
|
|
30
|
-
* @param options - Override any default values
|
|
31
|
-
* @returns A complete BranchContext object for testing
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* // Default: main branch in editing status
|
|
35
|
-
* const ctx = createMockBranchContext()
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* // Custom branch with PR info
|
|
39
|
-
* const ctx = createMockBranchContext({
|
|
40
|
-
* branchName: 'feature/test',
|
|
41
|
-
* status: 'submitted',
|
|
42
|
-
* pullRequestNumber: 123
|
|
43
|
-
* })
|
|
44
|
-
*/
|
|
45
|
-
export function createMockBranchContext(options: MockBranchContextOptions = {}): BranchContext {
|
|
46
|
-
const branchName = options.branchName ?? 'main'
|
|
47
|
-
const baseRoot = options.baseRoot ?? '/tmp/base'
|
|
48
|
-
const branchRoot =
|
|
49
|
-
options.branchRoot ?? (branchName === 'main' ? baseRoot : `${baseRoot}/${branchName}`)
|
|
50
|
-
|
|
51
|
-
return {
|
|
52
|
-
baseRoot,
|
|
53
|
-
branchRoot,
|
|
54
|
-
branch: {
|
|
55
|
-
name: branchName,
|
|
56
|
-
status: options.status ?? 'editing',
|
|
57
|
-
access: options.access ?? {},
|
|
58
|
-
createdBy: options.createdBy ?? 'u1',
|
|
59
|
-
createdAt: options.createdAt ?? 'now',
|
|
60
|
-
updatedAt: options.updatedAt ?? 'now',
|
|
61
|
-
...(options.title && { title: options.title }),
|
|
62
|
-
...(options.description && { description: options.description }),
|
|
63
|
-
...(options.pullRequestNumber && {
|
|
64
|
-
pullRequestNumber: options.pullRequestNumber,
|
|
65
|
-
}),
|
|
66
|
-
...(options.pullRequestUrl && { pullRequestUrl: options.pullRequestUrl }),
|
|
67
|
-
},
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Options for creating a mock user
|
|
73
|
-
*/
|
|
74
|
-
export interface MockUserOptions {
|
|
75
|
-
userId?: string
|
|
76
|
-
groups?: string[]
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Create a mock CanopyUser with common role presets.
|
|
81
|
-
*
|
|
82
|
-
* @param role - User role preset: 'admin', 'reviewer', or 'user'
|
|
83
|
-
* @param options - Override userId or groups
|
|
84
|
-
* @returns A CanopyUser object for testing
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* const admin = createMockUser('admin')
|
|
88
|
-
* const reviewer = createMockUser('reviewer')
|
|
89
|
-
* const user = createMockUser() // default is regular user
|
|
90
|
-
* const custom = createMockUser('user', { userId: 'custom-user', groups: ['editors'] })
|
|
91
|
-
*/
|
|
92
|
-
export function createMockUser(
|
|
93
|
-
role: 'admin' | 'reviewer' | 'user' = 'user',
|
|
94
|
-
options: MockUserOptions = {},
|
|
95
|
-
): CanopyUser {
|
|
96
|
-
const defaults = {
|
|
97
|
-
admin: { userId: 'admin', groups: [RESERVED_GROUPS.ADMINS] },
|
|
98
|
-
reviewer: { userId: 'reviewer', groups: [RESERVED_GROUPS.REVIEWERS] },
|
|
99
|
-
user: { userId: 'u1', groups: [] },
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const preset = defaults[role]
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
type: 'authenticated',
|
|
106
|
-
userId: options.userId ?? preset.userId,
|
|
107
|
-
groups: options.groups ?? preset.groups,
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Create a mock GitManager with all required methods.
|
|
113
|
-
*
|
|
114
|
-
* @returns A mock GitManager object with vi.fn() for all methods
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* const gitManager = createMockGitManager()
|
|
118
|
-
* gitManager.status.mockResolvedValue({ files: [], ahead: 0, behind: 0, current: 'main' })
|
|
119
|
-
*/
|
|
120
|
-
export function createMockGitManager() {
|
|
121
|
-
return {
|
|
122
|
-
checkoutBranch: vi.fn().mockResolvedValue(undefined),
|
|
123
|
-
status: vi.fn().mockResolvedValue({
|
|
124
|
-
files: [],
|
|
125
|
-
ahead: 0,
|
|
126
|
-
behind: 0,
|
|
127
|
-
current: 'main',
|
|
128
|
-
}),
|
|
129
|
-
add: vi.fn().mockResolvedValue(undefined),
|
|
130
|
-
commit: vi.fn().mockResolvedValue(undefined),
|
|
131
|
-
push: vi.fn().mockResolvedValue(undefined),
|
|
132
|
-
ensureAuthor: vi.fn().mockResolvedValue(undefined),
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Options for creating mock CanopyServices
|
|
138
|
-
*/
|
|
139
|
-
export interface MockServicesOptions {
|
|
140
|
-
config?: Partial<CanopyConfig>
|
|
141
|
-
entrySchemaRegistry?: any
|
|
142
|
-
branchSchemaCache?: any
|
|
143
|
-
checkBranchAccess?: any
|
|
144
|
-
checkPathAccess?: any
|
|
145
|
-
checkContentAccess?: any
|
|
146
|
-
createGitManagerFor?: any
|
|
147
|
-
registry?: any
|
|
148
|
-
githubService?: any
|
|
149
|
-
bootstrapAdminIds?: Set<string>
|
|
150
|
-
commitFiles?: any
|
|
151
|
-
submitBranch?: any
|
|
152
|
-
commitToSettingsBranch?: any
|
|
153
|
-
getSettingsBranchRoot?: any
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Create mock CanopyServices with sensible defaults.
|
|
158
|
-
*
|
|
159
|
-
* @param options - Override any service properties
|
|
160
|
-
* @returns A complete CanopyServices object for testing
|
|
161
|
-
*
|
|
162
|
-
* @example
|
|
163
|
-
* const services = createMockServices({
|
|
164
|
-
* config: { mode: 'prod-sim' }
|
|
165
|
-
* })
|
|
166
|
-
*/
|
|
167
|
-
export function createMockServices(options: MockServicesOptions = {}): CanopyServices {
|
|
168
|
-
const defaultConfig: Partial<CanopyConfig> = {
|
|
169
|
-
defaultBaseBranch: 'main',
|
|
170
|
-
mode: 'dev',
|
|
171
|
-
...options.config,
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return {
|
|
175
|
-
config: defaultConfig as any,
|
|
176
|
-
entrySchemaRegistry: options.entrySchemaRegistry ?? {},
|
|
177
|
-
branchSchemaCache:
|
|
178
|
-
options.branchSchemaCache ??
|
|
179
|
-
({
|
|
180
|
-
getSchema: vi.fn().mockResolvedValue({
|
|
181
|
-
schema: {},
|
|
182
|
-
flatSchema: [],
|
|
183
|
-
}),
|
|
184
|
-
invalidate: vi.fn().mockResolvedValue(undefined),
|
|
185
|
-
clearAll: vi.fn().mockResolvedValue(undefined),
|
|
186
|
-
} as any),
|
|
187
|
-
checkBranchAccess:
|
|
188
|
-
options.checkBranchAccess ?? vi.fn().mockReturnValue({ allowed: true, reason: 'allowed' }),
|
|
189
|
-
checkPathAccess: options.checkPathAccess ?? (undefined as any),
|
|
190
|
-
checkContentAccess:
|
|
191
|
-
options.checkContentAccess ??
|
|
192
|
-
vi.fn().mockResolvedValue({ allowed: true, branch: {}, path: {} }),
|
|
193
|
-
createGitManagerFor: options.createGitManagerFor ?? vi.fn(() => createMockGitManager()),
|
|
194
|
-
registry: options.registry ?? (undefined as any),
|
|
195
|
-
githubService: options.githubService,
|
|
196
|
-
bootstrapAdminIds: options.bootstrapAdminIds ?? new Set<string>(),
|
|
197
|
-
commitFiles: options.commitFiles ?? vi.fn().mockResolvedValue(undefined),
|
|
198
|
-
submitBranch: options.submitBranch ?? vi.fn().mockResolvedValue(undefined),
|
|
199
|
-
commitToSettingsBranch:
|
|
200
|
-
options.commitToSettingsBranch ??
|
|
201
|
-
vi.fn().mockResolvedValue({ committed: true, pushed: true }),
|
|
202
|
-
getSettingsBranchRoot:
|
|
203
|
-
options.getSettingsBranchRoot ?? vi.fn().mockResolvedValue('/mock/settings'),
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Options for creating mock ApiContext
|
|
209
|
-
*/
|
|
210
|
-
export interface MockApiContextOptions {
|
|
211
|
-
services?: Partial<CanopyServices>
|
|
212
|
-
getBranchContext?: any
|
|
213
|
-
assetStore?: any
|
|
214
|
-
authPlugin?: any
|
|
215
|
-
// Convenience options
|
|
216
|
-
branchContext?: BranchContext | null
|
|
217
|
-
allowBranchAccess?: boolean
|
|
218
|
-
allowContentAccess?: boolean
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Create a mock ApiContext with sensible defaults.
|
|
223
|
-
*
|
|
224
|
-
* @param options - Override any context properties
|
|
225
|
-
* @returns A complete ApiContext object for testing
|
|
226
|
-
*
|
|
227
|
-
* @example
|
|
228
|
-
* // Simple context with default main branch
|
|
229
|
-
* const ctx = createMockApiContext()
|
|
230
|
-
*
|
|
231
|
-
* @example
|
|
232
|
-
* // Context with custom branch and access control
|
|
233
|
-
* const ctx = createMockApiContext({
|
|
234
|
-
* branchContext: createMockBranchContext({ branchName: 'feature/test' }),
|
|
235
|
-
* allowBranchAccess: false
|
|
236
|
-
* })
|
|
237
|
-
*
|
|
238
|
-
* @example
|
|
239
|
-
* // Context with branch not found
|
|
240
|
-
* const ctx = createMockApiContext({ branchContext: null })
|
|
241
|
-
*/
|
|
242
|
-
export function createMockApiContext(options: MockApiContextOptions = {}): ApiContext {
|
|
243
|
-
// Handle convenience options for access control
|
|
244
|
-
const servicesOptions: MockServicesOptions = {}
|
|
245
|
-
|
|
246
|
-
if (options.allowBranchAccess !== undefined) {
|
|
247
|
-
servicesOptions.checkBranchAccess = vi.fn().mockReturnValue({
|
|
248
|
-
allowed: options.allowBranchAccess,
|
|
249
|
-
reason: options.allowBranchAccess ? 'allowed' : 'denied',
|
|
250
|
-
})
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
if (options.allowContentAccess !== undefined) {
|
|
254
|
-
servicesOptions.checkContentAccess = vi.fn().mockResolvedValue({
|
|
255
|
-
allowed: options.allowContentAccess,
|
|
256
|
-
branch: {},
|
|
257
|
-
path: {},
|
|
258
|
-
})
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Merge with user-provided services
|
|
262
|
-
const services = createMockServices({
|
|
263
|
-
...servicesOptions,
|
|
264
|
-
...options.services,
|
|
265
|
-
})
|
|
266
|
-
|
|
267
|
-
// Handle branchContext convenience option
|
|
268
|
-
let getBranchContext = options.getBranchContext
|
|
269
|
-
if (options.branchContext !== undefined && !options.getBranchContext) {
|
|
270
|
-
getBranchContext = vi.fn().mockResolvedValue(options.branchContext)
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
services,
|
|
275
|
-
getBranchContext: getBranchContext ?? vi.fn().mockResolvedValue(createMockBranchContext()),
|
|
276
|
-
...(options.assetStore && { assetStore: options.assetStore }),
|
|
277
|
-
...(options.authPlugin && { authPlugin: options.authPlugin }),
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Create a mock BranchRegistry with default branches.
|
|
283
|
-
*
|
|
284
|
-
* @param branches - Optional array of branch contexts to include
|
|
285
|
-
* @returns A mock registry with list, get, and invalidate methods
|
|
286
|
-
*
|
|
287
|
-
* @example
|
|
288
|
-
* const registry = createMockRegistry()
|
|
289
|
-
*
|
|
290
|
-
* @example
|
|
291
|
-
* const registry = createMockRegistry([
|
|
292
|
-
* createMockBranchContext({ branchName: 'feature/a', createdBy: 'u1' }),
|
|
293
|
-
* createMockBranchContext({ branchName: 'feature/b', createdBy: 'u2' })
|
|
294
|
-
* ])
|
|
295
|
-
*/
|
|
296
|
-
export function createMockRegistry(branches?: BranchContext[]) {
|
|
297
|
-
const defaultBranches = branches ?? [
|
|
298
|
-
createMockBranchContext({ branchName: 'feature/a', createdBy: 'u1' }),
|
|
299
|
-
createMockBranchContext({ branchName: 'feature/b', createdBy: 'u2' }),
|
|
300
|
-
createMockBranchContext({
|
|
301
|
-
branchName: 'feature/c',
|
|
302
|
-
createdBy: 'u3',
|
|
303
|
-
access: { allowedUsers: ['u1'] },
|
|
304
|
-
}),
|
|
305
|
-
createMockBranchContext({
|
|
306
|
-
branchName: 'feature/d',
|
|
307
|
-
createdBy: 'u3',
|
|
308
|
-
access: { allowedGroups: ['editors'] },
|
|
309
|
-
}),
|
|
310
|
-
]
|
|
311
|
-
|
|
312
|
-
return {
|
|
313
|
-
list: vi.fn().mockResolvedValue(defaultBranches),
|
|
314
|
-
get: vi.fn().mockResolvedValue(undefined),
|
|
315
|
-
invalidate: vi.fn().mockResolvedValue(undefined),
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Create a mock GitHub service.
|
|
321
|
-
*
|
|
322
|
-
* @returns A mock GitHub service with common methods
|
|
323
|
-
*
|
|
324
|
-
* @example
|
|
325
|
-
* const githubService = createMockGitHubService()
|
|
326
|
-
* githubService.convertToDraft.mockResolvedValue(undefined)
|
|
327
|
-
*/
|
|
328
|
-
export function createMockGitHubService() {
|
|
329
|
-
return {
|
|
330
|
-
convertToDraft: vi.fn().mockResolvedValue(undefined),
|
|
331
|
-
markReadyForReview: vi.fn().mockResolvedValue(undefined),
|
|
332
|
-
closePullRequest: vi.fn().mockResolvedValue(undefined),
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* Create a mock BranchMetadataFileManager for use with vi.mock().
|
|
338
|
-
*
|
|
339
|
-
* @param saveImpl - Optional custom implementation for save method
|
|
340
|
-
* @returns Mock implementation object
|
|
341
|
-
*
|
|
342
|
-
* @example
|
|
343
|
-
* vi.mock('../branch-metadata', () => createMockBranchMetadata())
|
|
344
|
-
*
|
|
345
|
-
* @example
|
|
346
|
-
* const mockSave = vi.fn().mockResolvedValue({ branch: { status: 'submitted' } })
|
|
347
|
-
* vi.mock('../branch-metadata', () => createMockBranchMetadata(mockSave))
|
|
348
|
-
*/
|
|
349
|
-
export function createMockBranchMetadata(saveImpl?: any) {
|
|
350
|
-
const defaultSave = vi.fn().mockResolvedValue({
|
|
351
|
-
schemaVersion: 1,
|
|
352
|
-
branch: {
|
|
353
|
-
name: 'feature/x',
|
|
354
|
-
status: 'editing',
|
|
355
|
-
access: {},
|
|
356
|
-
createdBy: 'u1',
|
|
357
|
-
createdAt: 'now',
|
|
358
|
-
updatedAt: 'now',
|
|
359
|
-
},
|
|
360
|
-
})
|
|
361
|
-
|
|
362
|
-
const save = saveImpl ?? defaultSave
|
|
363
|
-
|
|
364
|
-
return {
|
|
365
|
-
BranchMetadataFileManager: vi.fn().mockImplementation(() => ({
|
|
366
|
-
save,
|
|
367
|
-
})),
|
|
368
|
-
getBranchMetadataFileManager: vi.fn().mockImplementation(() => ({
|
|
369
|
-
save,
|
|
370
|
-
})),
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Create mock permissions loader for use with vi.mock().
|
|
376
|
-
*
|
|
377
|
-
* @param permissions - Default permissions to return
|
|
378
|
-
* @returns Mock implementation object
|
|
379
|
-
*
|
|
380
|
-
* @example
|
|
381
|
-
* vi.mock('../permissions-loader', () => createMockPermissionsLoader())
|
|
382
|
-
*
|
|
383
|
-
* @example
|
|
384
|
-
* vi.mock('../permissions-loader', () =>
|
|
385
|
-
* createMockPermissionsLoader([{ path: 'content/**', edit: { allowedUsers: ['u1'] } }])
|
|
386
|
-
* )
|
|
387
|
-
*/
|
|
388
|
-
export function createMockPermissionsLoader(permissions: PathPermission[] = []) {
|
|
389
|
-
return {
|
|
390
|
-
loadPathPermissions: vi.fn().mockResolvedValue(permissions),
|
|
391
|
-
loadPermissionsFile: vi.fn().mockResolvedValue(null),
|
|
392
|
-
savePathPermissions: vi.fn().mockResolvedValue(undefined),
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Create mock BranchWorkspaceManager for use with vi.mock().
|
|
398
|
-
*
|
|
399
|
-
* @param branchContext - Optional branch context to return from openOrCreateBranch
|
|
400
|
-
* @returns Mock implementation object
|
|
401
|
-
*
|
|
402
|
-
* @example
|
|
403
|
-
* vi.mock('../branch-workspace', () => createMockBranchWorkspace())
|
|
404
|
-
*/
|
|
405
|
-
export function createMockBranchWorkspace(branchContext?: BranchContext) {
|
|
406
|
-
const defaultContext =
|
|
407
|
-
branchContext ??
|
|
408
|
-
createMockBranchContext({
|
|
409
|
-
branchName: 'feature/test',
|
|
410
|
-
})
|
|
411
|
-
|
|
412
|
-
return {
|
|
413
|
-
BranchWorkspaceManager: vi.fn().mockImplementation(() => ({
|
|
414
|
-
openOrCreateBranch: vi.fn().mockResolvedValue(defaultContext),
|
|
415
|
-
})),
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Create mock CommentStore for use with vi.mock().
|
|
421
|
-
*
|
|
422
|
-
* @returns Mock implementation object
|
|
423
|
-
*
|
|
424
|
-
* @example
|
|
425
|
-
* vi.mock('../comment-store', () => createMockCommentStore())
|
|
426
|
-
*/
|
|
427
|
-
export function createMockCommentStore() {
|
|
428
|
-
return {
|
|
429
|
-
CommentStore: vi.fn().mockImplementation(() => ({
|
|
430
|
-
listThreads: vi.fn().mockResolvedValue([]),
|
|
431
|
-
addComment: vi.fn().mockResolvedValue({ threadId: 'thread1', commentId: 'c1' }),
|
|
432
|
-
getThread: vi.fn().mockResolvedValue({
|
|
433
|
-
id: 'thread1',
|
|
434
|
-
comments: [],
|
|
435
|
-
resolved: false,
|
|
436
|
-
type: 'field',
|
|
437
|
-
entryPath: 'posts/hello',
|
|
438
|
-
canopyPath: 'title',
|
|
439
|
-
authorId: 'u1',
|
|
440
|
-
createdAt: 'now',
|
|
441
|
-
}),
|
|
442
|
-
resolveThread: vi.fn().mockResolvedValue(true),
|
|
443
|
-
})),
|
|
444
|
-
}
|
|
445
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { mockConsole } from './console-spy.js'
|
|
3
|
-
|
|
4
|
-
describe('mockConsole', () => {
|
|
5
|
-
it('captures console.warn', () => {
|
|
6
|
-
const consoleSpy = mockConsole()
|
|
7
|
-
console.warn('test warning message')
|
|
8
|
-
console.error('test error message')
|
|
9
|
-
console.log('All captured:', JSON.stringify(consoleSpy.all()))
|
|
10
|
-
expect(consoleSpy).toHaveWarned('test warning')
|
|
11
|
-
expect(consoleSpy).toHaveErrored('test error')
|
|
12
|
-
consoleSpy.restore()
|
|
13
|
-
})
|
|
14
|
-
})
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { vi, expect } from 'vitest'
|
|
2
|
-
|
|
3
|
-
type ConsoleMethod = 'log' | 'warn' | 'error' | 'info' | 'debug'
|
|
4
|
-
|
|
5
|
-
interface CapturedMessages {
|
|
6
|
-
log: string[]
|
|
7
|
-
warn: string[]
|
|
8
|
-
error: string[]
|
|
9
|
-
info: string[]
|
|
10
|
-
debug: string[]
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface MockConsole {
|
|
14
|
-
/** Restore all original console methods */
|
|
15
|
-
restore: () => void
|
|
16
|
-
/** Get all captured messages by method */
|
|
17
|
-
all: () => CapturedMessages
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Mocks all console methods, capturing messages for assertion.
|
|
22
|
-
* All console output is swallowed (not printed to terminal).
|
|
23
|
-
* Use the custom matchers to assert on captured messages.
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```ts
|
|
27
|
-
* const consoleSpy = mockConsole()
|
|
28
|
-
* doSomething()
|
|
29
|
-
* expect(consoleSpy).toHaveWarned('deprecated')
|
|
30
|
-
* expect(consoleSpy).toHaveErrored(/token not found/)
|
|
31
|
-
* consoleSpy.restore()
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export function mockConsole(): MockConsole {
|
|
35
|
-
const captured: CapturedMessages = {
|
|
36
|
-
log: [],
|
|
37
|
-
warn: [],
|
|
38
|
-
error: [],
|
|
39
|
-
info: [],
|
|
40
|
-
debug: [],
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const spies: any[] = []
|
|
44
|
-
|
|
45
|
-
const methods: ConsoleMethod[] = ['log', 'warn', 'error', 'info', 'debug']
|
|
46
|
-
|
|
47
|
-
for (const method of methods) {
|
|
48
|
-
const spy = vi.spyOn(console, method).mockImplementation((...args: unknown[]) => {
|
|
49
|
-
const message = args.map((arg) => (typeof arg === 'string' ? arg : String(arg))).join(' ')
|
|
50
|
-
captured[method].push(message)
|
|
51
|
-
// Swallow all output - don't print anything
|
|
52
|
-
})
|
|
53
|
-
spies.push(spy)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return {
|
|
57
|
-
restore: () => spies.forEach((spy) => spy.mockRestore()),
|
|
58
|
-
all: () => ({ ...captured }),
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Custom matchers for cleaner assertions
|
|
63
|
-
declare module 'vitest' {
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
65
|
-
interface Assertion<T> {
|
|
66
|
-
toHaveLogged(expected: string | RegExp): void
|
|
67
|
-
toHaveWarned(expected: string | RegExp): void
|
|
68
|
-
toHaveErrored(expected: string | RegExp): void
|
|
69
|
-
}
|
|
70
|
-
interface AsymmetricMatchersContaining {
|
|
71
|
-
toHaveLogged(expected: string | RegExp): void
|
|
72
|
-
toHaveWarned(expected: string | RegExp): void
|
|
73
|
-
toHaveErrored(expected: string | RegExp): void
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function matchesPattern(messages: string[], pattern: string | RegExp): boolean {
|
|
78
|
-
return messages.some((msg) =>
|
|
79
|
-
typeof pattern === 'string' ? msg.includes(pattern) : pattern.test(msg),
|
|
80
|
-
)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function formatMessages(label: string, messages: string[]): string {
|
|
84
|
-
if (messages.length === 0) return ''
|
|
85
|
-
return `${label}:\n${messages.map((m) => ` - "${m}"`).join('\n')}`
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export const consoleMatchers = {
|
|
89
|
-
toHaveLogged(received: MockConsole, expected: string | RegExp) {
|
|
90
|
-
const all = received.all()
|
|
91
|
-
const pass = matchesPattern(all.log, expected)
|
|
92
|
-
return {
|
|
93
|
-
pass,
|
|
94
|
-
message: () =>
|
|
95
|
-
pass
|
|
96
|
-
? `Expected console.log NOT to have logged matching ${expected}`
|
|
97
|
-
: `Expected console.log to have logged matching ${expected}\n\n${formatMessages('Received', all.log) || ' (no messages)'}`,
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
toHaveWarned(received: MockConsole, expected: string | RegExp) {
|
|
101
|
-
const all = received.all()
|
|
102
|
-
const pass = matchesPattern(all.warn, expected)
|
|
103
|
-
return {
|
|
104
|
-
pass,
|
|
105
|
-
message: () =>
|
|
106
|
-
pass
|
|
107
|
-
? `Expected console.warn NOT to have warned matching ${expected}`
|
|
108
|
-
: `Expected console.warn to have warned matching ${expected}\n\n${formatMessages('Received', all.warn) || ' (no messages)'}`,
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
|
-
toHaveErrored(received: MockConsole, expected: string | RegExp) {
|
|
112
|
-
const all = received.all()
|
|
113
|
-
const pass = matchesPattern(all.error, expected)
|
|
114
|
-
return {
|
|
115
|
-
pass,
|
|
116
|
-
message: () =>
|
|
117
|
-
pass
|
|
118
|
-
? `Expected console.error NOT to have errored matching ${expected}`
|
|
119
|
-
: `Expected console.error to have errored matching ${expected}\n\n${formatMessages('Received', all.error) || ' (no messages)'}`,
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Auto-register matchers when this module is imported
|
|
125
|
-
expect.extend(consoleMatchers)
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { simpleGit, type SimpleGit } from 'simple-git'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Initialize a test git repository with CanopyCMS marker and user config.
|
|
5
|
-
* This ensures the repo can be used with GitManager.ensureAuthor().
|
|
6
|
-
*
|
|
7
|
-
* @param baseDir - Directory to initialize git repo in
|
|
8
|
-
* @param options - Optional configuration
|
|
9
|
-
* @returns SimpleGit instance for the initialized repo
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* const git = await initTestRepo(tmpDir)
|
|
13
|
-
* await git.add(['.'])
|
|
14
|
-
* await git.commit('Initial commit')
|
|
15
|
-
*/
|
|
16
|
-
export async function initTestRepo(
|
|
17
|
-
baseDir: string,
|
|
18
|
-
options?: {
|
|
19
|
-
/** Git user name (default: 'Test Bot') */
|
|
20
|
-
userName?: string
|
|
21
|
-
/** Git user email (default: 'test@canopycms.test') */
|
|
22
|
-
userEmail?: string
|
|
23
|
-
},
|
|
24
|
-
): Promise<SimpleGit> {
|
|
25
|
-
const git = simpleGit({ baseDir })
|
|
26
|
-
await git.init()
|
|
27
|
-
await git.addConfig('canopycms.managed', 'true')
|
|
28
|
-
await git.addConfig('user.name', options?.userName ?? 'Test Bot')
|
|
29
|
-
await git.addConfig('user.email', options?.userEmail ?? 'test@canopycms.test')
|
|
30
|
-
return git
|
|
31
|
-
}
|
package/src/test-utils/index.ts
DELETED
package/src/types.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { ContentId } from './paths/types'
|
|
2
|
-
|
|
3
|
-
export type CanopyUserId = string
|
|
4
|
-
export type CanopyGroupId = string
|
|
5
|
-
|
|
6
|
-
export type BranchStatus = 'editing' | 'submitted' | 'approved' | 'locked' | 'archived'
|
|
7
|
-
export type SyncStatus = 'synced' | 'pending-sync' | 'sync-failed'
|
|
8
|
-
export type ConflictStatus = 'clean' | 'conflicts-detected'
|
|
9
|
-
|
|
10
|
-
export interface BranchAccessControl {
|
|
11
|
-
allowedUsers?: CanopyUserId[]
|
|
12
|
-
allowedGroups?: CanopyGroupId[]
|
|
13
|
-
managerOrAdminAllowed?: boolean
|
|
14
|
-
adminOnly?: boolean
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface BranchMetadata {
|
|
18
|
-
name: string
|
|
19
|
-
title?: string
|
|
20
|
-
description?: string
|
|
21
|
-
status: BranchStatus
|
|
22
|
-
access: BranchAccessControl
|
|
23
|
-
createdBy: CanopyUserId
|
|
24
|
-
createdAt: string
|
|
25
|
-
updatedAt: string
|
|
26
|
-
pullRequestUrl?: string
|
|
27
|
-
pullRequestNumber?: number
|
|
28
|
-
/** Sync status for async GitHub operations (used when Lambda has no internet) */
|
|
29
|
-
syncStatus?: SyncStatus
|
|
30
|
-
/** Whether this branch has unresolved merge conflicts with the base branch */
|
|
31
|
-
conflictStatus?: ConflictStatus
|
|
32
|
-
/** ContentIds of entries where --theirs was applied during rebase; cleared on clean rebase */
|
|
33
|
-
conflictFiles?: ContentId[]
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface BranchPaths {
|
|
37
|
-
/** Root where all branches live (e.g., /mnt/efs/site, ~/.canopycms/branches) */
|
|
38
|
-
baseRoot: string
|
|
39
|
-
|
|
40
|
-
/** This branch's directory. Usually {baseRoot}/{branchName}, equals baseRoot in dev mode */
|
|
41
|
-
branchRoot: string
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface BranchContext extends BranchPaths {
|
|
45
|
-
branch: BranchMetadata
|
|
46
|
-
|
|
47
|
-
/** Per-branch flattened schema (lazy-loaded via getBranchContext with loadSchema: true) */
|
|
48
|
-
flatSchema?: import('./config').FlatSchemaItem[]
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** BranchContext with guaranteed flatSchema (loaded via schema guard or loadSchema: true) */
|
|
52
|
-
export interface BranchContextWithSchema extends BranchContext {
|
|
53
|
-
flatSchema: import('./config').FlatSchemaItem[]
|
|
54
|
-
}
|