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/branch-workspace.js
CHANGED
|
@@ -1,52 +1,203 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
1
2
|
import path from 'node:path';
|
|
2
|
-
import { BranchPathError,
|
|
3
|
-
import {
|
|
3
|
+
import { BranchPathError, isSettingsBranchName, resolveBranchPath } from './paths/index.js';
|
|
4
|
+
import { buildInitialBranchMetadata, loadBranchContext } from './branch-metadata.js';
|
|
5
|
+
import { BRANCH_META_DIR, BRANCH_META_FILE, readBranchMetadataFile } from './branch-metadata-file.js';
|
|
6
|
+
import { BranchRegistry } from './branch-registry.js';
|
|
7
|
+
import { BranchDirOccupiedError, BranchProvisioningBusyError, CREATE_RESIDUE_MIN_QUIET_MS, classifyFinalDir, removeLeftoverDir, lockBranchName, publishStaging, quietAgeMs, stageBranchWorkspace, } from './branch-provisioning.js';
|
|
8
|
+
import { recordSparseCone, sparseConeFor } from './branch-sparse.js';
|
|
4
9
|
import { readsFromCheckout } from './build-mode.js';
|
|
10
|
+
import { invalidateBranchContentCaches } from './content-index-generation.js';
|
|
5
11
|
import { operatingStrategy } from './operating-mode/index.js';
|
|
6
|
-
import { GitManager } from './git-manager.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
import { GitManager, managedWorkspaceConfig } from './git-manager.js';
|
|
13
|
+
import { getErrorMessage } from './utils/error.js';
|
|
14
|
+
import { canopyLogWarn } from './utils/logger.js';
|
|
15
|
+
import { OccWriteConflictError, writeOccJsonFile } from './utils/occ-json-write.js';
|
|
16
|
+
import { ProvisionLog } from './utils/provision-log.js';
|
|
17
|
+
import { branchProvisioningLockName, PROVISIONING_LOCK_STALE_MS } from './utils/provisioning-lock.js';
|
|
18
|
+
let testHooks = {};
|
|
19
|
+
/** @internal Exported for tests; no argument clears them. */
|
|
20
|
+
export function setProvisioningTestHooks(hooks = {}) {
|
|
21
|
+
testHooks = hooks;
|
|
22
|
+
}
|
|
23
|
+
/** One provisioning per branch path per process; a joiner gets the leader's branch as `exists`. */
|
|
24
|
+
const provisionsInFlight = new Map();
|
|
13
25
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
26
|
+
* Provisions per-branch workspaces under [PROV-1]: a branch's directory appears only by rename,
|
|
27
|
+
* complete with branch.json (branch-provisioning.ts).
|
|
16
28
|
*/
|
|
17
29
|
export class BranchWorkspaceManager {
|
|
18
30
|
constructor(config) {
|
|
19
31
|
this.config = config;
|
|
20
32
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
/** The branch's context, provisioning it first when it does not exist. */
|
|
34
|
+
async openOrCreateBranch(options) {
|
|
35
|
+
return (await this.provisionBranch(options)).context;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Provision a branch workspace, or report the one already there.
|
|
39
|
+
*
|
|
40
|
+
* @throws BranchProvisioningBusyError when another process is mid-way through this branch, or
|
|
41
|
+
* what is at its path is too fresh to judge (retriable)
|
|
42
|
+
* @throws BranchDirOccupiedError in prod, when its path holds a repository this deployment did
|
|
43
|
+
* not create
|
|
44
|
+
* @throws BranchMetadataCorruptError when its branch.json is not valid JSON or fails its schema
|
|
45
|
+
*/
|
|
46
|
+
async provisionBranch(options) {
|
|
47
|
+
// resolveBranchPath refuses the reserved prefix; this also refuses an adopter's
|
|
48
|
+
// configured settings branch name, which only the config knows.
|
|
49
|
+
if (isSettingsBranchName(options.branchName, operatingStrategy(options.mode).getSettingsBranchName(this.config))) {
|
|
50
|
+
throw new BranchPathError('Settings branches are not content branches');
|
|
51
|
+
}
|
|
52
|
+
const { branchRoot, baseRoot, branchName: safeName } = resolveBranchPath(options);
|
|
53
|
+
const paths = {
|
|
54
|
+
branchRoot,
|
|
55
|
+
baseRoot,
|
|
56
|
+
dirName: path.basename(branchRoot),
|
|
57
|
+
safeName,
|
|
58
|
+
};
|
|
59
|
+
const existing = await readBranchMetadataFile(branchRoot);
|
|
60
|
+
if (existing) {
|
|
61
|
+
return { kind: 'exists', context: { branch: existing.branch, branchRoot, baseRoot } };
|
|
62
|
+
}
|
|
63
|
+
const inFlight = provisionsInFlight.get(branchRoot);
|
|
64
|
+
if (inFlight)
|
|
65
|
+
return { kind: 'exists', context: (await inFlight).context };
|
|
66
|
+
const run = this.provisionUnshared(options, paths);
|
|
67
|
+
provisionsInFlight.set(branchRoot, run);
|
|
68
|
+
try {
|
|
69
|
+
return await run;
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
provisionsInFlight.delete(branchRoot);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async provisionUnshared(options, paths) {
|
|
76
|
+
const { branchRoot, baseRoot, dirName } = paths;
|
|
77
|
+
await fs.mkdir(baseRoot, { recursive: true });
|
|
78
|
+
// Resolve the fork point once so the clone and the recorded metadata agree, and the remote
|
|
79
|
+
// before any clone is paid for.
|
|
80
|
+
const baseBranch = await GitManager.resolveWorkspaceBaseBranch({
|
|
81
|
+
...this.config,
|
|
82
|
+
mode: options.mode,
|
|
83
|
+
baseBranch: this.config.defaultBaseBranch,
|
|
84
|
+
remoteUrl: options.remoteUrl,
|
|
85
|
+
});
|
|
86
|
+
const remoteUrl = await GitManager.resolveCloneRemoteUrl({
|
|
87
|
+
mode: options.mode,
|
|
88
|
+
remoteUrl: options.remoteUrl,
|
|
89
|
+
defaultRemoteUrl: this.config.defaultRemoteUrl,
|
|
90
|
+
baseBranch,
|
|
91
|
+
sourceRoot: this.config.sourceRoot,
|
|
92
|
+
allowNetworkRemoteInProd: this.config.allowNetworkRemoteInProd,
|
|
93
|
+
});
|
|
94
|
+
const metadata = buildInitialBranchMetadata({
|
|
95
|
+
branch: {
|
|
96
|
+
name: paths.safeName,
|
|
97
|
+
title: options.title,
|
|
98
|
+
description: options.description,
|
|
99
|
+
access: options.access,
|
|
100
|
+
createdBy: options.createdBy,
|
|
101
|
+
baseBranch,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
// Advisory and lock-free: refuse early, before paying for a clone, what publish would
|
|
105
|
+
// refuse anyway. Publish re-checks everything under the lock.
|
|
106
|
+
const state = await classifyFinalDir(branchRoot, remoteUrl);
|
|
107
|
+
if (state.kind === 'live' || state.kind === 'corrupt')
|
|
108
|
+
return this.existing(paths);
|
|
109
|
+
if (state.kind === 'protected')
|
|
110
|
+
throw new BranchProvisioningBusyError(dirName);
|
|
111
|
+
if (state.kind === 'foreign') {
|
|
112
|
+
// dev's CLI sync builds a branch workspace by `git init` and real commits, with no
|
|
113
|
+
// remote and no branch.json; it is adopted where it is.
|
|
114
|
+
if (options.mode !== 'dev')
|
|
115
|
+
throw new BranchDirOccupiedError(dirName);
|
|
116
|
+
return this.adoptInPlace(options, paths, baseBranch, metadata);
|
|
117
|
+
}
|
|
118
|
+
if (state.kind === 'residue' && (await this.recentlyActive(paths))) {
|
|
119
|
+
throw new BranchProvisioningBusyError(dirName);
|
|
120
|
+
}
|
|
121
|
+
const sparseCone = sparseConeFor(this.config.contentRoot);
|
|
122
|
+
await recordSparseCone(baseRoot, sparseCone).catch((err) => {
|
|
123
|
+
canopyLogWarn(`[canopy] Could not record the sparse-checkout cone: ${getErrorMessage(err)}`);
|
|
124
|
+
});
|
|
125
|
+
const provisionLog = new ProvisionLog(dirName);
|
|
126
|
+
let outcome;
|
|
127
|
+
try {
|
|
128
|
+
outcome = await this.stageAndPublish(paths, {
|
|
129
|
+
provisionLog,
|
|
130
|
+
baseBranch,
|
|
131
|
+
remoteUrl,
|
|
132
|
+
metadata,
|
|
133
|
+
mode: options.mode,
|
|
134
|
+
sparseCone,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
provisionLog.finish('error');
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
provisionLog.finish(outcome.kind === 'created' ? 'ok' : 'exists');
|
|
142
|
+
return outcome;
|
|
143
|
+
}
|
|
144
|
+
async stageAndPublish(paths, run) {
|
|
145
|
+
const { branchRoot, baseRoot, dirName } = paths;
|
|
146
|
+
const staged = await stageBranchWorkspace({
|
|
147
|
+
baseRoot,
|
|
148
|
+
dirName,
|
|
149
|
+
branchName: paths.safeName,
|
|
150
|
+
baseBranch: run.baseBranch,
|
|
151
|
+
remoteUrl: run.remoteUrl,
|
|
152
|
+
clone: {
|
|
153
|
+
remoteName: this.config.defaultRemoteName,
|
|
154
|
+
config: managedWorkspaceConfig(this.config.gitBotAuthorName, this.config.gitBotAuthorEmail),
|
|
155
|
+
},
|
|
156
|
+
gitExcludePattern: operatingStrategy(run.mode).getGitExcludePattern(),
|
|
157
|
+
metadata: run.metadata,
|
|
158
|
+
provisionLog: run.provisionLog,
|
|
159
|
+
sparseCone: run.sparseCone,
|
|
160
|
+
});
|
|
161
|
+
if (staged.kind === 'exists')
|
|
162
|
+
return this.existing(paths);
|
|
163
|
+
let published;
|
|
164
|
+
try {
|
|
165
|
+
await testHooks.beforePublish?.({ stagingPath: staged.stagingPath, finalPath: branchRoot });
|
|
166
|
+
published = await run.provisionLog.step('publish', () => publishStaging({
|
|
167
|
+
baseRoot,
|
|
168
|
+
dirName,
|
|
169
|
+
stagingPath: staged.stagingPath,
|
|
170
|
+
writeId: staged.meta.writeId,
|
|
171
|
+
expectedRemoteUrl: run.remoteUrl,
|
|
172
|
+
inspectBlocked: testHooks.inspectBlocked,
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
if (published !== 'published')
|
|
177
|
+
await removeLeftoverDir(staged.stagingPath);
|
|
178
|
+
}
|
|
179
|
+
if (published === 'exists')
|
|
180
|
+
return this.existing(paths);
|
|
181
|
+
await run.provisionLog.step('register', () => register(paths));
|
|
182
|
+
return { kind: 'created', context: { branch: staged.meta.branch, branchRoot, baseRoot } };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The one exception to [PROV-1]: a dev workspace that already holds real work is kept where it
|
|
186
|
+
* is, given branch.json under the branch's lock.
|
|
187
|
+
*/
|
|
188
|
+
async adoptInPlace(options, paths, baseBranch, metadata) {
|
|
189
|
+
const { branchRoot, baseRoot, dirName } = paths;
|
|
190
|
+
const provisionLog = new ProvisionLog(dirName);
|
|
191
|
+
let created = false;
|
|
192
|
+
try {
|
|
193
|
+
const release = await provisionLog.step('lock', () => lockBranchName(baseRoot, dirName));
|
|
194
|
+
try {
|
|
195
|
+
if (!(await readBranchMetadataFile(branchRoot))) {
|
|
45
196
|
await GitManager.initializeWorkspace({
|
|
46
|
-
workspacePath:
|
|
47
|
-
branchName:
|
|
197
|
+
workspacePath: branchRoot,
|
|
198
|
+
branchName: paths.safeName,
|
|
48
199
|
mode: options.mode,
|
|
49
|
-
baseBranch
|
|
200
|
+
baseBranch,
|
|
50
201
|
sourceRoot: this.config.sourceRoot,
|
|
51
202
|
defaultRemoteUrl: this.config.defaultRemoteUrl,
|
|
52
203
|
remoteUrl: options.remoteUrl,
|
|
@@ -56,71 +207,59 @@ export class BranchWorkspaceManager {
|
|
|
56
207
|
gitBotAuthorName: this.config.gitBotAuthorName,
|
|
57
208
|
gitBotAuthorEmail: this.config.gitBotAuthorEmail,
|
|
58
209
|
gitExcludePattern: operatingStrategy(options.mode).getGitExcludePattern(),
|
|
210
|
+
provisionLog,
|
|
59
211
|
});
|
|
212
|
+
created = await provisionLog.step('metadata', () => writeOccJsonFile(path.join(branchRoot, BRANCH_META_DIR, BRANCH_META_FILE), { ...metadata }, { expectedVersion: null, trailingNewline: true }).then(() => true, (err) => {
|
|
213
|
+
if (err instanceof OccWriteConflictError)
|
|
214
|
+
return false;
|
|
215
|
+
throw err;
|
|
216
|
+
}));
|
|
60
217
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
catch (err) {
|
|
68
|
-
log.debug('workspace', 'Failed to release workspace-init lock', { err });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
workspaceInitLocks.delete(options.branchRoot);
|
|
72
|
-
}
|
|
73
|
-
})();
|
|
74
|
-
workspaceInitLocks.set(options.branchRoot, lockPromise);
|
|
75
|
-
await lockPromise;
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
async openOrCreateBranch(options) {
|
|
79
|
-
const { branchName, mode, basePathOverride, title, description, access, createdBy, remoteUrl } = options;
|
|
80
|
-
// resolveBranchPath refuses the reserved prefix; this also refuses an adopter's
|
|
81
|
-
// configured settings branch name, which only the config knows.
|
|
82
|
-
if (isSettingsBranchName(branchName, operatingStrategy(mode).getSettingsBranchName(this.config))) {
|
|
83
|
-
throw new BranchPathError('Settings branches are not content branches');
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
await release().catch(() => { });
|
|
221
|
+
}
|
|
222
|
+
if (created)
|
|
223
|
+
await provisionLog.step('register', () => register(paths));
|
|
84
224
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
await
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
};
|
|
225
|
+
catch (err) {
|
|
226
|
+
provisionLog.finish('error');
|
|
227
|
+
throw err;
|
|
228
|
+
}
|
|
229
|
+
provisionLog.finish(created ? 'ok' : 'exists');
|
|
230
|
+
if (!created)
|
|
231
|
+
return this.existing(paths);
|
|
232
|
+
const meta = await readBranchMetadataFile(branchRoot);
|
|
233
|
+
if (!meta)
|
|
234
|
+
throw new BranchProvisioningBusyError(dirName);
|
|
235
|
+
return { kind: 'created', context: { branch: meta.branch, branchRoot, baseRoot } };
|
|
236
|
+
}
|
|
237
|
+
/** Whether residue at the branch path may still belong to a live process. */
|
|
238
|
+
async recentlyActive({ branchRoot, baseRoot, dirName }) {
|
|
239
|
+
const lockAgeMs = await fs.stat(path.join(baseRoot, branchProvisioningLockName(dirName))).then((stat) => Date.now() - stat.mtimeMs, () => Infinity);
|
|
240
|
+
if (lockAgeMs < PROVISIONING_LOCK_STALE_MS)
|
|
241
|
+
return true;
|
|
242
|
+
return (await quietAgeMs(branchRoot)) < CREATE_RESIDUE_MIN_QUIET_MS;
|
|
243
|
+
}
|
|
244
|
+
async existing({ branchRoot, baseRoot, dirName, }) {
|
|
245
|
+
const meta = await readBranchMetadataFile(branchRoot);
|
|
246
|
+
if (!meta)
|
|
247
|
+
throw new BranchProvisioningBusyError(dirName);
|
|
248
|
+
return { kind: 'exists', context: { branch: meta.branch, branchRoot, baseRoot } };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* A new branch directory replaces whatever an earlier one of the same name left in this
|
|
253
|
+
* process's caches, and joins the registry. The branch is already published, so a failure here
|
|
254
|
+
* is logged rather than failing the create; the registry's miss backstop covers it.
|
|
255
|
+
*/
|
|
256
|
+
async function register({ branchRoot, baseRoot }) {
|
|
257
|
+
try {
|
|
258
|
+
await invalidateBranchContentCaches(branchRoot);
|
|
259
|
+
await new BranchRegistry(baseRoot).invalidate();
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
canopyLogWarn(`[canopy] Registering new branch ${branchRoot} failed: ${getErrorMessage(err)}`);
|
|
124
263
|
}
|
|
125
264
|
}
|
|
126
265
|
export { loadBranchContext } from './branch-metadata.js';
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect the asset URLs a static build references, so a release can make them exist first.
|
|
3
|
+
*
|
|
4
|
+
* The public `/assets/t/` path serves only what is stored, and widths are chosen by site code at
|
|
5
|
+
* render time, so build output is the one place every final URL appears. The adopter contract
|
|
6
|
+
* that follows: every `/assets/t/` URL the site can request must appear as text in its build
|
|
7
|
+
* output (ARCHITECTURE.md, "Why transform by URL directive and materialize at release?").
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
/** @internal Written into the scanned directory, so a manifest the adopter builds afterwards covers it. */
|
|
11
|
+
export declare const ASSET_REFS_FILENAME = "canopy-asset-refs.json";
|
|
12
|
+
declare const assetRefsFileSchema: z.ZodObject<{
|
|
13
|
+
version: z.ZodLiteral<1>;
|
|
14
|
+
transforms: z.ZodArray<z.ZodObject<{
|
|
15
|
+
key: z.ZodString;
|
|
16
|
+
routes: z.ZodArray<z.ZodString, "many">;
|
|
17
|
+
files: z.ZodArray<z.ZodString, "many">;
|
|
18
|
+
}, "strict", z.ZodTypeAny, {
|
|
19
|
+
key: string;
|
|
20
|
+
files: string[];
|
|
21
|
+
routes: string[];
|
|
22
|
+
}, {
|
|
23
|
+
key: string;
|
|
24
|
+
files: string[];
|
|
25
|
+
routes: string[];
|
|
26
|
+
}>, "many">;
|
|
27
|
+
statics: z.ZodArray<z.ZodObject<{
|
|
28
|
+
key: z.ZodString;
|
|
29
|
+
routes: z.ZodArray<z.ZodString, "many">;
|
|
30
|
+
files: z.ZodArray<z.ZodString, "many">;
|
|
31
|
+
}, "strict", z.ZodTypeAny, {
|
|
32
|
+
key: string;
|
|
33
|
+
files: string[];
|
|
34
|
+
routes: string[];
|
|
35
|
+
}, {
|
|
36
|
+
key: string;
|
|
37
|
+
files: string[];
|
|
38
|
+
routes: string[];
|
|
39
|
+
}>, "many">;
|
|
40
|
+
}, "strict", z.ZodTypeAny, {
|
|
41
|
+
version: 1;
|
|
42
|
+
transforms: {
|
|
43
|
+
key: string;
|
|
44
|
+
files: string[];
|
|
45
|
+
routes: string[];
|
|
46
|
+
}[];
|
|
47
|
+
statics: {
|
|
48
|
+
key: string;
|
|
49
|
+
files: string[];
|
|
50
|
+
routes: string[];
|
|
51
|
+
}[];
|
|
52
|
+
}, {
|
|
53
|
+
version: 1;
|
|
54
|
+
transforms: {
|
|
55
|
+
key: string;
|
|
56
|
+
files: string[];
|
|
57
|
+
routes: string[];
|
|
58
|
+
}[];
|
|
59
|
+
statics: {
|
|
60
|
+
key: string;
|
|
61
|
+
files: string[];
|
|
62
|
+
routes: string[];
|
|
63
|
+
}[];
|
|
64
|
+
}>;
|
|
65
|
+
export type AssetRefsFile = z.infer<typeof assetRefsFileSchema>;
|
|
66
|
+
/** A URL in the output that no stored object can answer, or an inline flight script that cannot be read. */
|
|
67
|
+
export interface AssetRefProblem {
|
|
68
|
+
file: string;
|
|
69
|
+
/** The URL, or the script's position when the problem is a script. */
|
|
70
|
+
url: string;
|
|
71
|
+
error: string;
|
|
72
|
+
}
|
|
73
|
+
/** The output references URLs that cannot be served from the store; nothing was written. */
|
|
74
|
+
export declare class AssetRefsError extends Error {
|
|
75
|
+
readonly problems: readonly AssetRefProblem[];
|
|
76
|
+
constructor(problems: readonly AssetRefProblem[]);
|
|
77
|
+
}
|
|
78
|
+
export interface CollectAssetRefsResult {
|
|
79
|
+
refs: AssetRefsFile;
|
|
80
|
+
/** Absolute path of the refs file written. */
|
|
81
|
+
filePath: string;
|
|
82
|
+
scannedFiles: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Scan `outDir` for `/assets/t/...` transform URLs and `/assets/{hash32}/...` static URLs and
|
|
86
|
+
* write their stored keys to `outDir/canopy-asset-refs.json`, sorted so the same output always
|
|
87
|
+
* yields the same file. Throws `AssetRefsError`, writing nothing, if any transform URL is not in
|
|
88
|
+
* canonical form or any static URL is malformed: only canonical keys are stored, and the public
|
|
89
|
+
* path is to compute nothing on a miss.
|
|
90
|
+
*/
|
|
91
|
+
export declare function collectAssetRefs(outDir: string): Promise<CollectAssetRefsResult>;
|
|
92
|
+
/** Read and validate a refs file `collectAssetRefs` wrote. */
|
|
93
|
+
export declare function readAssetRefsFile(filePath: string): Promise<AssetRefsFile>;
|
|
94
|
+
export {};
|