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
package/dist/entry-schema.d.ts
CHANGED
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The entry-schema authoring API — the surface ADOPTERS write against.
|
|
3
|
-
*
|
|
4
3
|
* `defineEntrySchema`, `defineInlineFieldGroup`, `defineNestedFieldGroup` and
|
|
5
|
-
* `defineSeoFieldGroup`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* This is the type-level half of the schema story. The runtime half — loading
|
|
10
|
-
* `.collection.json`, resolving it, and validating content against it — lives in
|
|
11
|
-
* `schema/` and `validation/`.
|
|
4
|
+
* `defineSeoFieldGroup` declare a host app's content model in TypeScript, with the
|
|
5
|
+
* field list inferring the entry's data type, so changing a signature here is an
|
|
6
|
+
* adopter-facing breaking change, not an internal one.
|
|
12
7
|
*
|
|
8
|
+
* Type-level half only: loading `.collection.json`, resolving it and validating
|
|
9
|
+
* content against it live in `schema/` and `validation/`.
|
|
13
10
|
* `RESOLVED_REFERENCE_KEYS`/`buildResolvedReference` define the shape a resolved
|
|
14
|
-
* reference takes
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* `DEFAULT_SEO_FIELD_NAMES` is imported from `static/seo.ts` rather than
|
|
18
|
-
* redeclared, so the schema this module emits and the fields that module reads
|
|
19
|
-
* cannot drift apart.
|
|
11
|
+
* reference takes and must agree with `validation/entry-validator.ts`'s inverse
|
|
12
|
+
* `normalizeReferenceValues`.
|
|
20
13
|
*
|
|
21
14
|
* Module map: ./AGENTS.md.
|
|
22
15
|
*/
|
|
@@ -38,16 +31,12 @@ type InferableField = {
|
|
|
38
31
|
* For select fields: the option list. Inferring the literal union of these values is
|
|
39
32
|
* what makes a select field's type its own options rather than a bare `string`.
|
|
40
33
|
*
|
|
41
|
-
* MUST stay `readonly
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* `as const`, producing a `readonly` tuple — and a `readonly` array is not assignable
|
|
48
|
-
* to a mutable one (TS4104), so every such schema would stop compiling at the
|
|
49
|
-
* definition site. `readonly` here accepts both the inline literal and the shared
|
|
50
|
-
* `as const` array.
|
|
34
|
+
* MUST stay `readonly`, though `SelectFieldConfig.options` (config/types.ts) is a mutable
|
|
35
|
+
* `SelectOption[]`: an adopter who declares the option list separately and shares it
|
|
36
|
+
* across schemas writes `as const`, and a `readonly` array is not assignable to a mutable
|
|
37
|
+
* one (TS4104), so every such schema would stop compiling at its definition site.
|
|
38
|
+
* `readonly` accepts both the inline literal and the shared `as const` array. (A mutable
|
|
39
|
+
* constraint would not by itself defeat `const` inference — that is not the reason.)
|
|
51
40
|
*/
|
|
52
41
|
options?: readonly (string | {
|
|
53
42
|
label: string;
|
|
@@ -66,12 +55,6 @@ type InferableField = {
|
|
|
66
55
|
* The fields reference resolution adds to a target's own data, on top of whatever
|
|
67
56
|
* `resolvedSchema` declares.
|
|
68
57
|
*
|
|
69
|
-
* These have always been returned at runtime (`resolveSingleReferenceOnce` in
|
|
70
|
-
* content-store.ts) but were missing from the inferred type, so a resolved reference typed
|
|
71
|
-
* narrower than it actually is — which is why reading `ref.id` needed a cast, and one source
|
|
72
|
-
* of the library-internal type error `adopter-migration.md` records under
|
|
73
|
-
* `exactOptionalPropertyTypes` + `skipLibCheck: false`.
|
|
74
|
-
*
|
|
75
58
|
* `urlPath` is what makes a resolved reference linkable without a second lookup; it follows
|
|
76
59
|
* the same collection+slug rule `listEntries` publishes as `item.urlPath`, so an index entry
|
|
77
60
|
* collapses to its parent path.
|
|
@@ -99,27 +82,23 @@ export interface ResolvedReferenceMeta {
|
|
|
99
82
|
* embed it, then the reserved metadata.
|
|
100
83
|
*
|
|
101
84
|
* Exists so the two places that construct one — the server resolver in content-store.ts and
|
|
102
|
-
* the editor's live-preview endpoint in api/resolve-references.ts — cannot drift.
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
* re-save persist the wrong value and silently repoint the reference. Body before metadata
|
|
111
|
-
* closes the same hole for a body field named `id`; that schema is also rejected outright by
|
|
112
|
-
* the entry schema registry, so this ordering is the guarantee and that check is the loud
|
|
113
|
-
* error rather than a silent drop.
|
|
85
|
+
* the editor's live-preview endpoint in api/resolve-references.ts — cannot drift.
|
|
86
|
+
*
|
|
87
|
+
* The ordering is the contract, not a detail. Metadata LAST means a target that models `id` as
|
|
88
|
+
* a content field cannot shadow the real content ID, which the write boundary recovers from
|
|
89
|
+
* `value.id` (`referenceValueId`) — a shadowed id makes a re-save persist the wrong value and
|
|
90
|
+
* silently repoint the reference. Body before metadata closes the same hole for a body field
|
|
91
|
+
* named `id`; the entry schema registry also rejects that schema outright, so this ordering is
|
|
92
|
+
* the guarantee and that check is the loud error rather than a silent drop.
|
|
114
93
|
*/
|
|
115
94
|
export declare function buildResolvedReference(data: Record<string, unknown>, meta: ResolvedReferenceMeta, body?: {
|
|
116
95
|
fieldName: string;
|
|
117
96
|
value: string | undefined;
|
|
118
97
|
}): Record<string, unknown>;
|
|
119
98
|
/**
|
|
120
|
-
* Recursively flatten inline groups (type: 'group') out of a field tuple
|
|
121
|
-
*
|
|
122
|
-
*
|
|
99
|
+
* Recursively flatten inline groups (type: 'group') out of a field tuple: they contribute
|
|
100
|
+
* no key to the content shape, so their children merge into the parent level and
|
|
101
|
+
* InferContentShape sees only data-carrying fields.
|
|
123
102
|
*/
|
|
124
103
|
type FlattenInlineGroups<Fields extends readonly InferableField[]> = Fields extends readonly [
|
|
125
104
|
infer Head,
|
|
@@ -129,11 +108,10 @@ type FlattenInlineGroups<Fields extends readonly InferableField[]> = Fields exte
|
|
|
129
108
|
fields: infer GFields extends readonly InferableField[];
|
|
130
109
|
} ? [...FlattenInlineGroups<GFields>, ...FlattenInlineGroups<Rest>] : [Head, ...FlattenInlineGroups<Rest>] : [];
|
|
131
110
|
/**
|
|
132
|
-
* Collapse an intersection of mapped types into one object type, preserving the `?`
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* by strict type-equality assertions.
|
|
111
|
+
* Collapse an intersection of mapped types into one object type, preserving the `?` modifier
|
|
112
|
+
* (homomorphic over `keyof T`, so optionality survives). Without it InferContentShape surfaces
|
|
113
|
+
* as `{ a: string } & { b?: string }` — structurally equivalent, but it reads badly in editor
|
|
114
|
+
* tooltips and fails strict type-equality assertions.
|
|
137
115
|
*/
|
|
138
116
|
type Simplify<T> = {
|
|
139
117
|
[K in keyof T]: T[K];
|
|
@@ -144,38 +122,30 @@ type Simplify<T> = {
|
|
|
144
122
|
*/
|
|
145
123
|
type ScalarValue<F extends InferableField, V> = F['list'] extends true ? V[] : V;
|
|
146
124
|
/**
|
|
147
|
-
* The value one `select` option contributes to the field's value union
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* annotated as `SelectOption[]` rather than inferred by `defineEntrySchema` widens to
|
|
153
|
-
* `string | { label: string; value: string }`, and both arms then land on `string`.
|
|
125
|
+
* The value one `select` option contributes to the field's value union: a bare string option
|
|
126
|
+
* contributes itself, a `{ label, value }` option its `value`. Mixed arrays work because this
|
|
127
|
+
* distributes. Falls back to `string` for an option whose literal type is gone — an array
|
|
128
|
+
* annotated `SelectOption[]` rather than inferred by `defineEntrySchema` widens to
|
|
129
|
+
* `string | { label: string; value: string }`, and both arms land on `string`.
|
|
154
130
|
*/
|
|
155
131
|
type SelectOptionValue<O> = O extends {
|
|
156
132
|
value: infer V extends string;
|
|
157
133
|
} ? V : O extends string ? O : string;
|
|
158
134
|
/**
|
|
159
|
-
* The value type of a `select` field: the literal union of its OWN `options`.
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* empty one. Both are schema mistakes that `ensureSelectFieldsHaveOptions`
|
|
174
|
-
* (config/validation.ts) rejects — but note it runs from `createEntrySchemaRegistry`,
|
|
175
|
-
* NOT from `validateCanopyConfig`, so a schema that is only ever fed to
|
|
176
|
-
* `TypeFromEntrySchema` and never registered gets no runtime rejection at all.
|
|
177
|
-
* Returning `never` here would type such a field as unsatisfiable, which is a worse
|
|
178
|
-
* error than the bare `string` this falls back to.
|
|
135
|
+
* The value type of a `select` field: the literal union of its OWN `options`. A select value is
|
|
136
|
+
* always a string — `SelectOption` (config/types.ts) carries `value: string` in both arms,
|
|
137
|
+
* `normalizeOptions` (editor/FormRenderer.tsx) emits strings, and `validateEntryData`
|
|
138
|
+
* (validation/entry-validator.ts) rejects anything else — so this says WHICH strings.
|
|
139
|
+
*
|
|
140
|
+
* Like the rest of InferContentShape, it models the SCHEMA'S declared shape, not every byte the
|
|
141
|
+
* validator tolerates on disk: the validator also accepts `''` as "not filled in" for any field
|
|
142
|
+
* that is not explicitly `required: true`, and `''` is deliberately NOT in this union.
|
|
143
|
+
*
|
|
144
|
+
* Degrades to `string` when there is nothing to infer (no `options` key, or an empty one). Both
|
|
145
|
+
* are schema mistakes `ensureSelectFieldsHaveOptions` (config/validation.ts) rejects — but it
|
|
146
|
+
* runs from `createEntrySchemaRegistry`, so a schema only ever fed to `TypeFromEntrySchema` and
|
|
147
|
+
* never registered gets no runtime rejection. `never` here would type such a field as
|
|
148
|
+
* unsatisfiable, a worse error than this bare `string`.
|
|
179
149
|
*/
|
|
180
150
|
type SelectValue<F extends InferableField> = F extends {
|
|
181
151
|
options: infer O extends readonly unknown[];
|
|
@@ -184,12 +154,9 @@ type ObjectValue<F extends InferableField & {
|
|
|
184
154
|
fields: readonly InferableField[];
|
|
185
155
|
}> = F['list'] extends true ? Array<InferContentShape<F['fields']>> : InferContentShape<F['fields']>;
|
|
186
156
|
/**
|
|
187
|
-
* Distributes over each member of a block
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
* given `T = { name: 'hero'; fields: [...] } | { name: 'cta'; fields: [...] }`,
|
|
191
|
-
* produces `{ template: 'hero'; value: { ... } } | { template: 'cta'; value: { ... } }`
|
|
192
|
-
* rather than collapsing into a single merged object.
|
|
157
|
+
* Distributes over each member of a block-templates union to produce a discriminated union. The
|
|
158
|
+
* bare type parameter `T` is what makes the conditional distribute: `{ name: 'hero'; ... } |
|
|
159
|
+
* { name: 'cta'; ... }` yields two `{ template; value }` members rather than one merged object.
|
|
193
160
|
*/
|
|
194
161
|
type DistributeBlockTemplate<T> = T extends {
|
|
195
162
|
name: infer N;
|
|
@@ -205,9 +172,8 @@ type BlockValue<F extends InferableField & {
|
|
|
205
172
|
}>;
|
|
206
173
|
}> = Array<DistributeBlockTemplate<F['templates'][number]>>;
|
|
207
174
|
/**
|
|
208
|
-
* Structural mirror of `ImageFieldValue` (config/types.ts)
|
|
209
|
-
*
|
|
210
|
-
* (see the module doc comment: "importing FieldConfig is not required").
|
|
175
|
+
* Structural mirror of `ImageFieldValue` (config/types.ts), inline rather than imported so this
|
|
176
|
+
* module stays free of a FieldConfig import.
|
|
211
177
|
*/
|
|
212
178
|
type ImageValue = {
|
|
213
179
|
src: string;
|
|
@@ -251,19 +217,15 @@ type FieldValue<F extends InferableField> = F extends {
|
|
|
251
217
|
type: 'date';
|
|
252
218
|
} ? ScalarValue<F, string> : ScalarValue<F, string>;
|
|
253
219
|
/**
|
|
254
|
-
* Infer a TypeScript data shape from a CanopyCMS FieldConfig-like array
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
263
|
-
* distinction (`true` / `false` / absent) is deliberate and pinned by tests — only an
|
|
264
|
-
* explicit `required: false` opts a key into `?:`.
|
|
265
|
-
* - Inline groups (type: 'group') are flattened — their fields contribute directly
|
|
266
|
-
* to the parent shape with no intermediate key.
|
|
220
|
+
* Infer a TypeScript data shape from a CanopyCMS FieldConfig-like array: objects nest, blocks
|
|
221
|
+
* become arrays of tagged templates, lists become arrays of the scalar/object type, and inline
|
|
222
|
+
* groups (type: 'group') flatten into the parent shape with no intermediate key.
|
|
223
|
+
*
|
|
224
|
+
* Optionality is three-way (`true` / `false` / absent), deliberate and pinned by tests: only an
|
|
225
|
+
* explicit `required: false` opts a key into `?:` (`subheading?: string`, so a literal may omit
|
|
226
|
+
* it rather than spell out `undefined`; reading it still yields `string | undefined`). A field
|
|
227
|
+
* that OMITS `required` stays REQUIRED, because `F['required']` infers there as
|
|
228
|
+
* `boolean | undefined`, which does not extend `false`.
|
|
267
229
|
*
|
|
268
230
|
* Works with any structurally compatible array; importing FieldConfig is not required.
|
|
269
231
|
*/
|
|
@@ -272,13 +234,9 @@ type InferContentShape<Fields extends readonly InferableField[]> = Simplify<{
|
|
|
272
234
|
} & {
|
|
273
235
|
[F in FlattenInlineGroups<Fields>[number] as F['required'] extends false ? F['name'] : never]?: FieldValue<F>;
|
|
274
236
|
}>;
|
|
275
|
-
/**
|
|
276
|
-
* Helper to define entry schema field arrays with literal inference without sprinkling `as const`.
|
|
277
|
-
*/
|
|
237
|
+
/** Define an entry schema's field array with literal inference, without sprinkling `as const`. */
|
|
278
238
|
export declare const defineEntrySchema: <const T extends readonly InferableField[]>(fields: T) => T;
|
|
279
|
-
/**
|
|
280
|
-
* Convenience alias to derive the content shape from a `defineEntrySchema` result.
|
|
281
|
-
*/
|
|
239
|
+
/** Content shape derived from a `defineEntrySchema` result. */
|
|
282
240
|
export type TypeFromEntrySchema<T extends readonly InferableField[]> = InferContentShape<T>;
|
|
283
241
|
/**
|
|
284
242
|
* Derive a map of entry-type-name → content-shape from an `entrySchemaRegistry`.
|
|
@@ -290,50 +248,32 @@ export type TypeFromEntrySchema<T extends readonly InferableField[]> = InferCont
|
|
|
290
248
|
*
|
|
291
249
|
* @example
|
|
292
250
|
* ```ts
|
|
293
|
-
* export const entrySchemaRegistry = createEntrySchemaRegistry({
|
|
294
|
-
* partner: partnerSchema,
|
|
295
|
-
* doc: docSchema,
|
|
296
|
-
* home: homeSchema,
|
|
297
|
-
* })
|
|
298
|
-
*
|
|
299
251
|
* export type EntryTypes = EntryTypesFromRegistry<typeof entrySchemaRegistry>
|
|
300
|
-
*
|
|
301
|
-
* // Then per-schema aliases stay one line each, anchored to the registry:
|
|
252
|
+
* // Per-schema aliases stay one line each, anchored to the registry:
|
|
302
253
|
* export type PartnerContent = EntryTypes['partner']
|
|
303
254
|
*
|
|
304
|
-
* // And the tree-builder narrows on entryType:
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
* // meta.indexEntry.data is typed PartnerContent
|
|
309
|
-
* }
|
|
310
|
-
* },
|
|
311
|
-
* })
|
|
255
|
+
* // And the tree-builder narrows on entryType: inside this extract,
|
|
256
|
+
* // meta.indexEntry.data is typed PartnerContent once meta.indexEntry?.entryType
|
|
257
|
+
* // has been checked against 'partner'.
|
|
258
|
+
* await canopy.buildContentTree<NavFields, EntryTypes>({ extract: (data, meta) => { … } })
|
|
312
259
|
* ```
|
|
313
260
|
*/
|
|
314
261
|
export type EntryTypesFromRegistry<T extends Record<string, readonly InferableField[]>> = {
|
|
315
262
|
[K in keyof T]: TypeFromEntrySchema<T[K]>;
|
|
316
263
|
};
|
|
317
264
|
/**
|
|
318
|
-
* Define a reusable inline field group — a visual container in the editor that groups
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
* Use this when you want consistent visual organization across schemas without
|
|
323
|
-
* changing your content file structure.
|
|
324
|
-
*
|
|
325
|
-
* For data-nested grouping (fields stored under a named key), use defineNestedFieldGroup().
|
|
265
|
+
* Define a reusable inline field group — a visual container in the editor that groups related
|
|
266
|
+
* fields without creating a nested data key, so they are stored FLAT alongside the other fields.
|
|
267
|
+
* Use it for consistent visual organization across schemas without changing the content file
|
|
268
|
+
* structure; for data-nested grouping, use defineNestedFieldGroup().
|
|
326
269
|
*
|
|
327
270
|
* @example
|
|
328
271
|
* const seoGroup = defineInlineFieldGroup({
|
|
329
272
|
* name: 'seo',
|
|
330
273
|
* label: 'SEO',
|
|
331
|
-
* fields: [
|
|
332
|
-
* { name: 'metaTitle', type: 'string', label: 'Meta Title' },
|
|
333
|
-
* { name: 'metaDescription', type: 'string', label: 'Meta Description' },
|
|
334
|
-
* ],
|
|
274
|
+
* fields: [{ name: 'metaTitle', type: 'string', label: 'Meta Title' }],
|
|
335
275
|
* })
|
|
336
|
-
* // TypeFromEntrySchema: { ..., metaTitle: string
|
|
276
|
+
* // TypeFromEntrySchema: { ..., metaTitle: string }
|
|
337
277
|
*/
|
|
338
278
|
export declare const defineInlineFieldGroup: <const T extends {
|
|
339
279
|
name: string;
|
|
@@ -346,30 +286,24 @@ export declare const defineInlineFieldGroup: <const T extends {
|
|
|
346
286
|
/**
|
|
347
287
|
* The recommended SEO field group, ready to drop into any entry schema.
|
|
348
288
|
*
|
|
349
|
-
* Emits the seven fields `extractSeoFields()` reads by default (`metaTitle`,
|
|
350
|
-
* `
|
|
351
|
-
*
|
|
352
|
-
*
|
|
289
|
+
* Emits the seven fields `extractSeoFields()` reads by default (`metaTitle`, `metaDescription`,
|
|
290
|
+
* `ogImage`, `ogType`, `canonical`, `noindex`, `twitterCard`), so schema and read side agree with
|
|
291
|
+
* no configuration. Every field is `required: false`: SEO metadata is always optional, and an
|
|
292
|
+
* unset field must fall back rather than fail validation.
|
|
353
293
|
*
|
|
354
|
-
* **Flat by default
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* `extractSeoFields` / `entryToMetadata`.
|
|
294
|
+
* **Flat by default** — an inline group, stored at the top level of the content file with no data
|
|
295
|
+
* key of its own. `group: 'seo'` nests them under that key instead, and the same
|
|
296
|
+
* `{ group: 'seo' }` must then be passed to `extractSeoFields` / `entryToMetadata`.
|
|
358
297
|
*
|
|
359
298
|
* @example
|
|
360
299
|
* // Flat (recommended): frontmatter carries `metaTitle:` at the top level.
|
|
361
|
-
*
|
|
362
|
-
*
|
|
363
|
-
* defineSeoFieldGroup(),
|
|
364
|
-
* ])
|
|
365
|
-
* // TypeFromEntrySchema: { title: string; metaTitle?: string; metaDescription?: string; ... }
|
|
300
|
+
* defineEntrySchema([{ name: 'title', type: 'string' }, defineSeoFieldGroup()])
|
|
301
|
+
* // TypeFromEntrySchema: { title: string; metaTitle?: string; ... }
|
|
366
302
|
*
|
|
367
303
|
* @example
|
|
368
|
-
* // Nested: frontmatter carries `seo: { metaTitle: … }
|
|
369
|
-
*
|
|
304
|
+
* // Nested: frontmatter carries `seo: { metaTitle: … }`, and the `seo` key is itself optional.
|
|
305
|
+
* defineEntrySchema([defineSeoFieldGroup({ group: 'seo' })])
|
|
370
306
|
* const metadata = entryToMetadata(data, { group: 'seo' })
|
|
371
|
-
* // TypeFromEntrySchema: { seo?: { metaTitle?: string; ... } } — the wrapper key itself is
|
|
372
|
-
* // optional too, so an entry that sets no SEO fields at all can omit `seo` entirely.
|
|
373
307
|
*/
|
|
374
308
|
declare const SEO_GROUP_FIELDS: readonly [{
|
|
375
309
|
readonly name: "metaTitle";
|
|
@@ -438,9 +372,8 @@ export type NestedSeoFieldGroup<G extends string> = {
|
|
|
438
372
|
fields: SeoGroupFields;
|
|
439
373
|
type: 'object';
|
|
440
374
|
/**
|
|
441
|
-
* The wrapper object itself is optional
|
|
442
|
-
*
|
|
443
|
-
* enforces fields with `required: true`.
|
|
375
|
+
* The wrapper object itself is optional: an entry that sets no SEO fields omits the key
|
|
376
|
+
* entirely, matching `entry-validator.ts`, which enforces only `required: true` fields.
|
|
444
377
|
*/
|
|
445
378
|
required: false;
|
|
446
379
|
};
|
|
@@ -455,24 +388,18 @@ export declare function defineSeoFieldGroup<const G extends string>(opts: SeoFie
|
|
|
455
388
|
group: G;
|
|
456
389
|
}): NestedSeoFieldGroup<G>;
|
|
457
390
|
/**
|
|
458
|
-
* Define a reusable nested field group — a visual container in the editor
|
|
459
|
-
*
|
|
460
|
-
*
|
|
461
|
-
*
|
|
462
|
-
* and you want that structure reflected in your content files.
|
|
463
|
-
*
|
|
464
|
-
* For visual-only grouping without data nesting, use defineInlineFieldGroup().
|
|
391
|
+
* Define a reusable nested field group — a visual container in the editor whose fields are
|
|
392
|
+
* stored under a named key in the content file (e.g. seo.metaTitle). Use it when the fields
|
|
393
|
+
* belong together as a sub-object and that structure should be reflected on disk; for
|
|
394
|
+
* visual-only grouping without data nesting, use defineInlineFieldGroup().
|
|
465
395
|
*
|
|
466
396
|
* @example
|
|
467
397
|
* const seoGroup = defineNestedFieldGroup({
|
|
468
398
|
* name: 'seo',
|
|
469
399
|
* label: 'SEO',
|
|
470
|
-
* fields: [
|
|
471
|
-
* { name: 'metaTitle', type: 'string', label: 'Meta Title' },
|
|
472
|
-
* { name: 'metaDescription', type: 'string', label: 'Meta Description' },
|
|
473
|
-
* ],
|
|
400
|
+
* fields: [{ name: 'metaTitle', type: 'string', label: 'Meta Title' }],
|
|
474
401
|
* })
|
|
475
|
-
* // TypeFromEntrySchema: { ..., seo: { metaTitle: string
|
|
402
|
+
* // TypeFromEntrySchema: { ..., seo: { metaTitle: string } }
|
|
476
403
|
*/
|
|
477
404
|
export declare const defineNestedFieldGroup: <const T extends Omit<InferableField, "type"> & {
|
|
478
405
|
fields: readonly InferableField[];
|
|
@@ -482,11 +409,10 @@ export declare const defineNestedFieldGroup: <const T extends Omit<InferableFiel
|
|
|
482
409
|
/**
|
|
483
410
|
* Define a reusable block template once and embed it in multiple entry schemas' `block` fields.
|
|
484
411
|
*
|
|
485
|
-
* A `block` field holds an ordered, repeatable list of heterogeneous section blocks discriminated
|
|
486
|
-
* a `template` key (the "flexible content" / "page blocks" pattern).
|
|
487
|
-
*
|
|
488
|
-
*
|
|
489
|
-
* still deriving the correct discriminated-union type via TypeFromEntrySchema.
|
|
412
|
+
* A `block` field holds an ordered, repeatable list of heterogeneous section blocks discriminated
|
|
413
|
+
* by a `template` key (the "flexible content" / "page blocks" pattern). This const-inference
|
|
414
|
+
* identity helper (like defineEntrySchema) keeps a template's field definitions in one place
|
|
415
|
+
* across schemas while TypeFromEntrySchema still derives the discriminated union.
|
|
490
416
|
*
|
|
491
417
|
* @example
|
|
492
418
|
* const heroBlock = defineBlockTemplate({
|
|
@@ -501,10 +427,7 @@ export declare const defineNestedFieldGroup: <const T extends Omit<InferableFiel
|
|
|
501
427
|
* name: 'cta',
|
|
502
428
|
* fields: [{ name: 'label', type: 'string' }, { name: 'href', type: 'string' }],
|
|
503
429
|
* })
|
|
504
|
-
*
|
|
505
|
-
* // Reuse the same templates across multiple page schemas:
|
|
506
430
|
* const pageSchema = defineEntrySchema([
|
|
507
|
-
* { name: 'title', type: 'string' },
|
|
508
431
|
* { name: 'sections', type: 'block', templates: [heroBlock, ctaBlock] },
|
|
509
432
|
* ])
|
|
510
433
|
* // TypeFromEntrySchema<typeof pageSchema>['sections'] narrows to:
|
|
@@ -518,20 +441,11 @@ export declare const defineBlockTemplate: <const T extends {
|
|
|
518
441
|
fields: readonly InferableField[];
|
|
519
442
|
}>(template: T) => T;
|
|
520
443
|
/**
|
|
521
|
-
* Extract one template's value shape out of a block field's discriminated union.
|
|
522
|
-
*
|
|
523
|
-
* `
|
|
524
|
-
* a `block` field as derived by `TypeFromEntrySchema` — not the surrounding array.
|
|
525
|
-
* `N` is one of that union's `template` literals.
|
|
444
|
+
* Extract one template's value shape out of a block field's discriminated union. `Blocks` is the
|
|
445
|
+
* union itself — e.g. `Page['sections'][number]`, the element type of a `block` field as derived
|
|
446
|
+
* by `TypeFromEntrySchema` — not the surrounding array; `N` is one of its `template` literals.
|
|
526
447
|
*
|
|
527
448
|
* @example
|
|
528
|
-
* const heroBlock = defineBlockTemplate({
|
|
529
|
-
* name: 'hero',
|
|
530
|
-
* fields: [{ name: 'headline', type: 'string' }],
|
|
531
|
-
* })
|
|
532
|
-
* const pageSchema = defineEntrySchema([
|
|
533
|
-
* { name: 'sections', type: 'block', templates: [heroBlock] },
|
|
534
|
-
* ])
|
|
535
449
|
* type Sections = TypeFromEntrySchema<typeof pageSchema>['sections'][number]
|
|
536
450
|
* type HeroValue = BlockValueOf<Sections, 'hero'> // { headline: string }
|
|
537
451
|
*/
|
|
@@ -542,27 +456,18 @@ export type BlockValueOf<Blocks extends {
|
|
|
542
456
|
template: N;
|
|
543
457
|
}>['value'];
|
|
544
458
|
/**
|
|
545
|
-
* A mapped type over a block field's template names
|
|
546
|
-
*
|
|
547
|
-
*
|
|
548
|
-
* compile error
|
|
549
|
-
* strictly stronger than a runtime "did I handle every template?" guard, since it fails
|
|
550
|
-
* the build instead of failing silently at render time.
|
|
459
|
+
* A mapped type over a block field's template names requiring exactly one component per template
|
|
460
|
+
* — no more, no fewer. That makes a block → component registry exhaustive *by construction*: a
|
|
461
|
+
* template added to the schema without its component, or a stray/renamed registry key, is a
|
|
462
|
+
* compile error rather than a silent gap at render time.
|
|
551
463
|
*
|
|
552
|
-
* Deliberately a type, not a `renderBlocks()` helper —
|
|
553
|
-
*
|
|
554
|
-
*
|
|
555
|
-
* "Block Component Registries" section for the recipe) and get exhaustiveness for free.
|
|
464
|
+
* Deliberately a type, not a `renderBlocks()` helper — it says nothing about key strategy,
|
|
465
|
+
* unknown-template handling or how extra props reach each component, so it imposes no rendering
|
|
466
|
+
* shape. Adopters write their own small loop (README, "Block Component Registries").
|
|
556
467
|
*
|
|
557
468
|
* @example
|
|
558
|
-
*
|
|
559
|
-
*
|
|
560
|
-
* // TS error here if 'hero' is missing, or if a key doesn't match a template name.
|
|
561
|
-
* }
|
|
562
|
-
*
|
|
563
|
-
* // With extra props threaded to every block component:
|
|
564
|
-
* type Props = { index: number }
|
|
565
|
-
* const registryWithProps: BlockComponentRegistry<Sections, Props> = {
|
|
469
|
+
* // Extra props are threaded to every block component through the second parameter:
|
|
470
|
+
* const registry: BlockComponentRegistry<Sections, { index: number }> = {
|
|
566
471
|
* hero: ({ data, index }) => <HeroSection {...data} position={index} />,
|
|
567
472
|
* }
|
|
568
473
|
*/
|
|
@@ -575,33 +480,23 @@ export type BlockComponentRegistry<Blocks extends {
|
|
|
575
480
|
} & ExtraProps>;
|
|
576
481
|
};
|
|
577
482
|
/**
|
|
578
|
-
* Const-inference identity helper for a reusable field fragment — a plain array of field
|
|
579
|
-
*
|
|
580
|
-
*
|
|
581
|
-
*
|
|
582
|
-
*
|
|
583
|
-
* makes the pattern easy to find (and to grep for) alongside `defineInlineFieldGroup` and
|
|
483
|
+
* Const-inference identity helper for a reusable field fragment — a plain array of field configs
|
|
484
|
+
* (not a group, not a template) spread into several schemas' `fields`. Purely for
|
|
485
|
+
* discoverability: `defineEntrySchema` and `defineBlockTemplate` already infer literal types from
|
|
486
|
+
* a `const fields = [...] as const` array, so spreading works without this helper; wrapping the
|
|
487
|
+
* definition site just makes the pattern easy to find alongside `defineInlineFieldGroup` and
|
|
584
488
|
* `defineNestedFieldGroup`.
|
|
585
489
|
*
|
|
586
|
-
* Use
|
|
587
|
-
*
|
|
588
|
-
*
|
|
589
|
-
* overrides just the field(s) that differ for that schema.
|
|
490
|
+
* Use it over a field group when the fields should not be visually boxed together in the editor,
|
|
491
|
+
* or when schemas need to override one field (a different `label` or `required`) — spread the
|
|
492
|
+
* fragment, then follow it with an object overriding just the fields that differ.
|
|
590
493
|
*
|
|
591
494
|
* @example
|
|
592
495
|
* const ctaFields = defineFieldFragment([
|
|
593
496
|
* { name: 'ctaLabel', type: 'string', label: 'Button Label' },
|
|
594
497
|
* { name: 'ctaHref', type: 'string', label: 'Button Link' },
|
|
595
498
|
* ])
|
|
596
|
-
*
|
|
597
|
-
* const heroSchema = defineEntrySchema([
|
|
598
|
-
* { name: 'headline', type: 'string' },
|
|
599
|
-
* ...ctaFields,
|
|
600
|
-
* ])
|
|
601
|
-
* const bannerSchema = defineEntrySchema([
|
|
602
|
-
* { name: 'message', type: 'string' },
|
|
603
|
-
* ...ctaFields,
|
|
604
|
-
* ])
|
|
499
|
+
* const heroSchema = defineEntrySchema([{ name: 'headline', type: 'string' }, ...ctaFields])
|
|
605
500
|
*/
|
|
606
501
|
export declare const defineFieldFragment: <const T extends readonly InferableField[]>(fields: T) => T;
|
|
607
502
|
export {};
|