canopycms 0.0.67-int.90 → 0.0.67
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/README.md +30 -3
- package/dist/ai/generate.js +1 -27
- package/dist/ai/handler.d.ts +0 -4
- package/dist/ai/handler.js +0 -11
- package/dist/ai/index.d.ts +1 -8
- package/dist/ai/index.js +1 -8
- package/dist/ai/json-to-markdown.js +15 -58
- package/dist/ai/resolve-branch.d.ts +2 -7
- package/dist/ai/resolve-branch.js +2 -8
- package/dist/ai/strip-mdx.d.ts +5 -13
- package/dist/ai/strip-mdx.js +5 -17
- package/dist/ai/to-plain-text.d.ts +10 -28
- package/dist/ai/to-plain-text.js +10 -28
- package/dist/ai/transform-components.d.ts +2 -4
- package/dist/ai/transform-components.js +8 -19
- package/dist/ai/types.d.ts +5 -10
- package/dist/api/admin-branch-health.d.ts +4 -12
- package/dist/api/admin-branch-health.js +26 -66
- package/dist/api/admin.d.ts +4 -12
- package/dist/api/admin.js +10 -26
- package/dist/api/assets.d.ts +0 -25
- package/dist/api/assets.js +50 -91
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +0 -2
- package/dist/api/branch-review.d.ts +0 -8
- package/dist/api/branch-review.js +0 -13
- package/dist/api/branch-status.d.ts +0 -3
- package/dist/api/branch-status.js +8 -33
- package/dist/api/branch-withdraw.d.ts +0 -1
- package/dist/api/branch-withdraw.js +6 -9
- package/dist/api/branch.d.ts +7 -12
- package/dist/api/branch.js +7 -44
- package/dist/api/client.d.ts +71 -224
- package/dist/api/client.js +82 -233
- package/dist/api/comments.d.ts +2 -4
- package/dist/api/comments.js +0 -17
- package/dist/api/content.d.ts +0 -6
- package/dist/api/content.js +66 -142
- package/dist/api/entries-constants.d.ts +5 -9
- package/dist/api/entries-constants.js +5 -9
- package/dist/api/entries.d.ts +8 -13
- package/dist/api/entries.js +20 -51
- package/dist/api/github-sync.d.ts +2 -4
- package/dist/api/github-sync.js +4 -8
- package/dist/api/groups.d.ts +3 -0
- package/dist/api/groups.js +8 -21
- package/dist/api/guards.d.ts +4 -16
- package/dist/api/guards.js +3 -22
- package/dist/api/index.d.ts +4 -4
- package/dist/api/permissions.d.ts +2 -0
- package/dist/api/permissions.js +18 -40
- package/dist/api/reference-options.d.ts +0 -1
- package/dist/api/reference-options.js +3 -11
- package/dist/api/request-body-hash.d.ts +12 -23
- package/dist/api/request-body-hash.js +12 -23
- package/dist/api/resolve-references.d.ts +0 -1
- package/dist/api/resolve-references.js +13 -28
- package/dist/api/route-builder.d.ts +3 -7
- package/dist/api/route-builder.js +1 -1
- package/dist/api/routes.d.ts +12 -0
- package/dist/api/routes.js +47 -0
- package/dist/api/schema.d.ts +23 -33
- package/dist/api/schema.js +20 -74
- package/dist/api/settings-helpers.js +4 -5
- package/dist/api/types.d.ts +0 -5
- package/dist/api/user.js +0 -5
- package/dist/api/validators.d.ts +14 -52
- package/dist/api/validators.js +14 -52
- package/dist/assets/asset-prefixes.d.ts +4 -8
- package/dist/assets/asset-prefixes.js +4 -8
- package/dist/assets/asset-src.d.ts +5 -22
- package/dist/assets/asset-src.js +5 -21
- package/dist/assets/factory.d.ts +1 -2
- package/dist/assets/factory.js +1 -2
- package/dist/assets/finalize.d.ts +3 -1
- package/dist/assets/finalize.js +3 -1
- package/dist/assets/index.d.ts +3 -3
- package/dist/assets/index.js +1 -1
- package/dist/assets/keys.d.ts +5 -3
- package/dist/assets/keys.js +6 -3
- package/dist/assets/pipeline.d.ts +3 -2
- package/dist/assets/pipeline.js +22 -56
- package/dist/assets/sharp-loader.d.ts +2 -10
- package/dist/assets/sharp-loader.js +2 -10
- package/dist/assets/store-local.d.ts +1 -2
- package/dist/assets/store-local.js +1 -2
- package/dist/assets/store-s3.d.ts +3 -4
- package/dist/assets/svg-sanitizer.d.ts +6 -14
- package/dist/assets/svg-sanitizer.js +6 -14
- package/dist/assets/transform-directives.d.ts +3 -4
- package/dist/assets/transform-directives.js +1 -1
- package/dist/assets/transform.d.ts +19 -30
- package/dist/assets/transform.js +18 -31
- package/dist/auth/cache.d.ts +2 -3
- package/dist/auth/cache.js +2 -3
- package/dist/auth/caching-auth-plugin.d.ts +11 -22
- package/dist/auth/caching-auth-plugin.js +12 -14
- package/dist/auth/context-helpers.d.ts +6 -20
- package/dist/auth/context-helpers.js +5 -17
- package/dist/auth/file-based-auth-cache.d.ts +10 -21
- package/dist/auth/file-based-auth-cache.js +23 -51
- package/dist/auth/plugin.d.ts +29 -61
- package/dist/auth/plugin.js +9 -13
- package/dist/auth/types.d.ts +11 -20
- package/dist/authorization/branch.d.ts +30 -49
- package/dist/authorization/branch.js +16 -42
- package/dist/authorization/content.d.ts +11 -40
- package/dist/authorization/content.js +13 -45
- package/dist/authorization/groups/index.d.ts +0 -3
- package/dist/authorization/groups/index.js +0 -3
- package/dist/authorization/groups/loader.d.ts +14 -28
- package/dist/authorization/groups/loader.js +14 -38
- package/dist/authorization/groups/schema.d.ts +0 -6
- package/dist/authorization/groups/schema.js +4 -7
- package/dist/authorization/helpers.d.ts +9 -28
- package/dist/authorization/helpers.js +9 -28
- package/dist/authorization/index.d.ts +3 -25
- package/dist/authorization/index.js +3 -35
- package/dist/authorization/path.d.ts +6 -13
- package/dist/authorization/path.js +8 -25
- package/dist/authorization/permissions/index.d.ts +0 -3
- package/dist/authorization/permissions/index.js +0 -3
- package/dist/authorization/permissions/loader.d.ts +14 -27
- package/dist/authorization/permissions/loader.js +14 -32
- package/dist/authorization/permissions/schema.d.ts +1 -6
- package/dist/authorization/permissions/schema.js +6 -13
- package/dist/authorization/protected-branch.d.ts +36 -65
- package/dist/authorization/protected-branch.js +29 -41
- package/dist/authorization/settings-file-store.d.ts +38 -81
- package/dist/authorization/settings-file-store.js +38 -79
- package/dist/authorization/types.d.ts +4 -26
- package/dist/authorization/types.js +0 -6
- package/dist/authorization/validation.d.ts +1 -23
- package/dist/authorization/validation.js +1 -24
- package/dist/branch-health.d.ts +39 -67
- package/dist/branch-health.js +27 -43
- package/dist/branch-metadata-file.d.ts +16 -32
- package/dist/branch-metadata-file.js +13 -26
- package/dist/branch-metadata.d.ts +49 -80
- package/dist/branch-metadata.js +57 -87
- package/dist/branch-registry.d.ts +26 -64
- package/dist/branch-registry.js +44 -93
- package/dist/branch-schema-cache.d.ts +34 -124
- package/dist/branch-schema-cache.js +49 -155
- package/dist/branch-workspace.d.ts +4 -4
- package/dist/branch-workspace.js +15 -19
- package/dist/build/generate-ai-content.d.ts +1 -0
- package/dist/build/generate-ai-content.js +12 -25
- package/dist/build-canopy.d.ts +17 -27
- package/dist/build-canopy.js +16 -23
- package/dist/build-mode.d.ts +25 -27
- package/dist/build-mode.js +25 -29
- package/dist/cli/cli.d.ts +15 -26
- package/dist/cli/cli.js +601 -978
- package/dist/cli/generate-ai-content.js +351 -628
- package/dist/cli/github-app-manifest.d.ts +84 -0
- package/dist/cli/github-app-manifest.js +161 -0
- package/dist/cli/init-github-app.d.ts +110 -444
- package/dist/cli/init-github-app.js +236 -773
- package/dist/cli/init.js +39 -80
- package/dist/cli/migrate.d.ts +13 -10
- package/dist/cli/migrate.js +22 -30
- package/dist/cli/project-detect.d.ts +17 -31
- package/dist/cli/project-detect.js +31 -42
- package/dist/cli/project-root.d.ts +4 -11
- package/dist/cli/project-root.js +4 -11
- package/dist/cli/prompt.d.ts +10 -0
- package/dist/cli/prompt.js +67 -0
- package/dist/cli/sync.d.ts +0 -8
- package/dist/cli/sync.js +8 -28
- package/dist/cli/template-files/middleware.ts.template +15 -29
- package/dist/cli/templates.d.ts +2 -12
- package/dist/cli/templates.js +4 -4
- package/dist/client.d.ts +1 -1
- package/dist/comment-store.d.ts +32 -53
- package/dist/comment-store.js +32 -52
- package/dist/config/flatten.d.ts +0 -3
- package/dist/config/flatten.js +2 -12
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +1 -4
- package/dist/config/schemas/collection.d.ts +0 -8
- package/dist/config/schemas/collection.js +0 -10
- package/dist/config/schemas/config.d.ts +6 -78
- package/dist/config/schemas/config.js +38 -54
- package/dist/config/schemas/field.d.ts +2 -242
- package/dist/config/schemas/field.js +9 -20
- package/dist/config/schemas/media.js +1 -1
- package/dist/config/schemas/permissions.js +0 -2
- package/dist/config/schemas/url.d.ts +5 -6
- package/dist/config/schemas/url.js +5 -6
- package/dist/config/types.d.ts +45 -33
- package/dist/config/types.js +0 -1
- package/dist/config.d.ts +1 -8
- package/dist/config.js +1 -9
- package/dist/content-id-index.d.ts +76 -188
- package/dist/content-id-index.js +79 -230
- package/dist/content-index-generation.d.ts +27 -48
- package/dist/content-index-generation.js +35 -84
- package/dist/content-index-registry.d.ts +15 -24
- package/dist/content-index-registry.js +5 -9
- package/dist/content-listing.d.ts +64 -107
- package/dist/content-listing.js +68 -118
- package/dist/content-reader.d.ts +20 -29
- package/dist/content-reader.js +10 -18
- package/dist/content-store.d.ts +210 -336
- package/dist/content-store.js +413 -657
- package/dist/content-tree.d.ts +44 -86
- package/dist/content-tree.js +26 -54
- package/dist/context.d.ts +67 -94
- package/dist/context.js +53 -72
- package/dist/dev-content-watcher.d.ts +18 -18
- package/dist/dev-content-watcher.js +41 -44
- package/dist/editor/BranchManager.d.ts +3 -6
- package/dist/editor/BranchManager.js +24 -44
- package/dist/editor/CanopyEditor.js +5 -2
- package/dist/editor/CommentsPanel.js +0 -2
- package/dist/editor/Editor.js +19 -76
- package/dist/editor/EditorAuthGate.d.ts +27 -0
- package/dist/editor/EditorAuthGate.js +140 -0
- package/dist/editor/EntryNavigator.js +0 -20
- package/dist/editor/FormRenderer.d.ts +1 -2
- package/dist/editor/FormRenderer.js +8 -23
- package/dist/editor/admin/SystemHealthPanel.js +20 -37
- package/dist/editor/admin/useSystemHealth.d.ts +2 -3
- package/dist/editor/admin/useSystemHealth.js +10 -12
- package/dist/editor/client-reference-resolver.d.ts +2 -5
- package/dist/editor/client-reference-resolver.js +2 -19
- package/dist/editor/comments/BranchComments.js +0 -4
- package/dist/editor/comments/EntryComments.js +0 -4
- package/dist/editor/comments/FieldWrapper.js +0 -4
- package/dist/editor/comments/InlineCommentThread.js +0 -2
- package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
- package/dist/editor/comments/ThreadCarousel.js +0 -12
- package/dist/editor/components/EditorFooter.d.ts +0 -8
- package/dist/editor/components/EditorFooter.js +0 -5
- package/dist/editor/components/EditorHeader.d.ts +0 -31
- package/dist/editor/components/EditorHeader.js +21 -71
- package/dist/editor/components/EditorSidebar.d.ts +0 -19
- package/dist/editor/components/EditorSidebar.js +0 -16
- package/dist/editor/components/EntryCreateModal.d.ts +4 -4
- package/dist/editor/components/EntryCreateModal.js +7 -22
- package/dist/editor/components/RenameEntryModal.js +0 -4
- package/dist/editor/components/UserBadge.js +0 -10
- package/dist/editor/components/index.js +0 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -7
- package/dist/editor/context/ApiClientContext.js +39 -11
- package/dist/editor/context/AssetContext.d.ts +7 -17
- package/dist/editor/context/AssetContext.js +7 -17
- package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
- package/dist/editor/context/EditorIdentityContext.js +7 -0
- package/dist/editor/context/EditorStateContext.d.ts +10 -41
- package/dist/editor/context/EditorStateContext.js +7 -23
- package/dist/editor/context/SWRProvider.d.ts +3 -6
- package/dist/editor/context/index.d.ts +1 -20
- package/dist/editor/context/index.js +1 -20
- package/dist/editor/editor-utils.d.ts +8 -47
- package/dist/editor/editor-utils.js +19 -72
- package/dist/editor/fields/BlockField.d.ts +2 -2
- package/dist/editor/fields/BlockField.js +1 -2
- package/dist/editor/fields/CodeField.d.ts +0 -1
- package/dist/editor/fields/CodeField.js +0 -1
- package/dist/editor/fields/DateTimeField.d.ts +15 -22
- package/dist/editor/fields/DateTimeField.js +17 -26
- package/dist/editor/fields/ImageField.d.ts +2 -2
- package/dist/editor/fields/ImageField.js +8 -14
- package/dist/editor/fields/InlineGroupField.d.ts +0 -1
- package/dist/editor/fields/InlineGroupField.js +0 -1
- package/dist/editor/fields/MarkdownField.d.ts +0 -1
- package/dist/editor/fields/MarkdownField.js +6 -11
- package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
- package/dist/editor/fields/MdxImageDialog.js +0 -1
- package/dist/editor/fields/NumberField.d.ts +9 -19
- package/dist/editor/fields/NumberField.js +11 -22
- package/dist/editor/fields/NumberListField.d.ts +7 -10
- package/dist/editor/fields/NumberListField.js +7 -10
- package/dist/editor/fields/ObjectField.d.ts +5 -8
- package/dist/editor/fields/ObjectField.js +0 -1
- package/dist/editor/fields/ReferenceField.d.ts +1 -1
- package/dist/editor/fields/ReferenceField.js +11 -16
- package/dist/editor/fields/SelectField.d.ts +2 -2
- package/dist/editor/fields/SelectField.js +0 -1
- package/dist/editor/fields/StringListField.d.ts +0 -4
- package/dist/editor/fields/StringListField.js +4 -9
- package/dist/editor/fields/TextField.d.ts +0 -1
- package/dist/editor/fields/TextField.js +0 -1
- package/dist/editor/fields/ToggleField.d.ts +0 -1
- package/dist/editor/fields/ToggleField.js +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts +0 -3
- package/dist/editor/group-manager/GroupForm.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
- package/dist/editor/group-manager/MemberList.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
- package/dist/editor/group-manager/index.d.ts +0 -6
- package/dist/editor/group-manager/index.js +0 -10
- package/dist/editor/group-manager/types.d.ts +2 -5
- package/dist/editor/group-manager/types.js +0 -3
- package/dist/editor/hooks/index.d.ts +6 -11
- package/dist/editor/hooks/index.js +6 -12
- package/dist/editor/hooks/useBranchActions.d.ts +0 -14
- package/dist/editor/hooks/useBranchActions.js +0 -22
- package/dist/editor/hooks/useBranchManager.d.ts +2 -48
- package/dist/editor/hooks/useBranchManager.js +4 -64
- package/dist/editor/hooks/useBranchesData.d.ts +7 -6
- package/dist/editor/hooks/useBranchesData.js +7 -6
- package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
- package/dist/editor/hooks/useCommentSystem.js +1 -36
- package/dist/editor/hooks/useDraftManager.d.ts +2 -35
- package/dist/editor/hooks/useDraftManager.js +23 -64
- package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
- package/dist/editor/hooks/useEditorLayout.js +0 -23
- package/dist/editor/hooks/useEntriesData.d.ts +1 -0
- package/dist/editor/hooks/useEntriesData.js +2 -3
- package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
- package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
- package/dist/editor/hooks/useEntryManager.d.ts +2 -27
- package/dist/editor/hooks/useEntryManager.js +29 -78
- package/dist/editor/hooks/useGroupManager.d.ts +0 -21
- package/dist/editor/hooks/useGroupManager.js +0 -21
- package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
- package/dist/editor/hooks/usePermissionManager.js +0 -20
- package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
- package/dist/editor/hooks/useReferenceResolution.js +1 -48
- package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
- package/dist/editor/hooks/useSchemaManager.js +0 -19
- package/dist/editor/hooks/useUserContext.d.ts +2 -9
- package/dist/editor/hooks/useUserContext.js +10 -10
- package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
- package/dist/editor/hooks/useUserMetadata.js +0 -3
- package/dist/editor/media/AssetCard.d.ts +0 -1
- package/dist/editor/media/AssetCard.js +1 -2
- package/dist/editor/media/CropStep.d.ts +0 -1
- package/dist/editor/media/CropStep.js +0 -1
- package/dist/editor/media/MediaLibrary.d.ts +1 -2
- package/dist/editor/media/MediaLibrary.js +1 -2
- package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
- package/dist/editor/media/MediaLibraryBody.js +0 -1
- package/dist/editor/media/crop-math.d.ts +1 -1
- package/dist/editor/media/crop-math.js +1 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
- package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
- package/dist/editor/permission-manager/PermissionEditor.js +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
- package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
- package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
- package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
- package/dist/editor/permission-manager/constants.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
- package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
- package/dist/editor/permission-manager/index.d.ts +0 -7
- package/dist/editor/permission-manager/index.js +0 -16
- package/dist/editor/permission-manager/types.d.ts +2 -12
- package/dist/editor/permission-manager/types.js +0 -3
- package/dist/editor/permission-manager/utils.d.ts +0 -28
- package/dist/editor/permission-manager/utils.js +9 -23
- package/dist/editor/preview-bridge.d.ts +5 -1
- package/dist/editor/preview-bridge.js +4 -4
- package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
- package/dist/editor/schema-editor/CollectionEditor.js +9 -31
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
- package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
- package/dist/editor/schema-editor/index.d.ts +0 -7
- package/dist/editor/schema-editor/index.js +0 -7
- package/dist/editor/utils/env.d.ts +3 -18
- package/dist/editor/utils/env.js +6 -25
- package/dist/entry-link-resolver.d.ts +13 -35
- package/dist/entry-link-resolver.js +20 -53
- package/dist/entry-schema-registry.d.ts +20 -60
- package/dist/entry-schema-registry.js +20 -69
- package/dist/entry-schema.d.ts +118 -223
- package/dist/entry-schema.js +46 -91
- package/dist/git-manager.d.ts +101 -200
- package/dist/git-manager.js +211 -384
- package/dist/github-service.d.ts +34 -75
- package/dist/github-service.js +37 -91
- package/dist/http/handler.d.ts +6 -37
- package/dist/http/handler.js +65 -120
- package/dist/http/router.d.ts +15 -32
- package/dist/http/router.js +34 -99
- package/dist/http/types.d.ts +15 -40
- package/dist/http/types.js +3 -7
- package/dist/id.d.ts +4 -10
- package/dist/id.js +4 -10
- package/dist/index.js +6 -9
- package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
- package/dist/operating-mode/client-safe-strategy.js +8 -28
- package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
- package/dist/operating-mode/client-unsafe-strategy.js +9 -34
- package/dist/operating-mode/client.d.ts +3 -10
- package/dist/operating-mode/client.js +3 -8
- package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
- package/dist/operating-mode/deployment-name-fixtures.js +14 -18
- package/dist/operating-mode/deployment-name.d.ts +19 -29
- package/dist/operating-mode/deployment-name.js +29 -47
- package/dist/operating-mode/index.d.ts +4 -25
- package/dist/operating-mode/index.js +9 -31
- package/dist/operating-mode/mode-env.d.ts +32 -54
- package/dist/operating-mode/mode-env.js +36 -58
- package/dist/operating-mode/types.d.ts +24 -72
- package/dist/operating-mode/types.js +1 -7
- package/dist/paths/branch-name.d.ts +30 -40
- package/dist/paths/branch-name.js +30 -40
- package/dist/paths/branch.d.ts +4 -18
- package/dist/paths/branch.js +6 -22
- package/dist/paths/index.d.ts +2 -13
- package/dist/paths/index.js +3 -23
- package/dist/paths/normalize-server.d.ts +3 -15
- package/dist/paths/normalize-server.js +3 -15
- package/dist/paths/normalize.d.ts +13 -33
- package/dist/paths/normalize.js +13 -33
- package/dist/paths/resolve.d.ts +4 -17
- package/dist/paths/resolve.js +4 -22
- package/dist/paths/types.d.ts +12 -34
- package/dist/paths/types.js +5 -7
- package/dist/paths/validation.d.ts +22 -119
- package/dist/paths/validation.js +30 -148
- package/dist/reference-resolver.d.ts +0 -13
- package/dist/reference-resolver.js +0 -18
- package/dist/resolve-canopy-user.d.ts +16 -18
- package/dist/resolve-canopy-user.js +17 -26
- package/dist/resource-generation.d.ts +16 -25
- package/dist/resource-generation.js +34 -97
- package/dist/schema/meta-loader.d.ts +2 -14
- package/dist/schema/meta-loader.js +15 -64
- package/dist/schema/resolver.d.ts +1 -4
- package/dist/schema/resolver.js +1 -6
- package/dist/schema/schema-store-types.d.ts +0 -12
- package/dist/schema/schema-store.d.ts +61 -138
- package/dist/schema/schema-store.js +85 -282
- package/dist/schema/types.d.ts +0 -4
- package/dist/server.d.ts +62 -93
- package/dist/server.js +63 -94
- package/dist/services.d.ts +23 -47
- package/dist/services.js +55 -98
- package/dist/settings-workspace.d.ts +17 -30
- package/dist/settings-workspace.js +51 -81
- package/dist/static/index.d.ts +26 -52
- package/dist/static/index.js +33 -67
- package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
- package/dist/task-queue/cms-task-queue.js +13 -0
- package/dist/task-queue/task-queue-config.d.ts +3 -0
- package/dist/{worker → task-queue}/task-queue-config.js +1 -6
- package/dist/task-queue/task-queue.d.ts +16 -22
- package/dist/task-queue/task-queue.js +20 -44
- package/dist/task-queue/types.d.ts +0 -1
- package/dist/task-queue/worker-status.d.ts +35 -0
- package/dist/task-queue/worker-status.js +40 -0
- package/dist/types.d.ts +40 -51
- package/dist/url-collision.d.ts +26 -40
- package/dist/url-collision.js +47 -63
- package/dist/url-exclusivity-fixtures.d.ts +15 -20
- package/dist/url-exclusivity-fixtures.js +14 -19
- package/dist/url-path-resolver.d.ts +8 -16
- package/dist/url-path-resolver.js +19 -29
- package/dist/user.d.ts +8 -21
- package/dist/user.js +10 -19
- package/dist/utils/async-mutex.js +4 -6
- package/dist/utils/atomic-write.d.ts +2 -11
- package/dist/utils/atomic-write.js +2 -11
- package/dist/utils/body-field.d.ts +8 -15
- package/dist/utils/body-field.js +8 -15
- package/dist/utils/content-serialize.d.ts +18 -24
- package/dist/utils/content-serialize.js +109 -160
- package/dist/utils/content-write-lock.d.ts +51 -106
- package/dist/utils/content-write-lock.js +66 -111
- package/dist/utils/debug.d.ts +7 -23
- package/dist/utils/debug.js +7 -23
- package/dist/utils/entry-url.d.ts +11 -23
- package/dist/utils/entry-url.js +11 -26
- package/dist/utils/error.d.ts +25 -90
- package/dist/utils/error.js +60 -147
- package/dist/utils/flatten-group-fields.d.ts +5 -7
- package/dist/utils/flatten-group-fields.js +5 -7
- package/dist/utils/format.d.ts +1 -5
- package/dist/utils/format.js +1 -5
- package/dist/utils/fs.d.ts +3 -4
- package/dist/utils/fs.js +3 -4
- package/dist/utils/git.d.ts +52 -83
- package/dist/utils/git.js +79 -125
- package/dist/utils/logger.d.ts +35 -50
- package/dist/utils/logger.js +35 -52
- package/dist/utils/provisioning-lock.d.ts +23 -35
- package/dist/utils/provisioning-lock.js +49 -69
- package/dist/utils/sanitize-href.d.ts +5 -10
- package/dist/utils/sanitize-href.js +8 -18
- package/dist/utils/title-field.d.ts +17 -20
- package/dist/utils/title-field.js +18 -27
- package/dist/utils/typed-filename.d.ts +20 -48
- package/dist/utils/typed-filename.js +25 -61
- package/dist/utils/url-prefix.d.ts +3 -3
- package/dist/utils/url-prefix.js +3 -3
- package/dist/validation/block-structural-keys.d.ts +16 -31
- package/dist/validation/block-structural-keys.js +19 -29
- package/dist/validation/deletion-checker.d.ts +0 -34
- package/dist/validation/deletion-checker.js +1 -43
- package/dist/validation/entry-link-validator.d.ts +6 -13
- package/dist/validation/entry-link-validator.js +4 -13
- package/dist/validation/entry-type-reference-validator.d.ts +13 -18
- package/dist/validation/entry-type-reference-validator.js +13 -18
- package/dist/validation/entry-validator.d.ts +13 -25
- package/dist/validation/entry-validator.js +15 -32
- package/dist/validation/field-traversal.d.ts +3 -30
- package/dist/validation/field-traversal.js +1 -32
- package/dist/validation/reference-validator.d.ts +5 -24
- package/dist/validation/reference-validator.js +5 -30
- package/dist/worker/cms-worker.d.ts +172 -232
- package/dist/worker/cms-worker.js +241 -333
- package/dist/worker/git-sync.d.ts +32 -133
- package/dist/worker/git-sync.js +129 -191
- package/dist/worker/github-auth.d.ts +13 -19
- package/dist/worker/github-auth.js +13 -19
- package/dist/worker/history-rewrite.d.ts +53 -66
- package/dist/worker/history-rewrite.js +54 -60
- package/dist/worker/log.d.ts +24 -41
- package/dist/worker/log.js +25 -42
- package/dist/worker/rebase.d.ts +20 -110
- package/dist/worker/rebase.js +279 -354
- package/dist/worker/task-runner.d.ts +32 -66
- package/dist/worker/task-runner.js +126 -162
- package/dist/worker/worker-context.d.ts +41 -81
- package/package.json +4 -4
- package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
- package/dist/worker/task-queue-config.d.ts +0 -8
- package/dist/worker/task-queue.js +0 -19
- package/dist/worker/worker-status.d.ts +0 -47
- package/dist/worker/worker-status.js +0 -52
package/dist/comment-store.js
CHANGED
|
@@ -3,39 +3,31 @@ import path from 'node:path';
|
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { withLock } from './utils/async-mutex.js';
|
|
5
5
|
import { writeOccJsonFile, withOccRetry, withOccFileLock, OccWriteConflictError, } from './utils/occ-json-write.js';
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
* Operations that encounter this error will automatically retry.
|
|
9
|
-
*/
|
|
10
|
-
export class CommentStoreConflictError extends Error {
|
|
6
|
+
/** A concurrent modification that survived every OCC retry. */
|
|
7
|
+
class CommentStoreConflictError extends Error {
|
|
11
8
|
constructor() {
|
|
12
9
|
super('Concurrent modification detected');
|
|
13
10
|
this.name = 'CommentStoreConflictError';
|
|
14
11
|
}
|
|
15
12
|
}
|
|
16
13
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* Comment storage for a branch workspace, in .canopy-meta/comments.json and
|
|
15
|
+
* never committed to git.
|
|
19
16
|
*
|
|
20
|
-
* Mutators
|
|
17
|
+
* Mutators run under three layers, outermost to innermost:
|
|
21
18
|
*
|
|
22
|
-
* 1. {@link withLock}
|
|
23
|
-
* path
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* 3. {@link withOccRetry} around {@link writeOccJsonFile} - version/writeId
|
|
33
|
-
* based optimistic concurrency control. With layers 1-2 in place this is
|
|
34
|
-
* now a defense-in-depth backstop only (e.g. a stale process from a
|
|
35
|
-
* rolling deploy writing without the lock), not the primary safety
|
|
36
|
-
* mechanism.
|
|
19
|
+
* 1. {@link withLock} — an in-process FIFO mutex keyed by the resolved file
|
|
20
|
+
* path, so mutators racing on one host cannot interleave their
|
|
21
|
+
* load-modify-write cycles, whether they share a store instance or not.
|
|
22
|
+
* 2. {@link withOccFileLock} — a server-enforced, cross-process/cross-host lock
|
|
23
|
+
* (proper-lockfile, mkdir-based). This is what actually prevents lost
|
|
24
|
+
* comments across two warm Lambda containers on EFS, where rename-based OCC
|
|
25
|
+
* verification alone is unreliable.
|
|
26
|
+
* 3. {@link withOccRetry} around {@link writeOccJsonFile} — version/writeId
|
|
27
|
+
* optimistic concurrency. With layers 1-2 in place it is defense in depth
|
|
28
|
+
* only, for a writer that skips the lock (a stale process mid-deploy).
|
|
37
29
|
*
|
|
38
|
-
*
|
|
30
|
+
* Guarantees for layers 2-3: `utils/occ-json-write.ts`.
|
|
39
31
|
*/
|
|
40
32
|
export class CommentStore {
|
|
41
33
|
constructor(branchRoot, options) {
|
|
@@ -44,19 +36,15 @@ export class CommentStore {
|
|
|
44
36
|
this.filePath = path.join(path.resolve(branchRoot), '.canopy-meta', 'comments.json');
|
|
45
37
|
this.settleMs = options?.settleMs;
|
|
46
38
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Load comments file for read-only access.
|
|
49
|
-
*/
|
|
39
|
+
/** Read-only load. */
|
|
50
40
|
async load() {
|
|
51
41
|
const { data } = await this.loadWithVersion();
|
|
52
42
|
return data;
|
|
53
43
|
}
|
|
54
44
|
/**
|
|
55
|
-
* Load
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* concurrent mutate cycles on the same instance never clobber each other's
|
|
59
|
-
* expected version).
|
|
45
|
+
* Load, with the version observed at load time. Mutators thread that version
|
|
46
|
+
* through their load-modify-write cycle as a LOCAL value, never as instance
|
|
47
|
+
* state, so concurrent cycles cannot clobber each other's expected version.
|
|
60
48
|
*/
|
|
61
49
|
async loadWithVersion() {
|
|
62
50
|
try {
|
|
@@ -79,15 +67,15 @@ export class CommentStore {
|
|
|
79
67
|
}
|
|
80
68
|
}
|
|
81
69
|
/**
|
|
82
|
-
* Write comments
|
|
70
|
+
* Write comments.json via the shared OCC helper.
|
|
83
71
|
*
|
|
84
|
-
* Throws the helper's raw {@link OccWriteConflictError}
|
|
85
|
-
* {@link withOccRetry} in withMutation() recognizes and retries
|
|
86
|
-
* translation to the public `CommentStoreConflictError`
|
|
87
|
-
*
|
|
72
|
+
* Throws the helper's raw {@link OccWriteConflictError}, which is what the
|
|
73
|
+
* surrounding {@link withOccRetry} in withMutation() recognizes and retries;
|
|
74
|
+
* translation to the public `CommentStoreConflictError` happens at the
|
|
75
|
+
* withMutation() boundary, once retries are exhausted.
|
|
88
76
|
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
77
|
+
* comments.json is written without a trailing newline (`writeOccJsonFile`'s
|
|
78
|
+
* default), unlike branch.json.
|
|
91
79
|
*/
|
|
92
80
|
async writeData(data, expectedVersion) {
|
|
93
81
|
await writeOccJsonFile(this.filePath, { ...data }, {
|
|
@@ -97,8 +85,8 @@ export class CommentStore {
|
|
|
97
85
|
}
|
|
98
86
|
/**
|
|
99
87
|
* Run a mutate cycle (load -> modify -> write) under the full lock +
|
|
100
|
-
* OCC-retry stack
|
|
101
|
-
*
|
|
88
|
+
* OCC-retry stack (class doc). A conflict surviving every retry surfaces as
|
|
89
|
+
* `CommentStoreConflictError`.
|
|
102
90
|
*/
|
|
103
91
|
async withMutation(operation) {
|
|
104
92
|
try {
|
|
@@ -128,7 +116,6 @@ export class CommentStore {
|
|
|
128
116
|
text: options.text,
|
|
129
117
|
};
|
|
130
118
|
if (!data.threads[threadId]) {
|
|
131
|
-
// Create new thread
|
|
132
119
|
data.threads[threadId] = {
|
|
133
120
|
id: threadId,
|
|
134
121
|
comments: [comment],
|
|
@@ -141,7 +128,6 @@ export class CommentStore {
|
|
|
141
128
|
};
|
|
142
129
|
}
|
|
143
130
|
else {
|
|
144
|
-
// Add to existing thread
|
|
145
131
|
data.threads[threadId].comments.push(comment);
|
|
146
132
|
}
|
|
147
133
|
await this.writeData(data, version);
|
|
@@ -182,27 +168,21 @@ export class CommentStore {
|
|
|
182
168
|
return true;
|
|
183
169
|
});
|
|
184
170
|
}
|
|
185
|
-
/**
|
|
186
|
-
* Get all threads for a specific field
|
|
187
|
-
*/
|
|
171
|
+
/** Threads on one field. */
|
|
188
172
|
async getThreadsForField(entryPath, canopyPath) {
|
|
189
173
|
const data = await this.load();
|
|
190
174
|
return Object.values(data.threads)
|
|
191
175
|
.filter((t) => t.type === 'field' && t.entryPath === entryPath && t.canopyPath === canopyPath)
|
|
192
176
|
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
193
177
|
}
|
|
194
|
-
/**
|
|
195
|
-
* Get all threads for a specific entry (not field-specific)
|
|
196
|
-
*/
|
|
178
|
+
/** Threads on one entry, excluding its field threads. */
|
|
197
179
|
async getThreadsForEntry(entryPath) {
|
|
198
180
|
const data = await this.load();
|
|
199
181
|
return Object.values(data.threads)
|
|
200
182
|
.filter((t) => t.type === 'entry' && t.entryPath === entryPath)
|
|
201
183
|
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
202
184
|
}
|
|
203
|
-
/**
|
|
204
|
-
* Get all branch-level threads
|
|
205
|
-
*/
|
|
185
|
+
/** Branch-level threads. */
|
|
206
186
|
async getBranchThreads() {
|
|
207
187
|
const data = await this.load();
|
|
208
188
|
return Object.values(data.threads)
|
package/dist/config/flatten.d.ts
CHANGED
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
* Schema flattening utilities for O(1) lookups.
|
|
3
3
|
*/
|
|
4
4
|
import type { FlatSchemaItem, RootCollectionConfig } from './types.js';
|
|
5
|
-
/**
|
|
6
|
-
* Normalize a path value by splitting, filtering empty segments, and rejoining.
|
|
7
|
-
*/
|
|
8
5
|
export declare const normalizePathValue: (val: string) => string;
|
|
9
6
|
/**
|
|
10
7
|
* Flatten the root collection schema into a flat array for O(1) lookups.
|
package/dist/config/flatten.js
CHANGED
|
@@ -4,9 +4,6 @@
|
|
|
4
4
|
import { join, normalize } from 'pathe';
|
|
5
5
|
import { createLogicalPath } from '../paths/normalize.js';
|
|
6
6
|
import { ROOT_COLLECTION_ID } from '../paths/types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Normalize a path value by splitting, filtering empty segments, and rejoining.
|
|
9
|
-
*/
|
|
10
7
|
export const normalizePathValue = (val) => normalize(val).split('/').filter(Boolean).join('/');
|
|
11
8
|
/**
|
|
12
9
|
* Flatten the root collection schema into a flat array for O(1) lookups.
|
|
@@ -37,7 +34,6 @@ export const flattenSchema = (root, basePath = '') => {
|
|
|
37
34
|
logicalPath = normalizedPath;
|
|
38
35
|
}
|
|
39
36
|
const normalizedFull = normalizePathValue(logicalPath);
|
|
40
|
-
// Add the collection itself
|
|
41
37
|
flat.push({
|
|
42
38
|
type: 'collection',
|
|
43
39
|
logicalPath: createLogicalPath(normalizedFull),
|
|
@@ -50,7 +46,6 @@ export const flattenSchema = (root, basePath = '') => {
|
|
|
50
46
|
collections: collection.collections,
|
|
51
47
|
order: collection.order,
|
|
52
48
|
});
|
|
53
|
-
// Add entry types in this collection
|
|
54
49
|
if (collection.entries) {
|
|
55
50
|
for (const entryType of collection.entries) {
|
|
56
51
|
// Entry type path is collection path + entry type name
|
|
@@ -70,15 +65,14 @@ export const flattenSchema = (root, basePath = '') => {
|
|
|
70
65
|
});
|
|
71
66
|
}
|
|
72
67
|
}
|
|
73
|
-
// Recursively process nested collections
|
|
74
68
|
if (collection.collections) {
|
|
75
69
|
for (const child of collection.collections) {
|
|
76
70
|
walkCollection(child, normalizedFull);
|
|
77
71
|
}
|
|
78
72
|
}
|
|
79
73
|
};
|
|
80
|
-
//
|
|
81
|
-
//
|
|
74
|
+
// The root collection is pushed here so content root behaves exactly like any other
|
|
75
|
+
// collection, just without a parent.
|
|
82
76
|
if (base) {
|
|
83
77
|
flat.push({
|
|
84
78
|
type: 'collection',
|
|
@@ -92,11 +86,8 @@ export const flattenSchema = (root, basePath = '') => {
|
|
|
92
86
|
order: root.order,
|
|
93
87
|
});
|
|
94
88
|
}
|
|
95
|
-
// Add root-level entry types
|
|
96
|
-
// Now their parentPath will reference the root collection we just added above
|
|
97
89
|
if (root.entries) {
|
|
98
90
|
for (const entryType of root.entries) {
|
|
99
|
-
// Root entry type path is base + entry type name
|
|
100
91
|
const entryTypePath = base ? join(base, entryType.name) : entryType.name;
|
|
101
92
|
flat.push({
|
|
102
93
|
type: 'entry-type',
|
|
@@ -113,7 +104,6 @@ export const flattenSchema = (root, basePath = '') => {
|
|
|
113
104
|
});
|
|
114
105
|
}
|
|
115
106
|
}
|
|
116
|
-
// Process root-level collections
|
|
117
107
|
// Pass base as parentPath so they are children of the content root collection
|
|
118
108
|
if (root.collections) {
|
|
119
109
|
for (const collection of root.collections) {
|
package/dist/config/helpers.js
CHANGED
|
@@ -32,9 +32,9 @@ export function defineCanopyConfig(config) {
|
|
|
32
32
|
// Full server config - all fields including sensitive data
|
|
33
33
|
server: validated,
|
|
34
34
|
// Client config helper - extracts safe subset and merges overrides
|
|
35
|
-
// Note: flatSchema is loaded dynamically by the editor via API (from .collection.json files)
|
|
36
35
|
client: (clientOverrides) => {
|
|
37
36
|
const { defaultBaseBranch, defaultActiveBranch, contentRoot, editor, mode, entryLinkUrl, media, basePath, } = validated;
|
|
37
|
+
// flatSchema is loaded dynamically by the editor via API (from .collection.json files)
|
|
38
38
|
const clientConfig = {
|
|
39
39
|
defaultBaseBranch,
|
|
40
40
|
defaultActiveBranch,
|
|
@@ -44,7 +44,7 @@ export function defineCanopyConfig(config) {
|
|
|
44
44
|
entryLinkUrl,
|
|
45
45
|
assetBaseUrl: media?.publicBaseUrl,
|
|
46
46
|
basePath,
|
|
47
|
-
flatSchema: [],
|
|
47
|
+
flatSchema: [],
|
|
48
48
|
};
|
|
49
49
|
// Merge client overrides (e.g., auth handlers from useClerkAuthConfig)
|
|
50
50
|
if (clientOverrides?.editor) {
|
package/dist/config/index.d.ts
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```ts
|
|
8
|
-
* import { defineCanopyConfig, type FieldConfig } from 'canopycms
|
|
8
|
+
* import { defineCanopyConfig, type FieldConfig } from 'canopycms'
|
|
9
9
|
* ```
|
|
10
10
|
*/
|
|
11
|
-
export type { PrimitiveFieldType, FieldType, ContentFormat, MediaAdapterKind, PermissionLevel, PermissionTarget, PathPermission, SelectOption, ReferenceOption, FieldConfig, BlockConfig, BlockFieldConfig, SelectFieldConfig, ReferenceFieldConfig, ImageFieldConfig, ImageFieldValue, ObjectFieldConfig, InlineGroupFieldConfig, CustomFieldConfig, EntrySchema, BranchSchema, EntryTypeConfig, CollectionConfig, RootCollectionConfig, MediaConfig, CanopyEditorConfig, DefaultBranchAccess, DefaultPathAccess, DefaultPathAccessLevel, DefaultPathAccessLevels, DefaultBaseBranch, DefaultRemoteName, DefaultRemoteUrl, GitBotAuthorName, GitBotAuthorEmail, GithubTokenEnvVar, CanopyOperatingMode, ContentRoot, SourceRoot, CanopyConfig, CanopyConfigInput, CanopyConfigFragment, FlatSchemaItem, CanopyClientConfig, ClientOnlyFields, EntryValidationIssue, ValidateEntryInput, ValidateEntryHook, } from './types.js';
|
|
11
|
+
export type { PrimitiveFieldType, FieldType, ContentFormat, MediaAdapterKind, PermissionLevel, PermissionTarget, PathPermission, SelectOption, ReferenceOption, FieldConfig, BlockConfig, BlockFieldConfig, SelectFieldConfig, ReferenceFieldConfig, ImageFieldConfig, ImageFieldValue, ObjectFieldConfig, InlineGroupFieldConfig, CustomFieldConfig, EntrySchema, BranchSchema, EntryTypeConfig, CollectionConfig, RootCollectionConfig, MediaConfig, CanopyEditorConfig, DefaultBranchAccess, DefaultPathAccess, DefaultPathAccessLevel, DefaultPathAccessLevels, DefaultBaseBranch, DefaultRemoteName, DefaultRemoteUrl, GitBotAuthorName, GitBotAuthorEmail, GithubTokenEnvVar, CanopyOperatingMode, ContentRoot, SourceRoot, CanopyConfig, CanopyConfigInput, CanopyConfigFragment, FlatSchemaItem, CanopyClientConfig, ClientOnlyFields, EditorSignInProps, EntryValidationIssue, ValidateEntryInput, ValidateEntryHook, } from './types.js';
|
|
12
12
|
export { primitiveFieldTypes, fieldTypes } from './types.js';
|
|
13
13
|
export { CanopyConfigSchema, getConfigDefaults, DEFAULT_PROD_WORKSPACE } from './schemas/config.js';
|
|
14
14
|
export { fieldSchema, blockSchema, selectOptionSchema, referenceOptionSchema, imageFieldSchema, } from './schemas/field.js';
|
package/dist/config/index.js
CHANGED
|
@@ -5,18 +5,15 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```ts
|
|
8
|
-
* import { defineCanopyConfig, type FieldConfig } from 'canopycms
|
|
8
|
+
* import { defineCanopyConfig, type FieldConfig } from 'canopycms'
|
|
9
9
|
* ```
|
|
10
10
|
*/
|
|
11
|
-
// Re-export type constants
|
|
12
11
|
export { primitiveFieldTypes, fieldTypes } from './types.js';
|
|
13
|
-
// Re-export schemas (for advanced use cases)
|
|
14
12
|
export { CanopyConfigSchema, getConfigDefaults, DEFAULT_PROD_WORKSPACE } from './schemas/config.js';
|
|
15
13
|
export { fieldSchema, blockSchema, selectOptionSchema, referenceOptionSchema, imageFieldSchema, } from './schemas/field.js';
|
|
16
14
|
export { collectionSchema, entryTypeSchema, relativePathSchema } from './schemas/collection.js';
|
|
17
15
|
export { permissionTargetSchema, pathPermissionSchema } from './schemas/permissions.js';
|
|
18
16
|
export { mediaSchema } from './schemas/media.js';
|
|
19
|
-
// Re-export utilities
|
|
20
17
|
export { flattenSchema, normalizePathValue } from './flatten.js';
|
|
21
18
|
export { validateCanopyConfig, ensureSelectFieldsHaveOptions } from './validation.js';
|
|
22
19
|
export { defineCanopyConfig, composeCanopyConfig } from './helpers.js';
|
|
@@ -3,14 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
export declare const relativePathSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
|
|
6
|
-
/**
|
|
7
|
-
* Entry type schema: defines a type of content within a collection.
|
|
8
|
-
* Each type has its own schema (fields) and can have cardinality constraints.
|
|
9
|
-
*
|
|
10
|
-
* Examples:
|
|
11
|
-
* - { name: 'post', format: 'mdx', schema: postSchema } - unlimited posts
|
|
12
|
-
* - { name: 'settings', format: 'json', schema: settingsSchema, maxItems: 1 } - restricted to one instance
|
|
13
|
-
*/
|
|
14
6
|
export declare const entryTypeSchema: z.ZodObject<{
|
|
15
7
|
name: z.ZodString;
|
|
16
8
|
format: z.ZodEnum<["md", "mdx", "json", "yaml"]>;
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { isAbsolute } from 'pathe';
|
|
6
6
|
import { fieldSchema } from './field.js';
|
|
7
|
-
// Relative path schema - validates and normalizes paths
|
|
8
7
|
export const relativePathSchema = z
|
|
9
8
|
.string()
|
|
10
9
|
.min(1)
|
|
@@ -16,14 +15,6 @@ export const relativePathSchema = z
|
|
|
16
15
|
.split(/[\\/]+/)
|
|
17
16
|
.filter(Boolean)
|
|
18
17
|
.join('/'));
|
|
19
|
-
/**
|
|
20
|
-
* Entry type schema: defines a type of content within a collection.
|
|
21
|
-
* Each type has its own schema (fields) and can have cardinality constraints.
|
|
22
|
-
*
|
|
23
|
-
* Examples:
|
|
24
|
-
* - { name: 'post', format: 'mdx', schema: postSchema } - unlimited posts
|
|
25
|
-
* - { name: 'settings', format: 'json', schema: settingsSchema, maxItems: 1 } - restricted to one instance
|
|
26
|
-
*/
|
|
27
18
|
export const entryTypeSchema = z.object({
|
|
28
19
|
name: z.string().min(1),
|
|
29
20
|
format: z.enum(['md', 'mdx', 'json', 'yaml']),
|
|
@@ -33,7 +24,6 @@ export const entryTypeSchema = z.object({
|
|
|
33
24
|
default: z.boolean().optional(),
|
|
34
25
|
maxItems: z.number().int().positive().optional(),
|
|
35
26
|
});
|
|
36
|
-
// Recursive collection schema
|
|
37
27
|
const collectionSchema = z.lazy(() => z
|
|
38
28
|
.object({
|
|
39
29
|
name: z.string().min(1),
|
|
@@ -4,80 +4,7 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import type { AuthPlugin } from '../../auth/plugin.js';
|
|
6
6
|
import type { EntryLinkUrlResolver } from '../../entry-link-resolver.js';
|
|
7
|
-
import type { ValidateEntryHook } from '../types.js';
|
|
8
|
-
export declare const defaultBranchAccessSchema: z.ZodDefault<z.ZodEnum<["allow", "deny"]>>;
|
|
9
|
-
export declare const defaultPathAccessLevelSchema: z.ZodEnum<["allow", "deny"]>;
|
|
10
|
-
export declare const defaultPathAccessLevelsSchema: z.ZodObject<{
|
|
11
|
-
read: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
|
|
12
|
-
edit: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
|
|
13
|
-
review: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
|
|
14
|
-
}, "strict", z.ZodTypeAny, {
|
|
15
|
-
read?: "allow" | "deny" | undefined;
|
|
16
|
-
edit?: "allow" | "deny" | undefined;
|
|
17
|
-
review?: "allow" | "deny" | undefined;
|
|
18
|
-
}, {
|
|
19
|
-
read?: "allow" | "deny" | undefined;
|
|
20
|
-
edit?: "allow" | "deny" | undefined;
|
|
21
|
-
review?: "allow" | "deny" | undefined;
|
|
22
|
-
}>;
|
|
23
|
-
export declare const defaultPathAccessSchema: z.ZodDefault<z.ZodUnion<[z.ZodEnum<["allow", "deny"]>, z.ZodObject<{
|
|
24
|
-
read: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
|
|
25
|
-
edit: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
|
|
26
|
-
review: z.ZodOptional<z.ZodEnum<["allow", "deny"]>>;
|
|
27
|
-
}, "strict", z.ZodTypeAny, {
|
|
28
|
-
read?: "allow" | "deny" | undefined;
|
|
29
|
-
edit?: "allow" | "deny" | undefined;
|
|
30
|
-
review?: "allow" | "deny" | undefined;
|
|
31
|
-
}, {
|
|
32
|
-
read?: "allow" | "deny" | undefined;
|
|
33
|
-
edit?: "allow" | "deny" | undefined;
|
|
34
|
-
review?: "allow" | "deny" | undefined;
|
|
35
|
-
}>]>>;
|
|
36
|
-
export declare const defaultBaseBranchSchema: z.ZodDefault<z.ZodString>;
|
|
37
|
-
export declare const defaultRemoteNameSchema: z.ZodDefault<z.ZodString>;
|
|
38
|
-
export declare const defaultRemoteUrlSchema: z.ZodString;
|
|
39
|
-
export declare const gitBotAuthorNameSchema: z.ZodString;
|
|
40
|
-
export declare const gitBotAuthorEmailSchema: z.ZodString;
|
|
41
|
-
export declare const githubTokenEnvVarSchema: z.ZodDefault<z.ZodString>;
|
|
42
|
-
export declare const operatingModeSchema: z.ZodEnum<["prod", "dev"]>;
|
|
43
|
-
export declare const deployedAsSchema: z.ZodDefault<z.ZodEnum<["static", "server"]>>;
|
|
44
|
-
export declare const contentRootSchema: z.ZodDefault<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>>;
|
|
45
|
-
export declare const sourceRootSchema: z.ZodOptional<z.ZodString>;
|
|
46
|
-
export declare const basePathSchema: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
|
|
47
|
-
export declare const deploymentNameSchema: z.ZodDefault<z.ZodString>;
|
|
48
|
-
export declare const devContentSyncSchema: z.ZodDefault<z.ZodEnum<["off", "warn"]>>;
|
|
49
|
-
export declare const devConfigSchema: z.ZodObject<{
|
|
50
|
-
contentSync: z.ZodOptional<z.ZodDefault<z.ZodEnum<["off", "warn"]>>>;
|
|
51
|
-
}, "strip", z.ZodTypeAny, {
|
|
52
|
-
contentSync?: "off" | "warn" | undefined;
|
|
53
|
-
}, {
|
|
54
|
-
contentSync?: "off" | "warn" | undefined;
|
|
55
|
-
}>;
|
|
56
|
-
export declare const editorConfigSchema: z.ZodObject<{
|
|
57
|
-
title: z.ZodOptional<z.ZodString>;
|
|
58
|
-
subtitle: z.ZodOptional<z.ZodString>;
|
|
59
|
-
theme: z.ZodOptional<z.ZodUnknown>;
|
|
60
|
-
previewBase: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
61
|
-
onAccountClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
|
|
62
|
-
onLogoutClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
|
|
63
|
-
AccountComponent: z.ZodOptional<z.ZodType<import("react").ComponentType<{}>, z.ZodTypeDef, import("react").ComponentType<{}>>>;
|
|
64
|
-
}, "strip", z.ZodTypeAny, {
|
|
65
|
-
title?: string | undefined;
|
|
66
|
-
subtitle?: string | undefined;
|
|
67
|
-
theme?: unknown;
|
|
68
|
-
previewBase?: Record<string, string> | undefined;
|
|
69
|
-
onAccountClick?: ((...args: unknown[]) => void) | undefined;
|
|
70
|
-
onLogoutClick?: ((...args: unknown[]) => void) | undefined;
|
|
71
|
-
AccountComponent?: import("react").ComponentType<{}> | undefined;
|
|
72
|
-
}, {
|
|
73
|
-
title?: string | undefined;
|
|
74
|
-
subtitle?: string | undefined;
|
|
75
|
-
theme?: unknown;
|
|
76
|
-
previewBase?: Record<string, string> | undefined;
|
|
77
|
-
onAccountClick?: ((...args: unknown[]) => void) | undefined;
|
|
78
|
-
onLogoutClick?: ((...args: unknown[]) => void) | undefined;
|
|
79
|
-
AccountComponent?: import("react").ComponentType<{}> | undefined;
|
|
80
|
-
}>;
|
|
7
|
+
import type { EditorSignInProps, ValidateEntryHook } from '../types.js';
|
|
81
8
|
export declare const CanopyConfigSchema: z.ZodObject<{
|
|
82
9
|
media: z.ZodOptional<z.ZodDiscriminatedUnion<"adapter", [z.ZodObject<{
|
|
83
10
|
adapter: z.ZodLiteral<"local">;
|
|
@@ -160,6 +87,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
160
87
|
onAccountClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
|
|
161
88
|
onLogoutClick: z.ZodOptional<z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>>;
|
|
162
89
|
AccountComponent: z.ZodOptional<z.ZodType<import("react").ComponentType<{}>, z.ZodTypeDef, import("react").ComponentType<{}>>>;
|
|
90
|
+
SignInComponent: z.ZodOptional<z.ZodType<import("react").ComponentType<EditorSignInProps>, z.ZodTypeDef, import("react").ComponentType<EditorSignInProps>>>;
|
|
163
91
|
}, "strip", z.ZodTypeAny, {
|
|
164
92
|
title?: string | undefined;
|
|
165
93
|
subtitle?: string | undefined;
|
|
@@ -168,6 +96,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
168
96
|
onAccountClick?: ((...args: unknown[]) => void) | undefined;
|
|
169
97
|
onLogoutClick?: ((...args: unknown[]) => void) | undefined;
|
|
170
98
|
AccountComponent?: import("react").ComponentType<{}> | undefined;
|
|
99
|
+
SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
|
|
171
100
|
}, {
|
|
172
101
|
title?: string | undefined;
|
|
173
102
|
subtitle?: string | undefined;
|
|
@@ -176,6 +105,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
176
105
|
onAccountClick?: ((...args: unknown[]) => void) | undefined;
|
|
177
106
|
onLogoutClick?: ((...args: unknown[]) => void) | undefined;
|
|
178
107
|
AccountComponent?: import("react").ComponentType<{}> | undefined;
|
|
108
|
+
SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
|
|
179
109
|
}>>;
|
|
180
110
|
authPlugin: z.ZodOptional<z.ZodType<AuthPlugin, z.ZodTypeDef, AuthPlugin>>;
|
|
181
111
|
entryLinkUrl: z.ZodOptional<z.ZodType<EntryLinkUrlResolver, z.ZodTypeDef, EntryLinkUrlResolver>>;
|
|
@@ -236,6 +166,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
236
166
|
onAccountClick?: ((...args: unknown[]) => void) | undefined;
|
|
237
167
|
onLogoutClick?: ((...args: unknown[]) => void) | undefined;
|
|
238
168
|
AccountComponent?: import("react").ComponentType<{}> | undefined;
|
|
169
|
+
SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
|
|
239
170
|
} | undefined;
|
|
240
171
|
authPlugin?: AuthPlugin | undefined;
|
|
241
172
|
entryLinkUrl?: EntryLinkUrlResolver | undefined;
|
|
@@ -289,15 +220,12 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
289
220
|
onAccountClick?: ((...args: unknown[]) => void) | undefined;
|
|
290
221
|
onLogoutClick?: ((...args: unknown[]) => void) | undefined;
|
|
291
222
|
AccountComponent?: import("react").ComponentType<{}> | undefined;
|
|
223
|
+
SignInComponent?: import("react").ComponentType<EditorSignInProps> | undefined;
|
|
292
224
|
} | undefined;
|
|
293
225
|
authPlugin?: AuthPlugin | undefined;
|
|
294
226
|
entryLinkUrl?: EntryLinkUrlResolver | undefined;
|
|
295
227
|
validateEntry?: ValidateEntryHook | undefined;
|
|
296
228
|
}>;
|
|
297
|
-
/**
|
|
298
|
-
* Helper to get schema default values.
|
|
299
|
-
* This centralizes default value extraction from Zod schemas.
|
|
300
|
-
*/
|
|
301
229
|
/**
|
|
302
230
|
* Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set).
|
|
303
231
|
*
|
|
@@ -4,51 +4,49 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { relativePathSchema } from './collection.js';
|
|
6
6
|
import { mediaSchema } from './media.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export const defaultPathAccessLevelSchema = z.enum(['allow', 'deny']);
|
|
7
|
+
const defaultBranchAccessSchema = z.enum(['allow', 'deny']).default('deny');
|
|
8
|
+
const defaultPathAccessLevelSchema = z.enum(['allow', 'deny']);
|
|
10
9
|
// Per-level object form: an omitted level stays undefined after parse (no per-field
|
|
11
10
|
// defaults here) so the runtime resolver (resolveDefaultPathAccess) can fail closed to
|
|
12
11
|
// 'deny' for any level the config author didn't explicitly scope.
|
|
13
|
-
|
|
12
|
+
const defaultPathAccessLevelsSchema = z
|
|
14
13
|
.object({
|
|
15
14
|
read: defaultPathAccessLevelSchema.optional(),
|
|
16
15
|
edit: defaultPathAccessLevelSchema.optional(),
|
|
17
16
|
review: defaultPathAccessLevelSchema.optional(),
|
|
18
17
|
})
|
|
19
18
|
.strict();
|
|
20
|
-
|
|
19
|
+
const defaultPathAccessSchema = z
|
|
21
20
|
.union([defaultPathAccessLevelSchema, defaultPathAccessLevelsSchema])
|
|
22
21
|
.default('deny');
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
const defaultBaseBranchSchema = z.string().default('main');
|
|
23
|
+
const defaultRemoteNameSchema = z.string().default('origin');
|
|
24
|
+
const defaultRemoteUrlSchema = z.string().min(1);
|
|
25
|
+
const gitBotAuthorNameSchema = z.string().min(1);
|
|
26
|
+
const gitBotAuthorEmailSchema = z.string().email();
|
|
27
|
+
const githubTokenEnvVarSchema = z.string().default('GITHUB_BOT_TOKEN');
|
|
28
|
+
const operatingModeSchema = z.enum(['prod', 'dev']);
|
|
29
|
+
const deployedAsSchema = z.enum(['static', 'server']).default('server');
|
|
30
|
+
const contentRootSchema = relativePathSchema.default('content');
|
|
31
|
+
const sourceRootSchema = z.string().min(1).optional();
|
|
33
32
|
// Lenient on shape (leading/trailing slashes, absolute-URL prefixes) -- `joinUrlPrefix`
|
|
34
33
|
// normalizes all of that at every use site. Only reject a value that is nothing but
|
|
35
34
|
// whitespace, since that can never be a meaningful deployment prefix and most likely
|
|
36
35
|
// indicates a copy-paste/templating mistake in the adopter's config.
|
|
37
|
-
|
|
36
|
+
const basePathSchema = z
|
|
38
37
|
.string()
|
|
39
38
|
.transform((value) => value.trim())
|
|
40
39
|
.refine((value) => value.length > 0, {
|
|
41
40
|
message: 'basePath must not be empty or only whitespace',
|
|
42
41
|
})
|
|
43
42
|
.optional();
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
const deploymentNameSchema = z.string().default('prod');
|
|
44
|
+
const devContentSyncSchema = z.enum(['off', 'warn']).default('warn');
|
|
46
45
|
// Dev-mode-only behavior. Ignored when mode !== 'dev'.
|
|
47
|
-
|
|
46
|
+
const devConfigSchema = z.object({
|
|
48
47
|
contentSync: devContentSyncSchema.optional(),
|
|
49
48
|
});
|
|
50
|
-
|
|
51
|
-
export const editorConfigSchema = z.object({
|
|
49
|
+
const editorConfigSchema = z.object({
|
|
52
50
|
title: z.string().optional(),
|
|
53
51
|
subtitle: z.string().optional(),
|
|
54
52
|
theme: z.unknown().optional(),
|
|
@@ -58,19 +56,18 @@ export const editorConfigSchema = z.object({
|
|
|
58
56
|
onLogoutClick: z.function().returns(z.void()).optional(),
|
|
59
57
|
// Optional: custom account component (e.g., Clerk's UserButton)
|
|
60
58
|
AccountComponent: z.custom().optional(),
|
|
59
|
+
// Optional: provider sign-in UI for signed-out users (see EditorSignInProps)
|
|
60
|
+
SignInComponent: z.custom().optional(),
|
|
61
61
|
});
|
|
62
|
-
// Main CanopyConfig schema.
|
|
63
62
|
export const CanopyConfigSchema = z
|
|
64
63
|
.object({
|
|
65
64
|
media: mediaSchema.optional(),
|
|
66
|
-
// No outer .optional()
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
// still resolves to 'deny' and an omitted level inside the object form stays undefined
|
|
73
|
-
// (resolved to 'deny' at read time by resolveDefaultPathAccess).
|
|
65
|
+
// No outer .optional(): both schemas already .default('deny'), so the field is optional on
|
|
66
|
+
// input but always resolves to 'allow'/'deny' (never undefined) on output — an outer
|
|
67
|
+
// .optional() would short-circuit before the inner default runs, defeating the fail-closed
|
|
68
|
+
// default (SCH-M1). defaultPathAccessSchema's .default('deny') sits on the OUTER union, not
|
|
69
|
+
// inside defaultPathAccessLevelsSchema, so an omitted level in the object form stays
|
|
70
|
+
// undefined (resolved to 'deny' at read time by resolveDefaultPathAccess).
|
|
74
71
|
defaultBranchAccess: defaultBranchAccessSchema,
|
|
75
72
|
defaultPathAccess: defaultPathAccessSchema,
|
|
76
73
|
// .optional() deliberately defeats defaultBaseBranchSchema's .default('main'):
|
|
@@ -93,16 +90,11 @@ export const CanopyConfigSchema = z
|
|
|
93
90
|
allowNetworkRemoteInProd: z.boolean().optional(),
|
|
94
91
|
settingsBranch: z.string().optional(),
|
|
95
92
|
autoCreateSettingsPR: z.boolean().optional(),
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
// "win" over modeDefault (masking dev's real default of 'local'), and the env
|
|
102
|
-
// var would just be racing config's baked-in 'prod' instead of a true absence.
|
|
103
|
-
// `.optional()` here is what keeps an omitted deploymentName reaching
|
|
104
|
-
// resolveDeploymentName as `undefined`, so it can fall through to modeDefault.
|
|
105
|
-
// Do not "fix" this by removing `.optional()`.
|
|
93
|
+
// `.optional()`, NOT bare `deploymentNameSchema`: its own `.default('prod')` would make
|
|
94
|
+
// `parse(undefined)` resolve to 'prod' instead of staying `undefined`, collapsing the
|
|
95
|
+
// env > config > modeDefault precedence chain `resolveDeploymentName`
|
|
96
|
+
// (operating-mode/deployment-name.ts) implements — config would always "win" over
|
|
97
|
+
// modeDefault, masking dev's real default of 'local'. Do not remove `.optional()`.
|
|
106
98
|
deploymentName: deploymentNameSchema.optional(),
|
|
107
99
|
contentRoot: contentRootSchema.default('content'),
|
|
108
100
|
sourceRoot: sourceRootSchema.optional(),
|
|
@@ -114,10 +106,6 @@ export const CanopyConfigSchema = z
|
|
|
114
106
|
dev: devConfigSchema.optional(),
|
|
115
107
|
})
|
|
116
108
|
.strict();
|
|
117
|
-
/**
|
|
118
|
-
* Helper to get schema default values.
|
|
119
|
-
* This centralizes default value extraction from Zod schemas.
|
|
120
|
-
*/
|
|
121
109
|
/**
|
|
122
110
|
* Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set).
|
|
123
111
|
*
|
|
@@ -132,16 +120,12 @@ export const DEFAULT_PROD_WORKSPACE = '/mnt/efs/workspace';
|
|
|
132
120
|
// Note: `mode` has no default by design (SEC-C1) and is intentionally omitted here —
|
|
133
121
|
// operatingModeSchema.parse(undefined) would throw.
|
|
134
122
|
//
|
|
135
|
-
// `deploymentName` is ALSO
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
// resolves it via resolveDeploymentName) — and this accessor has no mode to
|
|
142
|
-
// select between them. Emitting `deploymentNameSchema.parse(undefined)`
|
|
143
|
-
// ('prod') here would silently lie for dev mode; better to have no caller of
|
|
144
|
-
// this than a mode-blind one.
|
|
123
|
+
// `deploymentName` is ALSO omitted: no caller reads `.deploymentName` off this return value
|
|
124
|
+
// (only `services.ts` reads `.remoteName`), and its real default is mode-dependent — 'prod' for
|
|
125
|
+
// ProdStrategy, 'local' for DevStrategy (see resolveDeploymentName, used by
|
|
126
|
+
// operating-mode/client-unsafe-strategy.ts's getSettingsBranchName) — so this accessor has no
|
|
127
|
+
// mode to pick between them. Emitting `deploymentNameSchema.parse(undefined)` ('prod') here
|
|
128
|
+
// would silently lie for dev mode.
|
|
145
129
|
export const getConfigDefaults = () => ({
|
|
146
130
|
baseBranch: defaultBaseBranchSchema.parse(undefined),
|
|
147
131
|
remoteName: defaultRemoteNameSchema.parse(undefined),
|