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
|
@@ -3,12 +3,40 @@ import path from 'node:path';
|
|
|
3
3
|
import lockfile from 'proper-lockfile';
|
|
4
4
|
import { getErrorMessage, isNodeError } from './error.js';
|
|
5
5
|
import { canopyLogWarn } from './logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Wrap a compromise handler for proper-lockfile's `onCompromised`, which it invokes from inside
|
|
8
|
+
* its refresh timer: ANY throw escaping there is an uncaught exception that kills the process.
|
|
9
|
+
* Call sites are told not to throw (see {@link OnLockCompromised}); this makes it structural
|
|
10
|
+
* rather than a convention, and also covers the LOGGER throwing -- under `CI=true`, vitest's
|
|
11
|
+
* `onConsoleLog` turns a console write into a throw.
|
|
12
|
+
*
|
|
13
|
+
* Handlers report through an always-on logger (`canopyLogWarn`), never the debug logger: "two
|
|
14
|
+
* holders may now be live" must be visible without CANOPYCMS_DEBUG.
|
|
15
|
+
*/
|
|
16
|
+
export function guardOnCompromised(handler, lockPath) {
|
|
17
|
+
return (err) => {
|
|
18
|
+
try {
|
|
19
|
+
handler(err);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Last resort: a raw stderr write goes around both a replaced logger and vitest's console
|
|
23
|
+
// interception, so the compromise still leaves a trace. Guarded in turn, because nothing
|
|
24
|
+
// here is allowed to throw out of a refresh timer.
|
|
25
|
+
try {
|
|
26
|
+
process.stderr.write(`[canopy] lock compromised for ${lockPath}; its handler or logger threw\n`);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Nothing further is safe to attempt.
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
6
34
|
/**
|
|
7
35
|
* When an acquirer may take a provisioning marker over. Staleness is read from the marker's mtime,
|
|
8
36
|
* which EFS serves from the NFS attribute cache for up to 60s, so a live holder's 15s refreshes
|
|
9
37
|
* can look 60s late; one threshold above that for every acquirer means none reaps a live hold.
|
|
10
38
|
*/
|
|
11
|
-
const PROVISIONING_LOCK_STALE_MS = 90_000;
|
|
39
|
+
export const PROVISIONING_LOCK_STALE_MS = 90_000;
|
|
12
40
|
/**
|
|
13
41
|
* Shared option set for both provisioning-lock variants.
|
|
14
42
|
*
|
|
@@ -30,35 +58,12 @@ function provisioningLockOptions(lockPath, retries, onCompromised, staleMs) {
|
|
|
30
58
|
stale: staleMs,
|
|
31
59
|
// Fixed, not stale/2: every holder refreshes at 15s whatever threshold it judges others by.
|
|
32
60
|
update: 15_000,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
if (onCompromised) {
|
|
41
|
-
onCompromised(err);
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
// Default: log and let the holder finish. proper-lockfile's own default rethrows from
|
|
45
|
-
// the refresh timer, which protects nothing -- by the time a compromise is reported the
|
|
46
|
-
// mutual exclusion is already gone. `canopyLogWarn`, not the debug logger, because "two
|
|
47
|
-
// holders may now be live" must be visible without CANOPYCMS_DEBUG.
|
|
48
|
-
canopyLogWarn(`[canopy] Provisioning lock compromised mid-hold for ${lockPath}:`, getErrorMessage(err));
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
// Last resort: a raw stderr write goes around both a replaced logger and vitest's console
|
|
52
|
-
// interception, so the compromise still leaves a trace. Guarded in turn, because nothing
|
|
53
|
-
// here is allowed to throw out of a refresh timer.
|
|
54
|
-
try {
|
|
55
|
-
process.stderr.write(`[canopy] lock compromised for ${lockPath}; its handler or logger threw\n`);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
// Nothing further is safe to attempt.
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
},
|
|
61
|
+
onCompromised: guardOnCompromised(onCompromised ??
|
|
62
|
+
((err) =>
|
|
63
|
+
// Default: log and let the holder finish. proper-lockfile's own default rethrows from
|
|
64
|
+
// the refresh timer, which protects nothing -- by the time a compromise is reported the
|
|
65
|
+
// mutual exclusion is already gone.
|
|
66
|
+
canopyLogWarn(`[canopy] Provisioning lock compromised mid-hold for ${lockPath}:`, getErrorMessage(err))), lockPath),
|
|
62
67
|
};
|
|
63
68
|
}
|
|
64
69
|
/**
|
|
@@ -131,10 +136,51 @@ export async function acquireProvisioningLock(lockTargetDir, lockName, onComprom
|
|
|
131
136
|
*
|
|
132
137
|
* @param staleMs how old the marker must look before this caller takes it over; defaults to
|
|
133
138
|
* {@link PROVISIONING_LOCK_STALE_MS}
|
|
139
|
+
* @param createParents whether a missing parent of `lockTargetDir` is created. A lock inside a
|
|
140
|
+
* branch passes false: a waiter must never recreate a branch root a delete removed, so a missing
|
|
141
|
+
* parent fails with ENOENT instead.
|
|
134
142
|
*/
|
|
135
|
-
export async function tryAcquireProvisioningLock(lockTargetDir, lockName, onCompromised, staleMs = PROVISIONING_LOCK_STALE_MS) {
|
|
136
|
-
|
|
143
|
+
export async function tryAcquireProvisioningLock(lockTargetDir, lockName, onCompromised, staleMs = PROVISIONING_LOCK_STALE_MS, createParents = true) {
|
|
144
|
+
if (createParents) {
|
|
145
|
+
await fs.mkdir(lockTargetDir, { recursive: true });
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
await fs.mkdir(lockTargetDir).catch((err) => {
|
|
149
|
+
if (!isNodeError(err) || err.code !== 'EEXIST')
|
|
150
|
+
throw err;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
137
153
|
const lockPath = path.join(lockTargetDir, lockName);
|
|
138
154
|
const release = await lockfile.lock(lockPath, provisioningLockOptions(lockPath, 0, onCompromised, staleMs));
|
|
139
155
|
return releaseIgnoringAlreadyReleased(release, lockPath);
|
|
140
156
|
}
|
|
157
|
+
const sleep = (ms) => new Promise((resolve) => {
|
|
158
|
+
setTimeout(resolve, ms);
|
|
159
|
+
});
|
|
160
|
+
/**
|
|
161
|
+
* {@link tryAcquireProvisioningLock} retried for at most `waitMs`, for a caller whose own hold is
|
|
162
|
+
* milliseconds long (publishing a staged branch workspace). A dead holder's marker stays live for
|
|
163
|
+
* {@link PROVISIONING_LOCK_STALE_MS}, so waiting it out from a request would spend the request's
|
|
164
|
+
* whole timeout; this gives up instead.
|
|
165
|
+
*
|
|
166
|
+
* Retries only on `ELOCKED`, like the content-write lock's bounded wait.
|
|
167
|
+
*
|
|
168
|
+
* @throws the last `ELOCKED` error once the budget is spent
|
|
169
|
+
*/
|
|
170
|
+
export async function acquireProvisioningLockWithin(lockTargetDir, lockName, waitMs, onCompromised) {
|
|
171
|
+
const startedAt = Date.now();
|
|
172
|
+
for (let attempt = 0;; attempt++) {
|
|
173
|
+
try {
|
|
174
|
+
return await tryAcquireProvisioningLock(lockTargetDir, lockName, onCompromised);
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
if (!isNodeError(err) || err.code !== 'ELOCKED')
|
|
178
|
+
throw err;
|
|
179
|
+
const remaining = waitMs - (Date.now() - startedAt);
|
|
180
|
+
if (remaining <= 0)
|
|
181
|
+
throw err;
|
|
182
|
+
const base = Math.min(50 * 2 ** attempt, 500);
|
|
183
|
+
await sleep(Math.min(base * (0.5 + Math.random()), remaining));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -55,36 +55,22 @@ export declare function neutralizeImplicitOffOrigin(url: string): string;
|
|
|
55
55
|
* this file either way, so the two surfaces cannot drift into disagreeing about which schemes
|
|
56
56
|
* are acceptable (that drift is exactly why `utils/url-prefix.ts` exists — see its header).
|
|
57
57
|
*
|
|
58
|
-
* `
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
* a working configuration. A bad value costs a broken `<img>`.
|
|
65
|
-
* - A WRITE-side endpoint (`media.uploadUrl`, where the browser POSTs a presigned upload) must
|
|
66
|
-
* not be protocol-relative even when spelled literally, because such a URL is AMBIGUOUS: it
|
|
67
|
-
* resolves to http or https depending on the scheme of whichever editor page happens to
|
|
68
|
-
* issue the upload, so the stored config does not determine where a live presigned credential
|
|
69
|
-
* and the user's file bytes are sent. That is the same principle every other rule here
|
|
70
|
-
* enforces — a config value must describe what actually happens.
|
|
71
|
-
*
|
|
72
|
-
* Note this is NOT an argument that http is forbidden on the write side; bare `http://` is
|
|
73
|
-
* accepted, because a loopback or in-cluster S3-compatible endpoint is a real need and a
|
|
74
|
-
* browser on an https editor blocks the mixed-content request anyway, so it fails closed. The
|
|
75
|
-
* objection to `//host` is that it is undetermined, not that it might be insecure.
|
|
58
|
+
* A protocol-relative `//host` is refused even when spelled literally, because it is AMBIGUOUS:
|
|
59
|
+
* it resolves to http or https depending on the page issuing the request, so the stored config
|
|
60
|
+
* does not determine where, for `media.uploadUrl`, a live presigned credential and the user's
|
|
61
|
+
* file bytes are sent. Bare `http://` is accepted: a loopback or in-cluster S3-compatible
|
|
62
|
+
* endpoint is a real need, and a browser on an https editor blocks the mixed-content request
|
|
63
|
+
* anyway, so it fails closed.
|
|
76
64
|
*
|
|
77
65
|
* Every spelling that READS as site-relative while redefining the authority — `/\host`,
|
|
78
|
-
* `\\host`, `\/host`, `///host` — is rejected
|
|
66
|
+
* `\\host`, `\/host`, `///host` — is rejected too. Those look site-relative
|
|
79
67
|
* to a human and to a naive `startsWith('/')` check, but WHATWG URL resolves each to a
|
|
80
68
|
* different authority (measured: `///x` resolves to host `x`, not to pathname `/x`), so they
|
|
81
69
|
* are never what an adopter meant. A scheme-qualified absolute URL is a separate case and is
|
|
82
70
|
* accepted — `https:///cdn.example.com/` is unusual but unambiguous, resolving identically
|
|
83
71
|
* standalone and against any base.
|
|
84
72
|
*/
|
|
85
|
-
export declare function isHttpUrlOrSameOriginPath(value: string
|
|
86
|
-
allowProtocolRelative?: boolean;
|
|
87
|
-
}): boolean;
|
|
73
|
+
export declare function isHttpUrlOrSameOriginPath(value: string): boolean;
|
|
88
74
|
/**
|
|
89
75
|
* Sanitize an untrusted URL for use in `href` attributes.
|
|
90
76
|
*
|
|
@@ -122,4 +108,4 @@ export declare function isHttpUrlOrSameOriginPath(value: string, opts?: {
|
|
|
122
108
|
* <a href={sanitizeHref(cta.link)}>{cta.text}</a>
|
|
123
109
|
* ```
|
|
124
110
|
*/
|
|
125
|
-
export declare function sanitizeHref(url: string, fallback?: string): string;
|
|
111
|
+
export declare function sanitizeHref(url: string | null | undefined, fallback?: string): string;
|
|
@@ -90,34 +90,22 @@ export function neutralizeImplicitOffOrigin(url) {
|
|
|
90
90
|
* this file either way, so the two surfaces cannot drift into disagreeing about which schemes
|
|
91
91
|
* are acceptable (that drift is exactly why `utils/url-prefix.ts` exists — see its header).
|
|
92
92
|
*
|
|
93
|
-
* `
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* a working configuration. A bad value costs a broken `<img>`.
|
|
100
|
-
* - A WRITE-side endpoint (`media.uploadUrl`, where the browser POSTs a presigned upload) must
|
|
101
|
-
* not be protocol-relative even when spelled literally, because such a URL is AMBIGUOUS: it
|
|
102
|
-
* resolves to http or https depending on the scheme of whichever editor page happens to
|
|
103
|
-
* issue the upload, so the stored config does not determine where a live presigned credential
|
|
104
|
-
* and the user's file bytes are sent. That is the same principle every other rule here
|
|
105
|
-
* enforces — a config value must describe what actually happens.
|
|
106
|
-
*
|
|
107
|
-
* Note this is NOT an argument that http is forbidden on the write side; bare `http://` is
|
|
108
|
-
* accepted, because a loopback or in-cluster S3-compatible endpoint is a real need and a
|
|
109
|
-
* browser on an https editor blocks the mixed-content request anyway, so it fails closed. The
|
|
110
|
-
* objection to `//host` is that it is undetermined, not that it might be insecure.
|
|
93
|
+
* A protocol-relative `//host` is refused even when spelled literally, because it is AMBIGUOUS:
|
|
94
|
+
* it resolves to http or https depending on the page issuing the request, so the stored config
|
|
95
|
+
* does not determine where, for `media.uploadUrl`, a live presigned credential and the user's
|
|
96
|
+
* file bytes are sent. Bare `http://` is accepted: a loopback or in-cluster S3-compatible
|
|
97
|
+
* endpoint is a real need, and a browser on an https editor blocks the mixed-content request
|
|
98
|
+
* anyway, so it fails closed.
|
|
111
99
|
*
|
|
112
100
|
* Every spelling that READS as site-relative while redefining the authority — `/\host`,
|
|
113
|
-
* `\\host`, `\/host`, `///host` — is rejected
|
|
101
|
+
* `\\host`, `\/host`, `///host` — is rejected too. Those look site-relative
|
|
114
102
|
* to a human and to a naive `startsWith('/')` check, but WHATWG URL resolves each to a
|
|
115
103
|
* different authority (measured: `///x` resolves to host `x`, not to pathname `/x`), so they
|
|
116
104
|
* are never what an adopter meant. A scheme-qualified absolute URL is a separate case and is
|
|
117
105
|
* accepted — `https:///cdn.example.com/` is unusual but unambiguous, resolving identically
|
|
118
106
|
* standalone and against any base.
|
|
119
107
|
*/
|
|
120
|
-
export function isHttpUrlOrSameOriginPath(value
|
|
108
|
+
export function isHttpUrlOrSameOriginPath(value) {
|
|
121
109
|
if (value === '')
|
|
122
110
|
return false;
|
|
123
111
|
// Reject ASCII control characters and spaces ANYWHERE in the value, not only at the edges.
|
|
@@ -132,7 +120,7 @@ export function isHttpUrlOrSameOriginPath(value, opts = {}) {
|
|
|
132
120
|
}
|
|
133
121
|
// A query or fragment is meaningless on both sides this predicate serves. S3's POST Object
|
|
134
122
|
// takes no query parameters and a browser never transmits a fragment; and on the read side a
|
|
135
|
-
// prefix carrying either produces `https://cdn.example.com/?x=1
|
|
123
|
+
// prefix carrying either produces `https://cdn.example.com/?x=1/…` once joined.
|
|
136
124
|
if (value.includes('?') || value.includes('#'))
|
|
137
125
|
return false;
|
|
138
126
|
// A backslash is never legitimate in a configured URL, and it is not merely cosmetic: WHATWG
|
|
@@ -169,13 +157,8 @@ export function isHttpUrlOrSameOriginPath(value, opts = {}) {
|
|
|
169
157
|
return false;
|
|
170
158
|
}
|
|
171
159
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
// off-origin" and also start with `//`, but resolve to a host named `x` rather than to a
|
|
175
|
-
// path — so they must not ride in on the opt-in.
|
|
176
|
-
if (isImplicitlyOffOrigin(value)) {
|
|
177
|
-
return opts.allowProtocolRelative === true && value.startsWith('//') && value[2] !== '/';
|
|
178
|
-
}
|
|
160
|
+
if (isImplicitlyOffOrigin(value))
|
|
161
|
+
return false;
|
|
179
162
|
// Site-relative, with exactly one leading slash. The second clause also covers `//`, which
|
|
180
163
|
// `isImplicitlyOffOrigin` reports as false only because `new URL('//', base)` throws.
|
|
181
164
|
return value.startsWith('/') && value[1] !== '/';
|
|
@@ -218,6 +201,9 @@ export function isHttpUrlOrSameOriginPath(value, opts = {}) {
|
|
|
218
201
|
* ```
|
|
219
202
|
*/
|
|
220
203
|
export function sanitizeHref(url, fallback = '#') {
|
|
204
|
+
// A live preview's draft can lack the field, as after a Clear and a partial refill.
|
|
205
|
+
if (typeof url !== 'string')
|
|
206
|
+
return fallback;
|
|
221
207
|
const trimmed = url.trim();
|
|
222
208
|
if (trimmed === '')
|
|
223
209
|
return fallback;
|
|
@@ -5,6 +5,16 @@ import type { FieldConfig } from '../config/index.js';
|
|
|
5
5
|
* @internal Exported for tests.
|
|
6
6
|
*/
|
|
7
7
|
export declare function extractTitleFromSchema(fields: readonly FieldConfig[], data: Record<string, unknown>): string | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* The data path `resolveEntryTitle` reads the title from for these fields: the `isTitle` field
|
|
10
|
+
* (found by the walk `extractTitleFromSchema` uses, so inline groups are transparent and
|
|
11
|
+
* non-list objects are entered), else a top-level plain-string field named `title`, then `name`
|
|
12
|
+
* (fields of an inline group count as top level, as they do in the data).
|
|
13
|
+
* Undefined when the schema has no such field, so a create form has nothing to ask a title for.
|
|
14
|
+
*/
|
|
15
|
+
export declare function titleFieldPath(fields: readonly FieldConfig[]): readonly string[] | undefined;
|
|
16
|
+
/** Data holding `title` at `path`: `['hero', 'title']` gives `{ hero: { title } }`. */
|
|
17
|
+
export declare function withTitleAtPath(path: readonly string[], title: string): Record<string, unknown>;
|
|
8
18
|
/**
|
|
9
19
|
* Convert a slug like "my-cool-page" to "My Cool Page".
|
|
10
20
|
* @internal Exported for tests.
|
|
@@ -33,6 +33,53 @@ function findTitleValue(fields, data) {
|
|
|
33
33
|
}
|
|
34
34
|
return undefined;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* The data path `resolveEntryTitle` reads the title from for these fields: the `isTitle` field
|
|
38
|
+
* (found by the walk `extractTitleFromSchema` uses, so inline groups are transparent and
|
|
39
|
+
* non-list objects are entered), else a top-level plain-string field named `title`, then `name`
|
|
40
|
+
* (fields of an inline group count as top level, as they do in the data).
|
|
41
|
+
* Undefined when the schema has no such field, so a create form has nothing to ask a title for.
|
|
42
|
+
*/
|
|
43
|
+
export function titleFieldPath(fields) {
|
|
44
|
+
return (findTitlePath(fields) ??
|
|
45
|
+
findNamedStringField(fields, 'title') ??
|
|
46
|
+
findNamedStringField(fields, 'name'));
|
|
47
|
+
}
|
|
48
|
+
function findTitlePath(fields) {
|
|
49
|
+
for (const field of fields) {
|
|
50
|
+
if (isGroupField(field)) {
|
|
51
|
+
const result = findTitlePath(field.fields);
|
|
52
|
+
if (result)
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
else if ('isTitle' in field && field.isTitle) {
|
|
56
|
+
return [field.name];
|
|
57
|
+
}
|
|
58
|
+
else if (field.type === 'object' && 'fields' in field && field.fields && !field.list) {
|
|
59
|
+
const nested = findTitlePath(field.fields);
|
|
60
|
+
if (nested)
|
|
61
|
+
return [field.name, ...nested];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
function findNamedStringField(fields, name) {
|
|
67
|
+
for (const field of fields) {
|
|
68
|
+
if (isGroupField(field)) {
|
|
69
|
+
const result = findNamedStringField(field.fields, name);
|
|
70
|
+
if (result)
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
else if (field.name === name && field.type === 'string' && !field.list) {
|
|
74
|
+
return [field.name];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
/** Data holding `title` at `path`: `['hero', 'title']` gives `{ hero: { title } }`. */
|
|
80
|
+
export function withTitleAtPath(path, title) {
|
|
81
|
+
return path.reduceRight((value, key) => ({ [key]: value }), title);
|
|
82
|
+
}
|
|
36
83
|
/**
|
|
37
84
|
* Convert a slug like "my-cool-page" to "My Cool Page".
|
|
38
85
|
* @internal Exported for tests.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Print a reconciled YAML document by editing the source text it was parsed from, so the bytes
|
|
3
|
+
* the reconciler did not change stay as the author wrote them.
|
|
4
|
+
*
|
|
5
|
+
* `Document.toString()` re-emits every scalar from its VALUE: folded and long plain scalars are
|
|
6
|
+
* re-wrapped at the library's line width, so the first CMS save of a hand-written file rewrites
|
|
7
|
+
* lines nobody edited. Here a clean subtree is copied verbatim from the source, and only a slot
|
|
8
|
+
* the reconciler touched is re-rendered, at the column it already occupies:
|
|
9
|
+
*
|
|
10
|
+
* - **Map**: the reconciler keeps retained pairs in source order and appends new ones, so a map
|
|
11
|
+
* becomes a list of local edits — delete a dropped pair's lines, re-render a pair whose value
|
|
12
|
+
* was replaced, recurse into a value edited in place, insert new pairs after the last item.
|
|
13
|
+
* - **Sequence**: items can be reordered, so the item region is rebuilt as a concatenation of
|
|
14
|
+
* per-item chunks, each one either an original item's source (recursively patched) or a freshly
|
|
15
|
+
* rendered item.
|
|
16
|
+
*
|
|
17
|
+
* A chunk is an item's lines plus the comment and blank lines above it, which is where `yaml`
|
|
18
|
+
* attaches those comments (the item's `commentBefore`), so a chunk moves and dies with exactly
|
|
19
|
+
* the comments the reconciler moves and drops. Above a nested collection's FIRST item they
|
|
20
|
+
* belong to the collection instead, and stay put; above the root map's first key they are the
|
|
21
|
+
* key's (`ownLeadingLines`).
|
|
22
|
+
*
|
|
23
|
+
* Anything this does not handle returns `undefined` from that collection, and the parent
|
|
24
|
+
* re-renders the whole slot instead; only at the root does that reach the caller, which falls
|
|
25
|
+
* back to the reconciled document as `yaml` prints it. Every splice is also re-parsed and
|
|
26
|
+
* checked ({@link printsAs}) before it is returned, so a wrong splice costs formatting, never
|
|
27
|
+
* data.
|
|
28
|
+
*/
|
|
29
|
+
import { Document, YAMLMap, YAMLSeq } from 'yaml';
|
|
30
|
+
type Collection = YAMLMap<unknown, unknown> | YAMLSeq<unknown>;
|
|
31
|
+
/** One parsed item: a pair for a map, the item node for a sequence. */
|
|
32
|
+
interface SnapshotItem {
|
|
33
|
+
readonly item: unknown;
|
|
34
|
+
/** A map pair's value as parsed; the reconciler reassigns `pair.value`. */
|
|
35
|
+
readonly value: unknown;
|
|
36
|
+
}
|
|
37
|
+
/** The parsed document's shape, taken before the reconciler runs. */
|
|
38
|
+
export interface SourceSnapshot {
|
|
39
|
+
/** Every collection's items exactly as parsed. */
|
|
40
|
+
readonly items: ReadonlyMap<Collection, readonly SnapshotItem[]>;
|
|
41
|
+
/** The source uses anchors or aliases; an edit through an alias is not local to one slot. */
|
|
42
|
+
readonly anchored: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare function snapshotDocument(doc: Document): SourceSnapshot;
|
|
45
|
+
/**
|
|
46
|
+
* `printed` (a `toString()`) written with `raw`'s line endings: CRLF when `raw` is consistently
|
|
47
|
+
* CRLF, else LF. Either way without the stray `\r` that comments parsed from CRLF keep, so a
|
|
48
|
+
* whole-file re-print does not leave the file with mixed line endings.
|
|
49
|
+
*/
|
|
50
|
+
export declare function withSourceLineEndings(printed: string, raw: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* The source text of `raw` with only the reconciler's changes applied, or undefined when the
|
|
53
|
+
* document holds a construct this does not splice or the splice fails its self-check.
|
|
54
|
+
* `replaced` maps each node the reconciler created for an existing slot back to the node it
|
|
55
|
+
* replaced; `printed` is the reconciled document's `toString()`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function spliceSource(raw: string, doc: Document, snapshot: SourceSnapshot, replaced: WeakMap<object, unknown>, printed: string): string | undefined;
|
|
58
|
+
export {};
|