canopycms 0.0.67-int.90 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -3
- package/dist/ai/generate.js +1 -27
- package/dist/ai/handler.d.ts +0 -4
- package/dist/ai/handler.js +0 -11
- package/dist/ai/index.d.ts +1 -8
- package/dist/ai/index.js +1 -8
- package/dist/ai/json-to-markdown.js +15 -58
- package/dist/ai/resolve-branch.d.ts +2 -7
- package/dist/ai/resolve-branch.js +2 -8
- package/dist/ai/strip-mdx.d.ts +5 -13
- package/dist/ai/strip-mdx.js +5 -17
- package/dist/ai/to-plain-text.d.ts +10 -28
- package/dist/ai/to-plain-text.js +10 -28
- package/dist/ai/transform-components.d.ts +2 -4
- package/dist/ai/transform-components.js +8 -19
- package/dist/ai/types.d.ts +5 -10
- package/dist/api/admin-branch-health.d.ts +4 -12
- package/dist/api/admin-branch-health.js +26 -66
- package/dist/api/admin.d.ts +4 -12
- package/dist/api/admin.js +10 -26
- package/dist/api/assets.d.ts +0 -25
- package/dist/api/assets.js +50 -91
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +0 -2
- package/dist/api/branch-review.d.ts +0 -8
- package/dist/api/branch-review.js +0 -13
- package/dist/api/branch-status.d.ts +0 -3
- package/dist/api/branch-status.js +8 -33
- package/dist/api/branch-withdraw.d.ts +0 -1
- package/dist/api/branch-withdraw.js +6 -9
- package/dist/api/branch.d.ts +7 -12
- package/dist/api/branch.js +7 -44
- package/dist/api/client.d.ts +71 -224
- package/dist/api/client.js +82 -233
- package/dist/api/comments.d.ts +2 -4
- package/dist/api/comments.js +0 -17
- package/dist/api/content.d.ts +0 -6
- package/dist/api/content.js +66 -142
- package/dist/api/entries-constants.d.ts +5 -9
- package/dist/api/entries-constants.js +5 -9
- package/dist/api/entries.d.ts +8 -13
- package/dist/api/entries.js +20 -51
- package/dist/api/github-sync.d.ts +2 -4
- package/dist/api/github-sync.js +4 -8
- package/dist/api/groups.d.ts +3 -0
- package/dist/api/groups.js +8 -21
- package/dist/api/guards.d.ts +4 -16
- package/dist/api/guards.js +3 -22
- package/dist/api/index.d.ts +4 -4
- package/dist/api/permissions.d.ts +2 -0
- package/dist/api/permissions.js +18 -40
- package/dist/api/reference-options.d.ts +0 -1
- package/dist/api/reference-options.js +3 -11
- package/dist/api/request-body-hash.d.ts +12 -23
- package/dist/api/request-body-hash.js +12 -23
- package/dist/api/resolve-references.d.ts +0 -1
- package/dist/api/resolve-references.js +13 -28
- package/dist/api/route-builder.d.ts +3 -7
- package/dist/api/route-builder.js +1 -1
- package/dist/api/routes.d.ts +12 -0
- package/dist/api/routes.js +47 -0
- package/dist/api/schema.d.ts +23 -33
- package/dist/api/schema.js +20 -74
- package/dist/api/settings-helpers.js +4 -5
- package/dist/api/types.d.ts +0 -5
- package/dist/api/user.js +0 -5
- package/dist/api/validators.d.ts +14 -52
- package/dist/api/validators.js +14 -52
- package/dist/assets/asset-prefixes.d.ts +4 -8
- package/dist/assets/asset-prefixes.js +4 -8
- package/dist/assets/asset-src.d.ts +5 -22
- package/dist/assets/asset-src.js +5 -21
- package/dist/assets/factory.d.ts +1 -2
- package/dist/assets/factory.js +1 -2
- package/dist/assets/finalize.d.ts +3 -1
- package/dist/assets/finalize.js +3 -1
- package/dist/assets/index.d.ts +3 -3
- package/dist/assets/index.js +1 -1
- package/dist/assets/keys.d.ts +5 -3
- package/dist/assets/keys.js +6 -3
- package/dist/assets/pipeline.d.ts +3 -2
- package/dist/assets/pipeline.js +22 -56
- package/dist/assets/sharp-loader.d.ts +2 -10
- package/dist/assets/sharp-loader.js +2 -10
- package/dist/assets/store-local.d.ts +1 -2
- package/dist/assets/store-local.js +1 -2
- package/dist/assets/store-s3.d.ts +3 -4
- package/dist/assets/svg-sanitizer.d.ts +6 -14
- package/dist/assets/svg-sanitizer.js +6 -14
- package/dist/assets/transform-directives.d.ts +3 -4
- package/dist/assets/transform-directives.js +1 -1
- package/dist/assets/transform.d.ts +19 -30
- package/dist/assets/transform.js +18 -31
- package/dist/auth/cache.d.ts +2 -3
- package/dist/auth/cache.js +2 -3
- package/dist/auth/caching-auth-plugin.d.ts +11 -22
- package/dist/auth/caching-auth-plugin.js +12 -14
- package/dist/auth/context-helpers.d.ts +6 -20
- package/dist/auth/context-helpers.js +5 -17
- package/dist/auth/file-based-auth-cache.d.ts +10 -21
- package/dist/auth/file-based-auth-cache.js +23 -51
- package/dist/auth/plugin.d.ts +29 -61
- package/dist/auth/plugin.js +9 -13
- package/dist/auth/types.d.ts +11 -20
- package/dist/authorization/branch.d.ts +30 -49
- package/dist/authorization/branch.js +16 -42
- package/dist/authorization/content.d.ts +11 -40
- package/dist/authorization/content.js +13 -45
- package/dist/authorization/groups/index.d.ts +0 -3
- package/dist/authorization/groups/index.js +0 -3
- package/dist/authorization/groups/loader.d.ts +14 -28
- package/dist/authorization/groups/loader.js +14 -38
- package/dist/authorization/groups/schema.d.ts +0 -6
- package/dist/authorization/groups/schema.js +4 -7
- package/dist/authorization/helpers.d.ts +9 -28
- package/dist/authorization/helpers.js +9 -28
- package/dist/authorization/index.d.ts +3 -25
- package/dist/authorization/index.js +3 -35
- package/dist/authorization/path.d.ts +6 -13
- package/dist/authorization/path.js +8 -25
- package/dist/authorization/permissions/index.d.ts +0 -3
- package/dist/authorization/permissions/index.js +0 -3
- package/dist/authorization/permissions/loader.d.ts +14 -27
- package/dist/authorization/permissions/loader.js +14 -32
- package/dist/authorization/permissions/schema.d.ts +1 -6
- package/dist/authorization/permissions/schema.js +6 -13
- package/dist/authorization/protected-branch.d.ts +36 -65
- package/dist/authorization/protected-branch.js +29 -41
- package/dist/authorization/settings-file-store.d.ts +38 -81
- package/dist/authorization/settings-file-store.js +38 -79
- package/dist/authorization/types.d.ts +4 -26
- package/dist/authorization/types.js +0 -6
- package/dist/authorization/validation.d.ts +1 -23
- package/dist/authorization/validation.js +1 -24
- package/dist/branch-health.d.ts +39 -67
- package/dist/branch-health.js +27 -43
- package/dist/branch-metadata-file.d.ts +16 -32
- package/dist/branch-metadata-file.js +13 -26
- package/dist/branch-metadata.d.ts +49 -80
- package/dist/branch-metadata.js +57 -87
- package/dist/branch-registry.d.ts +26 -64
- package/dist/branch-registry.js +44 -93
- package/dist/branch-schema-cache.d.ts +34 -124
- package/dist/branch-schema-cache.js +49 -155
- package/dist/branch-workspace.d.ts +4 -4
- package/dist/branch-workspace.js +15 -19
- package/dist/build/generate-ai-content.d.ts +1 -0
- package/dist/build/generate-ai-content.js +12 -25
- package/dist/build-canopy.d.ts +17 -27
- package/dist/build-canopy.js +16 -23
- package/dist/build-mode.d.ts +25 -27
- package/dist/build-mode.js +25 -29
- package/dist/cli/cli.d.ts +15 -26
- package/dist/cli/cli.js +601 -978
- package/dist/cli/generate-ai-content.js +351 -628
- package/dist/cli/github-app-manifest.d.ts +84 -0
- package/dist/cli/github-app-manifest.js +161 -0
- package/dist/cli/init-github-app.d.ts +110 -444
- package/dist/cli/init-github-app.js +236 -773
- package/dist/cli/init.js +39 -80
- package/dist/cli/migrate.d.ts +13 -10
- package/dist/cli/migrate.js +22 -30
- package/dist/cli/project-detect.d.ts +17 -31
- package/dist/cli/project-detect.js +31 -42
- package/dist/cli/project-root.d.ts +4 -11
- package/dist/cli/project-root.js +4 -11
- package/dist/cli/prompt.d.ts +10 -0
- package/dist/cli/prompt.js +67 -0
- package/dist/cli/sync.d.ts +0 -8
- package/dist/cli/sync.js +8 -28
- package/dist/cli/template-files/middleware.ts.template +15 -29
- package/dist/cli/templates.d.ts +2 -12
- package/dist/cli/templates.js +4 -4
- package/dist/client.d.ts +1 -1
- package/dist/comment-store.d.ts +32 -53
- package/dist/comment-store.js +32 -52
- package/dist/config/flatten.d.ts +0 -3
- package/dist/config/flatten.js +2 -12
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +1 -4
- package/dist/config/schemas/collection.d.ts +0 -8
- package/dist/config/schemas/collection.js +0 -10
- package/dist/config/schemas/config.d.ts +6 -78
- package/dist/config/schemas/config.js +38 -54
- package/dist/config/schemas/field.d.ts +2 -242
- package/dist/config/schemas/field.js +9 -20
- package/dist/config/schemas/media.js +1 -1
- package/dist/config/schemas/permissions.js +0 -2
- package/dist/config/schemas/url.d.ts +5 -6
- package/dist/config/schemas/url.js +5 -6
- package/dist/config/types.d.ts +45 -33
- package/dist/config/types.js +0 -1
- package/dist/config.d.ts +1 -8
- package/dist/config.js +1 -9
- package/dist/content-id-index.d.ts +76 -188
- package/dist/content-id-index.js +79 -230
- package/dist/content-index-generation.d.ts +27 -48
- package/dist/content-index-generation.js +35 -84
- package/dist/content-index-registry.d.ts +15 -24
- package/dist/content-index-registry.js +5 -9
- package/dist/content-listing.d.ts +64 -107
- package/dist/content-listing.js +68 -118
- package/dist/content-reader.d.ts +20 -29
- package/dist/content-reader.js +10 -18
- package/dist/content-store.d.ts +210 -336
- package/dist/content-store.js +413 -657
- package/dist/content-tree.d.ts +44 -86
- package/dist/content-tree.js +26 -54
- package/dist/context.d.ts +67 -94
- package/dist/context.js +53 -72
- package/dist/dev-content-watcher.d.ts +18 -18
- package/dist/dev-content-watcher.js +41 -44
- package/dist/editor/BranchManager.d.ts +3 -6
- package/dist/editor/BranchManager.js +24 -44
- package/dist/editor/CanopyEditor.js +5 -2
- package/dist/editor/CommentsPanel.js +0 -2
- package/dist/editor/Editor.js +19 -76
- package/dist/editor/EditorAuthGate.d.ts +27 -0
- package/dist/editor/EditorAuthGate.js +140 -0
- package/dist/editor/EntryNavigator.js +0 -20
- package/dist/editor/FormRenderer.d.ts +1 -2
- package/dist/editor/FormRenderer.js +8 -23
- package/dist/editor/admin/SystemHealthPanel.js +20 -37
- package/dist/editor/admin/useSystemHealth.d.ts +2 -3
- package/dist/editor/admin/useSystemHealth.js +10 -12
- package/dist/editor/client-reference-resolver.d.ts +2 -5
- package/dist/editor/client-reference-resolver.js +2 -19
- package/dist/editor/comments/BranchComments.js +0 -4
- package/dist/editor/comments/EntryComments.js +0 -4
- package/dist/editor/comments/FieldWrapper.js +0 -4
- package/dist/editor/comments/InlineCommentThread.js +0 -2
- package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
- package/dist/editor/comments/ThreadCarousel.js +0 -12
- package/dist/editor/components/EditorFooter.d.ts +0 -8
- package/dist/editor/components/EditorFooter.js +0 -5
- package/dist/editor/components/EditorHeader.d.ts +0 -31
- package/dist/editor/components/EditorHeader.js +21 -71
- package/dist/editor/components/EditorSidebar.d.ts +0 -19
- package/dist/editor/components/EditorSidebar.js +0 -16
- package/dist/editor/components/EntryCreateModal.d.ts +4 -4
- package/dist/editor/components/EntryCreateModal.js +7 -22
- package/dist/editor/components/RenameEntryModal.js +0 -4
- package/dist/editor/components/UserBadge.js +0 -10
- package/dist/editor/components/index.js +0 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -7
- package/dist/editor/context/ApiClientContext.js +39 -11
- package/dist/editor/context/AssetContext.d.ts +7 -17
- package/dist/editor/context/AssetContext.js +7 -17
- package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
- package/dist/editor/context/EditorIdentityContext.js +7 -0
- package/dist/editor/context/EditorStateContext.d.ts +10 -41
- package/dist/editor/context/EditorStateContext.js +7 -23
- package/dist/editor/context/SWRProvider.d.ts +3 -6
- package/dist/editor/context/index.d.ts +1 -20
- package/dist/editor/context/index.js +1 -20
- package/dist/editor/editor-utils.d.ts +8 -47
- package/dist/editor/editor-utils.js +19 -72
- package/dist/editor/fields/BlockField.d.ts +2 -2
- package/dist/editor/fields/BlockField.js +1 -2
- package/dist/editor/fields/CodeField.d.ts +0 -1
- package/dist/editor/fields/CodeField.js +0 -1
- package/dist/editor/fields/DateTimeField.d.ts +15 -22
- package/dist/editor/fields/DateTimeField.js +17 -26
- package/dist/editor/fields/ImageField.d.ts +2 -2
- package/dist/editor/fields/ImageField.js +8 -14
- package/dist/editor/fields/InlineGroupField.d.ts +0 -1
- package/dist/editor/fields/InlineGroupField.js +0 -1
- package/dist/editor/fields/MarkdownField.d.ts +0 -1
- package/dist/editor/fields/MarkdownField.js +6 -11
- package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
- package/dist/editor/fields/MdxImageDialog.js +0 -1
- package/dist/editor/fields/NumberField.d.ts +9 -19
- package/dist/editor/fields/NumberField.js +11 -22
- package/dist/editor/fields/NumberListField.d.ts +7 -10
- package/dist/editor/fields/NumberListField.js +7 -10
- package/dist/editor/fields/ObjectField.d.ts +5 -8
- package/dist/editor/fields/ObjectField.js +0 -1
- package/dist/editor/fields/ReferenceField.d.ts +1 -1
- package/dist/editor/fields/ReferenceField.js +11 -16
- package/dist/editor/fields/SelectField.d.ts +2 -2
- package/dist/editor/fields/SelectField.js +0 -1
- package/dist/editor/fields/StringListField.d.ts +0 -4
- package/dist/editor/fields/StringListField.js +4 -9
- package/dist/editor/fields/TextField.d.ts +0 -1
- package/dist/editor/fields/TextField.js +0 -1
- package/dist/editor/fields/ToggleField.d.ts +0 -1
- package/dist/editor/fields/ToggleField.js +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts +0 -3
- package/dist/editor/group-manager/GroupForm.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
- package/dist/editor/group-manager/MemberList.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
- package/dist/editor/group-manager/index.d.ts +0 -6
- package/dist/editor/group-manager/index.js +0 -10
- package/dist/editor/group-manager/types.d.ts +2 -5
- package/dist/editor/group-manager/types.js +0 -3
- package/dist/editor/hooks/index.d.ts +6 -11
- package/dist/editor/hooks/index.js +6 -12
- package/dist/editor/hooks/useBranchActions.d.ts +0 -14
- package/dist/editor/hooks/useBranchActions.js +0 -22
- package/dist/editor/hooks/useBranchManager.d.ts +2 -48
- package/dist/editor/hooks/useBranchManager.js +4 -64
- package/dist/editor/hooks/useBranchesData.d.ts +7 -6
- package/dist/editor/hooks/useBranchesData.js +7 -6
- package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
- package/dist/editor/hooks/useCommentSystem.js +1 -36
- package/dist/editor/hooks/useDraftManager.d.ts +2 -35
- package/dist/editor/hooks/useDraftManager.js +23 -64
- package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
- package/dist/editor/hooks/useEditorLayout.js +0 -23
- package/dist/editor/hooks/useEntriesData.d.ts +1 -0
- package/dist/editor/hooks/useEntriesData.js +2 -3
- package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
- package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
- package/dist/editor/hooks/useEntryManager.d.ts +2 -27
- package/dist/editor/hooks/useEntryManager.js +29 -78
- package/dist/editor/hooks/useGroupManager.d.ts +0 -21
- package/dist/editor/hooks/useGroupManager.js +0 -21
- package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
- package/dist/editor/hooks/usePermissionManager.js +0 -20
- package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
- package/dist/editor/hooks/useReferenceResolution.js +1 -48
- package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
- package/dist/editor/hooks/useSchemaManager.js +0 -19
- package/dist/editor/hooks/useUserContext.d.ts +2 -9
- package/dist/editor/hooks/useUserContext.js +10 -10
- package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
- package/dist/editor/hooks/useUserMetadata.js +0 -3
- package/dist/editor/media/AssetCard.d.ts +0 -1
- package/dist/editor/media/AssetCard.js +1 -2
- package/dist/editor/media/CropStep.d.ts +0 -1
- package/dist/editor/media/CropStep.js +0 -1
- package/dist/editor/media/MediaLibrary.d.ts +1 -2
- package/dist/editor/media/MediaLibrary.js +1 -2
- package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
- package/dist/editor/media/MediaLibraryBody.js +0 -1
- package/dist/editor/media/crop-math.d.ts +1 -1
- package/dist/editor/media/crop-math.js +1 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
- package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
- package/dist/editor/permission-manager/PermissionEditor.js +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
- package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
- package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
- package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
- package/dist/editor/permission-manager/constants.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
- package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
- package/dist/editor/permission-manager/index.d.ts +0 -7
- package/dist/editor/permission-manager/index.js +0 -16
- package/dist/editor/permission-manager/types.d.ts +2 -12
- package/dist/editor/permission-manager/types.js +0 -3
- package/dist/editor/permission-manager/utils.d.ts +0 -28
- package/dist/editor/permission-manager/utils.js +9 -23
- package/dist/editor/preview-bridge.d.ts +5 -1
- package/dist/editor/preview-bridge.js +4 -4
- package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
- package/dist/editor/schema-editor/CollectionEditor.js +9 -31
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
- package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
- package/dist/editor/schema-editor/index.d.ts +0 -7
- package/dist/editor/schema-editor/index.js +0 -7
- package/dist/editor/utils/env.d.ts +3 -18
- package/dist/editor/utils/env.js +6 -25
- package/dist/entry-link-resolver.d.ts +13 -35
- package/dist/entry-link-resolver.js +20 -53
- package/dist/entry-schema-registry.d.ts +20 -60
- package/dist/entry-schema-registry.js +20 -69
- package/dist/entry-schema.d.ts +118 -223
- package/dist/entry-schema.js +46 -91
- package/dist/git-manager.d.ts +101 -200
- package/dist/git-manager.js +211 -384
- package/dist/github-service.d.ts +34 -75
- package/dist/github-service.js +37 -91
- package/dist/http/handler.d.ts +6 -37
- package/dist/http/handler.js +65 -120
- package/dist/http/router.d.ts +15 -32
- package/dist/http/router.js +34 -99
- package/dist/http/types.d.ts +15 -40
- package/dist/http/types.js +3 -7
- package/dist/id.d.ts +4 -10
- package/dist/id.js +4 -10
- package/dist/index.js +6 -9
- package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
- package/dist/operating-mode/client-safe-strategy.js +8 -28
- package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
- package/dist/operating-mode/client-unsafe-strategy.js +9 -34
- package/dist/operating-mode/client.d.ts +3 -10
- package/dist/operating-mode/client.js +3 -8
- package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
- package/dist/operating-mode/deployment-name-fixtures.js +14 -18
- package/dist/operating-mode/deployment-name.d.ts +19 -29
- package/dist/operating-mode/deployment-name.js +29 -47
- package/dist/operating-mode/index.d.ts +4 -25
- package/dist/operating-mode/index.js +9 -31
- package/dist/operating-mode/mode-env.d.ts +32 -54
- package/dist/operating-mode/mode-env.js +36 -58
- package/dist/operating-mode/types.d.ts +24 -72
- package/dist/operating-mode/types.js +1 -7
- package/dist/paths/branch-name.d.ts +30 -40
- package/dist/paths/branch-name.js +30 -40
- package/dist/paths/branch.d.ts +4 -18
- package/dist/paths/branch.js +6 -22
- package/dist/paths/index.d.ts +2 -13
- package/dist/paths/index.js +3 -23
- package/dist/paths/normalize-server.d.ts +3 -15
- package/dist/paths/normalize-server.js +3 -15
- package/dist/paths/normalize.d.ts +13 -33
- package/dist/paths/normalize.js +13 -33
- package/dist/paths/resolve.d.ts +4 -17
- package/dist/paths/resolve.js +4 -22
- package/dist/paths/types.d.ts +12 -34
- package/dist/paths/types.js +5 -7
- package/dist/paths/validation.d.ts +22 -119
- package/dist/paths/validation.js +30 -148
- package/dist/reference-resolver.d.ts +0 -13
- package/dist/reference-resolver.js +0 -18
- package/dist/resolve-canopy-user.d.ts +16 -18
- package/dist/resolve-canopy-user.js +17 -26
- package/dist/resource-generation.d.ts +16 -25
- package/dist/resource-generation.js +34 -97
- package/dist/schema/meta-loader.d.ts +2 -14
- package/dist/schema/meta-loader.js +15 -64
- package/dist/schema/resolver.d.ts +1 -4
- package/dist/schema/resolver.js +1 -6
- package/dist/schema/schema-store-types.d.ts +0 -12
- package/dist/schema/schema-store.d.ts +61 -138
- package/dist/schema/schema-store.js +85 -282
- package/dist/schema/types.d.ts +0 -4
- package/dist/server.d.ts +62 -93
- package/dist/server.js +63 -94
- package/dist/services.d.ts +23 -47
- package/dist/services.js +55 -98
- package/dist/settings-workspace.d.ts +17 -30
- package/dist/settings-workspace.js +51 -81
- package/dist/static/index.d.ts +26 -52
- package/dist/static/index.js +33 -67
- package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
- package/dist/task-queue/cms-task-queue.js +13 -0
- package/dist/task-queue/task-queue-config.d.ts +3 -0
- package/dist/{worker → task-queue}/task-queue-config.js +1 -6
- package/dist/task-queue/task-queue.d.ts +16 -22
- package/dist/task-queue/task-queue.js +20 -44
- package/dist/task-queue/types.d.ts +0 -1
- package/dist/task-queue/worker-status.d.ts +35 -0
- package/dist/task-queue/worker-status.js +40 -0
- package/dist/types.d.ts +40 -51
- package/dist/url-collision.d.ts +26 -40
- package/dist/url-collision.js +47 -63
- package/dist/url-exclusivity-fixtures.d.ts +15 -20
- package/dist/url-exclusivity-fixtures.js +14 -19
- package/dist/url-path-resolver.d.ts +8 -16
- package/dist/url-path-resolver.js +19 -29
- package/dist/user.d.ts +8 -21
- package/dist/user.js +10 -19
- package/dist/utils/async-mutex.js +4 -6
- package/dist/utils/atomic-write.d.ts +2 -11
- package/dist/utils/atomic-write.js +2 -11
- package/dist/utils/body-field.d.ts +8 -15
- package/dist/utils/body-field.js +8 -15
- package/dist/utils/content-serialize.d.ts +18 -24
- package/dist/utils/content-serialize.js +109 -160
- package/dist/utils/content-write-lock.d.ts +51 -106
- package/dist/utils/content-write-lock.js +66 -111
- package/dist/utils/debug.d.ts +7 -23
- package/dist/utils/debug.js +7 -23
- package/dist/utils/entry-url.d.ts +11 -23
- package/dist/utils/entry-url.js +11 -26
- package/dist/utils/error.d.ts +25 -90
- package/dist/utils/error.js +60 -147
- package/dist/utils/flatten-group-fields.d.ts +5 -7
- package/dist/utils/flatten-group-fields.js +5 -7
- package/dist/utils/format.d.ts +1 -5
- package/dist/utils/format.js +1 -5
- package/dist/utils/fs.d.ts +3 -4
- package/dist/utils/fs.js +3 -4
- package/dist/utils/git.d.ts +52 -83
- package/dist/utils/git.js +79 -125
- package/dist/utils/logger.d.ts +35 -50
- package/dist/utils/logger.js +35 -52
- package/dist/utils/provisioning-lock.d.ts +23 -35
- package/dist/utils/provisioning-lock.js +49 -69
- package/dist/utils/sanitize-href.d.ts +5 -10
- package/dist/utils/sanitize-href.js +8 -18
- package/dist/utils/title-field.d.ts +17 -20
- package/dist/utils/title-field.js +18 -27
- package/dist/utils/typed-filename.d.ts +20 -48
- package/dist/utils/typed-filename.js +25 -61
- package/dist/utils/url-prefix.d.ts +3 -3
- package/dist/utils/url-prefix.js +3 -3
- package/dist/validation/block-structural-keys.d.ts +16 -31
- package/dist/validation/block-structural-keys.js +19 -29
- package/dist/validation/deletion-checker.d.ts +0 -34
- package/dist/validation/deletion-checker.js +1 -43
- package/dist/validation/entry-link-validator.d.ts +6 -13
- package/dist/validation/entry-link-validator.js +4 -13
- package/dist/validation/entry-type-reference-validator.d.ts +13 -18
- package/dist/validation/entry-type-reference-validator.js +13 -18
- package/dist/validation/entry-validator.d.ts +13 -25
- package/dist/validation/entry-validator.js +15 -32
- package/dist/validation/field-traversal.d.ts +3 -30
- package/dist/validation/field-traversal.js +1 -32
- package/dist/validation/reference-validator.d.ts +5 -24
- package/dist/validation/reference-validator.js +5 -30
- package/dist/worker/cms-worker.d.ts +172 -232
- package/dist/worker/cms-worker.js +241 -333
- package/dist/worker/git-sync.d.ts +32 -133
- package/dist/worker/git-sync.js +129 -191
- package/dist/worker/github-auth.d.ts +13 -19
- package/dist/worker/github-auth.js +13 -19
- package/dist/worker/history-rewrite.d.ts +53 -66
- package/dist/worker/history-rewrite.js +54 -60
- package/dist/worker/log.d.ts +24 -41
- package/dist/worker/log.js +25 -42
- package/dist/worker/rebase.d.ts +20 -110
- package/dist/worker/rebase.js +279 -354
- package/dist/worker/task-runner.d.ts +32 -66
- package/dist/worker/task-runner.js +126 -162
- package/dist/worker/worker-context.d.ts +41 -81
- package/package.json +4 -4
- package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
- package/dist/worker/task-queue-config.d.ts +0 -8
- package/dist/worker/task-queue.js +0 -19
- package/dist/worker/worker-status.d.ts +0 -47
- package/dist/worker/worker-status.js +0 -52
package/dist/github-service.d.ts
CHANGED
|
@@ -3,47 +3,44 @@ import type { CanopyConfig } from './config/index.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* Retry primary rate limits at most twice and only for short waits; beyond
|
|
5
5
|
* that, task-level retry/backoff (worker) or the caller's error path takes
|
|
6
|
-
* over
|
|
7
|
-
*
|
|
6
|
+
* over, since the worker's task timeout would abort a longer in-request wait.
|
|
7
|
+
* @internal Exported for tests.
|
|
8
8
|
*/
|
|
9
9
|
export declare const shouldRetryRateLimit: (retryAfter: number, retryCount: number) => boolean;
|
|
10
10
|
/**
|
|
11
11
|
* Secondary (abuse-detection) rate limits are stricter to trip and usually
|
|
12
12
|
* signal we're hammering the API too fast — retry at most once, and only for
|
|
13
13
|
* a short wait.
|
|
14
|
+
* @internal Exported for tests.
|
|
14
15
|
*/
|
|
15
16
|
export declare const shouldRetrySecondaryRateLimit: (retryAfter: number, retryCount: number) => boolean;
|
|
16
17
|
/**
|
|
17
18
|
* Octokit's pluggable-auth options, typed STRUCTURALLY.
|
|
18
19
|
*
|
|
19
|
-
* `@octokit/core` calls `authStrategy(…)` once in its constructor and wraps
|
|
20
|
-
*
|
|
21
|
-
*
|
|
20
|
+
* `@octokit/core` calls `authStrategy(…)` once in its constructor and wraps the
|
|
21
|
+
* returned object's `.hook` into its request chain, so handing it a strategy is
|
|
22
|
+
* the whole of "authenticate every request some other way".
|
|
22
23
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* catch that, so the structural typing is the guard.
|
|
24
|
+
* The shape is declared, never imported: this module is reachable from
|
|
25
|
+
* `services.ts` and so lands in every adopter's Next.js server bundle, and
|
|
26
|
+
* importing `@octokit/auth-app` here would pull that package (plus
|
|
27
|
+
* `universal-github-app-jwt`) into the bundle of every adopter, including the
|
|
28
|
+
* majority who authenticate with a personal access token and never register a
|
|
29
|
+
* GitHub App. `pnpm lint:bundle` guards the *client* boundary only and would
|
|
30
|
+
* not catch it, so the structural typing IS the guard.
|
|
31
31
|
*
|
|
32
|
-
* A deployment
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* one — see `packages/canopycms-cdk/worker/github-app-auth.ts`, with
|
|
36
|
-
* `docs/adopter-migration.md` carrying the shape for a hand-written entrypoint.
|
|
32
|
+
* A deployment using an App constructs the strategy and passes it through here
|
|
33
|
+
* — see `packages/canopycms-cdk/worker/github-app-auth.ts` and
|
|
34
|
+
* `docs/adopter-migration.md` for a hand-written entrypoint.
|
|
37
35
|
*/
|
|
38
36
|
export interface OctokitAuthStrategyOptions {
|
|
39
37
|
/**
|
|
40
|
-
* Octokit calls this with `{ request, log, octokit, octokitOptions }`,
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* caller that also needs to mint tokens outside Octokit.
|
|
38
|
+
* Octokit calls this with `{ request, log, octokit, octokitOptions }`, the
|
|
39
|
+
* fields of `auth` below merged over them, and expects an object carrying a
|
|
40
|
+
* `.hook`. `createAppAuth(…)`'s return value satisfies that; so does a
|
|
41
|
+
* closure returning an already-constructed one, which is how one auth
|
|
42
|
+
* instance — and so one installation-token cache — is shared with a caller
|
|
43
|
+
* that also mints tokens outside Octokit.
|
|
47
44
|
*/
|
|
48
45
|
authStrategy: (options: Record<string, unknown>) => unknown;
|
|
49
46
|
/** Merged into the strategy's options by Octokit. */
|
|
@@ -94,15 +91,11 @@ export interface CreateOrUpdatePullRequestParams {
|
|
|
94
91
|
signal?: AbortSignal;
|
|
95
92
|
}
|
|
96
93
|
/**
|
|
97
|
-
* Create or update a pull request
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* number
|
|
101
|
-
*
|
|
102
|
-
* persists the returned PR number, calling this again recovers the
|
|
103
|
-
* existing PR instead of hitting the 422 that a blind create would throw on
|
|
104
|
-
* a duplicate, which previously wedged the branch in 'sync-failed'
|
|
105
|
-
* permanently.
|
|
94
|
+
* Create or update a pull request, idempotently: an open PR from head to base
|
|
95
|
+
* is updated and returned rather than erroring. That keeps PR submission
|
|
96
|
+
* retryable — a caller that crashes after GitHub creates the PR but before it
|
|
97
|
+
* persists the number recovers the existing PR instead of hitting the 422 a
|
|
98
|
+
* blind create throws on a duplicate, which wedges the branch in 'sync-failed'.
|
|
106
99
|
*
|
|
107
100
|
* Shared by `GitHubService.createOrUpdatePR` (direct-API callers) and the
|
|
108
101
|
* worker's `push-and-create-or-update-pr` task, so the list->tiebreak->
|
|
@@ -113,33 +106,20 @@ export declare function createOrUpdatePullRequest(params: CreateOrUpdatePullRequ
|
|
|
113
106
|
url: string;
|
|
114
107
|
created: boolean;
|
|
115
108
|
}>;
|
|
116
|
-
/**
|
|
117
|
-
* Service for interacting with GitHub API (pull requests, branches, etc.)
|
|
118
|
-
*/
|
|
119
109
|
export declare class GitHubService {
|
|
120
110
|
private octokit;
|
|
121
111
|
private owner;
|
|
122
112
|
private repo;
|
|
123
113
|
private baseBranch;
|
|
124
114
|
constructor(options: GitHubServiceOptions);
|
|
125
|
-
/**
|
|
126
|
-
* Create a new pull request
|
|
127
|
-
*/
|
|
128
115
|
createPullRequest(options: PullRequestOptions): Promise<{
|
|
129
116
|
number: number;
|
|
130
117
|
url: string;
|
|
131
118
|
}>;
|
|
132
|
-
/**
|
|
133
|
-
* Update an existing pull request
|
|
134
|
-
*/
|
|
135
119
|
updatePullRequest(prNumber: number, options: Partial<Pick<PullRequestOptions, 'title' | 'body'>>): Promise<void>;
|
|
136
120
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* Thin delegate to the module-level `createOrUpdatePullRequest` helper
|
|
140
|
-
* (shared with the worker's `push-and-create-or-update-pr` task) bound to
|
|
141
|
-
* this instance's octokit/owner/repo. See that function's doc comment for
|
|
142
|
-
* the idempotency rationale.
|
|
121
|
+
* Idempotent create-or-update, bound to this instance's octokit/owner/repo.
|
|
122
|
+
* See {@link createOrUpdatePullRequest}.
|
|
143
123
|
*/
|
|
144
124
|
createOrUpdatePR(options: {
|
|
145
125
|
head: string;
|
|
@@ -152,37 +132,16 @@ export declare class GitHubService {
|
|
|
152
132
|
number: number;
|
|
153
133
|
url: string;
|
|
154
134
|
}>;
|
|
155
|
-
/**
|
|
156
|
-
* Get pull request details
|
|
157
|
-
*/
|
|
158
135
|
getPullRequest(prNumber: number): Promise<PullRequestDetails>;
|
|
159
|
-
/**
|
|
160
|
-
* Convert a pull request to draft
|
|
161
|
-
*/
|
|
162
136
|
convertToDraft(prNumber: number): Promise<void>;
|
|
163
|
-
/**
|
|
164
|
-
* Convert a draft pull request to ready for review
|
|
165
|
-
*/
|
|
166
137
|
convertToReady(prNumber: number): Promise<void>;
|
|
167
|
-
/**
|
|
168
|
-
* Close a pull request
|
|
169
|
-
*/
|
|
170
138
|
closePullRequest(prNumber: number): Promise<void>;
|
|
171
|
-
/**
|
|
172
|
-
* Delete a remote branch
|
|
173
|
-
*/
|
|
174
139
|
deleteBranch(branchName: string): Promise<void>;
|
|
175
|
-
/**
|
|
176
|
-
* Get the GraphQL node ID for a pull request (needed for draft operations)
|
|
177
|
-
*/
|
|
178
140
|
private getPullRequestNodeId;
|
|
179
141
|
/**
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
* - https://github.com/owner/repo
|
|
184
|
-
* - git@github.com:owner/repo.git
|
|
185
|
-
* - git@github.com:owner/repo
|
|
142
|
+
* Extract owner and repo from a GitHub remote URL, in either HTTPS
|
|
143
|
+
* (`https://github.com/owner/repo[.git]`) or SSH
|
|
144
|
+
* (`git@github.com:owner/repo[.git]`) form.
|
|
186
145
|
*/
|
|
187
146
|
static parseRemoteUrl(remoteUrl: string): {
|
|
188
147
|
owner: string;
|
|
@@ -190,7 +149,7 @@ export declare class GitHubService {
|
|
|
190
149
|
};
|
|
191
150
|
}
|
|
192
151
|
/**
|
|
193
|
-
*
|
|
194
|
-
*
|
|
152
|
+
* A GitHub service for this config and remote URL, or null when one cannot be
|
|
153
|
+
* built (mode without PR support, missing token, unparseable remote).
|
|
195
154
|
*/
|
|
196
155
|
export declare const createGitHubService: (config: CanopyConfig, remoteUrl?: string) => GitHubService | null;
|
package/dist/github-service.js
CHANGED
|
@@ -2,24 +2,24 @@ import { Octokit } from '@octokit/rest';
|
|
|
2
2
|
import { throttling } from '@octokit/plugin-throttling';
|
|
3
3
|
import { operatingStrategy } from './operating-mode/index.js';
|
|
4
4
|
import { getErrorMessage } from './utils/error.js';
|
|
5
|
-
// canopyLogWarn, not console.warn:
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// plain console. See utils/logger.ts.
|
|
5
|
+
// canopyLogWarn, not console.warn: the PR create/update path below runs as a
|
|
6
|
+
// worker task, and every worker line must carry worker/log.ts's ISO-8601 prefix
|
|
7
|
+
// or CloudWatch folds it into the previous event. Under Lambda/dev the helper
|
|
8
|
+
// is plain console. See utils/logger.ts.
|
|
10
9
|
import { canopyLogWarn } from './utils/logger.js';
|
|
11
10
|
const ThrottledOctokit = Octokit.plugin(throttling);
|
|
12
11
|
/**
|
|
13
12
|
* Retry primary rate limits at most twice and only for short waits; beyond
|
|
14
13
|
* that, task-level retry/backoff (worker) or the caller's error path takes
|
|
15
|
-
* over
|
|
16
|
-
*
|
|
14
|
+
* over, since the worker's task timeout would abort a longer in-request wait.
|
|
15
|
+
* @internal Exported for tests.
|
|
17
16
|
*/
|
|
18
17
|
export const shouldRetryRateLimit = (retryAfter, retryCount) => retryCount < 2 && retryAfter <= 60;
|
|
19
18
|
/**
|
|
20
19
|
* Secondary (abuse-detection) rate limits are stricter to trip and usually
|
|
21
20
|
* signal we're hammering the API too fast — retry at most once, and only for
|
|
22
21
|
* a short wait.
|
|
22
|
+
* @internal Exported for tests.
|
|
23
23
|
*/
|
|
24
24
|
export const shouldRetrySecondaryRateLimit = (retryAfter, retryCount) => retryCount < 1 && retryAfter <= 60;
|
|
25
25
|
/**
|
|
@@ -30,12 +30,10 @@ export const shouldRetrySecondaryRateLimit = (retryAfter, retryCount) => retryCo
|
|
|
30
30
|
* errors the plugin never sees, like non-403 network failures).
|
|
31
31
|
*/
|
|
32
32
|
export function createCanopyOctokit(options) {
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
// slips past TypeScript's excess-property check. This function's contract is
|
|
38
|
-
// "our Octokit, authenticated the way you say", not "our Octokit, configured
|
|
33
|
+
// Pick the two auth fields out EXPLICITLY, never spread: `baseUrl`,
|
|
34
|
+
// `request`, `log` and `userAgent` are all live `OctokitOptions`, and a
|
|
35
|
+
// non-literal argument slips past TypeScript's excess-property check. The
|
|
36
|
+
// contract is "our Octokit, authenticated the way you say", not "configured
|
|
39
37
|
// however you like".
|
|
40
38
|
const auth = 'authStrategy' in options
|
|
41
39
|
? { authStrategy: options.authStrategy, auth: options.auth }
|
|
@@ -57,15 +55,11 @@ export function createCanopyOctokit(options) {
|
|
|
57
55
|
});
|
|
58
56
|
}
|
|
59
57
|
/**
|
|
60
|
-
* Create or update a pull request
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* number
|
|
64
|
-
*
|
|
65
|
-
* persists the returned PR number, calling this again recovers the
|
|
66
|
-
* existing PR instead of hitting the 422 that a blind create would throw on
|
|
67
|
-
* a duplicate, which previously wedged the branch in 'sync-failed'
|
|
68
|
-
* permanently.
|
|
58
|
+
* Create or update a pull request, idempotently: an open PR from head to base
|
|
59
|
+
* is updated and returned rather than erroring. That keeps PR submission
|
|
60
|
+
* retryable — a caller that crashes after GitHub creates the PR but before it
|
|
61
|
+
* persists the number recovers the existing PR instead of hitting the 422 a
|
|
62
|
+
* blind create throws on a duplicate, which wedges the branch in 'sync-failed'.
|
|
69
63
|
*
|
|
70
64
|
* Shared by `GitHubService.createOrUpdatePR` (direct-API callers) and the
|
|
71
65
|
* worker's `push-and-create-or-update-pr` task, so the list->tiebreak->
|
|
@@ -73,11 +67,9 @@ export function createCanopyOctokit(options) {
|
|
|
73
67
|
*/
|
|
74
68
|
export async function createOrUpdatePullRequest(params) {
|
|
75
69
|
const { octokit, owner, repo, head, base, title, body, markReadyIfDraft, signal } = params;
|
|
76
|
-
// CONDITIONAL spread:
|
|
77
|
-
//
|
|
78
|
-
// assertions in github-service.test.ts depend on this).
|
|
70
|
+
// CONDITIONAL spread: with no signal, the request objects below carry no
|
|
71
|
+
// `request` key at all (github-service.test.ts asserts on their exact shape).
|
|
79
72
|
const requestOption = signal ? { request: { signal } } : {};
|
|
80
|
-
// Check if an open PR already exists for this head/base
|
|
81
73
|
const existingPRs = await octokit.pulls.list({
|
|
82
74
|
owner,
|
|
83
75
|
repo,
|
|
@@ -87,11 +79,9 @@ export async function createOrUpdatePullRequest(params) {
|
|
|
87
79
|
...requestOption,
|
|
88
80
|
});
|
|
89
81
|
if (existingPRs.data.length > 0) {
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
// ever returned, warn and prefer the most recently updated instead of
|
|
94
|
-
// an arbitrary one.
|
|
82
|
+
// GitHub disallows more than one open PR for a head+base pair, so this is
|
|
83
|
+
// normally a single match. Don't trust array order anyway: if more than one
|
|
84
|
+
// comes back, warn and take the most recently updated.
|
|
95
85
|
let existing = existingPRs.data[0];
|
|
96
86
|
if (existingPRs.data.length > 1) {
|
|
97
87
|
existing = [...existingPRs.data].sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime())[0];
|
|
@@ -109,19 +99,16 @@ export async function createOrUpdatePullRequest(params) {
|
|
|
109
99
|
// above is never called with draft: true, so a newly created PR is
|
|
110
100
|
// never draft and needs no conversion.
|
|
111
101
|
if (markReadyIfDraft && existing.draft) {
|
|
112
|
-
//
|
|
113
|
-
//
|
|
102
|
+
// GraphQL: draft conversion has no REST equivalent. The node id comes
|
|
103
|
+
// straight off the list payload — no extra pulls.get.
|
|
114
104
|
//
|
|
115
|
-
// Best-effort
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
// 'sync-failed' even though the PR already exists and is current.
|
|
123
|
-
// Warn and continue instead of letting this sink an already-succeeded
|
|
124
|
-
// submit.
|
|
105
|
+
// Best-effort, because the push and pulls.update above already succeeded:
|
|
106
|
+
// a fine-grained token lacking this mutation's scope throws a
|
|
107
|
+
// GraphqlResponseError with no numeric HTTP status (GraphQL answers 200
|
|
108
|
+
// even for a mutation-level failure), which the worker's
|
|
109
|
+
// isPermanentTaskFailure reads as transient and retries the whole re-push
|
|
110
|
+
// to the cap, wedging the branch in 'sync-failed' even though the PR
|
|
111
|
+
// exists and is current.
|
|
125
112
|
try {
|
|
126
113
|
await octokit.graphql(`
|
|
127
114
|
mutation($pullRequestId: ID!) {
|
|
@@ -142,7 +129,6 @@ export async function createOrUpdatePullRequest(params) {
|
|
|
142
129
|
}
|
|
143
130
|
return { number: existing.number, url: existing.html_url, created: false };
|
|
144
131
|
}
|
|
145
|
-
// Create new PR
|
|
146
132
|
const pr = await octokit.pulls.create({
|
|
147
133
|
owner,
|
|
148
134
|
repo,
|
|
@@ -154,9 +140,6 @@ export async function createOrUpdatePullRequest(params) {
|
|
|
154
140
|
});
|
|
155
141
|
return { number: pr.data.number, url: pr.data.html_url, created: true };
|
|
156
142
|
}
|
|
157
|
-
/**
|
|
158
|
-
* Service for interacting with GitHub API (pull requests, branches, etc.)
|
|
159
|
-
*/
|
|
160
143
|
export class GitHubService {
|
|
161
144
|
constructor(options) {
|
|
162
145
|
this.octokit = createCanopyOctokit({ auth: options.token });
|
|
@@ -164,9 +147,6 @@ export class GitHubService {
|
|
|
164
147
|
this.repo = options.repo;
|
|
165
148
|
this.baseBranch = options.baseBranch ?? 'main';
|
|
166
149
|
}
|
|
167
|
-
/**
|
|
168
|
-
* Create a new pull request
|
|
169
|
-
*/
|
|
170
150
|
async createPullRequest(options) {
|
|
171
151
|
const response = await this.octokit.pulls.create({
|
|
172
152
|
owner: this.owner,
|
|
@@ -182,9 +162,6 @@ export class GitHubService {
|
|
|
182
162
|
url: response.data.html_url,
|
|
183
163
|
};
|
|
184
164
|
}
|
|
185
|
-
/**
|
|
186
|
-
* Update an existing pull request
|
|
187
|
-
*/
|
|
188
165
|
async updatePullRequest(prNumber, options) {
|
|
189
166
|
await this.octokit.pulls.update({
|
|
190
167
|
owner: this.owner,
|
|
@@ -195,12 +172,8 @@ export class GitHubService {
|
|
|
195
172
|
});
|
|
196
173
|
}
|
|
197
174
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
* Thin delegate to the module-level `createOrUpdatePullRequest` helper
|
|
201
|
-
* (shared with the worker's `push-and-create-or-update-pr` task) bound to
|
|
202
|
-
* this instance's octokit/owner/repo. See that function's doc comment for
|
|
203
|
-
* the idempotency rationale.
|
|
175
|
+
* Idempotent create-or-update, bound to this instance's octokit/owner/repo.
|
|
176
|
+
* See {@link createOrUpdatePullRequest}.
|
|
204
177
|
*/
|
|
205
178
|
async createOrUpdatePR(options) {
|
|
206
179
|
const result = await createOrUpdatePullRequest({
|
|
@@ -215,9 +188,6 @@ export class GitHubService {
|
|
|
215
188
|
});
|
|
216
189
|
return { number: result.number, url: result.url };
|
|
217
190
|
}
|
|
218
|
-
/**
|
|
219
|
-
* Get pull request details
|
|
220
|
-
*/
|
|
221
191
|
async getPullRequest(prNumber) {
|
|
222
192
|
const response = await this.octokit.pulls.get({
|
|
223
193
|
owner: this.owner,
|
|
@@ -232,9 +202,6 @@ export class GitHubService {
|
|
|
232
202
|
draft: response.data.draft ?? false,
|
|
233
203
|
};
|
|
234
204
|
}
|
|
235
|
-
/**
|
|
236
|
-
* Convert a pull request to draft
|
|
237
|
-
*/
|
|
238
205
|
async convertToDraft(prNumber) {
|
|
239
206
|
// Use GraphQL API for draft conversion (not available in REST API)
|
|
240
207
|
await this.octokit.graphql(`
|
|
@@ -249,9 +216,6 @@ export class GitHubService {
|
|
|
249
216
|
pullRequestId: await this.getPullRequestNodeId(prNumber),
|
|
250
217
|
});
|
|
251
218
|
}
|
|
252
|
-
/**
|
|
253
|
-
* Convert a draft pull request to ready for review
|
|
254
|
-
*/
|
|
255
219
|
async convertToReady(prNumber) {
|
|
256
220
|
// Use GraphQL API for draft conversion (not available in REST API)
|
|
257
221
|
await this.octokit.graphql(`
|
|
@@ -266,9 +230,6 @@ export class GitHubService {
|
|
|
266
230
|
pullRequestId: await this.getPullRequestNodeId(prNumber),
|
|
267
231
|
});
|
|
268
232
|
}
|
|
269
|
-
/**
|
|
270
|
-
* Close a pull request
|
|
271
|
-
*/
|
|
272
233
|
async closePullRequest(prNumber) {
|
|
273
234
|
await this.octokit.pulls.update({
|
|
274
235
|
owner: this.owner,
|
|
@@ -277,9 +238,6 @@ export class GitHubService {
|
|
|
277
238
|
state: 'closed',
|
|
278
239
|
});
|
|
279
240
|
}
|
|
280
|
-
/**
|
|
281
|
-
* Delete a remote branch
|
|
282
|
-
*/
|
|
283
241
|
async deleteBranch(branchName) {
|
|
284
242
|
await this.octokit.git.deleteRef({
|
|
285
243
|
owner: this.owner,
|
|
@@ -287,9 +245,6 @@ export class GitHubService {
|
|
|
287
245
|
ref: `heads/${branchName}`,
|
|
288
246
|
});
|
|
289
247
|
}
|
|
290
|
-
/**
|
|
291
|
-
* Get the GraphQL node ID for a pull request (needed for draft operations)
|
|
292
|
-
*/
|
|
293
248
|
async getPullRequestNodeId(prNumber) {
|
|
294
249
|
const response = await this.octokit.pulls.get({
|
|
295
250
|
owner: this.owner,
|
|
@@ -299,17 +254,12 @@ export class GitHubService {
|
|
|
299
254
|
return response.data.node_id;
|
|
300
255
|
}
|
|
301
256
|
/**
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
* - https://github.com/owner/repo
|
|
306
|
-
* - git@github.com:owner/repo.git
|
|
307
|
-
* - git@github.com:owner/repo
|
|
257
|
+
* Extract owner and repo from a GitHub remote URL, in either HTTPS
|
|
258
|
+
* (`https://github.com/owner/repo[.git]`) or SSH
|
|
259
|
+
* (`git@github.com:owner/repo[.git]`) form.
|
|
308
260
|
*/
|
|
309
261
|
static parseRemoteUrl(remoteUrl) {
|
|
310
|
-
// Remove .git suffix if present
|
|
311
262
|
const urlWithoutGit = remoteUrl.replace(/\.git$/, '');
|
|
312
|
-
// Try HTTPS format first
|
|
313
263
|
const httpsMatch = urlWithoutGit.match(/https?:\/\/github\.com\/([^/]+)\/([^/]+)/);
|
|
314
264
|
if (httpsMatch) {
|
|
315
265
|
return {
|
|
@@ -333,28 +283,24 @@ export class GitHubService {
|
|
|
333
283
|
}
|
|
334
284
|
}
|
|
335
285
|
/**
|
|
336
|
-
*
|
|
337
|
-
*
|
|
286
|
+
* A GitHub service for this config and remote URL, or null when one cannot be
|
|
287
|
+
* built (mode without PR support, missing token, unparseable remote).
|
|
338
288
|
*/
|
|
339
289
|
export const createGitHubService = (config, remoteUrl) => {
|
|
340
|
-
// Only create service for modes that support pull requests
|
|
341
290
|
const mode = config.mode;
|
|
342
291
|
if (!operatingStrategy(mode).supportsPullRequests()) {
|
|
343
292
|
return null;
|
|
344
293
|
}
|
|
345
|
-
// Get token from environment
|
|
346
294
|
const tokenEnvVar = config.githubTokenEnvVar ?? 'GITHUB_BOT_TOKEN';
|
|
347
295
|
const token = process.env[tokenEnvVar] ?? process.env.CANOPYCMS_GITHUB_TOKEN;
|
|
348
296
|
if (!token) {
|
|
349
297
|
canopyLogWarn(`CanopyCMS: GitHub token not found in ${tokenEnvVar} or CANOPYCMS_GITHUB_TOKEN`);
|
|
350
298
|
return null;
|
|
351
299
|
}
|
|
352
|
-
// Need remote URL to determine owner/repo
|
|
353
300
|
if (!remoteUrl) {
|
|
354
301
|
canopyLogWarn('CanopyCMS: GitHub service requires remoteUrl to determine repository');
|
|
355
302
|
return null;
|
|
356
303
|
}
|
|
357
|
-
// Parse remote URL
|
|
358
304
|
try {
|
|
359
305
|
const { owner, repo } = GitHubService.parseRemoteUrl(remoteUrl);
|
|
360
306
|
return new GitHubService({
|
package/dist/http/handler.d.ts
CHANGED
|
@@ -4,11 +4,7 @@ import { type AuthPlugin } from '../auth/plugin.js';
|
|
|
4
4
|
import { type CanopyServices } from '../services.js';
|
|
5
5
|
import type { CanopyConfig } from '../config/index.js';
|
|
6
6
|
import type { BranchContext } from '../types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Options for creating a Canopy request handler.
|
|
9
|
-
* This is framework-agnostic - adapters convert their framework's
|
|
10
|
-
* request/response types to/from CanopyRequest/CanopyResponse.
|
|
11
|
-
*/
|
|
7
|
+
/** Framework-agnostic: adapters convert to and from CanopyRequest/Response. */
|
|
12
8
|
export interface CanopyHandlerOptions {
|
|
13
9
|
services?: CanopyServices;
|
|
14
10
|
config?: CanopyConfig;
|
|
@@ -17,43 +13,16 @@ export interface CanopyHandlerOptions {
|
|
|
17
13
|
authPlugin: AuthPlugin;
|
|
18
14
|
}
|
|
19
15
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* (e.g. asset serving) can flow through this handler untouched alongside
|
|
23
|
-
* ordinary JSON routes - see `isCanopyBinaryResponse` usage below.
|
|
16
|
+
* Includes `CanopyBinaryResponse` so byte-streaming routes (asset serving) flow
|
|
17
|
+
* through untouched alongside JSON ones — see `isCanopyBinaryResponse` below.
|
|
24
18
|
*/
|
|
25
19
|
export type CanopyRequestHandler = (req: CanopyRequest, pathSegments: string[]) => Promise<CanopyResponse<ApiResponse> | CanopyBinaryResponse>;
|
|
26
20
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* Framework adapters (Next.js, Express, Hono, etc.) should:
|
|
31
|
-
* 1. Convert their framework's request to CanopyRequest
|
|
32
|
-
* 2. Extract path segments from the URL
|
|
33
|
-
* 3. Call this handler
|
|
34
|
-
* 4. Convert the CanopyResponse to their framework's response
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```ts
|
|
38
|
-
* // In a framework adapter
|
|
39
|
-
* const coreHandler = createCanopyRequestHandler({
|
|
40
|
-
* config: myConfig,
|
|
41
|
-
* authPlugin: myAuthPlugin,
|
|
42
|
-
* })
|
|
43
|
-
*
|
|
44
|
-
* // Framework-specific handler
|
|
45
|
-
* async function handleRequest(frameworkReq) {
|
|
46
|
-
* const canopyReq = convertToCanopyRequest(frameworkReq)
|
|
47
|
-
* const segments = extractPathSegments(frameworkReq)
|
|
48
|
-
* const response = await coreHandler(canopyReq, segments)
|
|
49
|
-
* return convertToFrameworkResponse(response)
|
|
50
|
-
* }
|
|
51
|
-
* ```
|
|
21
|
+
* The core handler behind every Canopy API request. A framework adapter
|
|
22
|
+
* (Next.js, Express, Hono) converts its request to a CanopyRequest, extracts
|
|
23
|
+
* the path segments, calls this, and converts the CanopyResponse back.
|
|
52
24
|
*/
|
|
53
25
|
export declare function createCanopyRequestHandler(options: CanopyHandlerOptions): CanopyRequestHandler;
|
|
54
|
-
/**
|
|
55
|
-
* Create a handler with pre-built services from config.
|
|
56
|
-
*/
|
|
57
26
|
export declare function createCanopyRequestHandlerFromConfig(options: {
|
|
58
27
|
config: CanopyConfig;
|
|
59
28
|
} & Omit<CanopyHandlerOptions, 'services' | 'config'>): Promise<CanopyRequestHandler>;
|