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,7 +3,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Alert, Group, Loader, Paper, ScrollArea, Stack, Text, TextInput } from '@mantine/core';
|
|
4
4
|
import { IconAlertCircle, IconBuilding, IconSearch } from '@tabler/icons-react';
|
|
5
5
|
export const ExternalGroupsTab = ({ canEdit, searchQuery, searchResults, isSearching, searchError, onSearchQueryChange, canSearch, }) => {
|
|
6
|
-
// Read-only view (when !canEdit)
|
|
7
6
|
if (!canEdit) {
|
|
8
7
|
return (_jsx("div", { style: {
|
|
9
8
|
flex: 1,
|
|
@@ -4,7 +4,6 @@ import { Button, Group, Paper, ScrollArea, Stack, Text } from '@mantine/core';
|
|
|
4
4
|
import { IconPlus, IconUsers } from '@tabler/icons-react';
|
|
5
5
|
import { GroupCard } from './GroupCard.js';
|
|
6
6
|
export const InternalGroupsTab = ({ groups, canEdit, onCreateGroup, onEditGroup, onDeleteGroup, onAddMember, onRemoveMember, onGetUserMetadata, activeSearchGroupId, searchQuery, searchResults, isSearching, searchError, onSearchQueryChange, onShowSearch, onHideSearch, canSearch, }) => {
|
|
7
|
-
// Read-only view
|
|
8
7
|
if (!canEdit) {
|
|
9
8
|
return (_jsx("div", { style: {
|
|
10
9
|
flex: 1,
|
|
@@ -12,6 +11,5 @@ export const InternalGroupsTab = ({ groups, canEdit, onCreateGroup, onEditGroup,
|
|
|
12
11
|
paddingTop: 'var(--mantine-spacing-md)',
|
|
13
12
|
}, children: groups.length === 0 ? (_jsxs(Paper, { withBorder: true, p: "md", style: { textAlign: 'center' }, children: [_jsx(IconUsers, { size: 32, color: "gray", style: { margin: '0 auto', marginBottom: 8 } }), _jsx(Text, { size: "sm", c: "dimmed", children: "No internal groups" })] })) : (_jsx(Stack, { gap: "xs", pb: "md", children: groups.map((group) => (_jsx(Paper, { withBorder: true, p: "sm", children: _jsxs(Group, { justify: "space-between", children: [_jsxs("div", { children: [_jsx(Text, { size: "sm", fw: 500, children: group.name }), group.description && (_jsx(Text, { size: "xs", c: "dimmed", children: group.description }))] }), _jsxs(Text, { size: "sm", variant: "light", children: [group.members?.length || 0, " members"] })] }) }, group.id))) })) }));
|
|
14
13
|
}
|
|
15
|
-
// Editable view
|
|
16
14
|
return (_jsx(ScrollArea, { style: { height: '100%' }, pt: "md", children: _jsxs(Stack, { gap: "sm", pb: "md", children: [_jsxs(Group, { justify: "space-between", mb: "xs", children: [_jsx(Text, { size: "sm", fw: 500, c: "dimmed", children: "Manage your internal groups" }), _jsx(Button, { size: "xs", variant: "light", leftSection: _jsx(IconPlus, { size: 14 }), onClick: onCreateGroup, children: "Create Group" })] }), groups.length === 0 ? (_jsxs(Paper, { withBorder: true, p: "md", style: { textAlign: 'center' }, children: [_jsx(IconUsers, { size: 32, color: "gray", style: { margin: '0 auto', marginBottom: 8 } }), _jsx(Text, { size: "sm", c: "dimmed", children: "No internal groups yet. Create one to get started." })] })) : (groups.map((group) => (_jsx(GroupCard, { group: group, onEdit: onEditGroup, onDelete: onDeleteGroup, onAddMember: onAddMember, onRemoveMember: onRemoveMember, onGetUserMetadata: onGetUserMetadata, showUserSearch: activeSearchGroupId === group.id, searchQuery: searchQuery, searchResults: searchResults, isSearching: isSearching, searchError: searchError, onSearchQueryChange: onSearchQueryChange, onShowSearch: () => onShowSearch(group.id), onHideSearch: onHideSearch, canSearch: canSearch }, group.id))))] }) }));
|
|
17
15
|
};
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hook for managing internal group state
|
|
3
|
-
*/
|
|
4
1
|
import { useState, useEffect, useCallback } from 'react';
|
|
5
2
|
const TEMP_GROUP_ID_PREFIX = 'temp-';
|
|
6
3
|
const isTempGroupId = (id) => id.startsWith(TEMP_GROUP_ID_PREFIX);
|
|
@@ -9,7 +6,6 @@ export function useGroupState({ initialGroups, onSave, }) {
|
|
|
9
6
|
const [isDirty, setIsDirty] = useState(false);
|
|
10
7
|
const [isSaving, setIsSaving] = useState(false);
|
|
11
8
|
const [error, setError] = useState(null);
|
|
12
|
-
// Sync groups when prop changes
|
|
13
9
|
useEffect(() => {
|
|
14
10
|
setGroups(initialGroups);
|
|
15
11
|
setIsDirty(false);
|
|
@@ -57,7 +53,6 @@ export function useGroupState({ initialGroups, onSave, }) {
|
|
|
57
53
|
const save = useCallback(async () => {
|
|
58
54
|
if (!onSave)
|
|
59
55
|
return;
|
|
60
|
-
// Validate that Admins group is not empty
|
|
61
56
|
const adminsGroup = groups.find((g) => g.id === 'Admins');
|
|
62
57
|
if (!adminsGroup || !adminsGroup.members || adminsGroup.members.length === 0) {
|
|
63
58
|
setError('Cannot remove the last admin. At least one admin is required.');
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GroupManager - Main component for managing internal and external groups.
|
|
3
|
-
*
|
|
4
|
-
* This component provides a tabbed UI for managing internal groups with
|
|
5
|
-
* member assignment, and browsing external groups from the organization.
|
|
6
|
-
*/
|
|
7
1
|
import React from 'react';
|
|
8
2
|
import type { GroupManagerProps } from './types.js';
|
|
9
3
|
export declare const GroupManager: React.FC<GroupManagerProps>;
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
/**
|
|
4
|
-
* GroupManager - Main component for managing internal and external groups.
|
|
5
|
-
*
|
|
6
|
-
* This component provides a tabbed UI for managing internal groups with
|
|
7
|
-
* member assignment, and browsing external groups from the organization.
|
|
8
|
-
*/
|
|
9
3
|
import { useState, useCallback } from 'react';
|
|
10
4
|
import { Alert, Button, Group, Loader, Stack, Tabs, Text } from '@mantine/core';
|
|
11
5
|
import { IconAlertCircle } from '@tabler/icons-react';
|
|
@@ -16,16 +10,12 @@ import { InternalGroupsTab } from './InternalGroupsTab.js';
|
|
|
16
10
|
import { ExternalGroupsTab } from './ExternalGroupsTab.js';
|
|
17
11
|
import { GroupForm } from './GroupForm.js';
|
|
18
12
|
export const GroupManager = ({ internalGroups: initialInternalGroups, loading = false, canEdit, onSave, onSearchUsers, onGetUserMetadata, onSearchExternalGroups, onClose: _, }) => {
|
|
19
|
-
// Group state management
|
|
20
13
|
const { groups, isDirty, isSaving, error, setError, createGroup, updateGroup, deleteGroup, addMember, removeMember, save, discard, } = useGroupState({
|
|
21
14
|
initialGroups: initialInternalGroups,
|
|
22
15
|
onSave,
|
|
23
16
|
});
|
|
24
|
-
// User search for adding members
|
|
25
17
|
const userSearch = useUserSearch({ onSearchUsers });
|
|
26
|
-
// External group search
|
|
27
18
|
const externalGroupSearch = useExternalGroupSearch({ onSearchExternalGroups });
|
|
28
|
-
// Modal state for creating/editing groups
|
|
29
19
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
30
20
|
const [editingGroup, setEditingGroup] = useState(null);
|
|
31
21
|
const [formData, setFormData] = useState({
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
* Type definitions for GroupManager module
|
|
3
|
-
*/
|
|
4
|
-
import type { UserSearchResult, GroupMetadata } from '../../auth/types.js';
|
|
1
|
+
import type { UserSearchResult } from '../../auth/types.js';
|
|
5
2
|
import type { CanopyGroupId, CanopyUserId } from '../../types.js';
|
|
6
3
|
import type { InternalGroup } from '../../authorization/index.js';
|
|
7
4
|
import type { ExternalGroup } from '../../api/groups.js';
|
|
8
|
-
export type { UserSearchResult,
|
|
5
|
+
export type { UserSearchResult, InternalGroup, ExternalGroup };
|
|
9
6
|
export type { CanopyGroupId, CanopyUserId };
|
|
10
7
|
export interface GroupManagerProps {
|
|
11
8
|
internalGroups: InternalGroup[];
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
export
|
|
2
|
-
export { useBranchManager
|
|
3
|
-
export { useEntryManager
|
|
4
|
-
export
|
|
1
|
+
export { useEditorLayout } from './useEditorLayout.js';
|
|
2
|
+
export { useBranchManager } from './useBranchManager.js';
|
|
3
|
+
export { useEntryManager } from './useEntryManager.js';
|
|
4
|
+
export { useDraftManager } from './useDraftManager.js';
|
|
5
5
|
export { useCommentSystem } from './useCommentSystem.js';
|
|
6
|
-
export { useBranchesData, fetchBranches, BRANCHES_KEY, type BranchesData } from './useBranchesData.js';
|
|
7
|
-
export { fetchEntriesAndSchema, entriesKey, type EntriesData, type FetchEntriesParams, } from './useEntriesData.js';
|
|
8
|
-
export { useCommentsData, fetchComments, commentsKey, type CommentsData } from './useCommentsData.js';
|
|
9
6
|
export { useGroupManager } from './useGroupManager.js';
|
|
10
7
|
export { usePermissionManager } from './usePermissionManager.js';
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export { useReferenceResolution, type UseReferenceResolutionOptions, type UseReferenceResolutionResult, } from './useReferenceResolution.js';
|
|
14
|
-
export { useSchemaManager, type UseSchemaManagerOptions, type UseSchemaManagerReturn, } from './useSchemaManager.js';
|
|
8
|
+
export { useUserContext } from './useUserContext.js';
|
|
9
|
+
export { useSchemaManager } from './useSchemaManager.js';
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
export * from './useEditorLayout.js';
|
|
1
|
+
// Only the hooks Editor.tsx and media/MediaLibraryBody.tsx import. Everything
|
|
2
|
+
// else in this directory is deep-imported from its own module.
|
|
3
|
+
export { useEditorLayout } from './useEditorLayout.js';
|
|
5
4
|
export { useBranchManager } from './useBranchManager.js';
|
|
6
|
-
export { useEntryManager
|
|
7
|
-
export
|
|
5
|
+
export { useEntryManager } from './useEntryManager.js';
|
|
6
|
+
export { useDraftManager } from './useDraftManager.js';
|
|
8
7
|
export { useCommentSystem } from './useCommentSystem.js';
|
|
9
|
-
export { useBranchesData, fetchBranches, BRANCHES_KEY } from './useBranchesData.js';
|
|
10
|
-
export { fetchEntriesAndSchema, entriesKey, } from './useEntriesData.js';
|
|
11
|
-
export { useCommentsData, fetchComments, commentsKey } from './useCommentsData.js';
|
|
12
8
|
export { useGroupManager } from './useGroupManager.js';
|
|
13
9
|
export { usePermissionManager } from './usePermissionManager.js';
|
|
14
|
-
export { useBranchActions } from './useBranchActions.js';
|
|
15
10
|
export { useUserContext } from './useUserContext.js';
|
|
16
|
-
export {
|
|
17
|
-
export { useSchemaManager, } from './useSchemaManager.js';
|
|
11
|
+
export { useSchemaManager } from './useSchemaManager.js';
|
|
@@ -15,19 +15,5 @@ export interface UseBranchActionsReturn {
|
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* Custom hook for branch navigation actions with dirty check support.
|
|
18
|
-
*
|
|
19
|
-
* Handles:
|
|
20
|
-
* - Branch switching with unsaved changes confirmation
|
|
21
|
-
* - Creating new branches with dirty check
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```tsx
|
|
25
|
-
* const { handleBranchChange, handleCreateBranch } = useBranchActions({
|
|
26
|
-
* branchName,
|
|
27
|
-
* setBranchName,
|
|
28
|
-
* isAnyDirty,
|
|
29
|
-
* onReloadBranches
|
|
30
|
-
* })
|
|
31
|
-
* ```
|
|
32
18
|
*/
|
|
33
19
|
export declare function useBranchActions(options: UseBranchActionsOptions): UseBranchActionsReturn;
|
|
@@ -5,31 +5,11 @@ import { Text } from '@mantine/core';
|
|
|
5
5
|
import { useApiClient } from '../context/index.js';
|
|
6
6
|
/**
|
|
7
7
|
* Custom hook for branch navigation actions with dirty check support.
|
|
8
|
-
*
|
|
9
|
-
* Handles:
|
|
10
|
-
* - Branch switching with unsaved changes confirmation
|
|
11
|
-
* - Creating new branches with dirty check
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```tsx
|
|
15
|
-
* const { handleBranchChange, handleCreateBranch } = useBranchActions({
|
|
16
|
-
* branchName,
|
|
17
|
-
* setBranchName,
|
|
18
|
-
* isAnyDirty,
|
|
19
|
-
* onReloadBranches
|
|
20
|
-
* })
|
|
21
|
-
* ```
|
|
22
8
|
*/
|
|
23
9
|
export function useBranchActions(options) {
|
|
24
10
|
const apiClient = useApiClient();
|
|
25
|
-
// Helper: Perform branch switch with URL update
|
|
26
11
|
const performBranchSwitch = (next) => {
|
|
27
|
-
// Update branchName state - hooks will react:
|
|
28
|
-
// - useEntryManager clears selectedPath and refreshes entries
|
|
29
|
-
// - useDraftManager clears drafts/loadedValues
|
|
30
|
-
// - useCommentSystem loads comments
|
|
31
12
|
options.setBranchName(next);
|
|
32
|
-
// Update URL
|
|
33
13
|
if (typeof window !== 'undefined') {
|
|
34
14
|
const url = new URL(window.location.href);
|
|
35
15
|
url.searchParams.set('branch', next);
|
|
@@ -37,7 +17,6 @@ export function useBranchActions(options) {
|
|
|
37
17
|
}
|
|
38
18
|
options.onBranchSwitch?.(next);
|
|
39
19
|
};
|
|
40
|
-
// Helper: Check for dirty state and show modal
|
|
41
20
|
const confirmIfDirty = async (message) => {
|
|
42
21
|
if (!options.isAnyDirty())
|
|
43
22
|
return true;
|
|
@@ -64,7 +43,6 @@ export function useBranchActions(options) {
|
|
|
64
43
|
const confirmed = await confirmIfDirty('Create new branch without saving changes?');
|
|
65
44
|
if (!confirmed)
|
|
66
45
|
return;
|
|
67
|
-
// Create the branch via API
|
|
68
46
|
try {
|
|
69
47
|
const result = await apiClient.branches.create({
|
|
70
48
|
branch: branch.name,
|
|
@@ -2,10 +2,7 @@ import type { ConflictStatus, PullRequestState, SyncStatus } from '../../types.j
|
|
|
2
2
|
import type { OperatingMode } from '../../operating-mode/index.js';
|
|
3
3
|
import type { CommentThread } from '../../comment-store.js';
|
|
4
4
|
import type { BranchListItem } from '../../api/branch.js';
|
|
5
|
-
|
|
6
|
-
* Branch summary for display in BranchManager component.
|
|
7
|
-
*/
|
|
8
|
-
export interface BranchSummary {
|
|
5
|
+
interface BranchSummary {
|
|
9
6
|
name: string;
|
|
10
7
|
status: string;
|
|
11
8
|
createdBy?: string;
|
|
@@ -50,21 +47,9 @@ export interface BranchSummary {
|
|
|
50
47
|
submitBlocked: boolean;
|
|
51
48
|
}
|
|
52
49
|
export interface UseBranchManagerOptions {
|
|
53
|
-
/**
|
|
54
|
-
* Initial branch name.
|
|
55
|
-
*/
|
|
56
50
|
initialBranch: string;
|
|
57
|
-
/**
|
|
58
|
-
* Operating mode (dev, etc.).
|
|
59
|
-
*/
|
|
60
51
|
operatingMode: OperatingMode;
|
|
61
|
-
/**
|
|
62
|
-
* Callback to set busy state.
|
|
63
|
-
*/
|
|
64
52
|
setBusy: (busy: boolean) => void;
|
|
65
|
-
/**
|
|
66
|
-
* Current comments (for computing comment counts per branch).
|
|
67
|
-
*/
|
|
68
53
|
comments: CommentThread[];
|
|
69
54
|
}
|
|
70
55
|
export interface UseBranchManagerReturn {
|
|
@@ -82,37 +67,6 @@ export interface UseBranchManagerReturn {
|
|
|
82
67
|
}
|
|
83
68
|
/**
|
|
84
69
|
* Custom hook for managing git branches.
|
|
85
|
-
*
|
|
86
|
-
* Handles:
|
|
87
|
-
* - Loading branches from API
|
|
88
|
-
* - Branch switching with unsaved changes confirmation
|
|
89
|
-
* - Creating new branches
|
|
90
|
-
* - Branch workflow (submit, withdraw, request changes)
|
|
91
|
-
* - URL synchronization for branch parameter
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* ```tsx
|
|
95
|
-
* const {
|
|
96
|
-
* branchName,
|
|
97
|
-
* branches,
|
|
98
|
-
* currentBranch,
|
|
99
|
-
* handleBranchChange,
|
|
100
|
-
* handleCreateBranch,
|
|
101
|
-
* handleSubmit
|
|
102
|
-
* } = useBranchManager({
|
|
103
|
-
* initialBranch: 'main',
|
|
104
|
-
* operatingMode: 'collaboration',
|
|
105
|
-
* selectedPath,
|
|
106
|
-
* drafts,
|
|
107
|
-
* loadedValues,
|
|
108
|
-
* setDrafts,
|
|
109
|
-
* setLoadedValues,
|
|
110
|
-
* setSelectedId,
|
|
111
|
-
* setEntries,
|
|
112
|
-
* onEntriesRefresh: refreshEntries,
|
|
113
|
-
* onCommentsLoad: loadComments,
|
|
114
|
-
* setBusy
|
|
115
|
-
* })
|
|
116
|
-
* ```
|
|
117
70
|
*/
|
|
118
71
|
export declare function useBranchManager(options: UseBranchManagerOptions): UseBranchManagerReturn;
|
|
72
|
+
export {};
|
|
@@ -49,9 +49,6 @@ const confirmModalHandlers = (onConfirm, onDismiss) => {
|
|
|
49
49
|
},
|
|
50
50
|
};
|
|
51
51
|
};
|
|
52
|
-
/**
|
|
53
|
-
* Helper function to show confirmation modal for branch submit action.
|
|
54
|
-
*/
|
|
55
52
|
const showSubmitConfirmation = (branchName, onConfirm, onDismiss) => {
|
|
56
53
|
modals.openConfirmModal({
|
|
57
54
|
title: 'Submit Branch for Review',
|
|
@@ -61,9 +58,6 @@ const showSubmitConfirmation = (branchName, onConfirm, onDismiss) => {
|
|
|
61
58
|
...confirmModalHandlers(onConfirm, onDismiss),
|
|
62
59
|
});
|
|
63
60
|
};
|
|
64
|
-
/**
|
|
65
|
-
* Helper function to show confirmation modal for branch withdraw action.
|
|
66
|
-
*/
|
|
67
61
|
const showWithdrawConfirmation = (branchName, onConfirm, onDismiss) => {
|
|
68
62
|
modals.openConfirmModal({
|
|
69
63
|
title: 'Withdraw Branch from Review',
|
|
@@ -74,8 +68,6 @@ const showWithdrawConfirmation = (branchName, onConfirm, onDismiss) => {
|
|
|
74
68
|
});
|
|
75
69
|
};
|
|
76
70
|
/**
|
|
77
|
-
* Helper function to show confirmation modal for branch delete action.
|
|
78
|
-
*
|
|
79
71
|
* Unlike submit/withdraw (both reversible), delete is irreversible -- it
|
|
80
72
|
* unlinks branch.json, removes the clone, and removes the branch head from
|
|
81
73
|
* the local git mirror. Before this, `handleDelete` below called
|
|
@@ -95,54 +87,18 @@ const showDeleteConfirmation = (branchName, onConfirm, onDismiss) => {
|
|
|
95
87
|
// (apps/test-app/e2e/fixtures/branch-page.ts's deleteBranch) already
|
|
96
88
|
// anticipated a delete confirmation and clicks
|
|
97
89
|
// [data-testid="confirm-delete-branch"] when it appears. Without this the
|
|
98
|
-
// modal opens, nothing dismisses it, and the branch never disappears
|
|
99
|
-
// which is exactly how the e2e suite caught this confirmation being added.
|
|
90
|
+
// modal opens, nothing dismisses it, and the branch never disappears.
|
|
100
91
|
confirmProps: { color: 'red', 'data-testid': 'confirm-delete-branch' },
|
|
101
92
|
...confirmModalHandlers(onConfirm, onDismiss),
|
|
102
93
|
});
|
|
103
94
|
};
|
|
104
95
|
/**
|
|
105
96
|
* Custom hook for managing git branches.
|
|
106
|
-
*
|
|
107
|
-
* Handles:
|
|
108
|
-
* - Loading branches from API
|
|
109
|
-
* - Branch switching with unsaved changes confirmation
|
|
110
|
-
* - Creating new branches
|
|
111
|
-
* - Branch workflow (submit, withdraw, request changes)
|
|
112
|
-
* - URL synchronization for branch parameter
|
|
113
|
-
*
|
|
114
|
-
* @example
|
|
115
|
-
* ```tsx
|
|
116
|
-
* const {
|
|
117
|
-
* branchName,
|
|
118
|
-
* branches,
|
|
119
|
-
* currentBranch,
|
|
120
|
-
* handleBranchChange,
|
|
121
|
-
* handleCreateBranch,
|
|
122
|
-
* handleSubmit
|
|
123
|
-
* } = useBranchManager({
|
|
124
|
-
* initialBranch: 'main',
|
|
125
|
-
* operatingMode: 'collaboration',
|
|
126
|
-
* selectedPath,
|
|
127
|
-
* drafts,
|
|
128
|
-
* loadedValues,
|
|
129
|
-
* setDrafts,
|
|
130
|
-
* setLoadedValues,
|
|
131
|
-
* setSelectedId,
|
|
132
|
-
* setEntries,
|
|
133
|
-
* onEntriesRefresh: refreshEntries,
|
|
134
|
-
* onCommentsLoad: loadComments,
|
|
135
|
-
* setBusy
|
|
136
|
-
* })
|
|
137
|
-
* ```
|
|
138
97
|
*/
|
|
139
98
|
export function useBranchManager(options) {
|
|
140
99
|
const apiClient = useApiClient();
|
|
141
100
|
const { mutate: globalMutate } = useSWRConfig();
|
|
142
101
|
const [branchName, setBranchName] = useState(options.initialBranch);
|
|
143
|
-
// Automatic load, deduped by SWR (e.g. React Strict Mode's double effect
|
|
144
|
-
// invoke collapses to a single request). Not keyed by branchName -- the
|
|
145
|
-
// endpoint returns every branch regardless of which one is selected.
|
|
146
102
|
const { data: branchesData, error: branchesError, isValidating: branchesIsValidating, } = useBranchesData(apiClient);
|
|
147
103
|
const branches = useMemo(() => branchesData?.branches ?? [], [branchesData]);
|
|
148
104
|
// Adopt the server's default branch once data arrives, if nothing pinned one.
|
|
@@ -151,7 +107,7 @@ export function useBranchManager(options) {
|
|
|
151
107
|
setBranchName(branchesData.defaultBranch);
|
|
152
108
|
}
|
|
153
109
|
}, [branchesData, branchName]);
|
|
154
|
-
//
|
|
110
|
+
// Surfaces/clears the sticky error toast the same way loadBranches() does.
|
|
155
111
|
useEffect(() => {
|
|
156
112
|
if (branchesError) {
|
|
157
113
|
console.error(branchesError);
|
|
@@ -183,7 +139,6 @@ export function useBranchManager(options) {
|
|
|
183
139
|
// resolves to the branch the server actually persisted (e.g. "feature-x").
|
|
184
140
|
const currentBranch = branches.find((b) => b.name === branchName) ??
|
|
185
141
|
branches.find((b) => b.name === sanitizeBranchName(branchName));
|
|
186
|
-
// Compute branch summaries with comment counts
|
|
187
142
|
const branchSummaries = useMemo(() => {
|
|
188
143
|
return branches.map((b) => {
|
|
189
144
|
const branchComments = b.name === branchName ? options.comments : [];
|
|
@@ -244,8 +199,6 @@ export function useBranchManager(options) {
|
|
|
244
199
|
catch (err) {
|
|
245
200
|
console.error(err);
|
|
246
201
|
const message = err instanceof Error ? err.message : 'Failed to load branches';
|
|
247
|
-
// Fixed id: retries update the existing toast instead of stacking; sticky
|
|
248
|
-
// because the editor cannot function without the branch list.
|
|
249
202
|
notifications.show({
|
|
250
203
|
id: 'canopy-branches-load-failed',
|
|
251
204
|
message,
|
|
@@ -315,13 +268,7 @@ export function useBranchManager(options) {
|
|
|
315
268
|
finally {
|
|
316
269
|
options.setBusy(false);
|
|
317
270
|
}
|
|
318
|
-
},
|
|
319
|
-
// Dismissal is not an error. Rejecting here meant clicking Cancel
|
|
320
|
-
// logged a console error at the only call site (Editor.tsx catches
|
|
321
|
-
// these into console.error), which is both noise and a trip hazard
|
|
322
|
-
// for the CI=1 stray-console gate. Settled once, by onCancel OR
|
|
323
|
-
// onClose, so an Escape/overlay dismissal can't leave this pending.
|
|
324
|
-
() => resolve());
|
|
271
|
+
}, () => resolve());
|
|
325
272
|
});
|
|
326
273
|
};
|
|
327
274
|
const handleRequestChanges = async (branchNameForChanges) => {
|
|
@@ -367,19 +314,12 @@ export function useBranchManager(options) {
|
|
|
367
314
|
// rethrown). Cancellation resolves too -- see below.
|
|
368
315
|
resolve();
|
|
369
316
|
}
|
|
370
|
-
},
|
|
371
|
-
// Dismissal is not an error. Rejecting here meant clicking Cancel
|
|
372
|
-
// logged a console error at the only call site (Editor.tsx catches
|
|
373
|
-
// these into console.error), which is both noise and a trip hazard
|
|
374
|
-
// for the CI=1 stray-console gate. Settled once, by onCancel OR
|
|
375
|
-
// onClose, so an Escape/overlay dismissal can't leave this pending.
|
|
376
|
-
() => resolve());
|
|
317
|
+
}, () => resolve());
|
|
377
318
|
});
|
|
378
319
|
};
|
|
379
320
|
const handleReloadBranchData = async () => {
|
|
380
321
|
await loadBranches();
|
|
381
322
|
};
|
|
382
|
-
// Sync branch to URL parameter
|
|
383
323
|
useEffect(() => {
|
|
384
324
|
if (typeof window === 'undefined')
|
|
385
325
|
return;
|
|
@@ -29,6 +29,7 @@ export declare function fetchBranches(apiClient: Pick<ApiClient, 'branches'>): P
|
|
|
29
29
|
* How often to re-poll while at least one branch is mid-flight, in ms.
|
|
30
30
|
* Only ever active in the transient window below, so this is not a
|
|
31
31
|
* standing background poll.
|
|
32
|
+
* @internal Exported only for the test that pins it.
|
|
32
33
|
*/
|
|
33
34
|
export declare const IN_FLIGHT_POLL_MS = 15000;
|
|
34
35
|
/**
|
|
@@ -36,12 +37,12 @@ export declare const IN_FLIGHT_POLL_MS = 15000;
|
|
|
36
37
|
*
|
|
37
38
|
* `pending-sync` -> `synced` | `sync-failed` happens asynchronously on the
|
|
38
39
|
* EC2 worker when it drains the task queue, with nothing pushed to the
|
|
39
|
-
* browser.
|
|
40
|
-
* branch
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
40
|
+
* browser. The branches list is not refetched on a branch switch (it isn't
|
|
41
|
+
* branch-scoped), so an in-flight badge converges only via this poll --
|
|
42
|
+
* without it, a user who submits a branch would watch "Pending sync"
|
|
43
|
+
* forever until they reloaded the page or performed some unrelated branch
|
|
44
|
+
* mutation.
|
|
45
|
+
* @internal Exported only for the test that pins it.
|
|
45
46
|
*/
|
|
46
47
|
export declare function hasInFlightBranch(data: BranchesData | undefined): boolean;
|
|
47
48
|
/**
|
|
@@ -35,6 +35,7 @@ export async function fetchBranches(apiClient) {
|
|
|
35
35
|
* How often to re-poll while at least one branch is mid-flight, in ms.
|
|
36
36
|
* Only ever active in the transient window below, so this is not a
|
|
37
37
|
* standing background poll.
|
|
38
|
+
* @internal Exported only for the test that pins it.
|
|
38
39
|
*/
|
|
39
40
|
export const IN_FLIGHT_POLL_MS = 15_000;
|
|
40
41
|
/**
|
|
@@ -42,12 +43,12 @@ export const IN_FLIGHT_POLL_MS = 15_000;
|
|
|
42
43
|
*
|
|
43
44
|
* `pending-sync` -> `synced` | `sync-failed` happens asynchronously on the
|
|
44
45
|
* EC2 worker when it drains the task queue, with nothing pushed to the
|
|
45
|
-
* browser.
|
|
46
|
-
* branch
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
46
|
+
* browser. The branches list is not refetched on a branch switch (it isn't
|
|
47
|
+
* branch-scoped), so an in-flight badge converges only via this poll --
|
|
48
|
+
* without it, a user who submits a branch would watch "Pending sync"
|
|
49
|
+
* forever until they reloaded the page or performed some unrelated branch
|
|
50
|
+
* mutation.
|
|
51
|
+
* @internal Exported only for the test that pins it.
|
|
51
52
|
*/
|
|
52
53
|
export function hasInFlightBranch(data) {
|
|
53
54
|
return (data?.branches ?? []).some((b) => b.syncStatus === 'pending-sync');
|
|
@@ -1,37 +1,13 @@
|
|
|
1
1
|
import type { CommentThread } from '../../comment-store.js';
|
|
2
2
|
import type { EditorEntry } from '../Editor.js';
|
|
3
3
|
export interface UseCommentSystemOptions {
|
|
4
|
-
/**
|
|
5
|
-
* Current branch name for loading/saving comments.
|
|
6
|
-
*/
|
|
7
4
|
branchName: string;
|
|
8
|
-
/**
|
|
9
|
-
* Currently selected entry path.
|
|
10
|
-
*/
|
|
11
5
|
selectedPath: string;
|
|
12
|
-
/**
|
|
13
|
-
* Current entry being edited.
|
|
14
|
-
*/
|
|
15
6
|
currentEntry: EditorEntry | undefined;
|
|
16
|
-
/**
|
|
17
|
-
* Current user identifier.
|
|
18
|
-
*/
|
|
19
7
|
currentUser: string;
|
|
20
|
-
/**
|
|
21
|
-
* Whether the current user can resolve comment threads.
|
|
22
|
-
*/
|
|
23
8
|
canResolveComments: boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Callback to change the selected entry.
|
|
26
|
-
*/
|
|
27
9
|
setSelectedPath: (id: string) => void;
|
|
28
|
-
/**
|
|
29
|
-
* Callback to open the branch manager.
|
|
30
|
-
*/
|
|
31
10
|
setBranchManagerOpen: (open: boolean) => void;
|
|
32
|
-
/**
|
|
33
|
-
* Optional callback when comments are loaded/updated.
|
|
34
|
-
*/
|
|
35
11
|
onCommentsChange?: (comments: CommentThread[]) => void;
|
|
36
12
|
}
|
|
37
13
|
export interface UseCommentSystemReturn {
|
|
@@ -63,30 +39,5 @@ export interface UseCommentSystemReturn {
|
|
|
63
39
|
}
|
|
64
40
|
/**
|
|
65
41
|
* Custom hook for managing the comment system.
|
|
66
|
-
*
|
|
67
|
-
* Handles:
|
|
68
|
-
* - Loading comments from API
|
|
69
|
-
* - Adding comments to threads
|
|
70
|
-
* - Resolving comment threads
|
|
71
|
-
* - Field focus highlighting from preview frame
|
|
72
|
-
* - Active comment context tracking
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```tsx
|
|
76
|
-
* const {
|
|
77
|
-
* comments,
|
|
78
|
-
* activeThreads,
|
|
79
|
-
* handleAddComment,
|
|
80
|
-
* handleResolveThread,
|
|
81
|
-
* loadComments
|
|
82
|
-
* } = useCommentSystem({
|
|
83
|
-
* branchName,
|
|
84
|
-
* selectedPath,
|
|
85
|
-
* currentEntry,
|
|
86
|
-
* currentUser,
|
|
87
|
-
* canResolveComments,
|
|
88
|
-
* onReloadBranches
|
|
89
|
-
* })
|
|
90
|
-
* ```
|
|
91
42
|
*/
|
|
92
43
|
export declare function useCommentSystem(options: UseCommentSystemOptions): UseCommentSystemReturn;
|