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
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upkeep of the GitHub gateway's private mirror (worker/github-mirror.ts): what a killed process
|
|
3
|
+
* leaves in it, damage that would make it lie, and the maintenance that keeps it fast. Everything
|
|
4
|
+
* here touches only the gateway's own state directory.
|
|
5
|
+
*
|
|
6
|
+
* Two locks order every writer of the mirror, always taken in this order: a mirror session
|
|
7
|
+
* (`GitHubMirror.exclusive`), then the {@link MaintenanceMutex}. Maintenance takes only the mutex,
|
|
8
|
+
* so it runs beside sessions; a session takes the mutex only to sweep (never waiting for it) or
|
|
9
|
+
* to rebuild (waiting, since a rebuild swaps the repository out from under maintenance). A sweep
|
|
10
|
+
* the mutex prevents is owed, and done at the next session's start that can take it.
|
|
11
|
+
*/
|
|
12
|
+
/** A lock that maintenance holds for its whole run; see the module doc for the order. */
|
|
13
|
+
export declare class MaintenanceMutex {
|
|
14
|
+
private held;
|
|
15
|
+
/** Take it now, or get null when it is held. */
|
|
16
|
+
tryAcquire(): (() => void) | null;
|
|
17
|
+
/** Take it, waiting for a holder to let go. */
|
|
18
|
+
acquire(): Promise<() => void>;
|
|
19
|
+
}
|
|
20
|
+
/** Where a rebuild fetches the replacement, and where the swap parks the old mirror. */
|
|
21
|
+
export declare function rebuildPaths(gitDir: string): {
|
|
22
|
+
rebuild: string;
|
|
23
|
+
old: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Finish or undo a rebuild a crash interrupted. The swap renames the mirror to `.old`, then
|
|
27
|
+
* `.rebuild` into its place, then deletes `.old`, and begins only once `.rebuild` is complete. So
|
|
28
|
+
* a missing mirror with `.rebuild` present means `.rebuild` is the good one; with only `.old`
|
|
29
|
+
* present (which the sequence cannot leave), `.old` comes back and the corruption check decides.
|
|
30
|
+
* Any other leftover goes.
|
|
31
|
+
*/
|
|
32
|
+
export declare function recoverRebuild(gitDir: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Delete every lock and temporary a killed git leaves in the mirror: ref locks
|
|
35
|
+
* (`refs/**`, `packed-refs.lock`, `HEAD.lock`, `config.lock`, `shallow.lock`), `packed-refs.new`,
|
|
36
|
+
* pack temporaries (`tmp_*`, repack's `.tmp-*`), `*.keep` (a fetch's), loose `tmp_obj_*`, and
|
|
37
|
+
* commit-graph locks and temporaries. Only for a mirror no git of this process is writing: at a
|
|
38
|
+
* gateway's first session, or holding the maintenance mutex inside a session. A leftover
|
|
39
|
+
* `refs/heads/<x>.lock` fails every fetch that moves `<x>`; a leftover `packed-refs.new` fails
|
|
40
|
+
* every fetch that prunes a packed ref.
|
|
41
|
+
*/
|
|
42
|
+
export declare function sweepLocksAndTemporaries(gitDir: string): Promise<string[]>;
|
|
43
|
+
/** What a corruption check found, or null. */
|
|
44
|
+
export type MirrorCorruption = string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Whether the mirror has state that makes it lie about GitHub, that no GitHub fetch writes, or
|
|
47
|
+
* that git cannot read: a loose `refs/heads/*` file that is not a ref (a crash can leave one
|
|
48
|
+
* empty, which `for-each-ref` skips with only a warning), a `refs/heads/*` whose object is
|
|
49
|
+
* missing (which `rev-parse --is-bare-repository` cannot see), a `*.promisor` pack,
|
|
50
|
+
* `extensions.partialClone`, a `remote.*.promisor` / `remote.*.partialclonefilter` key in the
|
|
51
|
+
* mirror's own config (read with `--get-regexp`, never `config --list`, which would print a
|
|
52
|
+
* credential's value), or git dying on the repository (exit 128: a truncated `packed-refs` fails
|
|
53
|
+
* every git that reads refs, though `rev-parse --is-bare-repository` passes), unless git says the
|
|
54
|
+
* machine ran out of memory or processes. Each is repaired
|
|
55
|
+
* by a rebuild. Any other failure of git, such as one that could not start, is thrown: the next
|
|
56
|
+
* session checks again. A loose ref that disappears while
|
|
57
|
+
* it is read was packed by maintenance's `pack-refs`. `git(args, stdin?)` runs git in the mirror
|
|
58
|
+
* under its pins.
|
|
59
|
+
*/
|
|
60
|
+
export declare function findCorruption(gitDir: string, git: (args: string[], stdin?: string) => Promise<string>): Promise<MirrorCorruption>;
|
|
61
|
+
/**
|
|
62
|
+
* One maintenance run, holding the maintenance mutex: `repack -a -d --cruft` when the mirror
|
|
63
|
+
* holds more than {@link MAX_LOOSE_OBJECTS} loose objects or {@link MAX_PACKS} packs, then
|
|
64
|
+
* `commit-graph write --reachable`, then `pack-refs --all` last. A repack expires no cruft, so no
|
|
65
|
+
* object a session or a quarantine is reading disappears, and a reader holding a pack the repack
|
|
66
|
+
* unlinked keeps reading it. A step killed at its deadline leaves temporaries no name tells from
|
|
67
|
+
* a concurrent fetch's, so the caller owes a sweep rather than removing them here.
|
|
68
|
+
*/
|
|
69
|
+
export declare function maintainMirror(run: (args: string[], options: {
|
|
70
|
+
deadlineMs: number;
|
|
71
|
+
}) => Promise<string>): Promise<{
|
|
72
|
+
repacked: boolean;
|
|
73
|
+
}>;
|
|
74
|
+
/** The mirror's object store, in KiB, for the size warning. */
|
|
75
|
+
export declare function objectStoreKiB(run: (args: string[]) => Promise<string>): Promise<number>;
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { getErrorMessage, isNodeError } from '../utils/error.js';
|
|
4
|
+
import { GitProcessError } from './git-process.js';
|
|
5
|
+
/**
|
|
6
|
+
* Upkeep of the GitHub gateway's private mirror (worker/github-mirror.ts): what a killed process
|
|
7
|
+
* leaves in it, damage that would make it lie, and the maintenance that keeps it fast. Everything
|
|
8
|
+
* here touches only the gateway's own state directory.
|
|
9
|
+
*
|
|
10
|
+
* Two locks order every writer of the mirror, always taken in this order: a mirror session
|
|
11
|
+
* (`GitHubMirror.exclusive`), then the {@link MaintenanceMutex}. Maintenance takes only the mutex,
|
|
12
|
+
* so it runs beside sessions; a session takes the mutex only to sweep (never waiting for it) or
|
|
13
|
+
* to rebuild (waiting, since a rebuild swaps the repository out from under maintenance). A sweep
|
|
14
|
+
* the mutex prevents is owed, and done at the next session's start that can take it.
|
|
15
|
+
*/
|
|
16
|
+
/** A lock that maintenance holds for its whole run; see the module doc for the order. */
|
|
17
|
+
export class MaintenanceMutex {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.held = null;
|
|
20
|
+
}
|
|
21
|
+
/** Take it now, or get null when it is held. */
|
|
22
|
+
tryAcquire() {
|
|
23
|
+
if (this.held !== null)
|
|
24
|
+
return null;
|
|
25
|
+
let release;
|
|
26
|
+
this.held = new Promise((resolve) => {
|
|
27
|
+
release = () => {
|
|
28
|
+
this.held = null;
|
|
29
|
+
resolve();
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
return release;
|
|
33
|
+
}
|
|
34
|
+
/** Take it, waiting for a holder to let go. */
|
|
35
|
+
async acquire() {
|
|
36
|
+
for (;;) {
|
|
37
|
+
const release = this.tryAcquire();
|
|
38
|
+
if (release !== null)
|
|
39
|
+
return release;
|
|
40
|
+
await this.held;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Where a rebuild fetches the replacement, and where the swap parks the old mirror. */
|
|
45
|
+
export function rebuildPaths(gitDir) {
|
|
46
|
+
return { rebuild: `${gitDir}.rebuild`, old: `${gitDir}.old` };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Finish or undo a rebuild a crash interrupted. The swap renames the mirror to `.old`, then
|
|
50
|
+
* `.rebuild` into its place, then deletes `.old`, and begins only once `.rebuild` is complete. So
|
|
51
|
+
* a missing mirror with `.rebuild` present means `.rebuild` is the good one; with only `.old`
|
|
52
|
+
* present (which the sequence cannot leave), `.old` comes back and the corruption check decides.
|
|
53
|
+
* Any other leftover goes.
|
|
54
|
+
*/
|
|
55
|
+
export async function recoverRebuild(gitDir) {
|
|
56
|
+
const { rebuild, old } = rebuildPaths(gitDir);
|
|
57
|
+
if (!(await exists(gitDir))) {
|
|
58
|
+
if (await exists(rebuild))
|
|
59
|
+
await fs.rename(rebuild, gitDir);
|
|
60
|
+
else if (await exists(old))
|
|
61
|
+
await fs.rename(old, gitDir);
|
|
62
|
+
}
|
|
63
|
+
await fs.rm(rebuild, { recursive: true, force: true });
|
|
64
|
+
await fs.rm(old, { recursive: true, force: true });
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Delete every lock and temporary a killed git leaves in the mirror: ref locks
|
|
68
|
+
* (`refs/**`, `packed-refs.lock`, `HEAD.lock`, `config.lock`, `shallow.lock`), `packed-refs.new`,
|
|
69
|
+
* pack temporaries (`tmp_*`, repack's `.tmp-*`), `*.keep` (a fetch's), loose `tmp_obj_*`, and
|
|
70
|
+
* commit-graph locks and temporaries. Only for a mirror no git of this process is writing: at a
|
|
71
|
+
* gateway's first session, or holding the maintenance mutex inside a session. A leftover
|
|
72
|
+
* `refs/heads/<x>.lock` fails every fetch that moves `<x>`; a leftover `packed-refs.new` fails
|
|
73
|
+
* every fetch that prunes a packed ref.
|
|
74
|
+
*/
|
|
75
|
+
export async function sweepLocksAndTemporaries(gitDir) {
|
|
76
|
+
const removed = [];
|
|
77
|
+
const remove = async (file) => {
|
|
78
|
+
await fs.rm(file, { recursive: true, force: true });
|
|
79
|
+
removed.push(path.relative(gitDir, file));
|
|
80
|
+
};
|
|
81
|
+
for (const entry of await list(gitDir)) {
|
|
82
|
+
if (entry.isFile() && (entry.name.endsWith('.lock') || entry.name === 'packed-refs.new')) {
|
|
83
|
+
await remove(path.join(gitDir, entry.name));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
await walk(path.join(gitDir, 'refs'), async (file) => {
|
|
87
|
+
if (file.endsWith('.lock'))
|
|
88
|
+
await remove(file);
|
|
89
|
+
});
|
|
90
|
+
for (const fanout of await list(path.join(gitDir, 'objects'))) {
|
|
91
|
+
if (!/^[0-9a-f]{2}$/.test(fanout.name) || !fanout.isDirectory())
|
|
92
|
+
continue;
|
|
93
|
+
const dir = path.join(gitDir, 'objects', fanout.name);
|
|
94
|
+
for (const entry of await list(dir)) {
|
|
95
|
+
if (entry.name.startsWith('tmp_obj_'))
|
|
96
|
+
await remove(path.join(dir, entry.name));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const packDir = path.join(gitDir, 'objects', 'pack');
|
|
100
|
+
for (const entry of await list(packDir)) {
|
|
101
|
+
const name = entry.name;
|
|
102
|
+
if (name.startsWith('tmp_') ||
|
|
103
|
+
name.startsWith('.tmp-') ||
|
|
104
|
+
name.endsWith('.keep') ||
|
|
105
|
+
name.endsWith('.lock')) {
|
|
106
|
+
await remove(path.join(packDir, name));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const infoDir = path.join(gitDir, 'objects', 'info');
|
|
110
|
+
for (const entry of await list(infoDir)) {
|
|
111
|
+
if (entry.name.endsWith('.lock') || entry.name.startsWith('tmp_')) {
|
|
112
|
+
await remove(path.join(infoDir, entry.name));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const graphs = path.join(infoDir, 'commit-graphs');
|
|
116
|
+
for (const entry of await list(graphs)) {
|
|
117
|
+
if (entry.name.endsWith('.lock') || entry.name.startsWith('tmp_')) {
|
|
118
|
+
await remove(path.join(graphs, entry.name));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return removed;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Whether the mirror has state that makes it lie about GitHub, that no GitHub fetch writes, or
|
|
125
|
+
* that git cannot read: a loose `refs/heads/*` file that is not a ref (a crash can leave one
|
|
126
|
+
* empty, which `for-each-ref` skips with only a warning), a `refs/heads/*` whose object is
|
|
127
|
+
* missing (which `rev-parse --is-bare-repository` cannot see), a `*.promisor` pack,
|
|
128
|
+
* `extensions.partialClone`, a `remote.*.promisor` / `remote.*.partialclonefilter` key in the
|
|
129
|
+
* mirror's own config (read with `--get-regexp`, never `config --list`, which would print a
|
|
130
|
+
* credential's value), or git dying on the repository (exit 128: a truncated `packed-refs` fails
|
|
131
|
+
* every git that reads refs, though `rev-parse --is-bare-repository` passes), unless git says the
|
|
132
|
+
* machine ran out of memory or processes. Each is repaired
|
|
133
|
+
* by a rebuild. Any other failure of git, such as one that could not start, is thrown: the next
|
|
134
|
+
* session checks again. A loose ref that disappears while
|
|
135
|
+
* it is read was packed by maintenance's `pack-refs`. `git(args, stdin?)` runs git in the mirror
|
|
136
|
+
* under its pins.
|
|
137
|
+
*/
|
|
138
|
+
export async function findCorruption(gitDir, git) {
|
|
139
|
+
for (const entry of await list(path.join(gitDir, 'objects', 'pack'))) {
|
|
140
|
+
if (entry.name.endsWith('.promisor'))
|
|
141
|
+
return `it holds a promisor pack (${entry.name})`;
|
|
142
|
+
}
|
|
143
|
+
const broken = [];
|
|
144
|
+
await walk(path.join(gitDir, 'refs', 'heads'), async (file) => {
|
|
145
|
+
if (file.endsWith('.lock'))
|
|
146
|
+
return;
|
|
147
|
+
let content;
|
|
148
|
+
try {
|
|
149
|
+
content = (await fs.readFile(file, 'utf8')).trim();
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
if (isNodeError(err) && err.code === 'ENOENT')
|
|
153
|
+
return;
|
|
154
|
+
throw err;
|
|
155
|
+
}
|
|
156
|
+
if (!/^([0-9a-f]{40}|[0-9a-f]{64})$/.test(content) && !content.startsWith('ref: refs/')) {
|
|
157
|
+
broken.push(path.relative(gitDir, file));
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
if (broken.length > 0)
|
|
161
|
+
return `${broken[0]} is not a ref`;
|
|
162
|
+
try {
|
|
163
|
+
return await checkWithGit(git);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
if (!(err instanceof GitProcessError) ||
|
|
167
|
+
err.exitCode !== 128 ||
|
|
168
|
+
RESOURCE_FAILURE.test(err.stderr)) {
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
return `git cannot read it (${getErrorMessage(err).trim().split('\n')[0].slice(0, 200)})`;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** git's own exit 128 for a machine out of resources, which says nothing about the repository. */
|
|
175
|
+
const RESOURCE_FAILURE = /out of memory|cannot allocate memory|unable to fork|resource temporarily unavailable|mmap failed/i;
|
|
176
|
+
async function checkWithGit(git) {
|
|
177
|
+
const promisorKeys = await git([
|
|
178
|
+
'config',
|
|
179
|
+
'--local',
|
|
180
|
+
'--get-regexp',
|
|
181
|
+
'--end-of-options',
|
|
182
|
+
'^(extensions\\.partialclone|remote\\..*\\.(promisor|partialclonefilter))$',
|
|
183
|
+
]).catch((err) => {
|
|
184
|
+
// Exit 1: no key matched.
|
|
185
|
+
if (err instanceof GitProcessError && err.exitCode === 1)
|
|
186
|
+
return '';
|
|
187
|
+
throw err;
|
|
188
|
+
});
|
|
189
|
+
const key = promisorKeys.split('\n').find(Boolean);
|
|
190
|
+
if (key !== undefined)
|
|
191
|
+
return `its config holds ${key.split(' ')[0]}`;
|
|
192
|
+
const heads = (await git([
|
|
193
|
+
'for-each-ref',
|
|
194
|
+
'--format=%(objectname) %(refname)',
|
|
195
|
+
'--end-of-options',
|
|
196
|
+
'refs/heads/',
|
|
197
|
+
]))
|
|
198
|
+
.split('\n')
|
|
199
|
+
.filter(Boolean);
|
|
200
|
+
if (heads.length === 0)
|
|
201
|
+
return null;
|
|
202
|
+
const lines = (await git(['cat-file', '--batch-check=%(objectname) %(objecttype)', '--end-of-options'], heads.map((line) => `${line.split(' ')[0]}\n`).join(''))).split('\n');
|
|
203
|
+
for (const [i, head] of heads.entries()) {
|
|
204
|
+
if (!/ commit$/.test(lines[i] ?? ''))
|
|
205
|
+
return `${head.split(' ')[1]} names a missing object`;
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
/** Above either count, maintenance repacks: the same thresholds as remote.git's. */
|
|
210
|
+
const MAX_LOOSE_OBJECTS = 50;
|
|
211
|
+
const MAX_PACKS = 6;
|
|
212
|
+
/** The wall-clock bound on each maintenance step, none of which writes anything while it works. */
|
|
213
|
+
const MAINTENANCE_STEP_DEADLINE_MS = 30 * 60 * 1000;
|
|
214
|
+
/**
|
|
215
|
+
* One maintenance run, holding the maintenance mutex: `repack -a -d --cruft` when the mirror
|
|
216
|
+
* holds more than {@link MAX_LOOSE_OBJECTS} loose objects or {@link MAX_PACKS} packs, then
|
|
217
|
+
* `commit-graph write --reachable`, then `pack-refs --all` last. A repack expires no cruft, so no
|
|
218
|
+
* object a session or a quarantine is reading disappears, and a reader holding a pack the repack
|
|
219
|
+
* unlinked keeps reading it. A step killed at its deadline leaves temporaries no name tells from
|
|
220
|
+
* a concurrent fetch's, so the caller owes a sweep rather than removing them here.
|
|
221
|
+
*/
|
|
222
|
+
export async function maintainMirror(run) {
|
|
223
|
+
const step = (args) => run(args, { deadlineMs: MAINTENANCE_STEP_DEADLINE_MS });
|
|
224
|
+
const counts = await step(['count-objects', '-v', '--end-of-options']);
|
|
225
|
+
const field = (name) => {
|
|
226
|
+
const line = counts.split('\n').find((l) => l.startsWith(`${name}: `));
|
|
227
|
+
return Number(line?.slice(name.length + 2) ?? 0);
|
|
228
|
+
};
|
|
229
|
+
const repack = field('count') > MAX_LOOSE_OBJECTS || field('packs') > MAX_PACKS;
|
|
230
|
+
if (repack)
|
|
231
|
+
await step(['repack', '-a', '-d', '--cruft', '-q', '--end-of-options']);
|
|
232
|
+
await step(['commit-graph', 'write', '--reachable', '--end-of-options']);
|
|
233
|
+
await step(['pack-refs', '--all', '--end-of-options']);
|
|
234
|
+
return { repacked: repack };
|
|
235
|
+
}
|
|
236
|
+
/** The mirror's object store, in KiB, for the size warning. */
|
|
237
|
+
export async function objectStoreKiB(run) {
|
|
238
|
+
const output = await run(['count-objects', '-v', '--end-of-options']);
|
|
239
|
+
let total = 0;
|
|
240
|
+
for (const line of output.split('\n')) {
|
|
241
|
+
const [name, value] = line.split(': ');
|
|
242
|
+
if (name === 'size' || name === 'size-pack')
|
|
243
|
+
total += Number(value) || 0;
|
|
244
|
+
}
|
|
245
|
+
return total;
|
|
246
|
+
}
|
|
247
|
+
async function exists(file) {
|
|
248
|
+
return fs.lstat(file).then(() => true, () => false);
|
|
249
|
+
}
|
|
250
|
+
/** `dir`'s entries; none when it does not exist. Any other failure throws, so no sweep passes for done. */
|
|
251
|
+
async function list(dir) {
|
|
252
|
+
return fs.readdir(dir, { withFileTypes: true }).catch((err) => {
|
|
253
|
+
if (isNodeError(err) && (err.code === 'ENOENT' || err.code === 'ENOTDIR'))
|
|
254
|
+
return [];
|
|
255
|
+
throw err;
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
async function walk(dir, visit) {
|
|
259
|
+
for (const entry of await list(dir)) {
|
|
260
|
+
const full = path.join(dir, entry.name);
|
|
261
|
+
if (entry.isDirectory())
|
|
262
|
+
await walk(full, visit);
|
|
263
|
+
else
|
|
264
|
+
await visit(full);
|
|
265
|
+
}
|
|
266
|
+
}
|