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/http/types.d.ts
CHANGED
|
@@ -1,53 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Framework-agnostic HTTP request interface.
|
|
3
|
-
* Minimal surface area - only what CanopyCMS actually needs.
|
|
4
|
-
*/
|
|
1
|
+
/** Framework-agnostic HTTP request: only what CanopyCMS actually needs. */
|
|
5
2
|
export interface CanopyRequest {
|
|
6
|
-
/** HTTP method (GET, POST, PUT, DELETE, etc.) */
|
|
7
3
|
readonly method: string;
|
|
8
|
-
/** Full request URL as string */
|
|
9
4
|
readonly url: string;
|
|
10
|
-
/**
|
|
11
|
-
* Get request header value (case-insensitive).
|
|
12
|
-
* Returns null if header not present.
|
|
13
|
-
*/
|
|
5
|
+
/** Case-insensitive; null when the header is absent. */
|
|
14
6
|
header(name: string): string | null;
|
|
15
|
-
/**
|
|
16
|
-
* Parse request body as JSON.
|
|
17
|
-
* Returns undefined for GET requests or empty bodies.
|
|
18
|
-
*/
|
|
7
|
+
/** Undefined for GET requests and empty bodies. */
|
|
19
8
|
json(): Promise<unknown>;
|
|
20
9
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* (e.g. proxied binary/multipart uploads). Bare CanopyRequest mocks/test
|
|
24
|
-
* harnesses that omit this keep compiling.
|
|
10
|
+
* The raw body bytes, bypassing JSON parsing. Optional, so that adapters
|
|
11
|
+
* without non-JSON bodies (and bare test mocks) still compile.
|
|
25
12
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* same request.
|
|
13
|
+
* As with the platform Request, the body stream is consumed ONCE: a caller
|
|
14
|
+
* using this must not also call `json()` or `formData()`.
|
|
29
15
|
*/
|
|
30
16
|
rawBody?(): Promise<Uint8Array>;
|
|
31
|
-
/**
|
|
32
|
-
* Parse the request body as multipart/form-data.
|
|
33
|
-
* Optional for the same reason as `rawBody` above.
|
|
34
|
-
*/
|
|
17
|
+
/** Optional, and single-use, for the same reasons as `rawBody`. */
|
|
35
18
|
formData?(): Promise<FormData>;
|
|
36
19
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Framework-agnostic HTTP response.
|
|
39
|
-
* Represents the response data to be sent back.
|
|
40
|
-
*/
|
|
20
|
+
/** Framework-agnostic HTTP response. */
|
|
41
21
|
export interface CanopyResponse<T = unknown> {
|
|
42
22
|
readonly status: number;
|
|
43
23
|
readonly body: T;
|
|
44
24
|
readonly headers?: Record<string, string>;
|
|
45
25
|
}
|
|
46
26
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* (or a stream of them), not a JSON-serializable value.
|
|
27
|
+
* A binary response (image/PDF bytes). The `kind` discriminant lets adapters
|
|
28
|
+
* dispatch without a cast: `body` here is arbitrary bytes or a stream of them,
|
|
29
|
+
* not a JSON-serializable value.
|
|
51
30
|
*/
|
|
52
31
|
export interface CanopyBinaryResponse {
|
|
53
32
|
readonly kind: 'binary';
|
|
@@ -60,14 +39,10 @@ export interface CanopyBinaryResponse {
|
|
|
60
39
|
etag?: string;
|
|
61
40
|
};
|
|
62
41
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Create a JSON response with the given body and status code.
|
|
65
|
-
*/
|
|
66
42
|
export declare function jsonResponse<T>(body: T, status?: number, headers?: Record<string, string>): CanopyResponse<T>;
|
|
67
43
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* pass a route result through untouched or wrap it via `jsonResponse`.
|
|
44
|
+
* Distinguishes `CanopyBinaryResponse` from any other route result (neither
|
|
45
|
+
* `ApiResponse` nor `CanopyResponse` declares `kind`), which is how adapters
|
|
46
|
+
* and the core handler decide to pass a result through or wrap it in JSON.
|
|
72
47
|
*/
|
|
73
48
|
export declare function isCanopyBinaryResponse(value: unknown): value is CanopyBinaryResponse;
|
package/dist/http/types.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create a JSON response with the given body and status code.
|
|
3
|
-
*/
|
|
4
1
|
export function jsonResponse(body, status = 200, headers) {
|
|
5
2
|
return { status, body, headers };
|
|
6
3
|
}
|
|
7
4
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* pass a route result through untouched or wrap it via `jsonResponse`.
|
|
5
|
+
* Distinguishes `CanopyBinaryResponse` from any other route result (neither
|
|
6
|
+
* `ApiResponse` nor `CanopyResponse` declares `kind`), which is how adapters
|
|
7
|
+
* and the core handler decide to pass a result through or wrap it in JSON.
|
|
12
8
|
*/
|
|
13
9
|
export function isCanopyBinaryResponse(value) {
|
|
14
10
|
return (typeof value === 'object' && value !== null && value.kind === 'binary');
|
package/dist/id.d.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
import type { ContentId } from './paths/types.js';
|
|
2
2
|
import { isValidContentId } from './paths/validation.js';
|
|
3
3
|
/**
|
|
4
|
-
* Generate a
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Collision probability with 12 chars:
|
|
8
|
-
* - ~58^12 = 2.6 × 10^21 possible IDs
|
|
9
|
-
* - With 10,000 entries: collision chance ~0.000000002%
|
|
4
|
+
* Generate a 12-character content ID: a Base58-encoded UUID truncated for
|
|
5
|
+
* shorter filenames. ~58^12 = 2.6 × 10^21 IDs, so 10,000 entries carry a
|
|
6
|
+
* ~0.000000002% collision chance.
|
|
10
7
|
*/
|
|
11
8
|
export declare function generateId(): ContentId;
|
|
12
|
-
/**
|
|
13
|
-
* Validate that a string is a valid content ID format.
|
|
14
|
-
* Standard format: 12 characters using Base58 alphabet (no ambiguous characters: 0, O, I, l).
|
|
15
|
-
*/
|
|
9
|
+
/** Is a string a valid content ID? 12 Base58 characters (no ambiguous 0, O, I, l). */
|
|
16
10
|
export declare const isValidId: typeof isValidContentId;
|
package/dist/id.js
CHANGED
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import { generate } from 'short-uuid';
|
|
2
2
|
import { isValidContentId } from './paths/validation.js';
|
|
3
3
|
/**
|
|
4
|
-
* Generate a
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Collision probability with 12 chars:
|
|
8
|
-
* - ~58^12 = 2.6 × 10^21 possible IDs
|
|
9
|
-
* - With 10,000 entries: collision chance ~0.000000002%
|
|
4
|
+
* Generate a 12-character content ID: a Base58-encoded UUID truncated for
|
|
5
|
+
* shorter filenames. ~58^12 = 2.6 × 10^21 IDs, so 10,000 entries carry a
|
|
6
|
+
* ~0.000000002% collision chance.
|
|
10
7
|
*/
|
|
11
8
|
export function generateId() {
|
|
12
9
|
const full = generate(); // 22 chars
|
|
13
10
|
return full.substring(0, 12); // Truncate to 12 chars
|
|
14
11
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Validate that a string is a valid content ID format.
|
|
17
|
-
* Standard format: 12 characters using Base58 alphabet (no ambiguous characters: 0, O, I, l).
|
|
18
|
-
*/
|
|
12
|
+
/** Is a string a valid content ID? 12 Base58 characters (no ambiguous 0, O, I, l). */
|
|
19
13
|
export const isValidId = isValidContentId;
|
package/dist/index.js
CHANGED
|
@@ -3,18 +3,15 @@ export * from './config/index.js';
|
|
|
3
3
|
export * from './entry-schema.js';
|
|
4
4
|
export * from './types.js';
|
|
5
5
|
export * from './user.js';
|
|
6
|
-
// Title-derivation fallback chain (schema isTitle field -> data.title/name ->
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// 'canopycms/server' so client-side list/preview UI can compute the same
|
|
11
|
-
// display title as build scripts without a second implementation.
|
|
6
|
+
// Title-derivation fallback chain (schema isTitle field -> data.title/name -> entry-type label ->
|
|
7
|
+
// humanized slug -> "Untitled"). Client-safe: its only imports are types, erased at compile time.
|
|
8
|
+
// Exported from 'canopycms/server' too, so client list/preview UI and build scripts derive the
|
|
9
|
+
// same display title from one implementation.
|
|
12
10
|
export { resolveEntryTitle } from './utils/title-field.js';
|
|
13
11
|
// AI content config helper — client-safe (no node: imports).
|
|
14
12
|
// Server-only AI features (handler, generator) are in 'canopycms/ai'.
|
|
15
13
|
export { defineAIContentConfig } from './ai/types.js';
|
|
16
14
|
export { isCanopyRequest, isHeadersLike, extractHeaders, validateAuthContext, } from './auth/context-helpers.js';
|
|
17
|
-
// Asset URL helpers — client-safe (no node: imports). Build/adjust transform
|
|
18
|
-
//
|
|
19
|
-
// server-only transform engine (canopycms's assets/transform.ts, sharp).
|
|
15
|
+
// Asset URL helpers — client-safe (no node: imports). Build/adjust transform URLs for <img>/srcset
|
|
16
|
+
// from stored asset refs without the server-only transform engine (assets/transform.ts, sharp).
|
|
20
17
|
export { assetUrl, assetSrcSet } from './assets/asset-url.js';
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* NO Node.js imports (fs, path, process, etc.) - only pure logic and simple data.
|
|
6
|
-
*
|
|
7
|
-
* These classes are extended by client-unsafe strategies to add Node.js functionality.
|
|
2
|
+
* Base strategy classes, safe in 'use client' React components: pure logic and
|
|
3
|
+
* simple data, NO Node.js imports. client-unsafe-strategy.ts extends these to
|
|
4
|
+
* add the Node.js surface.
|
|
8
5
|
*/
|
|
9
6
|
import type { OperatingMode, ClientSafeStrategy } from './types.js';
|
|
10
7
|
export declare class ProdClientSafeStrategy implements ClientSafeStrategy {
|
|
@@ -30,16 +27,12 @@ export declare class DevClientSafeStrategy implements ClientSafeStrategy {
|
|
|
30
27
|
shouldPush(): boolean;
|
|
31
28
|
}
|
|
32
29
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* Strategies are memoized - one instance per mode for the entire process lifetime.
|
|
36
|
-
* Safe to call inline: clientOperatingStrategy(mode).supportsBranching()
|
|
37
|
-
*
|
|
38
|
-
* @param mode - The operating mode
|
|
39
|
-
* @returns Client-safe strategy instance
|
|
30
|
+
* Memoized: one instance per mode for the process lifetime, so this is safe to
|
|
31
|
+
* call inline — `clientOperatingStrategy(mode).supportsBranching()`.
|
|
40
32
|
*/
|
|
41
33
|
export declare function clientOperatingStrategy(mode: OperatingMode): ClientSafeStrategy;
|
|
42
34
|
/**
|
|
43
|
-
*
|
|
35
|
+
* Mainly for testing.
|
|
36
|
+
* @internal Exported for tests.
|
|
44
37
|
*/
|
|
45
38
|
export declare function clearClientStrategyCache(): void;
|
|
@@ -1,19 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* NO Node.js imports (fs, path, process, etc.) - only pure logic and simple data.
|
|
6
|
-
*
|
|
7
|
-
* These classes are extended by client-unsafe strategies to add Node.js functionality.
|
|
2
|
+
* Base strategy classes, safe in 'use client' React components: pure logic and
|
|
3
|
+
* simple data, NO Node.js imports. client-unsafe-strategy.ts extends these to
|
|
4
|
+
* add the Node.js surface.
|
|
8
5
|
*/
|
|
9
|
-
// ============================================================================
|
|
10
|
-
// Production Mode - Client-Safe Strategy
|
|
11
|
-
// ============================================================================
|
|
12
6
|
export class ProdClientSafeStrategy {
|
|
13
7
|
constructor() {
|
|
14
8
|
this.mode = 'prod';
|
|
15
9
|
}
|
|
16
|
-
// UI Feature Flags
|
|
17
10
|
supportsBranching() {
|
|
18
11
|
return true;
|
|
19
12
|
}
|
|
@@ -26,7 +19,6 @@ export class ProdClientSafeStrategy {
|
|
|
26
19
|
supportsPullRequests() {
|
|
27
20
|
return true;
|
|
28
21
|
}
|
|
29
|
-
// Simple Data
|
|
30
22
|
getPermissionsFileName() {
|
|
31
23
|
return 'permissions.json';
|
|
32
24
|
}
|
|
@@ -40,14 +32,10 @@ export class ProdClientSafeStrategy {
|
|
|
40
32
|
return true;
|
|
41
33
|
}
|
|
42
34
|
}
|
|
43
|
-
// ============================================================================
|
|
44
|
-
// Dev Mode - Client-Safe Strategy
|
|
45
|
-
// ============================================================================
|
|
46
35
|
export class DevClientSafeStrategy {
|
|
47
36
|
constructor() {
|
|
48
37
|
this.mode = 'dev';
|
|
49
38
|
}
|
|
50
|
-
// UI Feature Flags
|
|
51
39
|
supportsBranching() {
|
|
52
40
|
return true;
|
|
53
41
|
}
|
|
@@ -60,7 +48,6 @@ export class DevClientSafeStrategy {
|
|
|
60
48
|
supportsPullRequests() {
|
|
61
49
|
return false; // No real GitHub in local dev mode
|
|
62
50
|
}
|
|
63
|
-
// Simple Data
|
|
64
51
|
getPermissionsFileName() {
|
|
65
52
|
return 'permissions.json';
|
|
66
53
|
}
|
|
@@ -74,18 +61,10 @@ export class DevClientSafeStrategy {
|
|
|
74
61
|
return true;
|
|
75
62
|
}
|
|
76
63
|
}
|
|
77
|
-
// ============================================================================
|
|
78
|
-
// Factory with Memoization
|
|
79
|
-
// ============================================================================
|
|
80
64
|
const clientStrategyCache = new Map();
|
|
81
65
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* Strategies are memoized - one instance per mode for the entire process lifetime.
|
|
85
|
-
* Safe to call inline: clientOperatingStrategy(mode).supportsBranching()
|
|
86
|
-
*
|
|
87
|
-
* @param mode - The operating mode
|
|
88
|
-
* @returns Client-safe strategy instance
|
|
66
|
+
* Memoized: one instance per mode for the process lifetime, so this is safe to
|
|
67
|
+
* call inline — `clientOperatingStrategy(mode).supportsBranching()`.
|
|
89
68
|
*/
|
|
90
69
|
export function clientOperatingStrategy(mode) {
|
|
91
70
|
const cached = clientStrategyCache.get(mode);
|
|
@@ -100,7 +79,7 @@ export function clientOperatingStrategy(mode) {
|
|
|
100
79
|
strategy = new DevClientSafeStrategy();
|
|
101
80
|
break;
|
|
102
81
|
default: {
|
|
103
|
-
// Exhaustiveness check
|
|
82
|
+
// Exhaustiveness check: adding a mode without a case fails to compile.
|
|
104
83
|
const _exhaustive = mode;
|
|
105
84
|
throw new Error(`Unknown operating mode: ${_exhaustive}`);
|
|
106
85
|
}
|
|
@@ -109,7 +88,8 @@ export function clientOperatingStrategy(mode) {
|
|
|
109
88
|
return strategy;
|
|
110
89
|
}
|
|
111
90
|
/**
|
|
112
|
-
*
|
|
91
|
+
* Mainly for testing.
|
|
92
|
+
* @internal Exported for tests.
|
|
113
93
|
*/
|
|
114
94
|
export function clearClientStrategyCache() {
|
|
115
95
|
clientStrategyCache.clear();
|
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Full strategy implementations that extend client-safe base classes.
|
|
5
|
-
* INCLUDES Node.js imports (fs, path, process) - can only be imported server-side.
|
|
6
|
-
*
|
|
7
|
-
* These classes inherit all client-safe methods and add client-unsafe functionality.
|
|
2
|
+
* Full strategies: the client-safe base classes plus the methods that need
|
|
3
|
+
* Node.js (fs, path, process). Server-side imports only.
|
|
8
4
|
*/
|
|
9
5
|
import type { OperatingMode, ClientUnsafeStrategy } from './types.js';
|
|
10
6
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Strategies are memoized - one instance per mode for the entire process lifetime.
|
|
14
|
-
* Safe to call inline: operatingStrategy(mode).getBaseRoot()
|
|
15
|
-
*
|
|
16
|
-
* Includes all client-safe methods (inherited) plus client-unsafe methods (Node.js APIs).
|
|
17
|
-
*
|
|
18
|
-
* @param mode - The operating mode
|
|
19
|
-
* @returns Full strategy instance with client-unsafe methods
|
|
7
|
+
* Memoized: one instance per mode for the process lifetime, so this is safe to
|
|
8
|
+
* call inline — `operatingStrategy(mode).getWorkspaceRoot()`.
|
|
20
9
|
*/
|
|
21
10
|
export declare function operatingStrategy(mode: OperatingMode): ClientUnsafeStrategy;
|
|
22
11
|
/**
|
|
23
|
-
*
|
|
12
|
+
* Mainly for testing.
|
|
13
|
+
* @internal Exported for tests.
|
|
24
14
|
*/
|
|
25
15
|
export declare function clearStrategyCache(): void;
|
|
@@ -1,30 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Full strategy implementations that extend client-safe base classes.
|
|
5
|
-
* INCLUDES Node.js imports (fs, path, process) - can only be imported server-side.
|
|
6
|
-
*
|
|
7
|
-
* These classes inherit all client-safe methods and add client-unsafe functionality.
|
|
2
|
+
* Full strategies: the client-safe base classes plus the methods that need
|
|
3
|
+
* Node.js (fs, path, process). Server-side imports only.
|
|
8
4
|
*/
|
|
9
5
|
import path from 'node:path';
|
|
10
6
|
import { ProdClientSafeStrategy, DevClientSafeStrategy } from './client-safe-strategy.js';
|
|
11
7
|
import { resolveDeploymentName } from './deployment-name.js';
|
|
12
8
|
import { DEFAULT_PROD_WORKSPACE } from '../config/index.js';
|
|
13
|
-
// ============================================================================
|
|
14
|
-
// Production Mode - Full Strategy
|
|
15
|
-
// ============================================================================
|
|
16
9
|
class ProdStrategy extends ProdClientSafeStrategy {
|
|
17
|
-
// All client-safe methods inherited automatically from ProdClientSafeStrategy:
|
|
18
|
-
// - mode, supportsBranching(), supportsStatusBadge(), supportsComments()
|
|
19
|
-
// - supportsPullRequests(), getPermissionsFileName(), getGroupsFileName()
|
|
20
|
-
// - shouldCommit(), shouldPush()
|
|
21
|
-
// Add client-unsafe methods (use Node.js APIs)
|
|
22
10
|
getWorkspaceRoot(_sourceRoot) {
|
|
23
11
|
return path.resolve(process.env.CANOPYCMS_WORKSPACE_ROOT ?? DEFAULT_PROD_WORKSPACE);
|
|
24
12
|
}
|
|
25
13
|
getContentRoot(contentRoot, sourceRoot) {
|
|
26
|
-
// In prod
|
|
27
|
-
//
|
|
14
|
+
// In prod the caller passes sourceRoot = the workspace path, because
|
|
15
|
+
// content sits at the workspace root rather than a project root.
|
|
28
16
|
return path.resolve(sourceRoot ?? process.cwd(), contentRoot);
|
|
29
17
|
}
|
|
30
18
|
getContentBranchesRoot(sourceRoot) {
|
|
@@ -73,11 +61,7 @@ class ProdStrategy extends ProdClientSafeStrategy {
|
|
|
73
61
|
return config.autoCreateSettingsPR ?? true;
|
|
74
62
|
}
|
|
75
63
|
}
|
|
76
|
-
// ============================================================================
|
|
77
|
-
// Dev Mode - Full Strategy
|
|
78
|
-
// ============================================================================
|
|
79
64
|
class DevStrategy extends DevClientSafeStrategy {
|
|
80
|
-
// Inherits client-safe methods from DevClientSafeStrategy
|
|
81
65
|
getWorkspaceRoot(sourceRoot) {
|
|
82
66
|
return path.resolve(sourceRoot ?? process.cwd(), '.canopy-dev');
|
|
83
67
|
}
|
|
@@ -127,20 +111,10 @@ class DevStrategy extends DevClientSafeStrategy {
|
|
|
127
111
|
return false; // No real GitHub in local dev mode
|
|
128
112
|
}
|
|
129
113
|
}
|
|
130
|
-
// ============================================================================
|
|
131
|
-
// Factory with Memoization
|
|
132
|
-
// ============================================================================
|
|
133
114
|
const strategyCache = new Map();
|
|
134
115
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* Strategies are memoized - one instance per mode for the entire process lifetime.
|
|
138
|
-
* Safe to call inline: operatingStrategy(mode).getBaseRoot()
|
|
139
|
-
*
|
|
140
|
-
* Includes all client-safe methods (inherited) plus client-unsafe methods (Node.js APIs).
|
|
141
|
-
*
|
|
142
|
-
* @param mode - The operating mode
|
|
143
|
-
* @returns Full strategy instance with client-unsafe methods
|
|
116
|
+
* Memoized: one instance per mode for the process lifetime, so this is safe to
|
|
117
|
+
* call inline — `operatingStrategy(mode).getWorkspaceRoot()`.
|
|
144
118
|
*/
|
|
145
119
|
export function operatingStrategy(mode) {
|
|
146
120
|
const cached = strategyCache.get(mode);
|
|
@@ -155,7 +129,7 @@ export function operatingStrategy(mode) {
|
|
|
155
129
|
strategy = new DevStrategy();
|
|
156
130
|
break;
|
|
157
131
|
default: {
|
|
158
|
-
// Exhaustiveness check
|
|
132
|
+
// Exhaustiveness check: adding a mode without a case fails to compile.
|
|
159
133
|
const _exhaustive = mode;
|
|
160
134
|
throw new Error(`Unknown operating mode: ${_exhaustive}`);
|
|
161
135
|
}
|
|
@@ -164,7 +138,8 @@ export function operatingStrategy(mode) {
|
|
|
164
138
|
return strategy;
|
|
165
139
|
}
|
|
166
140
|
/**
|
|
167
|
-
*
|
|
141
|
+
* Mainly for testing.
|
|
142
|
+
* @internal Exported for tests.
|
|
168
143
|
*/
|
|
169
144
|
export function clearStrategyCache() {
|
|
170
145
|
strategyCache.clear();
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Client-
|
|
3
|
-
*
|
|
4
|
-
* This module ONLY exports client-safe functionality with NO Node.js imports.
|
|
5
|
-
* Safe to import in 'use client' React components.
|
|
6
|
-
*
|
|
7
|
-
* Usage in client components:
|
|
8
|
-
* import { clientOperatingStrategy } from '@/operating-mode/client'
|
|
2
|
+
* Client-bundle entry point: exports ONLY client-safe functionality, with no
|
|
3
|
+
* Node.js imports, so it is safe in 'use client' React components.
|
|
9
4
|
*/
|
|
10
|
-
export { clientOperatingStrategy
|
|
11
|
-
export type { ClientSafeStrategy } from './types.js';
|
|
12
|
-
export type { OperatingMode } from './types.js';
|
|
5
|
+
export { clientOperatingStrategy } from './client-safe-strategy.js';
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Client-
|
|
3
|
-
*
|
|
4
|
-
* This module ONLY exports client-safe functionality with NO Node.js imports.
|
|
5
|
-
* Safe to import in 'use client' React components.
|
|
6
|
-
*
|
|
7
|
-
* Usage in client components:
|
|
8
|
-
* import { clientOperatingStrategy } from '@/operating-mode/client'
|
|
2
|
+
* Client-bundle entry point: exports ONLY client-safe functionality, with no
|
|
3
|
+
* Node.js imports, so it is safe in 'use client' React components.
|
|
9
4
|
*/
|
|
10
|
-
export { clientOperatingStrategy
|
|
5
|
+
export { clientOperatingStrategy } from './client-safe-strategy.js';
|
|
@@ -1,30 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared deployment-name test fixture.
|
|
3
3
|
*
|
|
4
|
-
* The rule
|
|
5
|
-
* necessity:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `isValidDeploymentName`'s doc comment in cms-service.ts for why (not, as
|
|
9
|
-
* this comment used to say, that the published construct lacks a runtime
|
|
10
|
-
* dependency on `canopycms` — it doesn't).
|
|
4
|
+
* The rule deciding whether a `deploymentName` is usable exists TWICE by
|
|
5
|
+
* necessity: at runtime (`deployment-name.ts`'s `isValidDeploymentName`) and at
|
|
6
|
+
* synth time (`canopycms-cdk`'s `constructs/cms-service.ts`, which deliberately
|
|
7
|
+
* does not import the real thing — see its own doc comment for why).
|
|
11
8
|
*
|
|
12
9
|
* The dangerous drift is asymmetric: a rule TIGHTENED at runtime but not at
|
|
13
|
-
* synth
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
10
|
+
* synth synths clean and then crash-loops the Lambda at boot, precisely what the
|
|
11
|
+
* synth guard exists to prevent. So both packages' suites assert against this
|
|
12
|
+
* one list, and `canopycms-cdk`'s also asserts that the construct's verdict
|
|
13
|
+
* matches this package's predicate for every name here. Add a case when you
|
|
14
|
+
* change either copy of the rule.
|
|
18
15
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* along.
|
|
16
|
+
* Dependency-free (plain arrays, no vitest import) so the CDK suite can import
|
|
17
|
+
* it across the package boundary.
|
|
22
18
|
*/
|
|
23
19
|
/** Names both copies of the rule must ACCEPT. */
|
|
24
20
|
export declare const VALID_DEPLOYMENT_NAMES: readonly ["prod", "staging", "acme-prod_2.1", "a", "9lives", "team.prod", "PROD", "x.locked"];
|
|
25
21
|
/**
|
|
26
|
-
* Names both copies of the rule must REJECT
|
|
27
|
-
*
|
|
28
|
-
*
|
|
22
|
+
* Names both copies of the rule must REJECT: each is either a value git itself
|
|
23
|
+
* refuses as a ref component, or one that would corrupt the worker's `.env`
|
|
24
|
+
* heredoc.
|
|
29
25
|
*/
|
|
30
26
|
export declare const INVALID_DEPLOYMENT_NAMES: readonly [readonly ["a slash (would add a ref hierarchy level)", "team/prod"], readonly ["whitespace", "my prod"], readonly ["a leading dash (parses as a git option)", "-prod"], readonly ["a git-forbidden character", "prod:1"], readonly ["dot-dot", "a..b"], readonly ["a leading dot", ".prod"], readonly ["a trailing dot", "prod."], readonly ["a .lock suffix", "prod.lock"], readonly ["a tilde", "prod~1"], readonly ["a caret", "prod^1"], readonly ["a question mark", "prod?"], readonly ["an asterisk", "prod*"], readonly ["an open bracket", "prod["], readonly ["a backslash", "prod\\1"], readonly ["the empty string", ""], readonly ["a newline (would inject a line into the worker .env)", "prod\nEVIL=1"]];
|
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared deployment-name test fixture.
|
|
3
3
|
*
|
|
4
|
-
* The rule
|
|
5
|
-
* necessity:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `isValidDeploymentName`'s doc comment in cms-service.ts for why (not, as
|
|
9
|
-
* this comment used to say, that the published construct lacks a runtime
|
|
10
|
-
* dependency on `canopycms` — it doesn't).
|
|
4
|
+
* The rule deciding whether a `deploymentName` is usable exists TWICE by
|
|
5
|
+
* necessity: at runtime (`deployment-name.ts`'s `isValidDeploymentName`) and at
|
|
6
|
+
* synth time (`canopycms-cdk`'s `constructs/cms-service.ts`, which deliberately
|
|
7
|
+
* does not import the real thing — see its own doc comment for why).
|
|
11
8
|
*
|
|
12
9
|
* The dangerous drift is asymmetric: a rule TIGHTENED at runtime but not at
|
|
13
|
-
* synth
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
10
|
+
* synth synths clean and then crash-loops the Lambda at boot, precisely what the
|
|
11
|
+
* synth guard exists to prevent. So both packages' suites assert against this
|
|
12
|
+
* one list, and `canopycms-cdk`'s also asserts that the construct's verdict
|
|
13
|
+
* matches this package's predicate for every name here. Add a case when you
|
|
14
|
+
* change either copy of the rule.
|
|
18
15
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* along.
|
|
16
|
+
* Dependency-free (plain arrays, no vitest import) so the CDK suite can import
|
|
17
|
+
* it across the package boundary.
|
|
22
18
|
*/
|
|
23
19
|
/** Names both copies of the rule must ACCEPT. */
|
|
24
20
|
export const VALID_DEPLOYMENT_NAMES = [
|
|
@@ -32,9 +28,9 @@ export const VALID_DEPLOYMENT_NAMES = [
|
|
|
32
28
|
'x.locked',
|
|
33
29
|
];
|
|
34
30
|
/**
|
|
35
|
-
* Names both copies of the rule must REJECT
|
|
36
|
-
*
|
|
37
|
-
*
|
|
31
|
+
* Names both copies of the rule must REJECT: each is either a value git itself
|
|
32
|
+
* refuses as a ref component, or one that would corrupt the worker's `.env`
|
|
33
|
+
* heredoc.
|
|
38
34
|
*/
|
|
39
35
|
export const INVALID_DEPLOYMENT_NAMES = [
|
|
40
36
|
['a slash (would add a ref hierarchy level)', 'team/prod'],
|
|
@@ -1,37 +1,27 @@
|
|
|
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
|
/**
|
|
26
|
-
* Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy
|
|
27
|
-
*
|
|
28
|
-
* construct deliberately does not import this directly — see
|
|
29
|
-
* `isValidDeploymentName`
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* non-optional peerDependency there, and the package's own main entry already
|
|
33
|
-
* imports it at runtime). The drift check is therefore test-only — see
|
|
34
|
-
* `deployment-name-fixtures.ts`.
|
|
19
|
+
* Exported so `canopycms-cdk`'s suite can assert that its own synth-time copy of
|
|
20
|
+
* this rule (constructs/cms-service.ts) still agrees with this one. The
|
|
21
|
+
* construct deliberately does not import this directly — see its own
|
|
22
|
+
* `isValidDeploymentName` doc comment. The drift check is therefore test-only,
|
|
23
|
+
* over `deployment-name-fixtures.ts`.
|
|
24
|
+
* @internal Exported for tests.
|
|
35
25
|
*/
|
|
36
26
|
export declare const isValidDeploymentName: (name: string) => boolean;
|
|
37
27
|
export declare function resolveDeploymentName(config: {
|