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/assets.js
CHANGED
|
@@ -4,8 +4,8 @@ import { ASSET_PREFIXES } from '../assets/keys.js';
|
|
|
4
4
|
import { ALLOWED_UPLOAD_CONTENT_TYPES } from '../assets/pipeline.js';
|
|
5
5
|
import { finalizeStagedUpload } from '../assets/finalize.js';
|
|
6
6
|
import { assetSrc } from '../assets/asset-src.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { canonicalizeTransformPath } from '../assets/transform-directives.js';
|
|
8
|
+
import { storeTransform, TRANSFORM_CACHE_CONTROL } from '../assets/materialize.js';
|
|
9
9
|
import { isAdmin } from '../authorization/helpers.js';
|
|
10
10
|
function toAssetRecord(meta) {
|
|
11
11
|
return { ...meta, src: assetSrc(meta) };
|
|
@@ -194,9 +194,9 @@ const listAssetsHandler = async (ctx, _req, params) => {
|
|
|
194
194
|
* `uploadedBy` records the FIRST uploader only: finalizeAsset dedups on content hash, so a second
|
|
195
195
|
* person uploading an identical file gains no delete rights over it — benign (a 403 where they
|
|
196
196
|
* expected success, never the reverse; see
|
|
197
|
-
*
|
|
197
|
+
* safeinsights/canopycms#572).
|
|
198
198
|
*
|
|
199
|
-
* Coupled to the blob-GC follow-up in
|
|
199
|
+
* Coupled to the blob-GC follow-up in safeinsights/canopycms#575: this permission is safe because
|
|
200
200
|
* delete is a de-list, not a destroy — nothing another branch references breaks. If GC ever makes
|
|
201
201
|
* delete destroy the blob, this needs a reference check too.
|
|
202
202
|
*/
|
|
@@ -212,63 +212,41 @@ const deleteAssetHandler = async (ctx, req, params) => {
|
|
|
212
212
|
await ctx.assetStore.deleteMeta(params.key);
|
|
213
213
|
return { ok: true, status: 200, data: { deleted: true } };
|
|
214
214
|
};
|
|
215
|
-
/** Cache-Control applied to every transform output this route writes/serves - matches finalize.ts's PUBLIC_CACHE_CONTROL for static public objects. */
|
|
216
|
-
const TRANSFORM_CACHE_CONTROL = 'public, max-age=31536000, immutable';
|
|
217
215
|
/**
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
* dedupes with any equivalent request), then serve the bytes just computed.
|
|
222
|
-
*
|
|
223
|
-
* `key` here already starts with `assets/t/` and already missed `rawAssetHandler`'s cache-hit
|
|
224
|
-
* `readPublicObject` check.
|
|
216
|
+
* The largest body this route returns inline. The CMS Lambda's Function URL buffers its response
|
|
217
|
+
* and caps it at 6 MiB after base64 encoding, which inflates by 4/3, so 4 MiB leaves headroom.
|
|
218
|
+
* Same bound and reasoning as the transform Lambda's `INLINE_BODY_LIMIT_BYTES`.
|
|
225
219
|
*/
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
// When the URL omits an explicit `f=` format, the transform preserves the
|
|
247
|
-
// source format, so the URL's `{ext}` must match the source's real ext
|
|
248
|
-
// exactly - the parser alone can't check this (it doesn't know the source
|
|
249
|
-
// format until this meta lookup).
|
|
250
|
-
const requestedFormat = parsed.directives.identity ? undefined : parsed.directives.format;
|
|
251
|
-
if (requestedFormat === undefined && parsed.ext !== meta.ext) {
|
|
252
|
-
return { ok: false, status: 400, error: 'Extension does not match the source format' };
|
|
253
|
-
}
|
|
254
|
-
const original = await assetStore.readOriginal(parsed.hash32);
|
|
255
|
-
if (!original) {
|
|
256
|
-
return { ok: false, status: 404, error: 'Not found' };
|
|
257
|
-
}
|
|
258
|
-
const transformed = await applyTransform({ data: original.data, ext: original.ext }, parsed.directives);
|
|
220
|
+
const INLINE_BODY_LIMIT_BYTES = 4 * 1024 * 1024;
|
|
221
|
+
/**
|
|
222
|
+
* A 302 to a presigned store URL. `no-store` because the URL expires: a cached redirect would
|
|
223
|
+
* outlive it, and a browser revisiting the page would follow it to a 403.
|
|
224
|
+
*/
|
|
225
|
+
function presignedRedirect(url) {
|
|
226
|
+
return {
|
|
227
|
+
kind: 'binary',
|
|
228
|
+
status: 302,
|
|
229
|
+
body: new Uint8Array(),
|
|
230
|
+
headers: { location: url, cacheControl: 'no-store' },
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* This route's own lazy transform: `storeTransform` computes and stores the output, then this
|
|
235
|
+
* serves the bytes just computed. `parsed` is the canonical parse from `canonicalizeTransformPath`,
|
|
236
|
+
* and `canonicalKey` already missed `rawAssetHandler`'s cache check.
|
|
237
|
+
*/
|
|
238
|
+
async function serveLazyTransform(assetStore, parsed, canonicalKey) {
|
|
239
|
+
const transformed = await storeTransform(assetStore, parsed, canonicalKey);
|
|
259
240
|
if (!transformed.ok) {
|
|
260
|
-
//
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
241
|
+
// The real status, not a flat 502: none of these rejections is "this server failed".
|
|
242
|
+
const error = transformed.status === 404 ? 'Not found' : transformed.error;
|
|
243
|
+
return { ok: false, status: transformed.status, error };
|
|
244
|
+
}
|
|
245
|
+
if (transformed.data.byteLength > INLINE_BODY_LIMIT_BYTES && assetStore.presignPublicObjectRead) {
|
|
246
|
+
const url = await assetStore.presignPublicObjectRead(canonicalKey);
|
|
247
|
+
if (url)
|
|
248
|
+
return presignedRedirect(url);
|
|
264
249
|
}
|
|
265
|
-
const canonicalKey = `${ASSET_PREFIXES.transform}/${formatDirectives(parsed.directives)}/${parsed.hash32}/${parsed.slug}.${parsed.ext}`;
|
|
266
|
-
await assetStore.putPublicObject({
|
|
267
|
-
key: canonicalKey,
|
|
268
|
-
data: transformed.data,
|
|
269
|
-
contentType: transformed.contentType,
|
|
270
|
-
cacheControl: TRANSFORM_CACHE_CONTROL,
|
|
271
|
-
});
|
|
272
250
|
return {
|
|
273
251
|
kind: 'binary',
|
|
274
252
|
status: 200,
|
|
@@ -276,16 +254,47 @@ async function serveLazyTransform(assetStore, key) {
|
|
|
276
254
|
headers: { contentType: transformed.contentType, cacheControl: TRANSFORM_CACHE_CONTROL },
|
|
277
255
|
};
|
|
278
256
|
}
|
|
257
|
+
/** A redirect to, or the bytes of, the public object stored at `key`; `null` when there is none. */
|
|
258
|
+
async function serveStoredObject(assetStore, key) {
|
|
259
|
+
if (assetStore.presignPublicObjectRead) {
|
|
260
|
+
const url = await assetStore.presignPublicObjectRead(key);
|
|
261
|
+
return url ? presignedRedirect(url) : null;
|
|
262
|
+
}
|
|
263
|
+
const object = await assetStore.readPublicObject(key);
|
|
264
|
+
if (!object)
|
|
265
|
+
return null;
|
|
266
|
+
return {
|
|
267
|
+
kind: 'binary',
|
|
268
|
+
status: 200,
|
|
269
|
+
body: object.data,
|
|
270
|
+
headers: {
|
|
271
|
+
contentType: object.contentType,
|
|
272
|
+
contentDisposition: object.contentDisposition,
|
|
273
|
+
cacheControl: object.cacheControl,
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
279
277
|
/**
|
|
280
278
|
* Serve a public asset object (sanitized svg/pdf finalize wrote, or a cached transform output)
|
|
281
|
-
*
|
|
282
|
-
* `ASSET_ROUTES`/the client generator: this returns raw bytes
|
|
283
|
-
* JSON envelope, so a generated `response.json()` client method
|
|
284
|
-
* this route directly (`<img>`/`<a>` src, or a framework rewrite),
|
|
279
|
+
* to the editor, the live preview, and `withCanopy`'s `/assets/*` rewrite. Hand-built (not
|
|
280
|
+
* `defineEndpoint`), not registered in `ASSET_ROUTES`/the client generator: this returns raw bytes
|
|
281
|
+
* (`CanopyBinaryResponse`), not a JSON envelope, so a generated `response.json()` client method
|
|
282
|
+
* would be wrong. Consumers hit this route directly (`<img>`/`<a>` src, or a framework rewrite),
|
|
283
|
+
* never through `client.ts`.
|
|
285
284
|
*
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
* origin-group -> S3 -> Lambda on miss)
|
|
285
|
+
* A transform key (`assets/t/...`) is resolved to its canonical key first, and that key is what is
|
|
286
|
+
* cache-checked and, on a miss, computed by `serveLazyTransform`. Mirrors `AssetSupport`'s lazy
|
|
287
|
+
* mode (CloudFront origin-group -> S3 -> Lambda on miss), except that a non-canonical spelling is
|
|
288
|
+
* served the canonical bytes rather than the Lambda's 301: this route is authenticated, and
|
|
289
|
+
* redirecting to `/assets/t/...` would bounce the request onto the public path.
|
|
290
|
+
*
|
|
291
|
+
* A stored object on a store that can presign (S3) is answered with a 302 to a presigned GET, so
|
|
292
|
+
* its bytes never pass through this process: the CMS Lambda is concurrency-capped and uncached,
|
|
293
|
+
* the live preview asks for every image on a page at once, and its Function URL cannot return a
|
|
294
|
+
* body over about 6 MiB. The redirect never targets the public `/assets/...` URL, because whether
|
|
295
|
+
* that URL reaches this route again is topology: `withCanopy` rewrites `/assets/:path*` here, so
|
|
296
|
+
* on any deployment where Next serves `/assets` the redirect would loop. Other stores stream the
|
|
297
|
+
* bytes, as does a fresh transform no larger than `INLINE_BODY_LIMIT_BYTES`.
|
|
289
298
|
*/
|
|
290
299
|
const rawAssetHandler = async (ctx, _req, params) => {
|
|
291
300
|
if (!ctx.assetStore)
|
|
@@ -300,23 +309,22 @@ const rawAssetHandler = async (ctx, _req, params) => {
|
|
|
300
309
|
if (!key.startsWith(publicPrefix) || key.includes('..')) {
|
|
301
310
|
return { ok: false, status: 404, error: 'Not found' };
|
|
302
311
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
contentDisposition: object.contentDisposition,
|
|
312
|
-
cacheControl: object.cacheControl,
|
|
313
|
-
},
|
|
314
|
-
};
|
|
312
|
+
let readKey = key;
|
|
313
|
+
let transform;
|
|
314
|
+
if (key.startsWith(transformPrefix)) {
|
|
315
|
+
const canonical = canonicalizeTransformPath(key.slice(transformPrefix.length).split('/'), 'any');
|
|
316
|
+
if (!canonical.ok)
|
|
317
|
+
return { ok: false, status: 400, error: canonical.error };
|
|
318
|
+
readKey = `${transformPrefix}${canonical.canonicalPath}`;
|
|
319
|
+
transform = canonical;
|
|
315
320
|
}
|
|
316
|
-
|
|
321
|
+
const stored = await serveStoredObject(ctx.assetStore, readKey);
|
|
322
|
+
if (stored)
|
|
323
|
+
return stored;
|
|
324
|
+
if (!transform) {
|
|
317
325
|
return { ok: false, status: 404, error: 'Not found' };
|
|
318
326
|
}
|
|
319
|
-
return serveLazyTransform(ctx.assetStore,
|
|
327
|
+
return serveLazyTransform(ctx.assetStore, transform, readKey);
|
|
320
328
|
};
|
|
321
329
|
// Deliberately no 'writableBranch' guard on any endpoint below: none take a
|
|
322
330
|
// :branch param -- the asset store is branch-agnostic (a single global store,
|
|
@@ -325,6 +333,7 @@ const presignAsset = defineEndpoint({
|
|
|
325
333
|
namespace: 'assets',
|
|
326
334
|
name: 'presign',
|
|
327
335
|
method: 'POST',
|
|
336
|
+
readOnly: true,
|
|
328
337
|
path: '/assets/presign',
|
|
329
338
|
body: presignAssetBodySchema,
|
|
330
339
|
bodyType: 'PresignAssetBody',
|
|
@@ -353,6 +362,7 @@ const finalizeAsset = defineEndpoint({
|
|
|
353
362
|
const uploadProxied = defineEndpoint({
|
|
354
363
|
namespace: 'assets',
|
|
355
364
|
name: 'uploadProxied',
|
|
365
|
+
clientTimeout: 'long',
|
|
356
366
|
method: 'POST',
|
|
357
367
|
path: '/assets/upload',
|
|
358
368
|
bodyFormat: 'multipart',
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a create of a branch name its own creator just made answers with that branch rather
|
|
3
|
+
* than a 409, so a request killed between publishing the branch and responding is safe to retry.
|
|
4
|
+
* Dependency-free: the editor applies the same rule when it settles an unanswered create.
|
|
5
|
+
* @internal Exported for tests.
|
|
6
|
+
*/
|
|
7
|
+
export declare const IDEMPOTENT_CREATE_WINDOW_MS: number;
|
|
8
|
+
/** Whether `branch` can be the result of `userId`'s create: theirs, and inside the window. */
|
|
9
|
+
export declare function isCreatorsRecentBranch(branch: {
|
|
10
|
+
createdBy: string;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}, userId: string | undefined): boolean;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a create of a branch name its own creator just made answers with that branch rather
|
|
3
|
+
* than a 409, so a request killed between publishing the branch and responding is safe to retry.
|
|
4
|
+
* Dependency-free: the editor applies the same rule when it settles an unanswered create.
|
|
5
|
+
* @internal Exported for tests.
|
|
6
|
+
*/
|
|
7
|
+
export const IDEMPOTENT_CREATE_WINDOW_MS = 5 * 60_000;
|
|
8
|
+
/** Whether `branch` can be the result of `userId`'s create: theirs, and inside the window. */
|
|
9
|
+
export function isCreatorsRecentBranch(branch, userId) {
|
|
10
|
+
return (userId !== undefined &&
|
|
11
|
+
branch.createdBy === userId &&
|
|
12
|
+
Date.now() - Date.parse(branch.createdAt) < IDEMPOTENT_CREATE_WINDOW_MS);
|
|
13
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { ApiResponse } from './types.js';
|
|
3
|
-
/** @internal No importer; deletion candidate in
|
|
3
|
+
/** @internal No importer; deletion candidate in safeinsights/canopycms#725. */
|
|
4
4
|
export interface MarkAsMergedParams {
|
|
5
5
|
branch: string;
|
|
6
6
|
}
|
package/dist/api/branch-merge.js
CHANGED
|
@@ -54,7 +54,7 @@ const markAsMergedHandler = async (gc, ctx, _req, params) => {
|
|
|
54
54
|
// console.error(`CanopyCMS: Failed to delete remote branch ${branchName}:`, err)
|
|
55
55
|
// }
|
|
56
56
|
// }
|
|
57
|
-
// Comments.json is already in the branch workspace at .
|
|
57
|
+
// Comments.json is already in the branch workspace at .canopy-meta/comments.json
|
|
58
58
|
// It will be preserved with the archived branch - no action needed
|
|
59
59
|
return {
|
|
60
60
|
ok: true,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import type
|
|
2
|
+
import { type BranchListItemResponse } from './branch.js';
|
|
3
3
|
export declare const requestChanges: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
4
4
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
5
5
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -10,7 +10,7 @@ export declare const requestChanges: import("./route-builder.js").RouteDefinitio
|
|
|
10
10
|
branch: string & {
|
|
11
11
|
readonly __brand: "BranchName";
|
|
12
12
|
};
|
|
13
|
-
}>, undefined,
|
|
13
|
+
}>, undefined, BranchListItemResponse>;
|
|
14
14
|
export declare const approveBranch: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
15
15
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
16
16
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -21,4 +21,4 @@ export declare const approveBranch: import("./route-builder.js").RouteDefinition
|
|
|
21
21
|
branch: string & {
|
|
22
22
|
readonly __brand: "BranchName";
|
|
23
23
|
};
|
|
24
|
-
}>, undefined,
|
|
24
|
+
}>, undefined, BranchListItemResponse>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { branchParamSchema } from './validators.js';
|
|
2
|
+
import { toBranchListItem } from './branch.js';
|
|
2
3
|
import { getBranchMetadataFileManager } from '../branch-metadata.js';
|
|
3
4
|
import { defineEndpoint } from './route-builder.js';
|
|
4
5
|
import { syncConvertToDraft } from './github-sync.js';
|
|
5
|
-
const requestChangesHandler = async (gc, ctx,
|
|
6
|
+
const requestChangesHandler = async (gc, ctx, req, _params) => {
|
|
6
7
|
const { branchContext } = gc;
|
|
7
8
|
if (branchContext.branch.status !== 'submitted') {
|
|
8
9
|
return {
|
|
@@ -16,10 +17,14 @@ const requestChangesHandler = async (gc, ctx, _req, _params) => {
|
|
|
16
17
|
const updated = await meta.save({
|
|
17
18
|
branch: { name: branchContext.branch.name, status: 'editing' },
|
|
18
19
|
});
|
|
19
|
-
// TODO: Optionally record comment in .
|
|
20
|
-
return {
|
|
20
|
+
// TODO: Optionally record comment in .canopy-meta/comments.json when comment system is implemented
|
|
21
|
+
return {
|
|
22
|
+
ok: true,
|
|
23
|
+
status: 200,
|
|
24
|
+
data: { branch: toBranchListItem(ctx.services.config, updated.branch, req.user) },
|
|
25
|
+
};
|
|
21
26
|
};
|
|
22
|
-
const approveBranchHandler = async (gc,
|
|
27
|
+
const approveBranchHandler = async (gc, ctx, req, _params) => {
|
|
23
28
|
const { branchContext } = gc;
|
|
24
29
|
if (branchContext.branch.status !== 'submitted') {
|
|
25
30
|
return {
|
|
@@ -33,7 +38,11 @@ const approveBranchHandler = async (gc, _ctx, _req, _params) => {
|
|
|
33
38
|
branch: { name: branchContext.branch.name, status: 'approved' },
|
|
34
39
|
});
|
|
35
40
|
// TODO: Optionally call githubService.approvePullRequest() when GitHub integration is needed
|
|
36
|
-
return {
|
|
41
|
+
return {
|
|
42
|
+
ok: true,
|
|
43
|
+
status: 200,
|
|
44
|
+
data: { branch: toBranchListItem(ctx.services.config, updated.branch, req.user) },
|
|
45
|
+
};
|
|
37
46
|
};
|
|
38
47
|
export const requestChanges = defineEndpoint({
|
|
39
48
|
namespace: 'workflow',
|
|
@@ -43,7 +52,7 @@ export const requestChanges = defineEndpoint({
|
|
|
43
52
|
params: branchParamSchema,
|
|
44
53
|
// body/bodyType removed: comment field was declared but never stored.
|
|
45
54
|
// Re-add when comment storage is implemented (see TODO in handler).
|
|
46
|
-
responseType: '
|
|
55
|
+
responseType: 'BranchListItemResponse',
|
|
47
56
|
response: {},
|
|
48
57
|
defaultMockData: {
|
|
49
58
|
branch: {
|
|
@@ -64,7 +73,7 @@ export const approveBranch = defineEndpoint({
|
|
|
64
73
|
method: 'POST',
|
|
65
74
|
path: '/:branch/approve',
|
|
66
75
|
params: branchParamSchema,
|
|
67
|
-
responseType: '
|
|
76
|
+
responseType: 'BranchListItemResponse',
|
|
68
77
|
response: {},
|
|
69
78
|
defaultMockData: {
|
|
70
79
|
branch: {
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ApiResponse } from './types.js';
|
|
3
|
+
import { type BranchListItem, type BranchListItemResponse } from './branch.js';
|
|
4
|
+
import type { StampedEntry } from '../stamp-on-publish.js';
|
|
3
5
|
export type { BranchMergeResponse } from './branch-merge.js';
|
|
6
|
+
/**
|
|
7
|
+
* A submit's answer: the branch, plus the entries the submit stamped (stamp-on-publish.ts) when
|
|
8
|
+
* there were any, so the editor can carry its open forms and drafts onto their new versions.
|
|
9
|
+
*/
|
|
10
|
+
export type SubmitBranchResponse = ApiResponse<{
|
|
11
|
+
branch: BranchListItem;
|
|
12
|
+
stamped?: StampedEntry[];
|
|
13
|
+
}>;
|
|
4
14
|
export declare const WORKFLOW_ROUTES: {
|
|
5
15
|
readonly getStatus: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
6
16
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
@@ -12,7 +22,7 @@ export declare const WORKFLOW_ROUTES: {
|
|
|
12
22
|
branch: string & {
|
|
13
23
|
readonly __brand: "BranchName";
|
|
14
24
|
};
|
|
15
|
-
}>, undefined,
|
|
25
|
+
}>, undefined, BranchListItemResponse>;
|
|
16
26
|
readonly submit: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
17
27
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
18
28
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -23,7 +33,7 @@ export declare const WORKFLOW_ROUTES: {
|
|
|
23
33
|
branch: string & {
|
|
24
34
|
readonly __brand: "BranchName";
|
|
25
35
|
};
|
|
26
|
-
}>, undefined,
|
|
36
|
+
}>, undefined, SubmitBranchResponse>;
|
|
27
37
|
readonly withdraw: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
28
38
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
29
39
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -34,7 +44,7 @@ export declare const WORKFLOW_ROUTES: {
|
|
|
34
44
|
branch: string & {
|
|
35
45
|
readonly __brand: "BranchName";
|
|
36
46
|
};
|
|
37
|
-
}>, undefined,
|
|
47
|
+
}>, undefined, BranchListItemResponse>;
|
|
38
48
|
readonly requestChanges: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
39
49
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
40
50
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -45,7 +55,7 @@ export declare const WORKFLOW_ROUTES: {
|
|
|
45
55
|
branch: string & {
|
|
46
56
|
readonly __brand: "BranchName";
|
|
47
57
|
};
|
|
48
|
-
}>, undefined,
|
|
58
|
+
}>, undefined, BranchListItemResponse>;
|
|
49
59
|
readonly approve: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
50
60
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
51
61
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -56,7 +66,7 @@ export declare const WORKFLOW_ROUTES: {
|
|
|
56
66
|
branch: string & {
|
|
57
67
|
readonly __brand: "BranchName";
|
|
58
68
|
};
|
|
59
|
-
}>, undefined,
|
|
69
|
+
}>, undefined, BranchListItemResponse>;
|
|
60
70
|
readonly markMerged: import("./route-builder.js").RouteDefinition<z.ZodObject<{
|
|
61
71
|
branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
|
|
62
72
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { branchParamSchema } from './validators.js';
|
|
2
|
+
import { toBranchListItem } from './branch.js';
|
|
2
3
|
import { getBranchMetadataFileManager } from '../branch-metadata.js';
|
|
3
4
|
import { withdrawBranch } from './branch-withdraw.js';
|
|
4
5
|
import { requestChanges, approveBranch } from './branch-review.js';
|
|
@@ -10,9 +11,15 @@ import { getErrorMessage, redactCredentials, sanitizeErrorMessage } from '../uti
|
|
|
10
11
|
import { isNonFastForwardRejection } from '../utils/git.js';
|
|
11
12
|
import { ContentWriteLockBusyError } from '../utils/content-write-lock.js';
|
|
12
13
|
import { submissionEditorFromUser } from '../submission-attribution.js';
|
|
13
|
-
|
|
14
|
+
import { NothingToSubmitError } from '../services.js';
|
|
15
|
+
import { baseBranchOf } from '../utils/base-branch.js';
|
|
16
|
+
const getBranchStatusHandler = async (gc, ctx, req, _params) => {
|
|
14
17
|
const { branchContext } = gc;
|
|
15
|
-
return {
|
|
18
|
+
return {
|
|
19
|
+
ok: true,
|
|
20
|
+
status: 200,
|
|
21
|
+
data: { branch: toBranchListItem(ctx.services.config, branchContext.branch, req.user) },
|
|
22
|
+
};
|
|
16
23
|
};
|
|
17
24
|
const submitBranchForMergeHandler = async (gc, ctx, req, _params) => {
|
|
18
25
|
const { branchContext } = gc;
|
|
@@ -28,7 +35,7 @@ const submitBranchForMergeHandler = async (gc, ctx, req, _params) => {
|
|
|
28
35
|
return {
|
|
29
36
|
ok: false,
|
|
30
37
|
status: 403,
|
|
31
|
-
error: '
|
|
38
|
+
error: 'You do not have permission to submit this branch for review.',
|
|
32
39
|
};
|
|
33
40
|
}
|
|
34
41
|
// Only an 'editing' branch may be submitted, mirroring
|
|
@@ -37,9 +44,8 @@ const submitBranchForMergeHandler = async (gc, ctx, req, _params) => {
|
|
|
37
44
|
// (merged) branch could be re-submitted by its creator, re-stamping it
|
|
38
45
|
// 'submitted' and overwriting the merged PR's title/body.
|
|
39
46
|
//
|
|
40
|
-
// Fails closed on a missing status
|
|
41
|
-
//
|
|
42
|
-
// `undefined`) -- same as runWritableBranchGuard's unreadable-status arm.
|
|
47
|
+
// Fails closed on a missing status, same as runWritableBranchGuard's
|
|
48
|
+
// unreadable-status arm.
|
|
43
49
|
const status = branchContext.branch.status;
|
|
44
50
|
if (status !== 'editing') {
|
|
45
51
|
return {
|
|
@@ -52,12 +58,22 @@ const submitBranchForMergeHandler = async (gc, ctx, req, _params) => {
|
|
|
52
58
|
}
|
|
53
59
|
// Commit and push changes
|
|
54
60
|
const submitter = submissionEditorFromUser(req.user);
|
|
61
|
+
const { authPlugin } = ctx;
|
|
55
62
|
let changedPaths;
|
|
63
|
+
let editors;
|
|
64
|
+
let stamped;
|
|
56
65
|
try {
|
|
57
66
|
;
|
|
58
|
-
({ changedPaths } = await ctx.services.submitBranch({
|
|
67
|
+
({ changedPaths, editors, stamped } = await ctx.services.submitBranch({
|
|
68
|
+
context: branchContext,
|
|
69
|
+
submitter,
|
|
70
|
+
lookupEditor: authPlugin ? (id) => authPlugin.getUserMetadata(id) : undefined,
|
|
71
|
+
}));
|
|
59
72
|
}
|
|
60
73
|
catch (err) {
|
|
74
|
+
if (err instanceof NothingToSubmitError) {
|
|
75
|
+
return { ok: false, status: 400, error: err.message };
|
|
76
|
+
}
|
|
61
77
|
// Retriable either way: a resubmit commits nothing new and pushes only
|
|
62
78
|
// what has not reached the remote.
|
|
63
79
|
if (err instanceof ContentWriteLockBusyError) {
|
|
@@ -106,13 +122,34 @@ const submitBranchForMergeHandler = async (gc, ctx, req, _params) => {
|
|
|
106
122
|
};
|
|
107
123
|
}
|
|
108
124
|
// Create or update PR (sync via githubService, or async via task queue)
|
|
109
|
-
const
|
|
110
|
-
|
|
125
|
+
const submittedAt = new Date().toISOString();
|
|
126
|
+
const prResult = await syncSubmitPr(ctx, branchContext, {
|
|
127
|
+
submitter,
|
|
128
|
+
editors,
|
|
129
|
+
changedPaths,
|
|
130
|
+
submittedAt,
|
|
131
|
+
});
|
|
111
132
|
const meta = getBranchMetadataFileManager(branchContext.branchRoot, branchContext.baseRoot);
|
|
133
|
+
const pushed = prResult.pushedToGitHub ? { pushedToGitHubAt: submittedAt } : {};
|
|
134
|
+
// GitHub found nothing between the pushed branch and its base, though the diff above found
|
|
135
|
+
// changes: GitHub's base can already hold them, or the diff could not be computed. The branch
|
|
136
|
+
// stays editable; the stamp records that it is now on GitHub, for delete.
|
|
137
|
+
if (prResult.nothingToSubmit) {
|
|
138
|
+
await meta.save({ branch: { name: branchContext.branch.name, ...pushed } });
|
|
139
|
+
const base = branchContext.branch.baseBranch ?? baseBranchOf(ctx.services.config);
|
|
140
|
+
return {
|
|
141
|
+
ok: false,
|
|
142
|
+
status: 400,
|
|
143
|
+
error: new NothingToSubmitError(branchContext.branch.name, base).message,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
112
146
|
const updated = await meta.save({
|
|
113
147
|
branch: {
|
|
114
148
|
name: branchContext.branch.name,
|
|
115
149
|
status: 'submitted',
|
|
150
|
+
submittedAt,
|
|
151
|
+
...pushed,
|
|
152
|
+
syncFailureReason: prResult.syncFailureReason,
|
|
116
153
|
pullRequestUrl: prResult.prUrl ?? branchContext.branch.pullRequestUrl,
|
|
117
154
|
pullRequestNumber: prResult.prNumber ?? branchContext.branch.pullRequestNumber,
|
|
118
155
|
...(prResult.syncStatus !== undefined ? { syncStatus: prResult.syncStatus } : {}),
|
|
@@ -122,7 +159,14 @@ const submitBranchForMergeHandler = async (gc, ctx, req, _params) => {
|
|
|
122
159
|
rebaseFailure: undefined,
|
|
123
160
|
},
|
|
124
161
|
});
|
|
125
|
-
return {
|
|
162
|
+
return {
|
|
163
|
+
ok: true,
|
|
164
|
+
status: 200,
|
|
165
|
+
data: {
|
|
166
|
+
branch: toBranchListItem(ctx.services.config, updated.branch, req.user),
|
|
167
|
+
...(stamped.length > 0 ? { stamped } : {}),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
126
170
|
};
|
|
127
171
|
const getBranchStatus = defineEndpoint({
|
|
128
172
|
namespace: 'workflow',
|
|
@@ -130,7 +174,7 @@ const getBranchStatus = defineEndpoint({
|
|
|
130
174
|
method: 'GET',
|
|
131
175
|
path: '/:branch/status',
|
|
132
176
|
params: branchParamSchema,
|
|
133
|
-
responseType: '
|
|
177
|
+
responseType: 'BranchListItemResponse',
|
|
134
178
|
response: {},
|
|
135
179
|
defaultMockData: {
|
|
136
180
|
branch: {
|
|
@@ -148,10 +192,11 @@ const getBranchStatus = defineEndpoint({
|
|
|
148
192
|
const submitBranchForMerge = defineEndpoint({
|
|
149
193
|
namespace: 'workflow',
|
|
150
194
|
name: 'submit',
|
|
195
|
+
clientTimeout: 'long',
|
|
151
196
|
method: 'POST',
|
|
152
197
|
path: '/:branch/submit',
|
|
153
198
|
params: branchParamSchema,
|
|
154
|
-
responseType: '
|
|
199
|
+
responseType: 'SubmitBranchResponse',
|
|
155
200
|
response: {},
|
|
156
201
|
defaultMockData: {
|
|
157
202
|
branch: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import type
|
|
2
|
+
import { type BranchListItemResponse } from './branch.js';
|
|
3
3
|
/**
|
|
4
4
|
* Withdraw a submitted branch, converting the PR to draft and unlocking editing
|
|
5
5
|
*
|
|
@@ -19,4 +19,4 @@ export declare const withdrawBranch: import("./route-builder.js").RouteDefinitio
|
|
|
19
19
|
branch: string & {
|
|
20
20
|
readonly __brand: "BranchName";
|
|
21
21
|
};
|
|
22
|
-
}>, undefined,
|
|
22
|
+
}>, undefined, BranchListItemResponse>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { branchParamSchema } from './validators.js';
|
|
2
|
+
import { toBranchListItem } from './branch.js';
|
|
2
3
|
import { getBranchMetadataFileManager } from '../branch-metadata.js';
|
|
3
4
|
import { defineEndpoint } from './route-builder.js';
|
|
4
5
|
import { canPerformWorkflowAction, getBranchProtection } from '../authorization/index.js';
|
|
@@ -18,7 +19,7 @@ const withdrawBranchHandler = async (gc, ctx, req, _params) => {
|
|
|
18
19
|
return {
|
|
19
20
|
ok: false,
|
|
20
21
|
status: 403,
|
|
21
|
-
error: '
|
|
22
|
+
error: 'You do not have permission to withdraw this branch from review.',
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
25
|
// 'approved' is accepted alongside 'submitted' because withdraw is its only
|
|
@@ -60,7 +61,11 @@ const withdrawBranchHandler = async (gc, ctx, req, _params) => {
|
|
|
60
61
|
: {}),
|
|
61
62
|
},
|
|
62
63
|
});
|
|
63
|
-
return {
|
|
64
|
+
return {
|
|
65
|
+
ok: true,
|
|
66
|
+
status: 200,
|
|
67
|
+
data: { branch: toBranchListItem(ctx.services.config, updated.branch, req.user) },
|
|
68
|
+
};
|
|
64
69
|
};
|
|
65
70
|
/**
|
|
66
71
|
* Withdraw a submitted branch, converting the PR to draft and unlocking editing
|
|
@@ -77,7 +82,7 @@ export const withdrawBranch = defineEndpoint({
|
|
|
77
82
|
method: 'POST',
|
|
78
83
|
path: '/:branch/withdraw',
|
|
79
84
|
params: branchParamSchema,
|
|
80
|
-
responseType: '
|
|
85
|
+
responseType: 'BranchListItemResponse',
|
|
81
86
|
response: {},
|
|
82
87
|
defaultMockData: {
|
|
83
88
|
branch: {
|