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
|
@@ -3,26 +3,6 @@ import { notifications } from '@mantine/notifications';
|
|
|
3
3
|
import { useApiClient } from '../context/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Custom hook for managing internal groups (CRUD operations).
|
|
6
|
-
*
|
|
7
|
-
* Handles:
|
|
8
|
-
* - Loading groups from API
|
|
9
|
-
* - Saving groups to API
|
|
10
|
-
* - Searching for users to add to groups
|
|
11
|
-
* - Searching for external groups
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```tsx
|
|
15
|
-
* const { groupsData, groupsLoading, handleSaveGroups, handleSearchUsers } = useGroupManager({
|
|
16
|
-
* isOpen: groupManagerOpen
|
|
17
|
-
* })
|
|
18
|
-
*
|
|
19
|
-
* // Groups are automatically loaded when isOpen becomes true
|
|
20
|
-
* // Save groups
|
|
21
|
-
* await handleSaveGroups(updatedGroups)
|
|
22
|
-
*
|
|
23
|
-
* // Search users
|
|
24
|
-
* const users = await handleSearchUsers('john', 10)
|
|
25
|
-
* ```
|
|
26
6
|
*/
|
|
27
7
|
export function useGroupManager(options) {
|
|
28
8
|
const apiClient = useApiClient();
|
|
@@ -114,7 +94,6 @@ export function useGroupManager(options) {
|
|
|
114
94
|
return [];
|
|
115
95
|
}
|
|
116
96
|
}, []);
|
|
117
|
-
// Load groups when group manager opens
|
|
118
97
|
useEffect(() => {
|
|
119
98
|
if (options.isOpen) {
|
|
120
99
|
loadGroups();
|
|
@@ -2,7 +2,6 @@ import type { PathPermission } from '../../config/index.js';
|
|
|
2
2
|
import type { PermissionGroupOption } from '../../auth/types.js';
|
|
3
3
|
export interface UsePermissionManagerOptions {
|
|
4
4
|
/**
|
|
5
|
-
* Whether the permission manager is currently open.
|
|
6
5
|
* Permissions are loaded when this becomes true.
|
|
7
6
|
*/
|
|
8
7
|
isOpen: boolean;
|
|
@@ -16,24 +15,5 @@ export interface UsePermissionManagerReturn {
|
|
|
16
15
|
}
|
|
17
16
|
/**
|
|
18
17
|
* Custom hook for managing path permissions (CRUD operations).
|
|
19
|
-
*
|
|
20
|
-
* Handles:
|
|
21
|
-
* - Loading permissions from API
|
|
22
|
-
* - Saving permissions to API
|
|
23
|
-
* - Listing groups for permission assignment
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```tsx
|
|
27
|
-
* const { permissionsData, permissionsLoading, handleSavePermissions, handleListGroups } = usePermissionManager({
|
|
28
|
-
* isOpen: permissionManagerOpen
|
|
29
|
-
* })
|
|
30
|
-
*
|
|
31
|
-
* // Permissions are automatically loaded when isOpen becomes true
|
|
32
|
-
* // Save permissions
|
|
33
|
-
* await handleSavePermissions(updatedPermissions)
|
|
34
|
-
*
|
|
35
|
-
* // List groups
|
|
36
|
-
* const groups = await handleListGroups()
|
|
37
|
-
* ```
|
|
38
18
|
*/
|
|
39
19
|
export declare function usePermissionManager(options: UsePermissionManagerOptions): UsePermissionManagerReturn;
|
|
@@ -3,25 +3,6 @@ import { notifications } from '@mantine/notifications';
|
|
|
3
3
|
import { useApiClient } from '../context/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Custom hook for managing path permissions (CRUD operations).
|
|
6
|
-
*
|
|
7
|
-
* Handles:
|
|
8
|
-
* - Loading permissions from API
|
|
9
|
-
* - Saving permissions to API
|
|
10
|
-
* - Listing groups for permission assignment
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```tsx
|
|
14
|
-
* const { permissionsData, permissionsLoading, handleSavePermissions, handleListGroups } = usePermissionManager({
|
|
15
|
-
* isOpen: permissionManagerOpen
|
|
16
|
-
* })
|
|
17
|
-
*
|
|
18
|
-
* // Permissions are automatically loaded when isOpen becomes true
|
|
19
|
-
* // Save permissions
|
|
20
|
-
* await handleSavePermissions(updatedPermissions)
|
|
21
|
-
*
|
|
22
|
-
* // List groups
|
|
23
|
-
* const groups = await handleListGroups()
|
|
24
|
-
* ```
|
|
25
6
|
*/
|
|
26
7
|
export function usePermissionManager(options) {
|
|
27
8
|
const apiClient = useApiClient();
|
|
@@ -90,7 +71,6 @@ export function usePermissionManager(options) {
|
|
|
90
71
|
}
|
|
91
72
|
return result.data?.groups ?? [];
|
|
92
73
|
};
|
|
93
|
-
// Load permissions when permission manager opens
|
|
94
74
|
useEffect(() => {
|
|
95
75
|
if (options.isOpen) {
|
|
96
76
|
loadPermissions();
|
|
@@ -1,37 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hook for live preview reference resolution
|
|
3
|
-
*
|
|
4
|
-
* LIVE PREVIEW REFERENCE RESOLUTION
|
|
5
|
-
*
|
|
6
|
-
* Problem: The preview needs full referenced content (e.g., {name: "Alice", bio: "..."}),
|
|
7
|
-
* but the form only stores IDs (e.g., "5NVkkrB1MJUvnLqEDqDkRN").
|
|
8
|
-
*
|
|
9
|
-
* Solution: Synchronous resolution with background caching
|
|
10
|
-
*
|
|
11
|
-
* 1. SYNCHRONOUS PHASE (useMemo):
|
|
12
|
-
* - Compute resolvedValue by applying cached data to form value
|
|
13
|
-
* - If reference ID is in cache, use full object; otherwise keep ID
|
|
14
|
-
* - Runs during render, so no async gaps or race conditions
|
|
15
|
-
* - Preview always gets complete, valid data
|
|
16
|
-
*
|
|
17
|
-
* 2. BACKGROUND PHASE (useEffect):
|
|
18
|
-
* - Find IDs not in cache
|
|
19
|
-
* - After 300ms debounce, fetch from API
|
|
20
|
-
* - Update cache with resolved data
|
|
21
|
-
* - Trigger useMemo re-run via resolutionTrigger
|
|
22
|
-
* - Preview updates again with full data
|
|
23
|
-
*
|
|
24
|
-
* This two-phase approach eliminates race conditions that occurred with async state,
|
|
25
|
-
* where form data and resolved data could get out of sync during transitions
|
|
26
|
-
* (e.g., "Discard All Drafts" was passing empty objects to preview).
|
|
27
|
-
*
|
|
28
|
-
* Cache structure: Map<string, unknown> with keys like "main:5NVkkrB1MJUvnLqEDqDkRN"
|
|
29
|
-
* - Branch-scoped to prevent stale cross-branch data
|
|
30
|
-
* - Cleared on branch change
|
|
31
|
-
* - Persists across edits for instant re-renders
|
|
32
|
-
*/
|
|
33
1
|
import type { EntrySchema } from '../../config/index.js';
|
|
34
|
-
|
|
2
|
+
type FormValue = Record<string, unknown>;
|
|
35
3
|
export interface UseReferenceResolutionOptions {
|
|
36
4
|
value: FormValue;
|
|
37
5
|
fields: EntrySchema;
|
|
@@ -44,3 +12,4 @@ export interface UseReferenceResolutionResult {
|
|
|
44
12
|
loadingState: FormValue;
|
|
45
13
|
}
|
|
46
14
|
export declare function useReferenceResolution({ value, fields, branch, onResolvedValueChange, onLoadingStateChange, }: UseReferenceResolutionOptions): UseReferenceResolutionResult;
|
|
15
|
+
export {};
|
|
@@ -1,35 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hook for live preview reference resolution
|
|
3
|
-
*
|
|
4
|
-
* LIVE PREVIEW REFERENCE RESOLUTION
|
|
5
|
-
*
|
|
6
|
-
* Problem: The preview needs full referenced content (e.g., {name: "Alice", bio: "..."}),
|
|
7
|
-
* but the form only stores IDs (e.g., "5NVkkrB1MJUvnLqEDqDkRN").
|
|
8
|
-
*
|
|
9
|
-
* Solution: Synchronous resolution with background caching
|
|
10
|
-
*
|
|
11
|
-
* 1. SYNCHRONOUS PHASE (useMemo):
|
|
12
|
-
* - Compute resolvedValue by applying cached data to form value
|
|
13
|
-
* - If reference ID is in cache, use full object; otherwise keep ID
|
|
14
|
-
* - Runs during render, so no async gaps or race conditions
|
|
15
|
-
* - Preview always gets complete, valid data
|
|
16
|
-
*
|
|
17
|
-
* 2. BACKGROUND PHASE (useEffect):
|
|
18
|
-
* - Find IDs not in cache
|
|
19
|
-
* - After 300ms debounce, fetch from API
|
|
20
|
-
* - Update cache with resolved data
|
|
21
|
-
* - Trigger useMemo re-run via resolutionTrigger
|
|
22
|
-
* - Preview updates again with full data
|
|
23
|
-
*
|
|
24
|
-
* This two-phase approach eliminates race conditions that occurred with async state,
|
|
25
|
-
* where form data and resolved data could get out of sync during transitions
|
|
26
|
-
* (e.g., "Discard All Drafts" was passing empty objects to preview).
|
|
27
|
-
*
|
|
28
|
-
* Cache structure: Map<string, unknown> with keys like "main:5NVkkrB1MJUvnLqEDqDkRN"
|
|
29
|
-
* - Branch-scoped to prevent stale cross-branch data
|
|
30
|
-
* - Cleared on branch change
|
|
31
|
-
* - Persists across edits for instant re-renders
|
|
32
|
-
*/
|
|
33
1
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
34
2
|
import { resolveChangedReferences } from '../client-reference-resolver.js';
|
|
35
3
|
import { flattenGroupFields } from '../../utils/flatten-group-fields.js';
|
|
@@ -52,7 +20,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
52
20
|
// clearTimeout can't: a newer value/branch superseding this attempt, or
|
|
53
21
|
// the component unmounting, while the network call was in flight.
|
|
54
22
|
const resolveGenerationRef = useRef(0);
|
|
55
|
-
// Map field names to their types for fast lookup
|
|
56
23
|
const referenceFieldNames = useMemo(() => {
|
|
57
24
|
const names = new Set();
|
|
58
25
|
for (const field of flattenGroupFields(fields)) {
|
|
@@ -77,25 +44,20 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
77
44
|
*/
|
|
78
45
|
const resolvedValue = useMemo(() => {
|
|
79
46
|
const result = { ...value };
|
|
80
|
-
// Synchronously apply cached resolutions
|
|
81
47
|
for (const fieldName of referenceFieldNames) {
|
|
82
48
|
const fieldValue = value[fieldName];
|
|
83
49
|
if (fieldValue) {
|
|
84
50
|
if (Array.isArray(fieldValue)) {
|
|
85
|
-
// List of references
|
|
86
51
|
result[fieldName] = fieldValue.map((id) => {
|
|
87
52
|
if (typeof id === 'string') {
|
|
88
53
|
const cached = resolvedCache.current.get(`${branch}:${id}`);
|
|
89
|
-
// Return cached object, or null if not yet resolved
|
|
90
54
|
return cached || null;
|
|
91
55
|
}
|
|
92
56
|
return id;
|
|
93
57
|
});
|
|
94
58
|
}
|
|
95
59
|
else if (typeof fieldValue === 'string') {
|
|
96
|
-
// Single reference
|
|
97
60
|
const cached = resolvedCache.current.get(`${branch}:${fieldValue}`);
|
|
98
|
-
// Return cached object, or null if not yet resolved
|
|
99
61
|
result[fieldName] = cached || null;
|
|
100
62
|
}
|
|
101
63
|
}
|
|
@@ -112,7 +74,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
112
74
|
const fieldValue = value[fieldName];
|
|
113
75
|
if (fieldValue) {
|
|
114
76
|
if (Array.isArray(fieldValue)) {
|
|
115
|
-
// List of references - return array of booleans
|
|
116
77
|
result[fieldName] = fieldValue.map((id) => {
|
|
117
78
|
if (typeof id === 'string') {
|
|
118
79
|
return !resolvedCache.current.has(`${branch}:${id}`);
|
|
@@ -121,7 +82,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
121
82
|
});
|
|
122
83
|
}
|
|
123
84
|
else if (typeof fieldValue === 'string') {
|
|
124
|
-
// Single reference - return boolean
|
|
125
85
|
result[fieldName] = !resolvedCache.current.has(`${branch}:${fieldValue}`);
|
|
126
86
|
}
|
|
127
87
|
else {
|
|
@@ -140,7 +100,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
140
100
|
* Find reference IDs that aren't in cache yet and fetch them from the API.
|
|
141
101
|
*/
|
|
142
102
|
useEffect(() => {
|
|
143
|
-
// Find all uncached reference IDs
|
|
144
103
|
const uncachedIds = new Set();
|
|
145
104
|
for (const fieldName of referenceFieldNames) {
|
|
146
105
|
const fieldValue = value[fieldName];
|
|
@@ -162,16 +121,13 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
162
121
|
// moment THIS attempt was scheduled -- not whatever the ref happens to
|
|
163
122
|
// hold when the callback resumes after its await.
|
|
164
123
|
const generation = ++resolveGenerationRef.current;
|
|
165
|
-
// Debounce API calls to batch multiple rapid changes
|
|
166
124
|
const timeout = setTimeout(async () => {
|
|
167
125
|
try {
|
|
168
|
-
// Resolve uncached IDs via API
|
|
169
126
|
const updates = await resolveChangedReferences(prevValueRef.current, value, fields, branch, resolvedCache.current, apiClient ?? undefined);
|
|
170
127
|
// A newer value/branch superseded this attempt, or the component
|
|
171
128
|
// unmounted, while the request above was in flight -- discard.
|
|
172
129
|
if (generation !== resolveGenerationRef.current)
|
|
173
130
|
return;
|
|
174
|
-
// Update cache with resolved values
|
|
175
131
|
for (const [fieldName, resolvedFieldValue] of Object.entries(updates)) {
|
|
176
132
|
if (Array.isArray(resolvedFieldValue)) {
|
|
177
133
|
resolvedFieldValue.forEach((obj, idx) => {
|
|
@@ -191,7 +147,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
191
147
|
}
|
|
192
148
|
}
|
|
193
149
|
}
|
|
194
|
-
// Trigger useMemo re-computation
|
|
195
150
|
setResolutionTrigger((prev) => prev + 1);
|
|
196
151
|
prevValueRef.current = value;
|
|
197
152
|
}
|
|
@@ -207,10 +162,9 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
207
162
|
++resolveGenerationRef.current;
|
|
208
163
|
};
|
|
209
164
|
}, [value, fields, branch, referenceFieldNames, apiClient]);
|
|
210
|
-
// Clear cache when branch changes
|
|
211
165
|
useEffect(() => {
|
|
212
166
|
resolvedCache.current.clear();
|
|
213
|
-
setResolutionTrigger((prev) => prev + 1);
|
|
167
|
+
setResolutionTrigger((prev) => prev + 1);
|
|
214
168
|
}, [branch]);
|
|
215
169
|
// Notify parent of resolved value changes (with infinite loop prevention)
|
|
216
170
|
useEffect(() => {
|
|
@@ -220,7 +174,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
|
|
|
220
174
|
onResolvedValueChange?.(resolvedValue);
|
|
221
175
|
}
|
|
222
176
|
}, [resolvedValue, onResolvedValueChange]);
|
|
223
|
-
// Notify parent of loading state changes
|
|
224
177
|
const lastNotifiedLoadingRef = useRef('');
|
|
225
178
|
useEffect(() => {
|
|
226
179
|
const serialized = JSON.stringify(loadingState);
|
|
@@ -6,13 +6,12 @@ export interface UseSchemaManagerOptions {
|
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* Result of a schema mutation that has no success payload. Callers branch on
|
|
9
|
-
* `ok` to get a real error message instead of a bare `false`/`null
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* into unhandled rejections.
|
|
9
|
+
* `ok` to get a real error message instead of a bare `false`/`null`: every
|
|
10
|
+
* operation returns a result object rather than throwing, so a failure is
|
|
11
|
+
* surfaced per call site instead of collapsing into one generic toast.
|
|
12
|
+
* Result objects (rather than rethrowing) also keep fire-and-forget call
|
|
13
|
+
* sites (e.g. `updateOrder` from a reorder click) compiling without turning
|
|
14
|
+
* them into unhandled rejections.
|
|
16
15
|
*/
|
|
17
16
|
export type SchemaOpResult = {
|
|
18
17
|
ok: true;
|
|
@@ -21,7 +20,7 @@ export type SchemaOpResult = {
|
|
|
21
20
|
error: string;
|
|
22
21
|
};
|
|
23
22
|
/** Same shape as {@link SchemaOpResult}, plus a payload on success. */
|
|
24
|
-
|
|
23
|
+
type CreateCollectionResult = {
|
|
25
24
|
ok: true;
|
|
26
25
|
data: {
|
|
27
26
|
collectionPath: LogicalPath;
|
|
@@ -45,25 +44,7 @@ export interface UseSchemaManagerReturn {
|
|
|
45
44
|
/**
|
|
46
45
|
* Hook for managing schema operations (collections, entry types, ordering).
|
|
47
46
|
*
|
|
48
|
-
* Provides methods to create, update, and delete collections and entry types.
|
|
49
47
|
* All operations require admin permissions on the server.
|
|
50
|
-
*
|
|
51
|
-
* @example
|
|
52
|
-
* ```tsx
|
|
53
|
-
* const {
|
|
54
|
-
* createCollection,
|
|
55
|
-
* deleteCollection,
|
|
56
|
-
* addEntryType,
|
|
57
|
-
* updateOrder,
|
|
58
|
-
* isLoading
|
|
59
|
-
* } = useSchemaManager({ branchName: 'main', onSchemaChange: refreshEntries })
|
|
60
|
-
*
|
|
61
|
-
* // Create a new collection
|
|
62
|
-
* await createCollection({
|
|
63
|
-
* name: 'posts',
|
|
64
|
-
* label: 'Blog Posts',
|
|
65
|
-
* entries: [{ name: 'post', format: 'mdx', schema: 'postSchema' }]
|
|
66
|
-
* })
|
|
67
|
-
* ```
|
|
68
48
|
*/
|
|
69
49
|
export declare function useSchemaManager(options: UseSchemaManagerOptions): UseSchemaManagerReturn;
|
|
50
|
+
export {};
|
|
@@ -5,26 +5,7 @@ import { getErrorMessage } from '../../utils/error.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* Hook for managing schema operations (collections, entry types, ordering).
|
|
7
7
|
*
|
|
8
|
-
* Provides methods to create, update, and delete collections and entry types.
|
|
9
8
|
* All operations require admin permissions on the server.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```tsx
|
|
13
|
-
* const {
|
|
14
|
-
* createCollection,
|
|
15
|
-
* deleteCollection,
|
|
16
|
-
* addEntryType,
|
|
17
|
-
* updateOrder,
|
|
18
|
-
* isLoading
|
|
19
|
-
* } = useSchemaManager({ branchName: 'main', onSchemaChange: refreshEntries })
|
|
20
|
-
*
|
|
21
|
-
* // Create a new collection
|
|
22
|
-
* await createCollection({
|
|
23
|
-
* name: 'posts',
|
|
24
|
-
* label: 'Blog Posts',
|
|
25
|
-
* entries: [{ name: 'post', format: 'mdx', schema: 'postSchema' }]
|
|
26
|
-
* })
|
|
27
|
-
* ```
|
|
28
9
|
*/
|
|
29
10
|
export function useSchemaManager(options) {
|
|
30
11
|
const apiClient = useApiClient();
|
|
@@ -8,14 +8,7 @@ export interface UseUserContextReturn {
|
|
|
8
8
|
* Hook to fetch current user context from the API.
|
|
9
9
|
* This provides the userId and groups needed for permission checks.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* const { userContext, loading, error } = useUserContext()
|
|
14
|
-
*
|
|
15
|
-
* if (loading) return <div>Loading...</div>
|
|
16
|
-
* if (error) return <div>Error: {error}</div>
|
|
17
|
-
*
|
|
18
|
-
* return <BranchManager user={userContext} />
|
|
19
|
-
* ```
|
|
11
|
+
* Inside an `EditorAuthGate` (always, under `CanopyEditor`) it returns the identity the gate
|
|
12
|
+
* already resolved and issues no request of its own. Outside one it fetches `whoami` itself.
|
|
20
13
|
*/
|
|
21
14
|
export declare function useUserContext(): UseUserContextReturn;
|
|
@@ -2,21 +2,16 @@
|
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
3
|
import { createApiClient } from '../../api/index.js';
|
|
4
4
|
import { useOptionalApiClient } from '../context/index.js';
|
|
5
|
+
import { useEditorIdentity } from '../context/EditorIdentityContext.js';
|
|
5
6
|
/**
|
|
6
7
|
* Hook to fetch current user context from the API.
|
|
7
8
|
* This provides the userId and groups needed for permission checks.
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* const { userContext, loading, error } = useUserContext()
|
|
12
|
-
*
|
|
13
|
-
* if (loading) return <div>Loading...</div>
|
|
14
|
-
* if (error) return <div>Error: {error}</div>
|
|
15
|
-
*
|
|
16
|
-
* return <BranchManager user={userContext} />
|
|
17
|
-
* ```
|
|
10
|
+
* Inside an `EditorAuthGate` (always, under `CanopyEditor`) it returns the identity the gate
|
|
11
|
+
* already resolved and issues no request of its own. Outside one it fetches `whoami` itself.
|
|
18
12
|
*/
|
|
19
13
|
export function useUserContext() {
|
|
14
|
+
const gateIdentity = useEditorIdentity();
|
|
20
15
|
const [userContext, setUserContext] = useState();
|
|
21
16
|
const [loading, setLoading] = useState(true);
|
|
22
17
|
const [error, setError] = useState();
|
|
@@ -26,6 +21,8 @@ export function useUserContext() {
|
|
|
26
21
|
// which case we fall back to a default-configured client below.
|
|
27
22
|
const contextApiClient = useOptionalApiClient();
|
|
28
23
|
useEffect(() => {
|
|
24
|
+
if (gateIdentity)
|
|
25
|
+
return;
|
|
29
26
|
const fetchUserContext = async () => {
|
|
30
27
|
setLoading(true);
|
|
31
28
|
try {
|
|
@@ -50,6 +47,9 @@ export function useUserContext() {
|
|
|
50
47
|
}
|
|
51
48
|
};
|
|
52
49
|
fetchUserContext();
|
|
53
|
-
}, [contextApiClient]);
|
|
50
|
+
}, [contextApiClient, gateIdentity]);
|
|
51
|
+
if (gateIdentity) {
|
|
52
|
+
return { userContext: gateIdentity.user, loading: false, error: undefined };
|
|
53
|
+
}
|
|
54
54
|
return { userContext, loading, error };
|
|
55
55
|
}
|
|
@@ -8,8 +8,6 @@ export interface UseUserMetadataResult {
|
|
|
8
8
|
/**
|
|
9
9
|
* Fetches user metadata using the provided getter function.
|
|
10
10
|
*
|
|
11
|
-
* @param userId - User ID to fetch metadata for
|
|
12
|
-
* @param getUserMetadata - Function to fetch user metadata
|
|
13
11
|
* @param cachedUser - Optional: if provided, returns immediately without fetching
|
|
14
12
|
*/
|
|
15
13
|
export declare function useUserMetadata(userId: CanopyUserId, getUserMetadata: (userId: string) => Promise<UserSearchResult | null>, cachedUser?: UserSearchResult): UseUserMetadataResult;
|
|
@@ -2,8 +2,6 @@ import { useEffect, useState } from 'react';
|
|
|
2
2
|
/**
|
|
3
3
|
* Fetches user metadata using the provided getter function.
|
|
4
4
|
*
|
|
5
|
-
* @param userId - User ID to fetch metadata for
|
|
6
|
-
* @param getUserMetadata - Function to fetch user metadata
|
|
7
5
|
* @param cachedUser - Optional: if provided, returns immediately without fetching
|
|
8
6
|
*/
|
|
9
7
|
export function useUserMetadata(userId, getUserMetadata, cachedUser) {
|
|
@@ -11,7 +9,6 @@ export function useUserMetadata(userId, getUserMetadata, cachedUser) {
|
|
|
11
9
|
const [isLoading, setIsLoading] = useState(!cachedUser);
|
|
12
10
|
const [error, setError] = useState(null);
|
|
13
11
|
useEffect(() => {
|
|
14
|
-
// Skip fetch if cachedUser provided
|
|
15
12
|
if (cachedUser)
|
|
16
13
|
return;
|
|
17
14
|
// Special case: anonymous user
|
|
@@ -17,7 +17,7 @@ export const AssetCard = ({ asset, baseUrl, onSelect, onDelete }) => {
|
|
|
17
17
|
const thumbnailSrc = assetUrl(asset, { width: THUMBNAIL_WIDTH, baseUrl });
|
|
18
18
|
const [thumbnailFailed, setThumbnailFailed] = useState(false);
|
|
19
19
|
// Reset the error state if the underlying asset/src changes, so a
|
|
20
|
-
//
|
|
20
|
+
// thumbnail that failed earlier gets another chance to load. Adjusting state
|
|
21
21
|
// during render (rather than in a useEffect) avoids an extra render pass -
|
|
22
22
|
// see https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes
|
|
23
23
|
const [prevThumbnailSrc, setPrevThumbnailSrc] = useState(thumbnailSrc);
|
|
@@ -58,4 +58,3 @@ export const AssetCard = ({ asset, baseUrl, onSelect, onDelete }) => {
|
|
|
58
58
|
background: 'var(--mantine-color-gray-1)',
|
|
59
59
|
}, children: [_jsx(IconPhotoOff, { size: 28, stroke: 1.5, color: "var(--mantine-color-gray-5)" }), _jsx(Text, { size: "xs", c: "dimmed", children: "Preview unavailable" })] })) : (_jsx("img", { src: thumbnailSrc, alt: asset.filename, style: { width: '100%', height: 100, objectFit: 'cover', display: 'block' }, onError: () => setThumbnailFailed(true) })) }), _jsx(Tooltip, { label: asset.filename, openDelay: 400, children: _jsx(Text, { size: "xs", fw: 500, truncate: true, mt: 4, children: asset.slug }) }), _jsx(Text, { size: "xs", c: "dimmed", children: uploadedDate })] }));
|
|
60
60
|
};
|
|
61
|
-
export default AssetCard;
|
|
@@ -34,4 +34,3 @@ const CropStepBody = ({ imageSrc, aspect, initialCrop, onConfirm, onClose, }) =>
|
|
|
34
34
|
const initialCroppedAreaPercentages = initialCrop ? cropRectToAreaPercent(initialCrop) : undefined;
|
|
35
35
|
return (_jsxs(Stack, { gap: "md", children: [_jsx("div", { style: { position: 'relative', width: '100%', height: 360, background: '#000' }, children: _jsx(Cropper, { image: imageSrc, crop: crop, zoom: zoom, aspect: aspect, initialCroppedAreaPercentages: initialCroppedAreaPercentages, onCropChange: setCrop, onZoomChange: setZoom, onCropComplete: (croppedArea) => setPendingArea(croppedArea) }) }), _jsxs(Group, { gap: "sm", align: "center", children: [_jsx(Text, { size: "sm", w: 50, children: "Zoom" }), _jsx(Slider, { style: { flex: 1 }, min: MIN_ZOOM, max: MAX_ZOOM, step: ZOOM_STEP, value: zoom, onChange: setZoom, label: (value) => `${value.toFixed(2)}x` })] }), _jsxs(Group, { justify: "flex-end", children: [_jsx(Button, { variant: "default", onClick: onClose, children: "Cancel" }), _jsx(Button, { onClick: handleConfirm, disabled: !pendingArea, "data-testid": "crop-step-apply", children: "Apply crop" })] })] }));
|
|
36
36
|
};
|
|
37
|
-
export default CropStep;
|
|
@@ -15,7 +15,6 @@ export interface MediaLibraryProps {
|
|
|
15
15
|
/**
|
|
16
16
|
* One component, two presentations, sharing the same grid/upload/filter/
|
|
17
17
|
* pagination/delete core (MediaLibraryBody) - see
|
|
18
|
-
* .claude/future-tasks/assets-media-system.md "MediaManager design".
|
|
18
|
+
* .claude/future-tasks/resolved/assets-media-system.md "MediaManager design".
|
|
19
19
|
*/
|
|
20
20
|
export declare const MediaLibrary: React.FC<MediaLibraryProps>;
|
|
21
|
-
export default MediaLibrary;
|
|
@@ -5,7 +5,7 @@ import { MediaLibraryBody } from './MediaLibraryBody.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* One component, two presentations, sharing the same grid/upload/filter/
|
|
7
7
|
* pagination/delete core (MediaLibraryBody) - see
|
|
8
|
-
* .claude/future-tasks/assets-media-system.md "MediaManager design".
|
|
8
|
+
* .claude/future-tasks/resolved/assets-media-system.md "MediaManager design".
|
|
9
9
|
*/
|
|
10
10
|
export const MediaLibrary = ({ opened, onClose, mode, onSelect }) => {
|
|
11
11
|
if (mode === 'picker') {
|
|
@@ -13,4 +13,3 @@ export const MediaLibrary = ({ opened, onClose, mode, onSelect }) => {
|
|
|
13
13
|
}
|
|
14
14
|
return (_jsx(Drawer, { opened: opened, onClose: onClose, position: "right", title: _jsxs("div", { children: [_jsx(Title, { order: 4, children: "Media library" }), _jsx(Text, { size: "xs", c: "dimmed", children: "Upload and manage images and PDFs" })] }), padding: "md", size: 700, overlayProps: { blur: 2 }, "data-testid": "media-library-manage", children: _jsx(MediaLibraryBody, { opened: opened, mode: "manage" }) }));
|
|
15
15
|
};
|
|
16
|
-
export default MediaLibrary;
|
|
@@ -139,4 +139,3 @@ export const MediaLibraryBody = ({ opened, mode, onSelect }) => {
|
|
|
139
139
|
: 'Drop an image or PDF here, or click to browse' })] }) }), upload.uploading &&
|
|
140
140
|
(upload.progress !== null ? (_jsx(Progress, { value: upload.progress * 100, size: "sm", "data-testid": "upload-progress" })) : (_jsx(Progress, { value: 100, size: "sm", animated: true, "data-testid": "upload-progress-indeterminate" }))), upload.error && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "red", "data-testid": "upload-error", children: upload.error })), _jsx(TextInput, { placeholder: "Filter by filename...", value: filterText, onChange: (event) => setFilterText(event.currentTarget.value), "data-testid": "media-library-filter" }), listError && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "red", "data-testid": "media-library-error", children: _jsxs(Stack, { gap: 4, children: [_jsx(Text, { size: "sm", children: listError }), _jsx(Button, { size: "xs", variant: "light", onClick: () => void loadFirstPage(), children: "Retry" })] }) })), _jsxs(ScrollArea, { style: { flex: 1 }, children: [loading ? (_jsx(Group, { justify: "center", py: "xl", children: _jsx(Loader, { size: "sm", "data-testid": "media-library-loading" }) })) : filteredAssets.length === 0 ? (_jsx(Text, { size: "sm", c: "dimmed", py: "xl", ta: "center", children: "No assets found." })) : (_jsx(SimpleGrid, { cols: { base: 2, sm: 3, md: 4 }, spacing: "sm", children: filteredAssets.map((asset) => (_jsx(AssetCard, { asset: asset, baseUrl: baseUrl, onSelect: mode === 'picker' ? onSelect : undefined, onDelete: canDeleteAsset(asset) ? () => handleDeleteClick(asset) : undefined }, asset.hash32))) })), !loading && nextCursor && (_jsx(Group, { justify: "center", py: "sm", children: _jsx(Button, { variant: "light", size: "xs", loading: loadingMore, onClick: () => void handleLoadMore(), "data-testid": "media-library-load-more", children: "Load more" }) }))] })] }));
|
|
141
141
|
};
|
|
142
|
-
export default MediaLibraryBody;
|
|
@@ -26,7 +26,7 @@ export interface CropAreaPercent {
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function cropAreaPercentToRect(area: CropAreaPercent): CropRect | null;
|
|
28
28
|
/**
|
|
29
|
-
* Inverse of `cropAreaPercentToRect` -
|
|
29
|
+
* Inverse of `cropAreaPercentToRect` - seeds react-easy-crop's
|
|
30
30
|
* `initialCroppedAreaPercentages` when re-opening the crop step for an
|
|
31
31
|
* already-cropped image, so the user sees their previous selection instead
|
|
32
32
|
* of starting over.
|
|
@@ -42,7 +42,7 @@ export function cropAreaPercentToRect(area) {
|
|
|
42
42
|
return { x, y, w, h };
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* Inverse of `cropAreaPercentToRect` -
|
|
45
|
+
* Inverse of `cropAreaPercentToRect` - seeds react-easy-crop's
|
|
46
46
|
* `initialCroppedAreaPercentages` when re-opening the crop step for an
|
|
47
47
|
* already-cropped image, so the user sees their previous selection instead
|
|
48
48
|
* of starting over.
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Permission editor panel for a selected tree node.
|
|
3
|
-
* Handles permission CRUD with tabs for each level.
|
|
4
|
-
*/
|
|
5
1
|
import React from 'react';
|
|
6
2
|
import type { TreeNode, PermissionLevel, GroupSelectItem, UserSearchResult } from './types.js';
|
|
7
3
|
export interface PermissionEditorProps {
|
|
@@ -9,7 +9,6 @@ import { UserBadge } from '../components/UserBadge.js';
|
|
|
9
9
|
export const PermissionEditor = ({ node, activeLevel, onSetActiveLevel, canEdit, groups, isSelected, userSearchResults, isSearchingUsers, showUserSearch, userSearchQuery, userSearchError, onSearchUsers, onGetUserMetadata, onToggleUserSearch, onAddUser, onRemoveUser, showGroupSearch, groupSearchQuery, filteredGroups, onSearchGroups, onToggleGroupSearch, onAddGroup, onRemoveGroup, }) => {
|
|
10
10
|
const directPerm = node.directPermission;
|
|
11
11
|
const inheritedPerm = node.inheritedPermission;
|
|
12
|
-
// Get permission target for a level (from direct or inherited)
|
|
13
12
|
const getTargetForLevel = (level, source) => {
|
|
14
13
|
const perm = source === 'direct' ? directPerm : inheritedPerm;
|
|
15
14
|
return perm?.[level];
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Badge component for displaying permission levels
|
|
3
|
-
*/
|
|
4
1
|
import React from 'react';
|
|
5
2
|
import type { PermissionLevel, PermissionTarget } from './types.js';
|
|
6
3
|
export interface PermissionLevelBadgeProps {
|
|
@@ -8,8 +5,4 @@ export interface PermissionLevelBadgeProps {
|
|
|
8
5
|
target?: PermissionTarget;
|
|
9
6
|
inherited?: PermissionTarget;
|
|
10
7
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Displays a badge for a permission level.
|
|
13
|
-
* Shows filled badge for direct permissions, outlined for inherited.
|
|
14
|
-
*/
|
|
15
8
|
export declare const PermissionLevelBadge: React.FC<PermissionLevelBadgeProps>;
|
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { Badge, Tooltip } from '@mantine/core';
|
|
4
4
|
import { LEVEL_CONFIG } from './constants.js';
|
|
5
|
-
/**
|
|
6
|
-
* Displays a badge for a permission level.
|
|
7
|
-
* Shows filled badge for direct permissions, outlined for inherited.
|
|
8
|
-
*/
|
|
9
5
|
export const PermissionLevelBadge = ({ level, target, inherited, }) => {
|
|
10
6
|
const hasPerms = target && ((target.allowedUsers?.length ?? 0) > 0 || (target.allowedGroups?.length ?? 0) > 0);
|
|
11
7
|
const hasInherited = !hasPerms &&
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree visualization component for permission management.
|
|
3
|
-
* Renders the content tree with permission badges and handles selection.
|
|
4
|
-
*/
|
|
5
1
|
import React from 'react';
|
|
6
2
|
import type { TreeNode, PermissionLevel, PermissionTarget, GroupSelectItem, UserSearchResult } from './types.js';
|
|
7
3
|
export interface PermissionTreeProps {
|