canopycms 0.0.68-int.98 → 0.1.0
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/CHANGELOG.md +2131 -0
- package/README.md +47 -63
- package/dist/ai/generate.d.ts +5 -0
- package/dist/ai/generate.js +244 -115
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/json-to-markdown.d.ts +21 -1
- package/dist/ai/json-to-markdown.js +120 -57
- package/dist/ai/references.d.ts +72 -0
- package/dist/ai/references.js +223 -0
- package/dist/ai/resolve-branch.js +9 -2
- package/dist/ai/to-plain-text.d.ts +17 -8
- package/dist/ai/to-plain-text.js +18 -15
- package/dist/ai/types.d.ts +84 -3
- package/dist/api/admin-branch-health.d.ts +24 -1
- package/dist/api/admin-branch-health.js +52 -20
- package/dist/api/admin.d.ts +23 -5
- package/dist/api/admin.js +36 -1
- package/dist/api/assets.js +88 -78
- package/dist/api/branch-create-window.d.ts +12 -0
- package/dist/api/branch-create-window.js +13 -0
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +1 -1
- package/dist/api/branch-review.d.ts +3 -3
- package/dist/api/branch-review.js +16 -7
- package/dist/api/branch-status.d.ts +16 -6
- package/dist/api/branch-status.js +57 -12
- package/dist/api/branch-withdraw.d.ts +2 -2
- package/dist/api/branch-withdraw.js +8 -3
- package/dist/api/branch.d.ts +25 -12
- package/dist/api/branch.js +164 -103
- package/dist/api/client.d.ts +78 -58
- package/dist/api/client.js +150 -117
- package/dist/api/comments.d.ts +12 -3
- package/dist/api/comments.js +118 -9
- package/dist/api/content.d.ts +9 -9
- package/dist/api/content.js +131 -22
- package/dist/api/entries-constants.d.ts +14 -3
- package/dist/api/entries-constants.js +14 -3
- package/dist/api/entries.d.ts +40 -2
- package/dist/api/entries.js +102 -6
- package/dist/api/github-sync.d.ts +19 -0
- package/dist/api/github-sync.js +50 -3
- package/dist/api/groups.d.ts +4 -4
- package/dist/api/groups.js +2 -1
- package/dist/api/guards.js +23 -3
- package/dist/api/index.d.ts +3 -1
- package/dist/api/index.js +1 -0
- package/dist/api/permissions.d.ts +21 -2
- package/dist/api/permissions.js +50 -3
- package/dist/api/request-deadline.d.ts +59 -0
- package/dist/api/request-deadline.js +73 -0
- package/dist/api/resolve-references.js +8 -7
- package/dist/api/route-builder.d.ts +14 -0
- package/dist/api/route-builder.js +14 -1
- package/dist/api/schema.d.ts +11 -9
- package/dist/api/schema.js +2 -0
- package/dist/api/settings-helpers.d.ts +5 -1
- package/dist/api/settings-helpers.js +10 -2
- package/dist/api/types.d.ts +18 -0
- package/dist/api/users-constants.d.ts +6 -0
- package/dist/api/users-constants.js +6 -0
- package/dist/assets/asset-url.d.ts +28 -16
- package/dist/assets/asset-url.js +51 -25
- package/dist/assets/finalize.js +3 -0
- package/dist/assets/index.d.ts +1 -1
- package/dist/assets/materialize.d.ts +153 -0
- package/dist/assets/materialize.js +402 -0
- package/dist/assets/store-local.d.ts +19 -5
- package/dist/assets/store-local.js +69 -10
- package/dist/assets/store-s3.d.ts +38 -7
- package/dist/assets/store-s3.js +128 -22
- package/dist/assets/transform-directives.d.ts +52 -13
- package/dist/assets/transform-directives.js +87 -27
- package/dist/assets/transform.d.ts +3 -3
- package/dist/assets/transform.js +13 -8
- package/dist/assets/types.d.ts +31 -4
- package/dist/auth/cache.d.ts +1 -1
- package/dist/auth/cache.js +1 -1
- package/dist/auth/caching-auth-plugin.d.ts +2 -0
- package/dist/auth/caching-auth-plugin.js +12 -2
- package/dist/auth/file-based-auth-cache.d.ts +8 -0
- package/dist/auth/file-based-auth-cache.js +18 -8
- package/dist/auth/person-name.d.ts +5 -0
- package/dist/auth/person-name.js +8 -0
- package/dist/auth/plugin.d.ts +10 -1
- package/dist/auth/types.d.ts +2 -0
- package/dist/auth/user-metadata-lookup.d.ts +21 -0
- package/dist/auth/user-metadata-lookup.js +116 -0
- package/dist/authorization/branch.d.ts +1 -1
- package/dist/authorization/branch.js +12 -13
- package/dist/authorization/groups/schema.d.ts +4 -4
- package/dist/authorization/helpers.d.ts +8 -0
- package/dist/authorization/helpers.js +8 -0
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.js +1 -1
- package/dist/authorization/protected-branch.d.ts +5 -4
- package/dist/authorization/protected-branch.js +7 -5
- package/dist/branch-health.d.ts +35 -8
- package/dist/branch-health.js +54 -18
- package/dist/branch-metadata-error.d.ts +27 -0
- package/dist/branch-metadata-error.js +23 -0
- package/dist/branch-metadata-file.d.ts +205 -24
- package/dist/branch-metadata-file.js +126 -25
- package/dist/branch-metadata.d.ts +45 -6
- package/dist/branch-metadata.js +142 -50
- package/dist/branch-provisioning.d.ts +167 -0
- package/dist/branch-provisioning.js +501 -0
- package/dist/branch-registry.d.ts +8 -0
- package/dist/branch-registry.js +61 -9
- package/dist/branch-schema-cache.d.ts +29 -12
- package/dist/branch-schema-cache.js +64 -21
- package/dist/branch-sparse.d.ts +23 -0
- package/dist/branch-sparse.js +118 -0
- package/dist/branch-workspace.d.ts +42 -3
- package/dist/branch-workspace.js +239 -100
- package/dist/build/asset-refs.d.ts +94 -0
- package/dist/build/asset-refs.js +267 -0
- package/dist/build/generate-ai-content.js +5 -0
- package/dist/build/inline-flight.d.ts +37 -0
- package/dist/build/inline-flight.js +142 -0
- package/dist/cli/asset-refs.d.ts +52 -0
- package/dist/cli/asset-refs.js +194 -0
- package/dist/cli/cli.d.ts +15 -1
- package/dist/cli/cli.js +8543 -3193
- package/dist/cli/configured-asset-store.d.ts +12 -0
- package/dist/cli/configured-asset-store.js +46 -0
- package/dist/cli/generate-ai-content.js +4244 -1072
- package/dist/cli/init.js +217 -126
- package/dist/cli/project-detect.d.ts +2 -0
- package/dist/cli/project-detect.js +2 -0
- package/dist/cli/template-files/Dockerfile.cms.template +13 -5
- package/dist/cli/template-files/cms-stack.ts.template +16 -13
- package/dist/client.d.ts +1 -2
- package/dist/client.js +1 -2
- package/dist/comment-store.d.ts +25 -0
- package/dist/comment-store.js +43 -8
- package/dist/config/flatten.js +2 -0
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schemas/config.d.ts +12 -29
- package/dist/config/schemas/config.js +9 -12
- package/dist/config/schemas/field.d.ts +3 -0
- package/dist/config/schemas/field.js +58 -4
- package/dist/config/schemas/media.d.ts +4 -13
- package/dist/config/schemas/media.js +5 -8
- package/dist/config/schemas/url.d.ts +2 -20
- package/dist/config/schemas/url.js +2 -25
- package/dist/config/types.d.ts +116 -22
- package/dist/config/types.js +3 -9
- package/dist/config/validation.d.ts +25 -4
- package/dist/config/validation.js +116 -3
- package/dist/content-id-index.js +2 -2
- package/dist/content-index-generation.d.ts +1 -1
- package/dist/content-index-generation.js +1 -1
- package/dist/content-listing.d.ts +10 -1
- package/dist/content-listing.js +22 -5
- package/dist/content-reader.d.ts +9 -0
- package/dist/content-reader.js +16 -11
- package/dist/content-store.d.ts +75 -12
- package/dist/content-store.js +249 -86
- package/dist/content-tree.js +2 -2
- package/dist/context.js +5 -2
- package/dist/dangling-reference-log.d.ts +17 -0
- package/dist/dangling-reference-log.js +29 -0
- package/dist/dev-content-watcher.d.ts +1 -1
- package/dist/dev-content-watcher.js +1 -1
- package/dist/editor/BranchManager.d.ts +23 -7
- package/dist/editor/BranchManager.js +119 -54
- package/dist/editor/CanopyEditor.d.ts +1 -1
- package/dist/editor/CanopyEditor.js +1 -2
- package/dist/editor/CommentsPanel.d.ts +14 -0
- package/dist/editor/CommentsPanel.js +68 -43
- package/dist/editor/Editor.d.ts +11 -5
- package/dist/editor/Editor.js +891 -218
- package/dist/editor/EditorAuthGate.d.ts +7 -1
- package/dist/editor/EditorAuthGate.js +41 -9
- package/dist/editor/EntryNavigator.d.ts +22 -0
- package/dist/editor/EntryNavigator.js +353 -105
- package/dist/editor/FormHeader.d.ts +25 -0
- package/dist/editor/FormHeader.js +82 -0
- package/dist/editor/FormRenderer.d.ts +27 -3
- package/dist/editor/FormRenderer.js +171 -76
- package/dist/editor/PreviewFrame.d.ts +40 -0
- package/dist/editor/PreviewFrame.js +215 -0
- package/dist/editor/PreviewPane.d.ts +47 -0
- package/dist/editor/PreviewPane.js +147 -0
- package/dist/editor/PreviewToolbarTools.d.ts +22 -0
- package/dist/editor/PreviewToolbarTools.js +73 -0
- package/dist/editor/admin/SystemHealthPanel.d.ts +2 -1
- package/dist/editor/admin/SystemHealthPanel.js +163 -33
- package/dist/editor/admin/useSystemHealth.d.ts +18 -0
- package/dist/editor/admin/useSystemHealth.js +70 -1
- package/dist/editor/branch-status.d.ts +17 -0
- package/dist/editor/branch-status.js +29 -0
- package/dist/editor/canopy-path.d.ts +9 -6
- package/dist/editor/canopy-path.js +8 -11
- package/dist/editor/client-reference-resolver.d.ts +43 -16
- package/dist/editor/client-reference-resolver.js +155 -64
- package/dist/editor/comments/BranchComments.d.ts +1 -1
- package/dist/editor/comments/BranchComments.js +2 -2
- package/dist/editor/comments/CloseRefusedNotice.d.ts +4 -0
- package/dist/editor/comments/CloseRefusedNotice.js +7 -0
- package/dist/editor/comments/CommentThreadsPopover.d.ts +47 -0
- package/dist/editor/comments/CommentThreadsPopover.js +274 -0
- package/dist/editor/comments/CommentWriteAlert.d.ts +11 -0
- package/dist/editor/comments/CommentWriteAlert.js +13 -0
- package/dist/editor/comments/EntryComments.d.ts +10 -4
- package/dist/editor/comments/EntryComments.js +14 -17
- package/dist/editor/comments/FieldWrapper.d.ts +18 -4
- package/dist/editor/comments/FieldWrapper.js +62 -28
- package/dist/editor/comments/InlineCommentThread.d.ts +9 -2
- package/dist/editor/comments/InlineCommentThread.js +11 -47
- package/dist/editor/comments/ThreadCarousel.d.ts +1 -1
- package/dist/editor/comments/ThreadCarousel.js +18 -21
- package/dist/editor/comments/ThreadReplyControls.d.ts +28 -0
- package/dist/editor/comments/ThreadReplyControls.js +92 -0
- package/dist/editor/comments/field-comment-context.d.ts +14 -0
- package/dist/editor/comments/field-comment-context.js +14 -0
- package/dist/editor/comments/form-comments.d.ts +48 -0
- package/dist/editor/comments/form-comments.js +178 -0
- package/dist/editor/comments/item-anchor-copy.d.ts +6 -0
- package/dist/editor/comments/item-anchor-copy.js +6 -0
- package/dist/editor/comments/move-focus-if-unmoved.d.ts +6 -0
- package/dist/editor/comments/move-focus-if-unmoved.js +11 -0
- package/dist/editor/comments/popover-placement.d.ts +18 -0
- package/dist/editor/comments/popover-placement.js +58 -0
- package/dist/editor/comments/use-tracked-writes.d.ts +16 -0
- package/dist/editor/comments/use-tracked-writes.js +53 -0
- package/dist/editor/components/BranchAccessList.d.ts +15 -0
- package/dist/editor/components/BranchAccessList.js +52 -0
- package/dist/editor/components/BranchLockBanner.d.ts +22 -0
- package/dist/editor/components/BranchLockBanner.js +39 -0
- package/dist/editor/components/BranchPill.d.ts +32 -0
- package/dist/editor/components/BranchPill.js +33 -0
- package/dist/editor/components/BranchesDrawer.d.ts +11 -0
- package/dist/editor/components/BranchesDrawer.js +5 -0
- package/dist/editor/components/ConfirmDeleteModal.d.ts +6 -1
- package/dist/editor/components/ConfirmDeleteModal.js +3 -2
- package/dist/editor/components/DestructiveMenuItem.d.ts +7 -0
- package/dist/editor/components/DestructiveMenuItem.js +8 -0
- package/dist/editor/components/EditorCrashScreen.d.ts +17 -0
- package/dist/editor/components/EditorCrashScreen.js +22 -0
- package/dist/editor/components/EditorErrorBoundary.d.ts +38 -0
- package/dist/editor/components/EditorErrorBoundary.js +40 -0
- package/dist/editor/components/EditorHeader.d.ts +56 -106
- package/dist/editor/components/EditorHeader.js +130 -131
- package/dist/editor/components/EditorRail.d.ts +49 -0
- package/dist/editor/components/EditorRail.js +65 -0
- package/dist/editor/components/EntryBreadcrumb.d.ts +33 -0
- package/dist/editor/components/EntryBreadcrumb.js +56 -0
- package/dist/editor/components/EntryCreateModal.d.ts +12 -7
- package/dist/editor/components/EntryCreateModal.js +51 -57
- package/dist/editor/components/NoEditPermissionNotice.d.ts +6 -5
- package/dist/editor/components/NoEditPermissionNotice.js +5 -4
- package/dist/editor/components/QuickOpenPalette.d.ts +22 -0
- package/dist/editor/components/QuickOpenPalette.js +66 -0
- package/dist/editor/components/ReadOnlyDraftNotice.d.ts +11 -0
- package/dist/editor/components/ReadOnlyDraftNotice.js +12 -0
- package/dist/editor/components/ReasonedMenuItem.d.ts +15 -0
- package/dist/editor/components/ReasonedMenuItem.js +15 -0
- package/dist/editor/components/ReferencedByList.d.ts +11 -0
- package/dist/editor/components/ReferencedByList.js +28 -0
- package/dist/editor/components/RelativeTime.d.ts +10 -0
- package/dist/editor/components/RelativeTime.js +10 -0
- package/dist/editor/components/RenameEntryModal.d.ts +9 -1
- package/dist/editor/components/RenameEntryModal.js +19 -31
- package/dist/editor/components/RetryToastMessage.d.ts +9 -0
- package/dist/editor/components/RetryToastMessage.js +6 -0
- package/dist/editor/components/SaveAllResult.d.ts +25 -0
- package/dist/editor/components/SaveAllResult.js +86 -0
- package/dist/editor/components/SaveSplitButton.d.ts +30 -0
- package/dist/editor/components/SaveSplitButton.js +108 -0
- package/dist/editor/components/StagedChangesDrawer.d.ts +39 -0
- package/dist/editor/components/StagedChangesDrawer.js +92 -0
- package/dist/editor/components/UnavailableEntryNotice.d.ts +6 -0
- package/dist/editor/components/UnavailableEntryNotice.js +9 -0
- package/dist/editor/components/UnavailableTypeMessage.d.ts +6 -0
- package/dist/editor/components/UnavailableTypeMessage.js +9 -0
- package/dist/editor/components/UndoToastMessage.d.ts +18 -0
- package/dist/editor/components/UndoToastMessage.js +10 -0
- package/dist/editor/components/UserBadge.d.ts +2 -5
- package/dist/editor/components/UserBadge.js +62 -33
- package/dist/editor/components/ValidationSummary.d.ts +14 -0
- package/dist/editor/components/ValidationSummary.js +24 -0
- package/dist/editor/components/index.d.ts +2 -2
- package/dist/editor/components/index.js +2 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -2
- package/dist/editor/context/ApiClientContext.js +19 -8
- package/dist/editor/context/AssetContext.d.ts +13 -35
- package/dist/editor/context/AssetContext.js +12 -31
- package/dist/editor/context/EditorStateContext.d.ts +4 -4
- package/dist/editor/context/EditorStateContext.js +4 -4
- package/dist/editor/context/SWRProvider.d.ts +3 -3
- package/dist/editor/context/SiteMdxAllowContext.d.ts +4 -0
- package/dist/editor/context/SiteMdxAllowContext.js +7 -0
- package/dist/editor/context/index.d.ts +2 -1
- package/dist/editor/context/index.js +2 -1
- package/dist/editor/contrast.d.ts +19 -0
- package/dist/editor/contrast.js +41 -0
- package/dist/editor/copy.d.ts +18 -0
- package/dist/editor/copy.js +18 -0
- package/dist/editor/editor-config.js +16 -0
- package/dist/editor/editor-utils.d.ts +34 -8
- package/dist/editor/editor-utils.js +42 -20
- package/dist/editor/entry-search.d.ts +20 -0
- package/dist/editor/entry-search.js +34 -0
- package/dist/editor/field-breadcrumb.d.ts +12 -0
- package/dist/editor/field-breadcrumb.js +85 -0
- package/dist/editor/field-props.d.ts +86 -0
- package/dist/editor/field-props.js +27 -0
- package/dist/editor/field-target.d.ts +30 -0
- package/dist/editor/field-target.js +77 -0
- package/dist/editor/fields/BlockField.d.ts +12 -0
- package/dist/editor/fields/BlockField.js +89 -73
- package/dist/editor/fields/CodeField.d.ts +2 -0
- package/dist/editor/fields/CodeField.js +6 -2
- package/dist/editor/fields/DateTimeField.d.ts +4 -29
- package/dist/editor/fields/DateTimeField.js +79 -41
- package/dist/editor/fields/ExpandAllButton.d.ts +6 -0
- package/dist/editor/fields/ExpandAllButton.js +4 -0
- package/dist/editor/fields/FieldCrashFallback.d.ts +17 -0
- package/dist/editor/fields/FieldCrashFallback.js +30 -0
- package/dist/editor/fields/FieldLabel.d.ts +37 -0
- package/dist/editor/fields/FieldLabel.js +19 -0
- package/dist/editor/fields/ImageField.d.ts +4 -0
- package/dist/editor/fields/ImageField.js +29 -14
- package/dist/editor/fields/InlineGroupField.js +4 -3
- package/dist/editor/fields/ItemList.d.ts +42 -0
- package/dist/editor/fields/ItemList.js +130 -0
- package/dist/editor/fields/MarkdownField.d.ts +32 -0
- package/dist/editor/fields/MarkdownField.js +223 -46
- package/dist/editor/fields/MdxImageDialog.js +1 -1
- package/dist/editor/fields/NumberField.d.ts +2 -0
- package/dist/editor/fields/NumberField.js +8 -5
- package/dist/editor/fields/NumberListField.d.ts +2 -0
- package/dist/editor/fields/NumberListField.js +19 -16
- package/dist/editor/fields/ObjectField.d.ts +2 -7
- package/dist/editor/fields/ObjectField.js +15 -5
- package/dist/editor/fields/ObjectListField.d.ts +29 -0
- package/dist/editor/fields/ObjectListField.js +57 -0
- package/dist/editor/fields/ReferenceField.d.ts +2 -0
- package/dist/editor/fields/ReferenceField.js +34 -9
- package/dist/editor/fields/SelectField.d.ts +2 -0
- package/dist/editor/fields/SelectField.js +11 -2
- package/dist/editor/fields/StringListField.d.ts +4 -1
- package/dist/editor/fields/StringListField.js +22 -8
- package/dist/editor/fields/TextField.d.ts +2 -0
- package/dist/editor/fields/TextField.js +6 -2
- package/dist/editor/fields/ToggleField.d.ts +2 -0
- package/dist/editor/fields/ToggleField.js +8 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +1 -1
- package/dist/editor/fields/entry-link/InsertEntryLink.js +1 -1
- package/dist/editor/fields/form-expansion.d.ts +9 -0
- package/dist/editor/fields/form-expansion.js +2 -0
- package/dist/editor/fields/item-expansion.d.ts +15 -0
- package/dist/editor/fields/item-expansion.js +60 -0
- package/dist/editor/fields/list-item-keys.d.ts +8 -0
- package/dist/editor/fields/list-item-keys.js +50 -0
- package/dist/editor/fields/list-item-title.d.ts +20 -0
- package/dist/editor/fields/list-item-title.js +85 -0
- package/dist/editor/fields/markdown-export-options.d.ts +2 -0
- package/dist/editor/fields/markdown-export-options.js +8 -0
- package/dist/editor/fields/markdown-fidelity-visitors.d.ts +11 -0
- package/dist/editor/fields/markdown-fidelity-visitors.js +160 -0
- package/dist/editor/fields/mdx-jsx-support.d.ts +5 -1
- package/dist/editor/fields/mdx-jsx-support.js +157 -69
- package/dist/editor/fields/rich-text-failures.d.ts +5 -0
- package/dist/editor/fields/rich-text-failures.js +26 -0
- package/dist/editor/fields/toolbar-wrap.d.ts +7 -0
- package/dist/editor/fields/toolbar-wrap.js +35 -0
- package/dist/editor/form-outline.d.ts +13 -0
- package/dist/editor/form-outline.js +70 -0
- package/dist/editor/group-manager/GroupCard.d.ts +4 -1
- package/dist/editor/group-manager/GroupCard.js +12 -3
- package/dist/editor/group-manager/GroupForm.js +1 -1
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +2 -1
- package/dist/editor/group-manager/InternalGroupsTab.js +4 -4
- package/dist/editor/group-manager/MemberList.d.ts +2 -1
- package/dist/editor/group-manager/MemberList.js +15 -4
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +5 -0
- package/dist/editor/group-manager/hooks/useGroupState.js +30 -7
- package/dist/editor/group-manager/index.js +34 -5
- package/dist/editor/group-manager/types.d.ts +5 -2
- package/dist/editor/hooks/create-branch-request.d.ts +20 -0
- package/dist/editor/hooks/create-branch-request.js +54 -0
- package/dist/editor/hooks/save-all.d.ts +68 -0
- package/dist/editor/hooks/save-all.js +61 -0
- package/dist/editor/hooks/useBranchActions.d.ts +11 -1
- package/dist/editor/hooks/useBranchActions.js +42 -19
- package/dist/editor/hooks/useBranchManager.d.ts +21 -0
- package/dist/editor/hooks/useBranchManager.js +321 -125
- package/dist/editor/hooks/useBranchesData.d.ts +8 -4
- package/dist/editor/hooks/useBranchesData.js +9 -5
- package/dist/editor/hooks/useCommentSystem.d.ts +14 -2
- package/dist/editor/hooks/useCommentSystem.js +79 -55
- package/dist/editor/hooks/useCommentsData.d.ts +11 -7
- package/dist/editor/hooks/useCommentsData.js +20 -19
- package/dist/editor/hooks/useDraftManager.d.ts +77 -3
- package/dist/editor/hooks/useDraftManager.js +887 -94
- package/dist/editor/hooks/useEditorLayout.d.ts +53 -7
- package/dist/editor/hooks/useEditorLayout.js +98 -20
- package/dist/editor/hooks/useEntriesData.d.ts +2 -1
- package/dist/editor/hooks/useEntriesData.js +18 -4
- package/dist/editor/hooks/useEntryManager.d.ts +41 -2
- package/dist/editor/hooks/useEntryManager.js +227 -41
- package/dist/editor/hooks/useGroupManager.js +13 -16
- package/dist/editor/hooks/usePermissionManager.js +14 -6
- package/dist/editor/hooks/usePreviewMarks.d.ts +21 -0
- package/dist/editor/hooks/usePreviewMarks.js +33 -0
- package/dist/editor/hooks/useReferenceResolution.d.ts +10 -3
- package/dist/editor/hooks/useReferenceResolution.js +34 -177
- package/dist/editor/hooks/useSchemaManager.d.ts +25 -6
- package/dist/editor/hooks/useSchemaManager.js +97 -39
- package/dist/editor/hooks/useUserMetadata.d.ts +14 -4
- package/dist/editor/hooks/useUserMetadata.js +76 -47
- package/dist/editor/hooks/user-metadata-batcher.d.ts +8 -0
- package/dist/editor/hooks/user-metadata-batcher.js +33 -0
- package/dist/editor/media/AssetCard.d.ts +6 -7
- package/dist/editor/media/AssetCard.js +24 -31
- package/dist/editor/media/AssetListRow.d.ts +16 -0
- package/dist/editor/media/AssetListRow.js +41 -0
- package/dist/editor/media/CropStep.js +6 -1
- package/dist/editor/media/MediaLibrary.d.ts +4 -3
- package/dist/editor/media/MediaLibrary.js +11 -4
- package/dist/editor/media/MediaLibraryBody.d.ts +3 -3
- package/dist/editor/media/MediaLibraryBody.js +195 -80
- package/dist/editor/media/MediaLibrarySkeleton.d.ts +6 -0
- package/dist/editor/media/MediaLibrarySkeleton.js +14 -0
- package/dist/editor/media/crop-math.d.ts +3 -4
- package/dist/editor/media/crop-math.js +11 -22
- package/dist/editor/media/editor-image-src.d.ts +8 -0
- package/dist/editor/media/editor-image-src.js +10 -0
- package/dist/editor/media/format-bytes.d.ts +2 -0
- package/dist/editor/media/format-bytes.js +23 -0
- package/dist/editor/media/media-library-prefs.d.ts +23 -0
- package/dist/editor/media/media-library-prefs.js +49 -0
- package/dist/editor/media/media-library-view.d.ts +34 -0
- package/dist/editor/media/media-library-view.js +40 -0
- package/dist/editor/media/useAssetLibrary.d.ts +30 -0
- package/dist/editor/media/useAssetLibrary.js +126 -0
- package/dist/editor/media/useStableAssetOrder.d.ts +11 -0
- package/dist/editor/media/useStableAssetOrder.js +37 -0
- package/dist/editor/media/useThumbnailFailure.d.ts +6 -0
- package/dist/editor/media/useThumbnailFailure.js +16 -0
- package/dist/editor/permission-manager/GroupSelector.js +2 -2
- package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -1
- package/dist/editor/permission-manager/PermissionEditor.js +15 -4
- package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
- package/dist/editor/permission-manager/PermissionTree.d.ts +1 -1
- package/dist/editor/permission-manager/UserSelector.d.ts +1 -1
- package/dist/editor/permission-manager/UserSelector.js +3 -3
- package/dist/editor/permission-manager/index.js +12 -3
- package/dist/editor/permission-manager/types.d.ts +5 -2
- package/dist/editor/platform.d.ts +3 -0
- package/dist/editor/platform.js +9 -0
- package/dist/editor/preview-asset-base.d.ts +9 -0
- package/dist/editor/preview-asset-base.js +17 -0
- package/dist/editor/preview-bridge.d.ts +51 -27
- package/dist/editor/preview-bridge.js +103 -144
- package/dist/editor/preview-marks.d.ts +15 -0
- package/dist/editor/preview-marks.js +74 -0
- package/dist/editor/preview-path.d.ts +12 -0
- package/dist/editor/preview-path.js +45 -1
- package/dist/editor/preview-scale.d.ts +27 -0
- package/dist/editor/preview-scale.js +34 -0
- package/dist/editor/raw-asset-base.d.ts +5 -0
- package/dist/editor/raw-asset-base.js +14 -0
- package/dist/editor/relative-time.d.ts +4 -4
- package/dist/editor/relative-time.js +16 -8
- package/dist/editor/schema-editor/CollectionEditor.d.ts +20 -3
- package/dist/editor/schema-editor/CollectionEditor.js +361 -62
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +5 -1
- package/dist/editor/schema-editor/EntryTypeEditor.js +11 -6
- package/dist/editor/schema-editor/collection-draft.d.ts +22 -0
- package/dist/editor/schema-editor/collection-draft.js +40 -0
- package/dist/editor/schema-editor/index.d.ts +1 -1
- package/dist/editor/schema-label.d.ts +10 -0
- package/dist/editor/schema-label.js +17 -0
- package/dist/editor/settings-conflict.d.ts +5 -0
- package/dist/editor/settings-conflict.js +8 -0
- package/dist/editor/shell/ActivityRail.d.ts +37 -0
- package/dist/editor/shell/ActivityRail.js +91 -0
- package/dist/editor/shell/EditorShell.d.ts +17 -0
- package/dist/editor/shell/EditorShell.js +31 -0
- package/dist/editor/shell/PaneLayout.d.ts +28 -0
- package/dist/editor/shell/PaneLayout.js +116 -0
- package/dist/editor/shell/SidePanelHost.d.ts +35 -0
- package/dist/editor/shell/SidePanelHost.js +184 -0
- package/dist/editor/shell/TopBar.d.ts +12 -0
- package/dist/editor/shell/TopBar.js +14 -0
- package/dist/editor/shell/host-chrome.d.ts +16 -0
- package/dist/editor/shell/host-chrome.js +69 -0
- package/dist/editor/slug.d.ts +16 -0
- package/dist/editor/slug.js +43 -0
- package/dist/editor/theme.d.ts +2 -1
- package/dist/editor/theme.js +314 -13
- package/dist/editor/unanswered.d.ts +17 -0
- package/dist/editor/unanswered.js +26 -0
- package/dist/editor/unavailable-entry-type.d.ts +20 -0
- package/dist/editor/unavailable-entry-type.js +28 -0
- package/dist/editor/undo-removal.d.ts +57 -0
- package/dist/editor/undo-removal.js +163 -0
- package/dist/editor/user-display.d.ts +4 -0
- package/dist/editor/user-display.js +5 -0
- package/dist/editor/utils/confirm-modal.d.ts +8 -0
- package/dist/editor/utils/confirm-modal.js +12 -0
- package/dist/editor/utils/editor-errors.d.ts +19 -0
- package/dist/editor/utils/editor-errors.js +32 -0
- package/dist/editor/utils/focus-return.d.ts +56 -0
- package/dist/editor/utils/focus-return.js +106 -0
- package/dist/entry-link-resolver.d.ts +11 -1
- package/dist/entry-link-resolver.js +65 -5
- package/dist/entry-schema-registry.d.ts +3 -3
- package/dist/entry-schema-registry.js +7 -4
- package/dist/entry-schema.d.ts +49 -3
- package/dist/entry-schema.js +18 -0
- package/dist/git-manager.d.ts +172 -10
- package/dist/git-manager.js +449 -107
- package/dist/github-service.d.ts +39 -2
- package/dist/github-service.js +101 -7
- package/dist/http/handler.js +74 -9
- package/dist/http/types.d.ts +2 -0
- package/dist/http/worker-not-ready.d.ts +9 -4
- package/dist/http/worker-not-ready.js +59 -6
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/item-keys.d.ts +46 -0
- package/dist/item-keys.js +235 -0
- package/dist/operating-mode/editor-mode-check.d.ts +15 -0
- package/dist/operating-mode/editor-mode-check.js +24 -0
- package/dist/operating-mode/mode-env.d.ts +13 -14
- package/dist/operating-mode/mode-env.js +13 -14
- package/dist/operating-mode/types.d.ts +2 -2
- package/dist/paths/branch.d.ts +0 -1
- package/dist/paths/branch.js +1 -8
- package/dist/paths/index.d.ts +1 -1
- package/dist/paths/index.js +1 -1
- package/dist/paths/validation.js +0 -2
- package/dist/preview.d.ts +8 -0
- package/dist/preview.js +7 -0
- package/dist/reference-resolver.js +1 -0
- package/dist/resolve-canopy-user.d.ts +1 -1
- package/dist/resolve-canopy-user.js +1 -1
- package/dist/schema/meta-loader.d.ts +18 -8
- package/dist/schema/meta-loader.js +42 -9
- package/dist/schema/registry-fingerprint.d.ts +14 -0
- package/dist/schema/registry-fingerprint.js +63 -0
- package/dist/schema/resolver.d.ts +7 -4
- package/dist/schema/resolver.js +7 -6
- package/dist/schema/schema-store.d.ts +7 -10
- package/dist/schema/schema-store.js +13 -11
- package/dist/schema/schema-unavailable-error.d.ts +11 -0
- package/dist/schema/schema-unavailable-error.js +15 -0
- package/dist/schema/types.d.ts +22 -0
- package/dist/schema-registry-record.d.ts +35 -0
- package/dist/schema-registry-record.js +134 -0
- package/dist/server.d.ts +79 -9
- package/dist/server.js +62 -8
- package/dist/services.d.ts +33 -5
- package/dist/services.js +155 -37
- package/dist/settings-workspace.d.ts +23 -3
- package/dist/settings-workspace.js +159 -45
- package/dist/stamp-on-publish.d.ts +36 -0
- package/dist/stamp-on-publish.js +71 -0
- package/dist/static/index.d.ts +58 -5
- package/dist/static/index.js +133 -3
- package/dist/static/seo.d.ts +5 -5
- package/dist/static/seo.js +5 -5
- package/dist/submission-attribution.d.ts +8 -0
- package/dist/submission-attribution.js +22 -0
- package/dist/system-users.d.ts +12 -0
- package/dist/system-users.js +12 -0
- package/dist/task-queue/cms-task-queue.d.ts +1 -1
- package/dist/task-queue/cms-task-queue.js +1 -1
- package/dist/task-queue/index.d.ts +1 -1
- package/dist/task-queue/index.js +1 -1
- package/dist/task-queue/task-queue.d.ts +6 -0
- package/dist/task-queue/task-queue.js +29 -0
- package/dist/task-queue/worker-status.d.ts +35 -9
- package/dist/task-queue/worker-status.js +84 -17
- package/dist/types.d.ts +90 -9
- package/dist/url-collision.js +3 -3
- package/dist/url-exclusivity-fixtures.d.ts +8 -1
- package/dist/url-exclusivity-fixtures.js +11 -1
- package/dist/user.js +2 -1
- package/dist/utils/atomic-write.js +2 -1
- package/dist/utils/base-branch.d.ts +13 -0
- package/dist/utils/base-branch.js +23 -0
- package/dist/utils/content-serialize.d.ts +15 -7
- package/dist/utils/content-serialize.js +353 -51
- package/dist/utils/content-write-lock.d.ts +6 -1
- package/dist/utils/content-write-lock.js +21 -6
- package/dist/utils/debug.d.ts +1 -1
- package/dist/utils/debug.js +5 -3
- package/dist/utils/error.js +13 -2
- package/dist/utils/escape-text.d.ts +7 -0
- package/dist/utils/escape-text.js +27 -0
- package/dist/utils/fs.d.ts +12 -4
- package/dist/utils/fs.js +18 -5
- package/dist/utils/git.d.ts +21 -1
- package/dist/utils/git.js +63 -8
- package/dist/utils/json-source-splice.d.ts +14 -0
- package/dist/utils/json-source-splice.js +120 -0
- package/dist/utils/markdown-body-splice.d.ts +39 -0
- package/dist/utils/markdown-body-splice.js +421 -0
- package/dist/utils/occ-json-write.js +18 -12
- package/dist/utils/provision-log.d.ts +25 -0
- package/dist/utils/provision-log.js +49 -0
- package/dist/utils/provisioning-lock.d.ts +32 -1
- package/dist/utils/provisioning-lock.js +78 -32
- package/dist/utils/sanitize-href.d.ts +9 -23
- package/dist/utils/sanitize-href.js +14 -28
- package/dist/utils/title-field.d.ts +10 -0
- package/dist/utils/title-field.js +47 -0
- package/dist/utils/yaml-source-splice.d.ts +58 -0
- package/dist/utils/yaml-source-splice.js +515 -0
- package/dist/validation/block-structural-keys.d.ts +1 -1
- package/dist/validation/block-structural-keys.js +1 -1
- package/dist/validation/deletion-checker.d.ts +21 -29
- package/dist/validation/deletion-checker.js +41 -117
- package/dist/validation/entry-validator.d.ts +6 -10
- package/dist/validation/entry-validator.js +19 -26
- package/dist/validation/field-traversal.d.ts +22 -0
- package/dist/validation/field-traversal.js +39 -8
- package/dist/validation/markdown-safety.d.ts +68 -0
- package/dist/validation/markdown-safety.js +596 -0
- package/dist/validation/mdx-allowlist.d.ts +55 -0
- package/dist/validation/mdx-allowlist.js +183 -0
- package/dist/validation/reference-validator.d.ts +2 -0
- package/dist/validation/reference-validator.js +3 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/branch-policy.d.ts +124 -0
- package/dist/worker/branch-policy.js +243 -0
- package/dist/worker/bundle-header.d.ts +117 -0
- package/dist/worker/bundle-header.js +253 -0
- package/dist/worker/cms-worker.d.ts +236 -142
- package/dist/worker/cms-worker.js +772 -285
- package/dist/worker/gateway-egress.d.ts +43 -0
- package/dist/worker/gateway-egress.js +209 -0
- package/dist/worker/gateway-instance.d.ts +42 -0
- package/dist/worker/gateway-instance.js +129 -0
- package/dist/worker/git-process.d.ts +81 -0
- package/dist/worker/git-process.js +234 -0
- package/dist/worker/git-sync.d.ts +34 -17
- package/dist/worker/git-sync.js +394 -131
- package/dist/worker/github-auth.d.ts +9 -9
- package/dist/worker/github-auth.js +13 -15
- package/dist/worker/github-gateway-http.d.ts +62 -0
- package/dist/worker/github-gateway-http.js +977 -0
- package/dist/worker/github-gateway-wire.d.ts +590 -0
- package/dist/worker/github-gateway-wire.js +488 -0
- package/dist/worker/github-gateway.d.ts +238 -0
- package/dist/worker/github-gateway.js +726 -0
- package/dist/worker/github-mirror-upkeep.d.ts +75 -0
- package/dist/worker/github-mirror-upkeep.js +266 -0
- package/dist/worker/github-mirror.d.ts +364 -0
- package/dist/worker/github-mirror.js +1030 -0
- package/dist/worker/github-transfer.d.ts +56 -0
- package/dist/worker/github-transfer.js +444 -0
- package/dist/worker/history-rewrite.d.ts +4 -5
- package/dist/worker/history-rewrite.js +12 -17
- package/dist/worker/provisioned-workspace.d.ts +5 -5
- package/dist/worker/provisioned-workspace.js +5 -5
- package/dist/worker/rebase.d.ts +1 -1
- package/dist/worker/rebase.js +58 -54
- package/dist/worker/remote-git-maintenance.d.ts +3 -0
- package/dist/worker/remote-git-maintenance.js +12 -0
- package/dist/worker/schema-gate.d.ts +49 -0
- package/dist/worker/schema-gate.js +226 -0
- package/dist/worker/self-checks.d.ts +107 -0
- package/dist/worker/self-checks.js +358 -0
- package/dist/worker/shared-repo-git.d.ts +96 -0
- package/dist/worker/shared-repo-git.js +459 -0
- package/dist/worker/sparse-cone.d.ts +20 -0
- package/dist/worker/sparse-cone.js +136 -0
- package/dist/worker/stale-mirror.d.ts +82 -0
- package/dist/worker/stale-mirror.js +130 -0
- package/dist/worker/task-runner.d.ts +5 -3
- package/dist/worker/task-runner.js +287 -186
- package/dist/worker/worker-context.d.ts +36 -37
- package/package.json +35 -7
- package/dist/editor/EditorPanes.d.ts +0 -10
- package/dist/editor/EditorPanes.js +0 -98
- package/dist/editor/components/EditorFooter.d.ts +0 -11
- package/dist/editor/components/EditorFooter.js +0 -9
- package/dist/editor/components/EditorSidebar.d.ts +0 -67
- package/dist/editor/components/EditorSidebar.js +0 -22
package/dist/api/entries.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { LogicalPath, PhysicalPath, Slug, ContentId } from '../paths/types.
|
|
|
5
5
|
/**
|
|
6
6
|
* Summary of an entry type for client display.
|
|
7
7
|
* Simplified from EntryTypeConfig - doesn't include full field definitions.
|
|
8
|
-
* @internal No importer; deletion candidate in
|
|
8
|
+
* @internal No importer; deletion candidate in safeinsights/canopycms#725.
|
|
9
9
|
*/
|
|
10
10
|
export interface EntryTypeSummary {
|
|
11
11
|
name: string;
|
|
@@ -28,7 +28,7 @@ export interface CollectionItem {
|
|
|
28
28
|
exists?: boolean;
|
|
29
29
|
canEdit?: boolean;
|
|
30
30
|
}
|
|
31
|
-
/** @internal No importer; deletion candidate in
|
|
31
|
+
/** @internal No importer; deletion candidate in safeinsights/canopycms#725. */
|
|
32
32
|
export interface ListEntriesParams {
|
|
33
33
|
branch: string;
|
|
34
34
|
collection?: LogicalPath;
|
|
@@ -37,8 +37,15 @@ export interface ListEntriesParams {
|
|
|
37
37
|
q?: string;
|
|
38
38
|
recursive?: boolean;
|
|
39
39
|
}
|
|
40
|
+
/** Whether the caller may add an entry to a listed collection. */
|
|
41
|
+
export interface CollectionAccess {
|
|
42
|
+
logicalPath: LogicalPath;
|
|
43
|
+
canAddEntry: boolean;
|
|
44
|
+
}
|
|
40
45
|
export interface ListEntriesResponse {
|
|
41
46
|
entries: CollectionItem[];
|
|
47
|
+
/** One per listed collection, on every page. */
|
|
48
|
+
collectionAccess?: CollectionAccess[];
|
|
42
49
|
pagination: {
|
|
43
50
|
cursor?: string;
|
|
44
51
|
hasMore: boolean;
|
|
@@ -78,10 +85,32 @@ export declare const listEntries: import("./route-builder.js").RouteDefinition<z
|
|
|
78
85
|
cursor?: string | undefined;
|
|
79
86
|
limit?: number | undefined;
|
|
80
87
|
}>, undefined, EntriesResponse>;
|
|
88
|
+
/** A readable entry that references the entry a delete targets. */
|
|
89
|
+
interface ReferencingEntrySummary {
|
|
90
|
+
entryPath: LogicalPath;
|
|
91
|
+
contentId: ContentId;
|
|
92
|
+
title: string;
|
|
93
|
+
/** Reference fields holding the target's id, e.g. `author` or `blocks[0].cta.target`. */
|
|
94
|
+
fields: string[];
|
|
95
|
+
/** Where its strings, the md/mdx body included, link to the target with `entry:<id>`. */
|
|
96
|
+
links: string[];
|
|
97
|
+
}
|
|
98
|
+
/** Who references an entry, as far as the requesting user may know. */
|
|
99
|
+
export interface EntryReferencedBy {
|
|
100
|
+
entries: ReferencingEntrySummary[];
|
|
101
|
+
/** Referencing entries the user may not read: counted, never described. */
|
|
102
|
+
hiddenCount: number;
|
|
103
|
+
}
|
|
81
104
|
/** Response type for deleting an entry */
|
|
82
105
|
export type DeleteEntryResponse = ApiResponse<{
|
|
83
106
|
deleted: boolean;
|
|
84
107
|
contentId?: string;
|
|
108
|
+
/**
|
|
109
|
+
* Set, with status 409 and `deleted: false`, when other entries reference this one and the
|
|
110
|
+
* request did not pass `confirmReferenced`. Its presence is what tells this 409 apart from
|
|
111
|
+
* an edit conflict. Re-sending with `confirmReferenced=true` deletes anyway.
|
|
112
|
+
*/
|
|
113
|
+
referencedBy?: EntryReferencedBy;
|
|
85
114
|
/**
|
|
86
115
|
* Set when the entry deleted successfully but the collection's order array couldn't be updated
|
|
87
116
|
* afterward (C6: best-effort hygiene after the delete, so its failure must not present as a
|
|
@@ -94,6 +123,8 @@ export type DeleteEntryResponse = ApiResponse<{
|
|
|
94
123
|
export declare const deleteEntry: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
95
124
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
96
125
|
entryPath: z.ZodType<LogicalPath, z.ZodTypeDef, LogicalPath>;
|
|
126
|
+
/** Delete even though other entries reference this one (query param). */
|
|
127
|
+
confirmReferenced: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["true", "false"]>]>, boolean, boolean | "true" | "false">>;
|
|
97
128
|
}, "strip", z.ZodTypeAny, {
|
|
98
129
|
branch: string & {
|
|
99
130
|
readonly __brand: "BranchName";
|
|
@@ -101,6 +132,7 @@ export declare const deleteEntry: import("./route-builder.js").RouteDefinition<z
|
|
|
101
132
|
entryPath: string & {
|
|
102
133
|
readonly __brand: "LogicalPath";
|
|
103
134
|
};
|
|
135
|
+
confirmReferenced?: boolean | undefined;
|
|
104
136
|
}, {
|
|
105
137
|
branch: string & {
|
|
106
138
|
readonly __brand: "BranchName";
|
|
@@ -108,6 +140,7 @@ export declare const deleteEntry: import("./route-builder.js").RouteDefinition<z
|
|
|
108
140
|
entryPath: string & {
|
|
109
141
|
readonly __brand: "LogicalPath";
|
|
110
142
|
};
|
|
143
|
+
confirmReferenced?: boolean | "true" | "false" | undefined;
|
|
111
144
|
}>, undefined, DeleteEntryResponse>;
|
|
112
145
|
/**
|
|
113
146
|
* Exported routes for router registration
|
|
@@ -142,6 +175,8 @@ export declare const ENTRY_ROUTES: {
|
|
|
142
175
|
readonly delete: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
143
176
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
144
177
|
entryPath: z.ZodType<LogicalPath, z.ZodTypeDef, LogicalPath>;
|
|
178
|
+
/** Delete even though other entries reference this one (query param). */
|
|
179
|
+
confirmReferenced: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["true", "false"]>]>, boolean, boolean | "true" | "false">>;
|
|
145
180
|
}, "strip", z.ZodTypeAny, {
|
|
146
181
|
branch: string & {
|
|
147
182
|
readonly __brand: "BranchName";
|
|
@@ -149,6 +184,7 @@ export declare const ENTRY_ROUTES: {
|
|
|
149
184
|
entryPath: string & {
|
|
150
185
|
readonly __brand: "LogicalPath";
|
|
151
186
|
};
|
|
187
|
+
confirmReferenced?: boolean | undefined;
|
|
152
188
|
}, {
|
|
153
189
|
branch: string & {
|
|
154
190
|
readonly __brand: "BranchName";
|
|
@@ -156,5 +192,7 @@ export declare const ENTRY_ROUTES: {
|
|
|
156
192
|
entryPath: string & {
|
|
157
193
|
readonly __brand: "LogicalPath";
|
|
158
194
|
};
|
|
195
|
+
confirmReferenced?: boolean | "true" | "false" | undefined;
|
|
159
196
|
}>, undefined, DeleteEntryResponse>;
|
|
160
197
|
};
|
|
198
|
+
export {};
|
package/dist/api/entries.js
CHANGED
|
@@ -7,9 +7,10 @@ import { getErrorMessage, isNotFoundError, sanitizeErrorMessage } from '../utils
|
|
|
7
7
|
import { createDebugLogger } from '../utils/debug.js';
|
|
8
8
|
import { resolveEntryTitle } from '../utils/title-field.js';
|
|
9
9
|
import { branchNameSchema, logicalPathSchema, queryBooleanSchema } from './validators.js';
|
|
10
|
-
import { MAX_ENTRIES_PER_PAGE, DEFAULT_ENTRIES_LIMIT } from './entries-constants.js';
|
|
10
|
+
import { MAX_ENTRIES_PER_PAGE, DEFAULT_ENTRIES_LIMIT, ENTRY_CHANGED_MESSAGE, } from './entries-constants.js';
|
|
11
11
|
import { SchemaOps, SchemaStoreBusyError } from '../schema/schema-store.js';
|
|
12
|
-
import { listCollectionEntries as listCollectionEntriesShared, sortByOrder, } from '../content-listing.js';
|
|
12
|
+
import { listCollectionEntries as listCollectionEntriesShared, listEntries as listContentEntries, sortByOrder, } from '../content-listing.js';
|
|
13
|
+
import { findReferencingEntries } from '../validation/deletion-checker.js';
|
|
13
14
|
// Re-export pagination constants from the dependency-free module so they remain
|
|
14
15
|
// part of the entries API surface without pulling server deps into client bundles.
|
|
15
16
|
const log = createDebugLogger({ prefix: 'EntriesAPI' });
|
|
@@ -122,11 +123,20 @@ const listEntriesHandler = async (gc, ctx, req, params) => {
|
|
|
122
123
|
const search = params.q?.toLowerCase();
|
|
123
124
|
const recursive = params.recursive ?? false;
|
|
124
125
|
let entries = [];
|
|
126
|
+
let collectionAccess = [];
|
|
125
127
|
try {
|
|
126
128
|
// Build the access checker once per request: permissions (and, in modes with a
|
|
127
129
|
// separate settings branch, the settings workspace) are loaded a single time and
|
|
128
130
|
// reused for every entry, instead of re-loading per entry inside the loop.
|
|
129
131
|
const checkAccess = await ctx.services.createContentAccessChecker(branchContext, root, req.user);
|
|
132
|
+
// A new entry's slug is unknown, so the probe is one no slug can be: a rule for the whole
|
|
133
|
+
// collection decides, never one for a particular entry. The create itself is checked again.
|
|
134
|
+
collectionAccess = targetCollections
|
|
135
|
+
.filter((item) => item.type === 'collection')
|
|
136
|
+
.map((item) => ({
|
|
137
|
+
logicalPath: item.logicalPath,
|
|
138
|
+
canAddEntry: checkAccess(`${item.logicalPath}/*`, 'edit').allowed,
|
|
139
|
+
}));
|
|
130
140
|
if (recursive && targetPath) {
|
|
131
141
|
// Recursive mode: list entries from target collection and all its children
|
|
132
142
|
const items = await listCollectionEntriesRecursive(root, targetPath, flatCollections);
|
|
@@ -164,6 +174,7 @@ const listEntriesHandler = async (gc, ctx, req, params) => {
|
|
|
164
174
|
status: 200,
|
|
165
175
|
data: {
|
|
166
176
|
entries: paged,
|
|
177
|
+
collectionAccess,
|
|
167
178
|
pagination: {
|
|
168
179
|
cursor: nextCursor,
|
|
169
180
|
hasMore: Boolean(nextCursor),
|
|
@@ -198,9 +209,66 @@ export const listEntries = defineEndpoint({
|
|
|
198
209
|
const deleteEntryParamsSchema = z.object({
|
|
199
210
|
branch: branchNameSchema,
|
|
200
211
|
entryPath: logicalPathSchema, // Format: collectionPath/slug
|
|
212
|
+
/** Delete even though other entries reference this one (query param). */
|
|
213
|
+
confirmReferenced: queryBooleanSchema.optional(),
|
|
201
214
|
});
|
|
215
|
+
/** Every entry of an `unavailable` entry type on the branch. */
|
|
216
|
+
const listUnavailableEntries = async (branchRoot, flatSchema) => {
|
|
217
|
+
const collections = flatSchema.filter((item) => item.type === 'collection' && item.entries?.some((e) => e.unavailable));
|
|
218
|
+
const listed = await Promise.all(collections.map((collection) => listCollectionEntriesShared(branchRoot, collection)));
|
|
219
|
+
return listed.flat().filter((item) => {
|
|
220
|
+
const collection = collections.find((c) => c.logicalPath === item.collectionPath);
|
|
221
|
+
return (collection?.type === 'collection' &&
|
|
222
|
+
collection.entries?.some((e) => e.name === item.entryType && e.unavailable));
|
|
223
|
+
});
|
|
224
|
+
};
|
|
202
225
|
/**
|
|
203
|
-
*
|
|
226
|
+
* Every entry on the branch that references `contentId`, split by whether `user` may read it.
|
|
227
|
+
* A full raw scan of the branch's content: references are stored only on the referencing
|
|
228
|
+
* side, so there is no index to ask. Null when nothing references it.
|
|
229
|
+
*/
|
|
230
|
+
const findReferencedBy = async (branchContext, ctx, req, contentId) => {
|
|
231
|
+
const { branchRoot, flatSchema } = branchContext;
|
|
232
|
+
const listed = await listContentEntries(branchRoot, flatSchema, ctx.services.config.contentRoot || 'content');
|
|
233
|
+
// listEntries leaves out entries of an unavailable type; scanned raw, they still count.
|
|
234
|
+
const unavailable = await listUnavailableEntries(branchRoot, flatSchema);
|
|
235
|
+
const entries = [
|
|
236
|
+
...listed,
|
|
237
|
+
...unavailable.map((item) => ({
|
|
238
|
+
entryPath: item.logicalPath,
|
|
239
|
+
entryId: item.contentId,
|
|
240
|
+
slug: item.slug,
|
|
241
|
+
collectionPath: item.collectionPath,
|
|
242
|
+
entryType: item.entryType,
|
|
243
|
+
data: item.data,
|
|
244
|
+
schemaUnavailable: true,
|
|
245
|
+
})),
|
|
246
|
+
];
|
|
247
|
+
const referencing = findReferencingEntries(entries, contentId);
|
|
248
|
+
if (referencing.length === 0)
|
|
249
|
+
return null;
|
|
250
|
+
const canAccess = await ctx.services.createContentAccessChecker(branchContext, branchRoot, req.user);
|
|
251
|
+
const visible = [];
|
|
252
|
+
for (const { entry, fields, links } of referencing) {
|
|
253
|
+
if (!canAccess(entry.entryPath, 'read').allowed)
|
|
254
|
+
continue;
|
|
255
|
+
const collection = flatSchema.find((item) => item.type === 'collection' && item.logicalPath === entry.collectionPath);
|
|
256
|
+
const entryType = collection?.type === 'collection'
|
|
257
|
+
? collection.entries?.find((e) => e.name === entry.entryType)
|
|
258
|
+
: undefined;
|
|
259
|
+
visible.push({
|
|
260
|
+
entryPath: entry.entryPath,
|
|
261
|
+
contentId: entry.entryId,
|
|
262
|
+
title: extractTitle(entry.data, entryType, entry.slug),
|
|
263
|
+
fields,
|
|
264
|
+
links,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
return { entries: visible, hiddenCount: referencing.length - visible.length };
|
|
268
|
+
};
|
|
269
|
+
/**
|
|
270
|
+
* Delete an entry and update the collection's order array. An entry other entries reference
|
|
271
|
+
* is deleted only with `confirmReferenced`; without it the response is a 409 naming them.
|
|
204
272
|
* DELETE /:branch/entries/...entryPath
|
|
205
273
|
* Note: Uses catch-all to support paths with slashes (e.g., content/posts/hello-world)
|
|
206
274
|
*/
|
|
@@ -278,10 +346,40 @@ const deleteEntryHandler = async (gc, ctx, req, params) => {
|
|
|
278
346
|
error: 'Edit permission required to delete entry',
|
|
279
347
|
};
|
|
280
348
|
}
|
|
349
|
+
// Before the reference scan, whose 409 would otherwise answer first; mapped to a 503.
|
|
350
|
+
await contentStore.assertEntryAvailable(collectionLogicalPath, entrySlug);
|
|
281
351
|
let orderCleanupWarning;
|
|
282
352
|
try {
|
|
283
353
|
// Get the entry's content ID before deleting (for order update)
|
|
284
354
|
const contentId = await contentStore.getIdForEntry(collectionLogicalPath, entrySlug);
|
|
355
|
+
// Advisory: a reference saved between this scan and the delete below still dangles.
|
|
356
|
+
if (contentId && !params.confirmReferenced) {
|
|
357
|
+
let referencedBy;
|
|
358
|
+
try {
|
|
359
|
+
referencedBy = await findReferencedBy(branchContext, ctx, req, contentId);
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
// Outside the catch below, which would report a file vanishing mid-scan as this entry.
|
|
363
|
+
log.warn('delete-entry', 'Reference scan failed', {
|
|
364
|
+
entryPath,
|
|
365
|
+
error: getErrorMessage(err),
|
|
366
|
+
});
|
|
367
|
+
return {
|
|
368
|
+
ok: false,
|
|
369
|
+
status: 500,
|
|
370
|
+
error: 'Could not check which entries reference this one; try again',
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
if (referencedBy) {
|
|
374
|
+
const count = referencedBy.entries.length + referencedBy.hiddenCount;
|
|
375
|
+
return {
|
|
376
|
+
ok: false,
|
|
377
|
+
status: 409,
|
|
378
|
+
error: `Entry is referenced by ${count} other ${count === 1 ? 'entry' : 'entries'}`,
|
|
379
|
+
data: { deleted: false, contentId, referencedBy },
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
}
|
|
285
383
|
await contentStore.delete(collectionLogicalPath, entrySlug);
|
|
286
384
|
// Construct exactly like api/schema.ts's getSchemaOps (content root, registry, services,
|
|
287
385
|
// branch root) so updateOrder's write bumps the schema generation marker — without it, every
|
|
@@ -328,9 +426,7 @@ const deleteEntryHandler = async (gc, ctx, req, params) => {
|
|
|
328
426
|
return {
|
|
329
427
|
ok: false,
|
|
330
428
|
status: 409,
|
|
331
|
-
error: err instanceof BranchSyncingError
|
|
332
|
-
? err.message
|
|
333
|
-
: 'Content conflict: entry was modified by another editor',
|
|
429
|
+
error: err instanceof BranchSyncingError ? err.message : ENTRY_CHANGED_MESSAGE,
|
|
334
430
|
};
|
|
335
431
|
}
|
|
336
432
|
return {
|
|
@@ -8,11 +8,21 @@ export interface GitHubSyncResult {
|
|
|
8
8
|
prUrl?: string;
|
|
9
9
|
prNumber?: number;
|
|
10
10
|
syncStatus?: SyncStatus;
|
|
11
|
+
/** Client-safe reason a direct GitHub call failed, recorded as the branch's syncFailureReason. */
|
|
12
|
+
syncFailureReason?: string;
|
|
13
|
+
/** GitHub refused the PR because the pushed branch has no commits its base lacks. */
|
|
14
|
+
nothingToSubmit?: boolean;
|
|
15
|
+
/** The direct path, whose submit pushes to GitHub itself: the branch is there whatever the PR call did. */
|
|
16
|
+
pushedToGitHub?: boolean;
|
|
11
17
|
}
|
|
12
18
|
/** What the PR body records about a submit. */
|
|
13
19
|
export interface SubmissionRecord {
|
|
14
20
|
submitter?: SubmissionEditor;
|
|
21
|
+
/** Every recorded editor of the branch; the PR body lists those other than the submitter. */
|
|
22
|
+
editors?: readonly SubmissionEditor[];
|
|
15
23
|
changedPaths: readonly string[];
|
|
24
|
+
/** The submit's `submittedAt`, carried to the worker so its failure handling targets this submit. */
|
|
25
|
+
submittedAt?: string;
|
|
16
26
|
}
|
|
17
27
|
/**
|
|
18
28
|
* Uses githubService directly if available, otherwise queues a task for the worker.
|
|
@@ -26,3 +36,12 @@ export declare function syncSubmitPr(ctx: ApiContext, context: BranchContext, su
|
|
|
26
36
|
* available, otherwise queues a task.
|
|
27
37
|
*/
|
|
28
38
|
export declare function syncConvertToDraft(ctx: ApiContext, context: BranchContext): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Used by delete, after the local delete succeeded. Deletes the branch on GitHub when the CMS
|
|
41
|
+
* put it there: a recorded PR number or `pushedToGitHubAt` stamp is the proof (a submit whose PR
|
|
42
|
+
* GitHub refused pushed the branch but has no PR number). Without either, a same-named GitHub
|
|
43
|
+
* branch is someone else's (the create-time collision check is best-effort) and is never touched.
|
|
44
|
+
*
|
|
45
|
+
* Returns a client-facing warning when the delete could not be done or queued; never throws.
|
|
46
|
+
*/
|
|
47
|
+
export declare function syncDeleteRemoteBranch(ctx: ApiContext, context: BranchContext): Promise<string | undefined>;
|
package/dist/api/github-sync.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { enqueueTask } from '../task-queue/cms-task-queue.js';
|
|
2
2
|
import { getTaskQueueDir } from '../task-queue/task-queue-config.js';
|
|
3
3
|
import { clientOperatingStrategy } from '../operating-mode/index.js';
|
|
4
|
-
import { getErrorMessage } from '../utils/error.js';
|
|
4
|
+
import { getErrorMessage, sanitizeErrorMessage } from '../utils/error.js';
|
|
5
5
|
import { sanitizeBranchName } from '../paths/branch-name.js';
|
|
6
6
|
import { buildPrSection, mergePrSection } from '../submission-attribution.js';
|
|
7
|
+
import { isNoCommitsBetweenError, isRefAlreadyGoneError } from '../github-service.js';
|
|
8
|
+
import { baseBranchOf } from '../utils/base-branch.js';
|
|
7
9
|
/**
|
|
8
10
|
* Uses githubService directly if available, otherwise queues a task for the worker.
|
|
9
11
|
*
|
|
@@ -17,10 +19,11 @@ export async function syncSubmitPr(ctx, context, submission) {
|
|
|
17
19
|
const prSection = buildPrSection({
|
|
18
20
|
description: context.branch.description,
|
|
19
21
|
submitter: submission.submitter,
|
|
22
|
+
editors: submission.editors,
|
|
20
23
|
changedPaths: submission.changedPaths,
|
|
21
24
|
});
|
|
22
25
|
// Target the fork point recorded at branch creation when available.
|
|
23
|
-
const baseBranch = context.branch.baseBranch ?? ctx.services.config
|
|
26
|
+
const baseBranch = context.branch.baseBranch ?? baseBranchOf(ctx.services.config);
|
|
24
27
|
if (!clientOperatingStrategy(mode).supportsPullRequests()) {
|
|
25
28
|
return {};
|
|
26
29
|
}
|
|
@@ -64,6 +67,7 @@ export async function syncSubmitPr(ctx, context, submission) {
|
|
|
64
67
|
prUrl: context.branch.pullRequestUrl,
|
|
65
68
|
prNumber: context.branch.pullRequestNumber,
|
|
66
69
|
syncStatus: 'synced',
|
|
70
|
+
pushedToGitHub: true,
|
|
67
71
|
};
|
|
68
72
|
}
|
|
69
73
|
else {
|
|
@@ -91,16 +95,21 @@ export async function syncSubmitPr(ctx, context, submission) {
|
|
|
91
95
|
prUrl: result.url,
|
|
92
96
|
prNumber: result.number,
|
|
93
97
|
syncStatus: 'synced',
|
|
98
|
+
pushedToGitHub: true,
|
|
94
99
|
};
|
|
95
100
|
}
|
|
96
101
|
}
|
|
97
102
|
catch (err) {
|
|
98
|
-
const message = err
|
|
103
|
+
const message = getErrorMessage(err);
|
|
99
104
|
console.error(`CanopyCMS: Failed to create/update PR for ${context.branch.name}:`, message);
|
|
105
|
+
if (isNoCommitsBetweenError(err))
|
|
106
|
+
return { nothingToSubmit: true, pushedToGitHub: true };
|
|
100
107
|
return {
|
|
101
108
|
prUrl: context.branch.pullRequestUrl,
|
|
102
109
|
prNumber: context.branch.pullRequestNumber,
|
|
103
110
|
syncStatus: 'sync-failed',
|
|
111
|
+
syncFailureReason: sanitizeErrorMessage(message),
|
|
112
|
+
pushedToGitHub: true,
|
|
104
113
|
};
|
|
105
114
|
}
|
|
106
115
|
}
|
|
@@ -123,6 +132,7 @@ export async function syncSubmitPr(ctx, context, submission) {
|
|
|
123
132
|
// A content submit is an explicit "ready for review" action: convert a
|
|
124
133
|
// pre-existing draft PR to ready.
|
|
125
134
|
markReadyIfDraft: true,
|
|
135
|
+
submittedAt: submission.submittedAt,
|
|
126
136
|
},
|
|
127
137
|
});
|
|
128
138
|
}
|
|
@@ -156,6 +166,43 @@ export async function syncConvertToDraft(ctx, context) {
|
|
|
156
166
|
});
|
|
157
167
|
}
|
|
158
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Used by delete, after the local delete succeeded. Deletes the branch on GitHub when the CMS
|
|
171
|
+
* put it there: a recorded PR number or `pushedToGitHubAt` stamp is the proof (a submit whose PR
|
|
172
|
+
* GitHub refused pushed the branch but has no PR number). Without either, a same-named GitHub
|
|
173
|
+
* branch is someone else's (the create-time collision check is best-effort) and is never touched.
|
|
174
|
+
*
|
|
175
|
+
* Returns a client-facing warning when the delete could not be done or queued; never throws.
|
|
176
|
+
*/
|
|
177
|
+
export async function syncDeleteRemoteBranch(ctx, context) {
|
|
178
|
+
const { pullRequestNumber, pushedToGitHubAt } = context.branch;
|
|
179
|
+
if (!pullRequestNumber && !pushedToGitHubAt)
|
|
180
|
+
return undefined;
|
|
181
|
+
const { githubService } = ctx.services;
|
|
182
|
+
const branch = context.branch.name;
|
|
183
|
+
if (githubService) {
|
|
184
|
+
try {
|
|
185
|
+
await githubService.deleteBranch(branch);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
if (isRefAlreadyGoneError(err))
|
|
189
|
+
return undefined;
|
|
190
|
+
console.error(`CanopyCMS: Failed to delete GitHub branch for ${branch}:`, getErrorMessage(err));
|
|
191
|
+
return 'The branch could not be deleted on GitHub; delete it there by hand';
|
|
192
|
+
}
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
const mode = ctx.services.config.mode;
|
|
196
|
+
if (!clientOperatingStrategy(mode).supportsPullRequests())
|
|
197
|
+
return undefined;
|
|
198
|
+
const result = await enqueueGitHubTask(ctx, context, {
|
|
199
|
+
action: 'delete-remote-branch',
|
|
200
|
+
payload: { branch, pullRequestNumber, pushedToGitHubAt },
|
|
201
|
+
});
|
|
202
|
+
return result.syncStatus === 'sync-failed'
|
|
203
|
+
? 'Deleting the branch on GitHub could not be queued; delete it there by hand'
|
|
204
|
+
: undefined;
|
|
205
|
+
}
|
|
159
206
|
async function enqueueGitHubTask(ctx, context, task) {
|
|
160
207
|
const taskDir = getTaskQueueDir(ctx.services.config);
|
|
161
208
|
try {
|
package/dist/api/groups.d.ts
CHANGED
|
@@ -59,29 +59,29 @@ export declare const GROUP_ROUTES: {
|
|
|
59
59
|
members: z.ZodArray<z.ZodString, "many">;
|
|
60
60
|
}, "strip", z.ZodTypeAny, {
|
|
61
61
|
name: string;
|
|
62
|
-
members: string[];
|
|
63
62
|
id: string;
|
|
63
|
+
members: string[];
|
|
64
64
|
description?: string | undefined;
|
|
65
65
|
}, {
|
|
66
66
|
name: string;
|
|
67
|
-
members: string[];
|
|
68
67
|
id: string;
|
|
68
|
+
members: string[];
|
|
69
69
|
description?: string | undefined;
|
|
70
70
|
}>, "many">;
|
|
71
71
|
expectedContentVersion: z.ZodOptional<z.ZodNumber>;
|
|
72
72
|
}, "strip", z.ZodTypeAny, {
|
|
73
73
|
groups: {
|
|
74
74
|
name: string;
|
|
75
|
-
members: string[];
|
|
76
75
|
id: string;
|
|
76
|
+
members: string[];
|
|
77
77
|
description?: string | undefined;
|
|
78
78
|
}[];
|
|
79
79
|
expectedContentVersion?: number | undefined;
|
|
80
80
|
}, {
|
|
81
81
|
groups: {
|
|
82
82
|
name: string;
|
|
83
|
-
members: string[];
|
|
84
83
|
id: string;
|
|
84
|
+
members: string[];
|
|
85
85
|
description?: string | undefined;
|
|
86
86
|
}[];
|
|
87
87
|
expectedContentVersion?: number | undefined;
|
package/dist/api/groups.js
CHANGED
|
@@ -180,6 +180,7 @@ const updateInternalGroupsHandler = async (_gc, ctx, req, body) => {
|
|
|
180
180
|
branchRoot: context.branchRoot,
|
|
181
181
|
fileName: 'groups.json',
|
|
182
182
|
message: 'Update internal groups',
|
|
183
|
+
actor: req.user,
|
|
183
184
|
mode,
|
|
184
185
|
});
|
|
185
186
|
if (!commitResult.pushed) {
|
|
@@ -193,7 +194,7 @@ const updateInternalGroupsHandler = async (_gc, ctx, req, body) => {
|
|
|
193
194
|
}
|
|
194
195
|
catch (error) {
|
|
195
196
|
if (error instanceof SettingsVersionConflictError) {
|
|
196
|
-
return { ok: false, status: 409, error: error.message };
|
|
197
|
+
return { ok: false, status: 409, error: error.message, code: 'SETTINGS_CHANGED' };
|
|
197
198
|
}
|
|
198
199
|
if (error instanceof SettingsFileConflictError) {
|
|
199
200
|
return { ok: false, status: 409, error: 'Settings are busy, please try again.' };
|
package/dist/api/guards.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
* error response (404/403/500) to short-circuit, or produce a guard context (e.g. branch context
|
|
4
4
|
* with schema) for the handler. See api/AGENTS.md for the full guard reference.
|
|
5
5
|
*/
|
|
6
|
+
import { BRANCH_METADATA_CORRUPT_MESSAGE, BranchMetadataCorruptError, } from '../branch-metadata-error.js';
|
|
7
|
+
import { canopyLogError } from '../utils/logger.js';
|
|
6
8
|
import { isAdmin, isReviewer, isPrivileged } from '../authorization/helpers.js';
|
|
7
9
|
import { getBranchProtection, getBranchWriteProtection } from '../authorization/protected-branch.js';
|
|
8
10
|
function extractBranchName(params) {
|
|
@@ -92,6 +94,10 @@ const runBranchAccessWithSchemaGuard = async (ctx, req, params, accumulated) =>
|
|
|
92
94
|
}
|
|
93
95
|
return { ok: true, context: { branchContext: context } };
|
|
94
96
|
};
|
|
97
|
+
/**
|
|
98
|
+
* A success records the user as an editor the next submit credits (route-builder.ts), so give
|
|
99
|
+
* this guard only to endpoints that change the branch's working tree.
|
|
100
|
+
*/
|
|
95
101
|
const runWritableBranchGuard = async (ctx, _req, params, accumulated) => {
|
|
96
102
|
const branch = extractBranchName(params);
|
|
97
103
|
if (typeof branch !== 'string')
|
|
@@ -117,8 +123,8 @@ const runWritableBranchGuard = async (ctx, _req, params, accumulated) => {
|
|
|
117
123
|
const branchStatus = context.branch.status;
|
|
118
124
|
const error = branchStatus === 'submitted'
|
|
119
125
|
? `Branch "${context.branch.name}" is submitted for review and cannot be edited. Withdraw it or request changes to resume editing.`
|
|
120
|
-
: //
|
|
121
|
-
//
|
|
126
|
+
: // A branch.json without a status is refused as corrupt before this
|
|
127
|
+
// point; a context built elsewhere can still lack one. Refuse rather than guess.
|
|
122
128
|
branchStatus === undefined
|
|
123
129
|
? `Branch "${context.branch.name}" has no readable workflow status and cannot be edited until its metadata is repaired.`
|
|
124
130
|
: `Branch "${context.branch.name}" is ${branchStatus} and cannot be edited.`;
|
|
@@ -196,7 +202,21 @@ export async function executeGuards(guards, ctx, req, params) {
|
|
|
196
202
|
const accumulated = {};
|
|
197
203
|
for (const guardId of guards) {
|
|
198
204
|
const runner = GUARD_RUNNERS[guardId];
|
|
199
|
-
|
|
205
|
+
let result;
|
|
206
|
+
try {
|
|
207
|
+
result = await runner(ctx, req, params, accumulated);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
// Every branch guard resolves the branch from its branch.json, and a
|
|
211
|
+
// corrupt one has no status or ACL anyone can trust: deny, whatever the guard.
|
|
212
|
+
if (!(err instanceof BranchMetadataCorruptError))
|
|
213
|
+
throw err;
|
|
214
|
+
canopyLogError(`CanopyCMS: ${err.message}`);
|
|
215
|
+
return {
|
|
216
|
+
ok: false,
|
|
217
|
+
response: { ok: false, status: 500, error: BRANCH_METADATA_CORRUPT_MESSAGE },
|
|
218
|
+
};
|
|
219
|
+
}
|
|
200
220
|
if (!result.ok) {
|
|
201
221
|
return { ok: false, response: result.response };
|
|
202
222
|
}
|
package/dist/api/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { ApiResponse, ApiRequest, ApiContext } from './types.js';
|
|
2
|
-
export type {
|
|
2
|
+
export type { BranchListItemResponse, BranchListResponse, BranchDeleteResponse, CreateBranchBody, UpdateBranchAccessBody, } from './branch.js';
|
|
3
3
|
export type { BranchMergeResponse } from './branch-merge.js';
|
|
4
4
|
export type { CommentsResponse, AddCommentResponse, ResolveCommentResponse } from './comments.js';
|
|
5
5
|
export type { EntriesResponse, ListEntriesResponse, CollectionItem, ListEntriesParams, DeleteEntryResponse, } from './entries.js';
|
|
@@ -16,3 +16,5 @@ export type { AdminStatusResponse, AdminStatusData, AdminTasksResponse, AdminTas
|
|
|
16
16
|
export { USER_ROUTES } from './user.js';
|
|
17
17
|
export { CanopyApiClient, createApiClient } from './client.js';
|
|
18
18
|
export type { ApiClientOptions } from './client.js';
|
|
19
|
+
export { ApiTimeoutError, isApiTimeoutError } from './request-deadline.js';
|
|
20
|
+
export type { RequestOptions } from './request-deadline.js';
|
package/dist/api/index.js
CHANGED
|
@@ -4,3 +4,4 @@ export { USER_ROUTES } from './user.js';
|
|
|
4
4
|
// Import it directly from './schema.js' in server-side code when needed.
|
|
5
5
|
// Export client
|
|
6
6
|
export { CanopyApiClient, createApiClient } from './client.js';
|
|
7
|
+
export { ApiTimeoutError, isApiTimeoutError } from './request-deadline.js';
|
|
@@ -19,6 +19,10 @@ export type ListGroupsResponse = ApiResponse<{
|
|
|
19
19
|
export type GetUserMetadataResponse = ApiResponse<{
|
|
20
20
|
user: UserSearchResult | null;
|
|
21
21
|
}>;
|
|
22
|
+
/** Response type for batch user metadata: the users found, in no guaranteed order; unknown ids are absent */
|
|
23
|
+
export type BatchGetUserMetadataResponse = ApiResponse<{
|
|
24
|
+
users: UserSearchResult[];
|
|
25
|
+
}>;
|
|
22
26
|
declare const updatePermissionsBodySchema: z.ZodObject<{
|
|
23
27
|
permissions: z.ZodArray<z.ZodObject<{
|
|
24
28
|
path: z.ZodType<import("../authorization/index.js").PermissionPath, z.ZodTypeDef, import("../authorization/index.js").PermissionPath>;
|
|
@@ -142,10 +146,18 @@ declare const getUserMetadataParamsSchema: z.ZodObject<{
|
|
|
142
146
|
}, {
|
|
143
147
|
userId: string;
|
|
144
148
|
}>;
|
|
149
|
+
declare const batchGetUserMetadataBodySchema: z.ZodObject<{
|
|
150
|
+
userIds: z.ZodArray<z.ZodString, "many">;
|
|
151
|
+
}, "strip", z.ZodTypeAny, {
|
|
152
|
+
userIds: string[];
|
|
153
|
+
}, {
|
|
154
|
+
userIds: string[];
|
|
155
|
+
}>;
|
|
145
156
|
export type UpdatePermissionsBody = z.infer<typeof updatePermissionsBodySchema>;
|
|
146
|
-
/** @internal No importer; deletion candidate in
|
|
157
|
+
/** @internal No importer; deletion candidate in safeinsights/canopycms#725. */
|
|
147
158
|
export type SearchUsersParams = z.infer<typeof searchUsersParamsSchema>;
|
|
148
|
-
|
|
159
|
+
export type BatchGetUserMetadataBody = z.infer<typeof batchGetUserMetadataBodySchema>;
|
|
160
|
+
/** @internal No importer; deletion candidate in safeinsights/canopycms#725. */
|
|
149
161
|
export type GetUserMetadataParams = z.infer<typeof getUserMetadataParamsSchema>;
|
|
150
162
|
/**
|
|
151
163
|
* Exported routes for router registration
|
|
@@ -276,5 +288,12 @@ export declare const PERMISSION_ROUTES: {
|
|
|
276
288
|
}, {
|
|
277
289
|
userId: string;
|
|
278
290
|
}>, undefined, GetUserMetadataResponse>;
|
|
291
|
+
readonly batchGetUserMetadata: import("./route-builder.js").RouteDefinition<undefined, z.ZodObject<{
|
|
292
|
+
userIds: z.ZodArray<z.ZodString, "many">;
|
|
293
|
+
}, "strip", z.ZodTypeAny, {
|
|
294
|
+
userIds: string[];
|
|
295
|
+
}, {
|
|
296
|
+
userIds: string[];
|
|
297
|
+
}>, BatchGetUserMetadataResponse>;
|
|
279
298
|
};
|
|
280
299
|
export {};
|