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,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A git bundle's header, read in node before git sees the bundle: the gateway refuses a pushed
|
|
3
|
+
* bundle on it (worker/github-mirror.ts), and the worker checks the bundle it is about to send
|
|
4
|
+
* (worker/github-transfer.ts). git's own parser reads everything after a head's first space as the
|
|
5
|
+
* refname and accepts a tab, so nothing here is lenient: a header either matches this grammar
|
|
6
|
+
* exactly or is refused.
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* "# v2 git bundle" LF | "# v3 git bundle" LF ("@object-format=sha1" LF)? at most once
|
|
10
|
+
* ("-" <40 hex> (" " <any bytes but LF>)? LF)* prerequisites; the comment is a commit subject
|
|
11
|
+
* (<40 hex> " " <refname> LF)+ heads
|
|
12
|
+
* LF
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* A prerequisite's comment is the subject of a commit anyone can write, so it is opaque bytes (a
|
|
16
|
+
* tab, a `\r`, non-UTF-8), never parsed and never logged. Every other line ends in LF alone. git
|
|
17
|
+
* reads the comment only to display it, so its length is bounded on its own
|
|
18
|
+
* ({@link PREREQUISITE_COMMENT_MAX_BYTES}) and the worker shortens it rather than send a bundle
|
|
19
|
+
* the gateway would refuse: a boundary commit's subject can be any length. Shortening cuts bytes,
|
|
20
|
+
* never characters, and only after the line's `-<oid> `; it removes bytes and adds none, so it
|
|
21
|
+
* never adds an LF. A bundle has as many prerequisites as it has boundary commits, so the header
|
|
22
|
+
* as the gateway reads it, and as the worker sends it, comments included, has a fixed bound too
|
|
23
|
+
* ({@link BUNDLE_HEADER_TOTAL_MAX_BYTES}).
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* The header must end, with its blank line, within this many bytes, prerequisites' comments not
|
|
27
|
+
* counted.
|
|
28
|
+
* @internal Exported for tests.
|
|
29
|
+
*/
|
|
30
|
+
export declare const BUNDLE_HEADER_MAX_BYTES: number;
|
|
31
|
+
/**
|
|
32
|
+
* The longest prerequisite comment, in bytes, the space before it not counted.
|
|
33
|
+
* @internal Exported for tests.
|
|
34
|
+
*/
|
|
35
|
+
export declare const PREREQUISITE_COMMENT_MAX_BYTES = 1024;
|
|
36
|
+
/**
|
|
37
|
+
* The header must end within this many bytes counting comments too: the bytes read, when
|
|
38
|
+
* refusing; the bytes kept and sent, when shortening. The most a reader holds of a header.
|
|
39
|
+
* @internal Exported for tests.
|
|
40
|
+
*/
|
|
41
|
+
export declare const BUNDLE_HEADER_TOTAL_MAX_BYTES: number;
|
|
42
|
+
export interface BundleHeader {
|
|
43
|
+
/** Bytes from the start of the bundle to the end of the header's blank line. */
|
|
44
|
+
readonly length: number;
|
|
45
|
+
/** Prerequisite object IDs, in order. */
|
|
46
|
+
readonly prerequisites: readonly string[];
|
|
47
|
+
/** Each head line's bytes, without its LF. */
|
|
48
|
+
readonly heads: readonly Buffer[];
|
|
49
|
+
}
|
|
50
|
+
/** A header that is not one this grammar accepts, or not one at all. */
|
|
51
|
+
export declare class BundleHeaderError extends Error {
|
|
52
|
+
constructor(message: string);
|
|
53
|
+
}
|
|
54
|
+
/** A complete header, as {@link BundleHeaderReader.push} returns it. */
|
|
55
|
+
export interface ReadBundleHeader {
|
|
56
|
+
header: BundleHeader;
|
|
57
|
+
/** When shortening, the header's bytes as they are to be sent, each comment shortened; else empty. */
|
|
58
|
+
bytes: Buffer;
|
|
59
|
+
/** What followed the header in the chunk that completed it. */
|
|
60
|
+
rest: Buffer;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reads a header from a bundle's bytes as they arrive, holding at most
|
|
64
|
+
* {@link BUNDLE_HEADER_TOTAL_MAX_BYTES} of it, however long a comment is. A comment over
|
|
65
|
+
* {@link PREREQUISITE_COMMENT_MAX_BYTES} is refused (`'refuse'`, the gateway, which keeps no copy
|
|
66
|
+
* of the header) or cut to it (`'shorten'`, the worker, which sends {@link ReadBundleHeader.bytes}
|
|
67
|
+
* in its place).
|
|
68
|
+
*/
|
|
69
|
+
export declare class BundleHeaderReader {
|
|
70
|
+
private readonly comments;
|
|
71
|
+
private section;
|
|
72
|
+
private sawCapability;
|
|
73
|
+
private readonly prerequisites;
|
|
74
|
+
private readonly heads;
|
|
75
|
+
private readonly out;
|
|
76
|
+
/** The current line, up to where its comment starts. */
|
|
77
|
+
private line;
|
|
78
|
+
private lineBytes;
|
|
79
|
+
/** Header bytes outside comments. */
|
|
80
|
+
private counted;
|
|
81
|
+
/** Bytes taken from the bundle. */
|
|
82
|
+
private consumed;
|
|
83
|
+
/** Comment bytes kept to send, when shortening. */
|
|
84
|
+
private keptBytes;
|
|
85
|
+
/** In a comment: its bytes so far, and those kept to send. */
|
|
86
|
+
private comment;
|
|
87
|
+
private done;
|
|
88
|
+
constructor(comments: 'refuse' | 'shorten');
|
|
89
|
+
/**
|
|
90
|
+
* Take the next bytes: null while the header may still be completed by more, the header once its
|
|
91
|
+
* blank line has arrived. Throws {@link BundleHeaderError} once what has arrived breaks the
|
|
92
|
+
* grammar or a bound.
|
|
93
|
+
*/
|
|
94
|
+
push(chunk: Buffer): ReadBundleHeader | null;
|
|
95
|
+
private mayBePrerequisite;
|
|
96
|
+
private startsComment;
|
|
97
|
+
private takeLine;
|
|
98
|
+
private takeComment;
|
|
99
|
+
private checkBound;
|
|
100
|
+
/** Refuse a signature line that has not ended yet but already cannot become one. */
|
|
101
|
+
private checkPartialSignature;
|
|
102
|
+
/** Check the line just ended: the header once it was the blank line, else null. */
|
|
103
|
+
private endLine;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Read the header at the start of `bytes` ({@link BundleHeaderReader}, refusing a long comment):
|
|
107
|
+
* null while it may still be completed by more bytes, the header once its blank line has arrived.
|
|
108
|
+
* @internal Exported for tests.
|
|
109
|
+
*/
|
|
110
|
+
export declare function scanBundleHeader(bytes: Buffer): BundleHeader | null;
|
|
111
|
+
/**
|
|
112
|
+
* The one head line a bundle of `refs/heads/<branch>` at `sha` has, byte for byte.
|
|
113
|
+
* @internal Exported for tests.
|
|
114
|
+
*/
|
|
115
|
+
export declare function expectedHead(sha: string, branch: string): Buffer;
|
|
116
|
+
/** Whether `header` names exactly one head, and it is {@link expectedHead}'s. */
|
|
117
|
+
export declare function hasOnlyHead(header: BundleHeader, sha: string, branch: string): boolean;
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A git bundle's header, read in node before git sees the bundle: the gateway refuses a pushed
|
|
3
|
+
* bundle on it (worker/github-mirror.ts), and the worker checks the bundle it is about to send
|
|
4
|
+
* (worker/github-transfer.ts). git's own parser reads everything after a head's first space as the
|
|
5
|
+
* refname and accepts a tab, so nothing here is lenient: a header either matches this grammar
|
|
6
|
+
* exactly or is refused.
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* "# v2 git bundle" LF | "# v3 git bundle" LF ("@object-format=sha1" LF)? at most once
|
|
10
|
+
* ("-" <40 hex> (" " <any bytes but LF>)? LF)* prerequisites; the comment is a commit subject
|
|
11
|
+
* (<40 hex> " " <refname> LF)+ heads
|
|
12
|
+
* LF
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* A prerequisite's comment is the subject of a commit anyone can write, so it is opaque bytes (a
|
|
16
|
+
* tab, a `\r`, non-UTF-8), never parsed and never logged. Every other line ends in LF alone. git
|
|
17
|
+
* reads the comment only to display it, so its length is bounded on its own
|
|
18
|
+
* ({@link PREREQUISITE_COMMENT_MAX_BYTES}) and the worker shortens it rather than send a bundle
|
|
19
|
+
* the gateway would refuse: a boundary commit's subject can be any length. Shortening cuts bytes,
|
|
20
|
+
* never characters, and only after the line's `-<oid> `; it removes bytes and adds none, so it
|
|
21
|
+
* never adds an LF. A bundle has as many prerequisites as it has boundary commits, so the header
|
|
22
|
+
* as the gateway reads it, and as the worker sends it, comments included, has a fixed bound too
|
|
23
|
+
* ({@link BUNDLE_HEADER_TOTAL_MAX_BYTES}).
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* The header must end, with its blank line, within this many bytes, prerequisites' comments not
|
|
27
|
+
* counted.
|
|
28
|
+
* @internal Exported for tests.
|
|
29
|
+
*/
|
|
30
|
+
export const BUNDLE_HEADER_MAX_BYTES = 64 * 1024;
|
|
31
|
+
/**
|
|
32
|
+
* The longest prerequisite comment, in bytes, the space before it not counted.
|
|
33
|
+
* @internal Exported for tests.
|
|
34
|
+
*/
|
|
35
|
+
export const PREREQUISITE_COMMENT_MAX_BYTES = 1024;
|
|
36
|
+
/**
|
|
37
|
+
* The header must end within this many bytes counting comments too: the bytes read, when
|
|
38
|
+
* refusing; the bytes kept and sent, when shortening. The most a reader holds of a header.
|
|
39
|
+
* @internal Exported for tests.
|
|
40
|
+
*/
|
|
41
|
+
export const BUNDLE_HEADER_TOTAL_MAX_BYTES = 256 * 1024;
|
|
42
|
+
/** A header that is not one this grammar accepts, or not one at all. */
|
|
43
|
+
export class BundleHeaderError extends Error {
|
|
44
|
+
constructor(message) {
|
|
45
|
+
super(`Refusing the bundle: ${message}`);
|
|
46
|
+
this.name = 'BundleHeaderError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const SIGNATURES = new Set(['# v2 git bundle', '# v3 git bundle']);
|
|
50
|
+
const ALLOWED_CAPABILITY = '@object-format=sha1';
|
|
51
|
+
const HEX_40 = /^[0-9a-f]{40}$/;
|
|
52
|
+
const HEAD = /^[0-9a-f]{40} [^\n]+$/;
|
|
53
|
+
const LF = 0x0a;
|
|
54
|
+
const SPACE = 0x20;
|
|
55
|
+
const DASH = 0x2d;
|
|
56
|
+
/** `-`, 40 hex digits and the space a comment follows. */
|
|
57
|
+
const PREREQUISITE_PREFIX_BYTES = 42;
|
|
58
|
+
/**
|
|
59
|
+
* Reads a header from a bundle's bytes as they arrive, holding at most
|
|
60
|
+
* {@link BUNDLE_HEADER_TOTAL_MAX_BYTES} of it, however long a comment is. A comment over
|
|
61
|
+
* {@link PREREQUISITE_COMMENT_MAX_BYTES} is refused (`'refuse'`, the gateway, which keeps no copy
|
|
62
|
+
* of the header) or cut to it (`'shorten'`, the worker, which sends {@link ReadBundleHeader.bytes}
|
|
63
|
+
* in its place).
|
|
64
|
+
*/
|
|
65
|
+
export class BundleHeaderReader {
|
|
66
|
+
constructor(comments) {
|
|
67
|
+
this.comments = comments;
|
|
68
|
+
this.section = 'signature';
|
|
69
|
+
this.sawCapability = false;
|
|
70
|
+
this.prerequisites = [];
|
|
71
|
+
this.heads = [];
|
|
72
|
+
this.out = [];
|
|
73
|
+
/** The current line, up to where its comment starts. */
|
|
74
|
+
this.line = [];
|
|
75
|
+
this.lineBytes = 0;
|
|
76
|
+
/** Header bytes outside comments. */
|
|
77
|
+
this.counted = 0;
|
|
78
|
+
/** Bytes taken from the bundle. */
|
|
79
|
+
this.consumed = 0;
|
|
80
|
+
/** Comment bytes kept to send, when shortening. */
|
|
81
|
+
this.keptBytes = 0;
|
|
82
|
+
/** In a comment: its bytes so far, and those kept to send. */
|
|
83
|
+
this.comment = null;
|
|
84
|
+
this.done = false;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Take the next bytes: null while the header may still be completed by more, the header once its
|
|
88
|
+
* blank line has arrived. Throws {@link BundleHeaderError} once what has arrived breaks the
|
|
89
|
+
* grammar or a bound.
|
|
90
|
+
*/
|
|
91
|
+
push(chunk) {
|
|
92
|
+
if (this.done)
|
|
93
|
+
throw new Error('The bundle header was already read');
|
|
94
|
+
let offset = 0;
|
|
95
|
+
while (offset < chunk.length) {
|
|
96
|
+
const lf = chunk.indexOf(LF, offset);
|
|
97
|
+
const end = lf === -1 ? chunk.length : lf;
|
|
98
|
+
if (this.comment !== null) {
|
|
99
|
+
this.takeComment(chunk.subarray(offset, end));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// A prerequisite's comment starts after its first 42 bytes; nothing past them is counted
|
|
103
|
+
// until the line says whether it is one.
|
|
104
|
+
const take = this.mayBePrerequisite() && this.lineBytes < PREREQUISITE_PREFIX_BYTES
|
|
105
|
+
? Math.min(end - offset, PREREQUISITE_PREFIX_BYTES - this.lineBytes)
|
|
106
|
+
: end - offset;
|
|
107
|
+
this.takeLine(chunk.subarray(offset, offset + take));
|
|
108
|
+
offset += take;
|
|
109
|
+
if (this.lineBytes === PREREQUISITE_PREFIX_BYTES && this.startsComment()) {
|
|
110
|
+
this.comment = { bytes: 0, kept: [] };
|
|
111
|
+
}
|
|
112
|
+
if (offset < end)
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
offset = end;
|
|
116
|
+
if (lf === -1)
|
|
117
|
+
break;
|
|
118
|
+
offset += 1;
|
|
119
|
+
this.consumed += 1;
|
|
120
|
+
this.counted += 1;
|
|
121
|
+
const header = this.endLine();
|
|
122
|
+
if (header !== null) {
|
|
123
|
+
this.done = true;
|
|
124
|
+
return { header, bytes: Buffer.concat(this.out), rest: chunk.subarray(offset) };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
this.checkBound();
|
|
128
|
+
if (this.section === 'signature' && this.comment === null)
|
|
129
|
+
this.checkPartialSignature();
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
mayBePrerequisite() {
|
|
133
|
+
return (this.section !== 'signature' &&
|
|
134
|
+
this.section !== 'heads' &&
|
|
135
|
+
(this.lineBytes === 0 || this.line[0][0] === DASH));
|
|
136
|
+
}
|
|
137
|
+
startsComment() {
|
|
138
|
+
const line = Buffer.concat(this.line);
|
|
139
|
+
this.line = [line];
|
|
140
|
+
return (line.length === PREREQUISITE_PREFIX_BYTES &&
|
|
141
|
+
line[0] === DASH &&
|
|
142
|
+
line[PREREQUISITE_PREFIX_BYTES - 1] === SPACE);
|
|
143
|
+
}
|
|
144
|
+
takeLine(bytes) {
|
|
145
|
+
this.line.push(bytes);
|
|
146
|
+
this.lineBytes += bytes.length;
|
|
147
|
+
this.counted += bytes.length;
|
|
148
|
+
this.consumed += bytes.length;
|
|
149
|
+
this.checkBound();
|
|
150
|
+
}
|
|
151
|
+
takeComment(bytes) {
|
|
152
|
+
const comment = this.comment;
|
|
153
|
+
if (comment === null)
|
|
154
|
+
return;
|
|
155
|
+
const room = PREREQUISITE_COMMENT_MAX_BYTES - comment.bytes;
|
|
156
|
+
if (bytes.length > room && this.comments === 'refuse') {
|
|
157
|
+
throw new BundleHeaderError(`a prerequisite's comment is longer than ${PREREQUISITE_COMMENT_MAX_BYTES} bytes`);
|
|
158
|
+
}
|
|
159
|
+
if (room > 0 && this.comments === 'shorten') {
|
|
160
|
+
// A copy: a view would keep the whole chunk it came from alive.
|
|
161
|
+
const kept = Buffer.from(bytes.subarray(0, room));
|
|
162
|
+
comment.kept.push(kept);
|
|
163
|
+
this.keptBytes += kept.length;
|
|
164
|
+
}
|
|
165
|
+
comment.bytes += bytes.length;
|
|
166
|
+
this.consumed += bytes.length;
|
|
167
|
+
this.checkBound();
|
|
168
|
+
}
|
|
169
|
+
checkBound() {
|
|
170
|
+
if (this.counted >= BUNDLE_HEADER_MAX_BYTES) {
|
|
171
|
+
throw new BundleHeaderError(`its header does not end within ${BUNDLE_HEADER_MAX_BYTES} bytes`);
|
|
172
|
+
}
|
|
173
|
+
// Refusing, every comment byte is read; shortening, only the kept ones are held and sent, so
|
|
174
|
+
// a single subject of any length shortens rather than counts.
|
|
175
|
+
const total = this.comments === 'refuse' ? this.consumed : this.counted + this.keptBytes;
|
|
176
|
+
if (total >= BUNDLE_HEADER_TOTAL_MAX_BYTES) {
|
|
177
|
+
throw new BundleHeaderError(`its header, comments included, does not end within ${BUNDLE_HEADER_TOTAL_MAX_BYTES} bytes`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Refuse a signature line that has not ended yet but already cannot become one. */
|
|
181
|
+
checkPartialSignature() {
|
|
182
|
+
const text = Buffer.concat(this.line).toString('latin1');
|
|
183
|
+
if (![...SIGNATURES].some((signature) => signature.startsWith(text))) {
|
|
184
|
+
throw new BundleHeaderError('it is not a v2 or v3 git bundle');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** Check the line just ended: the header once it was the blank line, else null. */
|
|
188
|
+
endLine() {
|
|
189
|
+
const line = Buffer.concat(this.line);
|
|
190
|
+
const comment = this.comment;
|
|
191
|
+
this.line = [];
|
|
192
|
+
this.lineBytes = 0;
|
|
193
|
+
this.comment = null;
|
|
194
|
+
if (this.comments === 'shorten')
|
|
195
|
+
this.out.push(line, ...(comment?.kept ?? []), Buffer.from([LF]));
|
|
196
|
+
// latin1 maps each byte to one character, so a pattern sees exactly the bytes.
|
|
197
|
+
const text = line.toString('latin1');
|
|
198
|
+
if (this.section === 'signature') {
|
|
199
|
+
if (!SIGNATURES.has(text))
|
|
200
|
+
throw new BundleHeaderError('it is not a v2 or v3 git bundle');
|
|
201
|
+
this.section = text === '# v3 git bundle' ? 'capabilities' : 'prerequisites';
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
if (text === '') {
|
|
205
|
+
if (this.heads.length === 0)
|
|
206
|
+
throw new BundleHeaderError('it names no head');
|
|
207
|
+
return { length: this.consumed, prerequisites: this.prerequisites, heads: this.heads };
|
|
208
|
+
}
|
|
209
|
+
if (this.section === 'capabilities' && text.startsWith('@')) {
|
|
210
|
+
if (text !== ALLOWED_CAPABILITY) {
|
|
211
|
+
throw new BundleHeaderError(`it declares a capability other than ${ALLOWED_CAPABILITY}`);
|
|
212
|
+
}
|
|
213
|
+
if (this.sawCapability)
|
|
214
|
+
throw new BundleHeaderError('it declares a capability twice');
|
|
215
|
+
this.sawCapability = true;
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
if (this.section !== 'heads' && text.startsWith('-')) {
|
|
219
|
+
// `-<40 hex>`, then nothing, or a space and the comment (taken apart above).
|
|
220
|
+
const id = text.slice(1, 41);
|
|
221
|
+
if (!HEX_40.test(id) || (text.length > 41 && (text.length !== 42 || comment === null))) {
|
|
222
|
+
throw new BundleHeaderError('a prerequisite line is malformed');
|
|
223
|
+
}
|
|
224
|
+
this.prerequisites.push(id);
|
|
225
|
+
this.section = 'prerequisites';
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
if (!HEAD.test(text))
|
|
229
|
+
throw new BundleHeaderError('a line is neither a prerequisite nor a head');
|
|
230
|
+
this.heads.push(line);
|
|
231
|
+
this.section = 'heads';
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Read the header at the start of `bytes` ({@link BundleHeaderReader}, refusing a long comment):
|
|
237
|
+
* null while it may still be completed by more bytes, the header once its blank line has arrived.
|
|
238
|
+
* @internal Exported for tests.
|
|
239
|
+
*/
|
|
240
|
+
export function scanBundleHeader(bytes) {
|
|
241
|
+
return new BundleHeaderReader('refuse').push(bytes)?.header ?? null;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The one head line a bundle of `refs/heads/<branch>` at `sha` has, byte for byte.
|
|
245
|
+
* @internal Exported for tests.
|
|
246
|
+
*/
|
|
247
|
+
export function expectedHead(sha, branch) {
|
|
248
|
+
return Buffer.from(`${sha} refs/heads/${branch}`, 'utf8');
|
|
249
|
+
}
|
|
250
|
+
/** Whether `header` names exactly one head, and it is {@link expectedHead}'s. */
|
|
251
|
+
export function hasOnlyHead(header, sha, branch) {
|
|
252
|
+
return header.heads.length === 1 && header.heads[0].equals(expectedHead(sha, branch));
|
|
253
|
+
}
|