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
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
import { trimSlashes } from './paths/normalize.js';
|
|
2
2
|
import { isIndexSlug } from './utils/entry-url.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Resolve a URL path to the candidate entryPath/slug pairs a lookup should try, in order:
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 2. Index fallback: full path is collection, slug is 'index'
|
|
6
|
+
* 1. Direct entry: last segment is the slug, the rest is the collection path — SKIPPED when that
|
|
7
|
+
* slug is an index slug (see below).
|
|
8
|
+
* 2. Index fallback: the whole path is a collection and the slug is 'index'.
|
|
10
9
|
*
|
|
11
|
-
* This is the REVERSE of the forward collection+slug -> url rule
|
|
12
|
-
* many URLs an entry answers at. The forward rule
|
|
10
|
+
* This is the REVERSE of the forward collection+slug -> url rule and must agree with it about how
|
|
11
|
+
* many URLs an entry answers at. The forward rule — `computeEntryUrl` (utils/entry-url.ts), which
|
|
13
12
|
* `listEntries` publishes as `item.urlPath` and reference resolution stamps on every resolved
|
|
14
|
-
* reference
|
|
15
|
-
* onto its collection's path and never emits a trailing `/index`.
|
|
16
|
-
* anyway, so an index entry ALSO answered at a `.../index` URL that no forward surface publishes
|
|
17
|
-
* — enumeration and resolution disagreeing about how many URLs exist. Adopters paid for that with
|
|
18
|
-
* per-route entryType gates whose only job was to reject the phantom.
|
|
19
|
-
*
|
|
20
|
-
* @param urlPath - URL path like '/docs/guides/getting-started' or 'docs/guides'
|
|
21
|
-
* @param contentRoot - Content root directory name (default: 'content')
|
|
22
|
-
* @returns Array of { entryPath, slug } candidates to try in order
|
|
13
|
+
* reference, plus `defaultBuildPath` (content-tree.ts) for tree nodes — collapses an `index` slug
|
|
14
|
+
* onto its collection's path and never emits a trailing `/index`.
|
|
23
15
|
*/
|
|
24
16
|
export function resolveUrlPathCandidates(urlPath, contentRoot) {
|
|
25
17
|
const normalized = trimSlashes(urlPath);
|
|
@@ -29,24 +21,23 @@ export function resolveUrlPathCandidates(urlPath, contentRoot) {
|
|
|
29
21
|
const candidates = [];
|
|
30
22
|
// Try 1: last segment is the entry slug, rest is the collection path.
|
|
31
23
|
//
|
|
32
|
-
// Skipped when that slug is an index slug
|
|
24
|
+
// Skipped when that slug is an index slug: an index entry's ADVERTISED URL is its collapsed
|
|
33
25
|
// collection path, so matching it here would answer at a second URL enumeration never emits.
|
|
34
|
-
// `index` is
|
|
35
|
-
//
|
|
26
|
+
// `index` is the slug the index convention requires on disk, so the collision is structural
|
|
27
|
+
// rather than contrived.
|
|
36
28
|
//
|
|
37
|
-
// This closes the `.../index` spelling only. The other extra URLs an entry
|
|
29
|
+
// This closes the `.../index` spelling only. The other extra URLs an entry can answer at —
|
|
38
30
|
// `/<collection>/<entryTypeName>` via candidate 2, and `/<collection>/<entryTypeName>/<slug>`
|
|
39
31
|
// via candidate 1 — are closed DOWNSTREAM instead, by `readByUrlPath` requiring every
|
|
40
32
|
// candidate's `entryPath` to be a collection (`ReadContentInput.urlAddressableOnly`). They have
|
|
41
|
-
// to be: telling those apart needs the branch's schema, and this module is deliberately pure
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
// what is ATTEMPTED, not what can resolve.
|
|
33
|
+
// to be: telling those apart needs the branch's schema, and this module is deliberately pure and
|
|
34
|
+
// schema-free so the candidate shapes stay a fact about URLs rather than about content. So the
|
|
35
|
+
// candidates below are what is ATTEMPTED, not what can resolve.
|
|
45
36
|
//
|
|
46
|
-
// Compared case-INSENSITIVELY
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
// `/x/
|
|
37
|
+
// Compared case-INSENSITIVELY through the shared `isIndexSlug`: this function is the one consumer
|
|
38
|
+
// that sees a raw, un-normalized URL segment (`parseSlug` and ContentStore's directory scan
|
|
39
|
+
// lowercase downstream), so a strict compare would close `/x/index` while leaving `/x/Index` and
|
|
40
|
+
// `/x/INDEX` resolving the very entry the skip exists to hide.
|
|
50
41
|
const slug = segments[segments.length - 1];
|
|
51
42
|
const collectionSegments = segments.slice(0, -1);
|
|
52
43
|
const entryPath = collectionSegments.length > 0 ? `${contentRoot}/${collectionSegments.join('/')}` : contentRoot;
|
|
@@ -58,7 +49,6 @@ export function resolveUrlPathCandidates(urlPath, contentRoot) {
|
|
|
58
49
|
// Kept unconditionally, which is what makes the skip above a skip rather than a removal: a
|
|
59
50
|
// collection literally NAMED `index` is handed the path `/x/index` by
|
|
60
51
|
// `defaultBuildPath(kind: 'collection')`, and this candidate is the only one that can answer it.
|
|
61
|
-
// (Candidate 1 used to shadow that collection entirely, returning the parent's own index entry.)
|
|
62
52
|
candidates.push({
|
|
63
53
|
entryPath: `${contentRoot}/${segments.join('/')}`,
|
|
64
54
|
slug: 'index',
|
package/dist/user.d.ts
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import type { CanopyUserId, CanopyGroupId } from './types.js';
|
|
2
2
|
import type { AuthenticationResult } from './auth/types.js';
|
|
3
3
|
import type { InternalGroup } from './authorization/groups/schema.js';
|
|
4
|
-
/**
|
|
5
|
-
* Anonymous user - explicitly marked for public/unauthenticated access
|
|
6
|
-
*/
|
|
4
|
+
/** Anonymous user — explicit public/unauthenticated access. */
|
|
7
5
|
export interface AnonymousUser {
|
|
8
6
|
type: 'anonymous';
|
|
9
7
|
userId: 'anonymous';
|
|
10
8
|
groups: readonly [];
|
|
11
9
|
}
|
|
12
|
-
/**
|
|
13
|
-
* Authenticated user - verified identity from auth provider
|
|
14
|
-
*/
|
|
10
|
+
/** Authenticated user — verified identity from the auth provider. */
|
|
15
11
|
export interface AuthenticatedUser {
|
|
16
12
|
type: 'authenticated';
|
|
17
13
|
userId: CanopyUserId;
|
|
@@ -20,24 +16,15 @@ export interface AuthenticatedUser {
|
|
|
20
16
|
name?: string;
|
|
21
17
|
avatarUrl?: string;
|
|
22
18
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Unified user type for all CanopyCMS operations
|
|
25
|
-
*/
|
|
19
|
+
/** Unified user type for all CanopyCMS operations. */
|
|
26
20
|
export type CanopyUser = AnonymousUser | AuthenticatedUser;
|
|
27
|
-
/**
|
|
28
|
-
* Branded ANONYMOUS_USER constant - use this for intentional anonymous access.
|
|
29
|
-
* Callers must explicitly pass this to indicate anonymous access is intended.
|
|
30
|
-
*/
|
|
21
|
+
/** Pass this constant explicitly wherever anonymous access is intended. */
|
|
31
22
|
export declare const ANONYMOUS_USER: AnonymousUser;
|
|
32
23
|
/**
|
|
33
|
-
* Convert authentication result to CanopyUser
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* This is the SINGLE source of truth for converting external auth to CanopyUser.
|
|
24
|
+
* Convert an authentication result to a CanopyUser: applies bootstrap admin groups, merges
|
|
25
|
+
* internal groups, returns ANONYMOUS_USER when not authenticated. The SINGLE source of truth
|
|
26
|
+
* for turning external auth into a CanopyUser.
|
|
37
27
|
*
|
|
38
|
-
* @param
|
|
39
|
-
* @param bootstrapAdminIds - Set of user IDs that should always be admins
|
|
40
|
-
* @param internalGroups - Optional internal groups from .canopycms/groups.json (loaded by caller)
|
|
41
|
-
* @returns CanopyUser (either authenticated with groups or ANONYMOUS_USER)
|
|
28
|
+
* @param internalGroups - Internal groups from .canopycms/groups.json, loaded by the caller.
|
|
42
29
|
*/
|
|
43
30
|
export declare function authResultToCanopyUser(authResult: AuthenticationResult, bootstrapAdminIds: Set<string>, internalGroups?: InternalGroup[]): CanopyUser;
|
package/dist/user.js
CHANGED
|
@@ -1,40 +1,31 @@
|
|
|
1
1
|
// Import from client-safe subpaths to avoid pulling in server-only loader code
|
|
2
2
|
import { RESERVED_GROUPS, stripReservedGroups } from './authorization/helpers.js';
|
|
3
|
-
/**
|
|
4
|
-
* Branded ANONYMOUS_USER constant - use this for intentional anonymous access.
|
|
5
|
-
* Callers must explicitly pass this to indicate anonymous access is intended.
|
|
6
|
-
*/
|
|
3
|
+
/** Pass this constant explicitly wherever anonymous access is intended. */
|
|
7
4
|
export const ANONYMOUS_USER = Object.freeze({
|
|
8
5
|
type: 'anonymous',
|
|
9
6
|
userId: 'anonymous',
|
|
10
7
|
groups: [],
|
|
11
8
|
});
|
|
12
9
|
/**
|
|
13
|
-
* Convert authentication result to CanopyUser
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* This is the SINGLE source of truth for converting external auth to CanopyUser.
|
|
10
|
+
* Convert an authentication result to a CanopyUser: applies bootstrap admin groups, merges
|
|
11
|
+
* internal groups, returns ANONYMOUS_USER when not authenticated. The SINGLE source of truth
|
|
12
|
+
* for turning external auth into a CanopyUser.
|
|
17
13
|
*
|
|
18
|
-
* @param
|
|
19
|
-
* @param bootstrapAdminIds - Set of user IDs that should always be admins
|
|
20
|
-
* @param internalGroups - Optional internal groups from .canopycms/groups.json (loaded by caller)
|
|
21
|
-
* @returns CanopyUser (either authenticated with groups or ANONYMOUS_USER)
|
|
14
|
+
* @param internalGroups - Internal groups from .canopycms/groups.json, loaded by the caller.
|
|
22
15
|
*/
|
|
23
16
|
export function authResultToCanopyUser(authResult, bootstrapAdminIds, internalGroups) {
|
|
24
17
|
if (!authResult.success || !authResult.user) {
|
|
25
18
|
return ANONYMOUS_USER;
|
|
26
19
|
}
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
// bootstrapAdminIds and Canopy-managed internal groups.
|
|
20
|
+
// SECURITY (SEC-H1): the privileged group IDs held in `RESERVED_GROUPS` are stripped from the
|
|
21
|
+
// provider's list here, so a provider-controlled group name can never grant CanopyCMS
|
|
22
|
+
// privilege. Reserved membership is added only below, from bootstrapAdminIds and
|
|
23
|
+
// Canopy-managed internal groups.
|
|
32
24
|
const groups = stripReservedGroups(authResult.user.externalGroups ?? []);
|
|
33
|
-
// Step 2: Add Admins group if user is in bootstrap admin list
|
|
34
25
|
if (bootstrapAdminIds.has(authResult.user.userId) && !groups.includes(RESERVED_GROUPS.ADMINS)) {
|
|
35
26
|
groups.push(RESERVED_GROUPS.ADMINS);
|
|
36
27
|
}
|
|
37
|
-
//
|
|
28
|
+
// Internal groups from .canopycms/groups.json.
|
|
38
29
|
if (internalGroups) {
|
|
39
30
|
for (const group of internalGroups) {
|
|
40
31
|
if (group.members.includes(authResult.user.userId) && !groups.includes(group.id)) {
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* FIFO per-key async mutex
|
|
2
|
+
* FIFO per-key async mutex, keyed by any string that uniquely identifies the resource (usually
|
|
3
|
+
* an absolute file path). Module-level, so it serializes only within one process.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Each caller atomically enqueues itself behind the current tail and only ever wakes
|
|
8
|
-
* once — guaranteeing strict FIFO order with no thundering-herd on release.
|
|
5
|
+
* Each caller atomically enqueues itself behind the current tail and wakes exactly once: strict
|
|
6
|
+
* FIFO order, no thundering herd on release.
|
|
9
7
|
*/
|
|
10
8
|
const locks = new Map();
|
|
11
9
|
export async function withLock(key, fn) {
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Atomic file write
|
|
3
|
-
*
|
|
4
|
-
* Writes to a temp file first, then renames over the target.
|
|
5
|
-
* Prevents partial/interleaved writes that corrupt files on NFS/EFS.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Atomically write content to a file via temp-file + rename.
|
|
9
|
-
* Ensures the target file is never partially written.
|
|
10
|
-
*
|
|
11
|
-
* @param filePath - Absolute path to the target file
|
|
12
|
-
* @param content - String or binary content to write
|
|
2
|
+
* Atomic file write: temp file first, then rename over the target, so the file is never
|
|
3
|
+
* partially written. Prevents the interleaved writes that corrupt files on NFS/EFS.
|
|
13
4
|
*/
|
|
14
5
|
export declare function atomicWriteFile(filePath: string, content: string | Buffer | Uint8Array): Promise<void>;
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Atomic file write
|
|
3
|
-
*
|
|
4
|
-
* Writes to a temp file first, then renames over the target.
|
|
5
|
-
* Prevents partial/interleaved writes that corrupt files on NFS/EFS.
|
|
2
|
+
* Atomic file write: temp file first, then rename over the target, so the file is never
|
|
3
|
+
* partially written. Prevents the interleaved writes that corrupt files on NFS/EFS.
|
|
6
4
|
*/
|
|
7
5
|
import fs from 'node:fs/promises';
|
|
8
6
|
import path from 'node:path';
|
|
9
|
-
/**
|
|
10
|
-
* Atomically write content to a file via temp-file + rename.
|
|
11
|
-
* Ensures the target file is never partially written.
|
|
12
|
-
*
|
|
13
|
-
* @param filePath - Absolute path to the target file
|
|
14
|
-
* @param content - String or binary content to write
|
|
15
|
-
*/
|
|
16
7
|
export async function atomicWriteFile(filePath, content) {
|
|
17
8
|
const dir = path.dirname(filePath);
|
|
18
9
|
await fs.mkdir(dir, { recursive: true });
|
|
@@ -1,28 +1,21 @@
|
|
|
1
1
|
import type { FieldConfig } from '../config/index.js';
|
|
2
2
|
/**
|
|
3
|
-
* Count
|
|
4
|
-
*
|
|
5
|
-
* because it maps to the file's markdown content.
|
|
3
|
+
* Count top-level fields marked `isBody: true`. Does NOT recurse into objects — `isBody` maps
|
|
4
|
+
* to the file's markdown content, which exists only at the top level.
|
|
6
5
|
*/
|
|
7
6
|
export declare function countBodyFields(fields: readonly FieldConfig[]): number;
|
|
8
|
-
/**
|
|
9
|
-
* Find the name of the field marked `isBody: true`, or `'body'` as the default.
|
|
10
|
-
* Used at read time to map the markdown file's content to the correct data field.
|
|
11
|
-
*/
|
|
7
|
+
/** Name of the `isBody: true` field, or `'body'`; maps the file's markdown onto a data field. */
|
|
12
8
|
export declare function findBodyFieldName(fields: readonly FieldConfig[]): string;
|
|
13
9
|
/**
|
|
14
10
|
* Find an isBody field whose NAME is reserved by reference resolution.
|
|
15
11
|
*
|
|
16
12
|
* A resolved reference reserves `id`/`slug`/`collection`/`urlPath` by applying them after the
|
|
17
13
|
* target's data. The body is the one value assigned by key rather than spread, so a body field
|
|
18
|
-
* named e.g. `id`
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
14
|
+
* named e.g. `id` is the one way around that — and the write boundary recovers a reference's id
|
|
15
|
+
* from `value.id`, so re-saving would persist the prose as the reference. Rejected at
|
|
16
|
+
* registry-validation time, so the schema fails loudly instead of the body being silently
|
|
17
|
+
* dropped at resolution.
|
|
22
18
|
*/
|
|
23
19
|
export declare function findReservedBodyFieldName(fields: readonly FieldConfig[], reserved: readonly string[]): string | undefined;
|
|
24
|
-
/**
|
|
25
|
-
* Find isBody fields that have an invalid type (not 'markdown' or 'mdx').
|
|
26
|
-
* Returns field names that fail validation.
|
|
27
|
-
*/
|
|
20
|
+
/** Names of isBody fields whose type is neither 'markdown' nor 'mdx'. */
|
|
28
21
|
export declare function findInvalidBodyFields(fields: readonly FieldConfig[]): string[];
|
package/dist/utils/body-field.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { flattenGroupFields } from './flatten-group-fields.js';
|
|
2
2
|
const BODY_FIELD_TYPES = new Set(['markdown', 'mdx']);
|
|
3
3
|
/**
|
|
4
|
-
* Count
|
|
5
|
-
*
|
|
6
|
-
* because it maps to the file's markdown content.
|
|
4
|
+
* Count top-level fields marked `isBody: true`. Does NOT recurse into objects — `isBody` maps
|
|
5
|
+
* to the file's markdown content, which exists only at the top level.
|
|
7
6
|
*/
|
|
8
7
|
export function countBodyFields(fields) {
|
|
9
8
|
let count = 0;
|
|
@@ -13,10 +12,7 @@ export function countBodyFields(fields) {
|
|
|
13
12
|
}
|
|
14
13
|
return count;
|
|
15
14
|
}
|
|
16
|
-
/**
|
|
17
|
-
* Find the name of the field marked `isBody: true`, or `'body'` as the default.
|
|
18
|
-
* Used at read time to map the markdown file's content to the correct data field.
|
|
19
|
-
*/
|
|
15
|
+
/** Name of the `isBody: true` field, or `'body'`; maps the file's markdown onto a data field. */
|
|
20
16
|
export function findBodyFieldName(fields) {
|
|
21
17
|
for (const field of flattenGroupFields(fields)) {
|
|
22
18
|
if ('isBody' in field && field.isBody)
|
|
@@ -29,10 +25,10 @@ export function findBodyFieldName(fields) {
|
|
|
29
25
|
*
|
|
30
26
|
* A resolved reference reserves `id`/`slug`/`collection`/`urlPath` by applying them after the
|
|
31
27
|
* target's data. The body is the one value assigned by key rather than spread, so a body field
|
|
32
|
-
* named e.g. `id`
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
28
|
+
* named e.g. `id` is the one way around that — and the write boundary recovers a reference's id
|
|
29
|
+
* from `value.id`, so re-saving would persist the prose as the reference. Rejected at
|
|
30
|
+
* registry-validation time, so the schema fails loudly instead of the body being silently
|
|
31
|
+
* dropped at resolution.
|
|
36
32
|
*/
|
|
37
33
|
export function findReservedBodyFieldName(fields, reserved) {
|
|
38
34
|
for (const field of flattenGroupFields(fields)) {
|
|
@@ -41,10 +37,7 @@ export function findReservedBodyFieldName(fields, reserved) {
|
|
|
41
37
|
}
|
|
42
38
|
return undefined;
|
|
43
39
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Find isBody fields that have an invalid type (not 'markdown' or 'mdx').
|
|
46
|
-
* Returns field names that fail validation.
|
|
47
|
-
*/
|
|
40
|
+
/** Names of isBody fields whose type is neither 'markdown' nor 'mdx'. */
|
|
48
41
|
export function findInvalidBodyFields(fields) {
|
|
49
42
|
const invalid = [];
|
|
50
43
|
for (const field of flattenGroupFields(fields)) {
|
|
@@ -1,37 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Comment-preserving serialisation for YAML content files and md/mdx frontmatter.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Stringifying a fresh plain object (`yamlStringify(data)` / `matter.stringify(body, data)`)
|
|
5
|
+
* deletes every comment in the file, because comments live in neither the object nor that round
|
|
6
|
+
* trip. So these functions re-serialise onto the file's OWN parsed document: a node whose value
|
|
7
|
+
* did not change is left untouched, and an untouched node keeps its attached comments and its
|
|
8
|
+
* original quoting/block style. Only what actually changed is rewritten.
|
|
9
9
|
*
|
|
10
|
-
* The
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* disappears, a key the caller kept survives whether or not the schema still knows about it.
|
|
17
|
-
* Data authority stays with the payload; comments are the only thing inherited from disk. That
|
|
18
|
-
* separation is deliberate: whether a surviving key SHOULD still be there is a schema question,
|
|
19
|
-
* answered one layer up by `findUnknownKeys` (validation/entry-validator.ts) at the API
|
|
20
|
-
* boundary, not by a serialiser that has no schema.
|
|
10
|
+
* The file gets no authority over its own content. The reconciler makes the document's key set
|
|
11
|
+
* match `data` exactly — a key the caller dropped disappears, a key the caller kept survives
|
|
12
|
+
* whether or not the schema still knows about it. Data authority stays with the payload;
|
|
13
|
+
* comments are the only thing inherited from disk. Whether a surviving key SHOULD still be there
|
|
14
|
+
* is a schema question, answered one layer up by `findUnknownKeys`
|
|
15
|
+
* (validation/entry-validator.ts) at the API boundary, not by a schema-blind serialiser.
|
|
21
16
|
*/
|
|
22
17
|
/**
|
|
23
18
|
* Serialise entry data as a YAML file, carrying the comments of `existingRaw` through.
|
|
24
19
|
*
|
|
25
|
-
* Falls back to a plain stringify — byte-identical to
|
|
26
|
-
* nothing to preserve (a new file) or nothing trustworthy to preserve (the bytes on disk
|
|
27
|
-
* parse). A save must not fail because the previous content was malformed.
|
|
20
|
+
* Falls back to a plain stringify — byte-identical to serialising without preservation — when
|
|
21
|
+
* there is nothing to preserve (a new file) or nothing trustworthy to preserve (the bytes on disk
|
|
22
|
+
* do not parse). A save must not fail because the previous content was malformed.
|
|
28
23
|
*/
|
|
29
24
|
export declare function serializeYaml(data: Record<string, unknown>, existingRaw?: string): string;
|
|
30
25
|
/**
|
|
31
|
-
* Serialise an md/mdx entry, carrying the comments of `existingRaw`'s frontmatter through.
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* trailing newline stay exactly what gray-matter would have produced.
|
|
26
|
+
* Serialise an md/mdx entry, carrying the comments of `existingRaw`'s frontmatter through. The
|
|
27
|
+
* reconciled YAML goes back through `matter.stringify` via a custom stringify engine rather than
|
|
28
|
+
* being spliced between hand-written `---` lines, so delimiters, blank lines and the trailing
|
|
29
|
+
* newline stay exactly what gray-matter would have produced.
|
|
36
30
|
*/
|
|
37
31
|
export declare function serializeFrontmatter(body: string, data: Record<string, unknown>, existingRaw?: string): string;
|