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/utils/error.js
CHANGED
|
@@ -1,24 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* These utilities help convert `catch (err: unknown)` to usable error information
|
|
5
|
-
* without using `any` types.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Extract a message string from an unknown error value.
|
|
9
|
-
*
|
|
10
|
-
* @param err - The caught error (unknown type)
|
|
11
|
-
* @returns A string message suitable for logging or user display
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```ts
|
|
15
|
-
* try {
|
|
16
|
-
* await riskyOperation()
|
|
17
|
-
* } catch (err: unknown) {
|
|
18
|
-
* canopyLogError('Operation failed:', getErrorMessage(err))
|
|
19
|
-
* }
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
1
|
+
/** Reading a `catch (err: unknown)` value as usable error information, without `any`. */
|
|
2
|
+
/** Message string for an unknown thrown value. */
|
|
22
3
|
export function getErrorMessage(err) {
|
|
23
4
|
if (err instanceof Error) {
|
|
24
5
|
return err.message;
|
|
@@ -29,70 +10,51 @@ export function getErrorMessage(err) {
|
|
|
29
10
|
return String(err);
|
|
30
11
|
}
|
|
31
12
|
/**
|
|
32
|
-
* Redact sensitive material from an error message before
|
|
33
|
-
*
|
|
13
|
+
* Redact sensitive material from an error message before it reaches an API client. Log the
|
|
14
|
+
* ORIGINAL message server-side; send the sanitized one.
|
|
34
15
|
*
|
|
35
|
-
* Git/filesystem
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* -
|
|
16
|
+
* Git/filesystem error text is unbounded (stderr varies by git version and locale, and hooks
|
|
17
|
+
* print anything), so this redacts the known-sensitive SHAPES rather than enumerating safe
|
|
18
|
+
* messages: credentials embedded in URLs (`https://x-access-token:tok@github.com/…`) and
|
|
19
|
+
* absolute filesystem paths (workspace roots, EFS mounts, home directories). Paths under the
|
|
20
|
+
* current working directory are shortened to relative form (CMS-internal layout like
|
|
21
|
+
* `.canopy-dev/remote.git` helps debugging and is not sensitive); absolute paths outside it
|
|
22
|
+
* become `<path>`.
|
|
41
23
|
*
|
|
42
|
-
*
|
|
43
|
-
* (
|
|
44
|
-
*
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* Grep `[REDACT]` to find every site that persists or surfaces raw error text on
|
|
50
|
-
* a path that reaches a browser — worker task errors folded into
|
|
51
|
-
* `worker-status.json`, `branch.json` parse failures served by the admin
|
|
52
|
-
* branch-health endpoint, rebase-failure messages, and their tests.
|
|
53
|
-
*
|
|
54
|
-
* Those sites carried the tag `[HIGH-1]`/`[MEDIUM-2]` until 2026-08-23, IDs from
|
|
55
|
-
* a review pass whose findings list was never committed — 13 occurrences across
|
|
56
|
-
* 6 files resolving to nothing. Renamed rather than deleted because the
|
|
57
|
-
* underlying rule is real and genuinely cross-file: a Node error embeds absolute
|
|
58
|
-
* paths, and a git remote URL can embed a token, so anything on that path is
|
|
59
|
-
* redacted through the function below.
|
|
60
|
-
*
|
|
61
|
-
* The tag is a grep aid, not the rule. The rule is stated at each site.
|
|
24
|
+
* TAG: `[REDACT]` — grep it for every site that persists or surfaces raw error text on a path
|
|
25
|
+
* reaching a browser (worker task errors folded into `worker-status.json`, `branch.json` parse
|
|
26
|
+
* failures served by the admin branch-health endpoint, rebase-failure messages, and their
|
|
27
|
+
* tests). A Node error embeds absolute paths and a git remote URL can embed a token, so
|
|
28
|
+
* everything on such a path goes through this function. The tag is a grep aid; the rule itself
|
|
29
|
+
* is stated at each site.
|
|
62
30
|
*/
|
|
63
31
|
export function sanitizeErrorMessage(message) {
|
|
64
32
|
let result = redactCredentials(message);
|
|
65
|
-
// Paths under the project root become relative (split/join avoids regex
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
// the cwd prefix (e.g. `${cwd}-other/…`) stay absolute and get fully
|
|
33
|
+
// Paths under the project root become relative (split/join avoids regex-escaping issues with
|
|
34
|
+
// arbitrary cwd values). The bare-cwd replacement is anchored to a token boundary so a sibling
|
|
35
|
+
// directory that merely shares the cwd prefix (`${cwd}-other/…`) stays absolute and is fully
|
|
69
36
|
// redacted below instead of leaking a mangled remainder.
|
|
70
37
|
const cwd = process.cwd();
|
|
71
38
|
if (cwd !== '/') {
|
|
72
39
|
result = result.split(`${cwd}/`).join('');
|
|
73
40
|
const cwdPattern = cwd.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
74
|
-
// cwdPattern is process.cwd() (server-controlled, not attacker
|
|
75
|
-
//
|
|
76
|
-
//
|
|
41
|
+
// cwdPattern is process.cwd() (server-controlled, not attacker or entry-content data) with
|
|
42
|
+
// regex metacharacters escaped by the literal regex above, so it cannot inject an
|
|
43
|
+
// attacker-chosen pattern.
|
|
77
44
|
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
78
45
|
result = result.replace(new RegExp(`${cwdPattern}(?=[\\s'"),:;]|$)`, 'g'), '.');
|
|
79
46
|
}
|
|
80
|
-
// Quoted absolute paths (git quotes most paths
|
|
81
|
-
// the whole quoted span, spaces included.
|
|
47
|
+
// Quoted absolute paths (git quotes most paths): redact the whole quoted span, spaces included.
|
|
82
48
|
result = result.replace(/'\/[^']*'/g, "'<path>'").replace(/"\/[^"]*"/g, '"<path>"');
|
|
83
|
-
// Remaining absolute POSIX paths (outside cwd, e.g. /mnt/efs/…). The
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
// separators, so this is not generally solvable here.
|
|
49
|
+
// Remaining absolute POSIX paths (outside cwd, e.g. /mnt/efs/…). The leading boundary keeps
|
|
50
|
+
// URL slashes (`https://host/…`) untouched. Known limitation: an UNQUOTED path containing
|
|
51
|
+
// spaces is only redacted up to the first space — spaces are legal both inside paths and as
|
|
52
|
+
// message separators, so that is not generally solvable here.
|
|
88
53
|
//
|
|
89
|
-
// The repeated group `(?:[^/\s'")]+\/)+` looks nested-quantifier-shaped, but
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
// does not backtrack catastrophically. Verified empirically with inputs up
|
|
94
|
-
// to 400k chars (adversarial runs of non-slash chars, with and without
|
|
95
|
-
// trailing slashes): scaling stayed linear, not quadratic/exponential.
|
|
54
|
+
// The repeated group `(?:[^/\s'")]+\/)+` looks nested-quantifier-shaped, but its inner class
|
|
55
|
+
// excludes `/`, so each repetition can only end at a literal `/`: a matched string has exactly
|
|
56
|
+
// one decomposition, so it cannot backtrack catastrophically. Measured linear on adversarial
|
|
57
|
+
// inputs up to 400k chars.
|
|
96
58
|
// eslint-disable-next-line security/detect-unsafe-regex
|
|
97
59
|
result = result.replace(/(^|[\s'"(=:,[])\/(?:[^/\s'")]+\/)+[^/\s'")]*/g, '$1<path>');
|
|
98
60
|
// Windows drive paths
|
|
@@ -100,106 +62,57 @@ export function sanitizeErrorMessage(message) {
|
|
|
100
62
|
return result;
|
|
101
63
|
}
|
|
102
64
|
/**
|
|
103
|
-
* Redact only credential material
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* which calls this and then also redacts paths.
|
|
65
|
+
* Redact only credential material, leaving filesystem paths intact — for server-side log lines
|
|
66
|
+
* that deliberately keep full path detail for debugging but must never persist a live token.
|
|
67
|
+
* Client-facing messages go through `sanitizeErrorMessage` instead, which calls this and then
|
|
68
|
+
* also redacts paths.
|
|
108
69
|
*/
|
|
109
70
|
export function redactCredentials(message) {
|
|
110
71
|
let result = message;
|
|
111
|
-
// Credentials in URLs: scheme://user:token@host or scheme://token@host.
|
|
112
|
-
//
|
|
113
|
-
//
|
|
114
|
-
// (CodeQL js/polynomial-redos).
|
|
72
|
+
// Credentials in URLs: scheme://user:token@host or scheme://token@host. Anchored on the
|
|
73
|
+
// literal `://` (leaving the scheme untouched) — a `\w+` scheme prefix backtracks
|
|
74
|
+
// polynomially on long word-character runs (CodeQL js/polynomial-redos).
|
|
115
75
|
result = result.replace(/(:\/\/)[^/\s@]+@/g, '$1***@');
|
|
116
|
-
// Bare token shapes
|
|
117
|
-
//
|
|
76
|
+
// Bare token shapes, for messages embedding a token outside URL userinfo: GitHub token
|
|
77
|
+
// prefixes and Bearer values.
|
|
118
78
|
result = result.replace(/\b(?:gh[pousr]|github_pat)_[A-Za-z0-9_]{8,}/g, '***');
|
|
119
79
|
result = result.replace(/\b(Bearer\s+)[A-Za-z0-9._~+/=-]{8,}/g, '$1***');
|
|
120
|
-
// PEM private-key blocks — a GitHub App's private key. Defense-in-depth
|
|
121
|
-
//
|
|
122
|
-
//
|
|
123
|
-
// `error:1E08010C:DECODER routines::unsupported` and jsonwebtoken's report
|
|
124
|
-
// neither `BEGIN` nor the body), and a rule added before the first leak
|
|
125
|
-
// costs nothing. None of the rules above would match one: a PEM has no URL
|
|
126
|
-
// userinfo, no `gh*_` prefix and no `Bearer`.
|
|
127
|
-
//
|
|
128
|
-
// Linear by construction. The label is `[A-Z]{0,9} ?` (bounded, so its
|
|
129
|
-
// backtracking is a constant factor) rather than an open `[A-Z ]*`, which
|
|
130
|
-
// would rescan a long run of capitals at every start position. The lazy
|
|
131
|
-
// `[\s\S]*?` is stopped by the END footer, or by end-of-string when the
|
|
132
|
-
// message was truncated mid-key — without that second alternative a
|
|
133
|
-
// half-quoted key would pass through in full.
|
|
80
|
+
// PEM private-key blocks — a GitHub App's private key. Defense-in-depth like the bare-token
|
|
81
|
+
// rules above: nothing today puts key material into an error, and none of those rules would
|
|
82
|
+
// match one (a PEM has no URL userinfo, no `gh*_` prefix and no `Bearer`).
|
|
134
83
|
//
|
|
135
|
-
// The
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
// through to `$`, which over-redacts — the safe direction.
|
|
84
|
+
// Linear by construction. The label is bounded (`[A-Z]{0,9} ?`) rather than an open `[A-Z ]*`,
|
|
85
|
+
// which would rescan a long run of capitals at every start position, and the lazy `[\s\S]*?`
|
|
86
|
+
// stops at the END footer or at end-of-string — without that second alternative a key
|
|
87
|
+
// truncated mid-message passes through in full. The footer is spelled out rather than
|
|
88
|
+
// "`-----END` then anything up to the next dashes": greedy `[^\n]*` swallows the text after
|
|
89
|
+
// the key, and lazy `[^\n]*?-----` stops on a label-less `-----END-----` and leaves a SECOND
|
|
90
|
+
// key unredacted. Anything else falls through to `$`, which over-redacts — the safe direction.
|
|
142
91
|
result = result.replace(/-----BEGIN [A-Z]{0,9} ?PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z]{0,9} ?PRIVATE KEY-----|$)/g, '<private-key>');
|
|
143
92
|
// Bare JWTs (`eyJ…`) — three dot-separated base64url runs.
|
|
144
93
|
//
|
|
145
|
-
// The leading boundary is `(?<![\w-])`, NOT `\b
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
// numbers are machine-dependent; the quadrupling per doubling is not). With
|
|
151
|
-
// the lookbehind the same 160KB input is under a millisecond. It gives up
|
|
152
|
-
// exactly one case: a JWT
|
|
153
|
-
// glued directly to a preceding hyphen (`x-eyJ…`); every real prefix —
|
|
94
|
+
// The leading boundary is `(?<![\w-])`, NOT `\b`: `-` is in the run class but is not a word
|
|
95
|
+
// character, so under `\b` every `-eyJ` inside one long `[\w-]` run starts a fresh match
|
|
96
|
+
// attempt that rescans the rest of the run for a `.` that never comes — quadratic, measured in
|
|
97
|
+
// seconds on a 160KB input where the lookbehind stays under a millisecond. It gives up exactly
|
|
98
|
+
// one case: a JWT glued directly to a preceding hyphen (`x-eyJ…`); every real prefix —
|
|
154
99
|
// whitespace, `"`, `=`, `(`, `Bearer ` — still matches.
|
|
155
100
|
result = result.replace(/(?<![\w-])eyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]+/g, '***');
|
|
156
101
|
return result;
|
|
157
102
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Type guard to check if an error is a Node.js system error with a code property.
|
|
160
|
-
*
|
|
161
|
-
* @param err - The caught error (unknown type)
|
|
162
|
-
* @returns True if the error has a `code` property (like ENOENT, EACCES, etc.)
|
|
163
|
-
*
|
|
164
|
-
* @example
|
|
165
|
-
* ```ts
|
|
166
|
-
* try {
|
|
167
|
-
* await fs.readFile(path)
|
|
168
|
-
* } catch (err: unknown) {
|
|
169
|
-
* if (isNodeError(err) && err.code === 'ENOENT') {
|
|
170
|
-
* return null // File not found is expected
|
|
171
|
-
* }
|
|
172
|
-
* throw err
|
|
173
|
-
* }
|
|
174
|
-
* ```
|
|
175
|
-
*/
|
|
103
|
+
/** True for a Node system error — an `Error` carrying a `code` (ENOENT, EACCES, …). */
|
|
176
104
|
export function isNodeError(err) {
|
|
177
105
|
return err instanceof Error && 'code' in err;
|
|
178
106
|
}
|
|
179
|
-
/**
|
|
180
|
-
* Check if an error indicates a "file not found" condition.
|
|
181
|
-
*
|
|
182
|
-
* @param err - The caught error (unknown type)
|
|
183
|
-
* @returns True if the error is ENOENT (file/directory not found)
|
|
184
|
-
*/
|
|
107
|
+
/** True for ENOENT. */
|
|
185
108
|
export function isNotFoundError(err) {
|
|
186
109
|
return isNodeError(err) && err.code === 'ENOENT';
|
|
187
110
|
}
|
|
188
|
-
/**
|
|
189
|
-
* Check if an error indicates a "permission denied" condition.
|
|
190
|
-
*
|
|
191
|
-
* @param err - The caught error (unknown type)
|
|
192
|
-
* @returns True if the error is EACCES (permission denied)
|
|
193
|
-
*/
|
|
111
|
+
/** True for EACCES. */
|
|
194
112
|
export function isPermissionError(err) {
|
|
195
113
|
return isNodeError(err) && err.code === 'EACCES';
|
|
196
114
|
}
|
|
197
|
-
/**
|
|
198
|
-
* Check if an error indicates a "file already exists" condition.
|
|
199
|
-
*
|
|
200
|
-
* @param err - The caught error (unknown type)
|
|
201
|
-
* @returns True if the error is EEXIST (file already exists)
|
|
202
|
-
*/
|
|
115
|
+
/** True for EEXIST. */
|
|
203
116
|
export function isFileExistsError(err) {
|
|
204
117
|
return isNodeError(err) && err.code === 'EEXIST';
|
|
205
118
|
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { FieldConfig } from '../config/index.js';
|
|
2
2
|
/**
|
|
3
|
-
* Recursively flatten inline groups out of a field array
|
|
4
|
-
*
|
|
3
|
+
* Recursively flatten inline groups out of a field array: group children are inlined at the
|
|
4
|
+
* parent level, because groups are transparent to data.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Not needed when using traverseFields() — that already handles groups transparently.
|
|
6
|
+
* For data-layer iteration (reference resolution, change detection, body-field lookup) that
|
|
7
|
+
* needs every data-carrying field without group wrappers. `traverseFields()` already handles
|
|
8
|
+
* groups transparently and does not need this.
|
|
11
9
|
*/
|
|
12
10
|
export declare function flattenGroupFields(fields: readonly FieldConfig[]): FieldConfig[];
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Recursively flatten inline groups out of a field array
|
|
3
|
-
*
|
|
2
|
+
* Recursively flatten inline groups out of a field array: group children are inlined at the
|
|
3
|
+
* parent level, because groups are transparent to data.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Not needed when using traverseFields() — that already handles groups transparently.
|
|
5
|
+
* For data-layer iteration (reference resolution, change detection, body-field lookup) that
|
|
6
|
+
* needs every data-carrying field without group wrappers. `traverseFields()` already handles
|
|
7
|
+
* groups transparently and does not need this.
|
|
10
8
|
*/
|
|
11
9
|
export function flattenGroupFields(fields) {
|
|
12
10
|
const result = [];
|
package/dist/utils/format.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import type { ContentFormat } from '../config/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* Get the file extension for a content format
|
|
4
|
-
* @param format - The content format (md, mdx, json, yaml)
|
|
5
|
-
* @returns The file extension including the dot (e.g., '.md', '.json', '.yaml')
|
|
6
|
-
*/
|
|
2
|
+
/** The file extension, dot included, for a content format. */
|
|
7
3
|
export declare const getFormatExtension: (format: ContentFormat) => string;
|
|
8
4
|
/** Returns true for data-only formats (no body/frontmatter separation) */
|
|
9
5
|
export declare const isDataOnlyFormat: (format: ContentFormat) => boolean;
|
package/dist/utils/format.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get the file extension for a content format
|
|
3
|
-
* @param format - The content format (md, mdx, json, yaml)
|
|
4
|
-
* @returns The file extension including the dot (e.g., '.md', '.json', '.yaml')
|
|
5
|
-
*/
|
|
1
|
+
/** The file extension, dot included, for a content format. */
|
|
6
2
|
export const getFormatExtension = (format) => {
|
|
7
3
|
if (format === 'md')
|
|
8
4
|
return '.md';
|
package/dist/utils/fs.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/** Check if a path exists on disk. */
|
|
2
2
|
export declare function filePathExists(filePath: string): Promise<boolean>;
|
|
3
3
|
/**
|
|
4
|
-
* Read a UTF-8 file, or
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* mistake "unreadable" for "not there yet".
|
|
4
|
+
* Read a UTF-8 file, or undefined if it does not exist. Only ENOENT is swallowed — a
|
|
5
|
+
* permissions or I/O failure still throws, so a caller cannot mistake "unreadable" for
|
|
6
|
+
* "not there yet".
|
|
8
7
|
*/
|
|
9
8
|
export declare function readFileIfExists(filePath: string): Promise<string | undefined>;
|
package/dist/utils/fs.js
CHANGED
|
@@ -13,10 +13,9 @@ export async function filePathExists(filePath) {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
* Read a UTF-8 file, or
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* mistake "unreadable" for "not there yet".
|
|
16
|
+
* Read a UTF-8 file, or undefined if it does not exist. Only ENOENT is swallowed — a
|
|
17
|
+
* permissions or I/O failure still throws, so a caller cannot mistake "unreadable" for
|
|
18
|
+
* "not there yet".
|
|
20
19
|
*/
|
|
21
20
|
export async function readFileIfExists(filePath) {
|
|
22
21
|
try {
|
package/dist/utils/git.d.ts
CHANGED
|
@@ -1,113 +1,82 @@
|
|
|
1
1
|
import type { OperatingMode } from '../operating-mode/index.js';
|
|
2
2
|
/**
|
|
3
|
-
* Whether a git remote URL points at a network location
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* rather than a local filesystem path.
|
|
3
|
+
* Whether a git remote URL points at a network location rather than a local filesystem path. Only
|
|
4
|
+
* `file://` URLs, plain filesystem paths and Windows drive paths are LOCAL; the patterns above
|
|
5
|
+
* enumerate the network forms.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* misconfig (not being a strict URL parser), this classifier treats anything
|
|
15
|
-
* git could interpret as a network transport, a transport helper, or a
|
|
16
|
-
* command-line option as "network". The one local carve-out beyond `file://`
|
|
17
|
-
* is a Windows drive path (`C:\...` / `C:/...`), which replaces the old
|
|
18
|
-
* `@`-required heuristic for scp-like syntax.
|
|
7
|
+
* The distinction GitManager's prod-mode network-remote guard relies on (see `resolveRemoteUrl`):
|
|
8
|
+
* the intended prod topology only ever resolves a local path (an auto-detected/auto-initialized
|
|
9
|
+
* `remote.git`), so anything network arriving via an explicit param, config, or env var is almost
|
|
10
|
+
* always a prod misconfiguration. Catching that is the job, not being a strict URL parser, so
|
|
11
|
+
* anything git could read as a network transport, a transport helper, or a command-line option
|
|
12
|
+
* counts as "network".
|
|
19
13
|
*/
|
|
20
14
|
export declare function isNetworkRemoteUrl(url: string): boolean;
|
|
21
15
|
/**
|
|
22
|
-
* Whether a git push failure message is git's non-fast-forward rejection --
|
|
23
|
-
* the
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* the same content-branch name, or someone pushing directly to GitHub.
|
|
16
|
+
* Whether a git push failure message is git's non-fast-forward rejection -- the remote has
|
|
17
|
+
* diverged, so retrying the IDENTICAL push can never succeed. In CanopyCMS that means two
|
|
18
|
+
* deployments sharing one GitHub repo and picking the same content-branch name, or someone pushing
|
|
19
|
+
* directly to GitHub.
|
|
27
20
|
*
|
|
28
|
-
* Deliberately narrow: ordinary transient push failures -- network drops,
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* this specific, structurally-unretryable shape should fail fast (worker) or
|
|
33
|
-
* return 409 (API) instead.
|
|
21
|
+
* Deliberately narrow: ordinary transient push failures -- network drops, auth/permission denial,
|
|
22
|
+
* lock contention -- must keep retrying with backoff (worker/task-runner.ts's
|
|
23
|
+
* `isPermanentTaskFailure` treats git failures as transient precisely so they do). Only this
|
|
24
|
+
* structurally-unretryable shape fails fast (worker) or returns 409 (API).
|
|
34
25
|
*
|
|
35
|
-
* Matches git's literal
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* LANG/LC_ALL could silently turn this into a permanent no-op.
|
|
26
|
+
* Matches git's literal English rejection text, which is gettext-translated: callers MUST run the
|
|
27
|
+
* git command with a locale-pinning env (`gitChildEnv` in `../git-manager.ts`), or an ambient
|
|
28
|
+
* LANG/LC_ALL silently turns this into a permanent no-op.
|
|
39
29
|
*/
|
|
40
30
|
export declare function isNonFastForwardRejection(message: string): boolean;
|
|
41
31
|
/**
|
|
42
|
-
* Whether a git push failure message is a refused `--force-with-lease` --
|
|
43
|
-
* the
|
|
44
|
-
* update was declined and nothing was overwritten.
|
|
32
|
+
* Whether a git push failure message is a refused `--force-with-lease` -- the remote ref is NOT at
|
|
33
|
+
* the commit the pusher expected, so the forced update was declined and nothing overwritten.
|
|
45
34
|
*
|
|
46
|
-
* A SEPARATE predicate from `isNonFastForwardRejection` because git's output
|
|
47
|
-
*
|
|
48
|
-
* `
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* refusal would be classified transient and retried -- three identical,
|
|
52
|
-
* guaranteed-to-fail force attempts -- instead of surfacing as the permanent,
|
|
53
|
-
* human-actionable state it is.
|
|
54
|
-
*
|
|
55
|
-
* Same locale caveat as above: the reason text is gettext-translated, so
|
|
56
|
-
* callers MUST pin the locale (`gitChildEnv`/`gitNetworkChildEnv`).
|
|
35
|
+
* A SEPARATE predicate from `isNonFastForwardRejection` because git's output for the two is
|
|
36
|
+
* disjoint: a refused lease prints `(stale info)` and emits NEITHER `non-fast-forward`/`fetch
|
|
37
|
+
* first` NOR the `Updates were rejected because` hint. Without it every lease refusal is
|
|
38
|
+
* classified transient and retried -- identical, guaranteed-to-fail force attempts -- instead of
|
|
39
|
+
* surfacing as the permanent, human-actionable state it is. Same locale caveat as above.
|
|
57
40
|
*/
|
|
58
41
|
export declare function isStaleLeaseRejection(message: string): boolean;
|
|
59
42
|
/**
|
|
60
|
-
* Whether a `git fetch <remote> <branch>` failure is specifically "that ref
|
|
61
|
-
*
|
|
62
|
-
* branch has never been pushed.
|
|
63
|
-
*
|
|
64
|
-
* Narrow on purpose, and the narrowness is the whole point. This predicate
|
|
65
|
-
* exists because a bare `catch` around the fetch classified EVERY failure --
|
|
66
|
-
* unreachable remote, auth denial, permission error on the workspace, corrupt
|
|
67
|
-
* object store -- as "nothing to pull", which callers then logged as normal
|
|
68
|
-
* and proceeded past. Anything this does not recognize must reach the caller
|
|
69
|
-
* as the genuine error it is.
|
|
43
|
+
* Whether a `git fetch <remote> <branch>` failure is specifically "that ref doesn't exist on the
|
|
44
|
+
* remote" -- the ONLY benign fetch outcome, meaning the branch has never been pushed.
|
|
70
45
|
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
46
|
+
* Narrow on purpose, and the narrowness is the point: a bare `catch` around the fetch classifies
|
|
47
|
+
* EVERY failure -- unreachable remote, auth denial, permission error on the workspace, corrupt
|
|
48
|
+
* object store -- as "nothing to pull", which callers then log as normal and proceed past.
|
|
49
|
+
* Anything this does not recognize must reach the caller as the genuine error it is. Same locale
|
|
50
|
+
* caveat as the predicates above.
|
|
73
51
|
*/
|
|
74
52
|
export declare function isMissingRemoteRefFailure(message: string): boolean;
|
|
75
53
|
/**
|
|
76
|
-
* Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge`
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* mid-
|
|
54
|
+
* Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge` (interactive/merge
|
|
55
|
+
* backend) or `rebase-apply` (am backend) state directory git leaves when a rebase stops for
|
|
56
|
+
* conflicts or the process dies mid-way. Invisible to every other check the worker makes: a clone
|
|
57
|
+
* left mid-rebase reports uncommitted changes, so the sync loop's dirty check skips it as
|
|
58
|
+
* `skippedDirty` on every cycle forever, and `branch-health` sees valid branch.json and scans it
|
|
59
|
+
* as healthy. Nothing self-heals without it.
|
|
80
60
|
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* branch.json and scans it as healthy. Nothing self-heals, and recovery
|
|
85
|
-
* previously meant an operator running `git rebase --abort` on EFS by hand.
|
|
86
|
-
*
|
|
87
|
-
* Never throws — a missing or unreadable repo is reported as "no rebase",
|
|
88
|
-
* which is the safe direction for both callers (the worker only ever uses a
|
|
89
|
-
* `true` to justify an abort it holds the content-write lock for).
|
|
61
|
+
* Never throws — a missing or unreadable repo is reported as "no rebase", the safe direction for
|
|
62
|
+
* both callers (the worker only uses a `true` to justify an abort it holds the content-write lock
|
|
63
|
+
* for).
|
|
90
64
|
*/
|
|
91
65
|
export declare function isRebaseInProgress(repoPath: string): Promise<boolean>;
|
|
92
66
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* if detection fails or HEAD is detached.
|
|
67
|
+
* The repository's current HEAD branch name, or `fallback` when detection fails or HEAD is
|
|
68
|
+
* detached.
|
|
96
69
|
*/
|
|
97
70
|
export declare function detectHeadBranch(repoRoot: string, fallback?: string): Promise<string>;
|
|
98
71
|
/**
|
|
99
|
-
* Resolve the base branch — the fork point for CMS editing branches and the
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* - An explicitly configured `defaultBaseBranch` always wins, in both modes.
|
|
105
|
-
* - In dev mode it is detected from the current git HEAD, so workspaces fork
|
|
106
|
-
* from the branch the developer has checked out.
|
|
107
|
-
* - Otherwise it is 'main'.
|
|
72
|
+
* Resolve the base branch — the fork point for CMS editing branches and the branch workspace
|
|
73
|
+
* clones are seeded from. The single definition of base-branch behavior (see ARCHITECTURE.md
|
|
74
|
+
* "Branch Identity"): a configured `defaultBaseBranch` always wins in both modes; dev mode
|
|
75
|
+
* otherwise detects the current git HEAD, so workspaces fork from the developer's checked-out
|
|
76
|
+
* branch; otherwise 'main'.
|
|
108
77
|
*
|
|
109
|
-
* Static deployments never reach git operations, so callers
|
|
110
|
-
*
|
|
78
|
+
* Static deployments never reach git operations, so callers on static paths must short-circuit
|
|
79
|
+
* before calling this (see createCanopyServices).
|
|
111
80
|
*/
|
|
112
81
|
export declare function resolveBaseBranch(options: {
|
|
113
82
|
defaultBaseBranch?: string;
|