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,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Print a reconciled YAML document by editing the source text it was parsed from, so the bytes
|
|
3
|
+
* the reconciler did not change stay as the author wrote them.
|
|
4
|
+
*
|
|
5
|
+
* `Document.toString()` re-emits every scalar from its VALUE: folded and long plain scalars are
|
|
6
|
+
* re-wrapped at the library's line width, so the first CMS save of a hand-written file rewrites
|
|
7
|
+
* lines nobody edited. Here a clean subtree is copied verbatim from the source, and only a slot
|
|
8
|
+
* the reconciler touched is re-rendered, at the column it already occupies:
|
|
9
|
+
*
|
|
10
|
+
* - **Map**: the reconciler keeps retained pairs in source order and appends new ones, so a map
|
|
11
|
+
* becomes a list of local edits — delete a dropped pair's lines, re-render a pair whose value
|
|
12
|
+
* was replaced, recurse into a value edited in place, insert new pairs after the last item.
|
|
13
|
+
* - **Sequence**: items can be reordered, so the item region is rebuilt as a concatenation of
|
|
14
|
+
* per-item chunks, each one either an original item's source (recursively patched) or a freshly
|
|
15
|
+
* rendered item.
|
|
16
|
+
*
|
|
17
|
+
* A chunk is an item's lines plus the comment and blank lines above it, which is where `yaml`
|
|
18
|
+
* attaches those comments (the item's `commentBefore`), so a chunk moves and dies with exactly
|
|
19
|
+
* the comments the reconciler moves and drops. Above a nested collection's FIRST item they
|
|
20
|
+
* belong to the collection instead, and stay put; above the root map's first key they are the
|
|
21
|
+
* key's (`ownLeadingLines`).
|
|
22
|
+
*
|
|
23
|
+
* Anything this does not handle returns `undefined` from that collection, and the parent
|
|
24
|
+
* re-renders the whole slot instead; only at the root does that reach the caller, which falls
|
|
25
|
+
* back to the reconciled document as `yaml` prints it. Every splice is also re-parsed and
|
|
26
|
+
* checked ({@link printsAs}) before it is returned, so a wrong splice costs formatting, never
|
|
27
|
+
* data.
|
|
28
|
+
*/
|
|
29
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
30
|
+
import { Document, parseDocument, isAlias, isCollection, isMap, isNode, isPair, isScalar, isSeq, YAMLMap, visit, YAMLSeq, } from 'yaml';
|
|
31
|
+
/** Successor markers: the end of a collection, and an item with no source counterpart. */
|
|
32
|
+
const END = Symbol('end');
|
|
33
|
+
const FRESH = Symbol('fresh');
|
|
34
|
+
/** `yaml`'s default `lineWidth`, which `Document.toString()` folds at. */
|
|
35
|
+
const LINE_WIDTH = 80;
|
|
36
|
+
/** Narrowest fold width a deeply indented fragment is rendered at. */
|
|
37
|
+
const MIN_LINE_WIDTH = 40;
|
|
38
|
+
export function snapshotDocument(doc) {
|
|
39
|
+
const items = new Map();
|
|
40
|
+
const visitNode = (node) => {
|
|
41
|
+
if (isMap(node)) {
|
|
42
|
+
items.set(node, node.items.map((pair) => ({ item: pair, value: pair.value })));
|
|
43
|
+
for (const pair of node.items)
|
|
44
|
+
visitNode(pair.value);
|
|
45
|
+
}
|
|
46
|
+
else if (isSeq(node)) {
|
|
47
|
+
items.set(node, node.items.map((item) => ({ item, value: item })));
|
|
48
|
+
for (const item of node.items)
|
|
49
|
+
visitNode(item);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
visitNode(doc.contents);
|
|
53
|
+
let anchored = false;
|
|
54
|
+
visit(doc, (_key, node) => {
|
|
55
|
+
if (isAlias(node) || (isNode(node) && node.anchor !== undefined)) {
|
|
56
|
+
anchored = true;
|
|
57
|
+
return visit.BREAK;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
});
|
|
61
|
+
return { items, anchored };
|
|
62
|
+
}
|
|
63
|
+
class SourceSplicer {
|
|
64
|
+
constructor(raw, eol, doc, snapshot, replaced) {
|
|
65
|
+
this.raw = raw;
|
|
66
|
+
this.eol = eol;
|
|
67
|
+
this.doc = doc;
|
|
68
|
+
this.snapshot = snapshot;
|
|
69
|
+
this.replaced = replaced;
|
|
70
|
+
this.dirtyMemo = new Map();
|
|
71
|
+
}
|
|
72
|
+
print() {
|
|
73
|
+
const root = this.doc.contents;
|
|
74
|
+
if (!isCollection(root) || !this.snapshot.items.has(root))
|
|
75
|
+
return undefined;
|
|
76
|
+
if (!this.isDirty(root))
|
|
77
|
+
return this.raw;
|
|
78
|
+
if (this.snapshot.anchored)
|
|
79
|
+
return undefined;
|
|
80
|
+
const edits = this.collectionEdits(root);
|
|
81
|
+
return edits === undefined ? undefined : this.applyEdits(0, this.raw.length, edits);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Did the reconciler change anything under this node? An original scalar is never mutated in
|
|
85
|
+
* place (a changed value gets a fresh node), so only collections can be dirty.
|
|
86
|
+
*/
|
|
87
|
+
isDirty(node) {
|
|
88
|
+
if (!isCollection(node))
|
|
89
|
+
return false;
|
|
90
|
+
const memo = this.dirtyMemo.get(node);
|
|
91
|
+
if (memo !== undefined)
|
|
92
|
+
return memo;
|
|
93
|
+
const snap = this.snapshot.items.get(node);
|
|
94
|
+
let dirty = snap === undefined || snap.length !== node.items.length;
|
|
95
|
+
for (let i = 0; !dirty && snap !== undefined && i < snap.length; i++) {
|
|
96
|
+
const now = node.items[i];
|
|
97
|
+
const before = snap[i];
|
|
98
|
+
if (now !== before.item)
|
|
99
|
+
dirty = true;
|
|
100
|
+
else if (isPair(now))
|
|
101
|
+
dirty = now.value !== before.value || this.isDirty(now.value);
|
|
102
|
+
else
|
|
103
|
+
dirty = this.isDirty(now);
|
|
104
|
+
}
|
|
105
|
+
this.dirtyMemo.set(node, dirty);
|
|
106
|
+
return dirty;
|
|
107
|
+
}
|
|
108
|
+
collectionEdits(node) {
|
|
109
|
+
if (node.flow)
|
|
110
|
+
return undefined;
|
|
111
|
+
const snap = this.snapshot.items.get(node);
|
|
112
|
+
// An emptied block collection has no block spelling (`key:` alone reads back as null).
|
|
113
|
+
if (snap === undefined || snap.length === 0 || node.items.length === 0)
|
|
114
|
+
return undefined;
|
|
115
|
+
const geometry = [];
|
|
116
|
+
for (const { item, value } of snap) {
|
|
117
|
+
const g = isPair(item) ? this.pairGeometry(item, value) : this.seqItemGeometry(item);
|
|
118
|
+
if (g === undefined)
|
|
119
|
+
return undefined;
|
|
120
|
+
geometry.push(g);
|
|
121
|
+
}
|
|
122
|
+
if (!this.isBlockLayout(geometry))
|
|
123
|
+
return undefined;
|
|
124
|
+
return isMap(node) ? this.mapEdits(node, snap, geometry) : this.seqEdits(node, snap, geometry);
|
|
125
|
+
}
|
|
126
|
+
mapEdits(map, snap, geometry) {
|
|
127
|
+
const col = this.column(geometry[0].content);
|
|
128
|
+
const original = new Set(snap.map((s) => s.item));
|
|
129
|
+
const kept = new Set(map.items);
|
|
130
|
+
const edits = [];
|
|
131
|
+
// Retained pairs must still be in source order, followed only by new pairs.
|
|
132
|
+
const retainedOrder = map.items.filter((pair) => original.has(pair));
|
|
133
|
+
const expectedOrder = snap.map((s) => s.item).filter((pair) => kept.has(pair));
|
|
134
|
+
if (retainedOrder.some((pair, i) => pair !== expectedOrder[i]))
|
|
135
|
+
return undefined;
|
|
136
|
+
const added = map.items.slice(retainedOrder.length);
|
|
137
|
+
if (added.some((pair) => original.has(pair)))
|
|
138
|
+
return undefined;
|
|
139
|
+
const layout = [...geometry];
|
|
140
|
+
for (let i = 0; i < snap.length; i++) {
|
|
141
|
+
const { item, value: before } = snap[i];
|
|
142
|
+
const g = layout[i];
|
|
143
|
+
if (!isPair(item))
|
|
144
|
+
return undefined;
|
|
145
|
+
if (!kept.has(item)) {
|
|
146
|
+
if (g.inline) {
|
|
147
|
+
const next = this.promoteToInline(snap, layout, kept);
|
|
148
|
+
if (next === undefined)
|
|
149
|
+
return undefined;
|
|
150
|
+
edits.push({ start: g.content, end: layout[next].content, text: '' });
|
|
151
|
+
i = next - 1;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const start = i === 0 ? this.ownLeadingLines(map, item, g.lineStart) : this.chunkStart(layout, i);
|
|
155
|
+
edits.push({ start, end: g.end, text: '' });
|
|
156
|
+
}
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const now = item.value;
|
|
160
|
+
const clean = now === before && !this.isDirty(now);
|
|
161
|
+
const inner = clean
|
|
162
|
+
? []
|
|
163
|
+
: now === before && isCollection(now)
|
|
164
|
+
? this.collectionEdits(now)
|
|
165
|
+
: undefined;
|
|
166
|
+
if (inner !== undefined) {
|
|
167
|
+
const next = map.items[map.items.indexOf(item) + 1] ?? END;
|
|
168
|
+
if ((i + 1 < snap.length ? snap[i + 1].item : END) !== next) {
|
|
169
|
+
edits.push(...uncovered(this.outdentedCommentEdits(g, col), inner));
|
|
170
|
+
}
|
|
171
|
+
edits.push(...inner);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
// The key is never replaced, so the comment lines above it stay in the source.
|
|
175
|
+
const text = withoutLeadingComment(item.key, () => this.render(mapOf([item]), col, g.inline));
|
|
176
|
+
edits.push({ start: g.lineStart, end: g.end, text: this.matchFinalNewline(g.end, text) });
|
|
177
|
+
}
|
|
178
|
+
if (added.length > 0) {
|
|
179
|
+
const at = layout[layout.length - 1].end;
|
|
180
|
+
const text = this.render(mapOf(added), col, false);
|
|
181
|
+
edits.push({ start: at, end: at, text: this.raw[at - 1] === '\n' ? text : this.eol + text });
|
|
182
|
+
}
|
|
183
|
+
return edits;
|
|
184
|
+
}
|
|
185
|
+
seqEdits(seq, snap, geometry) {
|
|
186
|
+
if (geometry[0].inline)
|
|
187
|
+
return undefined;
|
|
188
|
+
const col = this.column(geometry[0].content);
|
|
189
|
+
const oldIndex = new Map(snap.map((s, i) => [s.item, i]));
|
|
190
|
+
const parts = [];
|
|
191
|
+
const sourceOf = (item) => oldIndex.has(item) ? item : isNode(item) ? this.replaced.get(item) : undefined;
|
|
192
|
+
for (const [k, item] of seq.items.entries()) {
|
|
193
|
+
const j = oldIndex.get(item);
|
|
194
|
+
let part;
|
|
195
|
+
if (j !== undefined) {
|
|
196
|
+
const start = this.chunkStart(geometry, j);
|
|
197
|
+
const inner = isCollection(item) && this.isDirty(item) ? this.collectionEdits(item) : [];
|
|
198
|
+
const next = k + 1 < seq.items.length ? sourceOf(seq.items[k + 1]) : END;
|
|
199
|
+
const moved = (j + 1 < snap.length ? snap[j + 1].item : END) !== (next ?? FRESH);
|
|
200
|
+
part =
|
|
201
|
+
inner !== undefined
|
|
202
|
+
? this.applyEdits(start, geometry[j].end, [
|
|
203
|
+
...inner,
|
|
204
|
+
...(moved ? uncovered(this.outdentedCommentEdits(geometry[j], col), inner) : []),
|
|
205
|
+
])
|
|
206
|
+
: this.raw.slice(start, geometry[j].lineStart) +
|
|
207
|
+
withoutLeadingComment(item, () => this.render(seqOf(item), col, false));
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// A fresh node keeps the comment lines above its slot only if the reconciler carried
|
|
211
|
+
// them across; it does not off a replaced collection.
|
|
212
|
+
const old = isNode(item) ? this.replaced.get(item) : undefined;
|
|
213
|
+
const k = old === undefined ? undefined : oldIndex.get(old);
|
|
214
|
+
part =
|
|
215
|
+
k !== undefined && sameLeadingComment(old, item)
|
|
216
|
+
? this.raw.slice(this.chunkStart(geometry, k), geometry[k].lineStart) +
|
|
217
|
+
withoutLeadingComment(item, () => this.render(seqOf(item), col, false))
|
|
218
|
+
: this.render(seqOf(item), col, false);
|
|
219
|
+
}
|
|
220
|
+
parts.push(part.endsWith('\n') ? part : part + this.eol);
|
|
221
|
+
}
|
|
222
|
+
const start = geometry[0].lineStart;
|
|
223
|
+
const end = geometry[geometry.length - 1].end;
|
|
224
|
+
return [{ start, end, text: this.matchFinalNewline(end, parts.join('')) }];
|
|
225
|
+
}
|
|
226
|
+
/** Rendered text always ends in a line break; drop it where the source it replaces had none. */
|
|
227
|
+
matchFinalNewline(end, text) {
|
|
228
|
+
return this.raw[end - 1] !== '\n' && text.endsWith(this.eol)
|
|
229
|
+
? text.slice(0, -this.eol.length)
|
|
230
|
+
: text;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The first pair shares the parent's `- ` line and was dropped: move the first retained pair up
|
|
234
|
+
* onto that line, so the pairs before it go and the rest of the map stays as written. Returns
|
|
235
|
+
* that pair's index, or undefined when no pair is retained or comment lines above it would have
|
|
236
|
+
* to go with the lines being removed.
|
|
237
|
+
*/
|
|
238
|
+
promoteToInline(snap, layout, kept) {
|
|
239
|
+
const next = snap.findIndex((s) => kept.has(s.item));
|
|
240
|
+
if (next <= 0)
|
|
241
|
+
return undefined;
|
|
242
|
+
if (this.raw.slice(this.chunkStart(layout, next), layout[next].lineStart).includes('#')) {
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
const g = layout[next];
|
|
246
|
+
layout[next] = { ...g, inline: true, lineStart: g.content };
|
|
247
|
+
return next;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Where a dropped FIRST pair's lines begin. The comment lines above a nested collection's first
|
|
251
|
+
* item are the collection's and stay, but above the root map's first key `yaml` gives them to
|
|
252
|
+
* the key, so the reconciler drops them with it and so must the splice.
|
|
253
|
+
*/
|
|
254
|
+
ownLeadingLines(map, pair, start) {
|
|
255
|
+
const key = pair.key;
|
|
256
|
+
if (map !== this.doc.contents || !key.commentBefore || this.doc.commentBefore)
|
|
257
|
+
return start;
|
|
258
|
+
let at = start;
|
|
259
|
+
while (at > 0) {
|
|
260
|
+
const previous = this.lineStart(at - 1);
|
|
261
|
+
if (previous >= at)
|
|
262
|
+
break;
|
|
263
|
+
if (!/^[ \t]*(#.*)?\r?\n?$/.test(this.raw.slice(previous, at)))
|
|
264
|
+
break;
|
|
265
|
+
at = previous;
|
|
266
|
+
}
|
|
267
|
+
return at;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* The run of comment lines that ends an item's region reads to a person as being about what
|
|
271
|
+
* comes next, but it is the item's: `yaml`'s parser (`pop()`) keeps a trailing run with the
|
|
272
|
+
* nested collection it ends when that collection is not at column 0 and any line of the run is
|
|
273
|
+
* at or right of its indent. While the neighbour below is unchanged that is harmless; once it
|
|
274
|
+
* changes, indent the run's shallower lines to its deepest comment, so they read as the item's
|
|
275
|
+
* and do not head content they were never about. Where that lands a line in a deeper scalar's comment or content
|
|
276
|
+
* instead, {@link printsAs} refuses the splice. A run at or left of the item's own column is a
|
|
277
|
+
* zero-indented list's tail, and is left alone.
|
|
278
|
+
*/
|
|
279
|
+
outdentedCommentEdits(g, col) {
|
|
280
|
+
let run = [];
|
|
281
|
+
let at = this.raw.indexOf('\n', g.content) + 1;
|
|
282
|
+
while (at > 0 && at < g.end) {
|
|
283
|
+
const lineEnd = this.raw.indexOf('\n', at);
|
|
284
|
+
const line = this.raw.slice(at, lineEnd === -1 ? g.end : lineEnd);
|
|
285
|
+
const indent = line.length - line.trimStart().length;
|
|
286
|
+
if (line.trimStart().startsWith('#'))
|
|
287
|
+
run.push({ start: at, indent });
|
|
288
|
+
else if (line.trim() !== '')
|
|
289
|
+
run = [];
|
|
290
|
+
at = lineEnd === -1 ? g.end : lineEnd + 1;
|
|
291
|
+
}
|
|
292
|
+
const pin = Math.max(-1, ...run.map((line) => line.indent));
|
|
293
|
+
if (pin <= col)
|
|
294
|
+
return [];
|
|
295
|
+
return run
|
|
296
|
+
.filter((line) => line.indent < pin)
|
|
297
|
+
.map((line) => ({ start: line.start, end: line.start + line.indent, text: ' '.repeat(pin) }));
|
|
298
|
+
}
|
|
299
|
+
/** Where item `i`'s chunk begins: its own line for the first item, else the previous item's end. */
|
|
300
|
+
chunkStart(geometry, i) {
|
|
301
|
+
return i === 0 ? geometry[0].lineStart : geometry[i - 1].end;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Every item starts at the same column, in order, and only the first may share its line with
|
|
305
|
+
* the parent's `- ` (a compact `- key: value`). Anything else — an explicit `? key`, a
|
|
306
|
+
* multi-line key, a node property on its own line — is not a layout this splices.
|
|
307
|
+
*/
|
|
308
|
+
isBlockLayout(geometry) {
|
|
309
|
+
const col = this.column(geometry[0].content);
|
|
310
|
+
let previousEnd = -1;
|
|
311
|
+
for (const [i, g] of geometry.entries()) {
|
|
312
|
+
if (this.column(g.content) !== col)
|
|
313
|
+
return false;
|
|
314
|
+
if (i > 0 && g.inline)
|
|
315
|
+
return false;
|
|
316
|
+
if (g.lineStart < previousEnd || g.end <= g.content)
|
|
317
|
+
return false;
|
|
318
|
+
previousEnd = g.end;
|
|
319
|
+
}
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
/** `value` is the pair's value as parsed: the reconciler may already have replaced it. */
|
|
323
|
+
pairGeometry(pair, value) {
|
|
324
|
+
const key = pair.key;
|
|
325
|
+
if (!isScalar(key) || key.range == null)
|
|
326
|
+
return undefined;
|
|
327
|
+
const content = key.range[0];
|
|
328
|
+
const range = isNode(value) && value.range != null ? value.range : key.range;
|
|
329
|
+
return this.geometry(content, range[1], range[2]);
|
|
330
|
+
}
|
|
331
|
+
seqItemGeometry(item) {
|
|
332
|
+
if (!isNode(item) || item.range == null)
|
|
333
|
+
return undefined;
|
|
334
|
+
let dash = item.range[0] - 1;
|
|
335
|
+
while (dash >= 0 && ' \t\r\n'.includes(this.raw[dash]))
|
|
336
|
+
dash--;
|
|
337
|
+
if (dash < 0 || this.raw[dash] !== '-')
|
|
338
|
+
return undefined;
|
|
339
|
+
return this.geometry(dash, item.range[1], item.range[2]);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Trailing blank lines are not the item's — `yaml` gives them to whatever follows — unless they
|
|
343
|
+
* are inside the value itself, as a keep-chomped (`|+`) block scalar's are. A node that ends in
|
|
344
|
+
* a comment can end inside the NEXT line's indentation; that line is not the item's either.
|
|
345
|
+
*/
|
|
346
|
+
geometry(content, valueEnd, nodeEnd) {
|
|
347
|
+
const nodeEndLine = this.lineStart(nodeEnd);
|
|
348
|
+
if (nodeEndLine > content && /^[ \t]*$/.test(this.raw.slice(nodeEndLine, nodeEnd))) {
|
|
349
|
+
nodeEnd = nodeEndLine;
|
|
350
|
+
valueEnd = Math.min(valueEnd, nodeEnd);
|
|
351
|
+
}
|
|
352
|
+
let last = Math.max(content, nodeEnd - 1);
|
|
353
|
+
while (last > content && last >= valueEnd && ' \t\r\n'.includes(this.raw[last]))
|
|
354
|
+
last--;
|
|
355
|
+
const newline = this.raw.indexOf('\n', last);
|
|
356
|
+
const lineStart = this.lineStart(content);
|
|
357
|
+
const onOwnLine = /^ *$/.test(this.raw.slice(lineStart, content));
|
|
358
|
+
return {
|
|
359
|
+
content,
|
|
360
|
+
inline: !onOwnLine,
|
|
361
|
+
lineStart: onOwnLine ? lineStart : content,
|
|
362
|
+
end: newline === -1 ? this.raw.length : newline + 1,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
lineStart(offset) {
|
|
366
|
+
// `lastIndexOf` clamps a negative index to 0, which would find a newline AT offset 0.
|
|
367
|
+
return offset <= 0 ? 0 : this.raw.lastIndexOf('\n', offset - 1) + 1;
|
|
368
|
+
}
|
|
369
|
+
column(offset) {
|
|
370
|
+
return offset - this.lineStart(offset);
|
|
371
|
+
}
|
|
372
|
+
applyEdits(start, end, edits) {
|
|
373
|
+
const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);
|
|
374
|
+
let out = '';
|
|
375
|
+
let cursor = start;
|
|
376
|
+
for (const edit of sorted) {
|
|
377
|
+
if (edit.start < cursor || edit.end > end)
|
|
378
|
+
throw new Error('overlapping source edits');
|
|
379
|
+
out += this.raw.slice(cursor, edit.start) + edit.text;
|
|
380
|
+
cursor = edit.end;
|
|
381
|
+
}
|
|
382
|
+
return out + this.raw.slice(cursor, end);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Render `items` as a block collection whose items sit at column `col`. `inline` leaves the
|
|
386
|
+
* first line unindented, for a slot that continues the parent's `- ` line. The fold width is
|
|
387
|
+
* reduced by the indent so the lines come out as wide as `toString()` would make them there.
|
|
388
|
+
*/
|
|
389
|
+
render(container, col, inline) {
|
|
390
|
+
const fragment = new Document();
|
|
391
|
+
fragment.schema = this.doc.schema;
|
|
392
|
+
fragment.contents = container;
|
|
393
|
+
// A comment parsed from a CRLF file keeps a `\r` on every line but its last; the line ending
|
|
394
|
+
// is this.eol's to write.
|
|
395
|
+
const text = fragment
|
|
396
|
+
.toString({ lineWidth: Math.max(MIN_LINE_WIDTH, LINE_WIDTH - col) })
|
|
397
|
+
.replace(/\r\n?/g, '\n');
|
|
398
|
+
const indent = ' '.repeat(col);
|
|
399
|
+
const lines = text.split('\n');
|
|
400
|
+
if (lines[lines.length - 1] === '')
|
|
401
|
+
lines.pop();
|
|
402
|
+
return lines
|
|
403
|
+
.map((line, i) => (line === '' || (i === 0 && inline) ? line : indent + line))
|
|
404
|
+
.map((line) => line + this.eol)
|
|
405
|
+
.join('');
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* The edits in `extra` that no edit in `edits` already rewrites. A run of comment lines inside
|
|
410
|
+
* a value that is being deleted or re-rendered goes, or is re-drawn, with that value.
|
|
411
|
+
*/
|
|
412
|
+
function uncovered(extra, edits) {
|
|
413
|
+
return extra.filter((e) => !edits.some((x) => x.end > x.start && x.start <= e.start && e.end <= x.end));
|
|
414
|
+
}
|
|
415
|
+
function mapOf(pairs) {
|
|
416
|
+
const map = new YAMLMap();
|
|
417
|
+
map.items = [...pairs];
|
|
418
|
+
return map;
|
|
419
|
+
}
|
|
420
|
+
function seqOf(item) {
|
|
421
|
+
const seq = new YAMLSeq();
|
|
422
|
+
seq.items = [item];
|
|
423
|
+
return seq;
|
|
424
|
+
}
|
|
425
|
+
function sameLeadingComment(a, b) {
|
|
426
|
+
if (!isNode(a) || !isNode(b))
|
|
427
|
+
return false;
|
|
428
|
+
const x = a;
|
|
429
|
+
const y = b;
|
|
430
|
+
return ((x.commentBefore ?? undefined) === (y.commentBefore ?? undefined) &&
|
|
431
|
+
!!x.spaceBefore === !!y.spaceBefore);
|
|
432
|
+
}
|
|
433
|
+
/** Run `fn` with `node`'s leading comment and blank line hidden, because the source keeps them. */
|
|
434
|
+
function withoutLeadingComment(node, fn) {
|
|
435
|
+
if (!isNode(node))
|
|
436
|
+
return fn();
|
|
437
|
+
const target = node;
|
|
438
|
+
const { commentBefore, spaceBefore } = target;
|
|
439
|
+
target.commentBefore = undefined;
|
|
440
|
+
target.spaceBefore = false;
|
|
441
|
+
try {
|
|
442
|
+
return fn();
|
|
443
|
+
}
|
|
444
|
+
finally {
|
|
445
|
+
target.commentBefore = commentBefore;
|
|
446
|
+
target.spaceBefore = spaceBefore;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* The line ending a splice must write, or undefined for a file mixing them (or using bare `\r`),
|
|
451
|
+
* which no single choice would reproduce.
|
|
452
|
+
*/
|
|
453
|
+
function lineEndingOf(raw) {
|
|
454
|
+
const crlf = (raw.match(/\r\n/g) ?? []).length;
|
|
455
|
+
const lf = (raw.match(/\n/g) ?? []).length;
|
|
456
|
+
const cr = (raw.match(/\r/g) ?? []).length;
|
|
457
|
+
if (crlf === 0)
|
|
458
|
+
return cr === 0 ? '\n' : undefined;
|
|
459
|
+
return crlf === lf && crlf === cr ? '\r\n' : undefined;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* `printed` (a `toString()`) written with `raw`'s line endings: CRLF when `raw` is consistently
|
|
463
|
+
* CRLF, else LF. Either way without the stray `\r` that comments parsed from CRLF keep, so a
|
|
464
|
+
* whole-file re-print does not leave the file with mixed line endings.
|
|
465
|
+
*/
|
|
466
|
+
export function withSourceLineEndings(printed, raw) {
|
|
467
|
+
const text = printed.replace(/\r\n?/g, '\n');
|
|
468
|
+
return lineEndingOf(raw) === '\r\n' ? text.replace(/\n/g, '\r\n') : text;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* The source text of `raw` with only the reconciler's changes applied, or undefined when the
|
|
472
|
+
* document holds a construct this does not splice or the splice fails its self-check.
|
|
473
|
+
* `replaced` maps each node the reconciler created for an existing slot back to the node it
|
|
474
|
+
* replaced; `printed` is the reconciled document's `toString()`.
|
|
475
|
+
*/
|
|
476
|
+
export function spliceSource(raw, doc, snapshot, replaced, printed) {
|
|
477
|
+
const eol = lineEndingOf(raw);
|
|
478
|
+
if (eol === undefined)
|
|
479
|
+
return undefined;
|
|
480
|
+
const spliced = new SourceSplicer(raw, eol, doc, snapshot, replaced).print();
|
|
481
|
+
return spliced !== undefined && printsAs(spliced, doc, printed) ? spliced : undefined;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Does `candidate` read back as the text it replaces, `printed`, would? It must parse cleanly,
|
|
485
|
+
* hold the reconciled document's data, and print as `printed` re-parsed prints — the same keys
|
|
486
|
+
* in the same order, the same comments where `yaml` draws them, which is by the node it gives
|
|
487
|
+
* each to.
|
|
488
|
+
*
|
|
489
|
+
* Re-parsed, not `printed` itself: where `yaml` cannot write the reconciled document so that it
|
|
490
|
+
* reads back as itself — a comment following an outdented trailing comment is read as the
|
|
491
|
+
* previous item's, whoever it belonged to — the splice need only be no worse than `printed`.
|
|
492
|
+
* Wherever it can, the two are the same comparison.
|
|
493
|
+
*
|
|
494
|
+
* Blank lines and trailing whitespace are left out: they are formatting the splice copies from
|
|
495
|
+
* the source, and `yaml` prints them inconsistently (a blank line inside an indented block as the
|
|
496
|
+
* indent alone; a blank line before a list's first item doubled; a stray `\r` kept in some
|
|
497
|
+
* comments parsed from a CRLF file).
|
|
498
|
+
*/
|
|
499
|
+
function printsAs(candidate, reconciled, printed) {
|
|
500
|
+
if (candidate === printed)
|
|
501
|
+
return true;
|
|
502
|
+
const reparsed = parseDocument(candidate);
|
|
503
|
+
if (reparsed.errors.length > 0)
|
|
504
|
+
return false;
|
|
505
|
+
if (!isDeepStrictEqual(reparsed.toJS(), reconciled.toJS()))
|
|
506
|
+
return false;
|
|
507
|
+
return layoutFree(reparsed.toString()) === layoutFree(parseDocument(printed).toString());
|
|
508
|
+
}
|
|
509
|
+
function layoutFree(text) {
|
|
510
|
+
return text
|
|
511
|
+
.split('\n')
|
|
512
|
+
.map((line) => line.replace(/[ \t\r]+$/, ''))
|
|
513
|
+
.filter((line) => line !== '')
|
|
514
|
+
.join('\n');
|
|
515
|
+
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* Two other readers still spell the keys out themselves — they read the value
|
|
17
17
|
* positionally and disagree on precedence (`resolveBlockItem` prefers `template`,
|
|
18
18
|
* `ai/json-to-markdown.ts` prefers `_type`) — see
|
|
19
|
-
*
|
|
19
|
+
* safeinsights/canopycms#584.
|
|
20
20
|
*
|
|
21
21
|
* Dependency-free on purpose: both importers reach contexts that must not pull in
|
|
22
22
|
* schema types or node built-ins.
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* Two other readers still spell the keys out themselves — they read the value
|
|
17
17
|
* positionally and disagree on precedence (`resolveBlockItem` prefers `template`,
|
|
18
18
|
* `ai/json-to-markdown.ts` prefers `_type`) — see
|
|
19
|
-
*
|
|
19
|
+
* safeinsights/canopycms#584.
|
|
20
20
|
*
|
|
21
21
|
* Dependency-free on purpose: both importers reach contexts that must not pull in
|
|
22
22
|
* schema types or node built-ins.
|
|
@@ -1,31 +1,23 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
referencedBy: ReferenceInfo[];
|
|
1
|
+
import type { EntrySchema } from '../config/index.js';
|
|
2
|
+
import type { ContentId, LogicalPath } from '../paths/index.js';
|
|
3
|
+
/** The parts of a `listEntries` item a reference scan reads. Data must be raw (unresolved). */
|
|
4
|
+
export interface ReferenceScanEntry {
|
|
5
|
+
entryPath: LogicalPath;
|
|
6
|
+
entryId: ContentId;
|
|
7
|
+
schema?: EntrySchema;
|
|
8
|
+
data: Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* The entry's type has no schema in the running code (`EntryTypeConfig.unavailable`), so
|
|
11
|
+
* which fields are references is unknown: any string equal to the target id counts as one.
|
|
12
|
+
*/
|
|
13
|
+
schemaUnavailable?: boolean;
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
private collections;
|
|
23
|
-
constructor(store: ContentStore, idIndex: ContentIdIndex, collections: Map<LogicalPath, {
|
|
24
|
-
fields: FieldConfig[];
|
|
25
|
-
}>);
|
|
26
|
-
canDelete(id: string): Promise<DeletionCheckResult>;
|
|
27
|
-
findReferences(targetId: string): Promise<ReferenceInfo[]>;
|
|
28
|
-
private scanCollection;
|
|
29
|
-
private findIdInData;
|
|
30
|
-
private listEntriesInCollection;
|
|
15
|
+
export interface ReferencingEntry<E extends ReferenceScanEntry = ReferenceScanEntry> {
|
|
16
|
+
entry: E;
|
|
17
|
+
/** Where its reference fields hold the target id, as `collectReferenceIds` paths. */
|
|
18
|
+
fields: string[];
|
|
19
|
+
/** Raw data paths of the strings, the md/mdx body included, holding an `entry:` link to it. */
|
|
20
|
+
links: string[];
|
|
31
21
|
}
|
|
22
|
+
/** Entries but the target whose schema's reference fields or `entry:` links hold `targetId`. */
|
|
23
|
+
export declare function findReferencingEntries<E extends ReferenceScanEntry>(entries: Iterable<E>, targetId: string): ReferencingEntry<E>[];
|