canopycms 0.0.67-int.90 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -3
- package/dist/ai/generate.js +1 -27
- package/dist/ai/handler.d.ts +0 -4
- package/dist/ai/handler.js +0 -11
- package/dist/ai/index.d.ts +1 -8
- package/dist/ai/index.js +1 -8
- package/dist/ai/json-to-markdown.js +15 -58
- package/dist/ai/resolve-branch.d.ts +2 -7
- package/dist/ai/resolve-branch.js +2 -8
- package/dist/ai/strip-mdx.d.ts +5 -13
- package/dist/ai/strip-mdx.js +5 -17
- package/dist/ai/to-plain-text.d.ts +10 -28
- package/dist/ai/to-plain-text.js +10 -28
- package/dist/ai/transform-components.d.ts +2 -4
- package/dist/ai/transform-components.js +8 -19
- package/dist/ai/types.d.ts +5 -10
- package/dist/api/admin-branch-health.d.ts +4 -12
- package/dist/api/admin-branch-health.js +26 -66
- package/dist/api/admin.d.ts +4 -12
- package/dist/api/admin.js +10 -26
- package/dist/api/assets.d.ts +0 -25
- package/dist/api/assets.js +50 -91
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +0 -2
- package/dist/api/branch-review.d.ts +0 -8
- package/dist/api/branch-review.js +0 -13
- package/dist/api/branch-status.d.ts +0 -3
- package/dist/api/branch-status.js +8 -33
- package/dist/api/branch-withdraw.d.ts +0 -1
- package/dist/api/branch-withdraw.js +6 -9
- package/dist/api/branch.d.ts +7 -12
- package/dist/api/branch.js +7 -44
- package/dist/api/client.d.ts +71 -224
- package/dist/api/client.js +82 -233
- package/dist/api/comments.d.ts +2 -4
- package/dist/api/comments.js +0 -17
- package/dist/api/content.d.ts +0 -6
- package/dist/api/content.js +66 -142
- package/dist/api/entries-constants.d.ts +5 -9
- package/dist/api/entries-constants.js +5 -9
- package/dist/api/entries.d.ts +8 -13
- package/dist/api/entries.js +20 -51
- package/dist/api/github-sync.d.ts +2 -4
- package/dist/api/github-sync.js +4 -8
- package/dist/api/groups.d.ts +3 -0
- package/dist/api/groups.js +8 -21
- package/dist/api/guards.d.ts +4 -16
- package/dist/api/guards.js +3 -22
- package/dist/api/index.d.ts +4 -4
- package/dist/api/permissions.d.ts +2 -0
- package/dist/api/permissions.js +18 -40
- package/dist/api/reference-options.d.ts +0 -1
- package/dist/api/reference-options.js +3 -11
- package/dist/api/request-body-hash.d.ts +12 -23
- package/dist/api/request-body-hash.js +12 -23
- package/dist/api/resolve-references.d.ts +0 -1
- package/dist/api/resolve-references.js +13 -28
- package/dist/api/route-builder.d.ts +3 -7
- package/dist/api/route-builder.js +1 -1
- package/dist/api/routes.d.ts +12 -0
- package/dist/api/routes.js +47 -0
- package/dist/api/schema.d.ts +23 -33
- package/dist/api/schema.js +20 -74
- package/dist/api/settings-helpers.js +4 -5
- package/dist/api/types.d.ts +0 -5
- package/dist/api/user.js +0 -5
- package/dist/api/validators.d.ts +14 -52
- package/dist/api/validators.js +14 -52
- package/dist/assets/asset-prefixes.d.ts +4 -8
- package/dist/assets/asset-prefixes.js +4 -8
- package/dist/assets/asset-src.d.ts +5 -22
- package/dist/assets/asset-src.js +5 -21
- package/dist/assets/factory.d.ts +1 -2
- package/dist/assets/factory.js +1 -2
- package/dist/assets/finalize.d.ts +3 -1
- package/dist/assets/finalize.js +3 -1
- package/dist/assets/index.d.ts +3 -3
- package/dist/assets/index.js +1 -1
- package/dist/assets/keys.d.ts +5 -3
- package/dist/assets/keys.js +6 -3
- package/dist/assets/pipeline.d.ts +3 -2
- package/dist/assets/pipeline.js +22 -56
- package/dist/assets/sharp-loader.d.ts +2 -10
- package/dist/assets/sharp-loader.js +2 -10
- package/dist/assets/store-local.d.ts +1 -2
- package/dist/assets/store-local.js +1 -2
- package/dist/assets/store-s3.d.ts +3 -4
- package/dist/assets/svg-sanitizer.d.ts +6 -14
- package/dist/assets/svg-sanitizer.js +6 -14
- package/dist/assets/transform-directives.d.ts +3 -4
- package/dist/assets/transform-directives.js +1 -1
- package/dist/assets/transform.d.ts +19 -30
- package/dist/assets/transform.js +18 -31
- package/dist/auth/cache.d.ts +2 -3
- package/dist/auth/cache.js +2 -3
- package/dist/auth/caching-auth-plugin.d.ts +11 -22
- package/dist/auth/caching-auth-plugin.js +12 -14
- package/dist/auth/context-helpers.d.ts +6 -20
- package/dist/auth/context-helpers.js +5 -17
- package/dist/auth/file-based-auth-cache.d.ts +10 -21
- package/dist/auth/file-based-auth-cache.js +23 -51
- package/dist/auth/plugin.d.ts +29 -61
- package/dist/auth/plugin.js +9 -13
- package/dist/auth/types.d.ts +11 -20
- package/dist/authorization/branch.d.ts +30 -49
- package/dist/authorization/branch.js +16 -42
- package/dist/authorization/content.d.ts +11 -40
- package/dist/authorization/content.js +13 -45
- package/dist/authorization/groups/index.d.ts +0 -3
- package/dist/authorization/groups/index.js +0 -3
- package/dist/authorization/groups/loader.d.ts +14 -28
- package/dist/authorization/groups/loader.js +14 -38
- package/dist/authorization/groups/schema.d.ts +0 -6
- package/dist/authorization/groups/schema.js +4 -7
- package/dist/authorization/helpers.d.ts +9 -28
- package/dist/authorization/helpers.js +9 -28
- package/dist/authorization/index.d.ts +3 -25
- package/dist/authorization/index.js +3 -35
- package/dist/authorization/path.d.ts +6 -13
- package/dist/authorization/path.js +8 -25
- package/dist/authorization/permissions/index.d.ts +0 -3
- package/dist/authorization/permissions/index.js +0 -3
- package/dist/authorization/permissions/loader.d.ts +14 -27
- package/dist/authorization/permissions/loader.js +14 -32
- package/dist/authorization/permissions/schema.d.ts +1 -6
- package/dist/authorization/permissions/schema.js +6 -13
- package/dist/authorization/protected-branch.d.ts +36 -65
- package/dist/authorization/protected-branch.js +29 -41
- package/dist/authorization/settings-file-store.d.ts +38 -81
- package/dist/authorization/settings-file-store.js +38 -79
- package/dist/authorization/types.d.ts +4 -26
- package/dist/authorization/types.js +0 -6
- package/dist/authorization/validation.d.ts +1 -23
- package/dist/authorization/validation.js +1 -24
- package/dist/branch-health.d.ts +39 -67
- package/dist/branch-health.js +27 -43
- package/dist/branch-metadata-file.d.ts +16 -32
- package/dist/branch-metadata-file.js +13 -26
- package/dist/branch-metadata.d.ts +49 -80
- package/dist/branch-metadata.js +57 -87
- package/dist/branch-registry.d.ts +26 -64
- package/dist/branch-registry.js +44 -93
- package/dist/branch-schema-cache.d.ts +34 -124
- package/dist/branch-schema-cache.js +49 -155
- package/dist/branch-workspace.d.ts +4 -4
- package/dist/branch-workspace.js +15 -19
- package/dist/build/generate-ai-content.d.ts +1 -0
- package/dist/build/generate-ai-content.js +12 -25
- package/dist/build-canopy.d.ts +17 -27
- package/dist/build-canopy.js +16 -23
- package/dist/build-mode.d.ts +25 -27
- package/dist/build-mode.js +25 -29
- package/dist/cli/cli.d.ts +15 -26
- package/dist/cli/cli.js +601 -978
- package/dist/cli/generate-ai-content.js +351 -628
- package/dist/cli/github-app-manifest.d.ts +84 -0
- package/dist/cli/github-app-manifest.js +161 -0
- package/dist/cli/init-github-app.d.ts +110 -444
- package/dist/cli/init-github-app.js +236 -773
- package/dist/cli/init.js +39 -80
- package/dist/cli/migrate.d.ts +13 -10
- package/dist/cli/migrate.js +22 -30
- package/dist/cli/project-detect.d.ts +17 -31
- package/dist/cli/project-detect.js +31 -42
- package/dist/cli/project-root.d.ts +4 -11
- package/dist/cli/project-root.js +4 -11
- package/dist/cli/prompt.d.ts +10 -0
- package/dist/cli/prompt.js +67 -0
- package/dist/cli/sync.d.ts +0 -8
- package/dist/cli/sync.js +8 -28
- package/dist/cli/template-files/middleware.ts.template +15 -29
- package/dist/cli/templates.d.ts +2 -12
- package/dist/cli/templates.js +4 -4
- package/dist/client.d.ts +1 -1
- package/dist/comment-store.d.ts +32 -53
- package/dist/comment-store.js +32 -52
- package/dist/config/flatten.d.ts +0 -3
- package/dist/config/flatten.js +2 -12
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +1 -4
- package/dist/config/schemas/collection.d.ts +0 -8
- package/dist/config/schemas/collection.js +0 -10
- package/dist/config/schemas/config.d.ts +6 -78
- package/dist/config/schemas/config.js +38 -54
- package/dist/config/schemas/field.d.ts +2 -242
- package/dist/config/schemas/field.js +9 -20
- package/dist/config/schemas/media.js +1 -1
- package/dist/config/schemas/permissions.js +0 -2
- package/dist/config/schemas/url.d.ts +5 -6
- package/dist/config/schemas/url.js +5 -6
- package/dist/config/types.d.ts +45 -33
- package/dist/config/types.js +0 -1
- package/dist/config.d.ts +1 -8
- package/dist/config.js +1 -9
- package/dist/content-id-index.d.ts +76 -188
- package/dist/content-id-index.js +79 -230
- package/dist/content-index-generation.d.ts +27 -48
- package/dist/content-index-generation.js +35 -84
- package/dist/content-index-registry.d.ts +15 -24
- package/dist/content-index-registry.js +5 -9
- package/dist/content-listing.d.ts +64 -107
- package/dist/content-listing.js +68 -118
- package/dist/content-reader.d.ts +20 -29
- package/dist/content-reader.js +10 -18
- package/dist/content-store.d.ts +210 -336
- package/dist/content-store.js +413 -657
- package/dist/content-tree.d.ts +44 -86
- package/dist/content-tree.js +26 -54
- package/dist/context.d.ts +67 -94
- package/dist/context.js +53 -72
- package/dist/dev-content-watcher.d.ts +18 -18
- package/dist/dev-content-watcher.js +41 -44
- package/dist/editor/BranchManager.d.ts +3 -6
- package/dist/editor/BranchManager.js +24 -44
- package/dist/editor/CanopyEditor.js +5 -2
- package/dist/editor/CommentsPanel.js +0 -2
- package/dist/editor/Editor.js +19 -76
- package/dist/editor/EditorAuthGate.d.ts +27 -0
- package/dist/editor/EditorAuthGate.js +140 -0
- package/dist/editor/EntryNavigator.js +0 -20
- package/dist/editor/FormRenderer.d.ts +1 -2
- package/dist/editor/FormRenderer.js +8 -23
- package/dist/editor/admin/SystemHealthPanel.js +20 -37
- package/dist/editor/admin/useSystemHealth.d.ts +2 -3
- package/dist/editor/admin/useSystemHealth.js +10 -12
- package/dist/editor/client-reference-resolver.d.ts +2 -5
- package/dist/editor/client-reference-resolver.js +2 -19
- package/dist/editor/comments/BranchComments.js +0 -4
- package/dist/editor/comments/EntryComments.js +0 -4
- package/dist/editor/comments/FieldWrapper.js +0 -4
- package/dist/editor/comments/InlineCommentThread.js +0 -2
- package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
- package/dist/editor/comments/ThreadCarousel.js +0 -12
- package/dist/editor/components/EditorFooter.d.ts +0 -8
- package/dist/editor/components/EditorFooter.js +0 -5
- package/dist/editor/components/EditorHeader.d.ts +0 -31
- package/dist/editor/components/EditorHeader.js +21 -71
- package/dist/editor/components/EditorSidebar.d.ts +0 -19
- package/dist/editor/components/EditorSidebar.js +0 -16
- package/dist/editor/components/EntryCreateModal.d.ts +4 -4
- package/dist/editor/components/EntryCreateModal.js +7 -22
- package/dist/editor/components/RenameEntryModal.js +0 -4
- package/dist/editor/components/UserBadge.js +0 -10
- package/dist/editor/components/index.js +0 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -7
- package/dist/editor/context/ApiClientContext.js +39 -11
- package/dist/editor/context/AssetContext.d.ts +7 -17
- package/dist/editor/context/AssetContext.js +7 -17
- package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
- package/dist/editor/context/EditorIdentityContext.js +7 -0
- package/dist/editor/context/EditorStateContext.d.ts +10 -41
- package/dist/editor/context/EditorStateContext.js +7 -23
- package/dist/editor/context/SWRProvider.d.ts +3 -6
- package/dist/editor/context/index.d.ts +1 -20
- package/dist/editor/context/index.js +1 -20
- package/dist/editor/editor-utils.d.ts +8 -47
- package/dist/editor/editor-utils.js +19 -72
- package/dist/editor/fields/BlockField.d.ts +2 -2
- package/dist/editor/fields/BlockField.js +1 -2
- package/dist/editor/fields/CodeField.d.ts +0 -1
- package/dist/editor/fields/CodeField.js +0 -1
- package/dist/editor/fields/DateTimeField.d.ts +15 -22
- package/dist/editor/fields/DateTimeField.js +17 -26
- package/dist/editor/fields/ImageField.d.ts +2 -2
- package/dist/editor/fields/ImageField.js +8 -14
- package/dist/editor/fields/InlineGroupField.d.ts +0 -1
- package/dist/editor/fields/InlineGroupField.js +0 -1
- package/dist/editor/fields/MarkdownField.d.ts +0 -1
- package/dist/editor/fields/MarkdownField.js +6 -11
- package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
- package/dist/editor/fields/MdxImageDialog.js +0 -1
- package/dist/editor/fields/NumberField.d.ts +9 -19
- package/dist/editor/fields/NumberField.js +11 -22
- package/dist/editor/fields/NumberListField.d.ts +7 -10
- package/dist/editor/fields/NumberListField.js +7 -10
- package/dist/editor/fields/ObjectField.d.ts +5 -8
- package/dist/editor/fields/ObjectField.js +0 -1
- package/dist/editor/fields/ReferenceField.d.ts +1 -1
- package/dist/editor/fields/ReferenceField.js +11 -16
- package/dist/editor/fields/SelectField.d.ts +2 -2
- package/dist/editor/fields/SelectField.js +0 -1
- package/dist/editor/fields/StringListField.d.ts +0 -4
- package/dist/editor/fields/StringListField.js +4 -9
- package/dist/editor/fields/TextField.d.ts +0 -1
- package/dist/editor/fields/TextField.js +0 -1
- package/dist/editor/fields/ToggleField.d.ts +0 -1
- package/dist/editor/fields/ToggleField.js +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts +0 -3
- package/dist/editor/group-manager/GroupForm.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
- package/dist/editor/group-manager/MemberList.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
- package/dist/editor/group-manager/index.d.ts +0 -6
- package/dist/editor/group-manager/index.js +0 -10
- package/dist/editor/group-manager/types.d.ts +2 -5
- package/dist/editor/group-manager/types.js +0 -3
- package/dist/editor/hooks/index.d.ts +6 -11
- package/dist/editor/hooks/index.js +6 -12
- package/dist/editor/hooks/useBranchActions.d.ts +0 -14
- package/dist/editor/hooks/useBranchActions.js +0 -22
- package/dist/editor/hooks/useBranchManager.d.ts +2 -48
- package/dist/editor/hooks/useBranchManager.js +4 -64
- package/dist/editor/hooks/useBranchesData.d.ts +7 -6
- package/dist/editor/hooks/useBranchesData.js +7 -6
- package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
- package/dist/editor/hooks/useCommentSystem.js +1 -36
- package/dist/editor/hooks/useDraftManager.d.ts +2 -35
- package/dist/editor/hooks/useDraftManager.js +23 -64
- package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
- package/dist/editor/hooks/useEditorLayout.js +0 -23
- package/dist/editor/hooks/useEntriesData.d.ts +1 -0
- package/dist/editor/hooks/useEntriesData.js +2 -3
- package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
- package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
- package/dist/editor/hooks/useEntryManager.d.ts +2 -27
- package/dist/editor/hooks/useEntryManager.js +29 -78
- package/dist/editor/hooks/useGroupManager.d.ts +0 -21
- package/dist/editor/hooks/useGroupManager.js +0 -21
- package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
- package/dist/editor/hooks/usePermissionManager.js +0 -20
- package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
- package/dist/editor/hooks/useReferenceResolution.js +1 -48
- package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
- package/dist/editor/hooks/useSchemaManager.js +0 -19
- package/dist/editor/hooks/useUserContext.d.ts +2 -9
- package/dist/editor/hooks/useUserContext.js +10 -10
- package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
- package/dist/editor/hooks/useUserMetadata.js +0 -3
- package/dist/editor/media/AssetCard.d.ts +0 -1
- package/dist/editor/media/AssetCard.js +1 -2
- package/dist/editor/media/CropStep.d.ts +0 -1
- package/dist/editor/media/CropStep.js +0 -1
- package/dist/editor/media/MediaLibrary.d.ts +1 -2
- package/dist/editor/media/MediaLibrary.js +1 -2
- package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
- package/dist/editor/media/MediaLibraryBody.js +0 -1
- package/dist/editor/media/crop-math.d.ts +1 -1
- package/dist/editor/media/crop-math.js +1 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
- package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
- package/dist/editor/permission-manager/PermissionEditor.js +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
- package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
- package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
- package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
- package/dist/editor/permission-manager/constants.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
- package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
- package/dist/editor/permission-manager/index.d.ts +0 -7
- package/dist/editor/permission-manager/index.js +0 -16
- package/dist/editor/permission-manager/types.d.ts +2 -12
- package/dist/editor/permission-manager/types.js +0 -3
- package/dist/editor/permission-manager/utils.d.ts +0 -28
- package/dist/editor/permission-manager/utils.js +9 -23
- package/dist/editor/preview-bridge.d.ts +5 -1
- package/dist/editor/preview-bridge.js +4 -4
- package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
- package/dist/editor/schema-editor/CollectionEditor.js +9 -31
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
- package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
- package/dist/editor/schema-editor/index.d.ts +0 -7
- package/dist/editor/schema-editor/index.js +0 -7
- package/dist/editor/utils/env.d.ts +3 -18
- package/dist/editor/utils/env.js +6 -25
- package/dist/entry-link-resolver.d.ts +13 -35
- package/dist/entry-link-resolver.js +20 -53
- package/dist/entry-schema-registry.d.ts +20 -60
- package/dist/entry-schema-registry.js +20 -69
- package/dist/entry-schema.d.ts +118 -223
- package/dist/entry-schema.js +46 -91
- package/dist/git-manager.d.ts +101 -200
- package/dist/git-manager.js +211 -384
- package/dist/github-service.d.ts +34 -75
- package/dist/github-service.js +37 -91
- package/dist/http/handler.d.ts +6 -37
- package/dist/http/handler.js +65 -120
- package/dist/http/router.d.ts +15 -32
- package/dist/http/router.js +34 -99
- package/dist/http/types.d.ts +15 -40
- package/dist/http/types.js +3 -7
- package/dist/id.d.ts +4 -10
- package/dist/id.js +4 -10
- package/dist/index.js +6 -9
- package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
- package/dist/operating-mode/client-safe-strategy.js +8 -28
- package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
- package/dist/operating-mode/client-unsafe-strategy.js +9 -34
- package/dist/operating-mode/client.d.ts +3 -10
- package/dist/operating-mode/client.js +3 -8
- package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
- package/dist/operating-mode/deployment-name-fixtures.js +14 -18
- package/dist/operating-mode/deployment-name.d.ts +19 -29
- package/dist/operating-mode/deployment-name.js +29 -47
- package/dist/operating-mode/index.d.ts +4 -25
- package/dist/operating-mode/index.js +9 -31
- package/dist/operating-mode/mode-env.d.ts +32 -54
- package/dist/operating-mode/mode-env.js +36 -58
- package/dist/operating-mode/types.d.ts +24 -72
- package/dist/operating-mode/types.js +1 -7
- package/dist/paths/branch-name.d.ts +30 -40
- package/dist/paths/branch-name.js +30 -40
- package/dist/paths/branch.d.ts +4 -18
- package/dist/paths/branch.js +6 -22
- package/dist/paths/index.d.ts +2 -13
- package/dist/paths/index.js +3 -23
- package/dist/paths/normalize-server.d.ts +3 -15
- package/dist/paths/normalize-server.js +3 -15
- package/dist/paths/normalize.d.ts +13 -33
- package/dist/paths/normalize.js +13 -33
- package/dist/paths/resolve.d.ts +4 -17
- package/dist/paths/resolve.js +4 -22
- package/dist/paths/types.d.ts +12 -34
- package/dist/paths/types.js +5 -7
- package/dist/paths/validation.d.ts +22 -119
- package/dist/paths/validation.js +30 -148
- package/dist/reference-resolver.d.ts +0 -13
- package/dist/reference-resolver.js +0 -18
- package/dist/resolve-canopy-user.d.ts +16 -18
- package/dist/resolve-canopy-user.js +17 -26
- package/dist/resource-generation.d.ts +16 -25
- package/dist/resource-generation.js +34 -97
- package/dist/schema/meta-loader.d.ts +2 -14
- package/dist/schema/meta-loader.js +15 -64
- package/dist/schema/resolver.d.ts +1 -4
- package/dist/schema/resolver.js +1 -6
- package/dist/schema/schema-store-types.d.ts +0 -12
- package/dist/schema/schema-store.d.ts +61 -138
- package/dist/schema/schema-store.js +85 -282
- package/dist/schema/types.d.ts +0 -4
- package/dist/server.d.ts +62 -93
- package/dist/server.js +63 -94
- package/dist/services.d.ts +23 -47
- package/dist/services.js +55 -98
- package/dist/settings-workspace.d.ts +17 -30
- package/dist/settings-workspace.js +51 -81
- package/dist/static/index.d.ts +26 -52
- package/dist/static/index.js +33 -67
- package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
- package/dist/task-queue/cms-task-queue.js +13 -0
- package/dist/task-queue/task-queue-config.d.ts +3 -0
- package/dist/{worker → task-queue}/task-queue-config.js +1 -6
- package/dist/task-queue/task-queue.d.ts +16 -22
- package/dist/task-queue/task-queue.js +20 -44
- package/dist/task-queue/types.d.ts +0 -1
- package/dist/task-queue/worker-status.d.ts +35 -0
- package/dist/task-queue/worker-status.js +40 -0
- package/dist/types.d.ts +40 -51
- package/dist/url-collision.d.ts +26 -40
- package/dist/url-collision.js +47 -63
- package/dist/url-exclusivity-fixtures.d.ts +15 -20
- package/dist/url-exclusivity-fixtures.js +14 -19
- package/dist/url-path-resolver.d.ts +8 -16
- package/dist/url-path-resolver.js +19 -29
- package/dist/user.d.ts +8 -21
- package/dist/user.js +10 -19
- package/dist/utils/async-mutex.js +4 -6
- package/dist/utils/atomic-write.d.ts +2 -11
- package/dist/utils/atomic-write.js +2 -11
- package/dist/utils/body-field.d.ts +8 -15
- package/dist/utils/body-field.js +8 -15
- package/dist/utils/content-serialize.d.ts +18 -24
- package/dist/utils/content-serialize.js +109 -160
- package/dist/utils/content-write-lock.d.ts +51 -106
- package/dist/utils/content-write-lock.js +66 -111
- package/dist/utils/debug.d.ts +7 -23
- package/dist/utils/debug.js +7 -23
- package/dist/utils/entry-url.d.ts +11 -23
- package/dist/utils/entry-url.js +11 -26
- package/dist/utils/error.d.ts +25 -90
- package/dist/utils/error.js +60 -147
- package/dist/utils/flatten-group-fields.d.ts +5 -7
- package/dist/utils/flatten-group-fields.js +5 -7
- package/dist/utils/format.d.ts +1 -5
- package/dist/utils/format.js +1 -5
- package/dist/utils/fs.d.ts +3 -4
- package/dist/utils/fs.js +3 -4
- package/dist/utils/git.d.ts +52 -83
- package/dist/utils/git.js +79 -125
- package/dist/utils/logger.d.ts +35 -50
- package/dist/utils/logger.js +35 -52
- package/dist/utils/provisioning-lock.d.ts +23 -35
- package/dist/utils/provisioning-lock.js +49 -69
- package/dist/utils/sanitize-href.d.ts +5 -10
- package/dist/utils/sanitize-href.js +8 -18
- package/dist/utils/title-field.d.ts +17 -20
- package/dist/utils/title-field.js +18 -27
- package/dist/utils/typed-filename.d.ts +20 -48
- package/dist/utils/typed-filename.js +25 -61
- package/dist/utils/url-prefix.d.ts +3 -3
- package/dist/utils/url-prefix.js +3 -3
- package/dist/validation/block-structural-keys.d.ts +16 -31
- package/dist/validation/block-structural-keys.js +19 -29
- package/dist/validation/deletion-checker.d.ts +0 -34
- package/dist/validation/deletion-checker.js +1 -43
- package/dist/validation/entry-link-validator.d.ts +6 -13
- package/dist/validation/entry-link-validator.js +4 -13
- package/dist/validation/entry-type-reference-validator.d.ts +13 -18
- package/dist/validation/entry-type-reference-validator.js +13 -18
- package/dist/validation/entry-validator.d.ts +13 -25
- package/dist/validation/entry-validator.js +15 -32
- package/dist/validation/field-traversal.d.ts +3 -30
- package/dist/validation/field-traversal.js +1 -32
- package/dist/validation/reference-validator.d.ts +5 -24
- package/dist/validation/reference-validator.js +5 -30
- package/dist/worker/cms-worker.d.ts +172 -232
- package/dist/worker/cms-worker.js +241 -333
- package/dist/worker/git-sync.d.ts +32 -133
- package/dist/worker/git-sync.js +129 -191
- package/dist/worker/github-auth.d.ts +13 -19
- package/dist/worker/github-auth.js +13 -19
- package/dist/worker/history-rewrite.d.ts +53 -66
- package/dist/worker/history-rewrite.js +54 -60
- package/dist/worker/log.d.ts +24 -41
- package/dist/worker/log.js +25 -42
- package/dist/worker/rebase.d.ts +20 -110
- package/dist/worker/rebase.js +279 -354
- package/dist/worker/task-runner.d.ts +32 -66
- package/dist/worker/task-runner.js +126 -162
- package/dist/worker/worker-context.d.ts +41 -81
- package/package.json +4 -4
- package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
- package/dist/worker/task-queue-config.d.ts +0 -8
- package/dist/worker/task-queue.js +0 -19
- package/dist/worker/worker-status.d.ts +0 -47
- package/dist/worker/worker-status.js +0 -52
|
@@ -1,65 +1,44 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Absolute path of the generation marker for a branch-clone root.
|
|
3
|
+
* @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md.
|
|
4
|
+
*/
|
|
2
5
|
export declare function contentIndexGenerationPath(root: string): string;
|
|
3
6
|
/**
|
|
4
7
|
* Record on disk that indexed files under `root` changed, so ContentStores in
|
|
5
8
|
* OTHER processes rebuild. Must be called AFTER the filesystem mutation.
|
|
6
|
-
* Returns the token written, or null if the write failed
|
|
7
|
-
* the content mutation is already durable
|
|
8
|
-
* pre-marker staleness behavior plus the ContentStore backstop).
|
|
9
|
+
* Returns the token written, or null if the write failed — a hint bump, since
|
|
10
|
+
* the content mutation is already durable and ContentStore has a backstop.
|
|
9
11
|
*/
|
|
10
12
|
export declare function bumpContentIndexGeneration(root: string): Promise<string | null>;
|
|
11
13
|
/**
|
|
12
|
-
* Read the current generation token for `root`.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* which is the safe direction.
|
|
14
|
+
* Read the current generation token for `root`. Null means the marker does not
|
|
15
|
+
* exist yet; a read error collapses to null too, so the caller rebuilds, which
|
|
16
|
+
* is the safe direction.
|
|
16
17
|
*/
|
|
17
18
|
export declare function readContentIndexGeneration(root: string): Promise<string | null>;
|
|
18
19
|
/**
|
|
19
|
-
* The
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
20
|
+
* The entry point for a bulk mutation site that touches indexed files under a
|
|
21
|
+
* branch-clone root broadly but never touches schema. No production caller yet:
|
|
22
|
+
* `ContentStore`'s write/delete/renameEntry bump the marker directly via
|
|
23
|
+
* `recordOwnMutation()`, and every bulk site (git checkout/merge/rebase, sync,
|
|
24
|
+
* CLI sync, migrate) can touch `.collection.json` as a side effect, so those
|
|
25
|
+
* take `invalidateBranchContentCaches()` below.
|
|
24
26
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* existing bulk-mutation call site (git checkout/merge/rebase, sync, CLI
|
|
29
|
-
* sync, migrate) can touch `.collection.json` as a side effect, so those all
|
|
30
|
-
* use the combined `invalidateBranchContentCaches()` below instead. Kept as
|
|
31
|
-
* the documented, ready-to-use entry point for a future call site that is
|
|
32
|
-
* genuinely content-only.
|
|
33
|
-
*
|
|
34
|
-
* Bump-before-invalidate: the in-process invalidation triggers a rebuild on
|
|
35
|
-
* next access, and that rebuild captures the marker token before scanning —
|
|
36
|
-
* writing the marker first lets the rebuild pick up the new token in the same
|
|
37
|
-
* pass instead of a redundant second rebuild.
|
|
27
|
+
* Bump BEFORE invalidating: the rebuild the invalidation triggers captures the
|
|
28
|
+
* marker token before scanning, so the new token lands in that same pass
|
|
29
|
+
* instead of costing a second rebuild.
|
|
38
30
|
*/
|
|
39
31
|
export declare function invalidateContentIndexesDurable(root: string): Promise<void>;
|
|
40
32
|
/**
|
|
41
|
-
* The entry point for operations that mutate a branch-clone root's working
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* the
|
|
47
|
-
* at `root` need to be told: the ContentId index (content-index-registry.ts)
|
|
48
|
-
* AND the resolved-schema cache (branch-schema-cache.ts).
|
|
49
|
-
*
|
|
50
|
-
* `invalidateContentIndexesDurable` is the designated entry point for a
|
|
51
|
-
* future call site that only ever touches content files, never schema, and
|
|
52
|
-
* needs the durable-invalidation shape but not the extra schema bump.
|
|
53
|
-
* `ContentStore`'s own write/delete/rename paths don't call it either — they
|
|
54
|
-
* bump the content-index marker directly via `recordOwnMutation()` (see
|
|
55
|
-
* content-store.ts), since they already know exactly which mutation just
|
|
56
|
-
* happened and don't need a generic "some indexed files changed" entry point.
|
|
33
|
+
* The entry point for operations that mutate a branch-clone root's working tree
|
|
34
|
+
* broadly: git working-tree ops (checkout/merge/rebase/abort), content sync,
|
|
35
|
+
* CLI sync, migrate. Those can touch `.collection.json` as a side effect (a
|
|
36
|
+
* rebase pulls in upstream schema changes; a sync overwrites the whole content
|
|
37
|
+
* directory), so BOTH caches rooted at `root` are bumped — the ContentId index
|
|
38
|
+
* and the resolved-schema cache.
|
|
57
39
|
*
|
|
58
|
-
* Both
|
|
59
|
-
* `
|
|
60
|
-
*
|
|
61
|
-
* throwing because a marker write failed - log-and-swallow is the existing
|
|
62
|
-
* semantics at those call sites, and a lost bump only degrades to pre-marker
|
|
63
|
-
* staleness behavior plus whatever backstop the consumer implements.
|
|
40
|
+
* Both bumps are hint flavor (no `mustSucceed`): these callers are typically
|
|
41
|
+
* `finally` blocks in bulk operations, which must not start throwing because a
|
|
42
|
+
* marker write failed.
|
|
64
43
|
*/
|
|
65
44
|
export declare function invalidateBranchContentCaches(root: string): Promise<void>;
|
|
@@ -2,43 +2,15 @@ import { resourceGenerationPath, bumpResourceGeneration, readResourceGeneration,
|
|
|
2
2
|
import { invalidateContentIndexesForRoot } from './content-index-registry.js';
|
|
3
3
|
import { SCHEMA_GENERATION_RESOURCE } from './branch-schema-cache.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* The ContentIdIndex instance of the generation-marker protocol owned by
|
|
6
|
+
* resource-generation.ts; the marker lives at
|
|
7
|
+
* {root}/.canopy-meta/content-index.generation. In-process invalidation of the
|
|
8
|
+
* same indexes is content-index-registry.ts's job.
|
|
6
9
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* documents only what is specific to the in-memory ContentIdIndex.
|
|
12
|
-
*
|
|
13
|
-
* The ContentIdIndex is an in-memory map per ContentStore instance. Within one
|
|
14
|
-
* process, content-index-registry.ts invalidates stale indexes directly. Across
|
|
15
|
-
* processes (several warm Lambda containers + the EC2 worker sharing branch
|
|
16
|
-
* clones on EFS) there is no shared memory and no cross-host file watching, so
|
|
17
|
-
* the shared filesystem itself is the coordination medium: every operation that
|
|
18
|
-
* mutates indexed files under a branch-clone root also rewrites a small marker
|
|
19
|
-
* file with a fresh random token, and every ContentStore cheaply re-reads that
|
|
20
|
-
* marker (throttled) to decide whether its in-memory index is still current.
|
|
21
|
-
*
|
|
22
|
-
* The marker lives at {root}/.canopy-meta/content-index.generation.
|
|
23
|
-
*
|
|
24
|
-
* ## Residual staleness windows, as they apply here
|
|
25
|
-
*
|
|
26
|
-
* All bounded in practice by per-request ContentStore lifetimes and self-healed
|
|
27
|
-
* by the suspicious-lookup backstop in ContentStore:
|
|
28
|
-
*
|
|
29
|
-
* - (A) NFS attribute caching: another host may not see a new marker for up to
|
|
30
|
-
* the attribute-cache timeout (~3-60s on default EFS mounts). The reader acts
|
|
31
|
-
* on a stale token and keeps a stale index until the cache expires.
|
|
32
|
-
* - (B) Probe throttle: up to ContentStore's indexFreshnessIntervalMs (1s).
|
|
33
|
-
* - (C) Self-adoption: after its own mutation a store adopts the token it
|
|
34
|
-
* wrote; if a concurrent foreign bump landed just before ours, we miss that
|
|
35
|
-
* one notification (window: from our last token observation to our rename).
|
|
36
|
-
* - (E) Fresh-token/stale-scan (cross-host only): a rebuild's readdir calls may
|
|
37
|
-
* be served from stale dentry/attribute caches, recording a NEW token against
|
|
38
|
-
* PRE-mutation directory listings. Unlike a durable-snapshot consumer (see
|
|
39
|
-
* resource-generation.ts), this only mis-serves ONE process's in-memory
|
|
40
|
-
* index for the remainder of its lifetime — it is not written back to disk,
|
|
41
|
-
* so it cannot become a shared stale state visible to other hosts.
|
|
10
|
+
* Local to this consumer: the index is per-ContentStore memory, never persisted,
|
|
11
|
+
* so a scan that records a fresh token over stale NFS-cached readdir results
|
|
12
|
+
* mis-serves only that one process for the rest of its lifetime — it cannot
|
|
13
|
+
* become shared stale state the way a durable snapshot can.
|
|
42
14
|
*
|
|
43
15
|
* Wrong-file WRITE corruption (recreating a concurrently renamed entry →
|
|
44
16
|
* duplicate IDs) is prevented independently of this marker by the existence
|
|
@@ -46,79 +18,58 @@ import { SCHEMA_GENERATION_RESOURCE } from './branch-schema-cache.js';
|
|
|
46
18
|
* before recreating a missing expected file.
|
|
47
19
|
*/
|
|
48
20
|
const RESOURCE = 'content-index';
|
|
49
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Absolute path of the generation marker for a branch-clone root.
|
|
23
|
+
* @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md.
|
|
24
|
+
*/
|
|
50
25
|
export function contentIndexGenerationPath(root) {
|
|
51
26
|
return resourceGenerationPath(root, RESOURCE);
|
|
52
27
|
}
|
|
53
28
|
/**
|
|
54
29
|
* Record on disk that indexed files under `root` changed, so ContentStores in
|
|
55
30
|
* OTHER processes rebuild. Must be called AFTER the filesystem mutation.
|
|
56
|
-
* Returns the token written, or null if the write failed
|
|
57
|
-
* the content mutation is already durable
|
|
58
|
-
* pre-marker staleness behavior plus the ContentStore backstop).
|
|
31
|
+
* Returns the token written, or null if the write failed — a hint bump, since
|
|
32
|
+
* the content mutation is already durable and ContentStore has a backstop.
|
|
59
33
|
*/
|
|
60
34
|
export async function bumpContentIndexGeneration(root) {
|
|
61
35
|
return bumpResourceGeneration(root, RESOURCE);
|
|
62
36
|
}
|
|
63
37
|
/**
|
|
64
|
-
* Read the current generation token for `root`.
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* which is the safe direction.
|
|
38
|
+
* Read the current generation token for `root`. Null means the marker does not
|
|
39
|
+
* exist yet; a read error collapses to null too, so the caller rebuilds, which
|
|
40
|
+
* is the safe direction.
|
|
68
41
|
*/
|
|
69
42
|
export async function readContentIndexGeneration(root) {
|
|
70
43
|
const result = await readResourceGeneration(root, RESOURCE);
|
|
71
44
|
return result.ok ? result.token : null;
|
|
72
45
|
}
|
|
73
46
|
/**
|
|
74
|
-
* The
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
47
|
+
* The entry point for a bulk mutation site that touches indexed files under a
|
|
48
|
+
* branch-clone root broadly but never touches schema. No production caller yet:
|
|
49
|
+
* `ContentStore`'s write/delete/renameEntry bump the marker directly via
|
|
50
|
+
* `recordOwnMutation()`, and every bulk site (git checkout/merge/rebase, sync,
|
|
51
|
+
* CLI sync, migrate) can touch `.collection.json` as a side effect, so those
|
|
52
|
+
* take `invalidateBranchContentCaches()` below.
|
|
79
53
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* existing bulk-mutation call site (git checkout/merge/rebase, sync, CLI
|
|
84
|
-
* sync, migrate) can touch `.collection.json` as a side effect, so those all
|
|
85
|
-
* use the combined `invalidateBranchContentCaches()` below instead. Kept as
|
|
86
|
-
* the documented, ready-to-use entry point for a future call site that is
|
|
87
|
-
* genuinely content-only.
|
|
88
|
-
*
|
|
89
|
-
* Bump-before-invalidate: the in-process invalidation triggers a rebuild on
|
|
90
|
-
* next access, and that rebuild captures the marker token before scanning —
|
|
91
|
-
* writing the marker first lets the rebuild pick up the new token in the same
|
|
92
|
-
* pass instead of a redundant second rebuild.
|
|
54
|
+
* Bump BEFORE invalidating: the rebuild the invalidation triggers captures the
|
|
55
|
+
* marker token before scanning, so the new token lands in that same pass
|
|
56
|
+
* instead of costing a second rebuild.
|
|
93
57
|
*/
|
|
94
58
|
export async function invalidateContentIndexesDurable(root) {
|
|
95
59
|
await bumpContentIndexGeneration(root);
|
|
96
60
|
invalidateContentIndexesForRoot(root);
|
|
97
61
|
}
|
|
98
62
|
/**
|
|
99
|
-
* The entry point for operations that mutate a branch-clone root's working
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* the
|
|
105
|
-
* at `root` need to be told: the ContentId index (content-index-registry.ts)
|
|
106
|
-
* AND the resolved-schema cache (branch-schema-cache.ts).
|
|
107
|
-
*
|
|
108
|
-
* `invalidateContentIndexesDurable` is the designated entry point for a
|
|
109
|
-
* future call site that only ever touches content files, never schema, and
|
|
110
|
-
* needs the durable-invalidation shape but not the extra schema bump.
|
|
111
|
-
* `ContentStore`'s own write/delete/rename paths don't call it either — they
|
|
112
|
-
* bump the content-index marker directly via `recordOwnMutation()` (see
|
|
113
|
-
* content-store.ts), since they already know exactly which mutation just
|
|
114
|
-
* happened and don't need a generic "some indexed files changed" entry point.
|
|
63
|
+
* The entry point for operations that mutate a branch-clone root's working tree
|
|
64
|
+
* broadly: git working-tree ops (checkout/merge/rebase/abort), content sync,
|
|
65
|
+
* CLI sync, migrate. Those can touch `.collection.json` as a side effect (a
|
|
66
|
+
* rebase pulls in upstream schema changes; a sync overwrites the whole content
|
|
67
|
+
* directory), so BOTH caches rooted at `root` are bumped — the ContentId index
|
|
68
|
+
* and the resolved-schema cache.
|
|
115
69
|
*
|
|
116
|
-
* Both
|
|
117
|
-
* `
|
|
118
|
-
*
|
|
119
|
-
* throwing because a marker write failed - log-and-swallow is the existing
|
|
120
|
-
* semantics at those call sites, and a lost bump only degrades to pre-marker
|
|
121
|
-
* staleness behavior plus whatever backstop the consumer implements.
|
|
70
|
+
* Both bumps are hint flavor (no `mustSucceed`): these callers are typically
|
|
71
|
+
* `finally` blocks in bulk operations, which must not start throwing because a
|
|
72
|
+
* marker write failed.
|
|
122
73
|
*/
|
|
123
74
|
export async function invalidateBranchContentCaches(root) {
|
|
124
75
|
await bumpContentIndexGeneration(root);
|
|
@@ -1,37 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* In-process registry connecting branch-mutating operations
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* In-process registry connecting branch-mutating operations to the ContentStore
|
|
3
|
+
* instances whose ContentId indexes they make stale. ContentStore registers
|
|
4
|
+
* itself on construction, keyed by its resolved root; a mutation site calls
|
|
5
|
+
* invalidateContentIndexesForRoot() so the next index access rebuilds from disk
|
|
6
|
+
* instead of serving stale ID→path mappings.
|
|
5
7
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* next index access rebuilds from disk instead of serving stale ID→path mappings.
|
|
8
|
+
* SCOPE: in-process only, the zero-latency half. Cross-process divergence is the
|
|
9
|
+
* generation marker's job (content-index-generation.ts), and mutation sites
|
|
10
|
+
* should call invalidateContentIndexesDurable() there, which does both.
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* registry) is handled by the on-disk generation marker in
|
|
14
|
-
* content-index-generation.ts; invalidateContentIndexesDurable() there combines
|
|
15
|
-
* both scopes and is what mutation sites should call.
|
|
16
|
-
*
|
|
17
|
-
* Stores are held via WeakRef so short-lived (per-request) instances can be garbage
|
|
18
|
-
* collected; a FinalizationRegistry prunes dead entries.
|
|
12
|
+
* Stores are held via WeakRef so per-request instances can be collected; a
|
|
13
|
+
* FinalizationRegistry prunes dead entries.
|
|
19
14
|
*/
|
|
20
15
|
/** Anything holding a rebuildable content index (in practice: ContentStore). */
|
|
21
16
|
export interface InvalidatableContentIndex {
|
|
22
17
|
invalidateIndex(): void;
|
|
23
18
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Register a content-index holder for invalidation when files under `root` change.
|
|
26
|
-
* Called by the ContentStore constructor.
|
|
27
|
-
*/
|
|
19
|
+
/** Register a holder for invalidation when files under `root` change. */
|
|
28
20
|
export declare function registerContentIndexForInvalidation(root: string, target: InvalidatableContentIndex): void;
|
|
29
21
|
/**
|
|
30
|
-
* Invalidate every registered
|
|
31
|
-
*
|
|
32
|
-
* (e.g. a store rooted at a branch clone inside a mutated workspace tree).
|
|
22
|
+
* Invalidate every registered index rooted at `root` or below it; the prefix
|
|
23
|
+
* match covers a store rooted at a subdirectory of the mutated repo.
|
|
33
24
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
25
|
+
* This only marks indexes stale — the rebuild is lazy, on next access — so a
|
|
26
|
+
* root with no live stores costs nothing.
|
|
36
27
|
*/
|
|
37
28
|
export declare function invalidateContentIndexesForRoot(root: string): void;
|
|
@@ -8,10 +8,7 @@ const finalization = new FinalizationRegistry(({ rootKey, ref }) => {
|
|
|
8
8
|
if (refs.size === 0)
|
|
9
9
|
registry.delete(rootKey);
|
|
10
10
|
});
|
|
11
|
-
/**
|
|
12
|
-
* Register a content-index holder for invalidation when files under `root` change.
|
|
13
|
-
* Called by the ContentStore constructor.
|
|
14
|
-
*/
|
|
11
|
+
/** Register a holder for invalidation when files under `root` change. */
|
|
15
12
|
export function registerContentIndexForInvalidation(root, target) {
|
|
16
13
|
const rootKey = path.resolve(root);
|
|
17
14
|
let refs = registry.get(rootKey);
|
|
@@ -24,12 +21,11 @@ export function registerContentIndexForInvalidation(root, target) {
|
|
|
24
21
|
finalization.register(target, { rootKey, ref });
|
|
25
22
|
}
|
|
26
23
|
/**
|
|
27
|
-
* Invalidate every registered
|
|
28
|
-
*
|
|
29
|
-
* (e.g. a store rooted at a branch clone inside a mutated workspace tree).
|
|
24
|
+
* Invalidate every registered index rooted at `root` or below it; the prefix
|
|
25
|
+
* match covers a store rooted at a subdirectory of the mutated repo.
|
|
30
26
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
27
|
+
* This only marks indexes stale — the rebuild is lazy, on next access — so a
|
|
28
|
+
* root with no live stores costs nothing.
|
|
33
29
|
*/
|
|
34
30
|
export function invalidateContentIndexesForRoot(root) {
|
|
35
31
|
const rootKey = path.resolve(root);
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared content-listing utilities used by both the entries API and the content tree builder.
|
|
3
|
-
*
|
|
4
|
-
* Extracted from api/entries.ts to avoid duplication.
|
|
5
3
|
*/
|
|
6
4
|
import type { ContentFormat, FlatSchemaItem, EntrySchema } from './config/index.js';
|
|
7
5
|
import type { LogicalPath, PhysicalPath, Slug, ContentId } from './paths/types.js';
|
|
8
6
|
import { ContentStore, type ReferenceResolveCache } from './content-store.js';
|
|
9
|
-
/**
|
|
10
|
-
* An entry listing item with raw data from the filesystem.
|
|
11
|
-
* Does not include API-specific fields like canEdit.
|
|
12
|
-
*/
|
|
7
|
+
/** An entry listing item with raw filesystem data; no API-specific fields like canEdit. */
|
|
13
8
|
export interface CollectionListItem {
|
|
14
9
|
logicalPath: LogicalPath;
|
|
15
10
|
contentId: ContentId;
|
|
@@ -23,14 +18,6 @@ export interface CollectionListItem {
|
|
|
23
18
|
data: Record<string, unknown>;
|
|
24
19
|
updatedAt?: string;
|
|
25
20
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Read entry data from a file.
|
|
28
|
-
* For md/mdx: returns frontmatter fields plus the body content (mapped to the
|
|
29
|
-
* field name specified by `bodyFieldName`, which defaults to `'body'`).
|
|
30
|
-
* For json: returns the parsed JSON object.
|
|
31
|
-
* Returns an empty object on read/parse failure.
|
|
32
|
-
*/
|
|
33
|
-
export declare const readEntryData: (filePath: string, format: ContentFormat, bodyFieldName?: string) => Promise<Record<string, unknown>>;
|
|
34
21
|
export { parseTypedFilename } from './utils/typed-filename.js';
|
|
35
22
|
/**
|
|
36
23
|
* A flat entry item from listEntries.
|
|
@@ -40,17 +27,15 @@ export interface ListEntriesItem<T = Record<string, unknown>> {
|
|
|
40
27
|
/** URL path segments, e.g., ['researchers', 'guides', 'glossary-of-terms'] */
|
|
41
28
|
pathSegments: string[];
|
|
42
29
|
/**
|
|
43
|
-
* URL-ready path with index entries collapsed to their parent collection path
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* For a root index entry: '/'.
|
|
30
|
+
* URL-ready path with index entries collapsed to their parent collection path: '/guides'
|
|
31
|
+
* for the index entry of guides, '/guides/glossary-of-terms' for a regular entry, '/' for a
|
|
32
|
+
* root index entry.
|
|
47
33
|
*
|
|
48
|
-
* Round-trip safe: `readByUrlPath(item.urlPath)` resolves to the same entry
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* this doc comment's promise.
|
|
34
|
+
* Round-trip safe: `readByUrlPath(item.urlPath)` resolves to the same entry -- but only
|
|
35
|
+
* while `slug` passes `parseSlug`. The filename grammar (`utils/typed-filename.ts`) allows
|
|
36
|
+
* slugs `parseSlug` rejects (a dot, most commonly), and such an entry is listed here like
|
|
37
|
+
* any other yet can never be read back by URL. `static/index.ts`'s `assertRoutableSlugs` is
|
|
38
|
+
* the build-time guard that catches it.
|
|
54
39
|
*/
|
|
55
40
|
urlPath: string;
|
|
56
41
|
/** Entry slug within its collection */
|
|
@@ -75,20 +60,17 @@ export interface ListEntriesItem<T = Record<string, unknown>> {
|
|
|
75
60
|
/** Field definitions for this entry's type, when resolvable. */
|
|
76
61
|
schema?: EntrySchema;
|
|
77
62
|
/**
|
|
78
|
-
* Filesystem mtime (ISO 8601) of the entry file, from an unconditional `fs.stat`
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* a public-facing `<lastmod>`. Sourcing mtime from git commit history is a
|
|
83
|
-
* separate, not-yet-built improvement.
|
|
63
|
+
* Filesystem mtime (ISO 8601) of the entry file, from an unconditional `fs.stat` done while
|
|
64
|
+
* listing. Caveat: a checkout-time timestamp, not an editorial one — a fresh CI clone resets
|
|
65
|
+
* every file's mtime — so treat it as "changed since last build" at best, never as an
|
|
66
|
+
* authoritative last-edited date for a public-facing `<lastmod>`.
|
|
84
67
|
*/
|
|
85
68
|
updatedAt?: string;
|
|
86
69
|
}
|
|
87
70
|
export interface ListEntriesOptions<T = Record<string, unknown>> {
|
|
88
71
|
/**
|
|
89
|
-
* Transform raw entry data
|
|
90
|
-
*
|
|
91
|
-
* Without extract, data is the full raw object.
|
|
72
|
+
* Transform raw entry data; controls what ends up in `data` on each result. Raw data
|
|
73
|
+
* includes all frontmatter fields, and for md/mdx `raw.body` is the markdown content.
|
|
92
74
|
*/
|
|
93
75
|
extract?: (raw: Record<string, unknown>, meta: {
|
|
94
76
|
entryPath: LogicalPath;
|
|
@@ -107,44 +89,38 @@ export interface ListEntriesOptions<T = Record<string, unknown>> {
|
|
|
107
89
|
sort?: (a: ListEntriesItem<T>, b: ListEntriesItem<T>) => number;
|
|
108
90
|
/**
|
|
109
91
|
* Resolve `reference` fields to the referenced entry's data, the way
|
|
110
|
-
* `read()`/`readByUrlPath()` do — including references nested inside `object` fields,
|
|
111
|
-
*
|
|
112
|
-
* snippet's content here). Off leaves them as the bare id string, or `null`.
|
|
92
|
+
* `read()`/`readByUrlPath()` do — including references nested inside `object` fields, inline
|
|
93
|
+
* `group`s and block templates. Off leaves them as the bare id string, or `null`.
|
|
113
94
|
*
|
|
114
|
-
* **Defaults to `false`, unlike `read()`, which defaults to `true`.**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* `build/generate-ai-content.ts` lists purely to validate entry shapes.
|
|
95
|
+
* **Defaults to `false`, unlike `read()`, which defaults to `true`.** Deliberate: `data` is
|
|
96
|
+
* `T` and `extract` receives an untyped `Record<string, unknown>`, so turning this on
|
|
97
|
+
* changes a reference from `'a1b2c3d4e5f6'` to `{ ...data, id, slug, collection, urlPath }`
|
|
98
|
+
* with no compile error anywhere to catch it — an `/authors/${data.author}` template
|
|
99
|
+
* silently becomes `/authors/[object Object]`. Opting in is a decision per call site, next
|
|
100
|
+
* to the code that reads the field. It also keeps the common batch uses free:
|
|
101
|
+
* `collectStaticPaths` discards `data` outright.
|
|
122
102
|
*
|
|
123
103
|
* **Cost, and why it is bounded.** Resolution needs a `ContentStore` and its ContentId
|
|
124
|
-
* index, so
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* times. Nothing is constructed and nothing is scanned when this is off.
|
|
104
|
+
* index, so this adds one index scan per call plus one read per DISTINCT referenced entry —
|
|
105
|
+
* not per referencing entry, since a single {@link ReferenceResolveCache} spans the whole
|
|
106
|
+
* call. Nothing is constructed and nothing is scanned when this is off.
|
|
128
107
|
*
|
|
129
108
|
* **Path ACLs are not applied to the resolved targets**, matching `read()` exactly: a
|
|
130
|
-
* reference can resolve to an entry the user could not `read()` directly. The entries
|
|
131
|
-
*
|
|
132
|
-
* resolved at all.
|
|
109
|
+
* reference can resolve to an entry the user could not `read()` directly. The entries being
|
|
110
|
+
* LISTED are still ACL-filtered, and a filtered-out entry is never resolved at all.
|
|
133
111
|
*/
|
|
134
112
|
resolveReferences?: boolean;
|
|
135
113
|
}
|
|
136
114
|
/**
|
|
137
|
-
* Server-only path-ACL predicate, applied to raw entries before any of their data
|
|
138
|
-
*
|
|
115
|
+
* Server-only path-ACL predicate, applied to raw entries before any of their data reaches a
|
|
116
|
+
* caller.
|
|
139
117
|
*
|
|
140
118
|
* Deliberately NOT part of `ListEntriesOptions`/`BuildContentTreeOptions`: those are
|
|
141
|
-
* adopter-facing, and adopter code must not be able to supply, widen
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* Omitting it preserves the pre-existing unfiltered behavior exactly, which is what
|
|
147
|
-
* build-time callers want.
|
|
119
|
+
* adopter-facing, and adopter code must not be able to supply, widen or override the access
|
|
120
|
+
* check. `context.ts` is the only intended producer — it builds the predicate from
|
|
121
|
+
* `services.createContentAccessChecker` for the request-scoped user, and omits it entirely at
|
|
122
|
+
* build time / on static deployments (synthetic admin, no ACLs), leaving the listing
|
|
123
|
+
* unfiltered exactly as build-time callers want.
|
|
148
124
|
*/
|
|
149
125
|
export interface ContentVisibilityOptions {
|
|
150
126
|
/** Return false to drop an entry. Receives the entry's branch-root-relative physical path. */
|
|
@@ -158,18 +134,16 @@ export type CollectionSchemaItem = Extract<FlatSchemaItem, {
|
|
|
158
134
|
* Build the `ContentStore` + shared cache that a batch listing resolves references through.
|
|
159
135
|
*
|
|
160
136
|
* Unrelated to the `ReferenceResolver` class in reference-resolver.ts despite the adjacent
|
|
161
|
-
* name — that one resolves an id to a human-readable
|
|
162
|
-
* resolves a reference to the referenced entry's *data* for server-side listings.
|
|
137
|
+
* name — that one resolves an id to a human-readable display label for the editor UI.
|
|
163
138
|
*
|
|
164
|
-
* Constructed lazily by each listing surface, and ONLY when the caller opted in
|
|
139
|
+
* Constructed lazily by each listing surface, and ONLY when the caller opted in: a store
|
|
165
140
|
* builds a ContentId index on first use, which is a full scan of the content tree, and the
|
|
166
141
|
* default (`resolveReferences` off) must stay a pure filesystem walk with no index at all.
|
|
167
142
|
*
|
|
168
|
-
* One store and one cache per listing
|
|
143
|
+
* One store and one cache per listing CALL, not per collection: the cache is the reason a
|
|
169
144
|
* shared block referenced from 40 pages costs one read instead of 40, so it has to span the
|
|
170
|
-
* whole batch.
|
|
171
|
-
* `
|
|
172
|
-
* `WeakRef` + a `FinalizationRegistry` precisely so short-lived instances stay collectable.
|
|
145
|
+
* whole batch. content-index-registry.ts holds stores through `WeakRef` + a
|
|
146
|
+
* `FinalizationRegistry`, so these short-lived instances stay collectable.
|
|
173
147
|
*/
|
|
174
148
|
export declare const createReferenceResolver: (branchRoot: string, flatSchema: FlatSchemaItem[], contentRootName: string) => {
|
|
175
149
|
store: ContentStore;
|
|
@@ -188,41 +162,27 @@ export declare const resolveCollectionItemReferences: (items: CollectionListItem
|
|
|
188
162
|
cache: ReferenceResolveCache;
|
|
189
163
|
}) => Promise<CollectionListItem[]>;
|
|
190
164
|
/**
|
|
191
|
-
* List all content entries as a flat array
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* and returns a flat list suitable for generateStaticParams, search indexing, sitemaps, etc.
|
|
165
|
+
* List all content entries as a flat array: walks the schema to discover collections, reads
|
|
166
|
+
* entries from each, and returns a flat list suitable for generateStaticParams, search
|
|
167
|
+
* indexing, sitemaps, etc.
|
|
195
168
|
*
|
|
196
|
-
* Build-time-only failure: a file with a recognized content extension
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
* (admin UI, content tree, `next dev`) the file is still just skipped, since a fresh scaffold or
|
|
206
|
-
* mid-rename file legitimately exists there.
|
|
169
|
+
* Build-time-only failure: a file with a recognized content extension sitting in a collection
|
|
170
|
+
* directory that *looks like an attempted entry* (see `looksLikeMalformedEntry`) but does not
|
|
171
|
+
* match `{type}.{slug}.{id}.{ext}` is silently dropped by default. That is exactly the
|
|
172
|
+
* silent-page-loss static generation must not have -- a schema rename without a matching file
|
|
173
|
+
* rename, or an entry type declared in one collection but not another, would vanish a page with
|
|
174
|
+
* zero build output -- so when `isBuildMode()` is true any such file throws instead
|
|
175
|
+
* (`static/index.ts`'s `assertBuildEntriesValid` is the sibling schema-validity guard).
|
|
176
|
+
* Outside build mode (admin UI, content tree, `next dev`) it is still skipped, since a fresh
|
|
177
|
+
* scaffold or mid-rename file legitimately exists there.
|
|
207
178
|
*
|
|
208
|
-
* A file that was never entry-shaped
|
|
209
|
-
*
|
|
210
|
-
* documented in the README — is not this guard's failure mode and never throws, in or out of
|
|
211
|
-
* build mode. See `looksLikeMalformedEntry` for the exact shape test.
|
|
212
|
-
*
|
|
213
|
-
* @param branchRoot - Absolute path to the branch workspace root
|
|
214
|
-
* @param flatSchema - Flattened schema items (from flattenSchema)
|
|
215
|
-
* @param contentRootName - The content root name (e.g. "content")
|
|
216
|
-
* @param options - Listing options (extract, filter, rootPath, sort, resolveReferences)
|
|
217
|
-
* @param visibility - Internal path-ACL predicate; see `ContentVisibilityOptions`
|
|
179
|
+
* A file that was never entry-shaped -- a `README.md`, or a colocated sibling artifact named
|
|
180
|
+
* `{contentId}.suffix.ext` per the `entryTransforms`/`readSibling` convention -- never throws.
|
|
218
181
|
*/
|
|
219
182
|
export declare function listEntries<T = Record<string, unknown>>(branchRoot: string, flatSchema: FlatSchemaItem[], contentRootName: string, options?: ListEntriesOptions<T>, visibility?: ContentVisibilityOptions): Promise<ListEntriesItem<T>[]>;
|
|
220
183
|
/**
|
|
221
|
-
* Sort items by a content ID order array
|
|
222
|
-
*
|
|
223
|
-
* sorted by the provided fallback key.
|
|
224
|
-
*
|
|
225
|
-
* Note: sorts the array in-place and returns it.
|
|
184
|
+
* Sort items by a content ID order array: items in `order` come first, in that order, then
|
|
185
|
+
* the rest sorted by `fallbackKey`. Sorts the array in place and returns it.
|
|
226
186
|
*/
|
|
227
187
|
export declare const sortByOrder: <T extends {
|
|
228
188
|
contentId?: ContentId;
|
|
@@ -235,16 +195,13 @@ export interface SkippedListingFile {
|
|
|
235
195
|
collectionPath: LogicalPath;
|
|
236
196
|
}
|
|
237
197
|
/**
|
|
238
|
-
* List all entries in a collection directory.
|
|
239
|
-
* Reads each entry's data (frontmatter or JSON).
|
|
198
|
+
* List all entries in a collection directory, reading each entry's data.
|
|
240
199
|
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
* exact prior behavior. `listEntries` below uses this to turn the skip into a hard build-time
|
|
248
|
-
* failure instead of a silent one.
|
|
200
|
+
* `onSkip` is called for every file that has a recognized content extension, does NOT match
|
|
201
|
+
* the `{type}.{slug}.{id}.{ext}` grammar (see `parseTypedFilename`), AND structurally looks
|
|
202
|
+
* like an attempted entry (see `looksLikeMalformedEntry`). A file that was never entry-shaped
|
|
203
|
+
* -- a `README.md`, a colocated sibling artifact -- is always dropped with a debug-gated
|
|
204
|
+
* `log.warn` and never passed to `onSkip`. Optional and purely diagnostic: `listEntries` uses
|
|
205
|
+
* it to turn the skip into a hard build-time failure instead of a silent one.
|
|
249
206
|
*/
|
|
250
207
|
export declare const listCollectionEntries: (root: string, collection: FlatSchemaItem, onSkip?: (file: SkippedListingFile) => void) => Promise<CollectionListItem[]>;
|