canopycms 0.0.63 → 0.0.65
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 +153 -19
- package/dist/ai/generate.d.ts +4 -5
- package/dist/ai/generate.js +0 -1
- package/dist/ai/handler.d.ts +3 -4
- package/dist/ai/handler.js +0 -1
- package/dist/ai/index.d.ts +7 -8
- package/dist/ai/index.js +0 -1
- package/dist/ai/json-to-markdown.d.ts +1 -2
- package/dist/ai/json-to-markdown.js +11 -2
- package/dist/ai/resolve-branch.d.ts +1 -2
- package/dist/ai/resolve-branch.js +0 -1
- package/dist/ai/strip-mdx.d.ts +0 -1
- package/dist/ai/strip-mdx.js +0 -1
- package/dist/ai/to-plain-text.d.ts +4 -1
- package/dist/ai/to-plain-text.js +47 -1
- package/dist/ai/transform-components.d.ts +1 -2
- package/dist/ai/transform-components.js +0 -1
- package/dist/ai/types.d.ts +1 -2
- package/dist/ai/types.js +0 -1
- package/dist/api/admin-branch-health.d.ts +7 -8
- package/dist/api/admin-branch-health.js +0 -1
- package/dist/api/admin.d.ts +16 -17
- package/dist/api/admin.js +0 -1
- package/dist/api/assets.d.ts +8 -9
- package/dist/api/assets.js +9 -1
- package/dist/api/branch-merge.d.ts +3 -4
- package/dist/api/branch-merge.js +0 -1
- package/dist/api/branch-review.d.ts +5 -6
- package/dist/api/branch-review.js +0 -1
- package/dist/api/branch-status.d.ts +15 -16
- package/dist/api/branch-status.js +0 -1
- package/dist/api/branch-withdraw.d.ts +3 -4
- package/dist/api/branch-withdraw.js +0 -1
- package/dist/api/branch.d.ts +13 -14
- package/dist/api/branch.js +0 -1
- package/dist/api/client.d.ts +14 -15
- package/dist/api/client.js +0 -1
- package/dist/api/comments.d.ts +11 -12
- package/dist/api/comments.js +0 -1
- package/dist/api/content.d.ts +22 -24
- package/dist/api/content.js +132 -18
- package/dist/api/entries-constants.d.ts +0 -1
- package/dist/api/entries-constants.js +0 -1
- package/dist/api/entries.d.ts +12 -13
- package/dist/api/entries.js +12 -2
- package/dist/api/github-sync.d.ts +2 -3
- package/dist/api/github-sync.js +0 -1
- package/dist/api/groups.d.ts +6 -7
- package/dist/api/groups.js +0 -1
- package/dist/api/guards.d.ts +2 -3
- package/dist/api/guards.js +0 -1
- package/dist/api/index.d.ts +18 -19
- package/dist/api/index.js +0 -1
- package/dist/api/permissions.d.ts +10 -11
- package/dist/api/permissions.js +0 -1
- package/dist/api/reference-options.d.ts +3 -4
- package/dist/api/reference-options.js +0 -1
- package/dist/api/request-body-hash.d.ts +0 -1
- package/dist/api/request-body-hash.js +0 -1
- package/dist/api/resolve-references.d.ts +6 -7
- package/dist/api/resolve-references.js +24 -6
- package/dist/api/route-builder.d.ts +2 -3
- package/dist/api/route-builder.js +0 -1
- package/dist/api/schema.d.ts +43 -44
- package/dist/api/schema.js +0 -1
- package/dist/api/settings-helpers.d.ts +2 -3
- package/dist/api/settings-helpers.js +0 -1
- package/dist/api/types.d.ts +6 -7
- package/dist/api/types.js +0 -1
- package/dist/api/user.d.ts +2 -3
- package/dist/api/user.js +0 -1
- package/dist/api/validators.d.ts +3 -4
- package/dist/api/validators.js +0 -1
- package/dist/assets/asset-prefixes.d.ts +1 -2
- package/dist/assets/asset-prefixes.js +0 -1
- package/dist/assets/asset-src.d.ts +17 -5
- package/dist/assets/asset-src.js +15 -3
- package/dist/assets/asset-url.d.ts +28 -7
- package/dist/assets/asset-url.js +20 -15
- package/dist/assets/factory.d.ts +2 -3
- package/dist/assets/factory.js +0 -2
- package/dist/assets/finalize.d.ts +2 -3
- package/dist/assets/finalize.js +0 -1
- package/dist/assets/index.d.ts +12 -13
- package/dist/assets/index.js +0 -1
- package/dist/assets/keys.d.ts +1 -2
- package/dist/assets/keys.js +0 -1
- package/dist/assets/pipeline.d.ts +1 -2
- package/dist/assets/pipeline.js +0 -1
- package/dist/assets/store-local.d.ts +1 -2
- package/dist/assets/store-local.js +0 -1
- package/dist/assets/store-s3.d.ts +2 -4
- package/dist/assets/store-s3.js +0 -1
- package/dist/assets/svg-sanitizer.d.ts +0 -1
- package/dist/assets/svg-sanitizer.js +0 -1
- package/dist/assets/transform-directives.d.ts +0 -1
- package/dist/assets/transform-directives.js +0 -1
- package/dist/assets/transform.d.ts +1 -2
- package/dist/assets/transform.js +0 -1
- package/dist/assets/types.d.ts +0 -1
- package/dist/assets/types.js +0 -1
- package/dist/auth/cache.d.ts +2 -3
- package/dist/auth/cache.js +0 -1
- package/dist/auth/caching-auth-plugin.d.ts +3 -4
- package/dist/auth/caching-auth-plugin.js +0 -1
- package/dist/auth/context-helpers.d.ts +1 -2
- package/dist/auth/context-helpers.js +0 -1
- package/dist/auth/file-based-auth-cache.d.ts +3 -4
- package/dist/auth/file-based-auth-cache.js +14 -3
- package/dist/auth/index.d.ts +6 -7
- package/dist/auth/index.js +0 -1
- package/dist/auth/plugin.d.ts +3 -4
- package/dist/auth/plugin.js +0 -1
- package/dist/auth/types.d.ts +1 -2
- package/dist/auth/types.js +0 -1
- package/dist/authorization/branch.d.ts +4 -5
- package/dist/authorization/branch.js +0 -1
- package/dist/authorization/content.d.ts +6 -7
- package/dist/authorization/content.js +0 -1
- package/dist/authorization/groups/index.d.ts +2 -3
- package/dist/authorization/groups/index.js +0 -1
- package/dist/authorization/groups/loader.d.ts +3 -4
- package/dist/authorization/groups/loader.js +0 -1
- package/dist/authorization/groups/schema.d.ts +1 -2
- package/dist/authorization/groups/schema.js +0 -1
- package/dist/authorization/helpers.d.ts +0 -1
- package/dist/authorization/helpers.js +0 -1
- package/dist/authorization/index.d.ts +11 -12
- package/dist/authorization/index.js +0 -1
- package/dist/authorization/path.d.ts +4 -5
- package/dist/authorization/path.js +0 -1
- package/dist/authorization/permissions/index.d.ts +2 -3
- package/dist/authorization/permissions/index.js +0 -1
- package/dist/authorization/permissions/loader.d.ts +4 -5
- package/dist/authorization/permissions/loader.js +0 -1
- package/dist/authorization/permissions/schema.d.ts +2 -3
- package/dist/authorization/permissions/schema.js +0 -1
- package/dist/authorization/protected-branch.d.ts +2 -3
- package/dist/authorization/protected-branch.js +0 -1
- package/dist/authorization/settings-file-store.d.ts +1 -2
- package/dist/authorization/settings-file-store.js +0 -1
- package/dist/authorization/types.d.ts +6 -7
- package/dist/authorization/types.js +0 -1
- package/dist/authorization/validation.d.ts +1 -2
- package/dist/authorization/validation.js +0 -1
- package/dist/branch-health.d.ts +22 -3
- package/dist/branch-health.js +6 -2
- package/dist/branch-metadata.d.ts +2 -3
- package/dist/branch-metadata.js +0 -1
- package/dist/branch-registry.d.ts +1 -2
- package/dist/branch-registry.js +0 -1
- package/dist/branch-schema-cache.d.ts +4 -5
- package/dist/branch-schema-cache.js +0 -1
- package/dist/branch-workspace.d.ts +4 -5
- package/dist/branch-workspace.js +0 -1
- package/dist/build/generate-ai-content.d.ts +21 -5
- package/dist/build/generate-ai-content.js +98 -6
- package/dist/build/index.d.ts +2 -3
- package/dist/build/index.js +0 -1
- package/dist/build-canopy.d.ts +5 -6
- package/dist/build-canopy.js +0 -1
- package/dist/build-mode.d.ts +1 -2
- package/dist/build-mode.js +0 -1
- package/dist/cli/cli.d.ts +18 -2
- package/dist/cli/cli.js +1172 -490
- package/dist/cli/generate-ai-content.d.ts +0 -1
- package/dist/cli/generate-ai-content.js +1000 -360
- package/dist/cli/init.d.ts +1 -2
- package/dist/cli/init.js +43 -6
- package/dist/cli/migrate.d.ts +5 -3
- package/dist/cli/migrate.js +5 -3
- package/dist/cli/project-detect.d.ts +5 -2
- package/dist/cli/project-detect.js +5 -1
- package/dist/cli/project-root.d.ts +0 -1
- package/dist/cli/project-root.js +0 -1
- package/dist/cli/sync.d.ts +0 -1
- package/dist/cli/sync.js +0 -1
- package/dist/cli/template-files/Dockerfile.cms.template +8 -2
- package/dist/cli/template-files/cms-stack.ts.template +33 -6
- package/dist/cli/template-files/deploy-cms.yml.template +29 -14
- package/dist/cli/templates.d.ts +0 -1
- package/dist/cli/templates.js +0 -1
- package/dist/client.d.ts +13 -14
- package/dist/client.js +0 -1
- package/dist/comment-store.d.ts +0 -1
- package/dist/comment-store.js +0 -1
- package/dist/config/flatten.d.ts +1 -2
- package/dist/config/flatten.js +0 -1
- package/dist/config/helpers.d.ts +3 -4
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +10 -11
- package/dist/config/index.js +0 -1
- package/dist/config/schemas/collection.d.ts +0 -1
- package/dist/config/schemas/collection.js +0 -1
- package/dist/config/schemas/config.d.ts +7 -4
- package/dist/config/schemas/config.js +12 -1
- package/dist/config/schemas/field.d.ts +3 -1
- package/dist/config/schemas/field.js +5 -1
- package/dist/config/schemas/media.d.ts +0 -1
- package/dist/config/schemas/media.js +0 -1
- package/dist/config/schemas/permissions.d.ts +0 -1
- package/dist/config/schemas/permissions.js +0 -1
- package/dist/config/types.d.ts +55 -9
- package/dist/config/types.js +0 -1
- package/dist/config/validation.d.ts +1 -2
- package/dist/config/validation.js +0 -1
- package/dist/config.d.ts +2 -3
- package/dist/config.js +0 -1
- package/dist/content-id-index.d.ts +1 -2
- package/dist/content-id-index.js +0 -1
- package/dist/content-index-generation.d.ts +0 -1
- package/dist/content-index-generation.js +0 -1
- package/dist/content-index-registry.d.ts +0 -1
- package/dist/content-index-registry.js +0 -1
- package/dist/content-listing.d.ts +75 -59
- package/dist/content-listing.js +76 -83
- package/dist/content-reader.d.ts +4 -5
- package/dist/content-reader.js +22 -3
- package/dist/content-store.d.ts +137 -6
- package/dist/content-store.js +294 -22
- package/dist/content-tree.d.ts +15 -5
- package/dist/content-tree.js +27 -8
- package/dist/context.d.ts +9 -6
- package/dist/context.js +0 -1
- package/dist/dev-content-watcher.d.ts +12 -3
- package/dist/dev-content-watcher.js +120 -30
- package/dist/editor/BranchManager.d.ts +4 -5
- package/dist/editor/BranchManager.js +0 -1
- package/dist/editor/CanopyEditor.d.ts +2 -3
- package/dist/editor/CanopyEditor.js +1 -2
- package/dist/editor/CanopyEditorPage.d.ts +2 -3
- package/dist/editor/CanopyEditorPage.js +0 -1
- package/dist/editor/CommentsPanel.d.ts +2 -3
- package/dist/editor/CommentsPanel.js +0 -1
- package/dist/editor/Editor.d.ts +13 -8
- package/dist/editor/Editor.js +4 -5
- package/dist/editor/EditorPanes.d.ts +0 -1
- package/dist/editor/EditorPanes.js +0 -1
- package/dist/editor/EntryNavigator.d.ts +1 -2
- package/dist/editor/EntryNavigator.js +0 -1
- package/dist/editor/FormRenderer.d.ts +2 -3
- package/dist/editor/FormRenderer.js +22 -3
- package/dist/editor/GroupManager.d.ts +2 -3
- package/dist/editor/GroupManager.js +0 -1
- package/dist/editor/PermissionManager.d.ts +2 -3
- package/dist/editor/PermissionManager.js +0 -1
- package/dist/editor/admin/SystemHealthPanel.d.ts +0 -1
- package/dist/editor/admin/SystemHealthPanel.js +0 -1
- package/dist/editor/admin/useSystemHealth.d.ts +2 -3
- package/dist/editor/admin/useSystemHealth.js +0 -1
- package/dist/editor/canopy-path.d.ts +0 -1
- package/dist/editor/canopy-path.js +0 -1
- package/dist/editor/client-reference-resolver.d.ts +13 -4
- package/dist/editor/client-reference-resolver.js +18 -8
- package/dist/editor/comments/BranchComments.d.ts +2 -3
- package/dist/editor/comments/BranchComments.js +0 -1
- package/dist/editor/comments/EntryComments.d.ts +1 -2
- package/dist/editor/comments/EntryComments.js +0 -1
- package/dist/editor/comments/FieldWrapper.d.ts +1 -2
- package/dist/editor/comments/FieldWrapper.js +0 -1
- package/dist/editor/comments/InlineCommentThread.d.ts +2 -3
- package/dist/editor/comments/InlineCommentThread.js +0 -1
- package/dist/editor/comments/ThreadCarousel.d.ts +2 -3
- package/dist/editor/comments/ThreadCarousel.js +0 -1
- package/dist/editor/components/ConfirmDeleteModal.d.ts +0 -1
- package/dist/editor/components/ConfirmDeleteModal.js +0 -1
- package/dist/editor/components/EditorFooter.d.ts +0 -1
- package/dist/editor/components/EditorFooter.js +0 -1
- package/dist/editor/components/EditorHeader.d.ts +4 -5
- package/dist/editor/components/EditorHeader.js +0 -1
- package/dist/editor/components/EditorSidebar.d.ts +1 -2
- package/dist/editor/components/EditorSidebar.js +0 -1
- package/dist/editor/components/EntryCreateModal.d.ts +0 -1
- package/dist/editor/components/EntryCreateModal.js +21 -10
- package/dist/editor/components/RenameEntryModal.d.ts +0 -1
- package/dist/editor/components/RenameEntryModal.js +0 -1
- package/dist/editor/components/UserBadge.d.ts +2 -3
- package/dist/editor/components/UserBadge.js +0 -1
- package/dist/editor/components/index.d.ts +3 -4
- package/dist/editor/components/index.js +0 -1
- package/dist/editor/context/ApiClientContext.d.ts +9 -3
- package/dist/editor/context/ApiClientContext.js +8 -4
- package/dist/editor/context/AssetContext.d.ts +26 -2
- package/dist/editor/context/AssetContext.js +23 -3
- package/dist/editor/context/EditorStateContext.d.ts +1 -2
- package/dist/editor/context/EditorStateContext.js +0 -1
- package/dist/editor/context/SWRProvider.d.ts +0 -1
- package/dist/editor/context/SWRProvider.js +0 -1
- package/dist/editor/context/index.d.ts +4 -5
- package/dist/editor/context/index.js +0 -1
- package/dist/editor/editor-config.d.ts +2 -3
- package/dist/editor/editor-config.js +0 -1
- package/dist/editor/editor-utils.d.ts +22 -10
- package/dist/editor/editor-utils.js +41 -10
- package/dist/editor/fields/BlockField.d.ts +1 -2
- package/dist/editor/fields/BlockField.js +0 -1
- package/dist/editor/fields/CodeField.d.ts +0 -1
- package/dist/editor/fields/CodeField.js +0 -1
- package/dist/editor/fields/DateTimeField.d.ts +0 -1
- package/dist/editor/fields/DateTimeField.js +0 -1
- package/dist/editor/fields/ImageField.d.ts +1 -2
- package/dist/editor/fields/ImageField.js +0 -1
- package/dist/editor/fields/InlineGroupField.d.ts +2 -3
- package/dist/editor/fields/InlineGroupField.js +0 -1
- package/dist/editor/fields/MarkdownField.d.ts +0 -1
- package/dist/editor/fields/MarkdownField.js +0 -1
- package/dist/editor/fields/MdxImageDialog.d.ts +0 -1
- package/dist/editor/fields/MdxImageDialog.js +0 -1
- package/dist/editor/fields/NumberField.d.ts +0 -1
- package/dist/editor/fields/NumberField.js +0 -1
- package/dist/editor/fields/NumberListField.d.ts +0 -1
- package/dist/editor/fields/NumberListField.js +0 -1
- package/dist/editor/fields/ObjectField.d.ts +11 -2
- package/dist/editor/fields/ObjectField.js +3 -4
- package/dist/editor/fields/ReferenceField.d.ts +0 -1
- package/dist/editor/fields/ReferenceField.js +8 -3
- package/dist/editor/fields/SelectField.d.ts +0 -1
- package/dist/editor/fields/SelectField.js +0 -1
- package/dist/editor/fields/StringListField.d.ts +0 -1
- package/dist/editor/fields/StringListField.js +0 -1
- 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.d.ts +1 -2
- package/dist/editor/fields/entry-link/EntryLinkContext.js +0 -1
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -1
- package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -1
- package/dist/editor/fields/entry-link/index.d.ts +2 -3
- package/dist/editor/fields/entry-link/index.js +0 -1
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts +1 -2
- package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts +1 -2
- package/dist/editor/group-manager/GroupCard.js +0 -1
- package/dist/editor/group-manager/GroupForm.d.ts +1 -2
- package/dist/editor/group-manager/GroupForm.js +0 -1
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +1 -2
- package/dist/editor/group-manager/InternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/MemberList.d.ts +1 -2
- package/dist/editor/group-manager/MemberList.js +0 -1
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +1 -2
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -1
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +1 -2
- package/dist/editor/group-manager/hooks/useGroupState.js +0 -1
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts +1 -2
- package/dist/editor/group-manager/hooks/useUserSearch.js +0 -1
- package/dist/editor/group-manager/index.d.ts +5 -6
- package/dist/editor/group-manager/index.js +0 -1
- package/dist/editor/group-manager/types.d.ts +4 -5
- package/dist/editor/group-manager/types.js +0 -1
- package/dist/editor/hooks/index.d.ts +14 -15
- package/dist/editor/hooks/index.js +0 -1
- package/dist/editor/hooks/useBranchActions.d.ts +0 -1
- package/dist/editor/hooks/useBranchActions.js +0 -1
- package/dist/editor/hooks/useBranchManager.d.ts +4 -5
- package/dist/editor/hooks/useBranchManager.js +0 -1
- package/dist/editor/hooks/useBranchesData.d.ts +2 -3
- package/dist/editor/hooks/useBranchesData.js +0 -1
- package/dist/editor/hooks/useCommentSystem.d.ts +2 -3
- package/dist/editor/hooks/useCommentSystem.js +0 -1
- package/dist/editor/hooks/useCommentsData.d.ts +2 -3
- package/dist/editor/hooks/useCommentsData.js +0 -1
- package/dist/editor/hooks/useDraftManager.d.ts +3 -4
- package/dist/editor/hooks/useDraftManager.js +0 -1
- package/dist/editor/hooks/useEditorLayout.d.ts +1 -2
- package/dist/editor/hooks/useEditorLayout.js +0 -1
- package/dist/editor/hooks/useEntriesData.d.ts +3 -5
- package/dist/editor/hooks/useEntriesData.js +0 -3
- package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -3
- package/dist/editor/hooks/useEntryLinkResolution.js +0 -1
- package/dist/editor/hooks/useEntryManager.d.ts +5 -7
- package/dist/editor/hooks/useEntryManager.js +8 -3
- package/dist/editor/hooks/useGroupManager.d.ts +2 -3
- package/dist/editor/hooks/useGroupManager.js +0 -1
- package/dist/editor/hooks/usePermissionManager.d.ts +2 -3
- package/dist/editor/hooks/usePermissionManager.js +0 -1
- package/dist/editor/hooks/useReferenceResolution.d.ts +1 -2
- package/dist/editor/hooks/useReferenceResolution.js +8 -3
- package/dist/editor/hooks/useSchemaManager.d.ts +2 -3
- package/dist/editor/hooks/useSchemaManager.js +0 -1
- package/dist/editor/hooks/useUserContext.d.ts +1 -2
- package/dist/editor/hooks/useUserContext.js +8 -3
- package/dist/editor/hooks/useUserMetadata.d.ts +2 -3
- package/dist/editor/hooks/useUserMetadata.js +0 -1
- package/dist/editor/media/AssetCard.d.ts +1 -2
- package/dist/editor/media/AssetCard.js +0 -1
- package/dist/editor/media/CropStep.d.ts +1 -2
- package/dist/editor/media/CropStep.js +0 -1
- package/dist/editor/media/MediaLibrary.d.ts +1 -2
- package/dist/editor/media/MediaLibrary.js +0 -1
- package/dist/editor/media/MediaLibraryBody.d.ts +1 -2
- package/dist/editor/media/MediaLibraryBody.js +0 -1
- package/dist/editor/media/crop-math.d.ts +1 -2
- package/dist/editor/media/crop-math.js +0 -1
- package/dist/editor/media/upload-asset.d.ts +2 -3
- package/dist/editor/media/upload-asset.js +0 -1
- package/dist/editor/media/upload-constants.d.ts +0 -1
- package/dist/editor/media/upload-constants.js +0 -1
- package/dist/editor/media/useAssetUpload.d.ts +1 -2
- package/dist/editor/media/useAssetUpload.js +0 -1
- package/dist/editor/media/xhr-upload.d.ts +0 -1
- package/dist/editor/media/xhr-upload.js +0 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts +1 -2
- package/dist/editor/permission-manager/GroupSelector.js +0 -1
- package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -2
- package/dist/editor/permission-manager/PermissionEditor.js +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +1 -2
- package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -1
- package/dist/editor/permission-manager/PermissionTree.d.ts +1 -2
- package/dist/editor/permission-manager/PermissionTree.js +0 -1
- package/dist/editor/permission-manager/UserSelector.d.ts +1 -2
- package/dist/editor/permission-manager/UserSelector.js +0 -1
- package/dist/editor/permission-manager/constants.d.ts +1 -2
- package/dist/editor/permission-manager/constants.js +0 -1
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +1 -2
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -1
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +2 -3
- package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -1
- package/dist/editor/permission-manager/index.d.ts +4 -5
- package/dist/editor/permission-manager/index.js +0 -1
- package/dist/editor/permission-manager/types.d.ts +3 -4
- package/dist/editor/permission-manager/types.js +0 -1
- package/dist/editor/permission-manager/utils.d.ts +2 -3
- package/dist/editor/permission-manager/utils.js +0 -1
- package/dist/editor/preview-bridge.d.ts +1 -2
- package/dist/editor/preview-bridge.js +0 -1
- package/dist/editor/relative-time.d.ts +0 -1
- package/dist/editor/relative-time.js +0 -1
- package/dist/editor/schema-editor/CollectionEditor.d.ts +4 -5
- package/dist/editor/schema-editor/CollectionEditor.js +0 -1
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +2 -3
- package/dist/editor/schema-editor/EntryTypeEditor.js +0 -1
- package/dist/editor/schema-editor/index.d.ts +2 -3
- package/dist/editor/schema-editor/index.js +0 -1
- package/dist/editor/theme.d.ts +0 -1
- package/dist/editor/theme.js +0 -1
- package/dist/editor/utils/env.d.ts +0 -1
- package/dist/editor/utils/env.js +0 -1
- package/dist/entry-link-resolver.d.ts +1 -2
- package/dist/entry-link-resolver.js +0 -1
- package/dist/entry-schema-registry.d.ts +3 -4
- package/dist/entry-schema-registry.js +6 -2
- package/dist/entry-schema.d.ts +114 -3
- package/dist/entry-schema.js +46 -1
- package/dist/git-manager.d.ts +1 -2
- package/dist/git-manager.js +0 -1
- package/dist/github-service.d.ts +1 -2
- package/dist/github-service.js +0 -1
- package/dist/http/handler.d.ts +6 -7
- package/dist/http/handler.js +0 -1
- package/dist/http/index.d.ts +6 -7
- package/dist/http/index.js +0 -1
- package/dist/http/router.d.ts +2 -3
- package/dist/http/router.js +0 -1
- package/dist/http/types.d.ts +0 -1
- package/dist/http/types.js +0 -1
- package/dist/id.d.ts +2 -3
- package/dist/id.js +0 -1
- package/dist/index.d.ts +17 -18
- package/dist/index.js +0 -1
- package/dist/operating-mode/client-safe-strategy.d.ts +1 -2
- package/dist/operating-mode/client-safe-strategy.js +0 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts +1 -2
- package/dist/operating-mode/client-unsafe-strategy.js +0 -1
- package/dist/operating-mode/client.d.ts +3 -4
- package/dist/operating-mode/client.js +0 -1
- package/dist/operating-mode/deployment-name-fixtures.d.ts +0 -1
- package/dist/operating-mode/deployment-name-fixtures.js +0 -1
- package/dist/operating-mode/deployment-name.d.ts +0 -1
- package/dist/operating-mode/deployment-name.js +0 -1
- package/dist/operating-mode/index.d.ts +5 -6
- package/dist/operating-mode/index.js +0 -1
- package/dist/operating-mode/mode-env.d.ts +1 -2
- package/dist/operating-mode/mode-env.js +0 -1
- package/dist/operating-mode/types.d.ts +2 -3
- package/dist/operating-mode/types.js +0 -1
- package/dist/paths/branch-name.d.ts +1 -2
- package/dist/paths/branch-name.js +0 -1
- package/dist/paths/branch.d.ts +3 -4
- package/dist/paths/branch.js +0 -1
- package/dist/paths/index.d.ts +8 -9
- package/dist/paths/index.js +0 -1
- package/dist/paths/normalize-server.d.ts +1 -2
- package/dist/paths/normalize-server.js +0 -1
- package/dist/paths/normalize.d.ts +1 -2
- package/dist/paths/normalize.js +0 -1
- package/dist/paths/resolve.d.ts +2 -3
- package/dist/paths/resolve.js +0 -1
- package/dist/paths/types.d.ts +0 -1
- package/dist/paths/types.js +0 -1
- package/dist/paths/validation.d.ts +1 -2
- package/dist/paths/validation.js +0 -1
- package/dist/reference-resolver.d.ts +3 -4
- package/dist/reference-resolver.js +0 -1
- package/dist/resolve-canopy-user.d.ts +3 -4
- package/dist/resolve-canopy-user.js +0 -1
- package/dist/resource-generation.d.ts +0 -1
- package/dist/resource-generation.js +0 -1
- package/dist/schema/index.d.ts +3 -4
- package/dist/schema/index.js +0 -1
- package/dist/schema/meta-loader.d.ts +3 -4
- package/dist/schema/meta-loader.js +3 -3
- package/dist/schema/resolver.d.ts +2 -3
- package/dist/schema/resolver.js +0 -1
- package/dist/schema/schema-store-types.d.ts +2 -3
- package/dist/schema/schema-store-types.js +0 -1
- package/dist/schema/schema-store.d.ts +6 -7
- package/dist/schema/schema-store.js +33 -1
- package/dist/schema/types.d.ts +1 -2
- package/dist/schema/types.js +0 -1
- package/dist/server.d.ts +54 -45
- package/dist/server.js +11 -3
- package/dist/services.d.ts +10 -11
- package/dist/services.js +0 -1
- package/dist/settings-workspace.d.ts +12 -15
- package/dist/settings-workspace.js +10 -13
- package/dist/static/index.d.ts +164 -6
- package/dist/static/index.js +242 -7
- package/dist/static/seo.d.ts +8 -30
- package/dist/static/seo.js +19 -46
- package/dist/sync-core.d.ts +0 -1
- package/dist/sync-core.js +0 -1
- package/dist/task-queue/index.d.ts +2 -3
- package/dist/task-queue/index.js +0 -1
- package/dist/task-queue/task-queue.d.ts +1 -2
- package/dist/task-queue/task-queue.js +10 -2
- package/dist/task-queue/types.d.ts +0 -1
- package/dist/task-queue/types.js +0 -1
- package/dist/types.d.ts +3 -4
- package/dist/types.js +0 -1
- package/dist/url-collision.d.ts +86 -0
- package/dist/url-collision.js +186 -0
- package/dist/url-path-resolver.d.ts +11 -2
- package/dist/url-path-resolver.js +37 -5
- package/dist/user.d.ts +3 -4
- package/dist/user.js +0 -1
- package/dist/utils/async-mutex.d.ts +0 -1
- package/dist/utils/async-mutex.js +0 -1
- package/dist/utils/atomic-write.d.ts +0 -1
- package/dist/utils/atomic-write.js +0 -1
- package/dist/utils/body-field.d.ts +12 -2
- package/dist/utils/body-field.js +17 -1
- package/dist/utils/content-serialize.d.ts +37 -0
- package/dist/utils/content-serialize.js +429 -0
- package/dist/utils/content-write-lock.d.ts +12 -16
- package/dist/utils/content-write-lock.js +38 -22
- package/dist/utils/debug.d.ts +0 -1
- package/dist/utils/debug.js +0 -1
- package/dist/utils/entry-url.d.ts +17 -1
- package/dist/utils/entry-url.js +21 -3
- package/dist/utils/error.d.ts +0 -1
- package/dist/utils/error.js +0 -1
- package/dist/utils/flatten-group-fields.d.ts +1 -2
- package/dist/utils/flatten-group-fields.js +0 -1
- package/dist/utils/format.d.ts +1 -2
- package/dist/utils/format.js +0 -1
- package/dist/utils/fs.d.ts +7 -1
- package/dist/utils/fs.js +16 -1
- package/dist/utils/git.d.ts +18 -2
- package/dist/utils/git.js +61 -1
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js +0 -1
- package/dist/utils/occ-json-write.d.ts +0 -1
- package/dist/utils/occ-json-write.js +0 -1
- package/dist/utils/provisioning-lock.d.ts +17 -4
- package/dist/utils/provisioning-lock.js +94 -14
- package/dist/utils/sanitize-href.d.ts +2 -3
- package/dist/utils/sanitize-href.js +2 -3
- package/dist/utils/title-field.d.ts +1 -2
- package/dist/utils/title-field.js +0 -1
- package/dist/utils/typed-filename.d.ts +61 -0
- package/dist/utils/typed-filename.js +92 -0
- package/dist/utils/url-prefix.d.ts +121 -0
- package/dist/utils/url-prefix.js +158 -0
- package/dist/validation/block-structural-keys.d.ts +42 -0
- package/dist/validation/block-structural-keys.js +44 -0
- package/dist/validation/deletion-checker.d.ts +4 -5
- package/dist/validation/deletion-checker.js +0 -1
- package/dist/validation/entry-link-validator.d.ts +2 -3
- package/dist/validation/entry-link-validator.js +0 -1
- package/dist/validation/entry-type-reference-validator.d.ts +1 -2
- package/dist/validation/entry-type-reference-validator.js +0 -1
- package/dist/validation/entry-validator.d.ts +23 -2
- package/dist/validation/entry-validator.js +34 -2
- package/dist/validation/field-traversal.d.ts +28 -4
- package/dist/validation/field-traversal.js +24 -7
- package/dist/validation/reference-validator.d.ts +2 -3
- package/dist/validation/reference-validator.js +0 -1
- package/dist/worker/cms-worker.d.ts +31 -2
- package/dist/worker/cms-worker.js +321 -13
- package/dist/worker/log.d.ts +0 -1
- package/dist/worker/log.js +0 -1
- package/dist/worker/task-queue-config.d.ts +1 -2
- package/dist/worker/task-queue-config.js +0 -1
- package/dist/worker/task-queue.d.ts +3 -4
- package/dist/worker/task-queue.js +0 -1
- package/dist/worker/worker-status.d.ts +1 -2
- package/dist/worker/worker-status.js +0 -1
- package/package.json +3 -6
- package/dist/ai/generate.d.ts.map +0 -1
- package/dist/ai/generate.js.map +0 -1
- package/dist/ai/handler.d.ts.map +0 -1
- package/dist/ai/handler.js.map +0 -1
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/json-to-markdown.d.ts.map +0 -1
- package/dist/ai/json-to-markdown.js.map +0 -1
- package/dist/ai/resolve-branch.d.ts.map +0 -1
- package/dist/ai/resolve-branch.js.map +0 -1
- package/dist/ai/strip-mdx.d.ts.map +0 -1
- package/dist/ai/strip-mdx.js.map +0 -1
- package/dist/ai/to-plain-text.d.ts.map +0 -1
- package/dist/ai/to-plain-text.js.map +0 -1
- package/dist/ai/transform-components.d.ts.map +0 -1
- package/dist/ai/transform-components.js.map +0 -1
- package/dist/ai/types.d.ts.map +0 -1
- package/dist/ai/types.js.map +0 -1
- package/dist/api/__test__/mock-client.d.ts +0 -231
- package/dist/api/__test__/mock-client.d.ts.map +0 -1
- package/dist/api/__test__/mock-client.js +0 -388
- package/dist/api/__test__/mock-client.js.map +0 -1
- package/dist/api/admin-branch-health.d.ts.map +0 -1
- package/dist/api/admin-branch-health.js.map +0 -1
- package/dist/api/admin.d.ts.map +0 -1
- package/dist/api/admin.js.map +0 -1
- package/dist/api/assets.d.ts.map +0 -1
- package/dist/api/assets.js.map +0 -1
- package/dist/api/branch-merge.d.ts.map +0 -1
- package/dist/api/branch-merge.js.map +0 -1
- package/dist/api/branch-review.d.ts.map +0 -1
- package/dist/api/branch-review.js.map +0 -1
- package/dist/api/branch-status.d.ts.map +0 -1
- package/dist/api/branch-status.js.map +0 -1
- package/dist/api/branch-withdraw.d.ts.map +0 -1
- package/dist/api/branch-withdraw.js.map +0 -1
- package/dist/api/branch.d.ts.map +0 -1
- package/dist/api/branch.js.map +0 -1
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js.map +0 -1
- package/dist/api/comments.d.ts.map +0 -1
- package/dist/api/comments.js.map +0 -1
- package/dist/api/content.d.ts.map +0 -1
- package/dist/api/content.js.map +0 -1
- package/dist/api/entries-constants.d.ts.map +0 -1
- package/dist/api/entries-constants.js.map +0 -1
- package/dist/api/entries.d.ts.map +0 -1
- package/dist/api/entries.js.map +0 -1
- package/dist/api/github-sync.d.ts.map +0 -1
- package/dist/api/github-sync.js.map +0 -1
- package/dist/api/groups.d.ts.map +0 -1
- package/dist/api/groups.js.map +0 -1
- package/dist/api/guards.d.ts.map +0 -1
- package/dist/api/guards.js.map +0 -1
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js.map +0 -1
- package/dist/api/permissions.d.ts.map +0 -1
- package/dist/api/permissions.js.map +0 -1
- package/dist/api/reference-options.d.ts.map +0 -1
- package/dist/api/reference-options.js.map +0 -1
- package/dist/api/request-body-hash.d.ts.map +0 -1
- package/dist/api/request-body-hash.js.map +0 -1
- package/dist/api/resolve-references.d.ts.map +0 -1
- package/dist/api/resolve-references.js.map +0 -1
- package/dist/api/route-builder.d.ts.map +0 -1
- package/dist/api/route-builder.js.map +0 -1
- package/dist/api/schema.d.ts.map +0 -1
- package/dist/api/schema.js.map +0 -1
- package/dist/api/settings-helpers.d.ts.map +0 -1
- package/dist/api/settings-helpers.js.map +0 -1
- package/dist/api/types.d.ts.map +0 -1
- package/dist/api/types.js.map +0 -1
- package/dist/api/user.d.ts.map +0 -1
- package/dist/api/user.js.map +0 -1
- package/dist/api/validators.d.ts.map +0 -1
- package/dist/api/validators.js.map +0 -1
- package/dist/assets/asset-prefixes.d.ts.map +0 -1
- package/dist/assets/asset-prefixes.js.map +0 -1
- package/dist/assets/asset-src.d.ts.map +0 -1
- package/dist/assets/asset-src.js.map +0 -1
- package/dist/assets/asset-url.d.ts.map +0 -1
- package/dist/assets/asset-url.js.map +0 -1
- package/dist/assets/factory.d.ts.map +0 -1
- package/dist/assets/factory.js.map +0 -1
- package/dist/assets/finalize.d.ts.map +0 -1
- package/dist/assets/finalize.js.map +0 -1
- package/dist/assets/index.d.ts.map +0 -1
- package/dist/assets/index.js.map +0 -1
- package/dist/assets/keys.d.ts.map +0 -1
- package/dist/assets/keys.js.map +0 -1
- package/dist/assets/pipeline.d.ts.map +0 -1
- package/dist/assets/pipeline.js.map +0 -1
- package/dist/assets/store-local.d.ts.map +0 -1
- package/dist/assets/store-local.js.map +0 -1
- package/dist/assets/store-s3.d.ts.map +0 -1
- package/dist/assets/store-s3.js.map +0 -1
- package/dist/assets/svg-sanitizer.d.ts.map +0 -1
- package/dist/assets/svg-sanitizer.js.map +0 -1
- package/dist/assets/transform-directives.d.ts.map +0 -1
- package/dist/assets/transform-directives.js.map +0 -1
- package/dist/assets/transform.d.ts.map +0 -1
- package/dist/assets/transform.js.map +0 -1
- package/dist/assets/types.d.ts.map +0 -1
- package/dist/assets/types.js.map +0 -1
- package/dist/auth/cache.d.ts.map +0 -1
- package/dist/auth/cache.js.map +0 -1
- package/dist/auth/caching-auth-plugin.d.ts.map +0 -1
- package/dist/auth/caching-auth-plugin.js.map +0 -1
- package/dist/auth/context-helpers.d.ts.map +0 -1
- package/dist/auth/context-helpers.js.map +0 -1
- package/dist/auth/file-based-auth-cache.d.ts.map +0 -1
- package/dist/auth/file-based-auth-cache.js.map +0 -1
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/plugin.d.ts.map +0 -1
- package/dist/auth/plugin.js.map +0 -1
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js.map +0 -1
- package/dist/authorization/branch.d.ts.map +0 -1
- package/dist/authorization/branch.js.map +0 -1
- package/dist/authorization/content.d.ts.map +0 -1
- package/dist/authorization/content.js.map +0 -1
- package/dist/authorization/groups/index.d.ts.map +0 -1
- package/dist/authorization/groups/index.js.map +0 -1
- package/dist/authorization/groups/loader.d.ts.map +0 -1
- package/dist/authorization/groups/loader.js.map +0 -1
- package/dist/authorization/groups/schema.d.ts.map +0 -1
- package/dist/authorization/groups/schema.js.map +0 -1
- package/dist/authorization/helpers.d.ts.map +0 -1
- package/dist/authorization/helpers.js.map +0 -1
- package/dist/authorization/index.d.ts.map +0 -1
- package/dist/authorization/index.js.map +0 -1
- package/dist/authorization/path.d.ts.map +0 -1
- package/dist/authorization/path.js.map +0 -1
- package/dist/authorization/permissions/index.d.ts.map +0 -1
- package/dist/authorization/permissions/index.js.map +0 -1
- package/dist/authorization/permissions/loader.d.ts.map +0 -1
- package/dist/authorization/permissions/loader.js.map +0 -1
- package/dist/authorization/permissions/schema.d.ts.map +0 -1
- package/dist/authorization/permissions/schema.js.map +0 -1
- package/dist/authorization/protected-branch.d.ts.map +0 -1
- package/dist/authorization/protected-branch.js.map +0 -1
- package/dist/authorization/settings-file-store.d.ts.map +0 -1
- package/dist/authorization/settings-file-store.js.map +0 -1
- package/dist/authorization/test-utils.d.ts +0 -26
- package/dist/authorization/test-utils.d.ts.map +0 -1
- package/dist/authorization/test-utils.js +0 -23
- package/dist/authorization/test-utils.js.map +0 -1
- package/dist/authorization/types.d.ts.map +0 -1
- package/dist/authorization/types.js.map +0 -1
- package/dist/authorization/validation.d.ts.map +0 -1
- package/dist/authorization/validation.js.map +0 -1
- package/dist/branch-health.d.ts.map +0 -1
- package/dist/branch-health.js.map +0 -1
- package/dist/branch-metadata.d.ts.map +0 -1
- package/dist/branch-metadata.js.map +0 -1
- package/dist/branch-registry.d.ts.map +0 -1
- package/dist/branch-registry.js.map +0 -1
- package/dist/branch-schema-cache.d.ts.map +0 -1
- package/dist/branch-schema-cache.js.map +0 -1
- package/dist/branch-workspace.d.ts.map +0 -1
- package/dist/branch-workspace.js.map +0 -1
- package/dist/build/generate-ai-content.d.ts.map +0 -1
- package/dist/build/generate-ai-content.js.map +0 -1
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js.map +0 -1
- package/dist/build-canopy.d.ts.map +0 -1
- package/dist/build-canopy.js.map +0 -1
- package/dist/build-mode.d.ts.map +0 -1
- package/dist/build-mode.js.map +0 -1
- package/dist/cli/cli.d.ts.map +0 -1
- package/dist/cli/cli.js.map +0 -1
- package/dist/cli/generate-ai-content.d.ts.map +0 -1
- package/dist/cli/generate-ai-content.js.map +0 -1
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js.map +0 -1
- package/dist/cli/migrate.d.ts.map +0 -1
- package/dist/cli/migrate.js.map +0 -1
- package/dist/cli/project-detect.d.ts.map +0 -1
- package/dist/cli/project-detect.js.map +0 -1
- package/dist/cli/project-root.d.ts.map +0 -1
- package/dist/cli/project-root.js.map +0 -1
- package/dist/cli/sync.d.ts.map +0 -1
- package/dist/cli/sync.js.map +0 -1
- package/dist/cli/templates.d.ts.map +0 -1
- package/dist/cli/templates.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/comment-store.d.ts.map +0 -1
- package/dist/comment-store.js.map +0 -1
- package/dist/config/flatten.d.ts.map +0 -1
- package/dist/config/flatten.js.map +0 -1
- package/dist/config/helpers.d.ts.map +0 -1
- package/dist/config/helpers.js.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/config/schemas/collection.d.ts.map +0 -1
- package/dist/config/schemas/collection.js.map +0 -1
- package/dist/config/schemas/config.d.ts.map +0 -1
- package/dist/config/schemas/config.js.map +0 -1
- package/dist/config/schemas/field.d.ts.map +0 -1
- package/dist/config/schemas/field.js.map +0 -1
- package/dist/config/schemas/media.d.ts.map +0 -1
- package/dist/config/schemas/media.js.map +0 -1
- package/dist/config/schemas/permissions.d.ts.map +0 -1
- package/dist/config/schemas/permissions.js.map +0 -1
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js.map +0 -1
- package/dist/config/validation.d.ts.map +0 -1
- package/dist/config/validation.js.map +0 -1
- package/dist/config-test.d.ts +0 -20
- package/dist/config-test.d.ts.map +0 -1
- package/dist/config-test.js +0 -49
- package/dist/config-test.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/content-id-index.d.ts.map +0 -1
- package/dist/content-id-index.js.map +0 -1
- package/dist/content-index-generation.d.ts.map +0 -1
- package/dist/content-index-generation.js.map +0 -1
- package/dist/content-index-registry.d.ts.map +0 -1
- package/dist/content-index-registry.js.map +0 -1
- package/dist/content-listing.d.ts.map +0 -1
- package/dist/content-listing.js.map +0 -1
- package/dist/content-reader.d.ts.map +0 -1
- package/dist/content-reader.js.map +0 -1
- package/dist/content-store.d.ts.map +0 -1
- package/dist/content-store.js.map +0 -1
- package/dist/content-tree.d.ts.map +0 -1
- package/dist/content-tree.js.map +0 -1
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js.map +0 -1
- package/dist/dev-content-watcher.d.ts.map +0 -1
- package/dist/dev-content-watcher.js.map +0 -1
- package/dist/editor/BranchManager.d.ts.map +0 -1
- package/dist/editor/BranchManager.js.map +0 -1
- package/dist/editor/CanopyEditor.d.ts.map +0 -1
- package/dist/editor/CanopyEditor.js.map +0 -1
- package/dist/editor/CanopyEditorPage.d.ts.map +0 -1
- package/dist/editor/CanopyEditorPage.js.map +0 -1
- package/dist/editor/CommentsPanel.d.ts.map +0 -1
- package/dist/editor/CommentsPanel.js.map +0 -1
- package/dist/editor/Editor.d.ts.map +0 -1
- package/dist/editor/Editor.js.map +0 -1
- package/dist/editor/EditorPanes.d.ts.map +0 -1
- package/dist/editor/EditorPanes.js.map +0 -1
- package/dist/editor/EntryNavigator.d.ts.map +0 -1
- package/dist/editor/EntryNavigator.js.map +0 -1
- package/dist/editor/FormRenderer.d.ts.map +0 -1
- package/dist/editor/FormRenderer.js.map +0 -1
- package/dist/editor/GroupManager.d.ts.map +0 -1
- package/dist/editor/GroupManager.js.map +0 -1
- package/dist/editor/PermissionManager.d.ts.map +0 -1
- package/dist/editor/PermissionManager.js.map +0 -1
- package/dist/editor/admin/SystemHealthPanel.d.ts.map +0 -1
- package/dist/editor/admin/SystemHealthPanel.js.map +0 -1
- package/dist/editor/admin/useSystemHealth.d.ts.map +0 -1
- package/dist/editor/admin/useSystemHealth.js.map +0 -1
- package/dist/editor/canopy-path.d.ts.map +0 -1
- package/dist/editor/canopy-path.js.map +0 -1
- package/dist/editor/client-reference-resolver.d.ts.map +0 -1
- package/dist/editor/client-reference-resolver.js.map +0 -1
- package/dist/editor/comments/BranchComments.d.ts.map +0 -1
- package/dist/editor/comments/BranchComments.js.map +0 -1
- package/dist/editor/comments/EntryComments.d.ts.map +0 -1
- package/dist/editor/comments/EntryComments.js.map +0 -1
- package/dist/editor/comments/FieldWrapper.d.ts.map +0 -1
- package/dist/editor/comments/FieldWrapper.js.map +0 -1
- package/dist/editor/comments/InlineCommentThread.d.ts.map +0 -1
- package/dist/editor/comments/InlineCommentThread.js.map +0 -1
- package/dist/editor/comments/ThreadCarousel.d.ts.map +0 -1
- package/dist/editor/comments/ThreadCarousel.js.map +0 -1
- package/dist/editor/components/ConfirmDeleteModal.d.ts.map +0 -1
- package/dist/editor/components/ConfirmDeleteModal.js.map +0 -1
- package/dist/editor/components/EditorFooter.d.ts.map +0 -1
- package/dist/editor/components/EditorFooter.js.map +0 -1
- package/dist/editor/components/EditorHeader.d.ts.map +0 -1
- package/dist/editor/components/EditorHeader.js.map +0 -1
- package/dist/editor/components/EditorSidebar.d.ts.map +0 -1
- package/dist/editor/components/EditorSidebar.js.map +0 -1
- package/dist/editor/components/EntryCreateModal.d.ts.map +0 -1
- package/dist/editor/components/EntryCreateModal.js.map +0 -1
- package/dist/editor/components/RenameEntryModal.d.ts.map +0 -1
- package/dist/editor/components/RenameEntryModal.js.map +0 -1
- package/dist/editor/components/UserBadge.d.ts.map +0 -1
- package/dist/editor/components/UserBadge.js.map +0 -1
- package/dist/editor/components/index.d.ts.map +0 -1
- package/dist/editor/components/index.js.map +0 -1
- package/dist/editor/context/ApiClientContext.d.ts.map +0 -1
- package/dist/editor/context/ApiClientContext.js.map +0 -1
- package/dist/editor/context/AssetContext.d.ts.map +0 -1
- package/dist/editor/context/AssetContext.js.map +0 -1
- package/dist/editor/context/EditorStateContext.d.ts.map +0 -1
- package/dist/editor/context/EditorStateContext.js.map +0 -1
- package/dist/editor/context/SWRProvider.d.ts.map +0 -1
- package/dist/editor/context/SWRProvider.js.map +0 -1
- package/dist/editor/context/index.d.ts.map +0 -1
- package/dist/editor/context/index.js.map +0 -1
- package/dist/editor/editor-config.d.ts.map +0 -1
- package/dist/editor/editor-config.js.map +0 -1
- package/dist/editor/editor-utils.d.ts.map +0 -1
- package/dist/editor/editor-utils.js.map +0 -1
- package/dist/editor/fields/BlockField.d.ts.map +0 -1
- package/dist/editor/fields/BlockField.js.map +0 -1
- package/dist/editor/fields/CodeField.d.ts.map +0 -1
- package/dist/editor/fields/CodeField.js.map +0 -1
- package/dist/editor/fields/DateTimeField.d.ts.map +0 -1
- package/dist/editor/fields/DateTimeField.js.map +0 -1
- package/dist/editor/fields/ImageField.d.ts.map +0 -1
- package/dist/editor/fields/ImageField.js.map +0 -1
- package/dist/editor/fields/InlineGroupField.d.ts.map +0 -1
- package/dist/editor/fields/InlineGroupField.js.map +0 -1
- package/dist/editor/fields/MarkdownField.d.ts.map +0 -1
- package/dist/editor/fields/MarkdownField.js.map +0 -1
- package/dist/editor/fields/MdxImageDialog.d.ts.map +0 -1
- package/dist/editor/fields/MdxImageDialog.js.map +0 -1
- package/dist/editor/fields/NumberField.d.ts.map +0 -1
- package/dist/editor/fields/NumberField.js.map +0 -1
- package/dist/editor/fields/NumberListField.d.ts.map +0 -1
- package/dist/editor/fields/NumberListField.js.map +0 -1
- package/dist/editor/fields/ObjectField.d.ts.map +0 -1
- package/dist/editor/fields/ObjectField.js.map +0 -1
- package/dist/editor/fields/ReferenceField.d.ts.map +0 -1
- package/dist/editor/fields/ReferenceField.js.map +0 -1
- package/dist/editor/fields/SelectField.d.ts.map +0 -1
- package/dist/editor/fields/SelectField.js.map +0 -1
- package/dist/editor/fields/StringListField.d.ts.map +0 -1
- package/dist/editor/fields/StringListField.js.map +0 -1
- package/dist/editor/fields/TextField.d.ts.map +0 -1
- package/dist/editor/fields/TextField.js.map +0 -1
- package/dist/editor/fields/ToggleField.d.ts.map +0 -1
- package/dist/editor/fields/ToggleField.js.map +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.d.ts.map +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.js.map +0 -1
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts.map +0 -1
- package/dist/editor/fields/entry-link/InsertEntryLink.js.map +0 -1
- package/dist/editor/fields/entry-link/index.d.ts.map +0 -1
- package/dist/editor/fields/entry-link/index.js.map +0 -1
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts.map +0 -1
- package/dist/editor/group-manager/ExternalGroupsTab.js.map +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts.map +0 -1
- package/dist/editor/group-manager/GroupCard.js.map +0 -1
- package/dist/editor/group-manager/GroupForm.d.ts.map +0 -1
- package/dist/editor/group-manager/GroupForm.js.map +0 -1
- package/dist/editor/group-manager/InternalGroupsTab.d.ts.map +0 -1
- package/dist/editor/group-manager/InternalGroupsTab.js.map +0 -1
- package/dist/editor/group-manager/MemberList.d.ts.map +0 -1
- package/dist/editor/group-manager/MemberList.js.map +0 -1
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts.map +0 -1
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js.map +0 -1
- package/dist/editor/group-manager/hooks/useGroupState.d.ts.map +0 -1
- package/dist/editor/group-manager/hooks/useGroupState.js.map +0 -1
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts.map +0 -1
- package/dist/editor/group-manager/hooks/useUserSearch.js.map +0 -1
- package/dist/editor/group-manager/index.d.ts.map +0 -1
- package/dist/editor/group-manager/index.js.map +0 -1
- package/dist/editor/group-manager/types.d.ts.map +0 -1
- package/dist/editor/group-manager/types.js.map +0 -1
- package/dist/editor/hooks/__test__/test-utils.d.ts +0 -164
- package/dist/editor/hooks/__test__/test-utils.d.ts.map +0 -1
- package/dist/editor/hooks/__test__/test-utils.js +0 -203
- package/dist/editor/hooks/__test__/test-utils.js.map +0 -1
- package/dist/editor/hooks/index.d.ts.map +0 -1
- package/dist/editor/hooks/index.js.map +0 -1
- package/dist/editor/hooks/useBranchActions.d.ts.map +0 -1
- package/dist/editor/hooks/useBranchActions.js.map +0 -1
- package/dist/editor/hooks/useBranchManager.d.ts.map +0 -1
- package/dist/editor/hooks/useBranchManager.js.map +0 -1
- package/dist/editor/hooks/useBranchesData.d.ts.map +0 -1
- package/dist/editor/hooks/useBranchesData.js.map +0 -1
- package/dist/editor/hooks/useCommentSystem.d.ts.map +0 -1
- package/dist/editor/hooks/useCommentSystem.js.map +0 -1
- package/dist/editor/hooks/useCommentsData.d.ts.map +0 -1
- package/dist/editor/hooks/useCommentsData.js.map +0 -1
- package/dist/editor/hooks/useDraftManager.d.ts.map +0 -1
- package/dist/editor/hooks/useDraftManager.js.map +0 -1
- package/dist/editor/hooks/useEditorLayout.d.ts.map +0 -1
- package/dist/editor/hooks/useEditorLayout.js.map +0 -1
- package/dist/editor/hooks/useEntriesData.d.ts.map +0 -1
- package/dist/editor/hooks/useEntriesData.js.map +0 -1
- package/dist/editor/hooks/useEntryLinkResolution.d.ts.map +0 -1
- package/dist/editor/hooks/useEntryLinkResolution.js.map +0 -1
- package/dist/editor/hooks/useEntryManager.d.ts.map +0 -1
- package/dist/editor/hooks/useEntryManager.js.map +0 -1
- package/dist/editor/hooks/useGroupManager.d.ts.map +0 -1
- package/dist/editor/hooks/useGroupManager.js.map +0 -1
- package/dist/editor/hooks/usePermissionManager.d.ts.map +0 -1
- package/dist/editor/hooks/usePermissionManager.js.map +0 -1
- package/dist/editor/hooks/useReferenceResolution.d.ts.map +0 -1
- package/dist/editor/hooks/useReferenceResolution.js.map +0 -1
- package/dist/editor/hooks/useSchemaManager.d.ts.map +0 -1
- package/dist/editor/hooks/useSchemaManager.js.map +0 -1
- package/dist/editor/hooks/useUserContext.d.ts.map +0 -1
- package/dist/editor/hooks/useUserContext.js.map +0 -1
- package/dist/editor/hooks/useUserMetadata.d.ts.map +0 -1
- package/dist/editor/hooks/useUserMetadata.js.map +0 -1
- package/dist/editor/media/AssetCard.d.ts.map +0 -1
- package/dist/editor/media/AssetCard.js.map +0 -1
- package/dist/editor/media/CropStep.d.ts.map +0 -1
- package/dist/editor/media/CropStep.js.map +0 -1
- package/dist/editor/media/MediaLibrary.d.ts.map +0 -1
- package/dist/editor/media/MediaLibrary.js.map +0 -1
- package/dist/editor/media/MediaLibraryBody.d.ts.map +0 -1
- package/dist/editor/media/MediaLibraryBody.js.map +0 -1
- package/dist/editor/media/crop-math.d.ts.map +0 -1
- package/dist/editor/media/crop-math.js.map +0 -1
- package/dist/editor/media/upload-asset.d.ts.map +0 -1
- package/dist/editor/media/upload-asset.js.map +0 -1
- package/dist/editor/media/upload-constants.d.ts.map +0 -1
- package/dist/editor/media/upload-constants.js.map +0 -1
- package/dist/editor/media/useAssetUpload.d.ts.map +0 -1
- package/dist/editor/media/useAssetUpload.js.map +0 -1
- package/dist/editor/media/xhr-upload.d.ts.map +0 -1
- package/dist/editor/media/xhr-upload.js.map +0 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts.map +0 -1
- package/dist/editor/permission-manager/GroupSelector.js.map +0 -1
- package/dist/editor/permission-manager/PermissionEditor.d.ts.map +0 -1
- package/dist/editor/permission-manager/PermissionEditor.js.map +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts.map +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.js.map +0 -1
- package/dist/editor/permission-manager/PermissionTree.d.ts.map +0 -1
- package/dist/editor/permission-manager/PermissionTree.js.map +0 -1
- package/dist/editor/permission-manager/UserSelector.d.ts.map +0 -1
- package/dist/editor/permission-manager/UserSelector.js.map +0 -1
- package/dist/editor/permission-manager/constants.d.ts.map +0 -1
- package/dist/editor/permission-manager/constants.js.map +0 -1
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts.map +0 -1
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js.map +0 -1
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts.map +0 -1
- package/dist/editor/permission-manager/hooks/usePermissionTree.js.map +0 -1
- package/dist/editor/permission-manager/index.d.ts.map +0 -1
- package/dist/editor/permission-manager/index.js.map +0 -1
- package/dist/editor/permission-manager/types.d.ts.map +0 -1
- package/dist/editor/permission-manager/types.js.map +0 -1
- package/dist/editor/permission-manager/utils.d.ts.map +0 -1
- package/dist/editor/permission-manager/utils.js.map +0 -1
- package/dist/editor/preview-bridge.d.ts.map +0 -1
- package/dist/editor/preview-bridge.js.map +0 -1
- package/dist/editor/relative-time.d.ts.map +0 -1
- package/dist/editor/relative-time.js.map +0 -1
- package/dist/editor/schema-editor/CollectionEditor.d.ts.map +0 -1
- package/dist/editor/schema-editor/CollectionEditor.js.map +0 -1
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts.map +0 -1
- package/dist/editor/schema-editor/EntryTypeEditor.js.map +0 -1
- package/dist/editor/schema-editor/index.d.ts.map +0 -1
- package/dist/editor/schema-editor/index.js.map +0 -1
- package/dist/editor/setup-test-dom.d.ts +0 -1
- package/dist/editor/setup-test-dom.d.ts.map +0 -1
- package/dist/editor/setup-test-dom.js +0 -12
- package/dist/editor/setup-test-dom.js.map +0 -1
- package/dist/editor/test-setup.d.ts +0 -6
- package/dist/editor/test-setup.d.ts.map +0 -1
- package/dist/editor/test-setup.js +0 -42
- package/dist/editor/test-setup.js.map +0 -1
- package/dist/editor/theme.d.ts.map +0 -1
- package/dist/editor/theme.js.map +0 -1
- package/dist/editor/utils/env.d.ts.map +0 -1
- package/dist/editor/utils/env.js.map +0 -1
- package/dist/entry-link-resolver.d.ts.map +0 -1
- package/dist/entry-link-resolver.js.map +0 -1
- package/dist/entry-schema-registry.d.ts.map +0 -1
- package/dist/entry-schema-registry.js.map +0 -1
- package/dist/entry-schema.d.ts.map +0 -1
- package/dist/entry-schema.js.map +0 -1
- package/dist/git-manager.d.ts.map +0 -1
- package/dist/git-manager.js.map +0 -1
- package/dist/github-service.d.ts.map +0 -1
- package/dist/github-service.js.map +0 -1
- package/dist/http/handler.d.ts.map +0 -1
- package/dist/http/handler.js.map +0 -1
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js.map +0 -1
- package/dist/http/router.d.ts.map +0 -1
- package/dist/http/router.js.map +0 -1
- package/dist/http/types.d.ts.map +0 -1
- package/dist/http/types.js.map +0 -1
- package/dist/id.d.ts.map +0 -1
- package/dist/id.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/operating-mode/client-safe-strategy.d.ts.map +0 -1
- package/dist/operating-mode/client-safe-strategy.js.map +0 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts.map +0 -1
- package/dist/operating-mode/client-unsafe-strategy.js.map +0 -1
- package/dist/operating-mode/client.d.ts.map +0 -1
- package/dist/operating-mode/client.js.map +0 -1
- package/dist/operating-mode/deployment-name-fixtures.d.ts.map +0 -1
- package/dist/operating-mode/deployment-name-fixtures.js.map +0 -1
- package/dist/operating-mode/deployment-name.d.ts.map +0 -1
- package/dist/operating-mode/deployment-name.js.map +0 -1
- package/dist/operating-mode/index.d.ts.map +0 -1
- package/dist/operating-mode/index.js.map +0 -1
- package/dist/operating-mode/mode-env.d.ts.map +0 -1
- package/dist/operating-mode/mode-env.js.map +0 -1
- package/dist/operating-mode/types.d.ts.map +0 -1
- package/dist/operating-mode/types.js.map +0 -1
- package/dist/paths/branch-name.d.ts.map +0 -1
- package/dist/paths/branch-name.js.map +0 -1
- package/dist/paths/branch.d.ts.map +0 -1
- package/dist/paths/branch.js.map +0 -1
- package/dist/paths/index.d.ts.map +0 -1
- package/dist/paths/index.js.map +0 -1
- package/dist/paths/normalize-server.d.ts.map +0 -1
- package/dist/paths/normalize-server.js.map +0 -1
- package/dist/paths/normalize.d.ts.map +0 -1
- package/dist/paths/normalize.js.map +0 -1
- package/dist/paths/resolve.d.ts.map +0 -1
- package/dist/paths/resolve.js.map +0 -1
- package/dist/paths/test-utils.d.ts +0 -22
- package/dist/paths/test-utils.d.ts.map +0 -1
- package/dist/paths/test-utils.js +0 -21
- package/dist/paths/test-utils.js.map +0 -1
- package/dist/paths/types.d.ts.map +0 -1
- package/dist/paths/types.js.map +0 -1
- package/dist/paths/validation.d.ts.map +0 -1
- package/dist/paths/validation.js.map +0 -1
- package/dist/reference-resolver.d.ts.map +0 -1
- package/dist/reference-resolver.js.map +0 -1
- package/dist/resolve-canopy-user.d.ts.map +0 -1
- package/dist/resolve-canopy-user.js.map +0 -1
- package/dist/resource-generation.d.ts.map +0 -1
- package/dist/resource-generation.js.map +0 -1
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/index.js.map +0 -1
- package/dist/schema/meta-loader.d.ts.map +0 -1
- package/dist/schema/meta-loader.js.map +0 -1
- package/dist/schema/resolver.d.ts.map +0 -1
- package/dist/schema/resolver.js.map +0 -1
- package/dist/schema/schema-store-types.d.ts.map +0 -1
- package/dist/schema/schema-store-types.js.map +0 -1
- package/dist/schema/schema-store.d.ts.map +0 -1
- package/dist/schema/schema-store.js.map +0 -1
- package/dist/schema/types.d.ts.map +0 -1
- package/dist/schema/types.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/services.d.ts.map +0 -1
- package/dist/services.js.map +0 -1
- package/dist/settings-workspace.d.ts.map +0 -1
- package/dist/settings-workspace.js.map +0 -1
- package/dist/static/index.d.ts.map +0 -1
- package/dist/static/index.js.map +0 -1
- package/dist/static/seo.d.ts.map +0 -1
- package/dist/static/seo.js.map +0 -1
- package/dist/sync-core.d.ts.map +0 -1
- package/dist/sync-core.js.map +0 -1
- package/dist/task-queue/index.d.ts.map +0 -1
- package/dist/task-queue/index.js.map +0 -1
- package/dist/task-queue/task-queue.d.ts.map +0 -1
- package/dist/task-queue/task-queue.js.map +0 -1
- package/dist/task-queue/types.d.ts.map +0 -1
- package/dist/task-queue/types.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/url-path-resolver.d.ts.map +0 -1
- package/dist/url-path-resolver.js.map +0 -1
- package/dist/user.d.ts.map +0 -1
- package/dist/user.js.map +0 -1
- package/dist/utils/async-mutex.d.ts.map +0 -1
- package/dist/utils/async-mutex.js.map +0 -1
- package/dist/utils/atomic-write.d.ts.map +0 -1
- package/dist/utils/atomic-write.js.map +0 -1
- package/dist/utils/body-field.d.ts.map +0 -1
- package/dist/utils/body-field.js.map +0 -1
- package/dist/utils/content-write-lock.d.ts.map +0 -1
- package/dist/utils/content-write-lock.js.map +0 -1
- package/dist/utils/debug.d.ts.map +0 -1
- package/dist/utils/debug.js.map +0 -1
- package/dist/utils/entry-url.d.ts.map +0 -1
- package/dist/utils/entry-url.js.map +0 -1
- package/dist/utils/error.d.ts.map +0 -1
- package/dist/utils/error.js.map +0 -1
- package/dist/utils/flatten-group-fields.d.ts.map +0 -1
- package/dist/utils/flatten-group-fields.js.map +0 -1
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/fs.d.ts.map +0 -1
- package/dist/utils/fs.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/occ-json-write.d.ts.map +0 -1
- package/dist/utils/occ-json-write.js.map +0 -1
- package/dist/utils/provisioning-lock.d.ts.map +0 -1
- package/dist/utils/provisioning-lock.js.map +0 -1
- package/dist/utils/sanitize-href.d.ts.map +0 -1
- package/dist/utils/sanitize-href.js.map +0 -1
- package/dist/utils/title-field.d.ts.map +0 -1
- package/dist/utils/title-field.js.map +0 -1
- package/dist/validation/deletion-checker.d.ts.map +0 -1
- package/dist/validation/deletion-checker.js.map +0 -1
- package/dist/validation/entry-link-validator.d.ts.map +0 -1
- package/dist/validation/entry-link-validator.js.map +0 -1
- package/dist/validation/entry-type-reference-validator.d.ts.map +0 -1
- package/dist/validation/entry-type-reference-validator.js.map +0 -1
- package/dist/validation/entry-validator.d.ts.map +0 -1
- package/dist/validation/entry-validator.js.map +0 -1
- package/dist/validation/field-traversal.d.ts.map +0 -1
- package/dist/validation/field-traversal.js.map +0 -1
- package/dist/validation/reference-validator.d.ts.map +0 -1
- package/dist/validation/reference-validator.js.map +0 -1
- package/dist/worker/cms-worker.d.ts.map +0 -1
- package/dist/worker/cms-worker.js.map +0 -1
- package/dist/worker/log.d.ts.map +0 -1
- package/dist/worker/log.js.map +0 -1
- package/dist/worker/task-queue-config.d.ts.map +0 -1
- package/dist/worker/task-queue-config.js.map +0 -1
- package/dist/worker/task-queue.d.ts.map +0 -1
- package/dist/worker/task-queue.js.map +0 -1
- package/dist/worker/worker-status.d.ts.map +0 -1
- package/dist/worker/worker-status.js.map +0 -1
|
@@ -26,22 +26,18 @@
|
|
|
26
26
|
* an acceptable price, and a read racing a rebase gets a consistent-enough
|
|
27
27
|
* older or newer file, never a destroyed one.
|
|
28
28
|
*
|
|
29
|
-
* ## Why the lock
|
|
29
|
+
* ## Why the lock marker lives under `{branchRoot}/.canopy-meta`
|
|
30
30
|
*
|
|
31
31
|
* proper-lockfile keys its module-level `locks{}` bookkeeping (refresh timer,
|
|
32
32
|
* release function) by the **target path** passed to `lock()`, NOT by
|
|
33
|
-
* `lockfilePath`.
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* every other branch's content lock -- the provisioning locks already share
|
|
42
|
-
* one key across branches);
|
|
43
|
-
* - a distinct on-disk lock directory, so the server-enforced mkdir cannot
|
|
44
|
-
* collide either; and
|
|
33
|
+
* `lockfilePath`. `provisioning-lock.ts` now anchors every lock on its own
|
|
34
|
+
* marker path, so the registry key equals the on-disk lock identity and two
|
|
35
|
+
* live locks can no longer share a key -- aliasing is structurally impossible
|
|
36
|
+
* rather than merely avoided by convention. Keeping the content lock under
|
|
37
|
+
* `{branchRoot}/.canopy-meta` still buys:
|
|
38
|
+
*
|
|
39
|
+
* - a per-branch marker, so one branch's content lock is independent of every
|
|
40
|
+
* other branch's and of that branch's provisioning lock; and
|
|
45
41
|
* - no deadlock potential: the two locks are never both required, and the only
|
|
46
42
|
* possible acquisition order (provision, then write) is consistent.
|
|
47
43
|
*
|
|
@@ -60,7 +56,8 @@
|
|
|
60
56
|
* mutual exclusion. See docs/concurrency.md.
|
|
61
57
|
*/
|
|
62
58
|
import path from 'node:path';
|
|
63
|
-
import { isNodeError } from './error.js';
|
|
59
|
+
import { getErrorMessage, isNodeError } from './error.js';
|
|
60
|
+
import { canopyLogWarn } from './logger.js';
|
|
64
61
|
import { tryAcquireProvisioningLock } from './provisioning-lock.js';
|
|
65
62
|
/** Directory the lock marker lives in, relative to the branch root. */
|
|
66
63
|
const META_DIR = '.canopy-meta';
|
|
@@ -108,7 +105,8 @@ export class ContentWriteLockBusyError extends Error {
|
|
|
108
105
|
this.name = 'ContentWriteLockBusyError';
|
|
109
106
|
}
|
|
110
107
|
}
|
|
111
|
-
/**
|
|
108
|
+
/** Directory the lock marker is created in. proper-lockfile anchors on the
|
|
109
|
+
* marker path itself (see provisioning-lock.ts), not on this directory. */
|
|
112
110
|
function lockTargetDir(branchRoot) {
|
|
113
111
|
return path.join(path.resolve(branchRoot), META_DIR);
|
|
114
112
|
}
|
|
@@ -122,8 +120,8 @@ const sleep = (ms) => new Promise((resolve) => {
|
|
|
122
120
|
* the worker's rebase loop (which skips the branch and retries next cycle) and
|
|
123
121
|
* by tests standing in for a writer.
|
|
124
122
|
*/
|
|
125
|
-
export function tryAcquireContentWriteLock(branchRoot) {
|
|
126
|
-
return tryAcquireProvisioningLock(lockTargetDir(branchRoot), CONTENT_WRITE_LOCK_NAME);
|
|
123
|
+
export function tryAcquireContentWriteLock(branchRoot, onCompromised) {
|
|
124
|
+
return tryAcquireProvisioningLock(lockTargetDir(branchRoot), CONTENT_WRITE_LOCK_NAME, onCompromised);
|
|
127
125
|
}
|
|
128
126
|
/**
|
|
129
127
|
* Acquire the branch's content-write lock with a short bounded wait.
|
|
@@ -135,11 +133,11 @@ export function tryAcquireContentWriteLock(branchRoot) {
|
|
|
135
133
|
*
|
|
136
134
|
* @throws ContentWriteLockBusyError when the budget expires under contention.
|
|
137
135
|
*/
|
|
138
|
-
export async function acquireContentWriteLock(branchRoot, waitMs = DEFAULT_CONTENT_WRITE_LOCK_WAIT_MS) {
|
|
136
|
+
export async function acquireContentWriteLock(branchRoot, waitMs = DEFAULT_CONTENT_WRITE_LOCK_WAIT_MS, onCompromised) {
|
|
139
137
|
const startedAt = Date.now();
|
|
140
138
|
for (let attempt = 0;; attempt++) {
|
|
141
139
|
try {
|
|
142
|
-
return await tryAcquireContentWriteLock(branchRoot);
|
|
140
|
+
return await tryAcquireContentWriteLock(branchRoot, onCompromised);
|
|
143
141
|
}
|
|
144
142
|
catch (err) {
|
|
145
143
|
if (!isNodeError(err) || err.code !== 'ELOCKED')
|
|
@@ -159,12 +157,30 @@ export async function acquireContentWriteLock(branchRoot, waitMs = DEFAULT_CONTE
|
|
|
159
157
|
* `finally` so a throw can never strand it.
|
|
160
158
|
*/
|
|
161
159
|
export async function withContentWriteLock(branchRoot, fn, waitMs = DEFAULT_CONTENT_WRITE_LOCK_WAIT_MS) {
|
|
162
|
-
|
|
160
|
+
// A compromise means this write may no longer have been exclusive -- the
|
|
161
|
+
// worker's rebase (or another writer) could have been running against the
|
|
162
|
+
// same tree. Reporting success would silently accept a possibly-raced write,
|
|
163
|
+
// so surface the same retriable "branch busy" error contention already maps
|
|
164
|
+
// to (409) and let the caller re-save against the settled tree.
|
|
165
|
+
let compromised = false;
|
|
166
|
+
const release = await acquireContentWriteLock(branchRoot, waitMs, (err) => {
|
|
167
|
+
compromised = true;
|
|
168
|
+
canopyLogWarn(`[canopy] Content-write lock compromised mid-hold for ${branchRoot}:`, getErrorMessage(err));
|
|
169
|
+
});
|
|
170
|
+
let result;
|
|
163
171
|
try {
|
|
164
|
-
|
|
172
|
+
result = await fn();
|
|
165
173
|
}
|
|
166
174
|
finally {
|
|
167
175
|
await release();
|
|
168
176
|
}
|
|
177
|
+
if (compromised) {
|
|
178
|
+
// Deliberately NOT the default "was not saved" message: `fn()` completed,
|
|
179
|
+
// so the write is on disk. What we lost is the proof it was exclusive, so
|
|
180
|
+
// the honest instruction is "reload, then decide" rather than "retry",
|
|
181
|
+
// which would resend a now-stale expectedVersion and bounce off the
|
|
182
|
+
// caller's own landed write as a phantom editor collision.
|
|
183
|
+
throw new ContentWriteLockBusyError('This branch was being synced while your change was written, so the change may or may not have been recorded. Reload the entry to see the current state before saving again.');
|
|
184
|
+
}
|
|
185
|
+
return result;
|
|
169
186
|
}
|
|
170
|
-
//# sourceMappingURL=content-write-lock.js.map
|
package/dist/utils/debug.d.ts
CHANGED
package/dist/utils/debug.js
CHANGED
|
@@ -4,6 +4,23 @@
|
|
|
4
4
|
* This module has NO server-only dependencies (no node:fs, etc.)
|
|
5
5
|
* so it can be safely imported into browser bundles.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* Is this slug the collection-index slug?
|
|
9
|
+
*
|
|
10
|
+
* The shared home for that decision. Six sites route through here: `computeEntryUrl` below,
|
|
11
|
+
* `content-tree.ts`'s `defaultBuildPath`, `content-reader.ts`'s `buildEntryPath` and the
|
|
12
|
+
* editor's `buildPreviewSrc` (the four forward-rule implementations), the reverse
|
|
13
|
+
* `resolveUrlPathCandidates`, and `canopycms-next`'s `collectStaticParams`, which skips index
|
|
14
|
+
* entries for a single-segment route. Re-exported from `canopycms/server` for adopters. (`content-tree.ts`'s `indexEntry` lookup still does its own
|
|
15
|
+
* `slug === 'index'`; it is fed slugs already lowercased by the listing, so it is safe rather
|
|
16
|
+
* than shared.) Slug matching is case-insensitive throughout
|
|
17
|
+
* CanopyCMS (`parseSlug` lowercases, and `ContentStore` resolves slugs by a lowercased
|
|
18
|
+
* directory scan), so this compares lowercased — a bare `slug === 'index'` is correct only
|
|
19
|
+
* for callers whose input was already normalized, and silently wrong for the ones handling
|
|
20
|
+
* raw URL segments or on-disk names. `resolveUrlPathCandidates` was exactly that case: its
|
|
21
|
+
* strict compare left `/x/Index` resolving the index entry after `/x/index` stopped.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isIndexSlug(slug: string | undefined): boolean;
|
|
7
24
|
/**
|
|
8
25
|
* Compute a URL path from an entry's collection path and slug.
|
|
9
26
|
*
|
|
@@ -18,4 +35,3 @@
|
|
|
18
35
|
* ("content", "index", "content") => "/"
|
|
19
36
|
*/
|
|
20
37
|
export declare function computeEntryUrl(collection: string, slug: string, contentRoot: string): string;
|
|
21
|
-
//# sourceMappingURL=entry-url.d.ts.map
|
package/dist/utils/entry-url.js
CHANGED
|
@@ -5,6 +5,25 @@
|
|
|
5
5
|
* so it can be safely imported into browser bundles.
|
|
6
6
|
*/
|
|
7
7
|
import { trimSlashes } from '../paths/normalize.js';
|
|
8
|
+
/**
|
|
9
|
+
* Is this slug the collection-index slug?
|
|
10
|
+
*
|
|
11
|
+
* The shared home for that decision. Six sites route through here: `computeEntryUrl` below,
|
|
12
|
+
* `content-tree.ts`'s `defaultBuildPath`, `content-reader.ts`'s `buildEntryPath` and the
|
|
13
|
+
* editor's `buildPreviewSrc` (the four forward-rule implementations), the reverse
|
|
14
|
+
* `resolveUrlPathCandidates`, and `canopycms-next`'s `collectStaticParams`, which skips index
|
|
15
|
+
* entries for a single-segment route. Re-exported from `canopycms/server` for adopters. (`content-tree.ts`'s `indexEntry` lookup still does its own
|
|
16
|
+
* `slug === 'index'`; it is fed slugs already lowercased by the listing, so it is safe rather
|
|
17
|
+
* than shared.) Slug matching is case-insensitive throughout
|
|
18
|
+
* CanopyCMS (`parseSlug` lowercases, and `ContentStore` resolves slugs by a lowercased
|
|
19
|
+
* directory scan), so this compares lowercased — a bare `slug === 'index'` is correct only
|
|
20
|
+
* for callers whose input was already normalized, and silently wrong for the ones handling
|
|
21
|
+
* raw URL segments or on-disk names. `resolveUrlPathCandidates` was exactly that case: its
|
|
22
|
+
* strict compare left `/x/Index` resolving the index entry after `/x/index` stopped.
|
|
23
|
+
*/
|
|
24
|
+
export function isIndexSlug(slug) {
|
|
25
|
+
return slug?.toLowerCase() === 'index';
|
|
26
|
+
}
|
|
8
27
|
/**
|
|
9
28
|
* Compute a URL path from an entry's collection path and slug.
|
|
10
29
|
*
|
|
@@ -30,12 +49,11 @@ export function computeEntryUrl(collection, slug, contentRoot) {
|
|
|
30
49
|
}
|
|
31
50
|
// Build URL segments
|
|
32
51
|
const segments = stripped.split('/').filter(Boolean);
|
|
33
|
-
// Append slug unless it's
|
|
34
|
-
if (slug && slug
|
|
52
|
+
// Append slug unless it's an index slug (index entries collapse to parent)
|
|
53
|
+
if (slug && !isIndexSlug(slug)) {
|
|
35
54
|
segments.push(slug);
|
|
36
55
|
}
|
|
37
56
|
const path = segments.length > 0 ? `/${segments.join('/')}` : '/';
|
|
38
57
|
// Lowercase to match content-listing.ts and content-tree.ts URL conventions
|
|
39
58
|
return path.toLowerCase();
|
|
40
59
|
}
|
|
41
|
-
//# sourceMappingURL=entry-url.js.map
|
package/dist/utils/error.d.ts
CHANGED
package/dist/utils/error.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FieldConfig } from '../config';
|
|
1
|
+
import type { FieldConfig } from '../config/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Recursively flatten inline groups out of a field array.
|
|
4
4
|
* Group children are inlined at the parent level — groups are transparent to data.
|
|
@@ -10,4 +10,3 @@ import type { FieldConfig } from '../config';
|
|
|
10
10
|
* Not needed when using traverseFields() — that already handles groups transparently.
|
|
11
11
|
*/
|
|
12
12
|
export declare function flattenGroupFields(fields: readonly FieldConfig[]): FieldConfig[];
|
|
13
|
-
//# sourceMappingURL=flatten-group-fields.d.ts.map
|
package/dist/utils/format.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ContentFormat } from '../config';
|
|
1
|
+
import type { ContentFormat } from '../config/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Get the file extension for a content format
|
|
4
4
|
* @param format - The content format (md, mdx, json, yaml)
|
|
@@ -9,4 +9,3 @@ export declare const getFormatExtension: (format: ContentFormat) => string;
|
|
|
9
9
|
export declare const isDataOnlyFormat: (format: ContentFormat) => boolean;
|
|
10
10
|
/** Safely coerce a parsed value to a record, returning {} for non-object values */
|
|
11
11
|
export declare const asRecord: (value: unknown) => Record<string, unknown>;
|
|
12
|
-
//# sourceMappingURL=format.d.ts.map
|
package/dist/utils/format.js
CHANGED
package/dist/utils/fs.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
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 return undefined if it does not exist.
|
|
5
|
+
*
|
|
6
|
+
* Only ENOENT is swallowed — a permissions or I/O failure still throws, so a caller cannot
|
|
7
|
+
* mistake "unreadable" for "not there yet".
|
|
8
|
+
*/
|
|
9
|
+
export declare function readFileIfExists(filePath: string): Promise<string | undefined>;
|
package/dist/utils/fs.js
CHANGED
|
@@ -12,4 +12,19 @@ export async function filePathExists(filePath) {
|
|
|
12
12
|
throw err;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Read a UTF-8 file, or return undefined if it does not exist.
|
|
17
|
+
*
|
|
18
|
+
* Only ENOENT is swallowed — a permissions or I/O failure still throws, so a caller cannot
|
|
19
|
+
* mistake "unreadable" for "not there yet".
|
|
20
|
+
*/
|
|
21
|
+
export async function readFileIfExists(filePath) {
|
|
22
|
+
try {
|
|
23
|
+
return await fs.readFile(filePath, 'utf8');
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
if (isNotFoundError(err))
|
|
27
|
+
return undefined;
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
}
|
package/dist/utils/git.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OperatingMode } from '../operating-mode';
|
|
1
|
+
import type { OperatingMode } from '../operating-mode/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Whether a git remote URL points at a network location — http(s)://,
|
|
4
4
|
* ssh://, git://, scp-like `[user@]host:path`, a transport-helper `scheme::`
|
|
@@ -72,6 +72,23 @@ export declare function isStaleLeaseRejection(message: string): boolean;
|
|
|
72
72
|
* so callers MUST run git with a locale-pinning env (`gitChildEnv`).
|
|
73
73
|
*/
|
|
74
74
|
export declare function isMissingRemoteRefFailure(message: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge`
|
|
77
|
+
* (interactive/merge backend) or `rebase-apply` (am backend) state directory
|
|
78
|
+
* git leaves behind when a rebase stops for conflicts or the process dies
|
|
79
|
+
* mid-way.
|
|
80
|
+
*
|
|
81
|
+
* This state is invisible to every other check the worker makes: a clone left
|
|
82
|
+
* mid-rebase reports uncommitted changes, so the sync loop's dirty check skips
|
|
83
|
+
* it as `skippedDirty` on every cycle forever, and `branch-health` sees valid
|
|
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).
|
|
90
|
+
*/
|
|
91
|
+
export declare function isRebaseInProgress(repoPath: string): Promise<boolean>;
|
|
75
92
|
/**
|
|
76
93
|
* Detect the current HEAD branch name for a given repository root.
|
|
77
94
|
* Returns the branch name, or the provided fallback (default 'main')
|
|
@@ -98,4 +115,3 @@ export declare function resolveBaseBranch(options: {
|
|
|
98
115
|
/** Repo root used for dev-mode HEAD detection. Defaults to process.cwd(). */
|
|
99
116
|
detectFrom?: string;
|
|
100
117
|
}): Promise<string>;
|
|
101
|
-
//# sourceMappingURL=git.d.ts.map
|
package/dist/utils/git.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
1
3
|
import { simpleGit } from 'simple-git';
|
|
2
4
|
// Matches scheme://... URLs (http, https, ssh, git — case-insensitive).
|
|
3
5
|
const NETWORK_SCHEME_PATTERN = /^(https?|ssh|git):\/\//i;
|
|
@@ -137,6 +139,65 @@ const MISSING_REMOTE_REF_REASONS = ["couldn't find remote ref", "Couldn't find r
|
|
|
137
139
|
export function isMissingRemoteRefFailure(message) {
|
|
138
140
|
return MISSING_REMOTE_REF_REASONS.some((reason) => message.includes(reason));
|
|
139
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Resolve a repository's git directory from its working-tree root, handling
|
|
144
|
+
* both layouts: a real `.git` directory, and a `.git` FILE containing a
|
|
145
|
+
* `gitdir: <path>` pointer (linked worktrees, submodules).
|
|
146
|
+
*
|
|
147
|
+
* Deliberately fs-only rather than `git rev-parse --git-dir`: the callers are
|
|
148
|
+
* a per-branch sync loop and an admin-facing health scan that already walk
|
|
149
|
+
* every branch directory, and neither should pay a subprocess per branch just
|
|
150
|
+
* to find a path.
|
|
151
|
+
*/
|
|
152
|
+
async function resolveGitDir(repoPath) {
|
|
153
|
+
const dotGit = path.join(repoPath, '.git');
|
|
154
|
+
let stat;
|
|
155
|
+
try {
|
|
156
|
+
stat = await fs.stat(dotGit);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
if (stat.isDirectory())
|
|
162
|
+
return dotGit;
|
|
163
|
+
try {
|
|
164
|
+
const pointer = await fs.readFile(dotGit, 'utf-8');
|
|
165
|
+
const match = /^gitdir:\s*(.+)$/m.exec(pointer);
|
|
166
|
+
if (!match)
|
|
167
|
+
return null;
|
|
168
|
+
const target = match[1].trim();
|
|
169
|
+
return path.isAbsolute(target) ? target : path.resolve(repoPath, target);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge`
|
|
177
|
+
* (interactive/merge backend) or `rebase-apply` (am backend) state directory
|
|
178
|
+
* git leaves behind when a rebase stops for conflicts or the process dies
|
|
179
|
+
* mid-way.
|
|
180
|
+
*
|
|
181
|
+
* This state is invisible to every other check the worker makes: a clone left
|
|
182
|
+
* mid-rebase reports uncommitted changes, so the sync loop's dirty check skips
|
|
183
|
+
* it as `skippedDirty` on every cycle forever, and `branch-health` sees valid
|
|
184
|
+
* branch.json and scans it as healthy. Nothing self-heals, and recovery
|
|
185
|
+
* previously meant an operator running `git rebase --abort` on EFS by hand.
|
|
186
|
+
*
|
|
187
|
+
* Never throws — a missing or unreadable repo is reported as "no rebase",
|
|
188
|
+
* which is the safe direction for both callers (the worker only ever uses a
|
|
189
|
+
* `true` to justify an abort it holds the content-write lock for).
|
|
190
|
+
*/
|
|
191
|
+
export async function isRebaseInProgress(repoPath) {
|
|
192
|
+
const gitDir = await resolveGitDir(repoPath);
|
|
193
|
+
if (!gitDir)
|
|
194
|
+
return false;
|
|
195
|
+
const results = await Promise.all(['rebase-merge', 'rebase-apply'].map((dir) => fs
|
|
196
|
+
.stat(path.join(gitDir, dir))
|
|
197
|
+
.then(() => true)
|
|
198
|
+
.catch(() => false)));
|
|
199
|
+
return results.some(Boolean);
|
|
200
|
+
}
|
|
140
201
|
/**
|
|
141
202
|
* Detect the current HEAD branch name for a given repository root.
|
|
142
203
|
* Returns the branch name, or the provided fallback (default 'main')
|
|
@@ -174,4 +235,3 @@ export async function resolveBaseBranch(options) {
|
|
|
174
235
|
}
|
|
175
236
|
return 'main';
|
|
176
237
|
}
|
|
177
|
-
//# sourceMappingURL=git.js.map
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -68,4 +68,3 @@ export declare function canopyLog(...args: unknown[]): void;
|
|
|
68
68
|
export declare function canopyLogWarn(...args: unknown[]): void;
|
|
69
69
|
/** Failure worth alerting on. Routes to stderr. */
|
|
70
70
|
export declare function canopyLogError(...args: unknown[]): void;
|
|
71
|
-
//# sourceMappingURL=logger.d.ts.map
|
package/dist/utils/logger.js
CHANGED
|
@@ -97,4 +97,3 @@ export declare function withOccRetry<T>(operation: () => Promise<T>, options?: W
|
|
|
97
97
|
* legitimately take many seconds.
|
|
98
98
|
*/
|
|
99
99
|
export declare function withOccFileLock<T>(filePath: string, fn: () => Promise<T>): Promise<T>;
|
|
100
|
-
//# sourceMappingURL=occ-json-write.d.ts.map
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Called when proper-lockfile reports the lock was lost mid-hold (its directory
|
|
3
|
+
* vanished, or a refresh failed and another holder may have taken over).
|
|
4
|
+
*
|
|
5
|
+
* Every call site must decide what that means for ITS critical section, which
|
|
6
|
+
* is why this is a parameter rather than a fixed policy: a compromise during
|
|
7
|
+
* idempotent provisioning is survivable, but a compromise during the worker's
|
|
8
|
+
* rebase means a second writer may be live and the next destructive git step
|
|
9
|
+
* must not run. What is NOT negotiable is that it must not throw --
|
|
10
|
+
* proper-lockfile invokes it from inside the refresh timer, so a throw is an
|
|
11
|
+
* uncaught exception that kills the process.
|
|
12
|
+
*/
|
|
13
|
+
export type OnLockCompromised = (err: Error) => void;
|
|
1
14
|
/**
|
|
2
15
|
* Acquire a cross-process filesystem lock for content provisioning.
|
|
3
16
|
*
|
|
@@ -11,10 +24,11 @@
|
|
|
11
24
|
*
|
|
12
25
|
* Returns a release function — always call it in a `finally`.
|
|
13
26
|
*
|
|
14
|
-
* @param lockTargetDir directory the lock
|
|
27
|
+
* @param lockTargetDir directory the lock marker lives in (created if missing)
|
|
15
28
|
* @param lockName name of the on-disk lock marker, created inside lockTargetDir
|
|
29
|
+
* @param onCompromised see {@link OnLockCompromised}; defaults to log-and-continue
|
|
16
30
|
*/
|
|
17
|
-
export declare function acquireProvisioningLock(lockTargetDir: string, lockName: string): Promise<() => Promise<void>>;
|
|
31
|
+
export declare function acquireProvisioningLock(lockTargetDir: string, lockName: string, onCompromised?: OnLockCompromised): Promise<() => Promise<void>>;
|
|
18
32
|
/**
|
|
19
33
|
* Zero-retry variant of {@link acquireProvisioningLock}, for admin actions
|
|
20
34
|
* running inside a synchronous request/response cycle (e.g. a Lambda-backed
|
|
@@ -33,5 +47,4 @@ export declare function acquireProvisioningLock(lockTargetDir: string, lockName:
|
|
|
33
47
|
* Throws with `err.code === 'ELOCKED'` on contention (a live, non-stale
|
|
34
48
|
* holder) -- callers should translate that into a 409.
|
|
35
49
|
*/
|
|
36
|
-
export declare function tryAcquireProvisioningLock(lockTargetDir: string, lockName: string): Promise<() => Promise<void>>;
|
|
37
|
-
//# sourceMappingURL=provisioning-lock.d.ts.map
|
|
50
|
+
export declare function tryAcquireProvisioningLock(lockTargetDir: string, lockName: string, onCompromised?: OnLockCompromised): Promise<() => Promise<void>>;
|
|
@@ -1,6 +1,90 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import lockfile from 'proper-lockfile';
|
|
4
|
+
import { getErrorMessage, isNodeError } from './error.js';
|
|
5
|
+
import { canopyLogWarn } from './logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Shared option set for both provisioning-lock variants.
|
|
8
|
+
*
|
|
9
|
+
* **The lock is anchored on the lock file's own path, not its directory.**
|
|
10
|
+
* proper-lockfile keys its module-level `locks{}` bookkeeping (refresh timer,
|
|
11
|
+
* release fn) by the TARGET path passed to `lock()` — not by `lockfilePath`.
|
|
12
|
+
* Passing the shared branches directory made every branch under one root alias
|
|
13
|
+
* a single registry entry: acquiring `.b.init.lock` overwrote `.a.init.lock`'s
|
|
14
|
+
* entry, so releasing A tore down B's refresh timer, made B's own release fail
|
|
15
|
+
* with `ERELEASED`, and leaked B's lock directory on disk until `stale`
|
|
16
|
+
* expired. The orphaned refresh timer then `stat`ed a path its owner had
|
|
17
|
+
* already deleted, raising `ECOMPROMISED`. Anchoring here makes the registry
|
|
18
|
+
* key identical to the on-disk lock identity, so two live locks can never
|
|
19
|
+
* share a key. `realpath: false` because the anchor path is the lock marker
|
|
20
|
+
* itself and does not exist before we create it (realpath would ENOENT).
|
|
21
|
+
* See docs/concurrency.md ("Anchor path matters").
|
|
22
|
+
*/
|
|
23
|
+
function provisioningLockOptions(lockPath, retries, onCompromised) {
|
|
24
|
+
return {
|
|
25
|
+
lockfilePath: lockPath,
|
|
26
|
+
realpath: false,
|
|
27
|
+
retries,
|
|
28
|
+
stale: 30_000,
|
|
29
|
+
// proper-lockfile invokes this from inside its refresh timer, so ANY throw
|
|
30
|
+
// escaping here is an uncaught exception that kills the process -- the very
|
|
31
|
+
// failure the handler exists to prevent. Call sites are told not to throw
|
|
32
|
+
// (see OnLockCompromised); this makes it structural rather than a
|
|
33
|
+
// convention, and also covers the LOGGER throwing: under `CI=true`,
|
|
34
|
+
// vitest's `onConsoleLog` turns any console write into a throw.
|
|
35
|
+
onCompromised: (err) => {
|
|
36
|
+
try {
|
|
37
|
+
if (onCompromised) {
|
|
38
|
+
onCompromised(err);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Default: log and let the holder finish. proper-lockfile's own default
|
|
42
|
+
// rethrows from the refresh timer, which protects nothing -- by the time
|
|
43
|
+
// a compromise is reported the mutual exclusion is already gone.
|
|
44
|
+
// `canopyLogWarn` (not the debug logger) because this means "two
|
|
45
|
+
// holders may now be live": it must be visible without CANOPYCMS_DEBUG.
|
|
46
|
+
canopyLogWarn(`[canopy] Provisioning lock compromised mid-hold for ${lockPath}:`, getErrorMessage(err));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Last resort: a raw stderr write goes around both a replaced logger
|
|
50
|
+
// and vitest's console interception, so the compromise still leaves a
|
|
51
|
+
// trace. Guarded in turn, because nothing above this line is allowed
|
|
52
|
+
// to throw out of a refresh timer.
|
|
53
|
+
try {
|
|
54
|
+
process.stderr.write(`[canopy] lock compromised for ${lockPath}; its handler or logger threw\n`);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Nothing further is safe to attempt.
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* proper-lockfile's release rejects with `ERELEASED` once the lock has been
|
|
65
|
+
* marked compromised (`setLockAsCompromised` sets `released = true` before the
|
|
66
|
+
* caller ever gets to release). Callers hold this in a `finally`, so letting
|
|
67
|
+
* that escape would convert a COMPLETED operation into a spurious failure.
|
|
68
|
+
* There is nothing left to release in that state, so swallow just that code and
|
|
69
|
+
* let every other release error propagate to the caller that asked for it.
|
|
70
|
+
*/
|
|
71
|
+
function releaseIgnoringAlreadyReleased(release, lockPath) {
|
|
72
|
+
return async () => {
|
|
73
|
+
try {
|
|
74
|
+
await release();
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (isNodeError(err) && err.code === 'ERELEASED') {
|
|
78
|
+
// Deliberately does not name a cause: ERELEASED is raised both by a
|
|
79
|
+
// lock compromised mid-hold AND by a plain double-release bug, and
|
|
80
|
+
// from here the two are indistinguishable.
|
|
81
|
+
canopyLogWarn(`[canopy] Lock at ${lockPath} was already released (compromised mid-hold, or released twice); nothing to release`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
4
88
|
/**
|
|
5
89
|
* Acquire a cross-process filesystem lock for content provisioning.
|
|
6
90
|
*
|
|
@@ -14,22 +98,21 @@ import lockfile from 'proper-lockfile';
|
|
|
14
98
|
*
|
|
15
99
|
* Returns a release function — always call it in a `finally`.
|
|
16
100
|
*
|
|
17
|
-
* @param lockTargetDir directory the lock
|
|
101
|
+
* @param lockTargetDir directory the lock marker lives in (created if missing)
|
|
18
102
|
* @param lockName name of the on-disk lock marker, created inside lockTargetDir
|
|
103
|
+
* @param onCompromised see {@link OnLockCompromised}; defaults to log-and-continue
|
|
19
104
|
*/
|
|
20
|
-
export async function acquireProvisioningLock(lockTargetDir, lockName) {
|
|
105
|
+
export async function acquireProvisioningLock(lockTargetDir, lockName, onCompromised) {
|
|
21
106
|
await fs.mkdir(lockTargetDir, { recursive: true });
|
|
107
|
+
const lockPath = path.join(lockTargetDir, lockName);
|
|
22
108
|
// Generous, jittered retries: many waiters (one per build worker process, each
|
|
23
109
|
// prerendering several pages) may contend, and the holder can take several
|
|
24
110
|
// seconds to init + clone/push. `randomize` de-syncs the herd so a waiter isn't
|
|
25
111
|
// perpetually colliding on the same tick. `stale` stays modest because proper-
|
|
26
112
|
// lockfile auto-refreshes a live holder's lock, so it only expires when a
|
|
27
113
|
// process actually dies.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
retries: { retries: 600, factor: 1, minTimeout: 300, maxTimeout: 800, randomize: true },
|
|
31
|
-
stale: 30_000,
|
|
32
|
-
});
|
|
114
|
+
const release = await lockfile.lock(lockPath, provisioningLockOptions(lockPath, { retries: 600, factor: 1, minTimeout: 300, maxTimeout: 800, randomize: true }, onCompromised));
|
|
115
|
+
return releaseIgnoringAlreadyReleased(release, lockPath);
|
|
33
116
|
}
|
|
34
117
|
/**
|
|
35
118
|
* Zero-retry variant of {@link acquireProvisioningLock}, for admin actions
|
|
@@ -49,12 +132,9 @@ export async function acquireProvisioningLock(lockTargetDir, lockName) {
|
|
|
49
132
|
* Throws with `err.code === 'ELOCKED'` on contention (a live, non-stale
|
|
50
133
|
* holder) -- callers should translate that into a 409.
|
|
51
134
|
*/
|
|
52
|
-
export async function tryAcquireProvisioningLock(lockTargetDir, lockName) {
|
|
135
|
+
export async function tryAcquireProvisioningLock(lockTargetDir, lockName, onCompromised) {
|
|
53
136
|
await fs.mkdir(lockTargetDir, { recursive: true });
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
stale: 30_000,
|
|
58
|
-
});
|
|
137
|
+
const lockPath = path.join(lockTargetDir, lockName);
|
|
138
|
+
const release = await lockfile.lock(lockPath, provisioningLockOptions(lockPath, 0, onCompromised));
|
|
139
|
+
return releaseIgnoringAlreadyReleased(release, lockPath);
|
|
59
140
|
}
|
|
60
|
-
//# sourceMappingURL=provisioning-lock.js.map
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* equivalent to forward slash for special schemes, so `/\evil.com`, `\\evil.com` and `\/evil.com`
|
|
8
8
|
* are all protocol-relative in effect despite declaring no scheme). Exported so every "is this
|
|
9
9
|
* URL off-site" check in the package shares one answer instead of re-deriving it -- see
|
|
10
|
-
* `isImplicitlyOffOrigin` below and `
|
|
10
|
+
* `isImplicitlyOffOrigin` below and `utils/url-prefix.ts`'s `isAbsoluteUrl`.
|
|
11
11
|
*/
|
|
12
12
|
export declare function declaresScheme(url: string): boolean;
|
|
13
13
|
/**
|
|
@@ -22,7 +22,7 @@ export declare function declaresScheme(url: string): boolean;
|
|
|
22
22
|
* (`declaresScheme` already identifies those as intentionally off-site on their own).
|
|
23
23
|
*
|
|
24
24
|
* Callers that want to treat a LITERAL `//host` as an intentionally-supported off-site pointer
|
|
25
|
-
* (e.g. `
|
|
25
|
+
* (e.g. `utils/url-prefix.ts`'s `isAbsoluteUrl`, for a CDN-hosted `ogImage`) should check that
|
|
26
26
|
* separately and only fall back to this function to catch the spellings that slip past a
|
|
27
27
|
* `startsWith('//')` check.
|
|
28
28
|
*/
|
|
@@ -87,4 +87,3 @@ export declare function neutralizeImplicitOffOrigin(url: string): string;
|
|
|
87
87
|
* ```
|
|
88
88
|
*/
|
|
89
89
|
export declare function sanitizeHref(url: string, fallback?: string): string;
|
|
90
|
-
//# sourceMappingURL=sanitize-href.d.ts.map
|
|
@@ -11,7 +11,7 @@ const SENTINEL_BASE = 'https://relative.invalid';
|
|
|
11
11
|
* equivalent to forward slash for special schemes, so `/\evil.com`, `\\evil.com` and `\/evil.com`
|
|
12
12
|
* are all protocol-relative in effect despite declaring no scheme). Exported so every "is this
|
|
13
13
|
* URL off-site" check in the package shares one answer instead of re-deriving it -- see
|
|
14
|
-
* `isImplicitlyOffOrigin` below and `
|
|
14
|
+
* `isImplicitlyOffOrigin` below and `utils/url-prefix.ts`'s `isAbsoluteUrl`.
|
|
15
15
|
*/
|
|
16
16
|
export function declaresScheme(url) {
|
|
17
17
|
return /^[a-z][a-z0-9+.-]*:/i.test(url.trim());
|
|
@@ -28,7 +28,7 @@ export function declaresScheme(url) {
|
|
|
28
28
|
* (`declaresScheme` already identifies those as intentionally off-site on their own).
|
|
29
29
|
*
|
|
30
30
|
* Callers that want to treat a LITERAL `//host` as an intentionally-supported off-site pointer
|
|
31
|
-
* (e.g. `
|
|
31
|
+
* (e.g. `utils/url-prefix.ts`'s `isAbsoluteUrl`, for a CDN-hosted `ogImage`) should check that
|
|
32
32
|
* separately and only fall back to this function to catch the spellings that slip past a
|
|
33
33
|
* `startsWith('//')` check.
|
|
34
34
|
*/
|
|
@@ -146,4 +146,3 @@ export function sanitizeHref(url, fallback = '#') {
|
|
|
146
146
|
}
|
|
147
147
|
return fallback;
|
|
148
148
|
}
|
|
149
|
-
//# sourceMappingURL=sanitize-href.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FieldConfig } from '../config';
|
|
1
|
+
import type { FieldConfig } from '../config/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Find the field marked `isTitle: true` in a schema and extract its value from data.
|
|
4
4
|
* Recurses into object fields to support nested title fields (e.g., hero.title).
|
|
@@ -37,4 +37,3 @@ export declare function findInvalidTitleFields(fields: readonly FieldConfig[], p
|
|
|
37
37
|
* Returns dotted paths of such fields.
|
|
38
38
|
*/
|
|
39
39
|
export declare function findTitleFieldsInLists(fields: readonly FieldConfig[], parentPath?: string): string[];
|
|
40
|
-
//# sourceMappingURL=title-field.d.ts.map
|