canopycms 0.0.0 → 0.0.1
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/package.json +2 -3
- 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/Dockerfile.cms.template +0 -19
- package/src/cli/templates/canopy.ts.template +0 -55
- package/src/cli/templates/canopycms.config.ts.template +0 -11
- package/src/cli/templates/deploy-cms.yml.template +0 -27
- package/src/cli/templates/edit-page.tsx.template +0 -32
- package/src/cli/templates/route.ts.template +0 -12
- package/src/cli/templates/schemas.ts.template +0 -16
- 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/api/schema.ts
DELETED
|
@@ -1,936 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schema API - endpoints for managing collection structure.
|
|
3
|
-
*
|
|
4
|
-
* Provides CRUD operations for:
|
|
5
|
-
* - Collections (create, read, update, delete)
|
|
6
|
-
* - Entry types (add, update, remove)
|
|
7
|
-
* - Ordering (update item order within collections)
|
|
8
|
-
*
|
|
9
|
-
* All mutations require Admin group membership.
|
|
10
|
-
* Schema changes are branch-specific (like content edits).
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { z } from 'zod'
|
|
14
|
-
import path from 'node:path'
|
|
15
|
-
|
|
16
|
-
import type { ApiContext, ApiRequest, ApiResponse } from './types'
|
|
17
|
-
import type { BranchContext, BranchContextWithSchema } from '../types'
|
|
18
|
-
import { defineEndpoint } from './route-builder'
|
|
19
|
-
import { getErrorMessage } from '../utils/error'
|
|
20
|
-
import { branchNameSchema, logicalPathSchema } from './validators'
|
|
21
|
-
import {
|
|
22
|
-
SchemaOps,
|
|
23
|
-
createCollectionInputSchema,
|
|
24
|
-
updateCollectionInputSchema,
|
|
25
|
-
entryTypeInputSchema,
|
|
26
|
-
updateEntryTypeInputSchema,
|
|
27
|
-
type CreateCollectionInput,
|
|
28
|
-
type UpdateCollectionInput,
|
|
29
|
-
type CreateEntryTypeInput,
|
|
30
|
-
type UpdateEntryTypeInput,
|
|
31
|
-
} from '../schema/schema-store'
|
|
32
|
-
import type {
|
|
33
|
-
CollectionConfig,
|
|
34
|
-
EntryTypeConfig,
|
|
35
|
-
FlatSchemaItem,
|
|
36
|
-
ContentFormat,
|
|
37
|
-
EntrySchema,
|
|
38
|
-
} from '../config'
|
|
39
|
-
import { type LogicalPath, type ContentId, parseLogicalPath } from '../paths'
|
|
40
|
-
|
|
41
|
-
// ============================================================================
|
|
42
|
-
// Wire Types — API response shapes with schemaRef instead of resolved schema
|
|
43
|
-
// ============================================================================
|
|
44
|
-
|
|
45
|
-
/** Entry type in wire format: schemaRef instead of resolved schema */
|
|
46
|
-
export interface WireEntryType {
|
|
47
|
-
readonly name: string
|
|
48
|
-
readonly format: ContentFormat
|
|
49
|
-
readonly schemaRef: string
|
|
50
|
-
readonly label?: string
|
|
51
|
-
readonly default?: boolean
|
|
52
|
-
readonly maxItems?: number
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** Collection in wire format (entry types carry schemaRef, not resolved schema) */
|
|
56
|
-
export interface WireCollectionConfig {
|
|
57
|
-
readonly name: string
|
|
58
|
-
readonly path: string
|
|
59
|
-
readonly label?: string
|
|
60
|
-
readonly entries?: readonly WireEntryType[]
|
|
61
|
-
readonly collections?: readonly WireCollectionConfig[]
|
|
62
|
-
readonly order?: readonly string[]
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Flat schema item in wire format */
|
|
66
|
-
export type WireFlatSchemaItem =
|
|
67
|
-
| {
|
|
68
|
-
type: 'collection'
|
|
69
|
-
logicalPath: LogicalPath
|
|
70
|
-
name: string
|
|
71
|
-
label?: string
|
|
72
|
-
contentId?: ContentId
|
|
73
|
-
parentPath?: LogicalPath
|
|
74
|
-
entries?: readonly WireEntryType[]
|
|
75
|
-
collections?: readonly WireCollectionConfig[]
|
|
76
|
-
order?: readonly string[]
|
|
77
|
-
}
|
|
78
|
-
| {
|
|
79
|
-
type: 'entry-type'
|
|
80
|
-
logicalPath: LogicalPath
|
|
81
|
-
name: string
|
|
82
|
-
label?: string
|
|
83
|
-
parentPath: LogicalPath
|
|
84
|
-
format: ContentFormat
|
|
85
|
-
schemaRef: string
|
|
86
|
-
default?: boolean
|
|
87
|
-
maxItems?: number
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// ============================================================================
|
|
91
|
-
// Wire conversion functions
|
|
92
|
-
// ============================================================================
|
|
93
|
-
|
|
94
|
-
type Registry = Record<string, EntrySchema>
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Resolve the schemaRef for an entry type. Uses the explicit schemaRef if set,
|
|
98
|
-
* otherwise does a reverse lookup in the registry by matching the schema array.
|
|
99
|
-
*/
|
|
100
|
-
function resolveSchemaRef(et: EntryTypeConfig, registry: Registry): string {
|
|
101
|
-
if (et.schemaRef) return et.schemaRef
|
|
102
|
-
// Reverse lookup: find which registry key maps to this entry type's schema
|
|
103
|
-
for (const [key, value] of Object.entries(registry)) {
|
|
104
|
-
if (value === et.schema) return key
|
|
105
|
-
}
|
|
106
|
-
throw new Error(
|
|
107
|
-
`Cannot resolve schemaRef for entry type "${et.name}". ` +
|
|
108
|
-
`No matching entry found in the entry schema registry. ` +
|
|
109
|
-
`This may indicate a stale schema cache — try invalidating it.`,
|
|
110
|
-
)
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function toWireEntryType(et: EntryTypeConfig, registry: Registry): WireEntryType {
|
|
114
|
-
return {
|
|
115
|
-
name: et.name,
|
|
116
|
-
format: et.format,
|
|
117
|
-
schemaRef: resolveSchemaRef(et, registry),
|
|
118
|
-
...(et.label !== undefined && { label: et.label }),
|
|
119
|
-
...(et.default !== undefined && { default: et.default }),
|
|
120
|
-
...(et.maxItems !== undefined && { maxItems: et.maxItems }),
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function toWireCollection(col: CollectionConfig, registry: Registry): WireCollectionConfig {
|
|
125
|
-
return {
|
|
126
|
-
name: col.name,
|
|
127
|
-
path: col.path,
|
|
128
|
-
...(col.label !== undefined && { label: col.label }),
|
|
129
|
-
...(col.entries && {
|
|
130
|
-
entries: col.entries.map((et) => toWireEntryType(et, registry)),
|
|
131
|
-
}),
|
|
132
|
-
...(col.collections && {
|
|
133
|
-
collections: col.collections.map((c) => toWireCollection(c, registry)),
|
|
134
|
-
}),
|
|
135
|
-
...(col.order && { order: col.order }),
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function toWireFlatSchema(items: FlatSchemaItem[], registry: Registry): WireFlatSchemaItem[] {
|
|
140
|
-
return items.map((item): WireFlatSchemaItem => {
|
|
141
|
-
if (item.type === 'collection') {
|
|
142
|
-
return {
|
|
143
|
-
type: 'collection',
|
|
144
|
-
logicalPath: item.logicalPath,
|
|
145
|
-
name: item.name,
|
|
146
|
-
...(item.label !== undefined && { label: item.label }),
|
|
147
|
-
...(item.contentId !== undefined && { contentId: item.contentId }),
|
|
148
|
-
...(item.parentPath !== undefined && { parentPath: item.parentPath }),
|
|
149
|
-
...(item.entries && {
|
|
150
|
-
entries: item.entries.map((et) => toWireEntryType(et, registry)),
|
|
151
|
-
}),
|
|
152
|
-
...(item.collections && {
|
|
153
|
-
collections: item.collections.map((c) => toWireCollection(c, registry)),
|
|
154
|
-
}),
|
|
155
|
-
...(item.order && { order: item.order }),
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return {
|
|
159
|
-
type: 'entry-type',
|
|
160
|
-
logicalPath: item.logicalPath,
|
|
161
|
-
name: item.name,
|
|
162
|
-
...(item.label !== undefined && { label: item.label }),
|
|
163
|
-
parentPath: item.parentPath,
|
|
164
|
-
format: item.format,
|
|
165
|
-
schemaRef: resolveSchemaRef(item, registry),
|
|
166
|
-
...(item.default !== undefined && { default: item.default }),
|
|
167
|
-
...(item.maxItems !== undefined && { maxItems: item.maxItems }),
|
|
168
|
-
}
|
|
169
|
-
})
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// ============================================================================
|
|
173
|
-
// Response Types
|
|
174
|
-
// ============================================================================
|
|
175
|
-
|
|
176
|
-
export interface SchemaResponse {
|
|
177
|
-
flatSchema: WireFlatSchemaItem[]
|
|
178
|
-
/** Entry schema definitions keyed by registry name */
|
|
179
|
-
entrySchemas: Record<string, EntrySchema>
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export interface EntryTypeWithUsage {
|
|
183
|
-
name: string
|
|
184
|
-
label?: string
|
|
185
|
-
format: ContentFormat
|
|
186
|
-
schemaRef: string
|
|
187
|
-
default?: boolean
|
|
188
|
-
maxItems?: number
|
|
189
|
-
/** Number of entries using this entry type (for locking validation) */
|
|
190
|
-
usageCount: number
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export interface CollectionResponse {
|
|
194
|
-
collection: WireCollectionConfig | null
|
|
195
|
-
/** Entry types with usage counts (only present when collection exists) */
|
|
196
|
-
entryTypesWithUsage?: EntryTypeWithUsage[]
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
export interface CreateCollectionResponse {
|
|
200
|
-
/** The logical path to the created collection (e.g., "posts" or "blog/posts") */
|
|
201
|
-
collectionPath: LogicalPath
|
|
202
|
-
/** The unique 12-character content ID for the collection */
|
|
203
|
-
contentId: ContentId
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export interface UpdateCollectionResponse {
|
|
207
|
-
success: boolean
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export interface DeleteCollectionResponse {
|
|
211
|
-
success: boolean
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
export interface AddEntryTypeResponse {
|
|
215
|
-
success: boolean
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
export interface UpdateEntryTypeResponse {
|
|
219
|
-
success: boolean
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export interface RemoveEntryTypeResponse {
|
|
223
|
-
success: boolean
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
export interface UpdateOrderResponse {
|
|
227
|
-
success: boolean
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
export interface InvalidateSchemaCacheResponse {
|
|
231
|
-
success: boolean
|
|
232
|
-
message: string
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export type GetSchemaApiResponse = ApiResponse<SchemaResponse>
|
|
236
|
-
export type GetCollectionApiResponse = ApiResponse<CollectionResponse>
|
|
237
|
-
export type CreateCollectionApiResponse = ApiResponse<CreateCollectionResponse>
|
|
238
|
-
export type UpdateCollectionApiResponse = ApiResponse<UpdateCollectionResponse>
|
|
239
|
-
export type DeleteCollectionApiResponse = ApiResponse<DeleteCollectionResponse>
|
|
240
|
-
export type AddEntryTypeApiResponse = ApiResponse<AddEntryTypeResponse>
|
|
241
|
-
export type UpdateEntryTypeApiResponse = ApiResponse<UpdateEntryTypeResponse>
|
|
242
|
-
export type RemoveEntryTypeApiResponse = ApiResponse<RemoveEntryTypeResponse>
|
|
243
|
-
export type UpdateOrderApiResponse = ApiResponse<UpdateOrderResponse>
|
|
244
|
-
export type InvalidateSchemaCacheApiResponse = ApiResponse<InvalidateSchemaCacheResponse>
|
|
245
|
-
|
|
246
|
-
// ============================================================================
|
|
247
|
-
// Zod Schemas for Params
|
|
248
|
-
// ============================================================================
|
|
249
|
-
|
|
250
|
-
const branchParamsSchema = z.object({
|
|
251
|
-
branch: branchNameSchema,
|
|
252
|
-
})
|
|
253
|
-
|
|
254
|
-
const collectionParamsSchema = z.object({
|
|
255
|
-
branch: branchNameSchema,
|
|
256
|
-
collectionPath: logicalPathSchema,
|
|
257
|
-
})
|
|
258
|
-
|
|
259
|
-
const entryTypeParamsSchema = z.object({
|
|
260
|
-
branch: branchNameSchema,
|
|
261
|
-
collectionPath: logicalPathSchema,
|
|
262
|
-
entryTypeName: z.string().min(1),
|
|
263
|
-
})
|
|
264
|
-
|
|
265
|
-
// Body schemas for mutations
|
|
266
|
-
const createCollectionBodySchema = createCollectionInputSchema
|
|
267
|
-
|
|
268
|
-
const updateCollectionBodySchema = updateCollectionInputSchema
|
|
269
|
-
|
|
270
|
-
const addEntryTypeBodySchema = entryTypeInputSchema
|
|
271
|
-
|
|
272
|
-
const updateEntryTypeBodySchema = updateEntryTypeInputSchema
|
|
273
|
-
|
|
274
|
-
const updateOrderBodySchema = z.object({
|
|
275
|
-
order: z.array(z.string()),
|
|
276
|
-
})
|
|
277
|
-
|
|
278
|
-
// ============================================================================
|
|
279
|
-
// Helper Functions
|
|
280
|
-
// ============================================================================
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Get a SchemaOps instance for a branch
|
|
284
|
-
*/
|
|
285
|
-
async function getSchemaOps(
|
|
286
|
-
ctx: ApiContext,
|
|
287
|
-
branchName: string,
|
|
288
|
-
): Promise<{ store: SchemaOps; branchRoot: string } | { error: string; status: number }> {
|
|
289
|
-
const context = await ctx.getBranchContext(branchName)
|
|
290
|
-
if (!context) {
|
|
291
|
-
return { error: 'Branch not found', status: 404 }
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const contentRoot = path.join(context.branchRoot, 'content')
|
|
295
|
-
const store = new SchemaOps(contentRoot, ctx.services.entrySchemaRegistry, ctx.services)
|
|
296
|
-
return { store, branchRoot: context.branchRoot }
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* Decode a collection path from URL params.
|
|
301
|
-
* The path is validated by Zod before decoding, then re-validated after
|
|
302
|
-
* decoding to prevent double-encoding path traversal attacks.
|
|
303
|
-
*/
|
|
304
|
-
function decodeCollectionPath(
|
|
305
|
-
collectionPath: LogicalPath,
|
|
306
|
-
): { ok: true; path: LogicalPath } | { ok: false; error: string } {
|
|
307
|
-
const decoded = decodeURIComponent(collectionPath)
|
|
308
|
-
if (decoded === collectionPath) {
|
|
309
|
-
return { ok: true, path: collectionPath }
|
|
310
|
-
}
|
|
311
|
-
const result = parseLogicalPath(decoded)
|
|
312
|
-
if (!result.ok) {
|
|
313
|
-
return { ok: false, error: `Invalid collection path after decoding: ${result.error}` }
|
|
314
|
-
}
|
|
315
|
-
return { ok: true, path: result.path }
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// ============================================================================
|
|
319
|
-
// Handlers
|
|
320
|
-
// ============================================================================
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* GET /:branch/schema - Get full schema tree
|
|
324
|
-
*/
|
|
325
|
-
const getSchemaHandler = async (
|
|
326
|
-
gc: { branchContext: BranchContextWithSchema },
|
|
327
|
-
ctx: ApiContext,
|
|
328
|
-
_req: ApiRequest,
|
|
329
|
-
_params: z.infer<typeof branchParamsSchema>,
|
|
330
|
-
): Promise<GetSchemaApiResponse> => {
|
|
331
|
-
const { branchContext } = gc
|
|
332
|
-
|
|
333
|
-
return {
|
|
334
|
-
ok: true,
|
|
335
|
-
status: 200,
|
|
336
|
-
data: {
|
|
337
|
-
flatSchema: toWireFlatSchema(branchContext.flatSchema, ctx.services.entrySchemaRegistry),
|
|
338
|
-
entrySchemas: ctx.services.entrySchemaRegistry,
|
|
339
|
-
},
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* GET /:branch/schema/collection/...collectionPath - Get single collection details
|
|
345
|
-
* Note: Uses 'collection' (singular) with catch-all to support paths with slashes
|
|
346
|
-
*/
|
|
347
|
-
const getCollectionHandler = async (
|
|
348
|
-
gc: { branchContext: BranchContextWithSchema },
|
|
349
|
-
ctx: ApiContext,
|
|
350
|
-
req: ApiRequest,
|
|
351
|
-
params: z.infer<typeof collectionParamsSchema>,
|
|
352
|
-
): Promise<GetCollectionApiResponse> => {
|
|
353
|
-
const { branchContext } = gc
|
|
354
|
-
|
|
355
|
-
const decodedPath = decodeCollectionPath(params.collectionPath)
|
|
356
|
-
if (!decodedPath.ok) {
|
|
357
|
-
return { ok: false, status: 400, error: decodedPath.error }
|
|
358
|
-
}
|
|
359
|
-
const collectionPath = decodedPath.path
|
|
360
|
-
|
|
361
|
-
// Find collection in per-branch flat schema
|
|
362
|
-
const flatSchema = branchContext.flatSchema
|
|
363
|
-
const item = flatSchema.find((i) => i.type === 'collection' && i.logicalPath === collectionPath)
|
|
364
|
-
|
|
365
|
-
if (!item || item.type !== 'collection') {
|
|
366
|
-
return {
|
|
367
|
-
ok: true,
|
|
368
|
-
status: 200,
|
|
369
|
-
data: { collection: null },
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// Build wire-format collection from FlatSchemaItem
|
|
374
|
-
const registry = ctx.services.entrySchemaRegistry
|
|
375
|
-
const collection: WireCollectionConfig = {
|
|
376
|
-
name: item.name,
|
|
377
|
-
path: item.logicalPath,
|
|
378
|
-
...(item.label !== undefined && { label: item.label }),
|
|
379
|
-
...(item.entries && {
|
|
380
|
-
entries: item.entries.map((et) => toWireEntryType(et, registry)),
|
|
381
|
-
}),
|
|
382
|
-
...(item.collections && {
|
|
383
|
-
collections: item.collections.map((c) => toWireCollection(c, registry)),
|
|
384
|
-
}),
|
|
385
|
-
...(item.order && { order: item.order }),
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
// Compute usage counts for each entry type
|
|
389
|
-
// Read from raw collection meta to get entry schema registry keys (strings), not resolved EntrySchema
|
|
390
|
-
let entryTypesWithUsage: EntryTypeWithUsage[] | undefined
|
|
391
|
-
if (item.entries && item.entries.length > 0) {
|
|
392
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
393
|
-
if ('error' in storeResult) {
|
|
394
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// Read raw collection meta to get string schema references
|
|
398
|
-
const rawMeta = await storeResult.store.readCollectionMeta(collectionPath)
|
|
399
|
-
if (rawMeta?.entries) {
|
|
400
|
-
entryTypesWithUsage = await Promise.all(
|
|
401
|
-
rawMeta.entries.map(async (et) => {
|
|
402
|
-
const usageCount = await storeResult.store.countEntriesUsingType(collectionPath, et.name)
|
|
403
|
-
return {
|
|
404
|
-
name: et.name,
|
|
405
|
-
label: et.label,
|
|
406
|
-
format: et.format,
|
|
407
|
-
schemaRef: et.schema, // String reference to entry schema registry
|
|
408
|
-
default: et.default,
|
|
409
|
-
maxItems: et.maxItems,
|
|
410
|
-
usageCount,
|
|
411
|
-
}
|
|
412
|
-
}),
|
|
413
|
-
)
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
return {
|
|
418
|
-
ok: true,
|
|
419
|
-
status: 200,
|
|
420
|
-
data: { collection, entryTypesWithUsage },
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* POST /:branch/schema/collections - Create collection
|
|
426
|
-
*/
|
|
427
|
-
const createCollectionHandler = async (
|
|
428
|
-
_gc: Record<string, never>,
|
|
429
|
-
ctx: ApiContext,
|
|
430
|
-
req: ApiRequest,
|
|
431
|
-
params: z.infer<typeof branchParamsSchema>,
|
|
432
|
-
body: z.infer<typeof createCollectionBodySchema>,
|
|
433
|
-
): Promise<CreateCollectionApiResponse> => {
|
|
434
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
435
|
-
if ('error' in storeResult) {
|
|
436
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
try {
|
|
440
|
-
const result = await storeResult.store.createCollection(body as CreateCollectionInput)
|
|
441
|
-
return {
|
|
442
|
-
ok: true,
|
|
443
|
-
status: 201,
|
|
444
|
-
data: result,
|
|
445
|
-
}
|
|
446
|
-
} catch (err) {
|
|
447
|
-
return {
|
|
448
|
-
ok: false,
|
|
449
|
-
status: 400,
|
|
450
|
-
error: getErrorMessage(err),
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/**
|
|
456
|
-
* PATCH /:branch/schema/collection/...collectionPath - Update collection
|
|
457
|
-
* Note: Uses 'collection' (singular) with catch-all to support paths with slashes
|
|
458
|
-
*/
|
|
459
|
-
const updateCollectionHandler = async (
|
|
460
|
-
_gc: Record<string, never>,
|
|
461
|
-
ctx: ApiContext,
|
|
462
|
-
req: ApiRequest,
|
|
463
|
-
params: z.infer<typeof collectionParamsSchema>,
|
|
464
|
-
body: z.infer<typeof updateCollectionBodySchema>,
|
|
465
|
-
): Promise<UpdateCollectionApiResponse> => {
|
|
466
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
467
|
-
if ('error' in storeResult) {
|
|
468
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
const decodedPath = decodeCollectionPath(params.collectionPath)
|
|
472
|
-
if (!decodedPath.ok) {
|
|
473
|
-
return { ok: false, status: 400, error: decodedPath.error }
|
|
474
|
-
}
|
|
475
|
-
const collectionPath = decodedPath.path
|
|
476
|
-
|
|
477
|
-
try {
|
|
478
|
-
await storeResult.store.updateCollection(collectionPath, body as UpdateCollectionInput)
|
|
479
|
-
return {
|
|
480
|
-
ok: true,
|
|
481
|
-
status: 200,
|
|
482
|
-
data: { success: true },
|
|
483
|
-
}
|
|
484
|
-
} catch (err) {
|
|
485
|
-
return {
|
|
486
|
-
ok: false,
|
|
487
|
-
status: 400,
|
|
488
|
-
error: getErrorMessage(err),
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
/**
|
|
494
|
-
* DELETE /:branch/schema/collection/...collectionPath - Delete collection
|
|
495
|
-
* Note: Uses 'collection' (singular) with catch-all to support paths with slashes
|
|
496
|
-
*/
|
|
497
|
-
const deleteCollectionHandler = async (
|
|
498
|
-
_gc: Record<string, never>,
|
|
499
|
-
ctx: ApiContext,
|
|
500
|
-
req: ApiRequest,
|
|
501
|
-
params: z.infer<typeof collectionParamsSchema>,
|
|
502
|
-
): Promise<DeleteCollectionApiResponse> => {
|
|
503
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
504
|
-
if ('error' in storeResult) {
|
|
505
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
const decodedPath = decodeCollectionPath(params.collectionPath)
|
|
509
|
-
if (!decodedPath.ok) {
|
|
510
|
-
return { ok: false, status: 400, error: decodedPath.error }
|
|
511
|
-
}
|
|
512
|
-
const collectionPath = decodedPath.path
|
|
513
|
-
|
|
514
|
-
try {
|
|
515
|
-
await storeResult.store.deleteCollection(collectionPath)
|
|
516
|
-
return {
|
|
517
|
-
ok: true,
|
|
518
|
-
status: 200,
|
|
519
|
-
data: { success: true },
|
|
520
|
-
}
|
|
521
|
-
} catch (err) {
|
|
522
|
-
return {
|
|
523
|
-
ok: false,
|
|
524
|
-
status: 400,
|
|
525
|
-
error: getErrorMessage(err),
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
/**
|
|
531
|
-
* POST /:branch/schema/entry-types/...collectionPath - Add entry type
|
|
532
|
-
* Note: Restructured URL with catch-all at end to support paths with slashes
|
|
533
|
-
*/
|
|
534
|
-
const addEntryTypeHandler = async (
|
|
535
|
-
_gc: Record<string, never>,
|
|
536
|
-
ctx: ApiContext,
|
|
537
|
-
req: ApiRequest,
|
|
538
|
-
params: z.infer<typeof collectionParamsSchema>,
|
|
539
|
-
body: z.infer<typeof addEntryTypeBodySchema>,
|
|
540
|
-
): Promise<AddEntryTypeApiResponse> => {
|
|
541
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
542
|
-
if ('error' in storeResult) {
|
|
543
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
const decodedPath = decodeCollectionPath(params.collectionPath)
|
|
547
|
-
if (!decodedPath.ok) {
|
|
548
|
-
return { ok: false, status: 400, error: decodedPath.error }
|
|
549
|
-
}
|
|
550
|
-
const collectionPath = decodedPath.path
|
|
551
|
-
|
|
552
|
-
try {
|
|
553
|
-
await storeResult.store.addEntryType(collectionPath, body as CreateEntryTypeInput)
|
|
554
|
-
return {
|
|
555
|
-
ok: true,
|
|
556
|
-
status: 201,
|
|
557
|
-
data: { success: true },
|
|
558
|
-
}
|
|
559
|
-
} catch (err) {
|
|
560
|
-
return {
|
|
561
|
-
ok: false,
|
|
562
|
-
status: 400,
|
|
563
|
-
error: getErrorMessage(err),
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
/**
|
|
569
|
-
* PATCH /:branch/schema/entry-types/:entryTypeName/...collectionPath - Update entry type
|
|
570
|
-
* Note: Restructured URL with entry type name before catch-all path
|
|
571
|
-
*/
|
|
572
|
-
const updateEntryTypeHandler = async (
|
|
573
|
-
_gc: Record<string, never>,
|
|
574
|
-
ctx: ApiContext,
|
|
575
|
-
req: ApiRequest,
|
|
576
|
-
params: z.infer<typeof entryTypeParamsSchema>,
|
|
577
|
-
body: z.infer<typeof updateEntryTypeBodySchema>,
|
|
578
|
-
): Promise<UpdateEntryTypeApiResponse> => {
|
|
579
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
580
|
-
if ('error' in storeResult) {
|
|
581
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
const decodedPath = decodeCollectionPath(params.collectionPath)
|
|
585
|
-
if (!decodedPath.ok) {
|
|
586
|
-
return { ok: false, status: 400, error: decodedPath.error }
|
|
587
|
-
}
|
|
588
|
-
const collectionPath = decodedPath.path
|
|
589
|
-
|
|
590
|
-
// Check if format or schema are being changed (breaking changes)
|
|
591
|
-
const isBreakingChange = body.format !== undefined || body.schema !== undefined
|
|
592
|
-
if (isBreakingChange) {
|
|
593
|
-
// Count existing entries using this type
|
|
594
|
-
const usageCount = await storeResult.store.countEntriesUsingType(
|
|
595
|
-
collectionPath,
|
|
596
|
-
params.entryTypeName,
|
|
597
|
-
)
|
|
598
|
-
if (usageCount > 0) {
|
|
599
|
-
const entryWord = usageCount === 1 ? 'entry' : 'entries'
|
|
600
|
-
return {
|
|
601
|
-
ok: false,
|
|
602
|
-
status: 400,
|
|
603
|
-
error: `Cannot modify schema or format for entry type with existing ${entryWord}. ${usageCount} ${entryWord} currently use this type.`,
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
try {
|
|
609
|
-
await storeResult.store.updateEntryType(
|
|
610
|
-
collectionPath,
|
|
611
|
-
params.entryTypeName,
|
|
612
|
-
body as UpdateEntryTypeInput,
|
|
613
|
-
)
|
|
614
|
-
return {
|
|
615
|
-
ok: true,
|
|
616
|
-
status: 200,
|
|
617
|
-
data: { success: true },
|
|
618
|
-
}
|
|
619
|
-
} catch (err) {
|
|
620
|
-
return {
|
|
621
|
-
ok: false,
|
|
622
|
-
status: 400,
|
|
623
|
-
error: getErrorMessage(err),
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
/**
|
|
629
|
-
* DELETE /:branch/schema/entry-types/:entryTypeName/...collectionPath - Remove entry type
|
|
630
|
-
* Note: Restructured URL with entry type name before catch-all path
|
|
631
|
-
*/
|
|
632
|
-
const removeEntryTypeHandler = async (
|
|
633
|
-
_gc: Record<string, never>,
|
|
634
|
-
ctx: ApiContext,
|
|
635
|
-
req: ApiRequest,
|
|
636
|
-
params: z.infer<typeof entryTypeParamsSchema>,
|
|
637
|
-
): Promise<RemoveEntryTypeApiResponse> => {
|
|
638
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
639
|
-
if ('error' in storeResult) {
|
|
640
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
const decodedPath = decodeCollectionPath(params.collectionPath)
|
|
644
|
-
if (!decodedPath.ok) {
|
|
645
|
-
return { ok: false, status: 400, error: decodedPath.error }
|
|
646
|
-
}
|
|
647
|
-
const collectionPath = decodedPath.path
|
|
648
|
-
|
|
649
|
-
try {
|
|
650
|
-
await storeResult.store.removeEntryType(collectionPath, params.entryTypeName)
|
|
651
|
-
return {
|
|
652
|
-
ok: true,
|
|
653
|
-
status: 200,
|
|
654
|
-
data: { success: true },
|
|
655
|
-
}
|
|
656
|
-
} catch (err) {
|
|
657
|
-
return {
|
|
658
|
-
ok: false,
|
|
659
|
-
status: 400,
|
|
660
|
-
error: getErrorMessage(err),
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
/**
|
|
666
|
-
* PATCH /:branch/schema/order/...collectionPath - Update item order
|
|
667
|
-
* Note: Restructured URL with catch-all at end to support paths with slashes
|
|
668
|
-
*/
|
|
669
|
-
const updateOrderHandler = async (
|
|
670
|
-
_gc: Record<string, never>,
|
|
671
|
-
ctx: ApiContext,
|
|
672
|
-
req: ApiRequest,
|
|
673
|
-
params: z.infer<typeof collectionParamsSchema>,
|
|
674
|
-
body: z.infer<typeof updateOrderBodySchema>,
|
|
675
|
-
): Promise<UpdateOrderApiResponse> => {
|
|
676
|
-
const storeResult = await getSchemaOps(ctx, params.branch)
|
|
677
|
-
if ('error' in storeResult) {
|
|
678
|
-
return { ok: false, status: storeResult.status, error: storeResult.error }
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
const decodedPath = decodeCollectionPath(params.collectionPath)
|
|
682
|
-
if (!decodedPath.ok) {
|
|
683
|
-
return { ok: false, status: 400, error: decodedPath.error }
|
|
684
|
-
}
|
|
685
|
-
const collectionPath = decodedPath.path
|
|
686
|
-
|
|
687
|
-
try {
|
|
688
|
-
await storeResult.store.updateOrder(collectionPath, body.order)
|
|
689
|
-
return {
|
|
690
|
-
ok: true,
|
|
691
|
-
status: 200,
|
|
692
|
-
data: { success: true },
|
|
693
|
-
}
|
|
694
|
-
} catch (err) {
|
|
695
|
-
return {
|
|
696
|
-
ok: false,
|
|
697
|
-
status: 400,
|
|
698
|
-
error: getErrorMessage(err),
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
/**
|
|
704
|
-
* POST /:branch/schema/invalidate-cache - Invalidate schema cache (for debugging/manual refresh)
|
|
705
|
-
*/
|
|
706
|
-
const invalidateSchemaCacheHandler = async (
|
|
707
|
-
gc: { branchContext: BranchContext },
|
|
708
|
-
ctx: ApiContext,
|
|
709
|
-
_req: ApiRequest,
|
|
710
|
-
_params: z.infer<typeof branchParamsSchema>,
|
|
711
|
-
): Promise<InvalidateSchemaCacheApiResponse> => {
|
|
712
|
-
const { branchContext } = gc
|
|
713
|
-
|
|
714
|
-
try {
|
|
715
|
-
await ctx.services.branchSchemaCache.invalidate(branchContext.branchRoot)
|
|
716
|
-
return {
|
|
717
|
-
ok: true,
|
|
718
|
-
status: 200,
|
|
719
|
-
data: {
|
|
720
|
-
success: true,
|
|
721
|
-
message: 'Schema cache invalidated. Next schema load will regenerate cache.',
|
|
722
|
-
},
|
|
723
|
-
}
|
|
724
|
-
} catch (err) {
|
|
725
|
-
return {
|
|
726
|
-
ok: false,
|
|
727
|
-
status: 500,
|
|
728
|
-
error: getErrorMessage(err),
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
// ============================================================================
|
|
734
|
-
// Route Definitions
|
|
735
|
-
// ============================================================================
|
|
736
|
-
|
|
737
|
-
/**
|
|
738
|
-
* GET /:branch/schema - Get full schema
|
|
739
|
-
*/
|
|
740
|
-
export const getSchema = defineEndpoint({
|
|
741
|
-
namespace: 'schema',
|
|
742
|
-
name: 'get',
|
|
743
|
-
method: 'GET',
|
|
744
|
-
path: '/:branch/schema',
|
|
745
|
-
params: branchParamsSchema,
|
|
746
|
-
responseType: 'GetSchemaApiResponse',
|
|
747
|
-
response: {} as GetSchemaApiResponse,
|
|
748
|
-
defaultMockData: { flatSchema: [], entrySchemas: {} },
|
|
749
|
-
guards: ['branchAccessWithSchema'] as const,
|
|
750
|
-
handler: getSchemaHandler,
|
|
751
|
-
})
|
|
752
|
-
|
|
753
|
-
/**
|
|
754
|
-
* GET /:branch/schema/collection/...collectionPath - Get single collection
|
|
755
|
-
* Note: Uses 'collection' (singular) with catch-all to support paths with slashes
|
|
756
|
-
*/
|
|
757
|
-
export const getCollection = defineEndpoint({
|
|
758
|
-
namespace: 'schema',
|
|
759
|
-
name: 'getCollection',
|
|
760
|
-
method: 'GET',
|
|
761
|
-
path: '/:branch/schema/collection/...collectionPath',
|
|
762
|
-
params: collectionParamsSchema,
|
|
763
|
-
responseType: 'GetCollectionApiResponse',
|
|
764
|
-
response: {} as GetCollectionApiResponse,
|
|
765
|
-
defaultMockData: { collection: null },
|
|
766
|
-
guards: ['branchAccessWithSchema'] as const,
|
|
767
|
-
handler: getCollectionHandler,
|
|
768
|
-
})
|
|
769
|
-
|
|
770
|
-
/**
|
|
771
|
-
* POST /:branch/schema/collections - Create collection
|
|
772
|
-
*/
|
|
773
|
-
export const createCollection = defineEndpoint({
|
|
774
|
-
namespace: 'schema',
|
|
775
|
-
name: 'createCollection',
|
|
776
|
-
method: 'POST',
|
|
777
|
-
path: '/:branch/schema/collections',
|
|
778
|
-
params: branchParamsSchema,
|
|
779
|
-
body: createCollectionBodySchema,
|
|
780
|
-
bodyType: 'CreateCollectionInput',
|
|
781
|
-
responseType: 'CreateCollectionApiResponse',
|
|
782
|
-
response: {} as CreateCollectionApiResponse,
|
|
783
|
-
defaultMockData: { collectionPath: '', contentId: '' },
|
|
784
|
-
mockDataCasts: {
|
|
785
|
-
collectionPath: 'createLogicalPath',
|
|
786
|
-
contentId: 'as ContentId',
|
|
787
|
-
},
|
|
788
|
-
guards: ['admin'] as const,
|
|
789
|
-
handler: createCollectionHandler,
|
|
790
|
-
})
|
|
791
|
-
|
|
792
|
-
/**
|
|
793
|
-
* PATCH /:branch/schema/collection/...collectionPath - Update collection
|
|
794
|
-
* Note: Uses 'collection' (singular) with catch-all to support paths with slashes
|
|
795
|
-
*/
|
|
796
|
-
export const updateCollection = defineEndpoint({
|
|
797
|
-
namespace: 'schema',
|
|
798
|
-
name: 'updateCollection',
|
|
799
|
-
method: 'PATCH',
|
|
800
|
-
path: '/:branch/schema/collection/...collectionPath',
|
|
801
|
-
params: collectionParamsSchema,
|
|
802
|
-
body: updateCollectionBodySchema,
|
|
803
|
-
bodyType: 'UpdateCollectionInput',
|
|
804
|
-
responseType: 'UpdateCollectionApiResponse',
|
|
805
|
-
response: {} as UpdateCollectionApiResponse,
|
|
806
|
-
defaultMockData: { success: true },
|
|
807
|
-
guards: ['admin'] as const,
|
|
808
|
-
handler: updateCollectionHandler,
|
|
809
|
-
})
|
|
810
|
-
|
|
811
|
-
/**
|
|
812
|
-
* DELETE /:branch/schema/collection/...collectionPath - Delete collection
|
|
813
|
-
* Note: Uses 'collection' (singular) with catch-all to support paths with slashes
|
|
814
|
-
*/
|
|
815
|
-
export const deleteCollection = defineEndpoint({
|
|
816
|
-
namespace: 'schema',
|
|
817
|
-
name: 'deleteCollection',
|
|
818
|
-
method: 'DELETE',
|
|
819
|
-
path: '/:branch/schema/collection/...collectionPath',
|
|
820
|
-
params: collectionParamsSchema,
|
|
821
|
-
responseType: 'DeleteCollectionApiResponse',
|
|
822
|
-
response: {} as DeleteCollectionApiResponse,
|
|
823
|
-
defaultMockData: { success: true },
|
|
824
|
-
guards: ['admin'] as const,
|
|
825
|
-
handler: deleteCollectionHandler,
|
|
826
|
-
})
|
|
827
|
-
|
|
828
|
-
/**
|
|
829
|
-
* POST /:branch/schema/entry-types/...collectionPath - Add entry type
|
|
830
|
-
* Note: Restructured URL with catch-all at end to support paths with slashes
|
|
831
|
-
*/
|
|
832
|
-
export const addEntryType = defineEndpoint({
|
|
833
|
-
namespace: 'schema',
|
|
834
|
-
name: 'addEntryType',
|
|
835
|
-
method: 'POST',
|
|
836
|
-
path: '/:branch/schema/entry-types/...collectionPath',
|
|
837
|
-
params: collectionParamsSchema,
|
|
838
|
-
body: addEntryTypeBodySchema,
|
|
839
|
-
bodyType: 'CreateEntryTypeInput',
|
|
840
|
-
responseType: 'AddEntryTypeApiResponse',
|
|
841
|
-
response: {} as AddEntryTypeApiResponse,
|
|
842
|
-
defaultMockData: { success: true },
|
|
843
|
-
guards: ['admin'] as const,
|
|
844
|
-
handler: addEntryTypeHandler,
|
|
845
|
-
})
|
|
846
|
-
|
|
847
|
-
/**
|
|
848
|
-
* PATCH /:branch/schema/entry-types/:entryTypeName/...collectionPath - Update entry type
|
|
849
|
-
* Note: Restructured URL with entry type name before catch-all path
|
|
850
|
-
*/
|
|
851
|
-
export const updateEntryType = defineEndpoint({
|
|
852
|
-
namespace: 'schema',
|
|
853
|
-
name: 'updateEntryType',
|
|
854
|
-
method: 'PATCH',
|
|
855
|
-
path: '/:branch/schema/entry-types/:entryTypeName/...collectionPath',
|
|
856
|
-
params: entryTypeParamsSchema,
|
|
857
|
-
body: updateEntryTypeBodySchema,
|
|
858
|
-
bodyType: 'UpdateEntryTypeInput',
|
|
859
|
-
responseType: 'UpdateEntryTypeApiResponse',
|
|
860
|
-
response: {} as UpdateEntryTypeApiResponse,
|
|
861
|
-
defaultMockData: { success: true },
|
|
862
|
-
guards: ['admin'] as const,
|
|
863
|
-
handler: updateEntryTypeHandler,
|
|
864
|
-
})
|
|
865
|
-
|
|
866
|
-
/**
|
|
867
|
-
* DELETE /:branch/schema/entry-types/:entryTypeName/...collectionPath - Remove entry type
|
|
868
|
-
* Note: Restructured URL with entry type name before catch-all path
|
|
869
|
-
*/
|
|
870
|
-
export const removeEntryType = defineEndpoint({
|
|
871
|
-
namespace: 'schema',
|
|
872
|
-
name: 'removeEntryType',
|
|
873
|
-
method: 'DELETE',
|
|
874
|
-
path: '/:branch/schema/entry-types/:entryTypeName/...collectionPath',
|
|
875
|
-
params: entryTypeParamsSchema,
|
|
876
|
-
responseType: 'RemoveEntryTypeApiResponse',
|
|
877
|
-
response: {} as RemoveEntryTypeApiResponse,
|
|
878
|
-
defaultMockData: { success: true },
|
|
879
|
-
guards: ['admin'] as const,
|
|
880
|
-
handler: removeEntryTypeHandler,
|
|
881
|
-
})
|
|
882
|
-
|
|
883
|
-
/**
|
|
884
|
-
* PATCH /:branch/schema/order/...collectionPath - Update item order
|
|
885
|
-
* Note: Restructured URL with catch-all at end to support paths with slashes
|
|
886
|
-
*/
|
|
887
|
-
export const updateOrder = defineEndpoint({
|
|
888
|
-
namespace: 'schema',
|
|
889
|
-
name: 'updateOrder',
|
|
890
|
-
method: 'PATCH',
|
|
891
|
-
path: '/:branch/schema/order/...collectionPath',
|
|
892
|
-
params: collectionParamsSchema,
|
|
893
|
-
body: updateOrderBodySchema,
|
|
894
|
-
bodyType: 'UpdateOrderBody',
|
|
895
|
-
responseType: 'UpdateOrderApiResponse',
|
|
896
|
-
response: {} as UpdateOrderApiResponse,
|
|
897
|
-
defaultMockData: { success: true },
|
|
898
|
-
guards: ['admin'] as const,
|
|
899
|
-
handler: updateOrderHandler,
|
|
900
|
-
})
|
|
901
|
-
|
|
902
|
-
/**
|
|
903
|
-
* POST /:branch/schema/invalidate-cache - Invalidate schema cache
|
|
904
|
-
*/
|
|
905
|
-
export const invalidateSchemaCache = defineEndpoint({
|
|
906
|
-
namespace: 'schema',
|
|
907
|
-
name: 'invalidateSchemaCache',
|
|
908
|
-
method: 'POST',
|
|
909
|
-
path: '/:branch/schema/invalidate-cache',
|
|
910
|
-
params: branchParamsSchema,
|
|
911
|
-
responseType: 'InvalidateSchemaCacheApiResponse',
|
|
912
|
-
response: {} as InvalidateSchemaCacheApiResponse,
|
|
913
|
-
defaultMockData: { success: true, message: 'Cache invalidated' },
|
|
914
|
-
guards: ['admin', 'branch'] as const,
|
|
915
|
-
handler: invalidateSchemaCacheHandler,
|
|
916
|
-
})
|
|
917
|
-
|
|
918
|
-
// ============================================================================
|
|
919
|
-
// Exports
|
|
920
|
-
// ============================================================================
|
|
921
|
-
|
|
922
|
-
/** Body type for updateOrder endpoint */
|
|
923
|
-
export type UpdateOrderBody = z.infer<typeof updateOrderBodySchema>
|
|
924
|
-
|
|
925
|
-
export const SCHEMA_ROUTES = {
|
|
926
|
-
get: getSchema,
|
|
927
|
-
getCollection,
|
|
928
|
-
createCollection,
|
|
929
|
-
updateCollection,
|
|
930
|
-
deleteCollection,
|
|
931
|
-
addEntryType,
|
|
932
|
-
updateEntryType,
|
|
933
|
-
removeEntryType,
|
|
934
|
-
updateOrder,
|
|
935
|
-
invalidateSchemaCache,
|
|
936
|
-
} as const
|