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,16 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* current directory to the nearest canopycms.config.ts — like git does
|
|
7
|
-
* with .git — so running from a subdirectory works and never scatters
|
|
8
|
-
* state (e.g. .canopy-dev/) into the wrong directory.
|
|
2
|
+
* Resolves an existing CanopyCMS project's root for sync/worker/generate-ai-content:
|
|
3
|
+
* walks up from the given directory to the nearest canopycms.config.ts (like git
|
|
4
|
+
* and .git), so commands work from any subdirectory without scattering state
|
|
5
|
+
* (e.g. .canopy-dev/) into the wrong place.
|
|
9
6
|
*/
|
|
10
7
|
/** Config file that marks the root of a CanopyCMS project. */
|
|
11
8
|
export declare const PROJECT_MARKER = "canopycms.config.ts";
|
|
12
|
-
/**
|
|
13
|
-
* Walk up from startDir to the nearest directory containing canopycms.config.ts.
|
|
14
|
-
* Returns null when no project root is found.
|
|
15
|
-
*/
|
|
16
9
|
export declare function findProjectRoot(startDir: string): Promise<string | null>;
|
package/dist/cli/project-root.js
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* current directory to the nearest canopycms.config.ts — like git does
|
|
7
|
-
* with .git — so running from a subdirectory works and never scatters
|
|
8
|
-
* state (e.g. .canopy-dev/) into the wrong directory.
|
|
2
|
+
* Resolves an existing CanopyCMS project's root for sync/worker/generate-ai-content:
|
|
3
|
+
* walks up from the given directory to the nearest canopycms.config.ts (like git
|
|
4
|
+
* and .git), so commands work from any subdirectory without scattering state
|
|
5
|
+
* (e.g. .canopy-dev/) into the wrong place.
|
|
9
6
|
*/
|
|
10
7
|
import path from 'node:path';
|
|
11
8
|
import { filePathExists } from '../utils/fs.js';
|
|
12
9
|
/** Config file that marks the root of a CanopyCMS project. */
|
|
13
10
|
export const PROJECT_MARKER = 'canopycms.config.ts';
|
|
14
|
-
/**
|
|
15
|
-
* Walk up from startDir to the nearest directory containing canopycms.config.ts.
|
|
16
|
-
* Returns null when no project root is found.
|
|
17
|
-
*/
|
|
18
11
|
export async function findProjectRoot(startDir) {
|
|
19
12
|
let dir = path.resolve(startDir);
|
|
20
13
|
for (;;) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Stdin prompts for the CLI commands; `stdinEnded` says why they share one module. */
|
|
2
|
+
/** Wait for the operator to continue. Returns at once if stdin has ended. */
|
|
3
|
+
export declare function pressEnter(prompt: string): Promise<void>;
|
|
4
|
+
/** Read one line from the operator. `null` when stdin ended instead. */
|
|
5
|
+
export declare function askLine(prompt: string): Promise<string | null>;
|
|
6
|
+
/**
|
|
7
|
+
* Reset between tests. Not used by the command itself.
|
|
8
|
+
* @internal Exported for tests.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resetStdinStateForTesting(): void;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Stdin prompts for the CLI commands; `stdinEnded` says why they share one module. */
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
/**
|
|
4
|
+
* Whether stdin has already delivered end-of-input to an earlier prompt.
|
|
5
|
+
* `process.stdin` can only end ONCE, and a `readline` interface created after
|
|
6
|
+
* it has ended never emits `'line'` or `'close'`, so a per-prompt interface
|
|
7
|
+
* is a footgun once a command has two prompts — even when the first WAS
|
|
8
|
+
* answered, since readline flushes a pending partial line as a final `'line'`
|
|
9
|
+
* event before `'close'`, so "text then EOF" answers normally while the
|
|
10
|
+
* stream also ends in that same moment. The flag records whether the STREAM
|
|
11
|
+
* ended, not whether THIS prompt got an answer.
|
|
12
|
+
* `readableEnded` is checked unconditionally in the `'close'` handler
|
|
13
|
+
* below, before the `answered` branch: gating it on `!answered` would miss
|
|
14
|
+
* the case above and leave the next prompt's readline on an already-ended
|
|
15
|
+
* stream that never emits, so node would exit 0 silently with no cleanup. Our
|
|
16
|
+
* OWN `rl.close()` also fires `'close'` but leaves `readableEnded` false,
|
|
17
|
+
* keeping the two cases apart. Every prompt below consults this first; no
|
|
18
|
+
* other readline interface on `process.stdin` may exist anywhere in the CLI.
|
|
19
|
+
*/
|
|
20
|
+
let stdinEnded = false;
|
|
21
|
+
function readLineOnce(prompt) {
|
|
22
|
+
if (stdinEnded) {
|
|
23
|
+
// Already at EOF: answer immediately rather than waiting for input that can
|
|
24
|
+
// never arrive.
|
|
25
|
+
console.log(prompt);
|
|
26
|
+
return Promise.resolve(null);
|
|
27
|
+
}
|
|
28
|
+
const rl = createInterface({ input: process.stdin, terminal: false });
|
|
29
|
+
return new Promise((resolve) => {
|
|
30
|
+
console.log(prompt);
|
|
31
|
+
let answered = false;
|
|
32
|
+
rl.once('line', (line) => {
|
|
33
|
+
answered = true;
|
|
34
|
+
rl.close();
|
|
35
|
+
resolve(line);
|
|
36
|
+
});
|
|
37
|
+
rl.once('close', () => {
|
|
38
|
+
// Checked FIRST and unconditionally (see `stdinEnded` above): `'close'`
|
|
39
|
+
// fires both for our own `rl.close()` and for the stream actually
|
|
40
|
+
// ending, and by the time it fires here the input has already finished
|
|
41
|
+
// emitting `'end'`, so `readableEnded` is reliable to read now.
|
|
42
|
+
if (process.stdin.readableEnded) {
|
|
43
|
+
stdinEnded = true;
|
|
44
|
+
}
|
|
45
|
+
if (answered)
|
|
46
|
+
return;
|
|
47
|
+
stdinEnded = true;
|
|
48
|
+
resolve(null);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Wait for the operator to continue. Returns at once if stdin has ended. */
|
|
53
|
+
export async function pressEnter(prompt) {
|
|
54
|
+
await readLineOnce(prompt);
|
|
55
|
+
}
|
|
56
|
+
/** Read one line from the operator. `null` when stdin ended instead. */
|
|
57
|
+
export async function askLine(prompt) {
|
|
58
|
+
const line = await readLineOnce(prompt);
|
|
59
|
+
return line === null ? null : line.trim();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Reset between tests. Not used by the command itself.
|
|
63
|
+
* @internal Exported for tests.
|
|
64
|
+
*/
|
|
65
|
+
export function resetStdinStateForTesting() {
|
|
66
|
+
stdinEnded = false;
|
|
67
|
+
}
|
package/dist/cli/sync.d.ts
CHANGED
|
@@ -21,14 +21,6 @@ export interface SyncOptions {
|
|
|
21
21
|
/** Skip confirmation prompts (for testing or scripts). */
|
|
22
22
|
force?: boolean;
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Sync precondition failure (missing content dir, unknown branch, …).
|
|
26
|
-
* Thrown so the CLI exits non-zero — scripts/CI must not sail past a
|
|
27
|
-
* push that synced nothing.
|
|
28
|
-
*/
|
|
29
|
-
export declare class SyncError extends Error {
|
|
30
|
-
constructor(message: string);
|
|
31
|
-
}
|
|
32
24
|
/**
|
|
33
25
|
* Run the sync command.
|
|
34
26
|
*
|
package/dist/cli/sync.js
CHANGED
|
@@ -26,7 +26,7 @@ import { operatingStrategy } from '../operating-mode/index.js';
|
|
|
26
26
|
* Thrown so the CLI exits non-zero — scripts/CI must not sail past a
|
|
27
27
|
* push that synced nothing.
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
class SyncError extends Error {
|
|
30
30
|
constructor(message) {
|
|
31
31
|
super(message);
|
|
32
32
|
this.name = 'SyncError';
|
|
@@ -49,14 +49,13 @@ async function selectBranch(options, branchesDir) {
|
|
|
49
49
|
let branches = [];
|
|
50
50
|
if (await filePathExists(branchesDir)) {
|
|
51
51
|
const entries = await fs.readdir(branchesDir, { withFileTypes: true });
|
|
52
|
-
// Dot-prefixed dirs are never branch workspaces (.canopy-meta,
|
|
52
|
+
// Dot-prefixed dirs are never branch workspaces (.canopy-meta, plus
|
|
53
53
|
// .trash-*/.{dirName}.init.lock from the admin branch-health recovery
|
|
54
|
-
// surface)
|
|
54
|
+
// surface) — same skip rule as BranchRegistry.scanBranchDirectories.
|
|
55
55
|
branches = entries.filter((e) => e.isDirectory() && !e.name.startsWith('.')).map((e) => e.name);
|
|
56
56
|
}
|
|
57
57
|
let branchName = options.branch;
|
|
58
58
|
if (!branchName) {
|
|
59
|
-
// Default to current git branch
|
|
60
59
|
try {
|
|
61
60
|
branchName = await detectCurrentBranch(options.projectDir);
|
|
62
61
|
}
|
|
@@ -96,12 +95,11 @@ async function selectBranch(options, branchesDir) {
|
|
|
96
95
|
await wsGit.init();
|
|
97
96
|
await wsGit.checkoutLocalBranch(branchName);
|
|
98
97
|
await wsGit.raw(['commit', '--allow-empty', '-m', 'init: workspace created by sync']);
|
|
99
|
-
// Runtime metadata (.canopy-meta/: branch metadata, comments,
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
// pattern rather than hardcoding it.
|
|
98
|
+
// Runtime metadata (.canopy-meta/: branch metadata, comments, content-index
|
|
99
|
+
// marker) must never be staged by sync's `add -A`. Fully provisioned workspaces
|
|
100
|
+
// get this exclude from GitManager.initializeWorkspace; this minimal one needs it
|
|
101
|
+
// too. Sync is dev-mode-only (see branchesDir), so this asks the dev strategy for
|
|
102
|
+
// the pattern rather than hardcoding it.
|
|
105
103
|
await ensureGitExcludePattern(branchPath, operatingStrategy('dev').getGitExcludePattern());
|
|
106
104
|
p.log.info(`Created branch workspace: ${branchName}`);
|
|
107
105
|
}
|
|
@@ -133,7 +131,6 @@ async function syncPush(options) {
|
|
|
133
131
|
const branchPath = path.join(branchesDir, branchName);
|
|
134
132
|
assertWithinDir(branchPath, branchesDir, '--branch');
|
|
135
133
|
const wsGit = simpleGit({ baseDir: branchPath });
|
|
136
|
-
// Check workspace health
|
|
137
134
|
const status = await wsGit.status();
|
|
138
135
|
if (status.conflicted.length > 0) {
|
|
139
136
|
p.log.error('Branch workspace has unresolved merge conflicts.');
|
|
@@ -152,7 +149,6 @@ async function syncPush(options) {
|
|
|
152
149
|
}
|
|
153
150
|
return { fileCount: 0 };
|
|
154
151
|
}
|
|
155
|
-
// Warn about uncommitted workspace changes (editor saves)
|
|
156
152
|
if (status.files.length > 0 && !options.force) {
|
|
157
153
|
p.log.warn(`Branch workspace has ${status.files.length} uncommitted change(s) that will be committed to history then overwritten:`);
|
|
158
154
|
for (const file of status.files.slice(0, 10)) {
|
|
@@ -264,7 +260,6 @@ async function syncPull(options) {
|
|
|
264
260
|
return { fileCount: 0 };
|
|
265
261
|
}
|
|
266
262
|
}
|
|
267
|
-
// Replace the working-tree content with the branch workspace content.
|
|
268
263
|
// Uses backup-rename pattern: if interrupted, at least one copy always exists.
|
|
269
264
|
const tmpDestDir = `${destContentDir}.sync-tmp-${Date.now()}`;
|
|
270
265
|
try {
|
|
@@ -276,7 +271,6 @@ async function syncPull(options) {
|
|
|
276
271
|
await fs.rm(tmpDestDir, { recursive: true, force: true }).catch(() => { });
|
|
277
272
|
throw err;
|
|
278
273
|
}
|
|
279
|
-
// Show what changed using git status (re-check after copy)
|
|
280
274
|
const postStatus = await sourceGit.status();
|
|
281
275
|
const contentChanges = postStatus.files.filter((f) => f.path.startsWith(contentRoot + '/') || f.path === contentRoot);
|
|
282
276
|
if (contentChanges.length === 0) {
|
|
@@ -318,7 +312,6 @@ async function syncBoth(options) {
|
|
|
318
312
|
const branchPath = path.join(branchesDir, branchName);
|
|
319
313
|
assertWithinDir(branchPath, branchesDir, '--branch');
|
|
320
314
|
const wsGit = simpleGit({ baseDir: branchPath });
|
|
321
|
-
// Check workspace health
|
|
322
315
|
const status = await wsGit.status();
|
|
323
316
|
if (status.conflicted.length > 0) {
|
|
324
317
|
p.log.error('Branch workspace has unresolved merge conflicts.');
|
|
@@ -329,8 +322,6 @@ async function syncBoth(options) {
|
|
|
329
322
|
});
|
|
330
323
|
if (!p.isCancel(shouldAbort) && shouldAbort) {
|
|
331
324
|
await wsGit.merge(['--abort']);
|
|
332
|
-
// The abort rewrote the clone's working tree — tell ContentStore ID
|
|
333
|
-
// indexes (the dev server is a separate process; on-disk marker).
|
|
334
325
|
await invalidateBranchContentCaches(branchPath);
|
|
335
326
|
p.log.success('Merge aborted. Workspace restored to pre-merge state.');
|
|
336
327
|
}
|
|
@@ -343,7 +334,6 @@ async function syncBoth(options) {
|
|
|
343
334
|
await wsGit.commit('sync: save editor state before merge');
|
|
344
335
|
p.log.info('Committed editor changes before merge');
|
|
345
336
|
}
|
|
346
|
-
// Determine merge base
|
|
347
337
|
let baseRef;
|
|
348
338
|
try {
|
|
349
339
|
await wsGit.raw(['rev-parse', SYNC_BASE_TAG]);
|
|
@@ -353,17 +343,14 @@ async function syncBoth(options) {
|
|
|
353
343
|
// First time: no tag exists. Use current HEAD as base.
|
|
354
344
|
baseRef = 'HEAD';
|
|
355
345
|
}
|
|
356
|
-
// Remember the current branch to switch back after merge
|
|
357
346
|
const currentBranch = (await wsGit.revparse(['--abbrev-ref', 'HEAD'])).trim();
|
|
358
347
|
// Everything from here mutates the branch clone's working tree (temp-branch
|
|
359
348
|
// checkout, content replace, merge) — whatever the outcome, mark ContentStore
|
|
360
349
|
// ID indexes stale in the finally below. The dev server is a separate
|
|
361
350
|
// process, reached via the on-disk generation marker.
|
|
362
351
|
try {
|
|
363
|
-
// Create temp branch from the merge base
|
|
364
352
|
const incomingBranch = `sync-incoming-${Date.now()}`;
|
|
365
353
|
await wsGit.raw(['checkout', '-b', incomingBranch, baseRef]);
|
|
366
|
-
// Replace content on temp branch with working-tree content
|
|
367
354
|
const wsContentDir = path.join(branchPath, contentRoot);
|
|
368
355
|
assertWithinDir(wsContentDir, branchPath, '--content-root');
|
|
369
356
|
const tmpDir = `${wsContentDir}.sync-tmp-${Date.now()}`;
|
|
@@ -380,7 +367,6 @@ async function syncBoth(options) {
|
|
|
380
367
|
}
|
|
381
368
|
await wsGit.add('-A');
|
|
382
369
|
const incomingStatus = await wsGit.status();
|
|
383
|
-
// No working-tree changes — skip merge, just pull editor changes
|
|
384
370
|
if (incomingStatus.files.length === 0) {
|
|
385
371
|
await wsGit.checkout(currentBranch);
|
|
386
372
|
await wsGit.raw(['branch', '-D', incomingBranch]);
|
|
@@ -389,14 +375,12 @@ async function syncBoth(options) {
|
|
|
389
375
|
return { pushed: 0, pulled: pullResult.fileCount };
|
|
390
376
|
}
|
|
391
377
|
await wsGit.commit('sync: incoming working-tree changes');
|
|
392
|
-
// Switch back to workspace branch and merge
|
|
393
378
|
await wsGit.checkout(currentBranch);
|
|
394
379
|
p.log.step('Merging working-tree changes with editor changes...');
|
|
395
380
|
try {
|
|
396
381
|
await wsGit.merge([incomingBranch, '--no-edit']);
|
|
397
382
|
}
|
|
398
383
|
catch (mergeError) {
|
|
399
|
-
// Check if it's a merge conflict
|
|
400
384
|
let mergeStatus;
|
|
401
385
|
try {
|
|
402
386
|
mergeStatus = await wsGit.status();
|
|
@@ -418,7 +402,6 @@ async function syncBoth(options) {
|
|
|
418
402
|
await wsGit.raw(['branch', '-D', incomingBranch]).catch(() => { });
|
|
419
403
|
return { pushed: 0, pulled: 0 };
|
|
420
404
|
}
|
|
421
|
-
// Not a conflict — clean up and re-throw original error
|
|
422
405
|
await wsGit.raw(['branch', '-D', incomingBranch]).catch(() => { });
|
|
423
406
|
throw mergeError;
|
|
424
407
|
}
|
|
@@ -426,7 +409,6 @@ async function syncBoth(options) {
|
|
|
426
409
|
await wsGit.raw(['branch', '-D', incomingBranch]);
|
|
427
410
|
await wsGit.tag(['-f', SYNC_BASE_TAG]);
|
|
428
411
|
p.log.success('Merged working-tree changes with editor changes');
|
|
429
|
-
// Pull merged result back to working tree
|
|
430
412
|
const pullResult = await syncPull({ ...options, branch: branchName, force: true });
|
|
431
413
|
return { pushed: incomingStatus.files.length, pulled: pullResult.fileCount };
|
|
432
414
|
}
|
|
@@ -453,8 +435,6 @@ async function syncAbort(options) {
|
|
|
453
435
|
return;
|
|
454
436
|
}
|
|
455
437
|
await wsGit.merge(['--abort']);
|
|
456
|
-
// The abort rewrote the clone's working tree — tell ContentStore ID indexes
|
|
457
|
-
// (the dev server is a separate process; on-disk marker).
|
|
458
438
|
await invalidateBranchContentCaches(branchPath);
|
|
459
439
|
p.log.success(`Merge aborted in branch workspace "${branchName}". Workspace restored to pre-merge state.`);
|
|
460
440
|
}
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server'
|
|
2
2
|
|
|
3
|
-
//
|
|
3
|
+
// Optional edge protection for /edit and /api/canopycms. This passthrough adds none, and the CMS
|
|
4
|
+
// needs none in any auth mode: the API authenticates every request itself, and the editor shows
|
|
5
|
+
// the auth provider's sign-in screen to signed-out users. It is the same file for every auth mode,
|
|
6
|
+
// so changing CANOPY_AUTH_MODE needs nothing here.
|
|
4
7
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
8
|
+
// With Clerk you can instead turn signed-out requests away at the edge, before they reach the
|
|
9
|
+
// app. On a deployed CMS Lambda that costs two things:
|
|
10
|
+
// - CLERK_SECRET_KEY on the Lambda. clerkMiddleware throws on every request it matches unless
|
|
11
|
+
// it can resolve a secret key (jwtKey doesn't count), which breaks the public-keys-only
|
|
12
|
+
// Lambda that the Security Model in docs/deploying-to-aws.md describes.
|
|
13
|
+
// - One image per Clerk instance. It reads the publishable key inlined at image build
|
|
14
|
+
// (NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY), not the one your ClerkProvider receives, unless you
|
|
15
|
+
// pass it an options callback that reads both keys at run time.
|
|
16
|
+
// To adopt it anyway, replace this file's contents with:
|
|
9
17
|
//
|
|
10
18
|
// import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
|
|
11
19
|
//
|
|
12
20
|
// const isProtectedRoute = createRouteMatcher(['/edit(.*)', '/api/canopycms(.*)'])
|
|
13
21
|
//
|
|
14
|
-
// // jwtKey avoids a JWKS fetch to api.clerk.com on cold verification --
|
|
15
|
-
// // the
|
|
22
|
+
// // jwtKey avoids a JWKS fetch to api.clerk.com on cold verification -- the prod CMS Lambda
|
|
23
|
+
// // has no internet, and the CLERK_JWT_KEY env var alone is never read.
|
|
16
24
|
// export default clerkMiddleware(
|
|
17
25
|
// async (auth, req) => {
|
|
18
26
|
// if (isProtectedRoute(req)) {
|
|
@@ -25,30 +33,8 @@ import { NextResponse } from 'next/server'
|
|
|
25
33
|
// export const config = {
|
|
26
34
|
// matcher: ['/edit(.*)', '/api/canopycms(.*)'],
|
|
27
35
|
// }
|
|
28
|
-
//
|
|
29
|
-
// IMPORTANT: unlike canopy.ts and the edit page, this file does NOT read
|
|
30
|
-
// CANOPY_AUTH_MODE at runtime -- it is frozen at `init` time. If you switch
|
|
31
|
-
// from dev to Clerk auth (or flip CANOPY_AUTH_MODE=clerk), choose what this
|
|
32
|
-
// file becomes. The Clerk middleware above turns signed-out requests away
|
|
33
|
-
// before they reach the app, but needs CLERK_SECRET_KEY wherever it runs.
|
|
34
|
-
// Deleting the file relies on the Clerk auth plugin alone, which rejects
|
|
35
|
-
// unauthenticated API calls on its own (the core also fails closed in prod
|
|
36
|
-
// mode), and keeps the secret off a deployed CMS Lambda -- see "One image for
|
|
37
|
-
// every Clerk tier" in docs/deploying-to-aws.md. Keeping this passthrough with
|
|
38
|
-
// Clerk behaves like deleting it; the warning below is there so that it's a
|
|
39
|
-
// choice rather than an oversight.
|
|
40
|
-
|
|
41
|
-
let warnedAuthModeMismatch = false
|
|
42
36
|
|
|
43
37
|
export default function middleware() {
|
|
44
|
-
if (process.env.CANOPY_AUTH_MODE === 'clerk' && !warnedAuthModeMismatch) {
|
|
45
|
-
warnedAuthModeMismatch = true
|
|
46
|
-
console.warn(
|
|
47
|
-
'[canopycms] CANOPY_AUTH_MODE=clerk is set, but middleware.ts is still the dev ' +
|
|
48
|
-
'passthrough generated for dev auth. Replace it with the Clerk middleware (see the ' +
|
|
49
|
-
'comment above), or delete it to rely on the Clerk auth plugin alone.',
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
38
|
return NextResponse.next()
|
|
53
39
|
}
|
|
54
40
|
|
package/dist/cli/templates.d.ts
CHANGED
|
@@ -22,21 +22,11 @@ export declare function aiConfig(): Promise<string>;
|
|
|
22
22
|
export declare function aiRoute(options: {
|
|
23
23
|
configImport: string;
|
|
24
24
|
}): Promise<string>;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}): Promise<string>;
|
|
25
|
+
/** One passthrough for every auth mode; it carries the opt-in `clerkMiddleware` as a comment. */
|
|
26
|
+
export declare function middleware(): Promise<string>;
|
|
28
27
|
export declare function nextConfig(options: {
|
|
29
28
|
staticBuild: boolean;
|
|
30
29
|
}): Promise<string>;
|
|
31
|
-
/**
|
|
32
|
-
* CloudFormation stack id used by the scaffolded CDK app.
|
|
33
|
-
*
|
|
34
|
-
* Shared rather than written twice: `infrastructure/bin/app.ts` names the
|
|
35
|
-
* stack, and the deploy workflow deploys it BY NAME (not `--all`, which would
|
|
36
|
-
* also deploy any unrelated stacks an adopter keeps in the same repo). Those
|
|
37
|
-
* two must agree, so they read the same constant.
|
|
38
|
-
*/
|
|
39
|
-
export declare const SCAFFOLD_STACK_NAME = "CanopyCms";
|
|
40
30
|
export declare function dockerfileCms(options: {
|
|
41
31
|
copy: string;
|
|
42
32
|
install: string;
|
package/dist/cli/templates.js
CHANGED
|
@@ -71,9 +71,9 @@ export async function aiRoute(options) {
|
|
|
71
71
|
const template = await readTemplate('ai-route.ts.template');
|
|
72
72
|
return template.replace('{{CONFIG_IMPORT}}', options.configImport);
|
|
73
73
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return readTemplate(
|
|
74
|
+
/** One passthrough for every auth mode; it carries the opt-in `clerkMiddleware` as a comment. */
|
|
75
|
+
export async function middleware() {
|
|
76
|
+
return readTemplate('middleware.ts.template');
|
|
77
77
|
}
|
|
78
78
|
export async function nextConfig(options) {
|
|
79
79
|
const templateName = options.staticBuild
|
|
@@ -89,7 +89,7 @@ export async function nextConfig(options) {
|
|
|
89
89
|
* also deploy any unrelated stacks an adopter keeps in the same repo). Those
|
|
90
90
|
* two must agree, so they read the same constant.
|
|
91
91
|
*/
|
|
92
|
-
|
|
92
|
+
const SCAFFOLD_STACK_NAME = 'CanopyCms';
|
|
93
93
|
export async function dockerfileCms(options) {
|
|
94
94
|
const template = await readTemplate('Dockerfile.cms.template');
|
|
95
95
|
return template
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { CanopyClientConfig } from './config/index.js';
|
|
1
|
+
export type { CanopyClientConfig, EditorSignInProps } from './config/index.js';
|
|
2
2
|
export type { CustomFieldRenderers, CustomFieldRenderProps } from './editor/FormRenderer.js';
|
|
3
3
|
export * from './editor/EditorPanes.js';
|
|
4
4
|
export * from './editor/EntryNavigator.js';
|
package/dist/comment-store.d.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error thrown when a concurrent modification is detected.
|
|
3
|
-
* Operations that encounter this error will automatically retry.
|
|
4
|
-
*/
|
|
5
|
-
export declare class CommentStoreConflictError extends Error {
|
|
6
|
-
constructor();
|
|
7
|
-
}
|
|
8
1
|
export type CommentType = 'field' | 'entry' | 'branch';
|
|
9
|
-
|
|
2
|
+
interface Comment {
|
|
10
3
|
id: string;
|
|
11
4
|
threadId: string;
|
|
12
5
|
userId: string;
|
|
@@ -32,28 +25,23 @@ export interface CommentsFile {
|
|
|
32
25
|
threads: Record<string, CommentThread>;
|
|
33
26
|
}
|
|
34
27
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
28
|
+
* Comment storage for a branch workspace, in .canopy-meta/comments.json and
|
|
29
|
+
* never committed to git.
|
|
37
30
|
*
|
|
38
|
-
* Mutators
|
|
31
|
+
* Mutators run under three layers, outermost to innermost:
|
|
39
32
|
*
|
|
40
|
-
* 1. {@link withLock}
|
|
41
|
-
* path
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* 3. {@link withOccRetry} around {@link writeOccJsonFile} - version/writeId
|
|
51
|
-
* based optimistic concurrency control. With layers 1-2 in place this is
|
|
52
|
-
* now a defense-in-depth backstop only (e.g. a stale process from a
|
|
53
|
-
* rolling deploy writing without the lock), not the primary safety
|
|
54
|
-
* mechanism.
|
|
33
|
+
* 1. {@link withLock} — an in-process FIFO mutex keyed by the resolved file
|
|
34
|
+
* path, so mutators racing on one host cannot interleave their
|
|
35
|
+
* load-modify-write cycles, whether they share a store instance or not.
|
|
36
|
+
* 2. {@link withOccFileLock} — a server-enforced, cross-process/cross-host lock
|
|
37
|
+
* (proper-lockfile, mkdir-based). This is what actually prevents lost
|
|
38
|
+
* comments across two warm Lambda containers on EFS, where rename-based OCC
|
|
39
|
+
* verification alone is unreliable.
|
|
40
|
+
* 3. {@link withOccRetry} around {@link writeOccJsonFile} — version/writeId
|
|
41
|
+
* optimistic concurrency. With layers 1-2 in place it is defense in depth
|
|
42
|
+
* only, for a writer that skips the lock (a stale process mid-deploy).
|
|
55
43
|
*
|
|
56
|
-
*
|
|
44
|
+
* Guarantees for layers 2-3: `utils/occ-json-write.ts`.
|
|
57
45
|
*/
|
|
58
46
|
export declare class CommentStore {
|
|
59
47
|
private readonly filePath;
|
|
@@ -61,34 +49,30 @@ export declare class CommentStore {
|
|
|
61
49
|
constructor(branchRoot: string, options?: {
|
|
62
50
|
settleMs?: number;
|
|
63
51
|
});
|
|
64
|
-
/**
|
|
65
|
-
* Load comments file for read-only access.
|
|
66
|
-
*/
|
|
52
|
+
/** Read-only load. */
|
|
67
53
|
load(): Promise<CommentsFile>;
|
|
68
54
|
/**
|
|
69
|
-
* Load
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* concurrent mutate cycles on the same instance never clobber each other's
|
|
73
|
-
* expected version).
|
|
55
|
+
* Load, with the version observed at load time. Mutators thread that version
|
|
56
|
+
* through their load-modify-write cycle as a LOCAL value, never as instance
|
|
57
|
+
* state, so concurrent cycles cannot clobber each other's expected version.
|
|
74
58
|
*/
|
|
75
59
|
private loadWithVersion;
|
|
76
60
|
/**
|
|
77
|
-
* Write comments
|
|
61
|
+
* Write comments.json via the shared OCC helper.
|
|
78
62
|
*
|
|
79
|
-
* Throws the helper's raw {@link OccWriteConflictError}
|
|
80
|
-
* {@link withOccRetry} in withMutation() recognizes and retries
|
|
81
|
-
* translation to the public `CommentStoreConflictError`
|
|
82
|
-
*
|
|
63
|
+
* Throws the helper's raw {@link OccWriteConflictError}, which is what the
|
|
64
|
+
* surrounding {@link withOccRetry} in withMutation() recognizes and retries;
|
|
65
|
+
* translation to the public `CommentStoreConflictError` happens at the
|
|
66
|
+
* withMutation() boundary, once retries are exhausted.
|
|
83
67
|
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
68
|
+
* comments.json is written without a trailing newline (`writeOccJsonFile`'s
|
|
69
|
+
* default), unlike branch.json.
|
|
86
70
|
*/
|
|
87
71
|
private writeData;
|
|
88
72
|
/**
|
|
89
73
|
* Run a mutate cycle (load -> modify -> write) under the full lock +
|
|
90
|
-
* OCC-retry stack
|
|
91
|
-
*
|
|
74
|
+
* OCC-retry stack (class doc). A conflict surviving every retry surfaces as
|
|
75
|
+
* `CommentStoreConflictError`.
|
|
92
76
|
*/
|
|
93
77
|
private withMutation;
|
|
94
78
|
addComment(options: {
|
|
@@ -108,16 +92,11 @@ export declare class CommentStore {
|
|
|
108
92
|
}): Promise<CommentThread[]>;
|
|
109
93
|
getThread(threadId: string): Promise<CommentThread | null>;
|
|
110
94
|
deleteThread(threadId: string): Promise<boolean>;
|
|
111
|
-
/**
|
|
112
|
-
* Get all threads for a specific field
|
|
113
|
-
*/
|
|
95
|
+
/** Threads on one field. */
|
|
114
96
|
getThreadsForField(entryPath: string, canopyPath: string): Promise<CommentThread[]>;
|
|
115
|
-
/**
|
|
116
|
-
* Get all threads for a specific entry (not field-specific)
|
|
117
|
-
*/
|
|
97
|
+
/** Threads on one entry, excluding its field threads. */
|
|
118
98
|
getThreadsForEntry(entryPath: string): Promise<CommentThread[]>;
|
|
119
|
-
/**
|
|
120
|
-
* Get all branch-level threads
|
|
121
|
-
*/
|
|
99
|
+
/** Branch-level threads. */
|
|
122
100
|
getBranchThreads(): Promise<CommentThread[]>;
|
|
123
101
|
}
|
|
102
|
+
export {};
|