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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { RootCollectionConfig } from './config/index.js';
|
|
2
2
|
import type { FlatSchemaItem } from './config/types.js';
|
|
3
3
|
import type { OperatingMode } from './operating-mode/index.js';
|
|
4
|
-
import type { EntrySchemaRegistry, SchemaResolutionResult } from './schema/types.js';
|
|
4
|
+
import type { EntrySchemaRegistry, SchemaIssue, SchemaResolutionResult, UnknownSchemaPolicy } from './schema/types.js';
|
|
5
5
|
/** File name of the schema cache inside {@link schemaCacheDir}. */
|
|
6
6
|
export declare const SCHEMA_CACHE_FILE = "schema-cache.json";
|
|
7
7
|
/** resource-generation.ts resource key for the schema cache's marker. */
|
|
@@ -18,6 +18,19 @@ export interface BranchSchemaCacheEntry {
|
|
|
18
18
|
* isGenerationCurrent) to decide freshness.
|
|
19
19
|
*/
|
|
20
20
|
generation: string | null;
|
|
21
|
+
/**
|
|
22
|
+
* {@link registryFingerprint} of the registry this snapshot was resolved
|
|
23
|
+
* against. A deploy bumps no marker, so without it a new image would keep
|
|
24
|
+
* serving schemas resolved by the old image's registry.
|
|
25
|
+
*/
|
|
26
|
+
registryFingerprint: string;
|
|
27
|
+
issues: SchemaIssue[];
|
|
28
|
+
}
|
|
29
|
+
/** A branch's resolved schema, plus what a degraded resolve left out of it. */
|
|
30
|
+
export interface ResolvedBranchSchema {
|
|
31
|
+
schema: RootCollectionConfig;
|
|
32
|
+
flatSchema: FlatSchemaItem[];
|
|
33
|
+
issues: SchemaIssue[];
|
|
21
34
|
}
|
|
22
35
|
/**
|
|
23
36
|
* Per-branch schema cache: one file in {@link schemaCacheDir} with no in-memory
|
|
@@ -32,6 +45,15 @@ export interface BranchSchemaCacheEntry {
|
|
|
32
45
|
* Callers that bypass SchemaOps (api/schema.ts's invalidate endpoint, and the
|
|
33
46
|
* bulk git-op bump in invalidateBranchContentCaches) accept the lazy
|
|
34
47
|
* next-read regen instead.
|
|
48
|
+
*
|
|
49
|
+
* The owner of the strict/degrade split. Content read from the checkout (a
|
|
50
|
+
* build, a static deployment) shares a commit with the code, so a schema
|
|
51
|
+
* reference the registry lacks is a real bug and resolution throws. A branch
|
|
52
|
+
* workspace's content arrives by sync, which can land before the image whose
|
|
53
|
+
* registry it needs, or after an image that needs content it lacks; there an
|
|
54
|
+
* unknown schema marks only its entry type `unavailable`, an unknown reference
|
|
55
|
+
* `entryTypes` value only empties that field's options, and both are returned
|
|
56
|
+
* as `issues`.
|
|
35
57
|
*/
|
|
36
58
|
export declare class BranchSchemaCache {
|
|
37
59
|
/** Tracks when we last checked mtimes per contentRoot, to debounce rapid requests */
|
|
@@ -39,25 +61,23 @@ export declare class BranchSchemaCache {
|
|
|
39
61
|
private readonly devMode;
|
|
40
62
|
constructor(mode?: OperatingMode);
|
|
41
63
|
/**
|
|
42
|
-
* Whether
|
|
64
|
+
* Whether this branchRoot is the checkout rather than a branch workspace,
|
|
65
|
+
* which skips the on-disk cache and resolves strictly (see the class doc).
|
|
43
66
|
*
|
|
44
67
|
* Never write a schema cache at the project root, whichever entrypoint
|
|
45
68
|
* produced the cwd branchRoot. branchRoot equals process.cwd() only in the
|
|
46
69
|
* synthetic contexts static deployments and build phases use; a real branch
|
|
47
70
|
* root is always nested under the workspace.
|
|
48
71
|
*/
|
|
49
|
-
private
|
|
72
|
+
private readsCheckout;
|
|
50
73
|
/** Get schema for a branch, from the cache when fresh, else resolved fresh. */
|
|
51
|
-
getSchema(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<
|
|
52
|
-
schema: RootCollectionConfig;
|
|
53
|
-
flatSchema: FlatSchemaItem[];
|
|
54
|
-
}>;
|
|
74
|
+
getSchema(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<ResolvedBranchSchema>;
|
|
55
75
|
/**
|
|
56
76
|
* Resolve the schema from disk. Protected rather than a direct resolveSchema
|
|
57
77
|
* call so tests can subclass and block it to simulate cross-process
|
|
58
78
|
* interleavings — mirrors BranchRegistry's scanBranchDirectories() hook.
|
|
59
79
|
*/
|
|
60
|
-
protected resolveFresh(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry): Promise<SchemaResolutionResult>;
|
|
80
|
+
protected resolveFresh(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry, unknownSchema: UnknownSchemaPolicy): Promise<SchemaResolutionResult>;
|
|
61
81
|
private loadFromCacheOrResolve;
|
|
62
82
|
/**
|
|
63
83
|
* Resolve the schema fresh from disk and persist it (subject to the
|
|
@@ -75,10 +95,7 @@ export declare class BranchSchemaCache {
|
|
|
75
95
|
* instead return a snapshot a concurrent host wrote — possibly one embedding
|
|
76
96
|
* the now-current token over ITS own stale-NFS scan — skipping that scan.
|
|
77
97
|
*/
|
|
78
|
-
resolveAndPersist(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<
|
|
79
|
-
schema: RootCollectionConfig;
|
|
80
|
-
flatSchema: FlatSchemaItem[];
|
|
81
|
-
}>;
|
|
98
|
+
resolveAndPersist(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<ResolvedBranchSchema>;
|
|
82
99
|
/**
|
|
83
100
|
* Invalidate a branch's cache by bumping the marker; every process sharing
|
|
84
101
|
* this branchRoot re-resolves at its next read. The bump must succeed —
|
|
@@ -1,20 +1,39 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { resolveSchema, isValidSchema } from './schema/resolver.js';
|
|
4
|
+
import { registryFingerprint } from './schema/registry-fingerprint.js';
|
|
4
5
|
import { flattenSchema } from './config/flatten.js';
|
|
5
6
|
import { validateReferenceEntryTypes } from './validation/entry-type-reference-validator.js';
|
|
6
7
|
import { isBuildMode } from './build-mode.js';
|
|
7
8
|
import { bumpResourceGeneration, readResourceGeneration, isGenerationCurrent, } from './resource-generation.js';
|
|
8
9
|
import { timeRequestPhase } from './utils/request-timing.js';
|
|
9
10
|
import { CANOPY_META_DIR } from './utils/git.js';
|
|
11
|
+
import { canopyLogWarn } from './utils/logger.js';
|
|
10
12
|
/** Bump when BranchSchemaCacheEntry shape changes to auto-invalidate stale caches */
|
|
11
|
-
const SCHEMA_CACHE_VERSION =
|
|
13
|
+
const SCHEMA_CACHE_VERSION = 4;
|
|
12
14
|
/** Minimum interval between mtime staleness checks (ms) */
|
|
13
15
|
const MTIME_CHECK_DEBOUNCE_MS = 1000;
|
|
14
16
|
/** File name of the schema cache inside {@link schemaCacheDir}. */
|
|
15
17
|
export const SCHEMA_CACHE_FILE = 'schema-cache.json';
|
|
16
18
|
/** resource-generation.ts resource key for the schema cache's marker. */
|
|
17
19
|
export const SCHEMA_GENERATION_RESOURCE = 'schema';
|
|
20
|
+
const reportedIssues = new Set();
|
|
21
|
+
/** Log each schema issue once per process, whether it was resolved here or read from a snapshot. */
|
|
22
|
+
function reportSchemaIssues(issues) {
|
|
23
|
+
for (const issue of issues) {
|
|
24
|
+
const line = issue.kind === 'unknown-schema'
|
|
25
|
+
? `CanopyCMS: ${issue.metaFile} names entry schema "${issue.schemaRef}", which this ` +
|
|
26
|
+
`deployment's entry schema registry does not define, so entry type ` +
|
|
27
|
+
`"${issue.entryType}" is unavailable until code defining it is deployed or the ` +
|
|
28
|
+
`content stops naming it.`
|
|
29
|
+
: `CanopyCMS: ${issue.message} That reference field offers no options until the ` +
|
|
30
|
+
`content declares the entry type.`;
|
|
31
|
+
if (reportedIssues.has(line))
|
|
32
|
+
continue;
|
|
33
|
+
reportedIssues.add(line);
|
|
34
|
+
canopyLogWarn(line);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
18
37
|
/**
|
|
19
38
|
* True when a .collection.json under `dir` is newer than `cachedAt`.
|
|
20
39
|
*
|
|
@@ -73,6 +92,15 @@ async function schemaCacheDir(branchRoot) {
|
|
|
73
92
|
* Callers that bypass SchemaOps (api/schema.ts's invalidate endpoint, and the
|
|
74
93
|
* bulk git-op bump in invalidateBranchContentCaches) accept the lazy
|
|
75
94
|
* next-read regen instead.
|
|
95
|
+
*
|
|
96
|
+
* The owner of the strict/degrade split. Content read from the checkout (a
|
|
97
|
+
* build, a static deployment) shares a commit with the code, so a schema
|
|
98
|
+
* reference the registry lacks is a real bug and resolution throws. A branch
|
|
99
|
+
* workspace's content arrives by sync, which can land before the image whose
|
|
100
|
+
* registry it needs, or after an image that needs content it lacks; there an
|
|
101
|
+
* unknown schema marks only its entry type `unavailable`, an unknown reference
|
|
102
|
+
* `entryTypes` value only empties that field's options, and both are returned
|
|
103
|
+
* as `issues`.
|
|
76
104
|
*/
|
|
77
105
|
export class BranchSchemaCache {
|
|
78
106
|
constructor(mode = 'prod') {
|
|
@@ -81,14 +109,15 @@ export class BranchSchemaCache {
|
|
|
81
109
|
this.devMode = mode === 'dev';
|
|
82
110
|
}
|
|
83
111
|
/**
|
|
84
|
-
* Whether
|
|
112
|
+
* Whether this branchRoot is the checkout rather than a branch workspace,
|
|
113
|
+
* which skips the on-disk cache and resolves strictly (see the class doc).
|
|
85
114
|
*
|
|
86
115
|
* Never write a schema cache at the project root, whichever entrypoint
|
|
87
116
|
* produced the cwd branchRoot. branchRoot equals process.cwd() only in the
|
|
88
117
|
* synthetic contexts static deployments and build phases use; a real branch
|
|
89
118
|
* root is always nested under the workspace.
|
|
90
119
|
*/
|
|
91
|
-
|
|
120
|
+
readsCheckout(branchRoot) {
|
|
92
121
|
return isBuildMode() || path.resolve(branchRoot) === path.resolve(process.cwd());
|
|
93
122
|
}
|
|
94
123
|
/** Get schema for a branch, from the cache when fresh, else resolved fresh. */
|
|
@@ -100,13 +129,13 @@ export class BranchSchemaCache {
|
|
|
100
129
|
* call so tests can subclass and block it to simulate cross-process
|
|
101
130
|
* interleavings — mirrors BranchRegistry's scanBranchDirectories() hook.
|
|
102
131
|
*/
|
|
103
|
-
async resolveFresh(contentRoot, entrySchemaRegistry) {
|
|
104
|
-
return resolveSchema(contentRoot, entrySchemaRegistry);
|
|
132
|
+
async resolveFresh(contentRoot, entrySchemaRegistry, unknownSchema) {
|
|
133
|
+
return resolveSchema(contentRoot, entrySchemaRegistry, { unknownSchema });
|
|
105
134
|
}
|
|
106
135
|
async loadFromCacheOrResolve(branchRoot, entrySchemaRegistry, contentRootName) {
|
|
107
136
|
const contentRoot = path.join(branchRoot, contentRootName);
|
|
108
|
-
const
|
|
109
|
-
if (!
|
|
137
|
+
const fromCheckout = this.readsCheckout(branchRoot);
|
|
138
|
+
if (!fromCheckout) {
|
|
110
139
|
const cachePath = path.join(await schemaCacheDir(branchRoot), SCHEMA_CACHE_FILE);
|
|
111
140
|
let cacheData = null;
|
|
112
141
|
try {
|
|
@@ -120,7 +149,9 @@ export class BranchSchemaCache {
|
|
|
120
149
|
// Strict version check, not truthiness: a snapshot from an older version
|
|
121
150
|
// left on EFS by a rolling deploy has no `generation` field, and an
|
|
122
151
|
// `undefined` token breaks the freshness comparison below.
|
|
123
|
-
if (cacheData &&
|
|
152
|
+
if (cacheData &&
|
|
153
|
+
cacheData.version === SCHEMA_CACHE_VERSION &&
|
|
154
|
+
cacheData.registryFingerprint === registryFingerprint(entrySchemaRegistry)) {
|
|
124
155
|
const read = await readResourceGeneration(branchRoot, SCHEMA_GENERATION_RESOURCE);
|
|
125
156
|
if (isGenerationCurrent(cacheData.generation, read)) {
|
|
126
157
|
// Dev also walks mtimes, debounced, to catch edits made outside the CMS.
|
|
@@ -135,7 +166,12 @@ export class BranchSchemaCache {
|
|
|
135
166
|
else {
|
|
136
167
|
if (this.devMode)
|
|
137
168
|
this.lastMtimeCheck.set(contentRoot, now);
|
|
138
|
-
|
|
169
|
+
reportSchemaIssues(cacheData.issues);
|
|
170
|
+
return {
|
|
171
|
+
schema: cacheData.schema,
|
|
172
|
+
flatSchema: cacheData.flatSchema,
|
|
173
|
+
issues: cacheData.issues,
|
|
174
|
+
};
|
|
139
175
|
}
|
|
140
176
|
}
|
|
141
177
|
else {
|
|
@@ -148,7 +184,7 @@ export class BranchSchemaCache {
|
|
|
148
184
|
}
|
|
149
185
|
}
|
|
150
186
|
return this.resolveFreshAndPersist(branchRoot, entrySchemaRegistry, contentRootName, {
|
|
151
|
-
|
|
187
|
+
fromCheckout,
|
|
152
188
|
});
|
|
153
189
|
}
|
|
154
190
|
/**
|
|
@@ -158,32 +194,36 @@ export class BranchSchemaCache {
|
|
|
158
194
|
* cache-miss fallback and by {@link resolveAndPersist}.
|
|
159
195
|
*/
|
|
160
196
|
async resolveFreshAndPersist(branchRoot, entrySchemaRegistry, contentRootName, options) {
|
|
161
|
-
const {
|
|
197
|
+
const { fromCheckout } = options;
|
|
162
198
|
const contentRoot = path.join(branchRoot, contentRootName);
|
|
163
199
|
// Capture the marker strictly BEFORE resolving, so a bump landing
|
|
164
200
|
// mid-resolve differs from the token persisted below and forces a
|
|
165
201
|
// re-resolve on the next read.
|
|
166
|
-
const read =
|
|
202
|
+
const read = fromCheckout
|
|
167
203
|
? null
|
|
168
204
|
: await readResourceGeneration(branchRoot, SCHEMA_GENERATION_RESOURCE);
|
|
169
205
|
// Nested under `schema`, so a request summary names a cache miss (`…schema>resolve`).
|
|
170
|
-
const result = await timeRequestPhase('resolve', () => this.resolveFresh(contentRoot, entrySchemaRegistry));
|
|
206
|
+
const result = await timeRequestPhase('resolve', () => this.resolveFresh(contentRoot, entrySchemaRegistry, fromCheckout ? 'throw' : 'degrade'));
|
|
171
207
|
// Validate schema has content
|
|
172
208
|
if (!isValidSchema(result.schema)) {
|
|
173
209
|
throw new Error(`No schema found in ${contentRoot}. Create .collection.json files ` +
|
|
174
210
|
'with references to field schemas defined in your entry schema registry.');
|
|
175
211
|
}
|
|
176
212
|
// Reference fields may only scope themselves to entry types that exist.
|
|
177
|
-
// Checked here, before anything is cached, so a typo fails loudly
|
|
178
|
-
//
|
|
213
|
+
// Checked here, before anything is cached, so a typo fails a build loudly
|
|
214
|
+
// instead of silently resolving to zero reference options.
|
|
179
215
|
const entryTypeIssues = validateReferenceEntryTypes(result.schema);
|
|
180
|
-
if (entryTypeIssues.length > 0) {
|
|
216
|
+
if (entryTypeIssues.length > 0 && fromCheckout) {
|
|
181
217
|
throw new Error(`Invalid reference field entryTypes in ${contentRoot}:\n` +
|
|
182
218
|
entryTypeIssues.map((issue) => ` - ${issue}`).join('\n'));
|
|
183
219
|
}
|
|
220
|
+
const issues = [
|
|
221
|
+
...result.issues,
|
|
222
|
+
...entryTypeIssues.map((message) => ({ kind: 'reference-entry-type', message })),
|
|
223
|
+
];
|
|
184
224
|
// Use configured contentRoot name as base path for logical paths
|
|
185
225
|
const flatSchema = flattenSchema(result.schema, contentRootName);
|
|
186
|
-
if (!
|
|
226
|
+
if (!fromCheckout) {
|
|
187
227
|
const cacheDir = await schemaCacheDir(branchRoot);
|
|
188
228
|
const cachePath = path.join(cacheDir, SCHEMA_CACHE_FILE);
|
|
189
229
|
// Opportunistic cleanup of the retired .stale marker file, which a
|
|
@@ -196,6 +236,8 @@ export class BranchSchemaCache {
|
|
|
196
236
|
flatSchema,
|
|
197
237
|
cachedAt: new Date().toISOString(),
|
|
198
238
|
generation: read.token,
|
|
239
|
+
registryFingerprint: registryFingerprint(entrySchemaRegistry),
|
|
240
|
+
issues,
|
|
199
241
|
};
|
|
200
242
|
// Temp file then rename, with the temp file unlinked on a failed
|
|
201
243
|
// rename so a transient error leaves no stray `.tmp` beside the cache.
|
|
@@ -215,7 +257,8 @@ export class BranchSchemaCache {
|
|
|
215
257
|
// with an unattributable one would look correctly attributed to every
|
|
216
258
|
// future reader. Serve the fresh result without persisting it.
|
|
217
259
|
}
|
|
218
|
-
|
|
260
|
+
reportSchemaIssues(issues);
|
|
261
|
+
return { schema: result.schema, flatSchema, issues };
|
|
219
262
|
}
|
|
220
263
|
/**
|
|
221
264
|
* Resolve fresh from disk and persist, SKIPPING the cache read entirely.
|
|
@@ -227,9 +270,9 @@ export class BranchSchemaCache {
|
|
|
227
270
|
* the now-current token over ITS own stale-NFS scan — skipping that scan.
|
|
228
271
|
*/
|
|
229
272
|
async resolveAndPersist(branchRoot, entrySchemaRegistry, contentRootName = 'content') {
|
|
230
|
-
const
|
|
273
|
+
const fromCheckout = this.readsCheckout(branchRoot);
|
|
231
274
|
return this.resolveFreshAndPersist(branchRoot, entrySchemaRegistry, contentRootName, {
|
|
232
|
-
|
|
275
|
+
fromCheckout,
|
|
233
276
|
});
|
|
234
277
|
}
|
|
235
278
|
/**
|
|
@@ -241,7 +284,7 @@ export class BranchSchemaCache {
|
|
|
241
284
|
* No eager re-resolve here; it lives in SchemaOps (see the class doc).
|
|
242
285
|
*/
|
|
243
286
|
async invalidate(branchRoot) {
|
|
244
|
-
if (this.
|
|
287
|
+
if (this.readsCheckout(branchRoot))
|
|
245
288
|
return;
|
|
246
289
|
await bumpResourceGeneration(branchRoot, SCHEMA_GENERATION_RESOURCE, { mustSucceed: true });
|
|
247
290
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CanopyConfig } from './config/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* The cone a content branch's clone checks out for `contentRoot`, sorted as
|
|
4
|
+
* `git sparse-checkout list` prints it, or null for a full clone when the content root is the
|
|
5
|
+
* repository root.
|
|
6
|
+
*/
|
|
7
|
+
export declare function sparseConeFor(contentRoot: string | undefined): string[] | null;
|
|
8
|
+
export declare function sameCone(a: readonly string[] | null, b: readonly string[] | null): boolean;
|
|
9
|
+
export interface RecordedSparseCone {
|
|
10
|
+
cone: string[] | null;
|
|
11
|
+
}
|
|
12
|
+
/** The recorded cone, or undefined when none is recorded or the record does not parse. */
|
|
13
|
+
export declare function readRecordedSparseCone(contentBranchesRoot: string): Promise<RecordedSparseCone | undefined>;
|
|
14
|
+
/**
|
|
15
|
+
* Record `cone` unless it already is, by temp file and rename. Does not create the branches
|
|
16
|
+
* root: a deployment without one has no clones to re-apply a cone to.
|
|
17
|
+
*/
|
|
18
|
+
export declare function recordSparseCone(contentBranchesRoot: string, cone: string[] | null): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Record the cone `config` asks for, once per process start, so a changed content root reaches
|
|
21
|
+
* existing clones without waiting for a new branch. Best-effort: a failure is logged.
|
|
22
|
+
*/
|
|
23
|
+
export declare function recordConfiguredSparseCone(config: CanopyConfig): Promise<void>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sparse checkout for content-branch clones. An editor reads and writes only under the content
|
|
3
|
+
* root, and on EFS every checked-out file costs an NFS round trip, so a content branch's clone
|
|
4
|
+
* checks out the content root and `.canopy-meta` in cone mode, which always keeps the files at
|
|
5
|
+
* the repository root (a root permissions.json among them).
|
|
6
|
+
*
|
|
7
|
+
* A cone is set only by `stageBranchWorkspace` and, on clones already sparse, by the worker
|
|
8
|
+
* (worker/sparse-cone.ts), so settings workspaces are never sparse; their orphan init also
|
|
9
|
+
* empties the index with `--sparse`, so a sparse one could not leak base content either.
|
|
10
|
+
* Sparse-index stays off: git expands it for most commands anyway.
|
|
11
|
+
*
|
|
12
|
+
* `git add` and `git rm` refuse a path outside the cone unless given `--sparse` (git >= 2.34),
|
|
13
|
+
* so every call that can name one passes it.
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs/promises';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { readsFromCheckout } from './build-mode.js';
|
|
18
|
+
import { operatingStrategy } from './operating-mode/index.js';
|
|
19
|
+
import { getErrorMessage, isNodeError } from './utils/error.js';
|
|
20
|
+
import { CANOPY_META_DIR } from './utils/git.js';
|
|
21
|
+
import { canopyLogWarn } from './utils/logger.js';
|
|
22
|
+
/**
|
|
23
|
+
* The cone a content branch's clone checks out for `contentRoot`, sorted as
|
|
24
|
+
* `git sparse-checkout list` prints it, or null for a full clone when the content root is the
|
|
25
|
+
* repository root.
|
|
26
|
+
*/
|
|
27
|
+
export function sparseConeFor(contentRoot) {
|
|
28
|
+
const root = (contentRoot ?? 'content')
|
|
29
|
+
.split('/')
|
|
30
|
+
.filter((segment) => segment && segment !== '.')
|
|
31
|
+
.join('/');
|
|
32
|
+
return root ? [...new Set([CANOPY_META_DIR, root])].sort() : null;
|
|
33
|
+
}
|
|
34
|
+
export function sameCone(a, b) {
|
|
35
|
+
if (a === null || b === null)
|
|
36
|
+
return a === b;
|
|
37
|
+
const [left, right] = [[...a].sort(), [...b].sort()];
|
|
38
|
+
return left.length === right.length && left.every((dir, i) => dir === right[i]);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Beside the branch directories: the cone this deployment's config asks for, written by the
|
|
42
|
+
* processes that hold the config and read by the worker, which does not, to re-apply a changed
|
|
43
|
+
* content root to existing clones.
|
|
44
|
+
*/
|
|
45
|
+
const SPARSE_CONE_RECORD = '.sparse-cone.json';
|
|
46
|
+
function isConeDir(dir) {
|
|
47
|
+
return (typeof dir === 'string' &&
|
|
48
|
+
dir.length > 0 &&
|
|
49
|
+
!path.isAbsolute(dir) &&
|
|
50
|
+
!dir.split('/').some((segment) => segment === '' || segment === '.' || segment === '..'));
|
|
51
|
+
}
|
|
52
|
+
/** The recorded cone, or undefined when none is recorded or the record does not parse. */
|
|
53
|
+
export async function readRecordedSparseCone(contentBranchesRoot) {
|
|
54
|
+
let raw;
|
|
55
|
+
try {
|
|
56
|
+
raw = await fs.readFile(path.join(contentBranchesRoot, SPARSE_CONE_RECORD), 'utf8');
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (isNodeError(err) && err.code === 'ENOENT')
|
|
60
|
+
return undefined;
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
let parsed;
|
|
64
|
+
try {
|
|
65
|
+
parsed = JSON.parse(raw);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
if (typeof parsed !== 'object' || parsed === null || !('cone' in parsed))
|
|
71
|
+
return undefined;
|
|
72
|
+
const { cone } = parsed;
|
|
73
|
+
if (cone === null)
|
|
74
|
+
return { cone: null };
|
|
75
|
+
return Array.isArray(cone) && cone.length > 0 && cone.every(isConeDir)
|
|
76
|
+
? { cone: cone.filter(isConeDir) }
|
|
77
|
+
: undefined;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Record `cone` unless it already is, by temp file and rename. Does not create the branches
|
|
81
|
+
* root: a deployment without one has no clones to re-apply a cone to.
|
|
82
|
+
*/
|
|
83
|
+
export async function recordSparseCone(contentBranchesRoot, cone) {
|
|
84
|
+
const current = await readRecordedSparseCone(contentBranchesRoot);
|
|
85
|
+
if (current && sameCone(current.cone, cone))
|
|
86
|
+
return;
|
|
87
|
+
const target = path.join(contentBranchesRoot, SPARSE_CONE_RECORD);
|
|
88
|
+
const temp = `${target}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
89
|
+
try {
|
|
90
|
+
await fs.writeFile(temp, `${JSON.stringify({ cone })}\n`, 'utf8');
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
if (isNodeError(err) && err.code === 'ENOENT')
|
|
94
|
+
return;
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
await fs.rename(temp, target);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
await fs.unlink(temp).catch(() => { });
|
|
102
|
+
throw err;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Record the cone `config` asks for, once per process start, so a changed content root reaches
|
|
107
|
+
* existing clones without waiting for a new branch. Best-effort: a failure is logged.
|
|
108
|
+
*/
|
|
109
|
+
export async function recordConfiguredSparseCone(config) {
|
|
110
|
+
try {
|
|
111
|
+
if (readsFromCheckout(config))
|
|
112
|
+
return;
|
|
113
|
+
await recordSparseCone(operatingStrategy(config.mode).getContentBranchesRoot(config.sourceRoot), sparseConeFor(config.contentRoot));
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
canopyLogWarn(`[canopy] Could not record the sparse-checkout cone: ${getErrorMessage(err)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CanopyConfig } from './config/index.js';
|
|
2
|
+
import { type BlockingKind } from './branch-provisioning.js';
|
|
2
3
|
import type { BranchAccessControl, BranchContext, CanopyUserId } from './types.js';
|
|
3
4
|
import type { OperatingMode } from './operating-mode/index.js';
|
|
4
5
|
export interface OpenBranchOptions {
|
|
@@ -12,14 +13,52 @@ export interface OpenBranchOptions {
|
|
|
12
13
|
remoteUrl?: string;
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
16
|
+
* `created`: this call published the branch. `exists`: it was already there, or another request
|
|
17
|
+
* published it first; its metadata is returned as found, never merged with this call's.
|
|
18
|
+
*/
|
|
19
|
+
export interface ProvisionOutcome {
|
|
20
|
+
kind: 'created' | 'exists';
|
|
21
|
+
context: BranchContext;
|
|
22
|
+
}
|
|
23
|
+
/** @internal Test seams around the publish step. */
|
|
24
|
+
export interface ProvisioningTestHooks {
|
|
25
|
+
beforePublish?: (paths: {
|
|
26
|
+
stagingPath: string;
|
|
27
|
+
finalPath: string;
|
|
28
|
+
}) => Promise<void>;
|
|
29
|
+
inspectBlocked?: (finalPath: string) => Promise<BlockingKind>;
|
|
30
|
+
}
|
|
31
|
+
/** @internal Exported for tests; no argument clears them. */
|
|
32
|
+
export declare function setProvisioningTestHooks(hooks?: ProvisioningTestHooks): void;
|
|
33
|
+
/**
|
|
34
|
+
* Provisions per-branch workspaces under [PROV-1]: a branch's directory appears only by rename,
|
|
35
|
+
* complete with branch.json (branch-provisioning.ts).
|
|
17
36
|
*/
|
|
18
37
|
export declare class BranchWorkspaceManager {
|
|
19
38
|
private readonly config;
|
|
20
39
|
constructor(config: CanopyConfig);
|
|
21
|
-
|
|
40
|
+
/** The branch's context, provisioning it first when it does not exist. */
|
|
22
41
|
openOrCreateBranch(options: OpenBranchOptions): Promise<BranchContext>;
|
|
42
|
+
/**
|
|
43
|
+
* Provision a branch workspace, or report the one already there.
|
|
44
|
+
*
|
|
45
|
+
* @throws BranchProvisioningBusyError when another process is mid-way through this branch, or
|
|
46
|
+
* what is at its path is too fresh to judge (retriable)
|
|
47
|
+
* @throws BranchDirOccupiedError in prod, when its path holds a repository this deployment did
|
|
48
|
+
* not create
|
|
49
|
+
* @throws BranchMetadataCorruptError when its branch.json is not valid JSON or fails its schema
|
|
50
|
+
*/
|
|
51
|
+
provisionBranch(options: OpenBranchOptions): Promise<ProvisionOutcome>;
|
|
52
|
+
private provisionUnshared;
|
|
53
|
+
private stageAndPublish;
|
|
54
|
+
/**
|
|
55
|
+
* The one exception to [PROV-1]: a dev workspace that already holds real work is kept where it
|
|
56
|
+
* is, given branch.json under the branch's lock.
|
|
57
|
+
*/
|
|
58
|
+
private adoptInPlace;
|
|
59
|
+
/** Whether residue at the branch path may still belong to a live process. */
|
|
60
|
+
private recentlyActive;
|
|
61
|
+
private existing;
|
|
23
62
|
}
|
|
24
63
|
export { loadBranchContext } from './branch-metadata.js';
|
|
25
64
|
/**
|