canopycms 0.0.67-int.90 → 0.0.67
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/README.md +30 -3
- package/dist/ai/generate.js +1 -27
- package/dist/ai/handler.d.ts +0 -4
- package/dist/ai/handler.js +0 -11
- package/dist/ai/index.d.ts +1 -8
- package/dist/ai/index.js +1 -8
- package/dist/ai/json-to-markdown.js +15 -58
- package/dist/ai/resolve-branch.d.ts +2 -7
- package/dist/ai/resolve-branch.js +2 -8
- package/dist/ai/strip-mdx.d.ts +5 -13
- package/dist/ai/strip-mdx.js +5 -17
- package/dist/ai/to-plain-text.d.ts +10 -28
- package/dist/ai/to-plain-text.js +10 -28
- package/dist/ai/transform-components.d.ts +2 -4
- package/dist/ai/transform-components.js +8 -19
- package/dist/ai/types.d.ts +5 -10
- package/dist/api/admin-branch-health.d.ts +4 -12
- package/dist/api/admin-branch-health.js +26 -66
- package/dist/api/admin.d.ts +4 -12
- package/dist/api/admin.js +10 -26
- package/dist/api/assets.d.ts +0 -25
- package/dist/api/assets.js +50 -91
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +0 -2
- package/dist/api/branch-review.d.ts +0 -8
- package/dist/api/branch-review.js +0 -13
- package/dist/api/branch-status.d.ts +0 -3
- package/dist/api/branch-status.js +8 -33
- package/dist/api/branch-withdraw.d.ts +0 -1
- package/dist/api/branch-withdraw.js +6 -9
- package/dist/api/branch.d.ts +7 -12
- package/dist/api/branch.js +7 -44
- package/dist/api/client.d.ts +71 -224
- package/dist/api/client.js +82 -233
- package/dist/api/comments.d.ts +2 -4
- package/dist/api/comments.js +0 -17
- package/dist/api/content.d.ts +0 -6
- package/dist/api/content.js +66 -142
- package/dist/api/entries-constants.d.ts +5 -9
- package/dist/api/entries-constants.js +5 -9
- package/dist/api/entries.d.ts +8 -13
- package/dist/api/entries.js +20 -51
- package/dist/api/github-sync.d.ts +2 -4
- package/dist/api/github-sync.js +4 -8
- package/dist/api/groups.d.ts +3 -0
- package/dist/api/groups.js +8 -21
- package/dist/api/guards.d.ts +4 -16
- package/dist/api/guards.js +3 -22
- package/dist/api/index.d.ts +4 -4
- package/dist/api/permissions.d.ts +2 -0
- package/dist/api/permissions.js +18 -40
- package/dist/api/reference-options.d.ts +0 -1
- package/dist/api/reference-options.js +3 -11
- package/dist/api/request-body-hash.d.ts +12 -23
- package/dist/api/request-body-hash.js +12 -23
- package/dist/api/resolve-references.d.ts +0 -1
- package/dist/api/resolve-references.js +13 -28
- package/dist/api/route-builder.d.ts +3 -7
- package/dist/api/route-builder.js +1 -1
- package/dist/api/routes.d.ts +12 -0
- package/dist/api/routes.js +47 -0
- package/dist/api/schema.d.ts +23 -33
- package/dist/api/schema.js +20 -74
- package/dist/api/settings-helpers.js +4 -5
- package/dist/api/types.d.ts +0 -5
- package/dist/api/user.js +0 -5
- package/dist/api/validators.d.ts +14 -52
- package/dist/api/validators.js +14 -52
- package/dist/assets/asset-prefixes.d.ts +4 -8
- package/dist/assets/asset-prefixes.js +4 -8
- package/dist/assets/asset-src.d.ts +5 -22
- package/dist/assets/asset-src.js +5 -21
- package/dist/assets/factory.d.ts +1 -2
- package/dist/assets/factory.js +1 -2
- package/dist/assets/finalize.d.ts +3 -1
- package/dist/assets/finalize.js +3 -1
- package/dist/assets/index.d.ts +3 -3
- package/dist/assets/index.js +1 -1
- package/dist/assets/keys.d.ts +5 -3
- package/dist/assets/keys.js +6 -3
- package/dist/assets/pipeline.d.ts +3 -2
- package/dist/assets/pipeline.js +22 -56
- package/dist/assets/sharp-loader.d.ts +2 -10
- package/dist/assets/sharp-loader.js +2 -10
- package/dist/assets/store-local.d.ts +1 -2
- package/dist/assets/store-local.js +1 -2
- package/dist/assets/store-s3.d.ts +3 -4
- package/dist/assets/svg-sanitizer.d.ts +6 -14
- package/dist/assets/svg-sanitizer.js +6 -14
- package/dist/assets/transform-directives.d.ts +3 -4
- package/dist/assets/transform-directives.js +1 -1
- package/dist/assets/transform.d.ts +19 -30
- package/dist/assets/transform.js +18 -31
- package/dist/auth/cache.d.ts +2 -3
- package/dist/auth/cache.js +2 -3
- package/dist/auth/caching-auth-plugin.d.ts +11 -22
- package/dist/auth/caching-auth-plugin.js +12 -14
- package/dist/auth/context-helpers.d.ts +6 -20
- package/dist/auth/context-helpers.js +5 -17
- package/dist/auth/file-based-auth-cache.d.ts +10 -21
- package/dist/auth/file-based-auth-cache.js +23 -51
- package/dist/auth/plugin.d.ts +29 -61
- package/dist/auth/plugin.js +9 -13
- package/dist/auth/types.d.ts +11 -20
- package/dist/authorization/branch.d.ts +30 -49
- package/dist/authorization/branch.js +16 -42
- package/dist/authorization/content.d.ts +11 -40
- package/dist/authorization/content.js +13 -45
- package/dist/authorization/groups/index.d.ts +0 -3
- package/dist/authorization/groups/index.js +0 -3
- package/dist/authorization/groups/loader.d.ts +14 -28
- package/dist/authorization/groups/loader.js +14 -38
- package/dist/authorization/groups/schema.d.ts +0 -6
- package/dist/authorization/groups/schema.js +4 -7
- package/dist/authorization/helpers.d.ts +9 -28
- package/dist/authorization/helpers.js +9 -28
- package/dist/authorization/index.d.ts +3 -25
- package/dist/authorization/index.js +3 -35
- package/dist/authorization/path.d.ts +6 -13
- package/dist/authorization/path.js +8 -25
- package/dist/authorization/permissions/index.d.ts +0 -3
- package/dist/authorization/permissions/index.js +0 -3
- package/dist/authorization/permissions/loader.d.ts +14 -27
- package/dist/authorization/permissions/loader.js +14 -32
- package/dist/authorization/permissions/schema.d.ts +1 -6
- package/dist/authorization/permissions/schema.js +6 -13
- package/dist/authorization/protected-branch.d.ts +36 -65
- package/dist/authorization/protected-branch.js +29 -41
- package/dist/authorization/settings-file-store.d.ts +38 -81
- package/dist/authorization/settings-file-store.js +38 -79
- package/dist/authorization/types.d.ts +4 -26
- package/dist/authorization/types.js +0 -6
- package/dist/authorization/validation.d.ts +1 -23
- package/dist/authorization/validation.js +1 -24
- package/dist/branch-health.d.ts +39 -67
- package/dist/branch-health.js +27 -43
- package/dist/branch-metadata-file.d.ts +16 -32
- package/dist/branch-metadata-file.js +13 -26
- package/dist/branch-metadata.d.ts +49 -80
- package/dist/branch-metadata.js +57 -87
- package/dist/branch-registry.d.ts +26 -64
- package/dist/branch-registry.js +44 -93
- package/dist/branch-schema-cache.d.ts +34 -124
- package/dist/branch-schema-cache.js +49 -155
- package/dist/branch-workspace.d.ts +4 -4
- package/dist/branch-workspace.js +15 -19
- package/dist/build/generate-ai-content.d.ts +1 -0
- package/dist/build/generate-ai-content.js +12 -25
- package/dist/build-canopy.d.ts +17 -27
- package/dist/build-canopy.js +16 -23
- package/dist/build-mode.d.ts +25 -27
- package/dist/build-mode.js +25 -29
- package/dist/cli/cli.d.ts +15 -26
- package/dist/cli/cli.js +601 -978
- package/dist/cli/generate-ai-content.js +351 -628
- package/dist/cli/github-app-manifest.d.ts +84 -0
- package/dist/cli/github-app-manifest.js +161 -0
- package/dist/cli/init-github-app.d.ts +110 -444
- package/dist/cli/init-github-app.js +236 -773
- package/dist/cli/init.js +39 -80
- package/dist/cli/migrate.d.ts +13 -10
- package/dist/cli/migrate.js +22 -30
- package/dist/cli/project-detect.d.ts +17 -31
- package/dist/cli/project-detect.js +31 -42
- package/dist/cli/project-root.d.ts +4 -11
- package/dist/cli/project-root.js +4 -11
- package/dist/cli/prompt.d.ts +10 -0
- package/dist/cli/prompt.js +67 -0
- package/dist/cli/sync.d.ts +0 -8
- package/dist/cli/sync.js +8 -28
- package/dist/cli/template-files/middleware.ts.template +15 -29
- package/dist/cli/templates.d.ts +2 -12
- package/dist/cli/templates.js +4 -4
- package/dist/client.d.ts +1 -1
- package/dist/comment-store.d.ts +32 -53
- package/dist/comment-store.js +32 -52
- package/dist/config/flatten.d.ts +0 -3
- package/dist/config/flatten.js +2 -12
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +1 -4
- package/dist/config/schemas/collection.d.ts +0 -8
- package/dist/config/schemas/collection.js +0 -10
- package/dist/config/schemas/config.d.ts +6 -78
- package/dist/config/schemas/config.js +38 -54
- package/dist/config/schemas/field.d.ts +2 -242
- package/dist/config/schemas/field.js +9 -20
- package/dist/config/schemas/media.js +1 -1
- package/dist/config/schemas/permissions.js +0 -2
- package/dist/config/schemas/url.d.ts +5 -6
- package/dist/config/schemas/url.js +5 -6
- package/dist/config/types.d.ts +45 -33
- package/dist/config/types.js +0 -1
- package/dist/config.d.ts +1 -8
- package/dist/config.js +1 -9
- package/dist/content-id-index.d.ts +76 -188
- package/dist/content-id-index.js +79 -230
- package/dist/content-index-generation.d.ts +27 -48
- package/dist/content-index-generation.js +35 -84
- package/dist/content-index-registry.d.ts +15 -24
- package/dist/content-index-registry.js +5 -9
- package/dist/content-listing.d.ts +64 -107
- package/dist/content-listing.js +68 -118
- package/dist/content-reader.d.ts +20 -29
- package/dist/content-reader.js +10 -18
- package/dist/content-store.d.ts +210 -336
- package/dist/content-store.js +413 -657
- package/dist/content-tree.d.ts +44 -86
- package/dist/content-tree.js +26 -54
- package/dist/context.d.ts +67 -94
- package/dist/context.js +53 -72
- package/dist/dev-content-watcher.d.ts +18 -18
- package/dist/dev-content-watcher.js +41 -44
- package/dist/editor/BranchManager.d.ts +3 -6
- package/dist/editor/BranchManager.js +24 -44
- package/dist/editor/CanopyEditor.js +5 -2
- package/dist/editor/CommentsPanel.js +0 -2
- package/dist/editor/Editor.js +19 -76
- package/dist/editor/EditorAuthGate.d.ts +27 -0
- package/dist/editor/EditorAuthGate.js +140 -0
- package/dist/editor/EntryNavigator.js +0 -20
- package/dist/editor/FormRenderer.d.ts +1 -2
- package/dist/editor/FormRenderer.js +8 -23
- package/dist/editor/admin/SystemHealthPanel.js +20 -37
- package/dist/editor/admin/useSystemHealth.d.ts +2 -3
- package/dist/editor/admin/useSystemHealth.js +10 -12
- package/dist/editor/client-reference-resolver.d.ts +2 -5
- package/dist/editor/client-reference-resolver.js +2 -19
- package/dist/editor/comments/BranchComments.js +0 -4
- package/dist/editor/comments/EntryComments.js +0 -4
- package/dist/editor/comments/FieldWrapper.js +0 -4
- package/dist/editor/comments/InlineCommentThread.js +0 -2
- package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
- package/dist/editor/comments/ThreadCarousel.js +0 -12
- package/dist/editor/components/EditorFooter.d.ts +0 -8
- package/dist/editor/components/EditorFooter.js +0 -5
- package/dist/editor/components/EditorHeader.d.ts +0 -31
- package/dist/editor/components/EditorHeader.js +21 -71
- package/dist/editor/components/EditorSidebar.d.ts +0 -19
- package/dist/editor/components/EditorSidebar.js +0 -16
- package/dist/editor/components/EntryCreateModal.d.ts +4 -4
- package/dist/editor/components/EntryCreateModal.js +7 -22
- package/dist/editor/components/RenameEntryModal.js +0 -4
- package/dist/editor/components/UserBadge.js +0 -10
- package/dist/editor/components/index.js +0 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -7
- package/dist/editor/context/ApiClientContext.js +39 -11
- package/dist/editor/context/AssetContext.d.ts +7 -17
- package/dist/editor/context/AssetContext.js +7 -17
- package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
- package/dist/editor/context/EditorIdentityContext.js +7 -0
- package/dist/editor/context/EditorStateContext.d.ts +10 -41
- package/dist/editor/context/EditorStateContext.js +7 -23
- package/dist/editor/context/SWRProvider.d.ts +3 -6
- package/dist/editor/context/index.d.ts +1 -20
- package/dist/editor/context/index.js +1 -20
- package/dist/editor/editor-utils.d.ts +8 -47
- package/dist/editor/editor-utils.js +19 -72
- package/dist/editor/fields/BlockField.d.ts +2 -2
- package/dist/editor/fields/BlockField.js +1 -2
- package/dist/editor/fields/CodeField.d.ts +0 -1
- package/dist/editor/fields/CodeField.js +0 -1
- package/dist/editor/fields/DateTimeField.d.ts +15 -22
- package/dist/editor/fields/DateTimeField.js +17 -26
- package/dist/editor/fields/ImageField.d.ts +2 -2
- package/dist/editor/fields/ImageField.js +8 -14
- package/dist/editor/fields/InlineGroupField.d.ts +0 -1
- package/dist/editor/fields/InlineGroupField.js +0 -1
- package/dist/editor/fields/MarkdownField.d.ts +0 -1
- package/dist/editor/fields/MarkdownField.js +6 -11
- package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
- package/dist/editor/fields/MdxImageDialog.js +0 -1
- package/dist/editor/fields/NumberField.d.ts +9 -19
- package/dist/editor/fields/NumberField.js +11 -22
- package/dist/editor/fields/NumberListField.d.ts +7 -10
- package/dist/editor/fields/NumberListField.js +7 -10
- package/dist/editor/fields/ObjectField.d.ts +5 -8
- package/dist/editor/fields/ObjectField.js +0 -1
- package/dist/editor/fields/ReferenceField.d.ts +1 -1
- package/dist/editor/fields/ReferenceField.js +11 -16
- package/dist/editor/fields/SelectField.d.ts +2 -2
- package/dist/editor/fields/SelectField.js +0 -1
- package/dist/editor/fields/StringListField.d.ts +0 -4
- package/dist/editor/fields/StringListField.js +4 -9
- package/dist/editor/fields/TextField.d.ts +0 -1
- package/dist/editor/fields/TextField.js +0 -1
- package/dist/editor/fields/ToggleField.d.ts +0 -1
- package/dist/editor/fields/ToggleField.js +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts +0 -3
- package/dist/editor/group-manager/GroupForm.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
- package/dist/editor/group-manager/MemberList.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
- package/dist/editor/group-manager/index.d.ts +0 -6
- package/dist/editor/group-manager/index.js +0 -10
- package/dist/editor/group-manager/types.d.ts +2 -5
- package/dist/editor/group-manager/types.js +0 -3
- package/dist/editor/hooks/index.d.ts +6 -11
- package/dist/editor/hooks/index.js +6 -12
- package/dist/editor/hooks/useBranchActions.d.ts +0 -14
- package/dist/editor/hooks/useBranchActions.js +0 -22
- package/dist/editor/hooks/useBranchManager.d.ts +2 -48
- package/dist/editor/hooks/useBranchManager.js +4 -64
- package/dist/editor/hooks/useBranchesData.d.ts +7 -6
- package/dist/editor/hooks/useBranchesData.js +7 -6
- package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
- package/dist/editor/hooks/useCommentSystem.js +1 -36
- package/dist/editor/hooks/useDraftManager.d.ts +2 -35
- package/dist/editor/hooks/useDraftManager.js +23 -64
- package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
- package/dist/editor/hooks/useEditorLayout.js +0 -23
- package/dist/editor/hooks/useEntriesData.d.ts +1 -0
- package/dist/editor/hooks/useEntriesData.js +2 -3
- package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
- package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
- package/dist/editor/hooks/useEntryManager.d.ts +2 -27
- package/dist/editor/hooks/useEntryManager.js +29 -78
- package/dist/editor/hooks/useGroupManager.d.ts +0 -21
- package/dist/editor/hooks/useGroupManager.js +0 -21
- package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
- package/dist/editor/hooks/usePermissionManager.js +0 -20
- package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
- package/dist/editor/hooks/useReferenceResolution.js +1 -48
- package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
- package/dist/editor/hooks/useSchemaManager.js +0 -19
- package/dist/editor/hooks/useUserContext.d.ts +2 -9
- package/dist/editor/hooks/useUserContext.js +10 -10
- package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
- package/dist/editor/hooks/useUserMetadata.js +0 -3
- package/dist/editor/media/AssetCard.d.ts +0 -1
- package/dist/editor/media/AssetCard.js +1 -2
- package/dist/editor/media/CropStep.d.ts +0 -1
- package/dist/editor/media/CropStep.js +0 -1
- package/dist/editor/media/MediaLibrary.d.ts +1 -2
- package/dist/editor/media/MediaLibrary.js +1 -2
- package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
- package/dist/editor/media/MediaLibraryBody.js +0 -1
- package/dist/editor/media/crop-math.d.ts +1 -1
- package/dist/editor/media/crop-math.js +1 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
- package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
- package/dist/editor/permission-manager/PermissionEditor.js +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
- package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
- package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
- package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
- package/dist/editor/permission-manager/constants.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
- package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
- package/dist/editor/permission-manager/index.d.ts +0 -7
- package/dist/editor/permission-manager/index.js +0 -16
- package/dist/editor/permission-manager/types.d.ts +2 -12
- package/dist/editor/permission-manager/types.js +0 -3
- package/dist/editor/permission-manager/utils.d.ts +0 -28
- package/dist/editor/permission-manager/utils.js +9 -23
- package/dist/editor/preview-bridge.d.ts +5 -1
- package/dist/editor/preview-bridge.js +4 -4
- package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
- package/dist/editor/schema-editor/CollectionEditor.js +9 -31
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
- package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
- package/dist/editor/schema-editor/index.d.ts +0 -7
- package/dist/editor/schema-editor/index.js +0 -7
- package/dist/editor/utils/env.d.ts +3 -18
- package/dist/editor/utils/env.js +6 -25
- package/dist/entry-link-resolver.d.ts +13 -35
- package/dist/entry-link-resolver.js +20 -53
- package/dist/entry-schema-registry.d.ts +20 -60
- package/dist/entry-schema-registry.js +20 -69
- package/dist/entry-schema.d.ts +118 -223
- package/dist/entry-schema.js +46 -91
- package/dist/git-manager.d.ts +101 -200
- package/dist/git-manager.js +211 -384
- package/dist/github-service.d.ts +34 -75
- package/dist/github-service.js +37 -91
- package/dist/http/handler.d.ts +6 -37
- package/dist/http/handler.js +65 -120
- package/dist/http/router.d.ts +15 -32
- package/dist/http/router.js +34 -99
- package/dist/http/types.d.ts +15 -40
- package/dist/http/types.js +3 -7
- package/dist/id.d.ts +4 -10
- package/dist/id.js +4 -10
- package/dist/index.js +6 -9
- package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
- package/dist/operating-mode/client-safe-strategy.js +8 -28
- package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
- package/dist/operating-mode/client-unsafe-strategy.js +9 -34
- package/dist/operating-mode/client.d.ts +3 -10
- package/dist/operating-mode/client.js +3 -8
- package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
- package/dist/operating-mode/deployment-name-fixtures.js +14 -18
- package/dist/operating-mode/deployment-name.d.ts +19 -29
- package/dist/operating-mode/deployment-name.js +29 -47
- package/dist/operating-mode/index.d.ts +4 -25
- package/dist/operating-mode/index.js +9 -31
- package/dist/operating-mode/mode-env.d.ts +32 -54
- package/dist/operating-mode/mode-env.js +36 -58
- package/dist/operating-mode/types.d.ts +24 -72
- package/dist/operating-mode/types.js +1 -7
- package/dist/paths/branch-name.d.ts +30 -40
- package/dist/paths/branch-name.js +30 -40
- package/dist/paths/branch.d.ts +4 -18
- package/dist/paths/branch.js +6 -22
- package/dist/paths/index.d.ts +2 -13
- package/dist/paths/index.js +3 -23
- package/dist/paths/normalize-server.d.ts +3 -15
- package/dist/paths/normalize-server.js +3 -15
- package/dist/paths/normalize.d.ts +13 -33
- package/dist/paths/normalize.js +13 -33
- package/dist/paths/resolve.d.ts +4 -17
- package/dist/paths/resolve.js +4 -22
- package/dist/paths/types.d.ts +12 -34
- package/dist/paths/types.js +5 -7
- package/dist/paths/validation.d.ts +22 -119
- package/dist/paths/validation.js +30 -148
- package/dist/reference-resolver.d.ts +0 -13
- package/dist/reference-resolver.js +0 -18
- package/dist/resolve-canopy-user.d.ts +16 -18
- package/dist/resolve-canopy-user.js +17 -26
- package/dist/resource-generation.d.ts +16 -25
- package/dist/resource-generation.js +34 -97
- package/dist/schema/meta-loader.d.ts +2 -14
- package/dist/schema/meta-loader.js +15 -64
- package/dist/schema/resolver.d.ts +1 -4
- package/dist/schema/resolver.js +1 -6
- package/dist/schema/schema-store-types.d.ts +0 -12
- package/dist/schema/schema-store.d.ts +61 -138
- package/dist/schema/schema-store.js +85 -282
- package/dist/schema/types.d.ts +0 -4
- package/dist/server.d.ts +62 -93
- package/dist/server.js +63 -94
- package/dist/services.d.ts +23 -47
- package/dist/services.js +55 -98
- package/dist/settings-workspace.d.ts +17 -30
- package/dist/settings-workspace.js +51 -81
- package/dist/static/index.d.ts +26 -52
- package/dist/static/index.js +33 -67
- package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
- package/dist/task-queue/cms-task-queue.js +13 -0
- package/dist/task-queue/task-queue-config.d.ts +3 -0
- package/dist/{worker → task-queue}/task-queue-config.js +1 -6
- package/dist/task-queue/task-queue.d.ts +16 -22
- package/dist/task-queue/task-queue.js +20 -44
- package/dist/task-queue/types.d.ts +0 -1
- package/dist/task-queue/worker-status.d.ts +35 -0
- package/dist/task-queue/worker-status.js +40 -0
- package/dist/types.d.ts +40 -51
- package/dist/url-collision.d.ts +26 -40
- package/dist/url-collision.js +47 -63
- package/dist/url-exclusivity-fixtures.d.ts +15 -20
- package/dist/url-exclusivity-fixtures.js +14 -19
- package/dist/url-path-resolver.d.ts +8 -16
- package/dist/url-path-resolver.js +19 -29
- package/dist/user.d.ts +8 -21
- package/dist/user.js +10 -19
- package/dist/utils/async-mutex.js +4 -6
- package/dist/utils/atomic-write.d.ts +2 -11
- package/dist/utils/atomic-write.js +2 -11
- package/dist/utils/body-field.d.ts +8 -15
- package/dist/utils/body-field.js +8 -15
- package/dist/utils/content-serialize.d.ts +18 -24
- package/dist/utils/content-serialize.js +109 -160
- package/dist/utils/content-write-lock.d.ts +51 -106
- package/dist/utils/content-write-lock.js +66 -111
- package/dist/utils/debug.d.ts +7 -23
- package/dist/utils/debug.js +7 -23
- package/dist/utils/entry-url.d.ts +11 -23
- package/dist/utils/entry-url.js +11 -26
- package/dist/utils/error.d.ts +25 -90
- package/dist/utils/error.js +60 -147
- package/dist/utils/flatten-group-fields.d.ts +5 -7
- package/dist/utils/flatten-group-fields.js +5 -7
- package/dist/utils/format.d.ts +1 -5
- package/dist/utils/format.js +1 -5
- package/dist/utils/fs.d.ts +3 -4
- package/dist/utils/fs.js +3 -4
- package/dist/utils/git.d.ts +52 -83
- package/dist/utils/git.js +79 -125
- package/dist/utils/logger.d.ts +35 -50
- package/dist/utils/logger.js +35 -52
- package/dist/utils/provisioning-lock.d.ts +23 -35
- package/dist/utils/provisioning-lock.js +49 -69
- package/dist/utils/sanitize-href.d.ts +5 -10
- package/dist/utils/sanitize-href.js +8 -18
- package/dist/utils/title-field.d.ts +17 -20
- package/dist/utils/title-field.js +18 -27
- package/dist/utils/typed-filename.d.ts +20 -48
- package/dist/utils/typed-filename.js +25 -61
- package/dist/utils/url-prefix.d.ts +3 -3
- package/dist/utils/url-prefix.js +3 -3
- package/dist/validation/block-structural-keys.d.ts +16 -31
- package/dist/validation/block-structural-keys.js +19 -29
- package/dist/validation/deletion-checker.d.ts +0 -34
- package/dist/validation/deletion-checker.js +1 -43
- package/dist/validation/entry-link-validator.d.ts +6 -13
- package/dist/validation/entry-link-validator.js +4 -13
- package/dist/validation/entry-type-reference-validator.d.ts +13 -18
- package/dist/validation/entry-type-reference-validator.js +13 -18
- package/dist/validation/entry-validator.d.ts +13 -25
- package/dist/validation/entry-validator.js +15 -32
- package/dist/validation/field-traversal.d.ts +3 -30
- package/dist/validation/field-traversal.js +1 -32
- package/dist/validation/reference-validator.d.ts +5 -24
- package/dist/validation/reference-validator.js +5 -30
- package/dist/worker/cms-worker.d.ts +172 -232
- package/dist/worker/cms-worker.js +241 -333
- package/dist/worker/git-sync.d.ts +32 -133
- package/dist/worker/git-sync.js +129 -191
- package/dist/worker/github-auth.d.ts +13 -19
- package/dist/worker/github-auth.js +13 -19
- package/dist/worker/history-rewrite.d.ts +53 -66
- package/dist/worker/history-rewrite.js +54 -60
- package/dist/worker/log.d.ts +24 -41
- package/dist/worker/log.js +25 -42
- package/dist/worker/rebase.d.ts +20 -110
- package/dist/worker/rebase.js +279 -354
- package/dist/worker/task-runner.d.ts +32 -66
- package/dist/worker/task-runner.js +126 -162
- package/dist/worker/worker-context.d.ts +41 -81
- package/package.json +4 -4
- package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
- package/dist/worker/task-queue-config.d.ts +0 -8
- package/dist/worker/task-queue.js +0 -19
- package/dist/worker/worker-status.d.ts +0 -47
- package/dist/worker/worker-status.js +0 -52
|
@@ -7,16 +7,6 @@
|
|
|
7
7
|
* of server-only imports (node:fs, ContentStore, ContentIdIndex, ...) — it may
|
|
8
8
|
* only depend on config types and other pure modules.
|
|
9
9
|
*
|
|
10
|
-
* What it checks (pure rules — no filesystem access):
|
|
11
|
-
* - required fields are present and non-empty
|
|
12
|
-
* - values match their field type (string/number/boolean/datetime/select/...)
|
|
13
|
-
* - `list` fields hold arrays; non-list fields hold single values
|
|
14
|
-
* - select values are one of the configured options
|
|
15
|
-
* - reference values are well-formed (id string or resolved `{ id }` object)
|
|
16
|
-
* and non-empty when required
|
|
17
|
-
* - block items resolve to a known template (via the shared `resolveBlockItem`
|
|
18
|
-
* from field-traversal, so `{ template, value }`-nested fields are validated)
|
|
19
|
-
*
|
|
20
10
|
* Reference EXISTENCE is intentionally NOT checked here: it requires the
|
|
21
11
|
* content ID index (filesystem) and is enforced server-side only, by running
|
|
22
12
|
* `ReferenceValidator` at the write boundary.
|
|
@@ -36,6 +26,7 @@ export interface EntryFieldError {
|
|
|
36
26
|
* as an id string or as a resolved object `{ id, slug, collection, ... }`
|
|
37
27
|
* (content reads resolve references by default). Returns undefined for any
|
|
38
28
|
* other shape.
|
|
29
|
+
* @internal Exported for tests.
|
|
39
30
|
*/
|
|
40
31
|
export declare function referenceValueId(value: unknown): string | undefined;
|
|
41
32
|
/**
|
|
@@ -58,24 +49,21 @@ export declare function validateEntryData(fields: EntrySchema, data: Record<stri
|
|
|
58
49
|
export declare function validateEntryFormValue(fields: EntrySchema, format: ContentFormat | undefined, value: Record<string, unknown>): EntryFieldError[];
|
|
59
50
|
/**
|
|
60
51
|
* Find data keys that have no counterpart in the schema, as canonical field paths
|
|
61
|
-
* (`author.nickname`, `blocks[2].headline`).
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* posts it back. The only symptom is a component quietly receiving `undefined`.
|
|
52
|
+
* (`author.nickname`, `blocks[2].headline`). `validateEntryData` iterates the SCHEMA
|
|
53
|
+
* so it can't report the inverse: rename or reshape a field and the old key persists
|
|
54
|
+
* on disk forever, since the editor's form state is the whole record verbatim and
|
|
55
|
+
* every save posts it back — the only symptom is a component quietly receiving
|
|
56
|
+
* `undefined`.
|
|
67
57
|
*
|
|
68
|
-
* Pure — safe in the browser. Reports rather than rejects
|
|
69
|
-
*
|
|
58
|
+
* Pure — safe in the browser. Reports rather than rejects (a stale key doesn't fail
|
|
59
|
+
* a save, and the write path now preserves it and its comments), so this feeds the
|
|
70
60
|
* non-blocking `validationWarnings` channel, not the 422 path.
|
|
71
61
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* field's value is `{ ...target data, id, slug, collection, urlPath }`. The traversal only
|
|
78
|
-
* descends into `object` and `block`, so it never looks inside one.
|
|
62
|
+
* Deliberately not reported: a container with no fields at all (`api/content.ts`
|
|
63
|
+
* falls back to `[]` for a collection with no configured entry type — "no schema"
|
|
64
|
+
* isn't "every key is unknown"), and anything inside a `reference` value (a resolved
|
|
65
|
+
* reference's value is `{ ...target data, id, slug, collection, urlPath }`; the
|
|
66
|
+
* traversal only descends into `object` and `block`, so it never looks inside one).
|
|
79
67
|
*/
|
|
80
68
|
export declare function findUnknownKeys(fields: EntrySchema, data: Record<string, unknown>): string[];
|
|
81
69
|
/**
|
|
@@ -7,16 +7,6 @@
|
|
|
7
7
|
* of server-only imports (node:fs, ContentStore, ContentIdIndex, ...) — it may
|
|
8
8
|
* only depend on config types and other pure modules.
|
|
9
9
|
*
|
|
10
|
-
* What it checks (pure rules — no filesystem access):
|
|
11
|
-
* - required fields are present and non-empty
|
|
12
|
-
* - values match their field type (string/number/boolean/datetime/select/...)
|
|
13
|
-
* - `list` fields hold arrays; non-list fields hold single values
|
|
14
|
-
* - select values are one of the configured options
|
|
15
|
-
* - reference values are well-formed (id string or resolved `{ id }` object)
|
|
16
|
-
* and non-empty when required
|
|
17
|
-
* - block items resolve to a known template (via the shared `resolveBlockItem`
|
|
18
|
-
* from field-traversal, so `{ template, value }`-nested fields are validated)
|
|
19
|
-
*
|
|
20
10
|
* Reference EXISTENCE is intentionally NOT checked here: it requires the
|
|
21
11
|
* content ID index (filesystem) and is enforced server-side only, by running
|
|
22
12
|
* `ReferenceValidator` at the write boundary.
|
|
@@ -52,10 +42,7 @@ function isValidImageCropValue(value) {
|
|
|
52
42
|
}
|
|
53
43
|
/**
|
|
54
44
|
* Validate a structured `image` field value: `{ src, alt, width?, height?, crop? }`
|
|
55
|
-
* (see `ImageFieldValue` in config/types.ts). `
|
|
56
|
-
* whenever a value is present; `alt` may be an empty string only when the
|
|
57
|
-
* field config sets `altOptional: true`. `width`/`height` must be positive
|
|
58
|
-
* integers when present; `crop` must satisfy the same normalized-rect
|
|
45
|
+
* (see `ImageFieldValue` in config/types.ts). `crop` must satisfy the same normalized-rect
|
|
59
46
|
* constraints as the transform directive parser (assets/transform-directives.ts).
|
|
60
47
|
*/
|
|
61
48
|
function validateImageValue(field, value, path) {
|
|
@@ -91,6 +78,7 @@ function validateImageValue(field, value, path) {
|
|
|
91
78
|
* as an id string or as a resolved object `{ id, slug, collection, ... }`
|
|
92
79
|
* (content reads resolve references by default). Returns undefined for any
|
|
93
80
|
* other shape.
|
|
81
|
+
* @internal Exported for tests.
|
|
94
82
|
*/
|
|
95
83
|
export function referenceValueId(value) {
|
|
96
84
|
if (typeof value === 'string')
|
|
@@ -175,7 +163,7 @@ function isEmptyForRequired(field, value) {
|
|
|
175
163
|
export function validateEntryData(fields, data, pathPrefix = '') {
|
|
176
164
|
const errors = [];
|
|
177
165
|
for (const field of fields) {
|
|
178
|
-
// Inline groups are transparent
|
|
166
|
+
// Inline groups are transparent (walkFields, ./field-traversal) — children live at this level.
|
|
179
167
|
if (field.type === 'group') {
|
|
180
168
|
errors.push(...validateEntryData(field.fields, data, pathPrefix));
|
|
181
169
|
continue;
|
|
@@ -190,7 +178,6 @@ export function validateEntryData(fields, data, pathPrefix = '') {
|
|
|
190
178
|
errors.push({ fieldPath: path, message });
|
|
191
179
|
continue;
|
|
192
180
|
}
|
|
193
|
-
// Optional and absent: nothing further to check.
|
|
194
181
|
if (value === undefined || value === null)
|
|
195
182
|
continue;
|
|
196
183
|
if (field.type === 'block') {
|
|
@@ -244,7 +231,6 @@ export function validateEntryData(fields, data, pathPrefix = '') {
|
|
|
244
231
|
}
|
|
245
232
|
continue;
|
|
246
233
|
}
|
|
247
|
-
// Scalar (and list-of-scalar) fields.
|
|
248
234
|
if ('list' in field && field.list) {
|
|
249
235
|
if (!Array.isArray(value)) {
|
|
250
236
|
errors.push({ fieldPath: path, message: 'Expected a list of values' });
|
|
@@ -277,24 +263,21 @@ export function validateEntryFormValue(fields, format, value) {
|
|
|
277
263
|
}
|
|
278
264
|
/**
|
|
279
265
|
* Find data keys that have no counterpart in the schema, as canonical field paths
|
|
280
|
-
* (`author.nickname`, `blocks[2].headline`).
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
* posts it back. The only symptom is a component quietly receiving `undefined`.
|
|
266
|
+
* (`author.nickname`, `blocks[2].headline`). `validateEntryData` iterates the SCHEMA
|
|
267
|
+
* so it can't report the inverse: rename or reshape a field and the old key persists
|
|
268
|
+
* on disk forever, since the editor's form state is the whole record verbatim and
|
|
269
|
+
* every save posts it back — the only symptom is a component quietly receiving
|
|
270
|
+
* `undefined`.
|
|
286
271
|
*
|
|
287
|
-
* Pure — safe in the browser. Reports rather than rejects
|
|
288
|
-
*
|
|
272
|
+
* Pure — safe in the browser. Reports rather than rejects (a stale key doesn't fail
|
|
273
|
+
* a save, and the write path now preserves it and its comments), so this feeds the
|
|
289
274
|
* non-blocking `validationWarnings` channel, not the 422 path.
|
|
290
275
|
*
|
|
291
|
-
*
|
|
292
|
-
*
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
*
|
|
296
|
-
* field's value is `{ ...target data, id, slug, collection, urlPath }`. The traversal only
|
|
297
|
-
* descends into `object` and `block`, so it never looks inside one.
|
|
276
|
+
* Deliberately not reported: a container with no fields at all (`api/content.ts`
|
|
277
|
+
* falls back to `[]` for a collection with no configured entry type — "no schema"
|
|
278
|
+
* isn't "every key is unknown"), and anything inside a `reference` value (a resolved
|
|
279
|
+
* reference's value is `{ ...target data, id, slug, collection, urlPath }`; the
|
|
280
|
+
* traversal only descends into `object` and `block`, so it never looks inside one).
|
|
298
281
|
*/
|
|
299
282
|
export function findUnknownKeys(fields, data) {
|
|
300
283
|
return traverseFields(fields, data, () => [], '', ({ fields: containerFields, data: record, path }) => {
|
|
@@ -29,7 +29,7 @@ export type FieldVisitor<T> = (context: TraversalContext) => T[];
|
|
|
29
29
|
* knows about. A container visitor sees the record itself, which is what a check on the data's
|
|
30
30
|
* OWN keys needs (`findUnknownKeys` in entry-validator.ts).
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
interface ContainerContext {
|
|
33
33
|
/** The schema fields governing this record. Inline groups are NOT flattened. */
|
|
34
34
|
fields: readonly FieldConfig[];
|
|
35
35
|
/** The data record those fields govern. */
|
|
@@ -67,42 +67,15 @@ export declare function resolveBlockItem(blockField: BlockFieldConfig, item: Rec
|
|
|
67
67
|
/**
|
|
68
68
|
* Recursively traverse fields in data according to schema.
|
|
69
69
|
*
|
|
70
|
-
* This function walks through data following the schema structure, calling
|
|
71
|
-
* the visitor function for each field. It handles:
|
|
72
|
-
* - Simple fields (string, number, boolean, reference, etc.)
|
|
73
|
-
* - Object fields with nested schemas
|
|
74
|
-
* - Block fields (arrays of typed objects with different schemas)
|
|
75
|
-
* - Array fields containing objects with schemas
|
|
76
|
-
*
|
|
77
70
|
* @param fields - The schema fields to traverse
|
|
78
71
|
* @param data - The data object to traverse
|
|
79
72
|
* @param visitor - Function called for each field, returns items to collect
|
|
80
73
|
* @param pathPrefix - Current path prefix for nested fields
|
|
81
74
|
* @param onContainer - Optional, called once per container (this record plus the fields
|
|
82
75
|
* governing it) before its fields are walked: the top level, each object value, each
|
|
83
|
-
* object-list item, and each block item's resolved data.
|
|
84
|
-
* group is transparent to the data and shares its parent's record, so its children are already
|
|
85
|
-
* covered by the parent's container call.
|
|
76
|
+
* object-list item, and each block item's resolved data.
|
|
86
77
|
* @returns Array of all items returned by the visitors
|
|
87
|
-
*
|
|
88
|
-
* @example
|
|
89
|
-
* ```ts
|
|
90
|
-
* // Find all reference field values
|
|
91
|
-
* const refs = traverseFields(schema, data, ({ field, value, path }) => {
|
|
92
|
-
* if (field.type === 'reference') {
|
|
93
|
-
* return [{ path, ids: Array.isArray(value) ? value : [value] }]
|
|
94
|
-
* }
|
|
95
|
-
* return []
|
|
96
|
-
* })
|
|
97
|
-
* ```
|
|
98
78
|
*/
|
|
99
79
|
export declare function traverseFields<T>(fields: readonly FieldConfig[], data: Record<string, unknown>, visitor: FieldVisitor<T>, pathPrefix?: string, onContainer?: ContainerVisitor<T>): T[];
|
|
100
|
-
/**
|
|
101
|
-
* Find all fields of a specific type in the data.
|
|
102
|
-
*
|
|
103
|
-
* @param fields - The schema fields
|
|
104
|
-
* @param data - The data to search
|
|
105
|
-
* @param fieldType - The field type to find (e.g., 'reference', 'string')
|
|
106
|
-
* @returns Array of { field, value, path } for matching fields
|
|
107
|
-
*/
|
|
108
80
|
export declare function findFieldsByType(fields: readonly FieldConfig[], data: Record<string, unknown>, fieldType: string): TraversalContext[];
|
|
81
|
+
export {};
|
|
@@ -39,34 +39,14 @@ export function resolveBlockItem(blockField, item) {
|
|
|
39
39
|
/**
|
|
40
40
|
* Recursively traverse fields in data according to schema.
|
|
41
41
|
*
|
|
42
|
-
* This function walks through data following the schema structure, calling
|
|
43
|
-
* the visitor function for each field. It handles:
|
|
44
|
-
* - Simple fields (string, number, boolean, reference, etc.)
|
|
45
|
-
* - Object fields with nested schemas
|
|
46
|
-
* - Block fields (arrays of typed objects with different schemas)
|
|
47
|
-
* - Array fields containing objects with schemas
|
|
48
|
-
*
|
|
49
42
|
* @param fields - The schema fields to traverse
|
|
50
43
|
* @param data - The data object to traverse
|
|
51
44
|
* @param visitor - Function called for each field, returns items to collect
|
|
52
45
|
* @param pathPrefix - Current path prefix for nested fields
|
|
53
46
|
* @param onContainer - Optional, called once per container (this record plus the fields
|
|
54
47
|
* governing it) before its fields are walked: the top level, each object value, each
|
|
55
|
-
* object-list item, and each block item's resolved data.
|
|
56
|
-
* group is transparent to the data and shares its parent's record, so its children are already
|
|
57
|
-
* covered by the parent's container call.
|
|
48
|
+
* object-list item, and each block item's resolved data.
|
|
58
49
|
* @returns Array of all items returned by the visitors
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* ```ts
|
|
62
|
-
* // Find all reference field values
|
|
63
|
-
* const refs = traverseFields(schema, data, ({ field, value, path }) => {
|
|
64
|
-
* if (field.type === 'reference') {
|
|
65
|
-
* return [{ path, ids: Array.isArray(value) ? value : [value] }]
|
|
66
|
-
* }
|
|
67
|
-
* return []
|
|
68
|
-
* })
|
|
69
|
-
* ```
|
|
70
50
|
*/
|
|
71
51
|
export function traverseFields(fields, data, visitor, pathPrefix = '', onContainer) {
|
|
72
52
|
return walkFields(fields, data, visitor, pathPrefix, onContainer, true);
|
|
@@ -92,12 +72,9 @@ function walkFields(fields, data, visitor, pathPrefix, onContainer, fireContaine
|
|
|
92
72
|
results.push(...walkFields(field.fields, data, visitor, pathPrefix, onContainer, false));
|
|
93
73
|
continue;
|
|
94
74
|
}
|
|
95
|
-
// Skip undefined/null values for all other field types
|
|
96
75
|
if (value === undefined || value === null)
|
|
97
76
|
continue;
|
|
98
|
-
// Let visitor handle this field first
|
|
99
77
|
results.push(...visitor({ field, value, path: fieldPath }));
|
|
100
|
-
// Then recurse into nested structures
|
|
101
78
|
if (field.type === 'object') {
|
|
102
79
|
const objectField = field;
|
|
103
80
|
if (objectField.fields) {
|
|
@@ -130,14 +107,6 @@ function walkFields(fields, data, visitor, pathPrefix, onContainer, fireContaine
|
|
|
130
107
|
}
|
|
131
108
|
return results;
|
|
132
109
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Find all fields of a specific type in the data.
|
|
135
|
-
*
|
|
136
|
-
* @param fields - The schema fields
|
|
137
|
-
* @param data - The data to search
|
|
138
|
-
* @param fieldType - The field type to find (e.g., 'reference', 'string')
|
|
139
|
-
* @returns Array of { field, value, path } for matching fields
|
|
140
|
-
*/
|
|
141
110
|
export function findFieldsByType(fields, data, fieldType) {
|
|
142
111
|
return traverseFields(fields, data, (ctx) => {
|
|
143
112
|
if (ctx.field.type === fieldType) {
|
|
@@ -12,30 +12,17 @@ export interface ValidationResult {
|
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* ReferenceValidator validates that referenced content IDs exist and match collection constraints.
|
|
15
|
-
*
|
|
16
|
-
* This class provides validation for:
|
|
17
|
-
* - ID format validation (valid short UUID)
|
|
18
|
-
* - ID existence validation (entry actually exists)
|
|
19
|
-
* - Collection constraint validation (entry is in allowed collections)
|
|
20
|
-
*
|
|
21
|
-
* Usage:
|
|
22
|
-
* const validator = new ReferenceValidator(idIndex, schema)
|
|
23
|
-
* const result = await validator.validate(entryData)
|
|
24
|
-
* if (!result.valid) {
|
|
25
|
-
* console.error('Validation errors:', result.errors)
|
|
26
|
-
* }
|
|
27
15
|
*/
|
|
28
16
|
export declare class ReferenceValidator {
|
|
29
17
|
private idIndex;
|
|
30
18
|
private schema;
|
|
31
19
|
private resolveCollection?;
|
|
32
20
|
/**
|
|
33
|
-
* @param resolveCollection - Resolves a schema-declared collection name
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* names are compared as-is against the index's logical collection paths.
|
|
21
|
+
* @param resolveCollection - Resolves a schema-declared collection name (e.g.
|
|
22
|
+
* 'posts') to its canonical logical path (e.g. 'content/posts'), typically
|
|
23
|
+
* `ContentStore.resolveCollectionItem` — keeps validation consistent with
|
|
24
|
+
* reference-option loading, so any entry the dropdown offers also passes.
|
|
25
|
+
* Without it, names are compared as-is against the index's logical paths.
|
|
39
26
|
*/
|
|
40
27
|
constructor(idIndex: ContentIdIndex, schema: readonly FieldConfig[], resolveCollection?: ((name: string) => string | undefined) | undefined);
|
|
41
28
|
/**
|
|
@@ -45,12 +32,6 @@ export declare class ReferenceValidator {
|
|
|
45
32
|
* allowed collection are allowed.
|
|
46
33
|
*/
|
|
47
34
|
private collectionAllowed;
|
|
48
|
-
/**
|
|
49
|
-
* Validate all reference fields in the provided data.
|
|
50
|
-
*
|
|
51
|
-
* @param data - The entry data to validate
|
|
52
|
-
* @returns Validation result with any errors found
|
|
53
|
-
*/
|
|
54
35
|
validate(data: Record<string, unknown>): Promise<ValidationResult>;
|
|
55
36
|
/**
|
|
56
37
|
* Validate a single reference ID.
|
|
@@ -4,27 +4,14 @@ import { isValidId } from '../id.js';
|
|
|
4
4
|
import { findFieldsByType } from './field-traversal.js';
|
|
5
5
|
/**
|
|
6
6
|
* ReferenceValidator validates that referenced content IDs exist and match collection constraints.
|
|
7
|
-
*
|
|
8
|
-
* This class provides validation for:
|
|
9
|
-
* - ID format validation (valid short UUID)
|
|
10
|
-
* - ID existence validation (entry actually exists)
|
|
11
|
-
* - Collection constraint validation (entry is in allowed collections)
|
|
12
|
-
*
|
|
13
|
-
* Usage:
|
|
14
|
-
* const validator = new ReferenceValidator(idIndex, schema)
|
|
15
|
-
* const result = await validator.validate(entryData)
|
|
16
|
-
* if (!result.valid) {
|
|
17
|
-
* console.error('Validation errors:', result.errors)
|
|
18
|
-
* }
|
|
19
7
|
*/
|
|
20
8
|
export class ReferenceValidator {
|
|
21
9
|
/**
|
|
22
|
-
* @param resolveCollection - Resolves a schema-declared collection name
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* names are compared as-is against the index's logical collection paths.
|
|
10
|
+
* @param resolveCollection - Resolves a schema-declared collection name (e.g.
|
|
11
|
+
* 'posts') to its canonical logical path (e.g. 'content/posts'), typically
|
|
12
|
+
* `ContentStore.resolveCollectionItem` — keeps validation consistent with
|
|
13
|
+
* reference-option loading, so any entry the dropdown offers also passes.
|
|
14
|
+
* Without it, names are compared as-is against the index's logical paths.
|
|
28
15
|
*/
|
|
29
16
|
constructor(idIndex, schema, resolveCollection) {
|
|
30
17
|
this.idIndex = idIndex;
|
|
@@ -44,15 +31,8 @@ export class ReferenceValidator {
|
|
|
44
31
|
return entryCollection === canonical || entryCollection?.startsWith(canonical + '/');
|
|
45
32
|
});
|
|
46
33
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Validate all reference fields in the provided data.
|
|
49
|
-
*
|
|
50
|
-
* @param data - The entry data to validate
|
|
51
|
-
* @returns Validation result with any errors found
|
|
52
|
-
*/
|
|
53
34
|
async validate(data) {
|
|
54
35
|
const errors = [];
|
|
55
|
-
// Use shared field traversal to find all reference fields
|
|
56
36
|
const refContexts = findFieldsByType(this.schema, data, 'reference');
|
|
57
37
|
const refs = refContexts.map((ctx) => ({
|
|
58
38
|
field: ctx.field,
|
|
@@ -68,7 +48,6 @@ export class ReferenceValidator {
|
|
|
68
48
|
// means "no reference", not a malformed ID.
|
|
69
49
|
if (id == null || id === '')
|
|
70
50
|
continue;
|
|
71
|
-
// Validate ID format
|
|
72
51
|
if (typeof id !== 'string' || !isValidId(id)) {
|
|
73
52
|
errors.push({
|
|
74
53
|
field: field.name,
|
|
@@ -78,7 +57,6 @@ export class ReferenceValidator {
|
|
|
78
57
|
});
|
|
79
58
|
continue;
|
|
80
59
|
}
|
|
81
|
-
// Validate ID exists
|
|
82
60
|
const location = this.idIndex.findById(id);
|
|
83
61
|
if (!location) {
|
|
84
62
|
errors.push({
|
|
@@ -89,7 +67,6 @@ export class ReferenceValidator {
|
|
|
89
67
|
});
|
|
90
68
|
continue;
|
|
91
69
|
}
|
|
92
|
-
// Validate location is an entry (not a collection)
|
|
93
70
|
if (location.type !== 'entry') {
|
|
94
71
|
errors.push({
|
|
95
72
|
field: field.name,
|
|
@@ -99,7 +76,6 @@ export class ReferenceValidator {
|
|
|
99
76
|
});
|
|
100
77
|
continue;
|
|
101
78
|
}
|
|
102
|
-
// Validate collection constraint
|
|
103
79
|
if (field.collections && field.collections.length > 0) {
|
|
104
80
|
const allowed = this.collectionAllowed(location.collection, field.collections);
|
|
105
81
|
if (!allowed) {
|
|
@@ -112,7 +88,6 @@ export class ReferenceValidator {
|
|
|
112
88
|
continue;
|
|
113
89
|
}
|
|
114
90
|
}
|
|
115
|
-
// Validate entry type constraint
|
|
116
91
|
if (field.entryTypes && field.entryTypes.length > 0) {
|
|
117
92
|
const entryType = extractEntryTypeFromFilename(path.basename(location.relativePath));
|
|
118
93
|
if (!entryType || !field.entryTypes.includes(entryType)) {
|