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,14 @@
|
|
|
1
|
+
import type { EntrySchemaRegistry } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* A sha256 digest of an entry schema registry: equal for registries with equal content, so it
|
|
4
|
+
* is stable across cold starts of one image, and different when any definition differs.
|
|
5
|
+
*
|
|
6
|
+
* Object keys are sorted, so declaration order cannot change it. Every value is tagged with
|
|
7
|
+
* its type and every string carries its length, so distinct JSON-shaped values never write the
|
|
8
|
+
* same bytes. A custom field may hold anything, so a function contributes its source text rather
|
|
9
|
+
* than being dropped the way JSON drops it; any other object is walked by its own enumerable
|
|
10
|
+
* keys (a Date, Map or Set writes like `{}`), and a value already on the walk's path is written
|
|
11
|
+
* as a cycle marker rather than recursed into. Memoized per registry object, which the code
|
|
12
|
+
* builds once.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registryFingerprint(registry: EntrySchemaRegistry): string;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const fingerprints = new WeakMap();
|
|
3
|
+
/**
|
|
4
|
+
* A sha256 digest of an entry schema registry: equal for registries with equal content, so it
|
|
5
|
+
* is stable across cold starts of one image, and different when any definition differs.
|
|
6
|
+
*
|
|
7
|
+
* Object keys are sorted, so declaration order cannot change it. Every value is tagged with
|
|
8
|
+
* its type and every string carries its length, so distinct JSON-shaped values never write the
|
|
9
|
+
* same bytes. A custom field may hold anything, so a function contributes its source text rather
|
|
10
|
+
* than being dropped the way JSON drops it; any other object is walked by its own enumerable
|
|
11
|
+
* keys (a Date, Map or Set writes like `{}`), and a value already on the walk's path is written
|
|
12
|
+
* as a cycle marker rather than recursed into. Memoized per registry object, which the code
|
|
13
|
+
* builds once.
|
|
14
|
+
*/
|
|
15
|
+
export function registryFingerprint(registry) {
|
|
16
|
+
const memo = fingerprints.get(registry);
|
|
17
|
+
if (memo)
|
|
18
|
+
return memo;
|
|
19
|
+
const hash = createHash('sha256');
|
|
20
|
+
const ancestors = new Set();
|
|
21
|
+
const text = (tag, value) => hash.update(`${tag}${value.length}:${value}`);
|
|
22
|
+
const write = (value) => {
|
|
23
|
+
switch (typeof value) {
|
|
24
|
+
case 'string':
|
|
25
|
+
return void text('s', value);
|
|
26
|
+
case 'number':
|
|
27
|
+
case 'bigint':
|
|
28
|
+
case 'boolean':
|
|
29
|
+
return void text(typeof value, String(value));
|
|
30
|
+
case 'undefined':
|
|
31
|
+
return void hash.update('u');
|
|
32
|
+
case 'symbol':
|
|
33
|
+
return void text('y', value.toString());
|
|
34
|
+
case 'function':
|
|
35
|
+
return void text('f', Function.prototype.toString.call(value));
|
|
36
|
+
}
|
|
37
|
+
if (value === null)
|
|
38
|
+
return void hash.update('n');
|
|
39
|
+
const object = value;
|
|
40
|
+
if (ancestors.has(object))
|
|
41
|
+
return void hash.update('c');
|
|
42
|
+
ancestors.add(object);
|
|
43
|
+
if (Array.isArray(object)) {
|
|
44
|
+
hash.update(`[${object.length}`);
|
|
45
|
+
for (const item of object)
|
|
46
|
+
write(item);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const record = object;
|
|
50
|
+
const keys = Object.keys(record).sort();
|
|
51
|
+
hash.update(`{${keys.length}`);
|
|
52
|
+
for (const key of keys) {
|
|
53
|
+
text('k', key);
|
|
54
|
+
write(record[key]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
ancestors.delete(object);
|
|
58
|
+
};
|
|
59
|
+
write(registry);
|
|
60
|
+
const digest = hash.digest('hex');
|
|
61
|
+
fingerprints.set(registry, digest);
|
|
62
|
+
return digest;
|
|
63
|
+
}
|
|
@@ -8,22 +8,25 @@
|
|
|
8
8
|
* in .collection.json files for reusability and type safety.
|
|
9
9
|
*/
|
|
10
10
|
import type { RootCollectionConfig } from '../config/index.js';
|
|
11
|
-
import type { EntrySchemaRegistry, SchemaResolutionResult } from './types.js';
|
|
11
|
+
import type { EntrySchemaRegistry, SchemaResolutionResult, UnknownSchemaPolicy } from './types.js';
|
|
12
12
|
/**
|
|
13
13
|
* Resolve schema from .collection.json files.
|
|
14
14
|
*
|
|
15
15
|
* @param contentRoot - Path to the content directory
|
|
16
16
|
* @param entrySchemaRegistry - Map of entry schema names to field definitions
|
|
17
|
+
* @param options.unknownSchema - 'throw' (the default) or 'degrade'; see `resolveCollectionMetaFiles`
|
|
17
18
|
* @returns Resolved schema configuration
|
|
18
|
-
* @throws Error if schema references cannot be resolved
|
|
19
|
+
* @throws Error if schema references cannot be resolved under the 'throw' policy
|
|
19
20
|
*/
|
|
20
|
-
export declare function resolveSchema(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry
|
|
21
|
+
export declare function resolveSchema(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry, options?: {
|
|
22
|
+
unknownSchema?: UnknownSchemaPolicy;
|
|
23
|
+
}): Promise<SchemaResolutionResult>;
|
|
21
24
|
/**
|
|
22
25
|
* Check if content root has any .collection.json files.
|
|
23
26
|
*
|
|
24
27
|
* @param contentRoot - Path to the content directory
|
|
25
28
|
* @returns true if at least one .collection.json file exists
|
|
26
|
-
* @internal No importer; deletion candidate in
|
|
29
|
+
* @internal No importer; deletion candidate in safeinsights/canopycms#725.
|
|
27
30
|
*/
|
|
28
31
|
export declare function hasSchemaFiles(contentRoot: string): Promise<boolean>;
|
|
29
32
|
/**
|
package/dist/schema/resolver.js
CHANGED
|
@@ -7,16 +7,17 @@
|
|
|
7
7
|
* Field schemas are defined in the entry schema registry and referenced by name
|
|
8
8
|
* in .collection.json files for reusability and type safety.
|
|
9
9
|
*/
|
|
10
|
-
import { loadCollectionMetaFiles,
|
|
10
|
+
import { loadCollectionMetaFiles, resolveCollectionMetaFiles } from './meta-loader.js';
|
|
11
11
|
/**
|
|
12
12
|
* Resolve schema from .collection.json files.
|
|
13
13
|
*
|
|
14
14
|
* @param contentRoot - Path to the content directory
|
|
15
15
|
* @param entrySchemaRegistry - Map of entry schema names to field definitions
|
|
16
|
+
* @param options.unknownSchema - 'throw' (the default) or 'degrade'; see `resolveCollectionMetaFiles`
|
|
16
17
|
* @returns Resolved schema configuration
|
|
17
|
-
* @throws Error if schema references cannot be resolved
|
|
18
|
+
* @throws Error if schema references cannot be resolved under the 'throw' policy
|
|
18
19
|
*/
|
|
19
|
-
export async function resolveSchema(contentRoot, entrySchemaRegistry) {
|
|
20
|
+
export async function resolveSchema(contentRoot, entrySchemaRegistry, options = {}) {
|
|
20
21
|
const metaFiles = await loadCollectionMetaFiles(contentRoot);
|
|
21
22
|
// Build source info for debugging
|
|
22
23
|
const sources = [];
|
|
@@ -34,15 +35,15 @@ export async function resolveSchema(contentRoot, entrySchemaRegistry) {
|
|
|
34
35
|
collections: [collection.name],
|
|
35
36
|
});
|
|
36
37
|
}
|
|
37
|
-
const schema =
|
|
38
|
-
return { schema, sources };
|
|
38
|
+
const { schema, issues } = resolveCollectionMetaFiles(metaFiles, entrySchemaRegistry, options.unknownSchema ?? 'throw');
|
|
39
|
+
return { schema, sources, issues };
|
|
39
40
|
}
|
|
40
41
|
/**
|
|
41
42
|
* Check if content root has any .collection.json files.
|
|
42
43
|
*
|
|
43
44
|
* @param contentRoot - Path to the content directory
|
|
44
45
|
* @returns true if at least one .collection.json file exists
|
|
45
|
-
* @internal No importer; deletion candidate in
|
|
46
|
+
* @internal No importer; deletion candidate in safeinsights/canopycms#725.
|
|
46
47
|
*/
|
|
47
48
|
export async function hasSchemaFiles(contentRoot) {
|
|
48
49
|
const metaFiles = await loadCollectionMetaFiles(contentRoot);
|
|
@@ -235,15 +235,12 @@ export declare class SchemaOps {
|
|
|
235
235
|
* why `updateOrderInner` calls `updateCollectionInner` directly instead of
|
|
236
236
|
* the public `updateCollection`.
|
|
237
237
|
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
* branch-metadata.ts's): a call that passes this check can still race a
|
|
245
|
-
* `deleteBranch` `rm` starting moments later — not closed here either,
|
|
246
|
-
* since `deleteBranch` never takes this lock (see the module doc comment).
|
|
238
|
+
* `branchRoot` can be removed by a concurrent `deleteBranch` between the
|
|
239
|
+
* caller resolving its BranchContext and this call's lock acquisition. The
|
|
240
|
+
* stat below fails fast before any lock; past it, neither lock recreates a
|
|
241
|
+
* missing root (each creates only its own directory), so a later removal
|
|
242
|
+
* fails the acquisition, and any failure on a vanished root is reported as
|
|
243
|
+
* `SchemaStoreBusyError` below.
|
|
247
244
|
*
|
|
248
245
|
* Translation happens ONLY at this boundary: inner code always sees the
|
|
249
246
|
* raw {@link OccWriteConflictError} bubble up here untranslated, and a
|
|
@@ -320,7 +317,7 @@ export declare class SchemaOps {
|
|
|
320
317
|
* root can re-normalise to the ROOT collection on a second call, mutating
|
|
321
318
|
* the wrong one instead of reporting not-found. Every entry point calls
|
|
322
319
|
* this exactly once today, so the ambiguity is unreachable; see
|
|
323
|
-
*
|
|
320
|
+
* safeinsights/canopycms#623. A future
|
|
324
321
|
* method that accepts a logical collection path must do the same.
|
|
325
322
|
*/
|
|
326
323
|
private normalizeCollectionPath;
|
|
@@ -165,15 +165,12 @@ export class SchemaOps {
|
|
|
165
165
|
* why `updateOrderInner` calls `updateCollectionInner` directly instead of
|
|
166
166
|
* the public `updateCollection`.
|
|
167
167
|
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
* branch-metadata.ts's): a call that passes this check can still race a
|
|
175
|
-
* `deleteBranch` `rm` starting moments later — not closed here either,
|
|
176
|
-
* since `deleteBranch` never takes this lock (see the module doc comment).
|
|
168
|
+
* `branchRoot` can be removed by a concurrent `deleteBranch` between the
|
|
169
|
+
* caller resolving its BranchContext and this call's lock acquisition. The
|
|
170
|
+
* stat below fails fast before any lock; past it, neither lock recreates a
|
|
171
|
+
* missing root (each creates only its own directory), so a later removal
|
|
172
|
+
* fails the acquisition, and any failure on a vanished root is reported as
|
|
173
|
+
* `SchemaStoreBusyError` below.
|
|
177
174
|
*
|
|
178
175
|
* Translation happens ONLY at this boundary: inner code always sees the
|
|
179
176
|
* raw {@link OccWriteConflictError} bubble up here untranslated, and a
|
|
@@ -219,6 +216,11 @@ export class SchemaOps {
|
|
|
219
216
|
? 'This branch was being synced while the schema change was written, so it may or may not have been recorded. Reload before changing the schema again.'
|
|
220
217
|
: err.message, err.outcome);
|
|
221
218
|
}
|
|
219
|
+
// A delete that removes the branch root mid-operation fails it wherever it is (a lock's
|
|
220
|
+
// mkdir ENOENT, a vanished collection meta); the deletion is the cause, whatever the symptom.
|
|
221
|
+
const rootGone = await fs.stat(this.branchRoot).then(() => false, (statErr) => isNotFoundError(statErr));
|
|
222
|
+
if (rootGone)
|
|
223
|
+
throw new SchemaStoreBusyError('Branch no longer exists');
|
|
222
224
|
throw err;
|
|
223
225
|
}
|
|
224
226
|
}
|
|
@@ -302,7 +304,7 @@ export class SchemaOps {
|
|
|
302
304
|
* root can re-normalise to the ROOT collection on a second call, mutating
|
|
303
305
|
* the wrong one instead of reporting not-found. Every entry point calls
|
|
304
306
|
* this exactly once today, so the ambiguity is unreachable; see
|
|
305
|
-
*
|
|
307
|
+
* safeinsights/canopycms#623. A future
|
|
306
308
|
* method that accepts a logical collection path must do the same.
|
|
307
309
|
*/
|
|
308
310
|
normalizeCollectionPath(collectionPath) {
|
|
@@ -578,7 +580,7 @@ export class SchemaOps {
|
|
|
578
580
|
// already rules out a `{slug}.{id}` directory at the destination — but that check is
|
|
579
581
|
// case-SENSITIVE and lets an ID-less `docs/`-style directory through, so a case or
|
|
580
582
|
// ID-less collision can still slip past it for entries deeper than the index; see
|
|
581
|
-
//
|
|
583
|
+
// safeinsights/canopycms#624.
|
|
582
584
|
if (await findIndexEntryIn(physicalPath)) {
|
|
583
585
|
// Renaming TO "index" collapses this collection onto its OWN new path, not the
|
|
584
586
|
// parent's — see url-collision.ts's findUrlPathClaimant for the equivalent create-time
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EntryTypeUnavailable } from '../config/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown for an entry whose entry type is `unavailable` (see `EntryTypeConfig.unavailable`):
|
|
4
|
+
* nothing may be written against a schema the running code does not have. The API answers it
|
|
5
|
+
* with a retriable 503 (`http/worker-not-ready.ts`), since a deploy usually clears it.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SchemaUnavailableError extends Error {
|
|
8
|
+
readonly entryType: string;
|
|
9
|
+
readonly unavailable: EntryTypeUnavailable;
|
|
10
|
+
constructor(entryType: string, unavailable: EntryTypeUnavailable);
|
|
11
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown for an entry whose entry type is `unavailable` (see `EntryTypeConfig.unavailable`):
|
|
3
|
+
* nothing may be written against a schema the running code does not have. The API answers it
|
|
4
|
+
* with a retriable 503 (`http/worker-not-ready.ts`), since a deploy usually clears it.
|
|
5
|
+
*/
|
|
6
|
+
export class SchemaUnavailableError extends Error {
|
|
7
|
+
constructor(entryType, unavailable) {
|
|
8
|
+
super(`Entry type "${entryType}" uses a content type this editor version doesn't know yet ` +
|
|
9
|
+
`("${unavailable.schemaRef}", named in ${unavailable.metaFile}). It usually appears ` +
|
|
10
|
+
'after the editor finishes updating; reload in a few minutes.');
|
|
11
|
+
this.name = 'SchemaUnavailableError';
|
|
12
|
+
this.entryType = entryType;
|
|
13
|
+
this.unavailable = unavailable;
|
|
14
|
+
}
|
|
15
|
+
}
|
package/dist/schema/types.d.ts
CHANGED
|
@@ -22,4 +22,26 @@ export interface SchemaResolutionResult {
|
|
|
22
22
|
schema: RootCollectionConfig;
|
|
23
23
|
/** Information about schema sources for debugging */
|
|
24
24
|
sources: SchemaSourceInfo[];
|
|
25
|
+
/** What a degraded resolve left out; always empty for a strict one. */
|
|
26
|
+
issues: SchemaIssue[];
|
|
25
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* A part of a branch's schema the running code could not resolve, contained rather than thrown
|
|
30
|
+
* (see `BranchSchemaCache` for where that applies). `unknown-schema` marks one entry type
|
|
31
|
+
* unavailable; `reference-entry-type` leaves a reference field scoped to a type the content does
|
|
32
|
+
* not declare, which offers no options until it does.
|
|
33
|
+
*/
|
|
34
|
+
export type SchemaIssue = {
|
|
35
|
+
kind: 'unknown-schema';
|
|
36
|
+
/** The collection's path relative to the content root; '' for the root collection. */
|
|
37
|
+
collectionPath: string;
|
|
38
|
+
entryType: string;
|
|
39
|
+
schemaRef: string;
|
|
40
|
+
metaFile: string;
|
|
41
|
+
message: string;
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'reference-entry-type';
|
|
44
|
+
message: string;
|
|
45
|
+
};
|
|
46
|
+
/** How resolution treats a `.collection.json` naming an entry schema the registry lacks. */
|
|
47
|
+
export type UnknownSchemaPolicy = 'throw' | 'degrade';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type BuildIdentity } from './build-identity.js';
|
|
2
|
+
import type { CanopyConfig } from './config/index.js';
|
|
3
|
+
import type { EntrySchemaRegistry } from './schema/types.js';
|
|
4
|
+
/** @internal Exported for tests. */
|
|
5
|
+
export declare const SCHEMA_REGISTRY_RECORD = ".schema-registry.json";
|
|
6
|
+
export interface SchemaRegistryRecord {
|
|
7
|
+
version: 1;
|
|
8
|
+
/** The registry's keys, sorted: the names a `.collection.json` entry type may reference. */
|
|
9
|
+
schemas: string[];
|
|
10
|
+
/** `registryFingerprint` of the registry, which the branch schema cache is also stamped with. */
|
|
11
|
+
fingerprint: string;
|
|
12
|
+
/** Content root relative to the repository root, as the editor resolves it. */
|
|
13
|
+
contentRoot: string;
|
|
14
|
+
build: BuildIdentity;
|
|
15
|
+
recordedAt: string;
|
|
16
|
+
}
|
|
17
|
+
/** The record, or undefined when none is recorded or it does not parse. */
|
|
18
|
+
export declare function readSchemaRegistryRecord(contentBranchesRoot: string): Promise<SchemaRegistryRecord | undefined>;
|
|
19
|
+
/**
|
|
20
|
+
* Record `schemas` unless the record already says the same, by temp file and rename. Does not
|
|
21
|
+
* create the branches root: a deployment without one has no worker syncing into it.
|
|
22
|
+
* @internal Exported for tests; `recordServedSchemaRegistry` is the caller.
|
|
23
|
+
*/
|
|
24
|
+
export declare function recordSchemaRegistry(contentBranchesRoot: string, entry: {
|
|
25
|
+
schemas: readonly string[];
|
|
26
|
+
fingerprint: string;
|
|
27
|
+
contentRoot: string;
|
|
28
|
+
build: BuildIdentity;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Record the registry this process serves, once per process start. A process with an empty
|
|
32
|
+
* registry speaks for no editor (a config-only handler resolves no schema at all), so it records
|
|
33
|
+
* nothing rather than make the worker hold every new reference. Best-effort: a failure is logged.
|
|
34
|
+
*/
|
|
35
|
+
export declare function recordServedSchemaRegistry(config: CanopyConfig, registry: EntrySchemaRegistry): Promise<void>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The entry schema registry the serving editor was built with, recorded beside the branch
|
|
3
|
+
* directories for the worker, which has no adopter config. The worker's git sync holds the base
|
|
4
|
+
* branch while incoming content names a schema this record lacks (worker/schema-gate.ts), so a
|
|
5
|
+
* merge that adds a schema and content using it waits for the image carrying the schema.
|
|
6
|
+
*
|
|
7
|
+
* Last write wins. Each API process records once, at its first API request, so with one API
|
|
8
|
+
* deployment per workspace the newest process start names the serving image. An old image
|
|
9
|
+
* starting during a rollout leaves the record behind, and the gate then holds until the next
|
|
10
|
+
* new-image start, the safe direction.
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'node:fs/promises';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { readsFromCheckout } from './build-mode.js';
|
|
15
|
+
import { getBuildIdentity } from './build-identity.js';
|
|
16
|
+
import { operatingStrategy } from './operating-mode/index.js';
|
|
17
|
+
import { registryFingerprint } from './schema/registry-fingerprint.js';
|
|
18
|
+
import { getErrorMessage, isNodeError } from './utils/error.js';
|
|
19
|
+
import { canopyLogWarn } from './utils/logger.js';
|
|
20
|
+
/** @internal Exported for tests. */
|
|
21
|
+
export const SCHEMA_REGISTRY_RECORD = '.schema-registry.json';
|
|
22
|
+
function isStringArray(value) {
|
|
23
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
24
|
+
}
|
|
25
|
+
function isBuildIdentity(value) {
|
|
26
|
+
if (typeof value !== 'object' || value === null)
|
|
27
|
+
return false;
|
|
28
|
+
if (!('canopycmsVersion' in value) || typeof value.canopycmsVersion !== 'string')
|
|
29
|
+
return false;
|
|
30
|
+
return !('sourceRevision' in value) || typeof value.sourceRevision === 'string';
|
|
31
|
+
}
|
|
32
|
+
/** The record, or undefined when none is recorded or it does not parse. */
|
|
33
|
+
export async function readSchemaRegistryRecord(contentBranchesRoot) {
|
|
34
|
+
let raw;
|
|
35
|
+
try {
|
|
36
|
+
raw = await fs.readFile(path.join(contentBranchesRoot, SCHEMA_REGISTRY_RECORD), 'utf8');
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (isNodeError(err) && err.code === 'ENOENT')
|
|
40
|
+
return undefined;
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
let parsed;
|
|
44
|
+
try {
|
|
45
|
+
parsed = JSON.parse(raw);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
51
|
+
return undefined;
|
|
52
|
+
if (!('version' in parsed) || parsed.version !== 1)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (!('schemas' in parsed) || !isStringArray(parsed.schemas))
|
|
55
|
+
return undefined;
|
|
56
|
+
if (!('fingerprint' in parsed) || typeof parsed.fingerprint !== 'string')
|
|
57
|
+
return undefined;
|
|
58
|
+
if (!('contentRoot' in parsed) || typeof parsed.contentRoot !== 'string')
|
|
59
|
+
return undefined;
|
|
60
|
+
if (!('build' in parsed) || !isBuildIdentity(parsed.build))
|
|
61
|
+
return undefined;
|
|
62
|
+
if (!('recordedAt' in parsed) || typeof parsed.recordedAt !== 'string')
|
|
63
|
+
return undefined;
|
|
64
|
+
return {
|
|
65
|
+
version: 1,
|
|
66
|
+
schemas: parsed.schemas,
|
|
67
|
+
fingerprint: parsed.fingerprint,
|
|
68
|
+
contentRoot: parsed.contentRoot,
|
|
69
|
+
build: parsed.build,
|
|
70
|
+
recordedAt: parsed.recordedAt,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function sameRecord(a, b) {
|
|
74
|
+
return (a.fingerprint === b.fingerprint &&
|
|
75
|
+
a.contentRoot === b.contentRoot &&
|
|
76
|
+
a.build.canopycmsVersion === b.build.canopycmsVersion &&
|
|
77
|
+
a.build.sourceRevision === b.build.sourceRevision);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Record `schemas` unless the record already says the same, by temp file and rename. Does not
|
|
81
|
+
* create the branches root: a deployment without one has no worker syncing into it.
|
|
82
|
+
* @internal Exported for tests; `recordServedSchemaRegistry` is the caller.
|
|
83
|
+
*/
|
|
84
|
+
export async function recordSchemaRegistry(contentBranchesRoot, entry) {
|
|
85
|
+
const next = { ...entry, schemas: [...entry.schemas].sort() };
|
|
86
|
+
const current = await readSchemaRegistryRecord(contentBranchesRoot);
|
|
87
|
+
if (current && sameRecord(current, next))
|
|
88
|
+
return;
|
|
89
|
+
const record = {
|
|
90
|
+
version: 1,
|
|
91
|
+
...next,
|
|
92
|
+
recordedAt: new Date().toISOString(),
|
|
93
|
+
};
|
|
94
|
+
const target = path.join(contentBranchesRoot, SCHEMA_REGISTRY_RECORD);
|
|
95
|
+
const temp = `${target}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
96
|
+
try {
|
|
97
|
+
await fs.writeFile(temp, `${JSON.stringify(record)}\n`, 'utf8');
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (isNodeError(err) && err.code === 'ENOENT')
|
|
101
|
+
return;
|
|
102
|
+
throw err;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
await fs.rename(temp, target);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
await fs.unlink(temp).catch(() => { });
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Record the registry this process serves, once per process start. A process with an empty
|
|
114
|
+
* registry speaks for no editor (a config-only handler resolves no schema at all), so it records
|
|
115
|
+
* nothing rather than make the worker hold every new reference. Best-effort: a failure is logged.
|
|
116
|
+
*/
|
|
117
|
+
export async function recordServedSchemaRegistry(config, registry) {
|
|
118
|
+
try {
|
|
119
|
+
if (readsFromCheckout(config))
|
|
120
|
+
return;
|
|
121
|
+
const schemas = Object.keys(registry);
|
|
122
|
+
if (schemas.length === 0)
|
|
123
|
+
return;
|
|
124
|
+
await recordSchemaRegistry(operatingStrategy(config.mode).getContentBranchesRoot(config.sourceRoot), {
|
|
125
|
+
schemas,
|
|
126
|
+
fingerprint: registryFingerprint(registry),
|
|
127
|
+
contentRoot: config.contentRoot || 'content',
|
|
128
|
+
build: getBuildIdentity(),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
canopyLogWarn(`[canopy] Could not record the entry schema registry: ${getErrorMessage(err)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
package/dist/server.d.ts
CHANGED
|
@@ -105,6 +105,12 @@ export type { RoutableEntry, CollectRoutableEntriesOptions } from './static/inde
|
|
|
105
105
|
*/
|
|
106
106
|
export { findDuplicateUrlPaths } from './static/index.js';
|
|
107
107
|
export type { DuplicateUrlPath } from './static/index.js';
|
|
108
|
+
/**
|
|
109
|
+
* Find every reference naming no entry — the check a production build runs and fails on unless
|
|
110
|
+
* `danglingReferences: 'warn'`. Pass an unscoped `listEntries()`.
|
|
111
|
+
*/
|
|
112
|
+
export { findDanglingReferences } from './static/index.js';
|
|
113
|
+
export type { DanglingReference } from './static/index.js';
|
|
108
114
|
/**
|
|
109
115
|
* SEO field extraction and URL shaping, framework-agnostic. `isNoindexEntry` is the single
|
|
110
116
|
* predicate behind both `robots: noindex` and sitemap exclusion.
|
|
@@ -126,32 +132,96 @@ export { createAssetStore } from './assets/factory.js';
|
|
|
126
132
|
/**
|
|
127
133
|
* The five S3/local bucket-prefix strings (`asset-originals/`, `asset-staging/`, `asset-meta/`,
|
|
128
134
|
* `assets/`, `assets/t/`). Exported so server-only consumers outside this package — notably the
|
|
129
|
-
*
|
|
135
|
+
* lazy transform Lambda (`packages/canopycms-cdk/lambda/asset-transform`) — build and parse
|
|
130
136
|
* asset keys through the same constants `S3AssetStore` uses rather than duplicating the strings.
|
|
131
137
|
*/
|
|
132
138
|
export { ASSET_PREFIXES, type AssetPrefixes } from './assets/keys.js';
|
|
133
|
-
/** Asset metadata sidecar shape (`asset-meta/{hash32}.json`), written by the finalize pipeline and read by
|
|
139
|
+
/** Asset metadata sidecar shape (`asset-meta/{hash32}.json`), written by the finalize pipeline and read by `storeTransform`. */
|
|
134
140
|
export type { AssetMeta } from './assets/types.js';
|
|
135
141
|
/**
|
|
136
142
|
* Parse the three path segments after `assets/t/` (`{directives}/{hash32}/{slug}.{ext}`) into a
|
|
137
|
-
* validated `TransformDirectives` set, or a structured parse error
|
|
138
|
-
*
|
|
139
|
-
* URL grammar is defined in exactly one place.
|
|
143
|
+
* validated `TransformDirectives` set, or a structured parse error, so the URL grammar is
|
|
144
|
+
* defined in exactly one place.
|
|
140
145
|
*/
|
|
141
146
|
export { parseTransformPath } from './assets/transform-directives.js';
|
|
142
147
|
export type { ParsedTransformPath, ParseTransformPathResult } from './assets/transform-directives.js';
|
|
143
148
|
/**
|
|
144
149
|
* Canonical string form of a `TransformDirectives` set — the cache key every transform output is
|
|
145
150
|
* stored under (`assets/t/{formatDirectives(...)}/{hash32}/{slug}.{ext}`). Equivalent directive
|
|
146
|
-
* sets (different key order or float formatting) always format to the same string.
|
|
147
|
-
* prod transform Lambda so its writes agree with the dev-mode emulation and `assetUrl()`.
|
|
151
|
+
* sets (different key order or float formatting) always format to the same string.
|
|
148
152
|
*/
|
|
149
153
|
export { formatDirectives } from './assets/transform-directives.js';
|
|
154
|
+
/**
|
|
155
|
+
* Parse `assets/t/` path segments and resolve them to the canonical spelling their output is
|
|
156
|
+
* stored under, with directives re-parsed from that spelling. The lazy transform Lambda 301s a
|
|
157
|
+
* non-canonical request to it; the authenticated raw route serves the canonical bytes.
|
|
158
|
+
*/
|
|
159
|
+
export { canonicalizeTransformPath } from './assets/transform-directives.js';
|
|
160
|
+
export type { CanonicalTransformPathResult, TransformWidthPolicy, } from './assets/transform-directives.js';
|
|
150
161
|
/**
|
|
151
162
|
* Apply a parsed `TransformDirectives` set to source image bytes with sharp:
|
|
152
163
|
* resize/format/quality/crop, EXIF stripped on every re-encode, identity included. Server-only
|
|
153
|
-
* (sharp);
|
|
154
|
-
* Lambda.
|
|
164
|
+
* (sharp); `storeTransform` below wraps it for every caller that stores the output.
|
|
155
165
|
*/
|
|
156
166
|
export { applyTransform } from './assets/transform.js';
|
|
157
167
|
export type { ApplyTransformInput, TransformResult } from './assets/transform.js';
|
|
168
|
+
/**
|
|
169
|
+
* Compute the transform a canonical `assets/t/` path names and store it under that key: meta
|
|
170
|
+
* lookup, raster-only, slug and ext checks, then `applyTransform`. Shared by the authenticated raw
|
|
171
|
+
* route, `materialize-assets` and the lazy transform Lambda. A 404's `error` names hashes and
|
|
172
|
+
* slugs, so a caller answering a browser replaces it.
|
|
173
|
+
*/
|
|
174
|
+
export { storeTransform, type StoreTransformResult } from './assets/materialize.js';
|
|
175
|
+
/** The `Cache-Control` every stored transform output carries: content-addressed, so immutable. */
|
|
176
|
+
export { TRANSFORM_CACHE_CONTROL } from './assets/materialize.js';
|
|
177
|
+
/** The object tag the lazy transform Lambda's outputs carry, which its `assets/t/` expiry filters on. */
|
|
178
|
+
export { LAZY_TRANSFORM_TAG } from './assets/materialize.js';
|
|
179
|
+
/**
|
|
180
|
+
* Make every `assets/t/` key a build references exist in `store` (transforming only the missing
|
|
181
|
+
* ones from the stored originals) and check every referenced svg/pdf key exists. Under an
|
|
182
|
+
* `outputPrefix`, keys are written beneath it, and those production already stores are copied. A
|
|
183
|
+
* release job that bundles its own tool calls this with a store from `createAssetStore` and gates
|
|
184
|
+
* on the returned report; no site config is involved. Needs sharp only when something is missing.
|
|
185
|
+
*/
|
|
186
|
+
export { materializeAssets } from './assets/materialize.js';
|
|
187
|
+
/**
|
|
188
|
+
* The live preview's asset prefix on the server: the signed-in raw route under a `basePath`, the
|
|
189
|
+
* same-origin check every preview prefix passes, and the hook registering the request-scoped getter
|
|
190
|
+
* `assetUrl` reads.
|
|
191
|
+
* @internal `canopycms-next`'s preview page is their consumer.
|
|
192
|
+
*/
|
|
193
|
+
export { authenticatedAssetBase, readAssetBase } from './editor/raw-asset-base.js';
|
|
194
|
+
/** @internal */
|
|
195
|
+
export { setServerPreviewAssetBaseGetter } from './editor/preview-asset-base.js';
|
|
196
|
+
/** The asset store `createAssetStore` returns and `materializeAssets` takes. */
|
|
197
|
+
export type { AssetStore } from './assets/types.js';
|
|
198
|
+
/** What a create-only store write did: `created`, or `already-exists` (the stored object was kept). */
|
|
199
|
+
export type { CreateOnlyResult } from './assets/types.js';
|
|
200
|
+
/** Thrown by `materializeAssets` when sharp cannot load and keys are missing, so none can be produced. */
|
|
201
|
+
export { SharpUnavailableError } from './assets/materialize.js';
|
|
202
|
+
/**
|
|
203
|
+
* Thrown by `materializeAssets` before any store request when `outputPrefix` is not a relative,
|
|
204
|
+
* `/`-terminated run of `[A-Za-z0-9._-]` segments outside every canopy prefix.
|
|
205
|
+
*/
|
|
206
|
+
export { InvalidOutputPrefixError } from './assets/materialize.js';
|
|
207
|
+
/** The `schemaVersion` carried by every `MaterializeReport`. */
|
|
208
|
+
export { MATERIALIZE_REPORT_SCHEMA_VERSION } from './assets/materialize.js';
|
|
209
|
+
/** Options for `materializeAssets`: the store, the referenced keys, an output prefix, and concurrency/retry limits. */
|
|
210
|
+
export type { MaterializeOptions } from './assets/materialize.js';
|
|
211
|
+
/** What `materializeAssets` returns: a versioned summary and one result per key, sorted by key. */
|
|
212
|
+
export type { MaterializeReport } from './assets/materialize.js';
|
|
213
|
+
/** One key's outcome in a `MaterializeReport`: `existed`, `created`, `copied` or `failed` (`content` or `store`). */
|
|
214
|
+
export type { MaterializeResult } from './assets/materialize.js';
|
|
215
|
+
/** One key a build references, with the pages and output files that reference it. */
|
|
216
|
+
export type { MaterializeTarget } from './assets/materialize.js';
|
|
217
|
+
/**
|
|
218
|
+
* Scan a static build's output for `/assets/…` URLs and write `canopy-asset-refs.json` into it.
|
|
219
|
+
* Throws `AssetRefsError` for a URL no stored object can answer (non-canonical or malformed).
|
|
220
|
+
*/
|
|
221
|
+
export { collectAssetRefs, type CollectAssetRefsResult } from './build/asset-refs.js';
|
|
222
|
+
/** Read and validate a `canopy-asset-refs.json`; throws when it is unreadable or malformed. */
|
|
223
|
+
export { readAssetRefsFile } from './build/asset-refs.js';
|
|
224
|
+
/** Thrown by `collectAssetRefs`; `problems` lists each offending file and URL. */
|
|
225
|
+
export { AssetRefsError } from './build/asset-refs.js';
|
|
226
|
+
/** The shape of `canopy-asset-refs.json`: the transform and static keys a build references. */
|
|
227
|
+
export type { AssetRefsFile } from './build/asset-refs.js';
|