canopycms 0.0.67-int.90 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -3
- package/dist/ai/generate.js +1 -27
- package/dist/ai/handler.d.ts +0 -4
- package/dist/ai/handler.js +0 -11
- package/dist/ai/index.d.ts +1 -8
- package/dist/ai/index.js +1 -8
- package/dist/ai/json-to-markdown.js +15 -58
- package/dist/ai/resolve-branch.d.ts +2 -7
- package/dist/ai/resolve-branch.js +2 -8
- package/dist/ai/strip-mdx.d.ts +5 -13
- package/dist/ai/strip-mdx.js +5 -17
- package/dist/ai/to-plain-text.d.ts +10 -28
- package/dist/ai/to-plain-text.js +10 -28
- package/dist/ai/transform-components.d.ts +2 -4
- package/dist/ai/transform-components.js +8 -19
- package/dist/ai/types.d.ts +5 -10
- package/dist/api/admin-branch-health.d.ts +4 -12
- package/dist/api/admin-branch-health.js +26 -66
- package/dist/api/admin.d.ts +4 -12
- package/dist/api/admin.js +10 -26
- package/dist/api/assets.d.ts +0 -25
- package/dist/api/assets.js +50 -91
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +0 -2
- package/dist/api/branch-review.d.ts +0 -8
- package/dist/api/branch-review.js +0 -13
- package/dist/api/branch-status.d.ts +0 -3
- package/dist/api/branch-status.js +8 -33
- package/dist/api/branch-withdraw.d.ts +0 -1
- package/dist/api/branch-withdraw.js +6 -9
- package/dist/api/branch.d.ts +7 -12
- package/dist/api/branch.js +7 -44
- package/dist/api/client.d.ts +71 -224
- package/dist/api/client.js +82 -233
- package/dist/api/comments.d.ts +2 -4
- package/dist/api/comments.js +0 -17
- package/dist/api/content.d.ts +0 -6
- package/dist/api/content.js +66 -142
- package/dist/api/entries-constants.d.ts +5 -9
- package/dist/api/entries-constants.js +5 -9
- package/dist/api/entries.d.ts +8 -13
- package/dist/api/entries.js +20 -51
- package/dist/api/github-sync.d.ts +2 -4
- package/dist/api/github-sync.js +4 -8
- package/dist/api/groups.d.ts +3 -0
- package/dist/api/groups.js +8 -21
- package/dist/api/guards.d.ts +4 -16
- package/dist/api/guards.js +3 -22
- package/dist/api/index.d.ts +4 -4
- package/dist/api/permissions.d.ts +2 -0
- package/dist/api/permissions.js +18 -40
- package/dist/api/reference-options.d.ts +0 -1
- package/dist/api/reference-options.js +3 -11
- package/dist/api/request-body-hash.d.ts +12 -23
- package/dist/api/request-body-hash.js +12 -23
- package/dist/api/resolve-references.d.ts +0 -1
- package/dist/api/resolve-references.js +13 -28
- package/dist/api/route-builder.d.ts +3 -7
- package/dist/api/route-builder.js +1 -1
- package/dist/api/routes.d.ts +12 -0
- package/dist/api/routes.js +47 -0
- package/dist/api/schema.d.ts +23 -33
- package/dist/api/schema.js +20 -74
- package/dist/api/settings-helpers.js +4 -5
- package/dist/api/types.d.ts +0 -5
- package/dist/api/user.js +0 -5
- package/dist/api/validators.d.ts +14 -52
- package/dist/api/validators.js +14 -52
- package/dist/assets/asset-prefixes.d.ts +4 -8
- package/dist/assets/asset-prefixes.js +4 -8
- package/dist/assets/asset-src.d.ts +5 -22
- package/dist/assets/asset-src.js +5 -21
- package/dist/assets/factory.d.ts +1 -2
- package/dist/assets/factory.js +1 -2
- package/dist/assets/finalize.d.ts +3 -1
- package/dist/assets/finalize.js +3 -1
- package/dist/assets/index.d.ts +3 -3
- package/dist/assets/index.js +1 -1
- package/dist/assets/keys.d.ts +5 -3
- package/dist/assets/keys.js +6 -3
- package/dist/assets/pipeline.d.ts +3 -2
- package/dist/assets/pipeline.js +22 -56
- package/dist/assets/sharp-loader.d.ts +2 -10
- package/dist/assets/sharp-loader.js +2 -10
- package/dist/assets/store-local.d.ts +1 -2
- package/dist/assets/store-local.js +1 -2
- package/dist/assets/store-s3.d.ts +3 -4
- package/dist/assets/svg-sanitizer.d.ts +6 -14
- package/dist/assets/svg-sanitizer.js +6 -14
- package/dist/assets/transform-directives.d.ts +3 -4
- package/dist/assets/transform-directives.js +1 -1
- package/dist/assets/transform.d.ts +19 -30
- package/dist/assets/transform.js +18 -31
- package/dist/auth/cache.d.ts +2 -3
- package/dist/auth/cache.js +2 -3
- package/dist/auth/caching-auth-plugin.d.ts +11 -22
- package/dist/auth/caching-auth-plugin.js +12 -14
- package/dist/auth/context-helpers.d.ts +6 -20
- package/dist/auth/context-helpers.js +5 -17
- package/dist/auth/file-based-auth-cache.d.ts +10 -21
- package/dist/auth/file-based-auth-cache.js +23 -51
- package/dist/auth/plugin.d.ts +29 -61
- package/dist/auth/plugin.js +9 -13
- package/dist/auth/types.d.ts +11 -20
- package/dist/authorization/branch.d.ts +30 -49
- package/dist/authorization/branch.js +16 -42
- package/dist/authorization/content.d.ts +11 -40
- package/dist/authorization/content.js +13 -45
- package/dist/authorization/groups/index.d.ts +0 -3
- package/dist/authorization/groups/index.js +0 -3
- package/dist/authorization/groups/loader.d.ts +14 -28
- package/dist/authorization/groups/loader.js +14 -38
- package/dist/authorization/groups/schema.d.ts +0 -6
- package/dist/authorization/groups/schema.js +4 -7
- package/dist/authorization/helpers.d.ts +9 -28
- package/dist/authorization/helpers.js +9 -28
- package/dist/authorization/index.d.ts +3 -25
- package/dist/authorization/index.js +3 -35
- package/dist/authorization/path.d.ts +6 -13
- package/dist/authorization/path.js +8 -25
- package/dist/authorization/permissions/index.d.ts +0 -3
- package/dist/authorization/permissions/index.js +0 -3
- package/dist/authorization/permissions/loader.d.ts +14 -27
- package/dist/authorization/permissions/loader.js +14 -32
- package/dist/authorization/permissions/schema.d.ts +1 -6
- package/dist/authorization/permissions/schema.js +6 -13
- package/dist/authorization/protected-branch.d.ts +36 -65
- package/dist/authorization/protected-branch.js +29 -41
- package/dist/authorization/settings-file-store.d.ts +38 -81
- package/dist/authorization/settings-file-store.js +38 -79
- package/dist/authorization/types.d.ts +4 -26
- package/dist/authorization/types.js +0 -6
- package/dist/authorization/validation.d.ts +1 -23
- package/dist/authorization/validation.js +1 -24
- package/dist/branch-health.d.ts +39 -67
- package/dist/branch-health.js +27 -43
- package/dist/branch-metadata-file.d.ts +16 -32
- package/dist/branch-metadata-file.js +13 -26
- package/dist/branch-metadata.d.ts +49 -80
- package/dist/branch-metadata.js +57 -87
- package/dist/branch-registry.d.ts +26 -64
- package/dist/branch-registry.js +44 -93
- package/dist/branch-schema-cache.d.ts +34 -124
- package/dist/branch-schema-cache.js +49 -155
- package/dist/branch-workspace.d.ts +4 -4
- package/dist/branch-workspace.js +15 -19
- package/dist/build/generate-ai-content.d.ts +1 -0
- package/dist/build/generate-ai-content.js +12 -25
- package/dist/build-canopy.d.ts +17 -27
- package/dist/build-canopy.js +16 -23
- package/dist/build-mode.d.ts +25 -27
- package/dist/build-mode.js +25 -29
- package/dist/cli/cli.d.ts +15 -26
- package/dist/cli/cli.js +601 -978
- package/dist/cli/generate-ai-content.js +351 -628
- package/dist/cli/github-app-manifest.d.ts +84 -0
- package/dist/cli/github-app-manifest.js +161 -0
- package/dist/cli/init-github-app.d.ts +110 -444
- package/dist/cli/init-github-app.js +236 -773
- package/dist/cli/init.js +39 -80
- package/dist/cli/migrate.d.ts +13 -10
- package/dist/cli/migrate.js +22 -30
- package/dist/cli/project-detect.d.ts +17 -31
- package/dist/cli/project-detect.js +31 -42
- package/dist/cli/project-root.d.ts +4 -11
- package/dist/cli/project-root.js +4 -11
- package/dist/cli/prompt.d.ts +10 -0
- package/dist/cli/prompt.js +67 -0
- package/dist/cli/sync.d.ts +0 -8
- package/dist/cli/sync.js +8 -28
- package/dist/cli/template-files/middleware.ts.template +15 -29
- package/dist/cli/templates.d.ts +2 -12
- package/dist/cli/templates.js +4 -4
- package/dist/client.d.ts +1 -1
- package/dist/comment-store.d.ts +32 -53
- package/dist/comment-store.js +32 -52
- package/dist/config/flatten.d.ts +0 -3
- package/dist/config/flatten.js +2 -12
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +1 -4
- package/dist/config/schemas/collection.d.ts +0 -8
- package/dist/config/schemas/collection.js +0 -10
- package/dist/config/schemas/config.d.ts +6 -78
- package/dist/config/schemas/config.js +38 -54
- package/dist/config/schemas/field.d.ts +2 -242
- package/dist/config/schemas/field.js +9 -20
- package/dist/config/schemas/media.js +1 -1
- package/dist/config/schemas/permissions.js +0 -2
- package/dist/config/schemas/url.d.ts +5 -6
- package/dist/config/schemas/url.js +5 -6
- package/dist/config/types.d.ts +45 -33
- package/dist/config/types.js +0 -1
- package/dist/config.d.ts +1 -8
- package/dist/config.js +1 -9
- package/dist/content-id-index.d.ts +76 -188
- package/dist/content-id-index.js +79 -230
- package/dist/content-index-generation.d.ts +27 -48
- package/dist/content-index-generation.js +35 -84
- package/dist/content-index-registry.d.ts +15 -24
- package/dist/content-index-registry.js +5 -9
- package/dist/content-listing.d.ts +64 -107
- package/dist/content-listing.js +68 -118
- package/dist/content-reader.d.ts +20 -29
- package/dist/content-reader.js +10 -18
- package/dist/content-store.d.ts +210 -336
- package/dist/content-store.js +413 -657
- package/dist/content-tree.d.ts +44 -86
- package/dist/content-tree.js +26 -54
- package/dist/context.d.ts +67 -94
- package/dist/context.js +53 -72
- package/dist/dev-content-watcher.d.ts +18 -18
- package/dist/dev-content-watcher.js +41 -44
- package/dist/editor/BranchManager.d.ts +3 -6
- package/dist/editor/BranchManager.js +24 -44
- package/dist/editor/CanopyEditor.js +5 -2
- package/dist/editor/CommentsPanel.js +0 -2
- package/dist/editor/Editor.js +19 -76
- package/dist/editor/EditorAuthGate.d.ts +27 -0
- package/dist/editor/EditorAuthGate.js +140 -0
- package/dist/editor/EntryNavigator.js +0 -20
- package/dist/editor/FormRenderer.d.ts +1 -2
- package/dist/editor/FormRenderer.js +8 -23
- package/dist/editor/admin/SystemHealthPanel.js +20 -37
- package/dist/editor/admin/useSystemHealth.d.ts +2 -3
- package/dist/editor/admin/useSystemHealth.js +10 -12
- package/dist/editor/client-reference-resolver.d.ts +2 -5
- package/dist/editor/client-reference-resolver.js +2 -19
- package/dist/editor/comments/BranchComments.js +0 -4
- package/dist/editor/comments/EntryComments.js +0 -4
- package/dist/editor/comments/FieldWrapper.js +0 -4
- package/dist/editor/comments/InlineCommentThread.js +0 -2
- package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
- package/dist/editor/comments/ThreadCarousel.js +0 -12
- package/dist/editor/components/EditorFooter.d.ts +0 -8
- package/dist/editor/components/EditorFooter.js +0 -5
- package/dist/editor/components/EditorHeader.d.ts +0 -31
- package/dist/editor/components/EditorHeader.js +21 -71
- package/dist/editor/components/EditorSidebar.d.ts +0 -19
- package/dist/editor/components/EditorSidebar.js +0 -16
- package/dist/editor/components/EntryCreateModal.d.ts +4 -4
- package/dist/editor/components/EntryCreateModal.js +7 -22
- package/dist/editor/components/RenameEntryModal.js +0 -4
- package/dist/editor/components/UserBadge.js +0 -10
- package/dist/editor/components/index.js +0 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -7
- package/dist/editor/context/ApiClientContext.js +39 -11
- package/dist/editor/context/AssetContext.d.ts +7 -17
- package/dist/editor/context/AssetContext.js +7 -17
- package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
- package/dist/editor/context/EditorIdentityContext.js +7 -0
- package/dist/editor/context/EditorStateContext.d.ts +10 -41
- package/dist/editor/context/EditorStateContext.js +7 -23
- package/dist/editor/context/SWRProvider.d.ts +3 -6
- package/dist/editor/context/index.d.ts +1 -20
- package/dist/editor/context/index.js +1 -20
- package/dist/editor/editor-utils.d.ts +8 -47
- package/dist/editor/editor-utils.js +19 -72
- package/dist/editor/fields/BlockField.d.ts +2 -2
- package/dist/editor/fields/BlockField.js +1 -2
- package/dist/editor/fields/CodeField.d.ts +0 -1
- package/dist/editor/fields/CodeField.js +0 -1
- package/dist/editor/fields/DateTimeField.d.ts +15 -22
- package/dist/editor/fields/DateTimeField.js +17 -26
- package/dist/editor/fields/ImageField.d.ts +2 -2
- package/dist/editor/fields/ImageField.js +8 -14
- package/dist/editor/fields/InlineGroupField.d.ts +0 -1
- package/dist/editor/fields/InlineGroupField.js +0 -1
- package/dist/editor/fields/MarkdownField.d.ts +0 -1
- package/dist/editor/fields/MarkdownField.js +6 -11
- package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
- package/dist/editor/fields/MdxImageDialog.js +0 -1
- package/dist/editor/fields/NumberField.d.ts +9 -19
- package/dist/editor/fields/NumberField.js +11 -22
- package/dist/editor/fields/NumberListField.d.ts +7 -10
- package/dist/editor/fields/NumberListField.js +7 -10
- package/dist/editor/fields/ObjectField.d.ts +5 -8
- package/dist/editor/fields/ObjectField.js +0 -1
- package/dist/editor/fields/ReferenceField.d.ts +1 -1
- package/dist/editor/fields/ReferenceField.js +11 -16
- package/dist/editor/fields/SelectField.d.ts +2 -2
- package/dist/editor/fields/SelectField.js +0 -1
- package/dist/editor/fields/StringListField.d.ts +0 -4
- package/dist/editor/fields/StringListField.js +4 -9
- package/dist/editor/fields/TextField.d.ts +0 -1
- package/dist/editor/fields/TextField.js +0 -1
- package/dist/editor/fields/ToggleField.d.ts +0 -1
- package/dist/editor/fields/ToggleField.js +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts +0 -3
- package/dist/editor/group-manager/GroupForm.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
- package/dist/editor/group-manager/MemberList.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
- package/dist/editor/group-manager/index.d.ts +0 -6
- package/dist/editor/group-manager/index.js +0 -10
- package/dist/editor/group-manager/types.d.ts +2 -5
- package/dist/editor/group-manager/types.js +0 -3
- package/dist/editor/hooks/index.d.ts +6 -11
- package/dist/editor/hooks/index.js +6 -12
- package/dist/editor/hooks/useBranchActions.d.ts +0 -14
- package/dist/editor/hooks/useBranchActions.js +0 -22
- package/dist/editor/hooks/useBranchManager.d.ts +2 -48
- package/dist/editor/hooks/useBranchManager.js +4 -64
- package/dist/editor/hooks/useBranchesData.d.ts +7 -6
- package/dist/editor/hooks/useBranchesData.js +7 -6
- package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
- package/dist/editor/hooks/useCommentSystem.js +1 -36
- package/dist/editor/hooks/useDraftManager.d.ts +2 -35
- package/dist/editor/hooks/useDraftManager.js +23 -64
- package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
- package/dist/editor/hooks/useEditorLayout.js +0 -23
- package/dist/editor/hooks/useEntriesData.d.ts +1 -0
- package/dist/editor/hooks/useEntriesData.js +2 -3
- package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
- package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
- package/dist/editor/hooks/useEntryManager.d.ts +2 -27
- package/dist/editor/hooks/useEntryManager.js +29 -78
- package/dist/editor/hooks/useGroupManager.d.ts +0 -21
- package/dist/editor/hooks/useGroupManager.js +0 -21
- package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
- package/dist/editor/hooks/usePermissionManager.js +0 -20
- package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
- package/dist/editor/hooks/useReferenceResolution.js +1 -48
- package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
- package/dist/editor/hooks/useSchemaManager.js +0 -19
- package/dist/editor/hooks/useUserContext.d.ts +2 -9
- package/dist/editor/hooks/useUserContext.js +10 -10
- package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
- package/dist/editor/hooks/useUserMetadata.js +0 -3
- package/dist/editor/media/AssetCard.d.ts +0 -1
- package/dist/editor/media/AssetCard.js +1 -2
- package/dist/editor/media/CropStep.d.ts +0 -1
- package/dist/editor/media/CropStep.js +0 -1
- package/dist/editor/media/MediaLibrary.d.ts +1 -2
- package/dist/editor/media/MediaLibrary.js +1 -2
- package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
- package/dist/editor/media/MediaLibraryBody.js +0 -1
- package/dist/editor/media/crop-math.d.ts +1 -1
- package/dist/editor/media/crop-math.js +1 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
- package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
- package/dist/editor/permission-manager/PermissionEditor.js +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
- package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
- package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
- package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
- package/dist/editor/permission-manager/constants.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
- package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
- package/dist/editor/permission-manager/index.d.ts +0 -7
- package/dist/editor/permission-manager/index.js +0 -16
- package/dist/editor/permission-manager/types.d.ts +2 -12
- package/dist/editor/permission-manager/types.js +0 -3
- package/dist/editor/permission-manager/utils.d.ts +0 -28
- package/dist/editor/permission-manager/utils.js +9 -23
- package/dist/editor/preview-bridge.d.ts +5 -1
- package/dist/editor/preview-bridge.js +4 -4
- package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
- package/dist/editor/schema-editor/CollectionEditor.js +9 -31
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
- package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
- package/dist/editor/schema-editor/index.d.ts +0 -7
- package/dist/editor/schema-editor/index.js +0 -7
- package/dist/editor/utils/env.d.ts +3 -18
- package/dist/editor/utils/env.js +6 -25
- package/dist/entry-link-resolver.d.ts +13 -35
- package/dist/entry-link-resolver.js +20 -53
- package/dist/entry-schema-registry.d.ts +20 -60
- package/dist/entry-schema-registry.js +20 -69
- package/dist/entry-schema.d.ts +118 -223
- package/dist/entry-schema.js +46 -91
- package/dist/git-manager.d.ts +101 -200
- package/dist/git-manager.js +211 -384
- package/dist/github-service.d.ts +34 -75
- package/dist/github-service.js +37 -91
- package/dist/http/handler.d.ts +6 -37
- package/dist/http/handler.js +65 -120
- package/dist/http/router.d.ts +15 -32
- package/dist/http/router.js +34 -99
- package/dist/http/types.d.ts +15 -40
- package/dist/http/types.js +3 -7
- package/dist/id.d.ts +4 -10
- package/dist/id.js +4 -10
- package/dist/index.js +6 -9
- package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
- package/dist/operating-mode/client-safe-strategy.js +8 -28
- package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
- package/dist/operating-mode/client-unsafe-strategy.js +9 -34
- package/dist/operating-mode/client.d.ts +3 -10
- package/dist/operating-mode/client.js +3 -8
- package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
- package/dist/operating-mode/deployment-name-fixtures.js +14 -18
- package/dist/operating-mode/deployment-name.d.ts +19 -29
- package/dist/operating-mode/deployment-name.js +29 -47
- package/dist/operating-mode/index.d.ts +4 -25
- package/dist/operating-mode/index.js +9 -31
- package/dist/operating-mode/mode-env.d.ts +32 -54
- package/dist/operating-mode/mode-env.js +36 -58
- package/dist/operating-mode/types.d.ts +24 -72
- package/dist/operating-mode/types.js +1 -7
- package/dist/paths/branch-name.d.ts +30 -40
- package/dist/paths/branch-name.js +30 -40
- package/dist/paths/branch.d.ts +4 -18
- package/dist/paths/branch.js +6 -22
- package/dist/paths/index.d.ts +2 -13
- package/dist/paths/index.js +3 -23
- package/dist/paths/normalize-server.d.ts +3 -15
- package/dist/paths/normalize-server.js +3 -15
- package/dist/paths/normalize.d.ts +13 -33
- package/dist/paths/normalize.js +13 -33
- package/dist/paths/resolve.d.ts +4 -17
- package/dist/paths/resolve.js +4 -22
- package/dist/paths/types.d.ts +12 -34
- package/dist/paths/types.js +5 -7
- package/dist/paths/validation.d.ts +22 -119
- package/dist/paths/validation.js +30 -148
- package/dist/reference-resolver.d.ts +0 -13
- package/dist/reference-resolver.js +0 -18
- package/dist/resolve-canopy-user.d.ts +16 -18
- package/dist/resolve-canopy-user.js +17 -26
- package/dist/resource-generation.d.ts +16 -25
- package/dist/resource-generation.js +34 -97
- package/dist/schema/meta-loader.d.ts +2 -14
- package/dist/schema/meta-loader.js +15 -64
- package/dist/schema/resolver.d.ts +1 -4
- package/dist/schema/resolver.js +1 -6
- package/dist/schema/schema-store-types.d.ts +0 -12
- package/dist/schema/schema-store.d.ts +61 -138
- package/dist/schema/schema-store.js +85 -282
- package/dist/schema/types.d.ts +0 -4
- package/dist/server.d.ts +62 -93
- package/dist/server.js +63 -94
- package/dist/services.d.ts +23 -47
- package/dist/services.js +55 -98
- package/dist/settings-workspace.d.ts +17 -30
- package/dist/settings-workspace.js +51 -81
- package/dist/static/index.d.ts +26 -52
- package/dist/static/index.js +33 -67
- package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
- package/dist/task-queue/cms-task-queue.js +13 -0
- package/dist/task-queue/task-queue-config.d.ts +3 -0
- package/dist/{worker → task-queue}/task-queue-config.js +1 -6
- package/dist/task-queue/task-queue.d.ts +16 -22
- package/dist/task-queue/task-queue.js +20 -44
- package/dist/task-queue/types.d.ts +0 -1
- package/dist/task-queue/worker-status.d.ts +35 -0
- package/dist/task-queue/worker-status.js +40 -0
- package/dist/types.d.ts +40 -51
- package/dist/url-collision.d.ts +26 -40
- package/dist/url-collision.js +47 -63
- package/dist/url-exclusivity-fixtures.d.ts +15 -20
- package/dist/url-exclusivity-fixtures.js +14 -19
- package/dist/url-path-resolver.d.ts +8 -16
- package/dist/url-path-resolver.js +19 -29
- package/dist/user.d.ts +8 -21
- package/dist/user.js +10 -19
- package/dist/utils/async-mutex.js +4 -6
- package/dist/utils/atomic-write.d.ts +2 -11
- package/dist/utils/atomic-write.js +2 -11
- package/dist/utils/body-field.d.ts +8 -15
- package/dist/utils/body-field.js +8 -15
- package/dist/utils/content-serialize.d.ts +18 -24
- package/dist/utils/content-serialize.js +109 -160
- package/dist/utils/content-write-lock.d.ts +51 -106
- package/dist/utils/content-write-lock.js +66 -111
- package/dist/utils/debug.d.ts +7 -23
- package/dist/utils/debug.js +7 -23
- package/dist/utils/entry-url.d.ts +11 -23
- package/dist/utils/entry-url.js +11 -26
- package/dist/utils/error.d.ts +25 -90
- package/dist/utils/error.js +60 -147
- package/dist/utils/flatten-group-fields.d.ts +5 -7
- package/dist/utils/flatten-group-fields.js +5 -7
- package/dist/utils/format.d.ts +1 -5
- package/dist/utils/format.js +1 -5
- package/dist/utils/fs.d.ts +3 -4
- package/dist/utils/fs.js +3 -4
- package/dist/utils/git.d.ts +52 -83
- package/dist/utils/git.js +79 -125
- package/dist/utils/logger.d.ts +35 -50
- package/dist/utils/logger.js +35 -52
- package/dist/utils/provisioning-lock.d.ts +23 -35
- package/dist/utils/provisioning-lock.js +49 -69
- package/dist/utils/sanitize-href.d.ts +5 -10
- package/dist/utils/sanitize-href.js +8 -18
- package/dist/utils/title-field.d.ts +17 -20
- package/dist/utils/title-field.js +18 -27
- package/dist/utils/typed-filename.d.ts +20 -48
- package/dist/utils/typed-filename.js +25 -61
- package/dist/utils/url-prefix.d.ts +3 -3
- package/dist/utils/url-prefix.js +3 -3
- package/dist/validation/block-structural-keys.d.ts +16 -31
- package/dist/validation/block-structural-keys.js +19 -29
- package/dist/validation/deletion-checker.d.ts +0 -34
- package/dist/validation/deletion-checker.js +1 -43
- package/dist/validation/entry-link-validator.d.ts +6 -13
- package/dist/validation/entry-link-validator.js +4 -13
- package/dist/validation/entry-type-reference-validator.d.ts +13 -18
- package/dist/validation/entry-type-reference-validator.js +13 -18
- package/dist/validation/entry-validator.d.ts +13 -25
- package/dist/validation/entry-validator.js +15 -32
- package/dist/validation/field-traversal.d.ts +3 -30
- package/dist/validation/field-traversal.js +1 -32
- package/dist/validation/reference-validator.d.ts +5 -24
- package/dist/validation/reference-validator.js +5 -30
- package/dist/worker/cms-worker.d.ts +172 -232
- package/dist/worker/cms-worker.js +241 -333
- package/dist/worker/git-sync.d.ts +32 -133
- package/dist/worker/git-sync.js +129 -191
- package/dist/worker/github-auth.d.ts +13 -19
- package/dist/worker/github-auth.js +13 -19
- package/dist/worker/history-rewrite.d.ts +53 -66
- package/dist/worker/history-rewrite.js +54 -60
- package/dist/worker/log.d.ts +24 -41
- package/dist/worker/log.js +25 -42
- package/dist/worker/rebase.d.ts +20 -110
- package/dist/worker/rebase.js +279 -354
- package/dist/worker/task-runner.d.ts +32 -66
- package/dist/worker/task-runner.js +126 -162
- package/dist/worker/worker-context.d.ts +41 -81
- package/package.json +4 -4
- package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
- package/dist/worker/task-queue-config.d.ts +0 -8
- package/dist/worker/task-queue.js +0 -19
- package/dist/worker/worker-status.d.ts +0 -47
- package/dist/worker/worker-status.js +0 -52
|
@@ -1,40 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Branch-name sanitization, isolated in a dependency-free module
|
|
2
|
+
* Branch-name sanitization, isolated in a dependency-free module (imports
|
|
3
|
+
* nothing but types; same pattern as assets/asset-prefixes.ts).
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* editor bundle. Same pattern as assets/asset-prefixes.ts.
|
|
5
|
+
* Client-reachable code (e.g. authorization/protected-branch.ts, which the
|
|
6
|
+
* editor bundle reaches via api/guards.ts) MUST import `sanitizeBranchName`
|
|
7
|
+
* from HERE, never from `paths/branch.ts` or the `paths` barrel: both pull
|
|
8
|
+
* `node:fs` and the operating-mode strategies, and a `node:` import in that
|
|
9
|
+
* graph breaks adopters' production `next build` of the editor bundle.
|
|
10
|
+
* `pnpm lint:bundle` enforces it.
|
|
11
11
|
*/
|
|
12
12
|
import type { SanitizedBranchName } from './types.js';
|
|
13
|
-
/**
|
|
14
|
-
* Sanitize a branch name for use in filesystem paths.
|
|
15
|
-
* - Replaces invalid characters with hyphens
|
|
16
|
-
* - Collapses multiple hyphens
|
|
17
|
-
* - Trims leading/trailing dots
|
|
18
|
-
*/
|
|
13
|
+
/** Sanitize a branch name for use in filesystem paths. */
|
|
19
14
|
export declare function sanitizeBranchName(branchName: string): SanitizedBranchName;
|
|
20
15
|
/**
|
|
21
|
-
* Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* whose SANITIZED name falls in this namespace).
|
|
16
|
+
* Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}`;
|
|
17
|
+
* built by operating-mode/client-unsafe-strategy.ts's `getSettingsBranchName`).
|
|
18
|
+
* Exported from this dependency-free module -- not rebuilt ad hoc at each call
|
|
19
|
+
* site -- so every consumer of the namespace agrees on the exact string:
|
|
20
|
+
* worker/git-sync.ts's `pushSettingsBranches` never pushes a
|
|
21
|
+
* `canopycms-settings-*` branch this deployment doesn't own, and api/branch.ts's
|
|
22
|
+
* `createBranchHandler` rejects a user-requested branch whose SANITIZED name
|
|
23
|
+
* falls in this namespace.
|
|
30
24
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* an orphan settings branch -- so the whole prefix is reserved for branch
|
|
37
|
-
* creation, not just this deployment's own settings branch name.
|
|
25
|
+
* The WHOLE prefix is reserved, not just this deployment's own settings branch:
|
|
26
|
+
* two deployments can share one GitHub repo, and a content branch landing on
|
|
27
|
+
* the other's settings-branch name silently corrupts that deployment's
|
|
28
|
+
* permissions/groups once its worker treats the ref as an orphan settings
|
|
29
|
+
* branch.
|
|
38
30
|
*/
|
|
39
31
|
export declare const RESERVED_SETTINGS_BRANCH_PREFIX = "canopycms-settings-";
|
|
40
32
|
/**
|
|
@@ -42,16 +34,14 @@ export declare const RESERVED_SETTINGS_BRANCH_PREFIX = "canopycms-settings-";
|
|
|
42
34
|
*
|
|
43
35
|
* http/router.ts's `compareSpecificity` ranks a literal pattern segment above a
|
|
44
36
|
* `:param`, so a branch named e.g. `admin` has its `/:branch/...` routes
|
|
45
|
-
* shadowed by the static `/admin/...` ones
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* looks half-alive while every nested route 404s or 403s.
|
|
37
|
+
* shadowed by the static `/admin/...` ones -- and only partially, which is what
|
|
38
|
+
* makes it confusing: bare `GET /admin` still reaches the branch handler, so the
|
|
39
|
+
* branch looks half-alive while every nested route 404s or 403s.
|
|
49
40
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* a new top-level namespace fails that test until this list is updated.
|
|
41
|
+
* Listed rather than derived at runtime because api/validators.ts is imported
|
|
42
|
+
* *by* the route modules, so importing the router here would cycle.
|
|
43
|
+
* http/router.test.ts derives the same set from the live route table and asserts
|
|
44
|
+
* it equals this constant, so a new top-level namespace fails that test until
|
|
45
|
+
* this list is updated.
|
|
56
46
|
*/
|
|
57
47
|
export declare const RESERVED_ROUTE_BRANCH_NAMES: readonly string[];
|
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Branch-name sanitization, isolated in a dependency-free module
|
|
2
|
+
* Branch-name sanitization, isolated in a dependency-free module (imports
|
|
3
|
+
* nothing but types; same pattern as assets/asset-prefixes.ts).
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* editor bundle. Same pattern as assets/asset-prefixes.ts.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Sanitize a branch name for use in filesystem paths.
|
|
14
|
-
* - Replaces invalid characters with hyphens
|
|
15
|
-
* - Collapses multiple hyphens
|
|
16
|
-
* - Trims leading/trailing dots
|
|
5
|
+
* Client-reachable code (e.g. authorization/protected-branch.ts, which the
|
|
6
|
+
* editor bundle reaches via api/guards.ts) MUST import `sanitizeBranchName`
|
|
7
|
+
* from HERE, never from `paths/branch.ts` or the `paths` barrel: both pull
|
|
8
|
+
* `node:fs` and the operating-mode strategies, and a `node:` import in that
|
|
9
|
+
* graph breaks adopters' production `next build` of the editor bundle.
|
|
10
|
+
* `pnpm lint:bundle` enforces it.
|
|
17
11
|
*/
|
|
12
|
+
/** Sanitize a branch name for use in filesystem paths. */
|
|
18
13
|
export function sanitizeBranchName(branchName) {
|
|
19
14
|
const replaced = branchName.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
20
15
|
const squashed = replaced.replace(/-+/g, '-');
|
|
@@ -22,23 +17,20 @@ export function sanitizeBranchName(branchName) {
|
|
|
22
17
|
return (trimmedDots || 'branch');
|
|
23
18
|
}
|
|
24
19
|
/**
|
|
25
|
-
* Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* whose SANITIZED name falls in this namespace).
|
|
20
|
+
* Prefix reserved for CanopyCMS settings branches (`canopycms-settings-{name}`;
|
|
21
|
+
* built by operating-mode/client-unsafe-strategy.ts's `getSettingsBranchName`).
|
|
22
|
+
* Exported from this dependency-free module -- not rebuilt ad hoc at each call
|
|
23
|
+
* site -- so every consumer of the namespace agrees on the exact string:
|
|
24
|
+
* worker/git-sync.ts's `pushSettingsBranches` never pushes a
|
|
25
|
+
* `canopycms-settings-*` branch this deployment doesn't own, and api/branch.ts's
|
|
26
|
+
* `createBranchHandler` rejects a user-requested branch whose SANITIZED name
|
|
27
|
+
* falls in this namespace.
|
|
34
28
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* an orphan settings branch -- so the whole prefix is reserved for branch
|
|
41
|
-
* creation, not just this deployment's own settings branch name.
|
|
29
|
+
* The WHOLE prefix is reserved, not just this deployment's own settings branch:
|
|
30
|
+
* two deployments can share one GitHub repo, and a content branch landing on
|
|
31
|
+
* the other's settings-branch name silently corrupts that deployment's
|
|
32
|
+
* permissions/groups once its worker treats the ref as an orphan settings
|
|
33
|
+
* branch.
|
|
42
34
|
*/
|
|
43
35
|
export const RESERVED_SETTINGS_BRANCH_PREFIX = 'canopycms-settings-';
|
|
44
36
|
/**
|
|
@@ -46,17 +38,15 @@ export const RESERVED_SETTINGS_BRANCH_PREFIX = 'canopycms-settings-';
|
|
|
46
38
|
*
|
|
47
39
|
* http/router.ts's `compareSpecificity` ranks a literal pattern segment above a
|
|
48
40
|
* `:param`, so a branch named e.g. `admin` has its `/:branch/...` routes
|
|
49
|
-
* shadowed by the static `/admin/...` ones
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* looks half-alive while every nested route 404s or 403s.
|
|
41
|
+
* shadowed by the static `/admin/...` ones -- and only partially, which is what
|
|
42
|
+
* makes it confusing: bare `GET /admin` still reaches the branch handler, so the
|
|
43
|
+
* branch looks half-alive while every nested route 404s or 403s.
|
|
53
44
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* a new top-level namespace fails that test until this list is updated.
|
|
45
|
+
* Listed rather than derived at runtime because api/validators.ts is imported
|
|
46
|
+
* *by* the route modules, so importing the router here would cycle.
|
|
47
|
+
* http/router.test.ts derives the same set from the live route table and asserts
|
|
48
|
+
* it equals this constant, so a new top-level namespace fails that test until
|
|
49
|
+
* this list is updated.
|
|
60
50
|
*/
|
|
61
51
|
export const RESERVED_ROUTE_BRANCH_NAMES = [
|
|
62
52
|
'admin',
|
package/dist/paths/branch.d.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Branch path resolution utilities.
|
|
3
|
-
*
|
|
4
|
-
* Handles resolving branch names to workspace directories.
|
|
5
|
-
*/
|
|
1
|
+
/** Branch path resolution utilities. */
|
|
6
2
|
import type { BranchContext } from '../types.js';
|
|
7
3
|
import { OperatingMode } from '../operating-mode/index.js';
|
|
8
4
|
export interface BranchPathOptions {
|
|
@@ -15,24 +11,14 @@ export interface BranchPathResult {
|
|
|
15
11
|
baseRoot: string;
|
|
16
12
|
branchName: string;
|
|
17
13
|
}
|
|
14
|
+
/** @internal Exported for tests. */
|
|
18
15
|
export declare class BranchPathError extends Error {
|
|
19
16
|
}
|
|
20
17
|
import { sanitizeBranchName } from './branch-name.js';
|
|
18
|
+
/** @internal Exported for tests. */
|
|
21
19
|
export { sanitizeBranchName };
|
|
22
|
-
/**
|
|
23
|
-
* Resolve branch name to workspace paths.
|
|
24
|
-
* Validates for path traversal attacks.
|
|
25
|
-
*/
|
|
20
|
+
/** Resolve a branch name to workspace paths, rejecting path traversal. */
|
|
26
21
|
export declare function resolveBranchPath(options: BranchPathOptions): BranchPathResult;
|
|
27
|
-
/**
|
|
28
|
-
* Ensure the branch workspace directory exists.
|
|
29
|
-
*/
|
|
30
22
|
export declare function ensureBranchRoot(options: BranchPathOptions): Promise<BranchPathResult>;
|
|
31
|
-
/**
|
|
32
|
-
* Get the default base directory for branch workspaces.
|
|
33
|
-
*/
|
|
34
23
|
export declare function getDefaultBranchBase(mode: OperatingMode, override?: string): string;
|
|
35
|
-
/**
|
|
36
|
-
* Resolve branch paths from a branch context.
|
|
37
|
-
*/
|
|
38
24
|
export declare function resolveBranchPaths(branchContext: BranchContext, mode: OperatingMode, basePathOverride?: string): BranchPathResult;
|
package/dist/paths/branch.js
CHANGED
|
@@ -1,26 +1,19 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Branch path resolution utilities.
|
|
3
|
-
*
|
|
4
|
-
* Handles resolving branch names to workspace directories.
|
|
5
|
-
*/
|
|
1
|
+
/** Branch path resolution utilities. */
|
|
6
2
|
import fs from 'node:fs/promises';
|
|
7
3
|
import path from 'node:path';
|
|
8
4
|
import { operatingStrategy } from '../operating-mode/index.js';
|
|
5
|
+
/** @internal Exported for tests. */
|
|
9
6
|
export class BranchPathError extends Error {
|
|
10
7
|
}
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// browser bundles. Imported for local use + re-exported for existing
|
|
14
|
-
// server-side importers.
|
|
8
|
+
// Lives in ./branch-name (dependency-free); re-exported here for server-side
|
|
9
|
+
// importers, who may safely reach this module's node:fs imports.
|
|
15
10
|
import { sanitizeBranchName } from './branch-name.js';
|
|
11
|
+
/** @internal Exported for tests. */
|
|
16
12
|
export { sanitizeBranchName };
|
|
17
13
|
const resolveContentBranchesRoot = (mode, override) => {
|
|
18
14
|
return operatingStrategy(mode).getContentBranchesRoot(override);
|
|
19
15
|
};
|
|
20
|
-
/**
|
|
21
|
-
* Resolve branch name to workspace paths.
|
|
22
|
-
* Validates for path traversal attacks.
|
|
23
|
-
*/
|
|
16
|
+
/** Resolve a branch name to workspace paths, rejecting path traversal. */
|
|
24
17
|
export function resolveBranchPath(options) {
|
|
25
18
|
if (options.branchName.includes('..')) {
|
|
26
19
|
throw new BranchPathError('Branch name cannot contain traversal segments');
|
|
@@ -42,23 +35,14 @@ export function resolveBranchPath(options) {
|
|
|
42
35
|
}
|
|
43
36
|
return { branchRoot, baseRoot: normalizedBase, branchName: safeBranch };
|
|
44
37
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Ensure the branch workspace directory exists.
|
|
47
|
-
*/
|
|
48
38
|
export async function ensureBranchRoot(options) {
|
|
49
39
|
const result = resolveBranchPath(options);
|
|
50
40
|
await fs.mkdir(result.branchRoot, { recursive: true });
|
|
51
41
|
return result;
|
|
52
42
|
}
|
|
53
|
-
/**
|
|
54
|
-
* Get the default base directory for branch workspaces.
|
|
55
|
-
*/
|
|
56
43
|
export function getDefaultBranchBase(mode, override) {
|
|
57
44
|
return resolveContentBranchesRoot(mode, override);
|
|
58
45
|
}
|
|
59
|
-
/**
|
|
60
|
-
* Resolve branch paths from a branch context.
|
|
61
|
-
*/
|
|
62
46
|
export function resolveBranchPaths(branchContext, mode, basePathOverride) {
|
|
63
47
|
if (branchContext.branchRoot || branchContext.baseRoot) {
|
|
64
48
|
const baseRoot = path.resolve(branchContext.baseRoot ?? resolveContentBranchesRoot(mode, basePathOverride));
|
package/dist/paths/index.d.ts
CHANGED
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Path utilities
|
|
3
|
-
*
|
|
4
|
-
* This module consolidates path handling utilities that were previously
|
|
5
|
-
* scattered across multiple files:
|
|
6
|
-
* - normalize.ts: Path normalization and creation
|
|
7
|
-
* - validation.ts: Security validation for paths
|
|
8
|
-
* - branch.ts: Branch workspace path resolution
|
|
9
|
-
* - types.ts: Branded types for type safety
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* ```ts
|
|
13
|
-
* import { normalizeFilesystemPath, createLogicalPath, parseSlug } from '../paths/index.js'
|
|
14
|
-
* ```
|
|
2
|
+
* Path utilities. Client-reachable code deep-imports `./branch-name` instead,
|
|
3
|
+
* because this barrel pulls in node:fs; `pnpm lint:bundle` enforces that.
|
|
15
4
|
*/
|
|
16
5
|
export type { LogicalPath, PhysicalPath, SanitizedBranchName, BranchName, ContentId, Slug, PathValidationResult, } from './types.js';
|
|
17
6
|
export { normalizeFilesystemPath, normalizeCollectionPath, hasTraversalSequence, createLogicalPath, createPhysicalPath, joinPath, trimSlashes, } from './normalize.js';
|
package/dist/paths/index.js
CHANGED
|
@@ -1,32 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Path utilities
|
|
3
|
-
*
|
|
4
|
-
* This module consolidates path handling utilities that were previously
|
|
5
|
-
* scattered across multiple files:
|
|
6
|
-
* - normalize.ts: Path normalization and creation
|
|
7
|
-
* - validation.ts: Security validation for paths
|
|
8
|
-
* - branch.ts: Branch workspace path resolution
|
|
9
|
-
* - types.ts: Branded types for type safety
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* ```ts
|
|
13
|
-
* import { normalizeFilesystemPath, createLogicalPath, parseSlug } from '../paths/index.js'
|
|
14
|
-
* ```
|
|
2
|
+
* Path utilities. Client-reachable code deep-imports `./branch-name` instead,
|
|
3
|
+
* because this barrel pulls in node:fs; `pnpm lint:bundle` enforces that.
|
|
15
4
|
*/
|
|
16
5
|
// Normalization utilities (client-safe)
|
|
17
6
|
export { normalizeFilesystemPath, normalizeCollectionPath, hasTraversalSequence, createLogicalPath, createPhysicalPath, joinPath, trimSlashes, } from './normalize.js';
|
|
18
7
|
// Normalization utilities (server-only, requires Node.js path module)
|
|
19
8
|
export { validateAndNormalizePath } from './normalize-server.js';
|
|
20
|
-
|
|
21
|
-
export { validateContentPath, isValidCollectionPath, sanitizeForPath,
|
|
22
|
-
// Path type detection and parsing
|
|
23
|
-
hasEmbeddedContentId, looksLikePhysicalPath, looksLikeLogicalPath, parseLogicalPath, parsePhysicalPath, isValidContentId,
|
|
24
|
-
// Branded type validation and parsing
|
|
25
|
-
parseContentId, parseBranchName, parseSlug, } from './validation.js';
|
|
26
|
-
// Path resolution utilities
|
|
9
|
+
export { validateContentPath, isValidCollectionPath, sanitizeForPath, hasEmbeddedContentId, looksLikePhysicalPath, looksLikeLogicalPath, parseLogicalPath, parsePhysicalPath, isValidContentId, parseContentId, parseBranchName, parseSlug, } from './validation.js';
|
|
27
10
|
export { resolveLogicalPath } from './resolve.js';
|
|
28
|
-
// Branch path utilities
|
|
29
11
|
export { resolveBranchPath, ensureBranchRoot, getDefaultBranchBase, resolveBranchPaths, BranchPathError, } from './branch.js';
|
|
30
|
-
// From the dependency-free module (NOT ./branch, which imports node:fs) so
|
|
31
|
-
// client-reachable importers of 'canopycms/src/paths' stay browser-safe.
|
|
32
12
|
export { sanitizeBranchName, RESERVED_SETTINGS_BRANCH_PREFIX, RESERVED_ROUTE_BRANCH_NAMES, } from './branch-name.js';
|
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Server-only path normalization utilities
|
|
3
|
-
*
|
|
4
|
-
* These functions depend on Node.js 'path' module and cannot be used in client code.
|
|
5
|
-
* Client-safe functions are in normalize.ts.
|
|
2
|
+
* Server-only path normalization utilities: these depend on `node:path` and
|
|
3
|
+
* must not reach a client bundle. Client-safe equivalents are in normalize.ts.
|
|
6
4
|
*/
|
|
7
5
|
import type { PathValidationResult } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Validate and normalize a path relative to a root directory.
|
|
10
|
-
* Checks for path traversal attacks.
|
|
11
|
-
*
|
|
12
|
-
* NOTE: This function uses Node.js path module and is server-only.
|
|
13
|
-
* For client code, use the pure functions in normalize.ts.
|
|
14
|
-
*
|
|
15
|
-
* @param root - The root directory
|
|
16
|
-
* @param target - The target path to validate
|
|
17
|
-
* @returns Validation result with normalized relative path if valid
|
|
18
|
-
*/
|
|
6
|
+
/** Normalize `target` relative to `root`, rejecting anything that escapes it. */
|
|
19
7
|
export declare function validateAndNormalizePath(root: string, target: string): PathValidationResult;
|
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Server-only path normalization utilities
|
|
3
|
-
*
|
|
4
|
-
* These functions depend on Node.js 'path' module and cannot be used in client code.
|
|
5
|
-
* Client-safe functions are in normalize.ts.
|
|
2
|
+
* Server-only path normalization utilities: these depend on `node:path` and
|
|
3
|
+
* must not reach a client bundle. Client-safe equivalents are in normalize.ts.
|
|
6
4
|
*/
|
|
7
5
|
import { sep, resolve, relative } from 'node:path';
|
|
8
|
-
/**
|
|
9
|
-
* Validate and normalize a path relative to a root directory.
|
|
10
|
-
* Checks for path traversal attacks.
|
|
11
|
-
*
|
|
12
|
-
* NOTE: This function uses Node.js path module and is server-only.
|
|
13
|
-
* For client code, use the pure functions in normalize.ts.
|
|
14
|
-
*
|
|
15
|
-
* @param root - The root directory
|
|
16
|
-
* @param target - The target path to validate
|
|
17
|
-
* @returns Validation result with normalized relative path if valid
|
|
18
|
-
*/
|
|
6
|
+
/** Normalize `target` relative to `root`, rejecting anything that escapes it. */
|
|
19
7
|
export function validateAndNormalizePath(root, target) {
|
|
20
8
|
const resolvedRoot = resolve(root);
|
|
21
9
|
const withSep = resolvedRoot.endsWith(sep) ? resolvedRoot : `${resolvedRoot}${sep}`;
|
|
@@ -1,66 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Path normalization utilities
|
|
3
|
-
*
|
|
4
|
-
* Consolidates the various path normalization patterns used across the codebase
|
|
5
|
-
* into a single, well-tested module.
|
|
6
|
-
*
|
|
7
|
-
* NOTE: These functions are pure and can be used in both client and server code.
|
|
8
|
-
* Server-only functions that depend on Node.js 'path' module are in normalize-server.ts.
|
|
2
|
+
* Path normalization utilities. Pure, so client-safe; the ones that need
|
|
3
|
+
* `node:path` live in normalize-server.ts.
|
|
9
4
|
*/
|
|
10
5
|
import type { LogicalPath, PhysicalPath } from './types.js';
|
|
11
6
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* - Removing leading/trailing slashes
|
|
16
|
-
*
|
|
17
|
-
* This is the foundational normalization used by most path operations.
|
|
7
|
+
* Split on either separator, dropping empty segments, and rejoin with `/`:
|
|
8
|
+
* backslashes become forward slashes and leading/trailing/repeated slashes go.
|
|
9
|
+
* Most other path operations here build on it.
|
|
18
10
|
*
|
|
19
11
|
* @example
|
|
20
12
|
* normalizeFilesystemPath('content\\posts\\\\my-post') // 'content/posts/my-post'
|
|
21
|
-
* normalizeFilesystemPath('/content/posts/') // 'content/posts'
|
|
22
13
|
*/
|
|
23
14
|
export declare function normalizeFilesystemPath(path: string): string;
|
|
24
15
|
/**
|
|
25
|
-
* Normalize
|
|
26
|
-
* and normalizing separators.
|
|
16
|
+
* Normalize separators and strip any leading content-root prefix.
|
|
27
17
|
*
|
|
28
18
|
* @example
|
|
29
|
-
* normalizeCollectionPath('content/posts') // 'posts'
|
|
30
19
|
* normalizeCollectionPath('content\\blog\\posts') // 'blog/posts'
|
|
31
|
-
* normalizeCollectionPath('posts') // 'posts'
|
|
32
20
|
*/
|
|
33
21
|
export declare function normalizeCollectionPath(collectionPath: string, contentRoot?: string): string;
|
|
34
22
|
/**
|
|
35
23
|
* Check if a path contains traversal sequences (.., etc.)
|
|
36
24
|
*/
|
|
37
25
|
export declare function hasTraversalSequence(path: string): boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Create a logical path from segments.
|
|
40
|
-
* Validates that no segment contains path traversal.
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* createLogicalPath('content', 'posts', 'my-post') // 'content/posts/my-post' as LogicalPath
|
|
44
|
-
*/
|
|
26
|
+
/** Join segments into a LogicalPath, throwing on a traversal sequence. */
|
|
45
27
|
export declare function createLogicalPath(...segments: string[]): LogicalPath;
|
|
46
28
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* createPhysicalPath('content', 'posts', 'my-post.ABC123.mdx') // as PhysicalPath
|
|
29
|
+
* Join segments into a PhysicalPath (segments may carry embedded content IDs,
|
|
30
|
+
* e.g. `my-post.ABC123.mdx`), throwing on a traversal sequence.
|
|
31
|
+
* @internal Exported for tests.
|
|
52
32
|
*/
|
|
53
33
|
export declare function createPhysicalPath(...segments: string[]): PhysicalPath;
|
|
54
34
|
/**
|
|
55
35
|
* Strip leading and trailing slashes from a path or URL segment.
|
|
56
36
|
*
|
|
57
37
|
* @example
|
|
58
|
-
* trimSlashes('/docs/guides/') // 'docs/guides'
|
|
59
38
|
* trimSlashes('///multi///') // 'multi'
|
|
60
39
|
*/
|
|
61
40
|
export declare function trimSlashes(path: string): string;
|
|
62
41
|
/**
|
|
63
|
-
* Join path segments with forward slashes.
|
|
64
|
-
*
|
|
42
|
+
* Join path segments with forward slashes. Does NOT check for traversal --
|
|
43
|
+
* use createLogicalPath/createPhysicalPath where the result is used as a path.
|
|
44
|
+
* @internal Exported for tests.
|
|
65
45
|
*/
|
|
66
46
|
export declare function joinPath(...segments: string[]): string;
|
package/dist/paths/normalize.js
CHANGED
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Path normalization utilities
|
|
3
|
-
*
|
|
4
|
-
* Consolidates the various path normalization patterns used across the codebase
|
|
5
|
-
* into a single, well-tested module.
|
|
6
|
-
*
|
|
7
|
-
* NOTE: These functions are pure and can be used in both client and server code.
|
|
8
|
-
* Server-only functions that depend on Node.js 'path' module are in normalize-server.ts.
|
|
2
|
+
* Path normalization utilities. Pure, so client-safe; the ones that need
|
|
3
|
+
* `node:path` live in normalize-server.ts.
|
|
9
4
|
*/
|
|
10
5
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* - Removing leading/trailing slashes
|
|
15
|
-
*
|
|
16
|
-
* This is the foundational normalization used by most path operations.
|
|
6
|
+
* Split on either separator, dropping empty segments, and rejoin with `/`:
|
|
7
|
+
* backslashes become forward slashes and leading/trailing/repeated slashes go.
|
|
8
|
+
* Most other path operations here build on it.
|
|
17
9
|
*
|
|
18
10
|
* @example
|
|
19
11
|
* normalizeFilesystemPath('content\\posts\\\\my-post') // 'content/posts/my-post'
|
|
20
|
-
* normalizeFilesystemPath('/content/posts/') // 'content/posts'
|
|
21
12
|
*/
|
|
22
13
|
export function normalizeFilesystemPath(path) {
|
|
23
14
|
return path
|
|
@@ -26,13 +17,10 @@ export function normalizeFilesystemPath(path) {
|
|
|
26
17
|
.join('/');
|
|
27
18
|
}
|
|
28
19
|
/**
|
|
29
|
-
* Normalize
|
|
30
|
-
* and normalizing separators.
|
|
20
|
+
* Normalize separators and strip any leading content-root prefix.
|
|
31
21
|
*
|
|
32
22
|
* @example
|
|
33
|
-
* normalizeCollectionPath('content/posts') // 'posts'
|
|
34
23
|
* normalizeCollectionPath('content\\blog\\posts') // 'blog/posts'
|
|
35
|
-
* normalizeCollectionPath('posts') // 'posts'
|
|
36
24
|
*/
|
|
37
25
|
export function normalizeCollectionPath(collectionPath, contentRoot = 'content') {
|
|
38
26
|
const normalized = normalizeFilesystemPath(collectionPath);
|
|
@@ -49,13 +37,7 @@ export function hasTraversalSequence(path) {
|
|
|
49
37
|
const normalized = normalizeFilesystemPath(path);
|
|
50
38
|
return normalized.includes('..');
|
|
51
39
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Create a logical path from segments.
|
|
54
|
-
* Validates that no segment contains path traversal.
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* createLogicalPath('content', 'posts', 'my-post') // 'content/posts/my-post' as LogicalPath
|
|
58
|
-
*/
|
|
40
|
+
/** Join segments into a LogicalPath, throwing on a traversal sequence. */
|
|
59
41
|
export function createLogicalPath(...segments) {
|
|
60
42
|
const normalized = segments
|
|
61
43
|
.map((s) => normalizeFilesystemPath(s))
|
|
@@ -67,11 +49,9 @@ export function createLogicalPath(...segments) {
|
|
|
67
49
|
return normalized;
|
|
68
50
|
}
|
|
69
51
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* createPhysicalPath('content', 'posts', 'my-post.ABC123.mdx') // as PhysicalPath
|
|
52
|
+
* Join segments into a PhysicalPath (segments may carry embedded content IDs,
|
|
53
|
+
* e.g. `my-post.ABC123.mdx`), throwing on a traversal sequence.
|
|
54
|
+
* @internal Exported for tests.
|
|
75
55
|
*/
|
|
76
56
|
export function createPhysicalPath(...segments) {
|
|
77
57
|
const normalized = segments
|
|
@@ -87,7 +67,6 @@ export function createPhysicalPath(...segments) {
|
|
|
87
67
|
* Strip leading and trailing slashes from a path or URL segment.
|
|
88
68
|
*
|
|
89
69
|
* @example
|
|
90
|
-
* trimSlashes('/docs/guides/') // 'docs/guides'
|
|
91
70
|
* trimSlashes('///multi///') // 'multi'
|
|
92
71
|
*/
|
|
93
72
|
export function trimSlashes(path) {
|
|
@@ -101,8 +80,9 @@ export function trimSlashes(path) {
|
|
|
101
80
|
return path.slice(start, end);
|
|
102
81
|
}
|
|
103
82
|
/**
|
|
104
|
-
* Join path segments with forward slashes.
|
|
105
|
-
*
|
|
83
|
+
* Join path segments with forward slashes. Does NOT check for traversal --
|
|
84
|
+
* use createLogicalPath/createPhysicalPath where the result is used as a path.
|
|
85
|
+
* @internal Exported for tests.
|
|
106
86
|
*/
|
|
107
87
|
export function joinPath(...segments) {
|
|
108
88
|
return segments
|
package/dist/paths/resolve.d.ts
CHANGED
|
@@ -4,26 +4,13 @@
|
|
|
4
4
|
import type { FlatSchemaItem } from '../config/index.js';
|
|
5
5
|
import type { LogicalPath } from './types.js';
|
|
6
6
|
/**
|
|
7
|
-
* Resolve a physical collection path
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* while logical paths are schema-defined (e.g., "content/authors").
|
|
11
|
-
*
|
|
12
|
-
* This function matches physical path segments to logical path segments,
|
|
13
|
-
* accounting for ID suffixes in physical paths.
|
|
14
|
-
*
|
|
15
|
-
* @param physicalPath - The physical filesystem path with embedded IDs
|
|
16
|
-
* @param schemaItems - Iterable of schema items to search
|
|
17
|
-
* @returns The matching logical path, or the physical path if no match found
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* // Match physical to logical
|
|
21
|
-
* resolveLogicalPath("content/authors.q52DCVPuH4ga", schemaItems)
|
|
22
|
-
* // Returns: "content/authors"
|
|
7
|
+
* Resolve a physical collection path (segments carry embedded IDs, e.g.
|
|
8
|
+
* "content/authors.q52DCVPuH4ga") to its schema-defined logical path
|
|
9
|
+
* ("content/authors"), or back to the physical path when nothing matches.
|
|
23
10
|
*
|
|
24
11
|
* @example
|
|
25
|
-
* // Nested collections
|
|
26
12
|
* resolveLogicalPath("content/docs.ABC/api.DEF", schemaItems)
|
|
27
13
|
* // Returns: "content/docs/api"
|
|
14
|
+
* @internal Exported for tests.
|
|
28
15
|
*/
|
|
29
16
|
export declare function resolveLogicalPath(physicalPath: string, schemaItems: Iterable<FlatSchemaItem>): LogicalPath | string;
|