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,65 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Consolidates editor-wide state that was previously scattered across
|
|
5
|
-
* the Editor component. This reduces prop drilling and makes state
|
|
6
|
-
* management more explicit.
|
|
7
|
-
*
|
|
8
|
-
* Manages:
|
|
9
|
-
* - Loading states (branches, entries, comments)
|
|
10
|
-
* - Modal/drawer open states
|
|
11
|
-
* - Preview data and loading state
|
|
2
|
+
* Consolidates editor-wide loading, modal, and preview state in one place
|
|
3
|
+
* instead of prop-drilling it through the Editor component.
|
|
12
4
|
*/
|
|
13
5
|
import React from 'react';
|
|
14
6
|
import type { FormValue } from '../FormRenderer.js';
|
|
15
|
-
|
|
7
|
+
interface LoadingState {
|
|
16
8
|
branches: boolean;
|
|
17
9
|
entries: boolean;
|
|
18
10
|
comments: boolean;
|
|
19
11
|
}
|
|
20
|
-
|
|
12
|
+
interface ModalState {
|
|
21
13
|
navigator: boolean;
|
|
22
14
|
branchManager: boolean;
|
|
23
15
|
groupManager: boolean;
|
|
24
16
|
permissionManager: boolean;
|
|
25
17
|
commentsPanel: boolean;
|
|
26
18
|
}
|
|
27
|
-
|
|
28
|
-
data: FormValue;
|
|
29
|
-
loading: FormValue;
|
|
30
|
-
}
|
|
31
|
-
export interface EditorState {
|
|
32
|
-
loading: LoadingState;
|
|
33
|
-
modals: ModalState;
|
|
34
|
-
preview: PreviewState;
|
|
35
|
-
/** True if any resource is loading */
|
|
36
|
-
busy: boolean;
|
|
37
|
-
}
|
|
38
|
-
export interface EditorStateActions {
|
|
39
|
-
setLoading: (key: keyof LoadingState, value: boolean) => void;
|
|
40
|
-
openModal: (key: keyof ModalState) => void;
|
|
41
|
-
closeModal: (key: keyof ModalState) => void;
|
|
42
|
-
toggleModal: (key: keyof ModalState) => void;
|
|
43
|
-
setPreviewData: (data: FormValue) => void;
|
|
44
|
-
setPreviewLoading: (loading: FormValue) => void;
|
|
45
|
-
}
|
|
46
|
-
export interface EditorStateContextValue {
|
|
47
|
-
state: EditorState;
|
|
48
|
-
actions: EditorStateActions;
|
|
49
|
-
}
|
|
50
|
-
export interface EditorStateProviderProps {
|
|
19
|
+
interface EditorStateProviderProps {
|
|
51
20
|
children: React.ReactNode;
|
|
52
21
|
/** Initial modal states (useful for deep linking) */
|
|
53
22
|
initialModals?: Partial<ModalState>;
|
|
54
23
|
}
|
|
24
|
+
/** @internal No importer; deletion candidate in editor-state-context-migration.md. */
|
|
55
25
|
export declare function EditorStateProvider({ children, initialModals }: EditorStateProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
56
|
-
/**
|
|
57
|
-
* Access the full editor state context.
|
|
58
|
-
* Must be used within an EditorStateProvider.
|
|
59
|
-
*/
|
|
60
|
-
export declare function useEditorState(): EditorStateContextValue;
|
|
61
26
|
/**
|
|
62
27
|
* Convenience hook for loading states only.
|
|
28
|
+
* @internal No importer; deletion candidate in editor-state-context-migration.md.
|
|
63
29
|
*/
|
|
64
30
|
export declare function useEditorLoading(): {
|
|
65
31
|
busy: boolean;
|
|
@@ -70,6 +36,7 @@ export declare function useEditorLoading(): {
|
|
|
70
36
|
};
|
|
71
37
|
/**
|
|
72
38
|
* Convenience hook for modal states only.
|
|
39
|
+
* @internal No importer; deletion candidate in editor-state-context-migration.md.
|
|
73
40
|
*/
|
|
74
41
|
export declare function useEditorModals(): {
|
|
75
42
|
openModal: (key: keyof ModalState) => void;
|
|
@@ -83,6 +50,7 @@ export declare function useEditorModals(): {
|
|
|
83
50
|
};
|
|
84
51
|
/**
|
|
85
52
|
* Convenience hook for preview state only.
|
|
53
|
+
* @internal No importer; deletion candidate in editor-state-context-migration.md.
|
|
86
54
|
*/
|
|
87
55
|
export declare function useEditorPreview(): {
|
|
88
56
|
data: FormValue;
|
|
@@ -90,3 +58,4 @@ export declare function useEditorPreview(): {
|
|
|
90
58
|
setData: (data: FormValue) => void;
|
|
91
59
|
setLoading: (loading: FormValue) => void;
|
|
92
60
|
};
|
|
61
|
+
export {};
|
|
@@ -1,30 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Consolidates editor-wide state that was previously scattered across
|
|
7
|
-
* the Editor component. This reduces prop drilling and makes state
|
|
8
|
-
* management more explicit.
|
|
9
|
-
*
|
|
10
|
-
* Manages:
|
|
11
|
-
* - Loading states (branches, entries, comments)
|
|
12
|
-
* - Modal/drawer open states
|
|
13
|
-
* - Preview data and loading state
|
|
4
|
+
* Consolidates editor-wide loading, modal, and preview state in one place
|
|
5
|
+
* instead of prop-drilling it through the Editor component.
|
|
14
6
|
*/
|
|
15
7
|
import { createContext, useContext, useCallback, useState, useMemo } from 'react';
|
|
16
|
-
// ============================================================================
|
|
17
|
-
// Context
|
|
18
|
-
// ============================================================================
|
|
19
8
|
const EditorStateContext = createContext(null);
|
|
9
|
+
/** @internal No importer; deletion candidate in editor-state-context-migration.md. */
|
|
20
10
|
export function EditorStateProvider({ children, initialModals }) {
|
|
21
|
-
// Loading states
|
|
22
11
|
const [loading, setLoadingState] = useState({
|
|
23
12
|
branches: false,
|
|
24
13
|
entries: false,
|
|
25
14
|
comments: false,
|
|
26
15
|
});
|
|
27
|
-
// Modal states
|
|
28
16
|
const [modals, setModals] = useState({
|
|
29
17
|
navigator: false,
|
|
30
18
|
branchManager: false,
|
|
@@ -33,12 +21,9 @@ export function EditorStateProvider({ children, initialModals }) {
|
|
|
33
21
|
commentsPanel: false,
|
|
34
22
|
...initialModals,
|
|
35
23
|
});
|
|
36
|
-
// Preview states
|
|
37
24
|
const [previewData, setPreviewDataState] = useState({});
|
|
38
25
|
const [previewLoading, setPreviewLoadingState] = useState({});
|
|
39
|
-
// Computed busy state
|
|
40
26
|
const busy = loading.branches || loading.entries || loading.comments;
|
|
41
|
-
// Actions
|
|
42
27
|
const setLoading = useCallback((key, value) => {
|
|
43
28
|
setLoadingState((prev) => ({ ...prev, [key]: value }));
|
|
44
29
|
}, []);
|
|
@@ -57,7 +42,6 @@ export function EditorStateProvider({ children, initialModals }) {
|
|
|
57
42
|
const setPreviewLoading = useCallback((loading) => {
|
|
58
43
|
setPreviewLoadingState(loading);
|
|
59
44
|
}, []);
|
|
60
|
-
// Memoize context value
|
|
61
45
|
const value = useMemo(() => ({
|
|
62
46
|
state: {
|
|
63
47
|
loading,
|
|
@@ -91,14 +75,11 @@ export function EditorStateProvider({ children, initialModals }) {
|
|
|
91
75
|
]);
|
|
92
76
|
return _jsx(EditorStateContext.Provider, { value: value, children: children });
|
|
93
77
|
}
|
|
94
|
-
// ============================================================================
|
|
95
|
-
// Hooks
|
|
96
|
-
// ============================================================================
|
|
97
78
|
/**
|
|
98
79
|
* Access the full editor state context.
|
|
99
80
|
* Must be used within an EditorStateProvider.
|
|
100
81
|
*/
|
|
101
|
-
|
|
82
|
+
function useEditorState() {
|
|
102
83
|
const context = useContext(EditorStateContext);
|
|
103
84
|
if (!context) {
|
|
104
85
|
throw new Error('useEditorState must be used within an EditorStateProvider');
|
|
@@ -107,6 +88,7 @@ export function useEditorState() {
|
|
|
107
88
|
}
|
|
108
89
|
/**
|
|
109
90
|
* Convenience hook for loading states only.
|
|
91
|
+
* @internal No importer; deletion candidate in editor-state-context-migration.md.
|
|
110
92
|
*/
|
|
111
93
|
export function useEditorLoading() {
|
|
112
94
|
const { state, actions } = useEditorState();
|
|
@@ -118,6 +100,7 @@ export function useEditorLoading() {
|
|
|
118
100
|
}
|
|
119
101
|
/**
|
|
120
102
|
* Convenience hook for modal states only.
|
|
103
|
+
* @internal No importer; deletion candidate in editor-state-context-migration.md.
|
|
121
104
|
*/
|
|
122
105
|
export function useEditorModals() {
|
|
123
106
|
const { state, actions } = useEditorState();
|
|
@@ -130,6 +113,7 @@ export function useEditorModals() {
|
|
|
130
113
|
}
|
|
131
114
|
/**
|
|
132
115
|
* Convenience hook for preview state only.
|
|
116
|
+
* @internal No importer; deletion candidate in editor-state-context-migration.md.
|
|
133
117
|
*/
|
|
134
118
|
export function useEditorPreview() {
|
|
135
119
|
const { state, actions } = useEditorState();
|
|
@@ -13,15 +13,12 @@
|
|
|
13
13
|
* - provider: () => new Map() -- gives the editor its own cache instead of
|
|
14
14
|
* SWR's module-global one, so editor keys ("canopy:entries:main", ...) can
|
|
15
15
|
* never collide with an SWR cache the host app is running for its own data.
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* on the module global. Mounted once (CanopyEditor.tsx), so the cache spans
|
|
19
|
-
* the whole editor session.
|
|
16
|
+
* Mounted by EditorAuthGate and keyed by user id, so the cache spans
|
|
17
|
+
* one identity's session and a different user starts empty.
|
|
20
18
|
* - dedupingInterval: 2000 -- collapses the duplicate requests React Strict
|
|
21
19
|
* Mode's mount -> cleanup -> remount cycle produces (each hook's
|
|
22
20
|
* automatic on-mount fetch runs twice), plus any accidental
|
|
23
|
-
* near-simultaneous mounts of the same resource.
|
|
24
|
-
* editor-async-patterns.md (2026-07-24 decision) for the background.
|
|
21
|
+
* near-simultaneous mounts of the same resource.
|
|
25
22
|
*/
|
|
26
23
|
import React from 'react';
|
|
27
24
|
export interface SWRProviderProps {
|
|
@@ -1,23 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Editor Context Providers
|
|
3
|
-
*
|
|
4
|
-
* These contexts consolidate editor-wide state and dependencies:
|
|
5
|
-
*
|
|
6
|
-
* - ApiClientContext: Dependency injection for API client (context-based pattern)
|
|
7
|
-
* - EditorStateContext: Loading states, modal states, preview data
|
|
8
|
-
* - SWRProvider: SWR cache config for the fetch-on-load data hooks (see
|
|
9
|
-
* hooks/useBranchesData.ts, useEntriesData.ts, useCommentsData.ts)
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* ```tsx
|
|
13
|
-
* <ApiClientProvider>
|
|
14
|
-
* <EditorStateProvider>
|
|
15
|
-
* <Editor />
|
|
16
|
-
* </EditorStateProvider>
|
|
17
|
-
* </ApiClientProvider>
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
1
|
export { ApiClientProvider, useApiClient, useOptionalApiClient, type ApiClient, type ApiClientProviderProps, } from './ApiClientContext.js';
|
|
21
2
|
export { AssetContextProvider, useAssetContext, type AssetContextValue, type AssetContextProviderProps, } from './AssetContext.js';
|
|
22
3
|
export { SWRProvider, type SWRProviderProps } from './SWRProvider.js';
|
|
23
|
-
export {
|
|
4
|
+
export { useEditorLoading, useEditorModals, useEditorPreview } from './EditorStateContext.js';
|
|
@@ -1,23 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Editor Context Providers
|
|
3
|
-
*
|
|
4
|
-
* These contexts consolidate editor-wide state and dependencies:
|
|
5
|
-
*
|
|
6
|
-
* - ApiClientContext: Dependency injection for API client (context-based pattern)
|
|
7
|
-
* - EditorStateContext: Loading states, modal states, preview data
|
|
8
|
-
* - SWRProvider: SWR cache config for the fetch-on-load data hooks (see
|
|
9
|
-
* hooks/useBranchesData.ts, useEntriesData.ts, useCommentsData.ts)
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* ```tsx
|
|
13
|
-
* <ApiClientProvider>
|
|
14
|
-
* <EditorStateProvider>
|
|
15
|
-
* <Editor />
|
|
16
|
-
* </EditorStateProvider>
|
|
17
|
-
* </ApiClientProvider>
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
1
|
export { ApiClientProvider, useApiClient, useOptionalApiClient, } from './ApiClientContext.js';
|
|
21
2
|
export { AssetContextProvider, useAssetContext, } from './AssetContext.js';
|
|
22
3
|
export { SWRProvider } from './SWRProvider.js';
|
|
23
|
-
export {
|
|
4
|
+
export { useEditorLoading, useEditorModals, useEditorPreview } from './EditorStateContext.js';
|
|
@@ -4,25 +4,24 @@ import type { FormValue } from './FormRenderer.js';
|
|
|
4
4
|
import type { EditorEntry, EditorCollection } from './Editor.js';
|
|
5
5
|
import type { TreeNodeData } from '@mantine/core';
|
|
6
6
|
import { normalizeCollectionPath } from '../paths/normalize.js';
|
|
7
|
+
/** @internal Exported for tests. */
|
|
7
8
|
export { normalizeCollectionPath };
|
|
8
9
|
export interface PreviewContext {
|
|
9
10
|
branchName?: string;
|
|
10
11
|
previewBaseByCollection?: Record<string, string>;
|
|
11
12
|
}
|
|
12
|
-
export declare const encodeSlug: (value?: string) => string;
|
|
13
13
|
/**
|
|
14
14
|
* Builds the preview iframe `src` for an entry, prefixed with the deployment `basePath`
|
|
15
15
|
* (`CanopyClientConfig.basePath`, e.g. `/preview-123`) when configured.
|
|
16
16
|
*
|
|
17
|
-
* This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s
|
|
18
|
-
* the prefix
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* iframe itself
|
|
17
|
+
* This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s
|
|
18
|
+
* without the prefix under a basePath, and `resolvePreviewPath` there compares the same
|
|
19
|
+
* string against `window.location.pathname` -- which browsers report WITH the basePath --
|
|
20
|
+
* so an unprefixed `previewSrc` also breaks draft sync / click-to-focus even when the
|
|
21
|
+
* iframe itself resolves.
|
|
22
22
|
*
|
|
23
|
-
* Applied via `joinUrlPrefix
|
|
24
|
-
* already-absolute `previewSrc` (a
|
|
25
|
-
* matching `joinUrlPrefix`'s own absolute-URL passthrough rule.
|
|
23
|
+
* Applied via `joinUrlPrefix`: a no-op when `basePath` is unset, and passes an
|
|
24
|
+
* already-absolute `previewSrc` (a cross-origin override) through untouched.
|
|
26
25
|
*/
|
|
27
26
|
export declare const buildPreviewSrc: (entry: {
|
|
28
27
|
collectionPath?: string;
|
|
@@ -46,13 +45,6 @@ interface BuildEntriesFromListParams {
|
|
|
46
45
|
flatSchema: FlatSchemaItem[];
|
|
47
46
|
}
|
|
48
47
|
export declare const buildEntriesFromListResponse: ({ response, resolvePreviewSrc, flatSchema, }: BuildEntriesFromListParams) => EditorEntry[];
|
|
49
|
-
/**
|
|
50
|
-
* Builds a map of collection IDs to their labels for breadcrumb display.
|
|
51
|
-
* Recursively walks through nested collections to build a flat map.
|
|
52
|
-
*
|
|
53
|
-
* @param collections - The collection tree structure
|
|
54
|
-
* @returns A Map where keys are collection IDs (paths) and values are labels
|
|
55
|
-
*/
|
|
56
48
|
export declare const buildCollectionLabels: (collections?: EditorCollection[]) => Map<string, string>;
|
|
57
49
|
/**
|
|
58
50
|
* Builds breadcrumb segments for an entry based on its collection hierarchy.
|
|
@@ -60,19 +52,6 @@ export declare const buildCollectionLabels: (collections?: EditorCollection[]) =
|
|
|
60
52
|
* @param currentEntry - The entry to build breadcrumbs for (or undefined for root)
|
|
61
53
|
* @param collectionLabels - Map of collection IDs to labels
|
|
62
54
|
* @returns Array of breadcrumb segment strings, starting with 'All Files'
|
|
63
|
-
*
|
|
64
|
-
* @example
|
|
65
|
-
* ```ts
|
|
66
|
-
* // Entry in nested collection
|
|
67
|
-
* const entry = { collectionPath: 'content/docs/guides', slug: 'config' }
|
|
68
|
-
* const labels = new Map([
|
|
69
|
-
* ['content', 'Content'],
|
|
70
|
-
* ['content/docs', 'Documentation'],
|
|
71
|
-
* ['content/docs/guides', 'Guides']
|
|
72
|
-
* ])
|
|
73
|
-
* buildBreadcrumbSegments(entry, labels)
|
|
74
|
-
* // Returns: ['All Files', 'Documentation', 'Guides']
|
|
75
|
-
* ```
|
|
76
55
|
*/
|
|
77
56
|
export declare const buildBreadcrumbSegments: (currentEntry: EditorEntry | undefined, collectionLabels: Map<string, string>) => string[];
|
|
78
57
|
/**
|
|
@@ -82,23 +61,5 @@ export declare const buildBreadcrumbSegments: (currentEntry: EditorEntry | undef
|
|
|
82
61
|
* @param entryPath - The entry path to find (e.g., "blog/my-post")
|
|
83
62
|
* @param treeData - The tree data structure from Mantine Tree
|
|
84
63
|
* @returns Record<string, boolean> - Expanded state object where keys are collection node values
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* ```ts
|
|
88
|
-
* const treeData = [
|
|
89
|
-
* {
|
|
90
|
-
* value: 'collection:blog',
|
|
91
|
-
* children: [
|
|
92
|
-
* { value: 'blog/post-1' },
|
|
93
|
-
* {
|
|
94
|
-
* value: 'collection:blog/featured',
|
|
95
|
-
* children: [{ value: 'blog/featured/my-post' }]
|
|
96
|
-
* }
|
|
97
|
-
* ]
|
|
98
|
-
* }
|
|
99
|
-
* ]
|
|
100
|
-
* calculatePathToEntry('blog/featured/my-post', treeData)
|
|
101
|
-
* // Returns: { 'collection:blog': true, 'collection:blog/featured': true }
|
|
102
|
-
* ```
|
|
103
64
|
*/
|
|
104
65
|
export declare const calculatePathToEntry: (entryPath: string | undefined, treeData: TreeNodeData[]) => Record<string, boolean>;
|
|
@@ -3,21 +3,21 @@ import { normalizeCollectionPath } from '../paths/normalize.js';
|
|
|
3
3
|
import { isIndexSlug } from '../utils/entry-url.js';
|
|
4
4
|
import { isDataOnlyFormat } from '../utils/format.js';
|
|
5
5
|
import { joinUrlPrefix } from '../utils/url-prefix.js';
|
|
6
|
+
/** @internal Exported for tests. */
|
|
6
7
|
export { normalizeCollectionPath };
|
|
7
8
|
/**
|
|
8
|
-
* The slug portion of a preview URL, or '' for an index entry
|
|
9
|
+
* The slug portion of a preview URL, or '' for an index entry -- `resolveUrlPathCandidates`
|
|
10
|
+
* refuses `/x/index`, so a preview built that way 404s.
|
|
9
11
|
*
|
|
10
|
-
* An index entry's URL is its COLLECTION's path
|
|
11
|
-
* `listEntries
|
|
12
|
-
* at `/x/index`, which `resolveUrlPathCandidates` deliberately refuses to resolve, so the host
|
|
13
|
-
* app answered the editor's own preview with notFound().
|
|
12
|
+
* An index entry's URL is its COLLECTION's path, the same collapse `computeEntryUrl`,
|
|
13
|
+
* `listEntries`, and `defaultBuildPath` apply.
|
|
14
14
|
*
|
|
15
|
-
* Kept separate from `computeEntryUrl
|
|
16
|
-
* percent-encode each segment and must NOT lowercase
|
|
17
|
-
* case-sensitive
|
|
15
|
+
* Kept separate from `computeEntryUrl`, which shares only the index decision: this builder
|
|
16
|
+
* must percent-encode each segment and must NOT lowercase, since a preview base is
|
|
17
|
+
* adopter-supplied and case-sensitive.
|
|
18
18
|
*/
|
|
19
19
|
const encodePreviewSlug = (slug) => (isIndexSlug(slug) ? '' : encodeSlug(slug));
|
|
20
|
-
|
|
20
|
+
const encodeSlug = (value) => (value ?? '')
|
|
21
21
|
.split('/')
|
|
22
22
|
.filter(Boolean)
|
|
23
23
|
.map((segment) => encodeURIComponent(segment))
|
|
@@ -39,22 +39,18 @@ const buildRawPreviewSrc = (entry, { branchName, previewBaseByCollection, conten
|
|
|
39
39
|
// Root-level entries have collectionPath === contentRoot (e.g., 'content')
|
|
40
40
|
const isRootEntry = contentRoot && entry.collectionPath === contentRoot;
|
|
41
41
|
if (isRootEntry) {
|
|
42
|
-
// Check for custom preview URL in previewBaseByCollection
|
|
43
42
|
const customPreview = previewBaseByCollection?.[`${contentRoot}/${entry.slug}`];
|
|
44
43
|
if (customPreview) {
|
|
45
44
|
return appendBranch(customPreview);
|
|
46
45
|
}
|
|
47
|
-
// Default root entries to root path
|
|
48
46
|
return appendBranch('/');
|
|
49
47
|
}
|
|
50
48
|
const base = (entry.collectionPath && previewBaseByCollection?.[entry.collectionPath]) ??
|
|
51
49
|
(entry.collectionName && previewBaseByCollection?.[entry.collectionName]);
|
|
52
50
|
if (!base) {
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
// contentRoot is undefined here, which matches the pre-existing behavior
|
|
57
|
-
// for adopters who never set it.
|
|
51
|
+
// Pass contentRoot through so a non-default (or multi-segment, e.g.
|
|
52
|
+
// "cms/content") configured root is stripped too; normalizeCollectionPath
|
|
53
|
+
// defaults to 'content' when contentRoot is undefined.
|
|
58
54
|
const collectionPath = entry.collectionPath
|
|
59
55
|
? normalizeCollectionPath(entry.collectionPath, contentRoot)
|
|
60
56
|
: '';
|
|
@@ -72,15 +68,14 @@ const buildRawPreviewSrc = (entry, { branchName, previewBaseByCollection, conten
|
|
|
72
68
|
* Builds the preview iframe `src` for an entry, prefixed with the deployment `basePath`
|
|
73
69
|
* (`CanopyClientConfig.basePath`, e.g. `/preview-123`) when configured.
|
|
74
70
|
*
|
|
75
|
-
* This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s
|
|
76
|
-
* the prefix
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* iframe itself
|
|
71
|
+
* This matters twice: the raw `<iframe src>` (`PreviewFrame` in preview-bridge.tsx) 404s
|
|
72
|
+
* without the prefix under a basePath, and `resolvePreviewPath` there compares the same
|
|
73
|
+
* string against `window.location.pathname` -- which browsers report WITH the basePath --
|
|
74
|
+
* so an unprefixed `previewSrc` also breaks draft sync / click-to-focus even when the
|
|
75
|
+
* iframe itself resolves.
|
|
80
76
|
*
|
|
81
|
-
* Applied via `joinUrlPrefix
|
|
82
|
-
* already-absolute `previewSrc` (a
|
|
83
|
-
* matching `joinUrlPrefix`'s own absolute-URL passthrough rule.
|
|
77
|
+
* Applied via `joinUrlPrefix`: a no-op when `basePath` is unset, and passes an
|
|
78
|
+
* already-absolute `previewSrc` (a cross-origin override) through untouched.
|
|
84
79
|
*/
|
|
85
80
|
export const buildPreviewSrc = (entry, context) => {
|
|
86
81
|
return joinUrlPrefix(context.basePath, buildRawPreviewSrc(entry, context));
|
|
@@ -149,13 +144,6 @@ export const buildEntriesFromListResponse = ({ response, resolvePreviewSrc, flat
|
|
|
149
144
|
};
|
|
150
145
|
});
|
|
151
146
|
};
|
|
152
|
-
/**
|
|
153
|
-
* Builds a map of collection IDs to their labels for breadcrumb display.
|
|
154
|
-
* Recursively walks through nested collections to build a flat map.
|
|
155
|
-
*
|
|
156
|
-
* @param collections - The collection tree structure
|
|
157
|
-
* @returns A Map where keys are collection IDs (paths) and values are labels
|
|
158
|
-
*/
|
|
159
147
|
export const buildCollectionLabels = (collections) => {
|
|
160
148
|
const map = new Map();
|
|
161
149
|
if (!collections)
|
|
@@ -177,19 +165,6 @@ export const buildCollectionLabels = (collections) => {
|
|
|
177
165
|
* @param currentEntry - The entry to build breadcrumbs for (or undefined for root)
|
|
178
166
|
* @param collectionLabels - Map of collection IDs to labels
|
|
179
167
|
* @returns Array of breadcrumb segment strings, starting with 'All Files'
|
|
180
|
-
*
|
|
181
|
-
* @example
|
|
182
|
-
* ```ts
|
|
183
|
-
* // Entry in nested collection
|
|
184
|
-
* const entry = { collectionPath: 'content/docs/guides', slug: 'config' }
|
|
185
|
-
* const labels = new Map([
|
|
186
|
-
* ['content', 'Content'],
|
|
187
|
-
* ['content/docs', 'Documentation'],
|
|
188
|
-
* ['content/docs/guides', 'Guides']
|
|
189
|
-
* ])
|
|
190
|
-
* buildBreadcrumbSegments(entry, labels)
|
|
191
|
-
* // Returns: ['All Files', 'Documentation', 'Guides']
|
|
192
|
-
* ```
|
|
193
168
|
*/
|
|
194
169
|
export const buildBreadcrumbSegments = (currentEntry, collectionLabels) => {
|
|
195
170
|
if (!currentEntry)
|
|
@@ -222,51 +197,23 @@ export const buildBreadcrumbSegments = (currentEntry, collectionLabels) => {
|
|
|
222
197
|
* @param entryPath - The entry path to find (e.g., "blog/my-post")
|
|
223
198
|
* @param treeData - The tree data structure from Mantine Tree
|
|
224
199
|
* @returns Record<string, boolean> - Expanded state object where keys are collection node values
|
|
225
|
-
*
|
|
226
|
-
* @example
|
|
227
|
-
* ```ts
|
|
228
|
-
* const treeData = [
|
|
229
|
-
* {
|
|
230
|
-
* value: 'collection:blog',
|
|
231
|
-
* children: [
|
|
232
|
-
* { value: 'blog/post-1' },
|
|
233
|
-
* {
|
|
234
|
-
* value: 'collection:blog/featured',
|
|
235
|
-
* children: [{ value: 'blog/featured/my-post' }]
|
|
236
|
-
* }
|
|
237
|
-
* ]
|
|
238
|
-
* }
|
|
239
|
-
* ]
|
|
240
|
-
* calculatePathToEntry('blog/featured/my-post', treeData)
|
|
241
|
-
* // Returns: { 'collection:blog': true, 'collection:blog/featured': true }
|
|
242
|
-
* ```
|
|
243
200
|
*/
|
|
244
201
|
export const calculatePathToEntry = (entryPath, treeData) => {
|
|
245
202
|
if (!entryPath)
|
|
246
203
|
return {};
|
|
247
204
|
const pathToExpand = {};
|
|
248
|
-
/**
|
|
249
|
-
* Recursive function to find entry and mark parent collections as expanded.
|
|
250
|
-
* @param nodes - Current level of tree nodes to search
|
|
251
|
-
* @param ancestors - Accumulated ancestor node values (collection IDs) from root to current position
|
|
252
|
-
* @returns true if the target entry was found in this subtree
|
|
253
|
-
*/
|
|
254
205
|
const findAndMarkPath = (nodes, ancestors) => {
|
|
255
206
|
for (const node of nodes) {
|
|
256
|
-
// Found the target entry
|
|
257
207
|
if (node.value === entryPath) {
|
|
258
|
-
// Mark all ancestors as expanded
|
|
259
208
|
for (const ancestor of ancestors) {
|
|
260
209
|
pathToExpand[ancestor] = true;
|
|
261
210
|
}
|
|
262
211
|
return true;
|
|
263
212
|
}
|
|
264
|
-
// Search children recursively if they exist
|
|
265
213
|
if (node.children && node.children.length > 0) {
|
|
266
214
|
const currentPath = [...ancestors, node.value];
|
|
267
215
|
const found = findAndMarkPath(node.children, currentPath);
|
|
268
216
|
if (found) {
|
|
269
|
-
// Mark this node as expanded since the target was found in its subtree
|
|
270
217
|
pathToExpand[node.value] = true;
|
|
271
218
|
return true;
|
|
272
219
|
}
|
|
@@ -4,7 +4,7 @@ export interface BlockInstance {
|
|
|
4
4
|
template: string;
|
|
5
5
|
value: Record<string, unknown>;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
type RenderField = (field: FieldConfig, value: unknown, onChange: (v: unknown) => void, path: Array<string | number>) => React.ReactNode;
|
|
8
8
|
export interface BlockFieldProps {
|
|
9
9
|
label?: string;
|
|
10
10
|
templates: BlockConfig[];
|
|
@@ -15,4 +15,4 @@ export interface BlockFieldProps {
|
|
|
15
15
|
dataCanopyField?: string;
|
|
16
16
|
}
|
|
17
17
|
export declare const BlockField: React.FC<BlockFieldProps>;
|
|
18
|
-
export
|
|
18
|
+
export {};
|
|
@@ -22,7 +22,7 @@ const SortableBlock = ({ id, children }) => {
|
|
|
22
22
|
export const BlockField = ({ label, templates, value, onChange, renderField, path, dataCanopyField, }) => {
|
|
23
23
|
const [itemKeys, setItemKeys] = useState(() => value.map(() => `block-${blockKeyCounter++}`));
|
|
24
24
|
const [pendingTemplate, setPendingTemplate] = useState(null);
|
|
25
|
-
//
|
|
25
|
+
// Keeps itemKeys in sync with value's length; setState runs directly in render, not an effect.
|
|
26
26
|
if (value.length > itemKeys.length) {
|
|
27
27
|
const extras = Array.from({ length: value.length - itemKeys.length }, () => `block-${blockKeyCounter++}`);
|
|
28
28
|
setItemKeys((prev) => [...prev, ...extras]);
|
|
@@ -83,4 +83,3 @@ export const BlockField = ({ label, templates, value, onChange, renderField, pat
|
|
|
83
83
|
}), [...currentPath, f.name]) }, f.name))) })) : (_jsxs(Text, { size: "xs", c: "red", children: ["No template found for \"", block.template, "\""] }))] }) }, itemKeys[idx]));
|
|
84
84
|
}) }) }) })] }) }));
|
|
85
85
|
};
|
|
86
|
-
export default BlockField;
|
|
@@ -7,4 +7,3 @@ export const CodeField = ({ id, label, value, onChange, language, dataCanopyFiel
|
|
|
7
7
|
const inputId = id ?? generatedId;
|
|
8
8
|
return (_jsx(Textarea, { id: inputId, label: label, value: value, onChange: (e) => onChange(e.currentTarget.value), placeholder: language ? `Code (${language})` : 'Code', autosize: true, minRows: 6, size: "sm", "data-canopy-field": dataCanopyField, styles: { input: { fontFamily: 'Menlo, Consolas, monospace' } } }));
|
|
9
9
|
};
|
|
10
|
-
export default CodeField;
|
|
@@ -7,39 +7,32 @@ export interface DateTimeFieldProps {
|
|
|
7
7
|
dataCanopyField?: string;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
* into the
|
|
12
|
-
* (`YYYY-MM-DDTHH:mm:ss`, no timezone). Returns '' for '' or an unparsable
|
|
13
|
-
*
|
|
10
|
+
* Converts a stored value (ISO 8601 UTC, e.g. `YYYY-MM-DDTHH:mm:ss.sssZ`)
|
|
11
|
+
* into the local wall-clock string a `datetime-local` input expects
|
|
12
|
+
* (`YYYY-MM-DDTHH:mm:ss`, no timezone). Returns '' for '' or an unparsable value.
|
|
13
|
+
* @internal Exported for tests.
|
|
14
14
|
*/
|
|
15
15
|
export declare function isoToDatetimeLocalValue(iso: string): string;
|
|
16
16
|
/**
|
|
17
17
|
* Convert a `datetime-local` input's local wall-clock string back into the
|
|
18
18
|
* ISO 8601 UTC storage format. Returns '' for '' or an unparsable value.
|
|
19
|
+
* @internal Exported for tests.
|
|
19
20
|
*/
|
|
20
21
|
export declare function datetimeLocalValueToIso(local: string): string;
|
|
21
22
|
/**
|
|
22
23
|
* Editor for `type: 'datetime'` fields.
|
|
23
24
|
*
|
|
24
|
-
* Storage format: ISO 8601 UTC string (e.g.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* Empty string means "not set" (matches entry-validator's empty-string
|
|
28
|
-
* check for required fields).
|
|
25
|
+
* Storage format: ISO 8601 UTC string (e.g. `YYYY-MM-DDTHH:mm:ss.sssZ`) — what
|
|
26
|
+
* `Date.prototype.toISOString()` produces and `validation/entry-validator.ts`'s
|
|
27
|
+
* datetime check (`Date.parse`) accepts. Empty string means "not set".
|
|
29
28
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* type="datetime-local">` wrapped in Mantine's `Input`/`Input.Wrapper`
|
|
33
|
-
* gives a real date+time picker with zero new dependencies.
|
|
29
|
+
* Uses a native `datetime-local` input in Mantine's `Input.Wrapper` rather than
|
|
30
|
+
* `@mantine/dates` (not a dependency here) — a real picker with zero new deps.
|
|
34
31
|
*
|
|
35
|
-
* `datetime-local` has no timezone
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* precision in the source data is not preserved (`datetime-local` has no
|
|
41
|
-
* milliseconds field), so a stored value with non-zero milliseconds will
|
|
42
|
-
* have them zeroed out once resaved.
|
|
32
|
+
* `datetime-local` has no timezone: converts UTC ISO -> local for display and
|
|
33
|
+
* back on change, so an unedited load-then-save round-trips exactly instead of
|
|
34
|
+
* drifting by the browser's offset. `step={1}` preserves seconds in that
|
|
35
|
+
* round-trip; sub-second precision is not preserved (no milliseconds field),
|
|
36
|
+
* so a value with non-zero milliseconds is zeroed out once resaved.
|
|
43
37
|
*/
|
|
44
38
|
export declare const DateTimeField: React.FC<DateTimeFieldProps>;
|
|
45
|
-
export default DateTimeField;
|