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
|
@@ -1,54 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Single resolution point for `deploymentName
|
|
2
|
+
* Single resolution point for `deploymentName`, which namespaces the settings
|
|
3
|
+
* branch (`canopycms-settings-{deploymentName}`) so two CanopyCMS deployments
|
|
4
|
+
* can share one GitHub repo without fighting over the same orphan branch.
|
|
3
5
|
*
|
|
4
|
-
* `
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* and fighting over the same orphan branch.
|
|
6
|
+
* Precedence: `process.env.CANOPYCMS_DEPLOYMENT_NAME` (trimmed, empty ignored),
|
|
7
|
+
* then `config.deploymentName`, then `modeDefault` (the caller's mode-specific
|
|
8
|
+
* fallback, e.g. 'prod'/'local').
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* `CANOPYCMS_DEPLOYMENT_NAME`), so it is the value GUARANTEED TO DIFFER
|
|
17
|
-
* between two deployments sharing a repo. `config.deploymentName` lives in
|
|
18
|
-
* the shared repo's `canopycms.config.ts`, so it is the value GUARANTEED TO
|
|
19
|
-
* BE IDENTICAL across both deployments (both Lambdas run the same checked-out
|
|
20
|
-
* config). If config won instead, an adopter who already wrote
|
|
21
|
-
* `deploymentName` into their shared config would find the CDK
|
|
22
|
-
* `deploymentName` prop silently doing nothing — exactly the two-stacks-one-repo
|
|
23
|
-
* case this feature exists to fix.
|
|
10
|
+
* Env wins over config DELIBERATELY. Infrastructure stamps the env var
|
|
11
|
+
* per-stack (CDK's `CanopyCmsServiceProps.deploymentName`), so it is the value
|
|
12
|
+
* GUARANTEED TO DIFFER between two deployments sharing a repo, while
|
|
13
|
+
* `config.deploymentName` lives in the shared repo's `canopycms.config.ts` and
|
|
14
|
+
* is GUARANTEED TO BE IDENTICAL across both. If config won, an adopter who had
|
|
15
|
+
* already written `deploymentName` into their shared config would find the CDK
|
|
16
|
+
* prop silently doing nothing — the two-stacks-one-repo case this exists to fix.
|
|
24
17
|
*/
|
|
25
18
|
import { canopyLogWarn } from '../utils/logger.js';
|
|
26
19
|
let warned = false;
|
|
27
20
|
/**
|
|
28
21
|
* Conservative charset for a deployment name. The resolved value is
|
|
29
22
|
* interpolated straight into a git ref (`canopycms-settings-{name}`), and the
|
|
30
|
-
* env var route bypasses the config schema entirely — nothing else validates
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* The charset alone is not sufficient: `..`, a trailing `.`, and a `.lock`
|
|
38
|
-
* suffix are all built from allowed characters but are still rejected by
|
|
39
|
-
* git's own ref rules (git-check-ref-format), so they are excluded separately.
|
|
23
|
+
* env var route bypasses the config schema entirely — nothing else validates an
|
|
24
|
+
* infra-stamped value before it becomes a branch name. So the result must stay
|
|
25
|
+
* a single well-formed ref component: no `/` (would add a ref hierarchy level
|
|
26
|
+
* and break sanitizeBranchName round-trips), no whitespace, no `..`/`~`/`^`/`:`
|
|
27
|
+
* (git-forbidden), no leading `-` (would parse as a git option). `..`, a
|
|
28
|
+
* trailing `.` and a `.lock` suffix are built from allowed characters but are
|
|
29
|
+
* still rejected by git-check-ref-format, so they are excluded separately below.
|
|
40
30
|
*/
|
|
41
31
|
const VALID_DEPLOYMENT_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
42
32
|
/**
|
|
43
|
-
* Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy
|
|
44
|
-
*
|
|
45
|
-
* construct deliberately does not import this directly — see
|
|
46
|
-
* `isValidDeploymentName`
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* non-optional peerDependency there, and the package's own main entry already
|
|
50
|
-
* imports it at runtime). The drift check is therefore test-only — see
|
|
51
|
-
* `deployment-name-fixtures.ts`.
|
|
33
|
+
* Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy of
|
|
34
|
+
* this rule (constructs/cms-service.ts) still agrees with this one. The
|
|
35
|
+
* construct deliberately does not import this directly — see its own
|
|
36
|
+
* `isValidDeploymentName` doc comment. The drift check is therefore test-only,
|
|
37
|
+
* over `deployment-name-fixtures.ts`.
|
|
38
|
+
* @internal Exported for tests.
|
|
52
39
|
*/
|
|
53
40
|
export const isValidDeploymentName = (name) => VALID_DEPLOYMENT_NAME.test(name) &&
|
|
54
41
|
!name.includes('..') &&
|
|
@@ -58,14 +45,9 @@ export function resolveDeploymentName(config, modeDefault) {
|
|
|
58
45
|
const envValue = process.env.CANOPYCMS_DEPLOYMENT_NAME?.trim();
|
|
59
46
|
const configValue = config.deploymentName;
|
|
60
47
|
if (envValue && configValue && envValue !== configValue && !warned) {
|
|
61
|
-
// canopyLogWarn, not console.warn: cms-worker.ts
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
// The mismatch this reports is exactly what an operator would be grepping
|
|
65
|
-
// for. Plain console under Lambda/dev, as everywhere else. See
|
|
66
|
-
// utils/logger.ts. (Missed by the worker-log sweep, which went by directory
|
|
67
|
-
// name and by the modules the finding named, rather than by the worker's
|
|
68
|
-
// real import graph.)
|
|
48
|
+
// canopyLogWarn, not console.warn: cms-worker.ts resolves through this
|
|
49
|
+
// inside start(), so the line lands in worker.log, where an unprefixed line
|
|
50
|
+
// is folded into the previous CloudWatch event (utils/logger.ts).
|
|
69
51
|
canopyLogWarn(`CanopyCMS: CANOPYCMS_DEPLOYMENT_NAME ("${envValue}") differs from config.deploymentName ` +
|
|
70
52
|
`("${configValue}") — using the env var (infra-stamped env wins over shared-repo config ` +
|
|
71
53
|
`by design; see resolveDeploymentName's doc comment). Update config.deploymentName to ` +
|
|
@@ -1,32 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Operating
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 1. Client-safe strategies - safe for 'use client' React components (no Node.js imports)
|
|
6
|
-
* 2. Client-unsafe strategies - full server-side functionality (uses fs, path, process)
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
*
|
|
10
|
-
* Client components:
|
|
11
|
-
* import { clientOperatingStrategy } from '@/operating-mode'
|
|
12
|
-
* const strategy = clientOperatingStrategy(mode)
|
|
13
|
-
* if (strategy.supportsBranching()) { ... }
|
|
14
|
-
*
|
|
15
|
-
* Server code:
|
|
16
|
-
* import { operatingStrategy } from '@/operating-mode'
|
|
17
|
-
* const strategy = operatingStrategy(mode)
|
|
18
|
-
* // contentRoot is REQUIRED: pass config.contentRoot (falling back to 'content'
|
|
19
|
-
* // at the call site), never a bare call — see getContentRoot's doc comment in
|
|
20
|
-
* // types.ts for why a default here would silently disarm a caller.
|
|
21
|
-
* const contentRoot = strategy.getContentRoot(config.contentRoot ?? 'content')
|
|
22
|
-
* const branchesRoot = strategy.getContentBranchesRoot()
|
|
23
|
-
* const branchRoot = strategy.getContentBranchRoot('my-branch')
|
|
24
|
-
* const settingsRoot = strategy.getSettingsRoot()
|
|
25
|
-
* if (strategy.supportsBranching()) { ... } // can also use client-safe methods
|
|
2
|
+
* Operating mode strategies, in two layers: client-safe ones carry no Node.js
|
|
3
|
+
* imports and are usable from 'use client' components; client-unsafe ones add
|
|
4
|
+
* the server-side surface (fs, path, process) and must stay off the client.
|
|
26
5
|
*/
|
|
27
6
|
export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy.js';
|
|
28
7
|
export { operatingStrategy, clearStrategyCache } from './client-unsafe-strategy.js';
|
|
29
8
|
export { resolveDeploymentName, isValidDeploymentName } from './deployment-name.js';
|
|
30
|
-
export { resolveOperatingMode
|
|
9
|
+
export { resolveOperatingMode } from './mode-env.js';
|
|
31
10
|
export type OperatingMode = 'prod' | 'dev';
|
|
32
11
|
export type { ClientSafeStrategy, ClientUnsafeStrategy, ResolveRemoteUrlOptions } from './types.js';
|
|
@@ -1,36 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Operating
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 1. Client-safe strategies - safe for 'use client' React components (no Node.js imports)
|
|
6
|
-
* 2. Client-unsafe strategies - full server-side functionality (uses fs, path, process)
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
*
|
|
10
|
-
* Client components:
|
|
11
|
-
* import { clientOperatingStrategy } from '@/operating-mode'
|
|
12
|
-
* const strategy = clientOperatingStrategy(mode)
|
|
13
|
-
* if (strategy.supportsBranching()) { ... }
|
|
14
|
-
*
|
|
15
|
-
* Server code:
|
|
16
|
-
* import { operatingStrategy } from '@/operating-mode'
|
|
17
|
-
* const strategy = operatingStrategy(mode)
|
|
18
|
-
* // contentRoot is REQUIRED: pass config.contentRoot (falling back to 'content'
|
|
19
|
-
* // at the call site), never a bare call — see getContentRoot's doc comment in
|
|
20
|
-
* // types.ts for why a default here would silently disarm a caller.
|
|
21
|
-
* const contentRoot = strategy.getContentRoot(config.contentRoot ?? 'content')
|
|
22
|
-
* const branchesRoot = strategy.getContentBranchesRoot()
|
|
23
|
-
* const branchRoot = strategy.getContentBranchRoot('my-branch')
|
|
24
|
-
* const settingsRoot = strategy.getSettingsRoot()
|
|
25
|
-
* if (strategy.supportsBranching()) { ... } // can also use client-safe methods
|
|
2
|
+
* Operating mode strategies, in two layers: client-safe ones carry no Node.js
|
|
3
|
+
* imports and are usable from 'use client' components; client-unsafe ones add
|
|
4
|
+
* the server-side surface (fs, path, process) and must stay off the client.
|
|
26
5
|
*/
|
|
27
|
-
// Client-safe factory and strategy (safe for client bundles)
|
|
28
6
|
export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy.js';
|
|
29
|
-
//
|
|
7
|
+
// Server-side only.
|
|
30
8
|
export { operatingStrategy, clearStrategyCache } from './client-unsafe-strategy.js';
|
|
31
|
-
// Single resolution point for deploymentName
|
|
32
|
-
//
|
|
9
|
+
// Single resolution point for deploymentName — server-only (reads process.env),
|
|
10
|
+
// used by the strategies' getSettingsBranchName.
|
|
33
11
|
export { resolveDeploymentName, isValidDeploymentName } from './deployment-name.js';
|
|
34
|
-
// Single resolution point for `mode`
|
|
35
|
-
//
|
|
36
|
-
export { resolveOperatingMode
|
|
12
|
+
// Single resolution point for `mode` — isomorphic, applied inside
|
|
13
|
+
// validateCanopyConfig so every config-authoring path gets it.
|
|
14
|
+
export { resolveOperatingMode } from './mode-env.js';
|
|
@@ -1,62 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Single resolution point for the operating `mode
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `next build`
|
|
7
|
-
* three
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* Precedence (highest wins):
|
|
29
|
-
* 1. the environment value for the current runtime (see `readModeEnv`)
|
|
30
|
-
* 2. `config.mode` (the literal in `canopycms.config.ts`)
|
|
31
|
-
*
|
|
32
|
-
* ## Two variable names, on purpose
|
|
33
|
-
*
|
|
34
|
-
* Server code reads `CANOPY_MODE`, which the CDK construct stamps onto the
|
|
35
|
-
* Lambda (`CanopyCmsService` sets `CANOPY_MODE=prod`). It is deliberately NOT
|
|
36
|
-
* set during `next build` (see above).
|
|
37
|
-
*
|
|
38
|
-
* Browser code cannot read a runtime environment at all — the editor page
|
|
39
|
-
* imports `canopycms.config.ts` directly (`config.client()`), so the browser's
|
|
40
|
-
* copy of `mode` is whatever was inlined when the bundle was built. Next.js
|
|
41
|
-
* only inlines `NEXT_PUBLIC_*`, so the browser reads
|
|
42
|
-
* `NEXT_PUBLIC_CANOPY_MODE`, which the generated CDK stack passes as a Docker
|
|
43
|
-
* build arg. Both names must be spelled as literal `process.env.X` member
|
|
44
|
-
* expressions here or the bundler cannot substitute them.
|
|
45
|
-
*
|
|
46
|
-
* An unrecognized value throws rather than falling back. Falling back would
|
|
2
|
+
* Single resolution point for the operating `mode`: the environment value for
|
|
3
|
+
* the current runtime wins (see `readModeEnv`), else `config.mode`.
|
|
4
|
+
*
|
|
5
|
+
* One `canopycms.config.ts` (where `mode` is required, SEC-C1) is loaded by
|
|
6
|
+
* `next dev`, by `next build` in the image builder and by the deployed Lambda,
|
|
7
|
+
* and those three need different answers, so only a RUN-time value works:
|
|
8
|
+
* - `next dev` and `next build` are both `dev`. Build-time reads come from
|
|
9
|
+
* the working tree in either mode (`readsFromCheckout` in build-mode.ts),
|
|
10
|
+
* while prod would hold the image builder to checks it has no reason to
|
|
11
|
+
* meet: `gitBotAuthorName`/`gitBotAuthorEmail` (the prod strategy's
|
|
12
|
+
* `validateConfig`) and a credential-verifying auth plugin
|
|
13
|
+
* (`assertAuthPluginAllowedForMode`). See Dockerfile.cms.template.
|
|
14
|
+
* - The Lambda is `prod`: dev resolves the workspace to `<cwd>/.canopy-dev`,
|
|
15
|
+
* and Lambda's filesystem is read-only outside /tmp, so the first write
|
|
16
|
+
* fails with EROFS.
|
|
17
|
+
*
|
|
18
|
+
* Two variable names, on purpose. Server code reads `CANOPY_MODE`, stamped on
|
|
19
|
+
* the Lambda by `CanopyCmsService` and deliberately NOT set during
|
|
20
|
+
* `next build`. Browser code has no runtime environment — the editor page
|
|
21
|
+
* imports the config directly (`config.client()`), so its `mode` is whatever
|
|
22
|
+
* was inlined at build time, and Next inlines only `NEXT_PUBLIC_*`. Both names
|
|
23
|
+
* MUST appear as literal `process.env.X` member expressions here or the
|
|
24
|
+
* bundler cannot substitute them.
|
|
25
|
+
*
|
|
26
|
+
* An unrecognized value throws rather than falling back: falling back would
|
|
47
27
|
* turn a typo (`CANOPY_MODE=production`) into a silent dev-mode deployment
|
|
48
|
-
* running header-trusting dev auth semantics
|
|
49
|
-
* `mode` required to prevent.
|
|
28
|
+
* running header-trusting dev auth semantics.
|
|
50
29
|
*/
|
|
51
30
|
import type { OperatingMode } from './types.js';
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Reset the once-per-process warning latch. Test-only.
|
|
33
|
+
* @internal Exported for tests.
|
|
34
|
+
*/
|
|
55
35
|
export declare function resetModeWarning(): void;
|
|
56
36
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* config-authoring path (`defineCanopyConfig`, `composeCanopyConfig`) funnels
|
|
60
|
-
* through.
|
|
37
|
+
* Called from `validateCanopyConfig`, the one point every config-authoring path
|
|
38
|
+
* (`defineCanopyConfig`, `composeCanopyConfig`) funnels through.
|
|
61
39
|
*/
|
|
62
40
|
export declare function resolveOperatingMode(configMode: OperatingMode): OperatingMode;
|
|
@@ -1,67 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Single resolution point for the operating `mode
|
|
2
|
+
* Single resolution point for the operating `mode`: the environment value for
|
|
3
|
+
* the current runtime wins (see `readModeEnv`), else `config.mode`.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* One `canopycms.config.ts` (where `mode` is required, SEC-C1) is loaded by
|
|
6
|
+
* `next dev`, by `next build` in the image builder and by the deployed Lambda,
|
|
7
|
+
* and those three need different answers, so only a RUN-time value works:
|
|
8
|
+
* - `next dev` and `next build` are both `dev`. Build-time reads come from
|
|
9
|
+
* the working tree in either mode (`readsFromCheckout` in build-mode.ts),
|
|
10
|
+
* while prod would hold the image builder to checks it has no reason to
|
|
11
|
+
* meet: `gitBotAuthorName`/`gitBotAuthorEmail` (the prod strategy's
|
|
12
|
+
* `validateConfig`) and a credential-verifying auth plugin
|
|
13
|
+
* (`assertAuthPluginAllowedForMode`). See Dockerfile.cms.template.
|
|
14
|
+
* - The Lambda is `prod`: dev resolves the workspace to `<cwd>/.canopy-dev`,
|
|
15
|
+
* and Lambda's filesystem is read-only outside /tmp, so the first write
|
|
16
|
+
* fails with EROFS.
|
|
9
17
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* (`assertAuthPluginAllowedForMode`). See the note in
|
|
18
|
-
* `cli/template-files/Dockerfile.cms.template`.
|
|
19
|
-
* - The deployed Lambda must be `prod`: dev mode resolves the workspace to
|
|
20
|
-
* `<cwd>/.canopy-dev`, and Lambda's filesystem is read-only outside /tmp,
|
|
21
|
-
* so the first write fails with EROFS.
|
|
18
|
+
* Two variable names, on purpose. Server code reads `CANOPY_MODE`, stamped on
|
|
19
|
+
* the Lambda by `CanopyCmsService` and deliberately NOT set during
|
|
20
|
+
* `next build`. Browser code has no runtime environment — the editor page
|
|
21
|
+
* imports the config directly (`config.client()`), so its `mode` is whatever
|
|
22
|
+
* was inlined at build time, and Next inlines only `NEXT_PUBLIC_*`. Both names
|
|
23
|
+
* MUST appear as literal `process.env.X` member expressions here or the
|
|
24
|
+
* bundler cannot substitute them.
|
|
22
25
|
*
|
|
23
|
-
*
|
|
24
|
-
* is an environment override rather than a flag baked into the generated
|
|
25
|
-
* config file. `CANOPY_MODE` is the name the deployment templates already
|
|
26
|
-
* referred to; before this module existed nothing read it.
|
|
27
|
-
*
|
|
28
|
-
* Precedence (highest wins):
|
|
29
|
-
* 1. the environment value for the current runtime (see `readModeEnv`)
|
|
30
|
-
* 2. `config.mode` (the literal in `canopycms.config.ts`)
|
|
31
|
-
*
|
|
32
|
-
* ## Two variable names, on purpose
|
|
33
|
-
*
|
|
34
|
-
* Server code reads `CANOPY_MODE`, which the CDK construct stamps onto the
|
|
35
|
-
* Lambda (`CanopyCmsService` sets `CANOPY_MODE=prod`). It is deliberately NOT
|
|
36
|
-
* set during `next build` (see above).
|
|
37
|
-
*
|
|
38
|
-
* Browser code cannot read a runtime environment at all — the editor page
|
|
39
|
-
* imports `canopycms.config.ts` directly (`config.client()`), so the browser's
|
|
40
|
-
* copy of `mode` is whatever was inlined when the bundle was built. Next.js
|
|
41
|
-
* only inlines `NEXT_PUBLIC_*`, so the browser reads
|
|
42
|
-
* `NEXT_PUBLIC_CANOPY_MODE`, which the generated CDK stack passes as a Docker
|
|
43
|
-
* build arg. Both names must be spelled as literal `process.env.X` member
|
|
44
|
-
* expressions here or the bundler cannot substitute them.
|
|
45
|
-
*
|
|
46
|
-
* An unrecognized value throws rather than falling back. Falling back would
|
|
26
|
+
* An unrecognized value throws rather than falling back: falling back would
|
|
47
27
|
* turn a typo (`CANOPY_MODE=production`) into a silent dev-mode deployment
|
|
48
|
-
* running header-trusting dev auth semantics
|
|
49
|
-
* `mode` required to prevent.
|
|
28
|
+
* running header-trusting dev auth semantics.
|
|
50
29
|
*/
|
|
51
30
|
import { canopyLogWarn } from '../utils/logger.js';
|
|
52
|
-
|
|
53
|
-
|
|
31
|
+
const SERVER_MODE_ENV_VAR = 'CANOPY_MODE';
|
|
32
|
+
const BROWSER_MODE_ENV_VAR = 'NEXT_PUBLIC_CANOPY_MODE';
|
|
54
33
|
let warned = false;
|
|
55
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Reset the once-per-process warning latch. Test-only.
|
|
36
|
+
* @internal Exported for tests.
|
|
37
|
+
*/
|
|
56
38
|
export function resetModeWarning() {
|
|
57
39
|
warned = false;
|
|
58
40
|
}
|
|
59
41
|
/**
|
|
60
|
-
* The environment value for the current runtime, or undefined when unset.
|
|
61
|
-
*
|
|
62
42
|
* Guarded with `typeof process` because a non-Next bundler may leave no
|
|
63
|
-
* `process` shim in the browser
|
|
64
|
-
*
|
|
43
|
+
* `process` shim in the browser; the member expressions stay literal so Next's
|
|
44
|
+
* DefinePlugin substitution still applies.
|
|
65
45
|
*/
|
|
66
46
|
function readModeEnv() {
|
|
67
47
|
if (typeof process === 'undefined' || typeof process.env === 'undefined')
|
|
@@ -73,10 +53,8 @@ function readModeEnv() {
|
|
|
73
53
|
return value ? { name, value } : undefined;
|
|
74
54
|
}
|
|
75
55
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* config-authoring path (`defineCanopyConfig`, `composeCanopyConfig`) funnels
|
|
79
|
-
* through.
|
|
56
|
+
* Called from `validateCanopyConfig`, the one point every config-authoring path
|
|
57
|
+
* (`defineCanopyConfig`, `composeCanopyConfig`) funnels through.
|
|
80
58
|
*/
|
|
81
59
|
export function resolveOperatingMode(configMode) {
|
|
82
60
|
const env = readModeEnv();
|
|
@@ -88,9 +66,9 @@ export function resolveOperatingMode(configMode) {
|
|
|
88
66
|
`(${JSON.stringify(configMode)}): a typo here would silently deploy dev auth semantics.`);
|
|
89
67
|
}
|
|
90
68
|
if (env.value !== configMode && !warned) {
|
|
91
|
-
// canopyLogWarn, not console.warn: shared modules can run inside the
|
|
92
|
-
//
|
|
93
|
-
//
|
|
69
|
+
// canopyLogWarn, not console.warn: shared modules can run inside the worker
|
|
70
|
+
// daemon, where an unprefixed line is folded into the previous CloudWatch
|
|
71
|
+
// event (utils/logger.ts).
|
|
94
72
|
canopyLogWarn(`CanopyCMS: ${env.name}="${env.value}" overrides config.mode="${configMode}". ` +
|
|
95
73
|
`The environment wins by design — it is the per-deployment value, while ` +
|
|
96
74
|
`canopycms.config.ts is shared by local dev, the image build and the deployment. ` +
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Operating Mode Strategy Types
|
|
3
|
-
*
|
|
4
|
-
* This module defines the two-layer strategy pattern for operating modes:
|
|
5
|
-
* - ClientSafeStrategy: Methods safe for client-side bundles (no Node.js APIs)
|
|
6
|
-
* - ClientUnsafeStrategy: Full strategy with Node.js APIs (server-side only)
|
|
7
|
-
*/
|
|
1
|
+
/** Operating-mode strategy types. */
|
|
8
2
|
import type { OperatingMode as OM } from './index.js';
|
|
9
3
|
import type { CanopyConfig } from '../config/index.js';
|
|
10
4
|
export type OperatingMode = OM;
|
|
11
|
-
/**
|
|
12
|
-
* Options for resolving git remote URL
|
|
13
|
-
*/
|
|
5
|
+
/** @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md. */
|
|
14
6
|
export interface ResolveRemoteUrlOptions {
|
|
15
7
|
mode: OperatingMode;
|
|
16
8
|
remoteUrl?: string;
|
|
@@ -18,41 +10,29 @@ export interface ResolveRemoteUrlOptions {
|
|
|
18
10
|
baseBranch?: string;
|
|
19
11
|
sourceRoot?: string;
|
|
20
12
|
}
|
|
21
|
-
/**
|
|
22
|
-
* Configuration for remote URL resolution
|
|
23
|
-
* Strategies return this data; GitManager executes the logic
|
|
24
|
-
*/
|
|
13
|
+
/** Strategies return this data; GitManager executes the logic. */
|
|
25
14
|
export interface RemoteUrlConfig {
|
|
26
|
-
/** Whether to auto-initialize a local remote */
|
|
27
15
|
shouldAutoInitLocal: boolean;
|
|
28
16
|
/** Default path for local remote (e.g., '.canopycms/remote.git') */
|
|
29
17
|
defaultRemotePath: string;
|
|
30
|
-
/** Environment variable name for remote URL */
|
|
31
18
|
envVarName: string;
|
|
32
19
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* Unlike shouldAutoInitLocal, this does NOT create the remote — just detects it.
|
|
20
|
+
* If this absolute path exists on disk it becomes the remote URL (file://).
|
|
21
|
+
* Set in prod, where the EC2 worker creates remote.git on EFS. Unlike
|
|
22
|
+
* shouldAutoInitLocal, this only DETECTS a remote; it never creates one.
|
|
37
23
|
*/
|
|
38
24
|
autoDetectRemotePath?: string;
|
|
39
25
|
}
|
|
40
26
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* Methods that can be safely imported in 'use client' React components.
|
|
44
|
-
* NO Node.js APIs (fs, path, process, etc.) - only pure logic and simple data.
|
|
27
|
+
* Methods safe to import in 'use client' React components: pure logic and
|
|
28
|
+
* simple data, NO Node.js APIs (fs, path, process).
|
|
45
29
|
*/
|
|
46
30
|
export interface ClientSafeStrategy {
|
|
47
|
-
/** The operating mode this strategy represents */
|
|
48
31
|
readonly mode: OperatingMode;
|
|
49
32
|
/** Whether this mode supports multiple branch workspaces */
|
|
50
33
|
supportsBranching(): boolean;
|
|
51
|
-
/** Whether to show status badge in UI */
|
|
52
34
|
supportsStatusBadge(): boolean;
|
|
53
|
-
/** Whether comments/collaboration features are enabled */
|
|
54
35
|
supportsComments(): boolean;
|
|
55
|
-
/** Whether pull request features are available */
|
|
56
36
|
supportsPullRequests(): boolean;
|
|
57
37
|
/** Get the permissions file name (e.g., 'permissions.json' or 'permissions.local.json') */
|
|
58
38
|
getPermissionsFileName(): string;
|
|
@@ -63,80 +43,52 @@ export interface ClientSafeStrategy {
|
|
|
63
43
|
/** Whether git pushes should be made in this mode */
|
|
64
44
|
shouldPush(): boolean;
|
|
65
45
|
}
|
|
66
|
-
/**
|
|
67
|
-
* Client-Unsafe Strategy
|
|
68
|
-
*
|
|
69
|
-
* Full strategy including Node.js APIs. Can only be imported server-side.
|
|
70
|
-
* Extends ClientSafeStrategy, so all client-safe methods are available.
|
|
71
|
-
*/
|
|
46
|
+
/** The full strategy, including Node.js APIs. Server-side imports only. */
|
|
72
47
|
export interface ClientUnsafeStrategy extends ClientSafeStrategy {
|
|
73
48
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* - dev: {sourceRoot ?? cwd}/.canopy-dev
|
|
49
|
+
* The mode's workspace root; content-branches, settings and .cache all live
|
|
50
|
+
* under it. prod: CANOPYCMS_WORKSPACE_ROOT ?? /mnt/efs/workspace.
|
|
51
|
+
* dev: {sourceRoot ?? cwd}/.canopy-dev.
|
|
78
52
|
*/
|
|
79
53
|
getWorkspaceRoot(sourceRoot?: string): string;
|
|
80
54
|
/**
|
|
81
|
-
*
|
|
82
|
-
* - dev: {sourceRoot ?? cwd}/{contentRoot}
|
|
83
|
-
* - prod (in workspaces): {sourceRoot ?? cwd}/{contentRoot}
|
|
55
|
+
* The content directory, `{sourceRoot ?? cwd}/{contentRoot}` in both modes.
|
|
84
56
|
*
|
|
85
57
|
* `contentRoot` is REQUIRED and must be the caller's already-resolved
|
|
86
58
|
* `config.contentRoot` (falling back to 'content' at the call site, not here).
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* and permanently no-op'd — with no error, since a missing directory looks
|
|
92
|
-
* like "nothing to watch yet"). Making the parameter required means a future
|
|
93
|
-
* caller cannot silently reintroduce that bug by omitting it.
|
|
59
|
+
* Defaulting it here would silently disarm any caller configured with a
|
|
60
|
+
* non-default contentRoot: it would resolve a directory that never exists,
|
|
61
|
+
* and a missing content directory reads as "nothing to do" rather than as an
|
|
62
|
+
* error. Requiring the parameter makes that mistake impossible.
|
|
94
63
|
*/
|
|
95
64
|
getContentRoot(contentRoot: string, sourceRoot?: string): string;
|
|
96
65
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* - prod: $CANOPYCMS_WORKSPACE_ROOT/content-branches or /mnt/efs/workspace/content-branches
|
|
66
|
+
* `{workspaceRoot}/content-branches`: the parent of every content branch
|
|
67
|
+
* workspace, and the home of branches.json.
|
|
100
68
|
*/
|
|
101
69
|
getContentBranchesRoot(sourceRoot?: string): string;
|
|
102
|
-
/**
|
|
103
|
-
* Get individual content branch workspace directory.
|
|
104
|
-
* Returns: {contentBranchesRoot}/{branchName}
|
|
105
|
-
*/
|
|
70
|
+
/** `{contentBranchesRoot}/{branchName}`. */
|
|
106
71
|
getContentBranchRoot(branchName: string, sourceRoot?: string): string;
|
|
107
72
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
73
|
+
* Runtime-metadata pattern (e.g. '.canopy-meta/') that GitManager adds to
|
|
74
|
+
* .git/info/exclude in every content branch workspace.
|
|
110
75
|
*/
|
|
111
76
|
getGitExcludePattern(): string;
|
|
112
|
-
/** Get the full path to the permissions file */
|
|
113
77
|
getPermissionsFilePath(root: string): string;
|
|
114
|
-
/** Get the full path to the groups file */
|
|
115
78
|
getGroupsFilePath(root: string): string;
|
|
116
|
-
/** Get configuration for remote URL resolution (GitManager executes the logic) */
|
|
117
79
|
getRemoteUrlConfig(): RemoteUrlConfig;
|
|
118
80
|
/** Whether this mode requires an existing git repository */
|
|
119
81
|
requiresExistingRepo(): boolean;
|
|
120
|
-
/**
|
|
121
|
-
* Get the branch name to use for settings (permissions/groups).
|
|
122
|
-
* Returns: canopycms-settings-{deploymentName}
|
|
123
|
-
*/
|
|
82
|
+
/** The permissions/groups branch: `canopycms-settings-{deploymentName}`. */
|
|
124
83
|
getSettingsBranchName(config: {
|
|
125
84
|
settingsBranch?: string;
|
|
126
85
|
deploymentName?: string;
|
|
127
86
|
defaultBaseBranch?: string;
|
|
128
87
|
}): string;
|
|
129
|
-
/**
|
|
130
|
-
* Get the root directory for settings storage.
|
|
131
|
-
* - prod: $CANOPYCMS_WORKSPACE_ROOT/settings or /mnt/efs/workspace/settings
|
|
132
|
-
* - dev: {cwd}/.canopy-dev/settings
|
|
133
|
-
*/
|
|
88
|
+
/** `{workspaceRoot}/settings`, where settings storage lives. */
|
|
134
89
|
getSettingsRoot(sourceRoot?: string): string;
|
|
135
|
-
/** Whether settings should be stored in a separate branch */
|
|
136
90
|
usesSeparateSettingsBranch(): boolean;
|
|
137
|
-
/** Validate configuration for this mode */
|
|
138
91
|
validateConfig(config: Partial<CanopyConfig>): void;
|
|
139
|
-
/** Whether PRs should be auto-created for permissions/groups changes */
|
|
140
92
|
shouldCreateSettingsPR(config: {
|
|
141
93
|
autoCreateSettingsPR?: boolean;
|
|
142
94
|
}): boolean;
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Operating Mode Strategy Types
|
|
3
|
-
*
|
|
4
|
-
* This module defines the two-layer strategy pattern for operating modes:
|
|
5
|
-
* - ClientSafeStrategy: Methods safe for client-side bundles (no Node.js APIs)
|
|
6
|
-
* - ClientUnsafeStrategy: Full strategy with Node.js APIs (server-side only)
|
|
7
|
-
*/
|
|
1
|
+
/** Operating-mode strategy types. */
|
|
8
2
|
export {};
|