canopycms 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/plugin.d.ts +8 -0
- package/dist/auth/plugin.d.ts.map +1 -1
- package/dist/build-mode.d.ts +15 -5
- package/dist/build-mode.d.ts.map +1 -1
- package/dist/build-mode.js +18 -8
- package/dist/build-mode.js.map +1 -1
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +37 -36
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/template-files/ai-config.ts.template +21 -0
- package/dist/cli/template-files/ai-route.ts.template +10 -0
- package/dist/cli/template-files/canopy.ts.template +24 -0
- package/dist/cli/templates.d.ts +5 -1
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +9 -2
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/schemas/config.d.ts +4 -0
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +2 -0
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config/types.d.ts +5 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/content-reader.js +2 -2
- package/dist/content-reader.js.map +1 -1
- package/dist/context.js +5 -5
- package/dist/context.js.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.js +15 -18
- package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
- package/dist/operating-mode/types.d.ts +8 -0
- package/dist/operating-mode/types.d.ts.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/package.json +5 -4
- package/src/cli/init.ts +43 -38
- package/dist/__integration__/fixtures/content-seeds.d.ts +0 -43
- package/dist/__integration__/fixtures/content-seeds.d.ts.map +0 -1
- package/dist/__integration__/fixtures/content-seeds.js +0 -99
- package/dist/__integration__/fixtures/content-seeds.js.map +0 -1
- package/dist/__integration__/fixtures/schemas.d.ts +0 -12
- package/dist/__integration__/fixtures/schemas.d.ts.map +0 -1
- package/dist/__integration__/fixtures/schemas.js +0 -65
- package/dist/__integration__/fixtures/schemas.js.map +0 -1
- package/dist/__integration__/test-utils/api-client.d.ts +0 -123
- package/dist/__integration__/test-utils/api-client.d.ts.map +0 -1
- package/dist/__integration__/test-utils/api-client.js +0 -118
- package/dist/__integration__/test-utils/api-client.js.map +0 -1
- package/dist/__integration__/test-utils/multi-user.d.ts +0 -25
- package/dist/__integration__/test-utils/multi-user.d.ts.map +0 -1
- package/dist/__integration__/test-utils/multi-user.js +0 -105
- package/dist/__integration__/test-utils/multi-user.js.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.d.ts +0 -25
- package/dist/__integration__/test-utils/test-workspace.d.ts.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.js +0 -102
- package/dist/__integration__/test-utils/test-workspace.js.map +0 -1
- package/dist/editor/BranchManager.stories.d.ts +0 -8
- package/dist/editor/BranchManager.stories.d.ts.map +0 -1
- package/dist/editor/BranchManager.stories.js +0 -74
- package/dist/editor/BranchManager.stories.js.map +0 -1
- package/dist/editor/CanopyEditor.stories.d.ts +0 -7
- package/dist/editor/CanopyEditor.stories.d.ts.map +0 -1
- package/dist/editor/CanopyEditor.stories.js +0 -99
- package/dist/editor/CanopyEditor.stories.js.map +0 -1
- package/dist/editor/CommentsPanel.stories.d.ts +0 -10
- package/dist/editor/CommentsPanel.stories.d.ts.map +0 -1
- package/dist/editor/CommentsPanel.stories.js +0 -175
- package/dist/editor/CommentsPanel.stories.js.map +0 -1
- package/dist/editor/Editor.stories.d.ts +0 -7
- package/dist/editor/Editor.stories.d.ts.map +0 -1
- package/dist/editor/Editor.stories.js +0 -95
- package/dist/editor/Editor.stories.js.map +0 -1
- package/dist/editor/EditorPanes.stories.d.ts +0 -7
- package/dist/editor/EditorPanes.stories.d.ts.map +0 -1
- package/dist/editor/EditorPanes.stories.js +0 -116
- package/dist/editor/EditorPanes.stories.js.map +0 -1
- package/dist/editor/EntryNavigator.stories.d.ts +0 -8
- package/dist/editor/EntryNavigator.stories.d.ts.map +0 -1
- package/dist/editor/EntryNavigator.stories.js +0 -42
- package/dist/editor/EntryNavigator.stories.js.map +0 -1
- package/dist/editor/FormRenderer.stories.d.ts +0 -7
- package/dist/editor/FormRenderer.stories.d.ts.map +0 -1
- package/dist/editor/FormRenderer.stories.js +0 -115
- package/dist/editor/FormRenderer.stories.js.map +0 -1
- package/dist/editor/GroupManager.stories.d.ts +0 -19
- package/dist/editor/GroupManager.stories.d.ts.map +0 -1
- package/dist/editor/GroupManager.stories.js +0 -265
- package/dist/editor/GroupManager.stories.js.map +0 -1
- package/dist/editor/PermissionManager.stories.d.ts +0 -20
- package/dist/editor/PermissionManager.stories.d.ts.map +0 -1
- package/dist/editor/PermissionManager.stories.js +0 -506
- package/dist/editor/PermissionManager.stories.js.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.d.ts +0 -10
- package/dist/editor/comments/FieldWrapper.stories.d.ts.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.js +0 -173
- package/dist/editor/comments/FieldWrapper.stories.js.map +0 -1
- package/dist/editor/fields/BlockField.stories.d.ts +0 -7
- package/dist/editor/fields/BlockField.stories.d.ts.map +0 -1
- package/dist/editor/fields/BlockField.stories.js +0 -50
- package/dist/editor/fields/BlockField.stories.js.map +0 -1
- package/dist/editor/fields/fields.stories.d.ts +0 -8
- package/dist/editor/fields/fields.stories.d.ts.map +0 -1
- package/dist/editor/fields/fields.stories.js +0 -34
- package/dist/editor/fields/fields.stories.js.map +0 -1
- package/dist/test-utils/api-test-helpers.d.ts +0 -238
- package/dist/test-utils/api-test-helpers.d.ts.map +0 -1
- package/dist/test-utils/api-test-helpers.js +0 -347
- package/dist/test-utils/api-test-helpers.js.map +0 -1
- package/dist/test-utils/console-spy.d.ts +0 -56
- package/dist/test-utils/console-spy.d.ts.map +0 -1
- package/dist/test-utils/console-spy.js +0 -81
- package/dist/test-utils/console-spy.js.map +0 -1
- package/dist/test-utils/git-helpers.d.ts +0 -21
- package/dist/test-utils/git-helpers.d.ts.map +0 -1
- package/dist/test-utils/git-helpers.js +0 -23
- package/dist/test-utils/git-helpers.js.map +0 -1
- package/dist/test-utils/index.d.ts +0 -5
- package/dist/test-utils/index.d.ts.map +0 -1
- package/dist/test-utils/index.js +0 -4
- package/dist/test-utils/index.js.map +0 -1
- package/src/__integration__/errors/invalid-content.test.ts +0 -238
- package/src/__integration__/errors/permission-denied.test.ts +0 -220
- package/src/__integration__/fixtures/content-seeds.ts +0 -105
- package/src/__integration__/fixtures/schemas.ts +0 -67
- package/src/__integration__/initialization/prod-sim-init.test.ts +0 -139
- package/src/__integration__/permissions/path-permissions.test.ts +0 -314
- package/src/__integration__/permissions/role-permissions.test.ts +0 -354
- package/src/__integration__/permissions/settings-branch-isolation.test.ts +0 -317
- package/src/__integration__/settings/groups-api.test.ts +0 -403
- package/src/__integration__/test-utils/api-client.ts +0 -167
- package/src/__integration__/test-utils/multi-user.ts +0 -129
- package/src/__integration__/test-utils/test-workspace.ts +0 -130
- package/src/__integration__/user/user-context.test.ts +0 -174
- package/src/__integration__/validation/input-validation.test.ts +0 -166
- package/src/__integration__/workflows/api-editing-workflow.test.ts +0 -244
- package/src/__integration__/workflows/conflict-resolution.test.ts +0 -259
- package/src/__integration__/workflows/editing-workflow.test.ts +0 -205
- package/src/__integration__/workflows/review-workflow.test.ts +0 -260
- package/src/ai/__tests__/build.integration.test.ts +0 -224
- package/src/ai/__tests__/generate.integration.test.ts +0 -495
- package/src/ai/__tests__/handler.integration.test.ts +0 -212
- package/src/ai/__tests__/json-to-markdown.test.ts +0 -553
- package/src/ai/generate.ts +0 -410
- package/src/ai/handler.ts +0 -123
- package/src/ai/index.ts +0 -26
- package/src/ai/json-to-markdown.ts +0 -424
- package/src/ai/resolve-branch.ts +0 -34
- package/src/ai/types.ts +0 -160
- package/src/api/AGENTS.md +0 -81
- package/src/api/__test__/mock-client.ts +0 -404
- package/src/api/assets.test.ts +0 -140
- package/src/api/assets.ts +0 -154
- package/src/api/branch-merge.test.ts +0 -163
- package/src/api/branch-merge.ts +0 -113
- package/src/api/branch-review.test.ts +0 -297
- package/src/api/branch-review.ts +0 -136
- package/src/api/branch-status.test.ts +0 -85
- package/src/api/branch-status.ts +0 -153
- package/src/api/branch-withdraw.test.ts +0 -146
- package/src/api/branch-withdraw.ts +0 -81
- package/src/api/branch-workflow.integration.test.ts +0 -578
- package/src/api/branch.test.ts +0 -620
- package/src/api/branch.ts +0 -492
- package/src/api/client.test.ts +0 -349
- package/src/api/client.ts +0 -506
- package/src/api/comments.test.ts +0 -285
- package/src/api/comments.ts +0 -210
- package/src/api/content.test.ts +0 -345
- package/src/api/content.ts +0 -454
- package/src/api/entries.test.ts +0 -1339
- package/src/api/entries.ts +0 -650
- package/src/api/github-sync.ts +0 -144
- package/src/api/groups.test.ts +0 -1013
- package/src/api/groups.ts +0 -375
- package/src/api/guards.test.ts +0 -533
- package/src/api/guards.ts +0 -271
- package/src/api/index.ts +0 -87
- package/src/api/permissions.test.ts +0 -766
- package/src/api/permissions.ts +0 -334
- package/src/api/reference-options.ts +0 -118
- package/src/api/resolve-references.ts +0 -107
- package/src/api/route-builder.ts +0 -289
- package/src/api/schema.test.ts +0 -840
- package/src/api/schema.ts +0 -936
- package/src/api/security.test.ts +0 -233
- package/src/api/settings-helpers.ts +0 -84
- package/src/api/types.ts +0 -40
- package/src/api/user.test.ts +0 -127
- package/src/api/user.ts +0 -42
- package/src/api/validators.test.ts +0 -275
- package/src/api/validators.ts +0 -176
- package/src/asset-store.test.ts +0 -37
- package/src/asset-store.ts +0 -110
- package/src/auth/cache.ts +0 -7
- package/src/auth/caching-auth-plugin.test.ts +0 -154
- package/src/auth/caching-auth-plugin.ts +0 -109
- package/src/auth/context-helpers.ts +0 -75
- package/src/auth/file-based-auth-cache.test.ts +0 -257
- package/src/auth/file-based-auth-cache.ts +0 -279
- package/src/auth/index.ts +0 -12
- package/src/auth/plugin.ts +0 -51
- package/src/auth/types.ts +0 -38
- package/src/authorization/__tests__/branch.test.ts +0 -260
- package/src/authorization/__tests__/content.test.ts +0 -142
- package/src/authorization/__tests__/path.test.ts +0 -133
- package/src/authorization/__tests__/permissions-loader.test.ts +0 -200
- package/src/authorization/branch.ts +0 -94
- package/src/authorization/content.ts +0 -93
- package/src/authorization/groups/index.ts +0 -11
- package/src/authorization/groups/loader.ts +0 -127
- package/src/authorization/groups/schema.ts +0 -48
- package/src/authorization/helpers.ts +0 -48
- package/src/authorization/index.ts +0 -84
- package/src/authorization/path.ts +0 -112
- package/src/authorization/permissions/index.ts +0 -11
- package/src/authorization/permissions/loader.ts +0 -116
- package/src/authorization/permissions/schema.ts +0 -66
- package/src/authorization/test-utils.ts +0 -15
- package/src/authorization/types.ts +0 -66
- package/src/authorization/validation.test.ts +0 -100
- package/src/authorization/validation.ts +0 -62
- package/src/branch-metadata.test.ts +0 -168
- package/src/branch-metadata.ts +0 -166
- package/src/branch-registry.test.ts +0 -248
- package/src/branch-registry.ts +0 -152
- package/src/branch-schema-cache.test.ts +0 -275
- package/src/branch-schema-cache.ts +0 -189
- package/src/branch-workspace.test.ts +0 -183
- package/src/branch-workspace.ts +0 -124
- package/src/build/generate-ai-content.ts +0 -78
- package/src/build/index.ts +0 -8
- package/src/build-mode.ts +0 -27
- package/src/cli/generate-ai-content.ts +0 -100
- package/src/cli/init.test.ts +0 -240
- package/src/cli/templates/canopy.ts.template +0 -55
- package/src/cli/templates.ts +0 -47
- package/src/client.ts +0 -12
- package/src/comment-store.test.ts +0 -442
- package/src/comment-store.ts +0 -301
- package/src/config/__tests__/config.test.ts +0 -513
- package/src/config/flatten.ts +0 -174
- package/src/config/helpers.ts +0 -167
- package/src/config/index.ts +0 -86
- package/src/config/schemas/collection.ts +0 -67
- package/src/config/schemas/config.ts +0 -77
- package/src/config/schemas/field.ts +0 -108
- package/src/config/schemas/media.ts +0 -27
- package/src/config/schemas/permissions.ts +0 -21
- package/src/config/types.ts +0 -321
- package/src/config/validation.ts +0 -70
- package/src/config-test.ts +0 -65
- package/src/config.ts +0 -11
- package/src/content-id-index.test.ts +0 -512
- package/src/content-id-index.ts +0 -479
- package/src/content-reader.test.ts +0 -478
- package/src/content-reader.ts +0 -214
- package/src/content-store.test.ts +0 -1126
- package/src/content-store.ts +0 -793
- package/src/context.ts +0 -111
- package/src/editor/BranchManager.stories.tsx +0 -80
- package/src/editor/BranchManager.test.tsx +0 -324
- package/src/editor/BranchManager.tsx +0 -461
- package/src/editor/CanopyEditor.stories.tsx +0 -128
- package/src/editor/CanopyEditor.test.tsx +0 -81
- package/src/editor/CanopyEditor.tsx +0 -73
- package/src/editor/CanopyEditorPage.test.tsx +0 -59
- package/src/editor/CanopyEditorPage.tsx +0 -25
- package/src/editor/CommentsPanel.stories.tsx +0 -184
- package/src/editor/CommentsPanel.tsx +0 -338
- package/src/editor/Editor.integration.test.tsx +0 -227
- package/src/editor/Editor.stories.tsx +0 -119
- package/src/editor/Editor.tsx +0 -1221
- package/src/editor/EditorPanes.stories.tsx +0 -256
- package/src/editor/EditorPanes.test.tsx +0 -77
- package/src/editor/EditorPanes.tsx +0 -180
- package/src/editor/EntryNavigator.stories.tsx +0 -65
- package/src/editor/EntryNavigator.test.tsx +0 -598
- package/src/editor/EntryNavigator.tsx +0 -665
- package/src/editor/FormRenderer.stories.tsx +0 -212
- package/src/editor/FormRenderer.test.tsx +0 -194
- package/src/editor/FormRenderer.tsx +0 -432
- package/src/editor/GroupManager.stories.tsx +0 -301
- package/src/editor/GroupManager.test.tsx +0 -682
- package/src/editor/GroupManager.tsx +0 -9
- package/src/editor/PermissionManager.stories.tsx +0 -539
- package/src/editor/PermissionManager.test.tsx +0 -864
- package/src/editor/PermissionManager.tsx +0 -12
- package/src/editor/canopy-path.test.ts +0 -23
- package/src/editor/canopy-path.ts +0 -52
- package/src/editor/client-reference-resolver.ts +0 -118
- package/src/editor/comments/BranchComments.tsx +0 -93
- package/src/editor/comments/EntryComments.tsx +0 -94
- package/src/editor/comments/FieldWrapper.stories.tsx +0 -210
- package/src/editor/comments/FieldWrapper.tsx +0 -129
- package/src/editor/comments/InlineCommentThread.test.tsx +0 -384
- package/src/editor/comments/InlineCommentThread.tsx +0 -246
- package/src/editor/comments/ThreadCarousel.test.tsx +0 -393
- package/src/editor/comments/ThreadCarousel.tsx +0 -525
- package/src/editor/components/ConfirmDeleteModal.tsx +0 -49
- package/src/editor/components/EditorContext.tsx +0 -49
- package/src/editor/components/EditorFooter.tsx +0 -47
- package/src/editor/components/EditorHeader.tsx +0 -492
- package/src/editor/components/EditorSidebar.tsx +0 -193
- package/src/editor/components/EntryCreateModal.tsx +0 -193
- package/src/editor/components/RenameEntryModal.tsx +0 -152
- package/src/editor/components/UserBadge.test.tsx +0 -274
- package/src/editor/components/UserBadge.tsx +0 -240
- package/src/editor/components/index.ts +0 -6
- package/src/editor/context/ApiClientContext.tsx +0 -56
- package/src/editor/context/EditorStateContext.tsx +0 -221
- package/src/editor/context/index.ts +0 -40
- package/src/editor/editor-config.test.ts +0 -385
- package/src/editor/editor-config.ts +0 -94
- package/src/editor/editor-utils.test.ts +0 -772
- package/src/editor/editor-utils.ts +0 -303
- package/src/editor/env.ts +0 -4
- package/src/editor/fields/BlockField.stories.tsx +0 -79
- package/src/editor/fields/BlockField.tsx +0 -267
- package/src/editor/fields/CodeField.tsx +0 -41
- package/src/editor/fields/MarkdownField.tsx +0 -205
- package/src/editor/fields/ObjectField.tsx +0 -71
- package/src/editor/fields/ReferenceField.tsx +0 -138
- package/src/editor/fields/SelectField.tsx +0 -76
- package/src/editor/fields/TextField.tsx +0 -35
- package/src/editor/fields/ToggleField.tsx +0 -37
- package/src/editor/fields/fields.stories.tsx +0 -40
- package/src/editor/group-manager/ExternalGroupsTab.tsx +0 -114
- package/src/editor/group-manager/GroupCard.tsx +0 -102
- package/src/editor/group-manager/GroupForm.tsx +0 -66
- package/src/editor/group-manager/InternalGroupsTab.tsx +0 -147
- package/src/editor/group-manager/MemberList.tsx +0 -184
- package/src/editor/group-manager/hooks/useExternalGroupSearch.ts +0 -63
- package/src/editor/group-manager/hooks/useGroupState.ts +0 -134
- package/src/editor/group-manager/hooks/useUserSearch.ts +0 -84
- package/src/editor/group-manager/index.tsx +0 -210
- package/src/editor/group-manager/types.ts +0 -28
- package/src/editor/hooks/README.md +0 -26
- package/src/editor/hooks/__test__/test-utils.tsx +0 -183
- package/src/editor/hooks/index.ts +0 -23
- package/src/editor/hooks/useBranchActions.test.tsx +0 -267
- package/src/editor/hooks/useBranchActions.tsx +0 -121
- package/src/editor/hooks/useBranchManager.test.tsx +0 -391
- package/src/editor/hooks/useBranchManager.tsx +0 -326
- package/src/editor/hooks/useCommentSystem.test.ts +0 -615
- package/src/editor/hooks/useCommentSystem.ts +0 -347
- package/src/editor/hooks/useDraftManager.test.ts +0 -375
- package/src/editor/hooks/useDraftManager.ts +0 -259
- package/src/editor/hooks/useEditorLayout.test.ts +0 -147
- package/src/editor/hooks/useEditorLayout.ts +0 -67
- package/src/editor/hooks/useEntryManager.test.ts +0 -588
- package/src/editor/hooks/useEntryManager.ts +0 -387
- package/src/editor/hooks/useGroupManager.test.ts +0 -277
- package/src/editor/hooks/useGroupManager.ts +0 -139
- package/src/editor/hooks/usePermissionManager.test.ts +0 -211
- package/src/editor/hooks/usePermissionManager.ts +0 -113
- package/src/editor/hooks/useReferenceResolution.ts +0 -248
- package/src/editor/hooks/useSchemaManager.test.ts +0 -370
- package/src/editor/hooks/useSchemaManager.ts +0 -310
- package/src/editor/hooks/useUserContext.tsx +0 -57
- package/src/editor/hooks/useUserMetadata.test.ts +0 -191
- package/src/editor/hooks/useUserMetadata.ts +0 -71
- package/src/editor/permission-manager/GroupSelector.tsx +0 -73
- package/src/editor/permission-manager/PermissionEditor.tsx +0 -321
- package/src/editor/permission-manager/PermissionLevelBadge.tsx +0 -53
- package/src/editor/permission-manager/PermissionTree.tsx +0 -237
- package/src/editor/permission-manager/UserSelector.tsx +0 -95
- package/src/editor/permission-manager/constants.tsx +0 -18
- package/src/editor/permission-manager/hooks/useGroupsAndUsers.ts +0 -153
- package/src/editor/permission-manager/hooks/usePermissionTree.ts +0 -200
- package/src/editor/permission-manager/index.tsx +0 -294
- package/src/editor/permission-manager/types.ts +0 -58
- package/src/editor/permission-manager/utils.ts +0 -179
- package/src/editor/preview-bridge.test.tsx +0 -50
- package/src/editor/preview-bridge.tsx +0 -294
- package/src/editor/schema-editor/CollectionEditor.test.tsx +0 -238
- package/src/editor/schema-editor/CollectionEditor.tsx +0 -520
- package/src/editor/schema-editor/EntryTypeEditor.test.tsx +0 -215
- package/src/editor/schema-editor/EntryTypeEditor.tsx +0 -367
- package/src/editor/schema-editor/index.ts +0 -19
- package/src/editor/setup-test-dom.ts +0 -10
- package/src/editor/test-setup.ts +0 -33
- package/src/editor/theme.tsx +0 -119
- package/src/editor/utils/env.ts +0 -39
- package/src/entry-schema-registry.test.ts +0 -281
- package/src/entry-schema-registry.ts +0 -121
- package/src/entry-schema.ts +0 -84
- package/src/git-manager.test.ts +0 -552
- package/src/git-manager.ts +0 -667
- package/src/github-service.test.ts +0 -312
- package/src/github-service.ts +0 -295
- package/src/http/handler.test.ts +0 -275
- package/src/http/handler.ts +0 -280
- package/src/http/index.ts +0 -11
- package/src/http/router.ts +0 -164
- package/src/http/types.ts +0 -44
- package/src/id.test.ts +0 -48
- package/src/id.ts +0 -22
- package/src/index.ts +0 -26
- package/src/operating-mode/__tests__/strategies.test.ts +0 -511
- package/src/operating-mode/client-safe-strategy.ts +0 -184
- package/src/operating-mode/client-unsafe-strategy.ts +0 -303
- package/src/operating-mode/client.ts +0 -13
- package/src/operating-mode/index.ts +0 -34
- package/src/operating-mode/types.ts +0 -186
- package/src/paths/__tests__/branch.test.ts +0 -53
- package/src/paths/__tests__/normalize.test.ts +0 -141
- package/src/paths/__tests__/resolve.test.ts +0 -207
- package/src/paths/__tests__/validation.test.ts +0 -61
- package/src/paths/branch.ts +0 -115
- package/src/paths/index.ts +0 -73
- package/src/paths/normalize-server.ts +0 -40
- package/src/paths/normalize.ts +0 -107
- package/src/paths/resolve.ts +0 -61
- package/src/paths/test-utils.ts +0 -37
- package/src/paths/types.ts +0 -68
- package/src/paths/validation.test.ts +0 -480
- package/src/paths/validation.ts +0 -391
- package/src/reference-resolver.test.ts +0 -107
- package/src/reference-resolver.ts +0 -157
- package/src/schema/index.ts +0 -29
- package/src/schema/meta-loader.ts +0 -366
- package/src/schema/resolver.ts +0 -83
- package/src/schema/schema-store-types.ts +0 -56
- package/src/schema/schema-store.test.ts +0 -816
- package/src/schema/schema-store.ts +0 -795
- package/src/schema/types.ts +0 -33
- package/src/schema-meta-loader.test.ts +0 -447
- package/src/server.ts +0 -15
- package/src/services.test.ts +0 -559
- package/src/services.ts +0 -373
- package/src/settings-branch-utils.ts +0 -53
- package/src/settings-workspace.ts +0 -156
- package/src/task-queue/README.md +0 -144
- package/src/task-queue/index.ts +0 -14
- package/src/task-queue/task-queue.test.ts +0 -524
- package/src/task-queue/task-queue.ts +0 -514
- package/src/task-queue/types.ts +0 -41
- package/src/test-utils/api-test-helpers.ts +0 -445
- package/src/test-utils/console-spy.test.ts +0 -14
- package/src/test-utils/console-spy.ts +0 -125
- package/src/test-utils/git-helpers.ts +0 -31
- package/src/test-utils/index.ts +0 -4
- package/src/types.ts +0 -54
- package/src/user.ts +0 -118
- package/src/utils/debug.test.ts +0 -114
- package/src/utils/debug.ts +0 -127
- package/src/utils/error.test.ts +0 -92
- package/src/utils/error.ts +0 -83
- package/src/utils/format.ts +0 -12
- package/src/validation/__tests__/field-traversal.test.ts +0 -263
- package/src/validation/deletion-checker.ts +0 -234
- package/src/validation/field-traversal.ts +0 -146
- package/src/validation/reference-validator.ts +0 -168
- package/src/worker/cms-worker-rebase.test.ts +0 -473
- package/src/worker/cms-worker.ts +0 -777
- package/src/worker/integration.test.ts +0 -289
- package/src/worker/task-queue-config.ts +0 -25
- package/src/worker/task-queue.test.ts +0 -452
- package/src/worker/task-queue.ts +0 -58
- /package/{src/cli/templates → dist/cli/template-files}/Dockerfile.cms.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/canopycms.config.ts.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/deploy-cms.yml.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/edit-page.tsx.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/route.ts.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/schemas.ts.template +0 -0
package/src/config/helpers.ts
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Helper functions for authoring CanopyCMS configuration files.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { validateCanopyConfig } from './validation'
|
|
6
|
-
import type {
|
|
7
|
-
CanopyConfig,
|
|
8
|
-
CanopyConfigFragment,
|
|
9
|
-
CanopyConfigInput,
|
|
10
|
-
CanopyClientConfig,
|
|
11
|
-
ClientOnlyFields,
|
|
12
|
-
ContentRoot,
|
|
13
|
-
DefaultBaseBranch,
|
|
14
|
-
DefaultBranchAccess,
|
|
15
|
-
DefaultPathAccess,
|
|
16
|
-
DefaultRemoteName,
|
|
17
|
-
DefaultRemoteUrl,
|
|
18
|
-
GitBotAuthorEmail,
|
|
19
|
-
GitBotAuthorName,
|
|
20
|
-
CanopyOperatingMode,
|
|
21
|
-
MediaConfig,
|
|
22
|
-
SourceRoot,
|
|
23
|
-
} from './types'
|
|
24
|
-
|
|
25
|
-
export type CanopyConfigAuthoring = CanopyConfigInput
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Helper for authoring typed config files (canopycms.config.ts).
|
|
29
|
-
* Performs runtime validation using the CanopyConfig schema.
|
|
30
|
-
* Returns a bundle with `server` (full config) and `client(overrides)` (safe subset).
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```ts
|
|
34
|
-
* // canopycms.config.ts
|
|
35
|
-
* import { defineCanopyConfig } from 'canopycms'
|
|
36
|
-
*
|
|
37
|
-
* export const canopyConfig = defineCanopyConfig({
|
|
38
|
-
* gitBotAuthorName: 'Bot',
|
|
39
|
-
* gitBotAuthorEmail: 'bot@example.com',
|
|
40
|
-
* schema: {
|
|
41
|
-
* collections: [...]
|
|
42
|
-
* }
|
|
43
|
-
* })
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export function defineCanopyConfig(config: CanopyConfigInput | CanopyConfigAuthoring) {
|
|
47
|
-
const validated = validateCanopyConfig(config as CanopyConfigInput)
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
// Full server config - all fields including sensitive data
|
|
51
|
-
server: validated,
|
|
52
|
-
|
|
53
|
-
// Client config helper - extracts safe subset and merges overrides
|
|
54
|
-
// Note: flatSchema is loaded dynamically by the editor via API (from .collection.json files)
|
|
55
|
-
client: (clientOverrides?: ClientOnlyFields): CanopyClientConfig => {
|
|
56
|
-
const { defaultBaseBranch, contentRoot, editor, mode } = validated
|
|
57
|
-
const clientConfig: CanopyClientConfig = {
|
|
58
|
-
defaultBaseBranch,
|
|
59
|
-
contentRoot,
|
|
60
|
-
editor,
|
|
61
|
-
mode,
|
|
62
|
-
flatSchema: [], // Loaded dynamically by editor via API
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Merge client overrides (e.g., auth handlers from useClerkAuthConfig)
|
|
66
|
-
if (clientOverrides?.editor) {
|
|
67
|
-
clientConfig.editor = {
|
|
68
|
-
...clientConfig.editor,
|
|
69
|
-
...clientOverrides.editor,
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return clientConfig
|
|
74
|
-
},
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Helper to compose config fragments defined across multiple files.
|
|
80
|
-
* Useful for splitting large configurations into domain-specific modules.
|
|
81
|
-
* Later fragments can override media.
|
|
82
|
-
*
|
|
83
|
-
* @example
|
|
84
|
-
* ```ts
|
|
85
|
-
* // posts.config.ts
|
|
86
|
-
* export const postsConfig = { media: {...}, contentRoot: 'content/posts' }
|
|
87
|
-
*
|
|
88
|
-
* // canopycms.config.ts
|
|
89
|
-
* import { composeCanopyConfig } from 'canopycms'
|
|
90
|
-
* import { postsConfig } from './posts.config'
|
|
91
|
-
* import { pagesConfig } from './pages.config'
|
|
92
|
-
*
|
|
93
|
-
* export const config = composeCanopyConfig(postsConfig, pagesConfig)
|
|
94
|
-
* ```
|
|
95
|
-
*/
|
|
96
|
-
export const composeCanopyConfig = (...fragments: CanopyConfigFragment[]): CanopyConfig => {
|
|
97
|
-
let media: MediaConfig | undefined
|
|
98
|
-
let contentRoot: ContentRoot | undefined
|
|
99
|
-
let sourceRoot: SourceRoot | undefined
|
|
100
|
-
let defaultBranchAccess: DefaultBranchAccess | undefined
|
|
101
|
-
let defaultPathAccess: DefaultPathAccess | undefined
|
|
102
|
-
let defaultBaseBranch: DefaultBaseBranch | undefined
|
|
103
|
-
let defaultRemoteName: DefaultRemoteName | undefined
|
|
104
|
-
let defaultRemoteUrl: DefaultRemoteUrl | undefined
|
|
105
|
-
let gitBotAuthorName: GitBotAuthorName | undefined
|
|
106
|
-
let gitBotAuthorEmail: GitBotAuthorEmail | undefined
|
|
107
|
-
let mode: CanopyOperatingMode | undefined
|
|
108
|
-
let deploymentName: string | undefined
|
|
109
|
-
|
|
110
|
-
for (const fragment of fragments) {
|
|
111
|
-
if (fragment.media) {
|
|
112
|
-
media = fragment.media
|
|
113
|
-
}
|
|
114
|
-
if (fragment.contentRoot) {
|
|
115
|
-
contentRoot = fragment.contentRoot
|
|
116
|
-
}
|
|
117
|
-
if (fragment.sourceRoot) {
|
|
118
|
-
sourceRoot = fragment.sourceRoot
|
|
119
|
-
}
|
|
120
|
-
if (fragment.defaultBranchAccess) {
|
|
121
|
-
defaultBranchAccess = fragment.defaultBranchAccess
|
|
122
|
-
}
|
|
123
|
-
if (fragment.defaultPathAccess) {
|
|
124
|
-
defaultPathAccess = fragment.defaultPathAccess
|
|
125
|
-
}
|
|
126
|
-
if (fragment.defaultBaseBranch) {
|
|
127
|
-
defaultBaseBranch = fragment.defaultBaseBranch
|
|
128
|
-
}
|
|
129
|
-
if (fragment.defaultRemoteName) {
|
|
130
|
-
defaultRemoteName = fragment.defaultRemoteName
|
|
131
|
-
}
|
|
132
|
-
if (fragment.defaultRemoteUrl) {
|
|
133
|
-
defaultRemoteUrl = fragment.defaultRemoteUrl
|
|
134
|
-
}
|
|
135
|
-
if (fragment.gitBotAuthorName) {
|
|
136
|
-
gitBotAuthorName = fragment.gitBotAuthorName
|
|
137
|
-
}
|
|
138
|
-
if (fragment.gitBotAuthorEmail) {
|
|
139
|
-
gitBotAuthorEmail = fragment.gitBotAuthorEmail
|
|
140
|
-
}
|
|
141
|
-
if (fragment.mode) {
|
|
142
|
-
mode = fragment.mode
|
|
143
|
-
}
|
|
144
|
-
if (fragment.deploymentName) {
|
|
145
|
-
deploymentName = fragment.deploymentName
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const merged: CanopyConfigInput = {
|
|
150
|
-
gitBotAuthorName: gitBotAuthorName ?? '',
|
|
151
|
-
gitBotAuthorEmail: gitBotAuthorEmail ?? '',
|
|
152
|
-
...(media ? { media } : {}),
|
|
153
|
-
...(contentRoot ? { contentRoot } : {}),
|
|
154
|
-
...(sourceRoot ? { sourceRoot } : {}),
|
|
155
|
-
...(defaultBranchAccess ? { defaultBranchAccess } : {}),
|
|
156
|
-
...(defaultPathAccess ? { defaultPathAccess } : {}),
|
|
157
|
-
...(defaultBaseBranch ? { defaultBaseBranch } : {}),
|
|
158
|
-
...(defaultRemoteName ? { defaultRemoteName } : {}),
|
|
159
|
-
...(defaultRemoteUrl ? { defaultRemoteUrl } : {}),
|
|
160
|
-
...(gitBotAuthorName ? { gitBotAuthorName } : {}),
|
|
161
|
-
...(gitBotAuthorEmail ? { gitBotAuthorEmail } : {}),
|
|
162
|
-
...(mode ? { mode } : {}),
|
|
163
|
-
...(deploymentName ? { deploymentName } : {}),
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return validateCanopyConfig(merged)
|
|
167
|
-
}
|
package/src/config/index.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CanopyCMS Configuration Module
|
|
3
|
-
*
|
|
4
|
-
* This module provides types, schemas, and utilities for configuring CanopyCMS.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```ts
|
|
8
|
-
* import { defineCanopyConfig, type FieldConfig } from 'canopycms/config'
|
|
9
|
-
* ```
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
// Re-export all types
|
|
13
|
-
export type {
|
|
14
|
-
// Field types
|
|
15
|
-
PrimitiveFieldType,
|
|
16
|
-
FieldType,
|
|
17
|
-
ContentFormat,
|
|
18
|
-
MediaAdapterKind,
|
|
19
|
-
// Permission types
|
|
20
|
-
PermissionLevel,
|
|
21
|
-
PermissionTarget,
|
|
22
|
-
PathPermission,
|
|
23
|
-
// Field configs
|
|
24
|
-
SelectOption,
|
|
25
|
-
ReferenceOption,
|
|
26
|
-
FieldConfig,
|
|
27
|
-
BlockConfig,
|
|
28
|
-
BlockFieldConfig,
|
|
29
|
-
SelectFieldConfig,
|
|
30
|
-
ReferenceFieldConfig,
|
|
31
|
-
ObjectFieldConfig,
|
|
32
|
-
CustomFieldConfig,
|
|
33
|
-
// Schema types
|
|
34
|
-
EntrySchema,
|
|
35
|
-
BranchSchema,
|
|
36
|
-
EntryTypeConfig,
|
|
37
|
-
CollectionConfig,
|
|
38
|
-
RootCollectionConfig,
|
|
39
|
-
// Media
|
|
40
|
-
MediaConfig,
|
|
41
|
-
// Editor
|
|
42
|
-
CanopyEditorConfig,
|
|
43
|
-
// Config types
|
|
44
|
-
DefaultBranchAccess,
|
|
45
|
-
DefaultPathAccess,
|
|
46
|
-
DefaultBaseBranch,
|
|
47
|
-
DefaultRemoteName,
|
|
48
|
-
DefaultRemoteUrl,
|
|
49
|
-
GitBotAuthorName,
|
|
50
|
-
GitBotAuthorEmail,
|
|
51
|
-
GithubTokenEnvVar,
|
|
52
|
-
CanopyOperatingMode,
|
|
53
|
-
ContentRoot,
|
|
54
|
-
SourceRoot,
|
|
55
|
-
CanopyConfig,
|
|
56
|
-
CanopyConfigInput,
|
|
57
|
-
CanopyConfigFragment,
|
|
58
|
-
FlatSchemaItem,
|
|
59
|
-
CanopyClientConfig,
|
|
60
|
-
ClientOnlyFields,
|
|
61
|
-
} from './types'
|
|
62
|
-
|
|
63
|
-
// Re-export type constants
|
|
64
|
-
export { primitiveFieldTypes, fieldTypes } from './types'
|
|
65
|
-
|
|
66
|
-
// Re-export schemas (for advanced use cases)
|
|
67
|
-
export { CanopyConfigSchema, getConfigDefaults, DEFAULT_PROD_WORKSPACE } from './schemas/config'
|
|
68
|
-
export {
|
|
69
|
-
fieldSchema,
|
|
70
|
-
blockSchema,
|
|
71
|
-
selectOptionSchema,
|
|
72
|
-
referenceOptionSchema,
|
|
73
|
-
} from './schemas/field'
|
|
74
|
-
export {
|
|
75
|
-
collectionSchema,
|
|
76
|
-
rootCollectionSchema,
|
|
77
|
-
entryTypeSchema,
|
|
78
|
-
relativePathSchema,
|
|
79
|
-
} from './schemas/collection'
|
|
80
|
-
export { permissionTargetSchema, pathPermissionSchema } from './schemas/permissions'
|
|
81
|
-
export { mediaSchema } from './schemas/media'
|
|
82
|
-
|
|
83
|
-
// Re-export utilities
|
|
84
|
-
export { flattenSchema, normalizePathValue, normalizeSchemaPathsRoot } from './flatten'
|
|
85
|
-
export { validateCanopyConfig, ensureSelectFieldsHaveOptions } from './validation'
|
|
86
|
-
export { defineCanopyConfig, composeCanopyConfig, type CanopyConfigAuthoring } from './helpers'
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zod schemas for collection configuration validation.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { z } from 'zod'
|
|
6
|
-
import { isAbsolute } from 'pathe'
|
|
7
|
-
|
|
8
|
-
import { fieldSchema } from './field'
|
|
9
|
-
|
|
10
|
-
// Relative path schema - validates and normalizes paths
|
|
11
|
-
export const relativePathSchema = z
|
|
12
|
-
.string()
|
|
13
|
-
.min(1)
|
|
14
|
-
.refine((val) => !isAbsolute(val), { message: 'Path must be relative' })
|
|
15
|
-
.refine((val) => !val.split(/[\\/]+/).includes('..'), {
|
|
16
|
-
message: 'Path must not contain ".."',
|
|
17
|
-
})
|
|
18
|
-
.transform((val) =>
|
|
19
|
-
val
|
|
20
|
-
.split(/[\\/]+/)
|
|
21
|
-
.filter(Boolean)
|
|
22
|
-
.join('/'),
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Entry type schema: defines a type of content within a collection.
|
|
27
|
-
* Each type has its own schema (fields) and can have cardinality constraints.
|
|
28
|
-
*
|
|
29
|
-
* Examples:
|
|
30
|
-
* - { name: 'post', format: 'mdx', schema: postSchema } - unlimited posts
|
|
31
|
-
* - { name: 'settings', format: 'json', schema: settingsSchema, maxItems: 1 } - restricted to one instance
|
|
32
|
-
*/
|
|
33
|
-
export const entryTypeSchema = z.object({
|
|
34
|
-
name: z.string().min(1),
|
|
35
|
-
format: z.enum(['md', 'mdx', 'json']),
|
|
36
|
-
schema: z.array(z.lazy(() => fieldSchema)).min(1),
|
|
37
|
-
label: z.string().optional(),
|
|
38
|
-
description: z.string().optional(),
|
|
39
|
-
default: z.boolean().optional(),
|
|
40
|
-
maxItems: z.number().int().positive().optional(),
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
// Recursive collection schema
|
|
44
|
-
const collectionSchema: z.ZodTypeAny = z.lazy(() =>
|
|
45
|
-
z
|
|
46
|
-
.object({
|
|
47
|
-
name: z.string().min(1),
|
|
48
|
-
path: relativePathSchema,
|
|
49
|
-
label: z.string().optional(),
|
|
50
|
-
description: z.string().optional(),
|
|
51
|
-
entries: z.array(entryTypeSchema).optional(),
|
|
52
|
-
collections: z.array(collectionSchema).optional(),
|
|
53
|
-
order: z.array(z.string()).optional(), // Embedded IDs for ordering items
|
|
54
|
-
})
|
|
55
|
-
.refine((data) => data.entries || data.collections, {
|
|
56
|
-
message: 'Collection must have entries or collections',
|
|
57
|
-
}),
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
// Root collection: no name/path required (top-level schema)
|
|
61
|
-
export const rootCollectionSchema = z.object({
|
|
62
|
-
entries: z.array(entryTypeSchema).optional(),
|
|
63
|
-
collections: z.array(collectionSchema).optional(),
|
|
64
|
-
order: z.array(z.string()).optional(), // Embedded IDs for ordering items
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
export { collectionSchema }
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main CanopyConfig Zod schema - composes all sub-schemas.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { z } from 'zod'
|
|
6
|
-
|
|
7
|
-
import type { AuthPlugin } from '../../auth/plugin'
|
|
8
|
-
import { rootCollectionSchema, relativePathSchema } from './collection'
|
|
9
|
-
import { mediaSchema } from './media'
|
|
10
|
-
|
|
11
|
-
// Default value schemas
|
|
12
|
-
export const defaultBranchAccessSchema = z.enum(['allow', 'deny']).default('deny')
|
|
13
|
-
export const defaultPathAccessSchema = z.enum(['allow', 'deny']).default('deny')
|
|
14
|
-
export const defaultBaseBranchSchema = z.string().default('main')
|
|
15
|
-
export const defaultRemoteNameSchema = z.string().default('origin')
|
|
16
|
-
export const defaultRemoteUrlSchema = z.string().min(1)
|
|
17
|
-
export const gitBotAuthorNameSchema = z.string().min(1)
|
|
18
|
-
export const gitBotAuthorEmailSchema = z.string().email()
|
|
19
|
-
export const githubTokenEnvVarSchema = z.string().default('GITHUB_BOT_TOKEN')
|
|
20
|
-
export const operatingModeSchema = z.enum(['prod', 'prod-sim', 'dev']).default('dev')
|
|
21
|
-
export const contentRootSchema = relativePathSchema.default('content')
|
|
22
|
-
export const sourceRootSchema = z.string().min(1).optional()
|
|
23
|
-
export const deploymentNameSchema = z.string().default('prod')
|
|
24
|
-
|
|
25
|
-
// Editor configuration schema
|
|
26
|
-
export const editorConfigSchema = z.object({
|
|
27
|
-
title: z.string().optional(),
|
|
28
|
-
subtitle: z.string().optional(),
|
|
29
|
-
theme: z.unknown().optional(),
|
|
30
|
-
previewBase: z.record(z.string()).optional(),
|
|
31
|
-
// UI handler functions (runtime only, don't serialize)
|
|
32
|
-
onAccountClick: z.function().returns(z.void()).optional(),
|
|
33
|
-
onLogoutClick: z.function().returns(z.void()).optional(),
|
|
34
|
-
// Optional: custom account component (e.g., Clerk's UserButton)
|
|
35
|
-
AccountComponent: z.custom<React.ComponentType>().optional(),
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
// Main CanopyConfig schema
|
|
39
|
-
export const CanopyConfigSchema = z.object({
|
|
40
|
-
schema: rootCollectionSchema.optional(),
|
|
41
|
-
media: mediaSchema.optional(),
|
|
42
|
-
defaultBranchAccess: defaultBranchAccessSchema.optional(),
|
|
43
|
-
defaultPathAccess: defaultPathAccessSchema.optional(),
|
|
44
|
-
defaultBaseBranch: defaultBaseBranchSchema.optional(),
|
|
45
|
-
defaultRemoteName: defaultRemoteNameSchema.optional(),
|
|
46
|
-
defaultRemoteUrl: defaultRemoteUrlSchema.optional(),
|
|
47
|
-
gitBotAuthorName: gitBotAuthorNameSchema,
|
|
48
|
-
gitBotAuthorEmail: gitBotAuthorEmailSchema,
|
|
49
|
-
githubTokenEnvVar: githubTokenEnvVarSchema.optional(),
|
|
50
|
-
mode: operatingModeSchema, // Has .default(), so not optional in output type
|
|
51
|
-
settingsBranch: z.string().optional(),
|
|
52
|
-
autoCreateSettingsPR: z.boolean().optional(),
|
|
53
|
-
deploymentName: deploymentNameSchema.optional(),
|
|
54
|
-
contentRoot: contentRootSchema.default('content'),
|
|
55
|
-
sourceRoot: sourceRootSchema.optional(),
|
|
56
|
-
editor: editorConfigSchema.optional(),
|
|
57
|
-
authPlugin: z.custom<AuthPlugin>().optional(),
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Helper to get schema default values.
|
|
62
|
-
* This centralizes default value extraction from Zod schemas.
|
|
63
|
-
*/
|
|
64
|
-
/** Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set) */
|
|
65
|
-
export const DEFAULT_PROD_WORKSPACE = '/mnt/efs/workspace'
|
|
66
|
-
|
|
67
|
-
export const getConfigDefaults = () => ({
|
|
68
|
-
baseBranch: defaultBaseBranchSchema.parse(undefined),
|
|
69
|
-
remoteName: defaultRemoteNameSchema.parse(undefined),
|
|
70
|
-
pathAccess: defaultPathAccessSchema.parse(undefined),
|
|
71
|
-
branchAccess: defaultBranchAccessSchema.parse(undefined),
|
|
72
|
-
contentRoot: contentRootSchema.parse(undefined),
|
|
73
|
-
mode: operatingModeSchema.parse(undefined),
|
|
74
|
-
githubTokenEnvVar: githubTokenEnvVarSchema.parse(undefined),
|
|
75
|
-
deploymentName: deploymentNameSchema.parse(undefined),
|
|
76
|
-
prodWorkspace: DEFAULT_PROD_WORKSPACE,
|
|
77
|
-
})
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zod schemas for field configuration validation.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { z } from 'zod'
|
|
6
|
-
|
|
7
|
-
import { primitiveFieldTypes, fieldTypes } from '../types'
|
|
8
|
-
import type { FieldType } from '../types'
|
|
9
|
-
|
|
10
|
-
// Base field schema - shared properties
|
|
11
|
-
export const fieldBaseSchema = z.object({
|
|
12
|
-
name: z.string().min(1),
|
|
13
|
-
label: z.string().optional(),
|
|
14
|
-
description: z.string().optional(),
|
|
15
|
-
required: z.boolean().optional(),
|
|
16
|
-
list: z.boolean().optional(),
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
// Select option schema
|
|
20
|
-
export const selectOptionSchema = z.union([
|
|
21
|
-
z.string(),
|
|
22
|
-
z.object({
|
|
23
|
-
label: z.string().min(1),
|
|
24
|
-
value: z.string().min(1),
|
|
25
|
-
}),
|
|
26
|
-
])
|
|
27
|
-
|
|
28
|
-
// Reference option schema
|
|
29
|
-
export const referenceOptionSchema = z.union([
|
|
30
|
-
z.string(),
|
|
31
|
-
z.object({
|
|
32
|
-
label: z.string().min(1),
|
|
33
|
-
value: z.string().min(1),
|
|
34
|
-
}),
|
|
35
|
-
])
|
|
36
|
-
|
|
37
|
-
// Primitive field (string, number, boolean, etc.)
|
|
38
|
-
export const primitiveFieldSchema = fieldBaseSchema.extend({
|
|
39
|
-
type: z.enum(primitiveFieldTypes),
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
// Select field with options
|
|
43
|
-
export const selectFieldSchema = fieldBaseSchema.extend({
|
|
44
|
-
type: z.literal('select'),
|
|
45
|
-
options: z.array(selectOptionSchema).min(1),
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
// Reference field pointing to other collections
|
|
49
|
-
export const referenceFieldSchema = fieldBaseSchema.extend({
|
|
50
|
-
type: z.literal('reference'),
|
|
51
|
-
collections: z.array(z.string().min(1)).min(1),
|
|
52
|
-
displayField: z.string().min(1).optional(),
|
|
53
|
-
options: z.array(referenceOptionSchema).optional(),
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
// Use a mutable holder to enable forward references in recursive z.lazy() closures.
|
|
57
|
-
// blockSchema/objectFieldSchema reference fieldHolder[0] via z.lazy, which is resolved
|
|
58
|
-
// after the full fieldSchema is constructed below.
|
|
59
|
-
const fieldHolder: [z.ZodTypeAny] = [z.never()]
|
|
60
|
-
|
|
61
|
-
// Block template schema
|
|
62
|
-
export const blockSchema = z.object({
|
|
63
|
-
name: z.string().min(1),
|
|
64
|
-
label: z.string().optional(),
|
|
65
|
-
description: z.string().optional(),
|
|
66
|
-
fields: z.array(z.lazy(() => fieldHolder[0])).min(1),
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
// Block field with templates
|
|
70
|
-
export const blockFieldSchema = fieldBaseSchema.extend({
|
|
71
|
-
type: z.literal('block'),
|
|
72
|
-
templates: z.array(blockSchema).min(1),
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
// Object field with nested fields
|
|
76
|
-
export const objectFieldSchema = fieldBaseSchema.extend({
|
|
77
|
-
type: z.literal('object'),
|
|
78
|
-
fields: z.array(z.lazy(() => fieldHolder[0])).min(1),
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
// Custom field (user-defined type)
|
|
82
|
-
export const customFieldSchema = z.lazy(() =>
|
|
83
|
-
fieldBaseSchema
|
|
84
|
-
.extend({
|
|
85
|
-
type: z
|
|
86
|
-
.string()
|
|
87
|
-
.min(1)
|
|
88
|
-
.refine((val) => !fieldTypes.includes(val as FieldType), {
|
|
89
|
-
message: 'Custom field types must not conflict with built-in types',
|
|
90
|
-
}),
|
|
91
|
-
})
|
|
92
|
-
.passthrough(),
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
// Known built-in field types (discriminated union)
|
|
96
|
-
const knownFieldSchema: z.ZodTypeAny = z.discriminatedUnion('type', [
|
|
97
|
-
primitiveFieldSchema,
|
|
98
|
-
selectFieldSchema,
|
|
99
|
-
referenceFieldSchema,
|
|
100
|
-
objectFieldSchema,
|
|
101
|
-
blockFieldSchema,
|
|
102
|
-
])
|
|
103
|
-
|
|
104
|
-
// Complete field schema (built-in or custom)
|
|
105
|
-
const fieldSchema: z.ZodTypeAny = z.lazy(() => z.union([knownFieldSchema, customFieldSchema]))
|
|
106
|
-
fieldHolder[0] = fieldSchema
|
|
107
|
-
|
|
108
|
-
export { fieldSchema, knownFieldSchema }
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zod schemas for media adapter configuration validation.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { z } from 'zod'
|
|
6
|
-
|
|
7
|
-
// Media adapter configuration schema
|
|
8
|
-
export const mediaSchema = z.union([
|
|
9
|
-
z.object({
|
|
10
|
-
adapter: z.literal('local'),
|
|
11
|
-
publicBaseUrl: z.string().url().optional(),
|
|
12
|
-
}),
|
|
13
|
-
z.object({
|
|
14
|
-
adapter: z.literal('s3'),
|
|
15
|
-
bucket: z.string().min(1),
|
|
16
|
-
region: z.string().min(1),
|
|
17
|
-
publicBaseUrl: z.string().url().optional(),
|
|
18
|
-
}),
|
|
19
|
-
z.object({
|
|
20
|
-
adapter: z.literal('lfs'),
|
|
21
|
-
publicBaseUrl: z.string().url().optional(),
|
|
22
|
-
}),
|
|
23
|
-
z.object({
|
|
24
|
-
adapter: z.string().min(1),
|
|
25
|
-
publicBaseUrl: z.string().url().optional(),
|
|
26
|
-
}),
|
|
27
|
-
])
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zod schemas for permission configuration validation.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { z } from 'zod'
|
|
6
|
-
|
|
7
|
-
import type { CanopyGroupId, CanopyUserId } from '../../types'
|
|
8
|
-
|
|
9
|
-
// Permission target schema
|
|
10
|
-
export const permissionTargetSchema = z.object({
|
|
11
|
-
allowedUsers: z.array(z.string() as z.ZodType<CanopyUserId>).optional(),
|
|
12
|
-
allowedGroups: z.array(z.string() as z.ZodType<CanopyGroupId>).optional(),
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
// Path permission schema
|
|
16
|
-
export const pathPermissionSchema = z.object({
|
|
17
|
-
path: z.string().min(1),
|
|
18
|
-
read: permissionTargetSchema.optional(),
|
|
19
|
-
edit: permissionTargetSchema.optional(),
|
|
20
|
-
review: permissionTargetSchema.optional(),
|
|
21
|
-
})
|