@krantho/api 0.0.0-stage → 1.0.0
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/LICENSE +21 -0
- package/dist/active-locales.d.ts +11 -0
- package/dist/active-locales.d.ts.map +1 -0
- package/dist/active-locales.js +31 -0
- package/dist/active-locales.js.map +1 -0
- package/dist/assistant/access.d.ts +25 -0
- package/dist/assistant/access.d.ts.map +1 -0
- package/dist/assistant/access.js +35 -0
- package/dist/assistant/access.js.map +1 -0
- package/dist/assistant/agent-loop.d.ts +31 -0
- package/dist/assistant/agent-loop.d.ts.map +1 -0
- package/dist/assistant/agent-loop.js +183 -0
- package/dist/assistant/agent-loop.js.map +1 -0
- package/dist/assistant/call-handler.d.ts +15 -0
- package/dist/assistant/call-handler.d.ts.map +1 -0
- package/dist/assistant/call-handler.js +24 -0
- package/dist/assistant/call-handler.js.map +1 -0
- package/dist/assistant/chat-handler.d.ts +8 -0
- package/dist/assistant/chat-handler.d.ts.map +1 -0
- package/dist/assistant/chat-handler.js +79 -0
- package/dist/assistant/chat-handler.js.map +1 -0
- package/dist/assistant/chat-request.d.ts +16 -0
- package/dist/assistant/chat-request.d.ts.map +1 -0
- package/dist/assistant/chat-request.js +59 -0
- package/dist/assistant/chat-request.js.map +1 -0
- package/dist/assistant/confirm-handler.d.ts +3 -0
- package/dist/assistant/confirm-handler.d.ts.map +1 -0
- package/dist/assistant/confirm-handler.js +39 -0
- package/dist/assistant/confirm-handler.js.map +1 -0
- package/dist/assistant/document-change.d.ts +22 -0
- package/dist/assistant/document-change.d.ts.map +1 -0
- package/dist/assistant/document-change.js +74 -0
- package/dist/assistant/document-change.js.map +1 -0
- package/dist/assistant/document-lock.d.ts +12 -0
- package/dist/assistant/document-lock.d.ts.map +1 -0
- package/dist/assistant/document-lock.js +14 -0
- package/dist/assistant/document-lock.js.map +1 -0
- package/dist/assistant/execute-action.d.ts +19 -0
- package/dist/assistant/execute-action.d.ts.map +1 -0
- package/dist/assistant/execute-action.js +167 -0
- package/dist/assistant/execute-action.js.map +1 -0
- package/dist/assistant/pending-action.d.ts +86 -0
- package/dist/assistant/pending-action.d.ts.map +1 -0
- package/dist/assistant/pending-action.js +104 -0
- package/dist/assistant/pending-action.js.map +1 -0
- package/dist/assistant/protocol.d.ts +120 -0
- package/dist/assistant/protocol.d.ts.map +1 -0
- package/dist/assistant/protocol.js +2 -0
- package/dist/assistant/protocol.js.map +1 -0
- package/dist/assistant/routes.d.ts +4 -0
- package/dist/assistant/routes.d.ts.map +1 -0
- package/dist/assistant/routes.js +10 -0
- package/dist/assistant/routes.js.map +1 -0
- package/dist/assistant/sse-stream.d.ts +15 -0
- package/dist/assistant/sse-stream.d.ts.map +1 -0
- package/dist/assistant/sse-stream.js +61 -0
- package/dist/assistant/sse-stream.js.map +1 -0
- package/dist/assistant/status-handler.d.ts +8 -0
- package/dist/assistant/status-handler.d.ts.map +1 -0
- package/dist/assistant/status-handler.js +39 -0
- package/dist/assistant/status-handler.js.map +1 -0
- package/dist/assistant/system-prompt.d.ts +18 -0
- package/dist/assistant/system-prompt.d.ts.map +1 -0
- package/dist/assistant/system-prompt.js +48 -0
- package/dist/assistant/system-prompt.js.map +1 -0
- package/dist/assistant/tool-registry.d.ts +19 -0
- package/dist/assistant/tool-registry.d.ts.map +1 -0
- package/dist/assistant/tool-registry.js +69 -0
- package/dist/assistant/tool-registry.js.map +1 -0
- package/dist/assistant/tools/action-tools.d.ts +4 -0
- package/dist/assistant/tools/action-tools.d.ts.map +1 -0
- package/dist/assistant/tools/action-tools.js +132 -0
- package/dist/assistant/tools/action-tools.js.map +1 -0
- package/dist/assistant/tools/aeo-tools.d.ts +4 -0
- package/dist/assistant/tools/aeo-tools.d.ts.map +1 -0
- package/dist/assistant/tools/aeo-tools.js +162 -0
- package/dist/assistant/tools/aeo-tools.js.map +1 -0
- package/dist/assistant/tools/define-tool.d.ts +55 -0
- package/dist/assistant/tools/define-tool.d.ts.map +1 -0
- package/dist/assistant/tools/define-tool.js +5 -0
- package/dist/assistant/tools/define-tool.js.map +1 -0
- package/dist/assistant/tools/draft-tools.d.ts +7 -0
- package/dist/assistant/tools/draft-tools.d.ts.map +1 -0
- package/dist/assistant/tools/draft-tools.js +105 -0
- package/dist/assistant/tools/draft-tools.js.map +1 -0
- package/dist/assistant/tools/draft-write.d.ts +49 -0
- package/dist/assistant/tools/draft-write.d.ts.map +1 -0
- package/dist/assistant/tools/draft-write.js +122 -0
- package/dist/assistant/tools/draft-write.js.map +1 -0
- package/dist/assistant/tools/faq-fit.d.ts +32 -0
- package/dist/assistant/tools/faq-fit.d.ts.map +1 -0
- package/dist/assistant/tools/faq-fit.js +96 -0
- package/dist/assistant/tools/faq-fit.js.map +1 -0
- package/dist/assistant/tools/read-tools.d.ts +13 -0
- package/dist/assistant/tools/read-tools.d.ts.map +1 -0
- package/dist/assistant/tools/read-tools.js +242 -0
- package/dist/assistant/tools/read-tools.js.map +1 -0
- package/dist/assistant/tools/seo-tools.d.ts +4 -0
- package/dist/assistant/tools/seo-tools.d.ts.map +1 -0
- package/dist/assistant/tools/seo-tools.js +152 -0
- package/dist/assistant/tools/seo-tools.js.map +1 -0
- package/dist/assistant/tools/support.d.ts +35 -0
- package/dist/assistant/tools/support.d.ts.map +1 -0
- package/dist/assistant/tools/support.js +63 -0
- package/dist/assistant/tools/support.js.map +1 -0
- package/dist/assistant/untrusted.d.ts +15 -0
- package/dist/assistant/untrusted.d.ts.map +1 -0
- package/dist/assistant/untrusted.js +27 -0
- package/dist/assistant/untrusted.js.map +1 -0
- package/dist/assistant/write-policy.d.ts +20 -0
- package/dist/assistant/write-policy.d.ts.map +1 -0
- package/dist/assistant/write-policy.js +32 -0
- package/dist/assistant/write-policy.js.map +1 -0
- package/dist/auth-tokens.d.ts +31 -0
- package/dist/auth-tokens.d.ts.map +1 -0
- package/dist/auth-tokens.js +35 -0
- package/dist/auth-tokens.js.map +1 -0
- package/dist/content-change.d.ts +16 -0
- package/dist/content-change.d.ts.map +1 -0
- package/dist/content-change.js +34 -0
- package/dist/content-change.js.map +1 -0
- package/dist/content-locks.d.ts +27 -0
- package/dist/content-locks.d.ts.map +1 -0
- package/dist/content-locks.js +40 -0
- package/dist/content-locks.js.map +1 -0
- package/dist/cookies.d.ts +19 -0
- package/dist/cookies.d.ts.map +1 -0
- package/dist/cookies.js +52 -0
- package/dist/cookies.js.map +1 -0
- package/dist/create-api-handlers.d.ts +128 -0
- package/dist/create-api-handlers.d.ts.map +1 -0
- package/dist/create-api-handlers.js +384 -0
- package/dist/create-api-handlers.js.map +1 -0
- package/dist/document-actions.d.ts +25 -0
- package/dist/document-actions.d.ts.map +1 -0
- package/dist/document-actions.js +157 -0
- package/dist/document-actions.js.map +1 -0
- package/dist/document-seo.d.ts +15 -0
- package/dist/document-seo.d.ts.map +1 -0
- package/dist/document-seo.js +41 -0
- package/dist/document-seo.js.map +1 -0
- package/dist/group-by-collection.d.ts +6 -0
- package/dist/group-by-collection.d.ts.map +1 -0
- package/dist/group-by-collection.js +11 -0
- package/dist/group-by-collection.js.map +1 -0
- package/dist/handlers/apply-metadata-defaults.d.ts +4 -0
- package/dist/handlers/apply-metadata-defaults.d.ts.map +1 -0
- package/dist/handlers/apply-metadata-defaults.js +108 -0
- package/dist/handlers/apply-metadata-defaults.js.map +1 -0
- package/dist/handlers/auth-callback.d.ts +4 -0
- package/dist/handlers/auth-callback.d.ts.map +1 -0
- package/dist/handlers/auth-callback.js +217 -0
- package/dist/handlers/auth-callback.js.map +1 -0
- package/dist/handlers/auth-capabilities.d.ts +4 -0
- package/dist/handlers/auth-capabilities.d.ts.map +1 -0
- package/dist/handlers/auth-capabilities.js +19 -0
- package/dist/handlers/auth-capabilities.js.map +1 -0
- package/dist/handlers/auth-login.d.ts +4 -0
- package/dist/handlers/auth-login.d.ts.map +1 -0
- package/dist/handlers/auth-login.js +60 -0
- package/dist/handlers/auth-login.js.map +1 -0
- package/dist/handlers/auth-logout.d.ts +4 -0
- package/dist/handlers/auth-logout.d.ts.map +1 -0
- package/dist/handlers/auth-logout.js +40 -0
- package/dist/handlers/auth-logout.js.map +1 -0
- package/dist/handlers/auth-me.d.ts +4 -0
- package/dist/handlers/auth-me.d.ts.map +1 -0
- package/dist/handlers/auth-me.js +54 -0
- package/dist/handlers/auth-me.js.map +1 -0
- package/dist/handlers/auth-oidc-login.d.ts +4 -0
- package/dist/handlers/auth-oidc-login.d.ts.map +1 -0
- package/dist/handlers/auth-oidc-login.js +51 -0
- package/dist/handlers/auth-oidc-login.js.map +1 -0
- package/dist/handlers/auth-refresh.d.ts +15 -0
- package/dist/handlers/auth-refresh.d.ts.map +1 -0
- package/dist/handlers/auth-refresh.js +82 -0
- package/dist/handlers/auth-refresh.js.map +1 -0
- package/dist/handlers/bulk-delete.d.ts +8 -0
- package/dist/handlers/bulk-delete.d.ts.map +1 -0
- package/dist/handlers/bulk-delete.js +72 -0
- package/dist/handlers/bulk-delete.js.map +1 -0
- package/dist/handlers/bulk-publish.d.ts +8 -0
- package/dist/handlers/bulk-publish.d.ts.map +1 -0
- package/dist/handlers/bulk-publish.js +48 -0
- package/dist/handlers/bulk-publish.js.map +1 -0
- package/dist/handlers/capabilities.d.ts +4 -0
- package/dist/handlers/capabilities.d.ts.map +1 -0
- package/dist/handlers/capabilities.js +44 -0
- package/dist/handlers/capabilities.js.map +1 -0
- package/dist/handlers/content-changes.d.ts +28 -0
- package/dist/handlers/content-changes.d.ts.map +1 -0
- package/dist/handlers/content-changes.js +160 -0
- package/dist/handlers/content-changes.js.map +1 -0
- package/dist/handlers/content-lock.d.ts +13 -0
- package/dist/handlers/content-lock.d.ts.map +1 -0
- package/dist/handlers/content-lock.js +109 -0
- package/dist/handlers/content-lock.js.map +1 -0
- package/dist/handlers/content-tree.d.ts +11 -0
- package/dist/handlers/content-tree.d.ts.map +1 -0
- package/dist/handlers/content-tree.js +28 -0
- package/dist/handlers/content-tree.js.map +1 -0
- package/dist/handlers/create-content.d.ts +4 -0
- package/dist/handlers/create-content.d.ts.map +1 -0
- package/dist/handlers/create-content.js +49 -0
- package/dist/handlers/create-content.js.map +1 -0
- package/dist/handlers/delete-content.d.ts +4 -0
- package/dist/handlers/delete-content.d.ts.map +1 -0
- package/dist/handlers/delete-content.js +17 -0
- package/dist/handlers/delete-content.js.map +1 -0
- package/dist/handlers/delete-runtime-field.d.ts +4 -0
- package/dist/handlers/delete-runtime-field.d.ts.map +1 -0
- package/dist/handlers/delete-runtime-field.js +43 -0
- package/dist/handlers/delete-runtime-field.js.map +1 -0
- package/dist/handlers/export-bundle.d.ts +13 -0
- package/dist/handlers/export-bundle.d.ts.map +1 -0
- package/dist/handlers/export-bundle.js +99 -0
- package/dist/handlers/export-bundle.js.map +1 -0
- package/dist/handlers/export-content.d.ts +7 -0
- package/dist/handlers/export-content.d.ts.map +1 -0
- package/dist/handlers/export-content.js +69 -0
- package/dist/handlers/export-content.js.map +1 -0
- package/dist/handlers/export-schema.d.ts +4 -0
- package/dist/handlers/export-schema.d.ts.map +1 -0
- package/dist/handlers/export-schema.js +13 -0
- package/dist/handlers/export-schema.js.map +1 -0
- package/dist/handlers/get-content.d.ts +4 -0
- package/dist/handlers/get-content.d.ts.map +1 -0
- package/dist/handlers/get-content.js +65 -0
- package/dist/handlers/get-content.js.map +1 -0
- package/dist/handlers/get-runtime-schema.d.ts +4 -0
- package/dist/handlers/get-runtime-schema.d.ts.map +1 -0
- package/dist/handlers/get-runtime-schema.js +17 -0
- package/dist/handlers/get-runtime-schema.js.map +1 -0
- package/dist/handlers/get-schema.d.ts +4 -0
- package/dist/handlers/get-schema.d.ts.map +1 -0
- package/dist/handlers/get-schema.js +87 -0
- package/dist/handlers/get-schema.js.map +1 -0
- package/dist/handlers/get-version.d.ts +4 -0
- package/dist/handlers/get-version.d.ts.map +1 -0
- package/dist/handlers/get-version.js +26 -0
- package/dist/handlers/get-version.js.map +1 -0
- package/dist/handlers/import-bundle.d.ts +4 -0
- package/dist/handlers/import-bundle.d.ts.map +1 -0
- package/dist/handlers/import-bundle.js +55 -0
- package/dist/handlers/import-bundle.js.map +1 -0
- package/dist/handlers/import-content.d.ts +4 -0
- package/dist/handlers/import-content.d.ts.map +1 -0
- package/dist/handlers/import-content.js +152 -0
- package/dist/handlers/import-content.js.map +1 -0
- package/dist/handlers/index.d.ts +87 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +87 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/list-collection.d.ts +8 -0
- package/dist/handlers/list-collection.d.ts.map +1 -0
- package/dist/handlers/list-collection.js +14 -0
- package/dist/handlers/list-collection.js.map +1 -0
- package/dist/handlers/list-collections.d.ts +4 -0
- package/dist/handlers/list-collections.d.ts.map +1 -0
- package/dist/handlers/list-collections.js +17 -0
- package/dist/handlers/list-collections.js.map +1 -0
- package/dist/handlers/list-content.d.ts +8 -0
- package/dist/handlers/list-content.d.ts.map +1 -0
- package/dist/handlers/list-content.js +22 -0
- package/dist/handlers/list-content.js.map +1 -0
- package/dist/handlers/list-query.d.ts +7 -0
- package/dist/handlers/list-query.d.ts.map +1 -0
- package/dist/handlers/list-query.js +36 -0
- package/dist/handlers/list-query.js.map +1 -0
- package/dist/handlers/list-versions.d.ts +4 -0
- package/dist/handlers/list-versions.d.ts.map +1 -0
- package/dist/handlers/list-versions.js +19 -0
- package/dist/handlers/list-versions.js.map +1 -0
- package/dist/handlers/llm-credential.d.ts +46 -0
- package/dist/handlers/llm-credential.d.ts.map +1 -0
- package/dist/handlers/llm-credential.js +68 -0
- package/dist/handlers/llm-credential.js.map +1 -0
- package/dist/handlers/llm-resolve.d.ts +45 -0
- package/dist/handlers/llm-resolve.d.ts.map +1 -0
- package/dist/handlers/llm-resolve.js +126 -0
- package/dist/handlers/llm-resolve.js.map +1 -0
- package/dist/handlers/llm-settings.d.ts +19 -0
- package/dist/handlers/llm-settings.d.ts.map +1 -0
- package/dist/handlers/llm-settings.js +209 -0
- package/dist/handlers/llm-settings.js.map +1 -0
- package/dist/handlers/media-bulk-delete.d.ts +4 -0
- package/dist/handlers/media-bulk-delete.d.ts.map +1 -0
- package/dist/handlers/media-bulk-delete.js +19 -0
- package/dist/handlers/media-bulk-delete.js.map +1 -0
- package/dist/handlers/media-bulk-update.d.ts +4 -0
- package/dist/handlers/media-bulk-update.d.ts.map +1 -0
- package/dist/handlers/media-bulk-update.js +25 -0
- package/dist/handlers/media-bulk-update.js.map +1 -0
- package/dist/handlers/media-delete.d.ts +4 -0
- package/dist/handlers/media-delete.d.ts.map +1 -0
- package/dist/handlers/media-delete.js +27 -0
- package/dist/handlers/media-delete.js.map +1 -0
- package/dist/handlers/media-duplicate.d.ts +4 -0
- package/dist/handlers/media-duplicate.d.ts.map +1 -0
- package/dist/handlers/media-duplicate.js +20 -0
- package/dist/handlers/media-duplicate.js.map +1 -0
- package/dist/handlers/media-folders.d.ts +12 -0
- package/dist/handlers/media-folders.d.ts.map +1 -0
- package/dist/handlers/media-folders.js +119 -0
- package/dist/handlers/media-folders.js.map +1 -0
- package/dist/handlers/media-get.d.ts +4 -0
- package/dist/handlers/media-get.d.ts.map +1 -0
- package/dist/handlers/media-get.js +16 -0
- package/dist/handlers/media-get.js.map +1 -0
- package/dist/handlers/media-image-info.d.ts +4 -0
- package/dist/handlers/media-image-info.d.ts.map +1 -0
- package/dist/handlers/media-image-info.js +32 -0
- package/dist/handlers/media-image-info.js.map +1 -0
- package/dist/handlers/media-image.d.ts +11 -0
- package/dist/handlers/media-image.d.ts.map +1 -0
- package/dist/handlers/media-image.js +116 -0
- package/dist/handlers/media-image.js.map +1 -0
- package/dist/handlers/media-info.d.ts +4 -0
- package/dist/handlers/media-info.d.ts.map +1 -0
- package/dist/handlers/media-info.js +18 -0
- package/dist/handlers/media-info.js.map +1 -0
- package/dist/handlers/media-list.d.ts +4 -0
- package/dist/handlers/media-list.d.ts.map +1 -0
- package/dist/handlers/media-list.js +14 -0
- package/dist/handlers/media-list.js.map +1 -0
- package/dist/handlers/media-register.d.ts +4 -0
- package/dist/handlers/media-register.d.ts.map +1 -0
- package/dist/handlers/media-register.js +57 -0
- package/dist/handlers/media-register.js.map +1 -0
- package/dist/handlers/media-replace.d.ts +9 -0
- package/dist/handlers/media-replace.d.ts.map +1 -0
- package/dist/handlers/media-replace.js +53 -0
- package/dist/handlers/media-replace.js.map +1 -0
- package/dist/handlers/media-tags.d.ts +4 -0
- package/dist/handlers/media-tags.d.ts.map +1 -0
- package/dist/handlers/media-tags.js +9 -0
- package/dist/handlers/media-tags.js.map +1 -0
- package/dist/handlers/media-update.d.ts +4 -0
- package/dist/handlers/media-update.d.ts.map +1 -0
- package/dist/handlers/media-update.js +64 -0
- package/dist/handlers/media-update.js.map +1 -0
- package/dist/handlers/media-upload.d.ts +4 -0
- package/dist/handlers/media-upload.d.ts.map +1 -0
- package/dist/handlers/media-upload.js +26 -0
- package/dist/handlers/media-upload.js.map +1 -0
- package/dist/handlers/media-usage.d.ts +9 -0
- package/dist/handlers/media-usage.d.ts.map +1 -0
- package/dist/handlers/media-usage.js +36 -0
- package/dist/handlers/media-usage.js.map +1 -0
- package/dist/handlers/migration-conflicts.d.ts +13 -0
- package/dist/handlers/migration-conflicts.d.ts.map +1 -0
- package/dist/handlers/migration-conflicts.js +55 -0
- package/dist/handlers/migration-conflicts.js.map +1 -0
- package/dist/handlers/migration-status.d.ts +4 -0
- package/dist/handlers/migration-status.d.ts.map +1 -0
- package/dist/handlers/migration-status.js +34 -0
- package/dist/handlers/migration-status.js.map +1 -0
- package/dist/handlers/publish-content.d.ts +9 -0
- package/dist/handlers/publish-content.d.ts.map +1 -0
- package/dist/handlers/publish-content.js +47 -0
- package/dist/handlers/publish-content.js.map +1 -0
- package/dist/handlers/publish-impact.d.ts +11 -0
- package/dist/handlers/publish-impact.d.ts.map +1 -0
- package/dist/handlers/publish-impact.js +44 -0
- package/dist/handlers/publish-impact.js.map +1 -0
- package/dist/handlers/resolve-page.d.ts +9 -0
- package/dist/handlers/resolve-page.d.ts.map +1 -0
- package/dist/handlers/resolve-page.js +105 -0
- package/dist/handlers/resolve-page.js.map +1 -0
- package/dist/handlers/restore-version.d.ts +4 -0
- package/dist/handlers/restore-version.d.ts.map +1 -0
- package/dist/handlers/restore-version.js +69 -0
- package/dist/handlers/restore-version.js.map +1 -0
- package/dist/handlers/runtime-metadata.d.ts +6 -0
- package/dist/handlers/runtime-metadata.d.ts.map +1 -0
- package/dist/handlers/runtime-metadata.js +82 -0
- package/dist/handlers/runtime-metadata.js.map +1 -0
- package/dist/handlers/save-runtime-field.d.ts +4 -0
- package/dist/handlers/save-runtime-field.d.ts.map +1 -0
- package/dist/handlers/save-runtime-field.js +108 -0
- package/dist/handlers/save-runtime-field.js.map +1 -0
- package/dist/handlers/search-content.d.ts +9 -0
- package/dist/handlers/search-content.d.ts.map +1 -0
- package/dist/handlers/search-content.js +40 -0
- package/dist/handlers/search-content.js.map +1 -0
- package/dist/handlers/seo-config.d.ts +16 -0
- package/dist/handlers/seo-config.d.ts.map +1 -0
- package/dist/handlers/seo-config.js +250 -0
- package/dist/handlers/seo-config.js.map +1 -0
- package/dist/handlers/seo-document.d.ts +24 -0
- package/dist/handlers/seo-document.d.ts.map +1 -0
- package/dist/handlers/seo-document.js +119 -0
- package/dist/handlers/seo-document.js.map +1 -0
- package/dist/handlers/seo-enrich-archetype.d.ts +71 -0
- package/dist/handlers/seo-enrich-archetype.d.ts.map +1 -0
- package/dist/handlers/seo-enrich-archetype.js +250 -0
- package/dist/handlers/seo-enrich-archetype.js.map +1 -0
- package/dist/handlers/seo-enrich-meta.d.ts +40 -0
- package/dist/handlers/seo-enrich-meta.d.ts.map +1 -0
- package/dist/handlers/seo-enrich-meta.js +121 -0
- package/dist/handlers/seo-enrich-meta.js.map +1 -0
- package/dist/handlers/seo-enrich-runner.d.ts +65 -0
- package/dist/handlers/seo-enrich-runner.d.ts.map +1 -0
- package/dist/handlers/seo-enrich-runner.js +192 -0
- package/dist/handlers/seo-enrich-runner.js.map +1 -0
- package/dist/handlers/seo-enrich.d.ts +10 -0
- package/dist/handlers/seo-enrich.d.ts.map +1 -0
- package/dist/handlers/seo-enrich.js +166 -0
- package/dist/handlers/seo-enrich.js.map +1 -0
- package/dist/handlers/seo-generate.d.ts +4 -0
- package/dist/handlers/seo-generate.d.ts.map +1 -0
- package/dist/handlers/seo-generate.js +31 -0
- package/dist/handlers/seo-generate.js.map +1 -0
- package/dist/handlers/seo-impact.d.ts +36 -0
- package/dist/handlers/seo-impact.d.ts.map +1 -0
- package/dist/handlers/seo-impact.js +137 -0
- package/dist/handlers/seo-impact.js.map +1 -0
- package/dist/handlers/seo-indexnow.d.ts +11 -0
- package/dist/handlers/seo-indexnow.d.ts.map +1 -0
- package/dist/handlers/seo-indexnow.js +15 -0
- package/dist/handlers/seo-indexnow.js.map +1 -0
- package/dist/handlers/seo-llms-txt.d.ts +26 -0
- package/dist/handlers/seo-llms-txt.d.ts.map +1 -0
- package/dist/handlers/seo-llms-txt.js +99 -0
- package/dist/handlers/seo-llms-txt.js.map +1 -0
- package/dist/handlers/seo-preview.d.ts +8 -0
- package/dist/handlers/seo-preview.d.ts.map +1 -0
- package/dist/handlers/seo-preview.js +49 -0
- package/dist/handlers/seo-preview.js.map +1 -0
- package/dist/handlers/seo-robots.d.ts +22 -0
- package/dist/handlers/seo-robots.d.ts.map +1 -0
- package/dist/handlers/seo-robots.js +48 -0
- package/dist/handlers/seo-robots.js.map +1 -0
- package/dist/handlers/seo-sitemap.d.ts +68 -0
- package/dist/handlers/seo-sitemap.d.ts.map +1 -0
- package/dist/handlers/seo-sitemap.js +178 -0
- package/dist/handlers/seo-sitemap.js.map +1 -0
- package/dist/handlers/seo-status.d.ts +4 -0
- package/dist/handlers/seo-status.d.ts.map +1 -0
- package/dist/handlers/seo-status.js +61 -0
- package/dist/handlers/seo-status.js.map +1 -0
- package/dist/handlers/seo-structured-data.d.ts +4 -0
- package/dist/handlers/seo-structured-data.d.ts.map +1 -0
- package/dist/handlers/seo-structured-data.js +18 -0
- package/dist/handlers/seo-structured-data.js.map +1 -0
- package/dist/handlers/site-config.d.ts +8 -0
- package/dist/handlers/site-config.d.ts.map +1 -0
- package/dist/handlers/site-config.js +26 -0
- package/dist/handlers/site-config.js.map +1 -0
- package/dist/handlers/site-preview.d.ts +10 -0
- package/dist/handlers/site-preview.d.ts.map +1 -0
- package/dist/handlers/site-preview.js +54 -0
- package/dist/handlers/site-preview.js.map +1 -0
- package/dist/handlers/site-settings.d.ts +17 -0
- package/dist/handlers/site-settings.d.ts.map +1 -0
- package/dist/handlers/site-settings.js +75 -0
- package/dist/handlers/site-settings.js.map +1 -0
- package/dist/handlers/snapshot-create.d.ts +4 -0
- package/dist/handlers/snapshot-create.d.ts.map +1 -0
- package/dist/handlers/snapshot-create.js +15 -0
- package/dist/handlers/snapshot-create.js.map +1 -0
- package/dist/handlers/snapshot-delete.d.ts +4 -0
- package/dist/handlers/snapshot-delete.d.ts.map +1 -0
- package/dist/handlers/snapshot-delete.js +21 -0
- package/dist/handlers/snapshot-delete.js.map +1 -0
- package/dist/handlers/snapshot-get.d.ts +4 -0
- package/dist/handlers/snapshot-get.d.ts.map +1 -0
- package/dist/handlers/snapshot-get.js +17 -0
- package/dist/handlers/snapshot-get.js.map +1 -0
- package/dist/handlers/snapshot-list.d.ts +4 -0
- package/dist/handlers/snapshot-list.d.ts.map +1 -0
- package/dist/handlers/snapshot-list.js +9 -0
- package/dist/handlers/snapshot-list.js.map +1 -0
- package/dist/handlers/snapshot-restore.d.ts +4 -0
- package/dist/handlers/snapshot-restore.d.ts.map +1 -0
- package/dist/handlers/snapshot-restore.js +27 -0
- package/dist/handlers/snapshot-restore.js.map +1 -0
- package/dist/handlers/translation-status.d.ts +9 -0
- package/dist/handlers/translation-status.d.ts.map +1 -0
- package/dist/handlers/translation-status.js +68 -0
- package/dist/handlers/translation-status.js.map +1 -0
- package/dist/handlers/update-content.d.ts +4 -0
- package/dist/handlers/update-content.d.ts.map +1 -0
- package/dist/handlers/update-content.js +66 -0
- package/dist/handlers/update-content.js.map +1 -0
- package/dist/handlers/user-create.d.ts +4 -0
- package/dist/handlers/user-create.d.ts.map +1 -0
- package/dist/handlers/user-create.js +38 -0
- package/dist/handlers/user-create.js.map +1 -0
- package/dist/handlers/user-delete.d.ts +4 -0
- package/dist/handlers/user-delete.d.ts.map +1 -0
- package/dist/handlers/user-delete.js +25 -0
- package/dist/handlers/user-delete.js.map +1 -0
- package/dist/handlers/user-get.d.ts +4 -0
- package/dist/handlers/user-get.d.ts.map +1 -0
- package/dist/handlers/user-get.js +22 -0
- package/dist/handlers/user-get.js.map +1 -0
- package/dist/handlers/user-list.d.ts +4 -0
- package/dist/handlers/user-list.d.ts.map +1 -0
- package/dist/handlers/user-list.js +28 -0
- package/dist/handlers/user-list.js.map +1 -0
- package/dist/handlers/user-permissions.d.ts +6 -0
- package/dist/handlers/user-permissions.d.ts.map +1 -0
- package/dist/handlers/user-permissions.js +42 -0
- package/dist/handlers/user-permissions.js.map +1 -0
- package/dist/handlers/user-update.d.ts +4 -0
- package/dist/handlers/user-update.d.ts.map +1 -0
- package/dist/handlers/user-update.js +54 -0
- package/dist/handlers/user-update.js.map +1 -0
- package/dist/handlers/validate-all.d.ts +4 -0
- package/dist/handlers/validate-all.d.ts.map +1 -0
- package/dist/handlers/validate-all.js +14 -0
- package/dist/handlers/validate-all.js.map +1 -0
- package/dist/handlers/version-retention.d.ts +6 -0
- package/dist/handlers/version-retention.d.ts.map +1 -0
- package/dist/handlers/version-retention.js +40 -0
- package/dist/handlers/version-retention.js.map +1 -0
- package/dist/handlers/webhook-deliveries.d.ts +4 -0
- package/dist/handlers/webhook-deliveries.d.ts.map +1 -0
- package/dist/handlers/webhook-deliveries.js +24 -0
- package/dist/handlers/webhook-deliveries.js.map +1 -0
- package/dist/handlers/webhook-retry.d.ts +11 -0
- package/dist/handlers/webhook-retry.d.ts.map +1 -0
- package/dist/handlers/webhook-retry.js +69 -0
- package/dist/handlers/webhook-retry.js.map +1 -0
- package/dist/head.d.ts +9 -0
- package/dist/head.d.ts.map +1 -0
- package/dist/head.js +28 -0
- package/dist/head.js.map +1 -0
- package/dist/hooks.d.ts +34 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +19 -0
- package/dist/hooks.js.map +1 -0
- package/dist/image-cache.d.ts +47 -0
- package/dist/image-cache.d.ts.map +1 -0
- package/dist/image-cache.js +112 -0
- package/dist/image-cache.js.map +1 -0
- package/dist/image-dimensions.d.ts +12 -0
- package/dist/image-dimensions.d.ts.map +1 -0
- package/dist/image-dimensions.js +129 -0
- package/dist/image-dimensions.js.map +1 -0
- package/dist/image-optimizer.d.ts +86 -0
- package/dist/image-optimizer.d.ts.map +1 -0
- package/dist/image-optimizer.js +206 -0
- package/dist/image-optimizer.js.map +1 -0
- package/dist/image-presets.d.ts +17 -0
- package/dist/image-presets.d.ts.map +1 -0
- package/dist/image-presets.js +50 -0
- package/dist/image-presets.js.map +1 -0
- package/dist/image-url.d.ts +26 -0
- package/dist/image-url.d.ts.map +1 -0
- package/dist/image-url.js +47 -0
- package/dist/image-url.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +54 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +114 -0
- package/dist/jwt.js.map +1 -0
- package/dist/locale-fallback.d.ts +18 -0
- package/dist/locale-fallback.d.ts.map +1 -0
- package/dist/locale-fallback.js +42 -0
- package/dist/locale-fallback.js.map +1 -0
- package/dist/media-library.d.ts +46 -0
- package/dist/media-library.d.ts.map +1 -0
- package/dist/media-library.js +231 -0
- package/dist/media-library.js.map +1 -0
- package/dist/media-reference-updater.d.ts +24 -0
- package/dist/media-reference-updater.d.ts.map +1 -0
- package/dist/media-reference-updater.js +124 -0
- package/dist/media-reference-updater.js.map +1 -0
- package/dist/media-references.d.ts +14 -0
- package/dist/media-references.d.ts.map +1 -0
- package/dist/media-references.js +25 -0
- package/dist/media-references.js.map +1 -0
- package/dist/merged-schema.d.ts +10 -0
- package/dist/merged-schema.d.ts.map +1 -0
- package/dist/merged-schema.js +21 -0
- package/dist/merged-schema.js.map +1 -0
- package/dist/middleware/auth.d.ts +21 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +82 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/oidc-state.d.ts +42 -0
- package/dist/oidc-state.d.ts.map +1 -0
- package/dist/oidc-state.js +72 -0
- package/dist/oidc-state.js.map +1 -0
- package/dist/oidc.d.ts +83 -0
- package/dist/oidc.d.ts.map +1 -0
- package/dist/oidc.js +226 -0
- package/dist/oidc.js.map +1 -0
- package/dist/openapi.d.ts +13 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +133 -0
- package/dist/openapi.js.map +1 -0
- package/dist/permissions.d.ts +37 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +69 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugins.d.ts +64 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +73 -0
- package/dist/plugins.js.map +1 -0
- package/dist/preview-token.d.ts +13 -0
- package/dist/preview-token.d.ts.map +1 -0
- package/dist/preview-token.js +45 -0
- package/dist/preview-token.js.map +1 -0
- package/dist/public-cache.d.ts +8 -0
- package/dist/public-cache.d.ts.map +1 -0
- package/dist/public-cache.js +8 -0
- package/dist/public-cache.js.map +1 -0
- package/dist/reference-resolver.d.ts +21 -0
- package/dist/reference-resolver.d.ts.map +1 -0
- package/dist/reference-resolver.js +128 -0
- package/dist/reference-resolver.js.map +1 -0
- package/dist/return-to.d.ts +7 -0
- package/dist/return-to.d.ts.map +1 -0
- package/dist/return-to.js +15 -0
- package/dist/return-to.js.map +1 -0
- package/dist/router.d.ts +14 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +51 -0
- package/dist/router.js.map +1 -0
- package/dist/runtime-field-checks.d.ts +11 -0
- package/dist/runtime-field-checks.d.ts.map +1 -0
- package/dist/runtime-field-checks.js +72 -0
- package/dist/runtime-field-checks.js.map +1 -0
- package/dist/save-document.d.ts +71 -0
- package/dist/save-document.d.ts.map +1 -0
- package/dist/save-document.js +213 -0
- package/dist/save-document.js.map +1 -0
- package/dist/seo-compose.d.ts +50 -0
- package/dist/seo-compose.d.ts.map +1 -0
- package/dist/seo-compose.js +104 -0
- package/dist/seo-compose.js.map +1 -0
- package/dist/seo-config-snapshot.d.ts +10 -0
- package/dist/seo-config-snapshot.d.ts.map +1 -0
- package/dist/seo-config-snapshot.js +16 -0
- package/dist/seo-config-snapshot.js.map +1 -0
- package/dist/seo-loader.d.ts +10 -0
- package/dist/seo-loader.d.ts.map +1 -0
- package/dist/seo-loader.js +14 -0
- package/dist/seo-loader.js.map +1 -0
- package/dist/seo-site-findings.d.ts +27 -0
- package/dist/seo-site-findings.d.ts.map +1 -0
- package/dist/seo-site-findings.js +87 -0
- package/dist/seo-site-findings.js.map +1 -0
- package/dist/seo-subsystem.d.ts +28 -0
- package/dist/seo-subsystem.d.ts.map +1 -0
- package/dist/seo-subsystem.js +62 -0
- package/dist/seo-subsystem.js.map +1 -0
- package/dist/seo-validation.d.ts +20 -0
- package/dist/seo-validation.d.ts.map +1 -0
- package/dist/seo-validation.js +96 -0
- package/dist/seo-validation.js.map +1 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/validators.d.ts +107 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +199 -0
- package/dist/validators.js.map +1 -0
- package/dist/webhooks.d.ts +29 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +123 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/workload-identity.d.ts +23 -0
- package/dist/workload-identity.d.ts.map +1 -0
- package/dist/workload-identity.js +145 -0
- package/dist/workload-identity.js.map +1 -0
- package/package.json +50 -3
- package/README.md +0 -3
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { documentPath, rendersPages } from '@krantho/core';
|
|
2
|
+
import { canReadPublished } from '@krantho/persistence';
|
|
3
|
+
import { buildSeoFieldMap, resolveSeoField } from '@krantho/seo-shared';
|
|
4
|
+
import { PUBLIC_MACHINE_READ_CACHE_CONTROL } from '../public-cache.js';
|
|
5
|
+
/**
|
|
6
|
+
* Canonical paths for the SEO routes registered in `create-api-handlers.ts`.
|
|
7
|
+
*
|
|
8
|
+
* Exported as constants so callers (e.g., the robots.txt handler) reference
|
|
9
|
+
* the same path the router registers, preventing drift if a route is renamed.
|
|
10
|
+
*/
|
|
11
|
+
export const SEO_SITEMAP_PATH = '/api/seo/sitemap';
|
|
12
|
+
/** Where a site serves the sitemap — the address robots.txt names; the site routes it to SEO_SITEMAP_PATH */
|
|
13
|
+
export const SITEMAP_PUBLIC_PATH = '/sitemap.xml';
|
|
14
|
+
export const SEO_SITEMAP_JSON_PATH = '/api/seo/sitemap.json';
|
|
15
|
+
export const SEO_ROBOTS_PATH = '/api/seo/robots.txt';
|
|
16
|
+
/**
|
|
17
|
+
* Whether a document asks not to be indexed. The field name is resolved
|
|
18
|
+
* dynamically so CMS schemas with different conventions (e.g. `robots-index`
|
|
19
|
+
* vs `noindex`) all work.
|
|
20
|
+
*/
|
|
21
|
+
export function isNoindex(fields) {
|
|
22
|
+
const fieldMap = buildSeoFieldMap(Object.keys(fields));
|
|
23
|
+
const robotsField = fieldMap.robotsIndex;
|
|
24
|
+
if (!robotsField)
|
|
25
|
+
return false;
|
|
26
|
+
const rawValue = fields[robotsField];
|
|
27
|
+
if (rawValue === false || rawValue === 'false' || rawValue === 'noindex')
|
|
28
|
+
return true;
|
|
29
|
+
// resolveSeoField returns strings; the raw false/string cases are handled above
|
|
30
|
+
const resolved = resolveSeoField(fieldMap, 'robotsIndex', fields);
|
|
31
|
+
return resolved === 'false' || resolved === 'noindex';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Build the list of sitemap URLs from the handler's content config.
|
|
35
|
+
*
|
|
36
|
+
* Pure: reads from the context, returns an array. No side effects. This is
|
|
37
|
+
* the shared core used by both `seoSitemap` (XML output) and `seoSitemapJson`
|
|
38
|
+
* (JSON output for the Studio preview), plus any future consumer that needs
|
|
39
|
+
* the url list.
|
|
40
|
+
*
|
|
41
|
+
* Iterates every published item in every collection that renders pages
|
|
42
|
+
* (`rendersPages()`), skips noindex pages (resolved via the dynamic field map
|
|
43
|
+
* so CMS field names can differ), and derives the URL with `documentPath()`
|
|
44
|
+
* from the collection's `path` — or, without one, `pages` items at the site
|
|
45
|
+
* root (the `home` page is the homepage) and other collections under their
|
|
46
|
+
* name (`/{name}/slug`). A path is listed once: the homepage, and a fixed-path
|
|
47
|
+
* collection whose documents share one page.
|
|
48
|
+
*/
|
|
49
|
+
export async function buildSitemapUrls(ctx) {
|
|
50
|
+
const baseUrl = ctx.config.site.baseUrl.replace(/\/$/, '');
|
|
51
|
+
const urls = [];
|
|
52
|
+
const listed = new Set();
|
|
53
|
+
for (const [name, collection] of ctx.contentConfig.collections) {
|
|
54
|
+
if (!rendersPages(collection))
|
|
55
|
+
continue;
|
|
56
|
+
if (!canReadPublished(ctx.adapter))
|
|
57
|
+
continue;
|
|
58
|
+
try {
|
|
59
|
+
// The live version of each document: a page with a newer draft stays
|
|
60
|
+
// listed, and an unpublished page drops out
|
|
61
|
+
const { items } = await ctx.adapter.query({
|
|
62
|
+
state: 'published',
|
|
63
|
+
projection: 'summary',
|
|
64
|
+
collections: [name],
|
|
65
|
+
});
|
|
66
|
+
for (const item of items) {
|
|
67
|
+
if (isNoindex(item.fields))
|
|
68
|
+
continue;
|
|
69
|
+
const path = documentPath(collection, item.meta.slug);
|
|
70
|
+
if (path === null || listed.has(path))
|
|
71
|
+
continue;
|
|
72
|
+
listed.add(path);
|
|
73
|
+
// Each save writes a new version, so the live version's `createdAt` is
|
|
74
|
+
// when the page last changed: an editor's publish, or for an imported
|
|
75
|
+
// file its last commit (`generateContentDates`)
|
|
76
|
+
const lastmod = w3cDatetime(item.meta.createdAt);
|
|
77
|
+
const home = path === '/';
|
|
78
|
+
urls.push({
|
|
79
|
+
loc: `${baseUrl}${path}`,
|
|
80
|
+
...(lastmod ? { lastmod } : {}),
|
|
81
|
+
changefreq: home || name === 'pages' ? 'weekly' : 'monthly',
|
|
82
|
+
priority: home ? '1.0' : name === 'pages' ? '0.8' : '0.6',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Collection may not support listing
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return withHomepageFirst(urls, baseUrl);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* A timestamp as the sitemap protocol's W3C Datetime, in UTC with full time
|
|
94
|
+
* (`2026-09-30T22:17:06.000Z`), or undefined when there is none to give.
|
|
95
|
+
*/
|
|
96
|
+
function w3cDatetime(value) {
|
|
97
|
+
const time = value ? Date.parse(value) : Number.NaN;
|
|
98
|
+
return Number.isNaN(time) ? undefined : new Date(time).toISOString();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The homepage leads the list. A document that renders `/` supplies its entry,
|
|
102
|
+
* with its `lastmod`; without one, the site's root is listed bare.
|
|
103
|
+
*/
|
|
104
|
+
function withHomepageFirst(urls, baseUrl) {
|
|
105
|
+
const homeLoc = `${baseUrl}/`;
|
|
106
|
+
const home = urls.find((url) => url.loc === homeLoc) ?? {
|
|
107
|
+
loc: homeLoc,
|
|
108
|
+
changefreq: 'weekly',
|
|
109
|
+
priority: '1.0',
|
|
110
|
+
};
|
|
111
|
+
return [home, ...urls.filter((url) => url.loc !== homeLoc)];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Serialize a list of sitemap URLs to XML.
|
|
115
|
+
*
|
|
116
|
+
* Exported so tests can drive the serializer directly without needing to
|
|
117
|
+
* stub the full ApiContext. Also used by the XML handler below.
|
|
118
|
+
*/
|
|
119
|
+
export function serializeSitemapXml(urls) {
|
|
120
|
+
const urlEntries = urls
|
|
121
|
+
.map((u) => {
|
|
122
|
+
const parts = [` <loc>${escapeXml(u.loc)}</loc>`];
|
|
123
|
+
if (u.lastmod)
|
|
124
|
+
parts.push(` <lastmod>${u.lastmod}</lastmod>`);
|
|
125
|
+
parts.push(` <changefreq>${u.changefreq}</changefreq>`);
|
|
126
|
+
parts.push(` <priority>${u.priority}</priority>`);
|
|
127
|
+
return ` <url>\n${parts.join('\n')}\n </url>`;
|
|
128
|
+
})
|
|
129
|
+
.join('\n');
|
|
130
|
+
return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urlEntries}\n</urlset>`;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* GET /api/seo/sitemap — generate sitemap XML dynamically from all collections.
|
|
134
|
+
*
|
|
135
|
+
* Lists all published content across the collections that render pages, at
|
|
136
|
+
* site.baseUrl + `documentPath()`. Excludes collections without pages and
|
|
137
|
+
* noindex pages.
|
|
138
|
+
*/
|
|
139
|
+
export const seoSitemap = async (_req, ctx) => {
|
|
140
|
+
const urls = await buildSitemapUrls(ctx);
|
|
141
|
+
return {
|
|
142
|
+
status: 200,
|
|
143
|
+
body: serializeSitemapXml(urls),
|
|
144
|
+
headers: {
|
|
145
|
+
'content-type': 'application/xml; charset=utf-8',
|
|
146
|
+
'cache-control': PUBLIC_MACHINE_READ_CACHE_CONTROL,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* GET /api/seo/sitemap.json — same url list as the XML handler, served as JSON.
|
|
152
|
+
*
|
|
153
|
+
* Used by Studio's Structure → Sitemap & Robots tab to render a sortable table
|
|
154
|
+
* without parsing XML client-side. Not intended as a public SEO endpoint —
|
|
155
|
+
* search engines consume the XML at `/api/seo/sitemap` (or wherever your
|
|
156
|
+
* framework rewrites it, e.g. `/sitemap.xml`).
|
|
157
|
+
*/
|
|
158
|
+
export const seoSitemapJson = async (_req, ctx) => {
|
|
159
|
+
const urls = await buildSitemapUrls(ctx);
|
|
160
|
+
return {
|
|
161
|
+
status: 200,
|
|
162
|
+
body: { urls },
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Escape XML special characters for use inside `<loc>` element values.
|
|
167
|
+
*
|
|
168
|
+
* Intentionally minimal: only escapes the three characters that XML treats
|
|
169
|
+
* as control characters in element content (`&`, `<`, `>`). Quote characters
|
|
170
|
+
* (`'` and `"`) are not escaped because we never embed values inside attribute
|
|
171
|
+
* contexts in this sitemap output — every interpolated value goes between
|
|
172
|
+
* element tags. If you start emitting values inside attributes (e.g.
|
|
173
|
+
* `<image:image href="...">`), extend this to also escape `'` and `"`.
|
|
174
|
+
*/
|
|
175
|
+
function escapeXml(str) {
|
|
176
|
+
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=seo-sitemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-sitemap.js","sourceRoot":"","sources":["../../src/handlers/seo-sitemap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-status.d.ts","sourceRoot":"","sources":["../../src/handlers/seo-status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAuD7C,qDAAqD;AACrD,eAAO,MAAM,SAAS,EAAE,UAevB,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
async function checkJsonFile(filePath, countKey) {
|
|
4
|
+
let raw;
|
|
5
|
+
try {
|
|
6
|
+
raw = await readFile(filePath, 'utf-8');
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return { exists: false };
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const data = JSON.parse(raw);
|
|
13
|
+
let count = 0;
|
|
14
|
+
if (Array.isArray(data)) {
|
|
15
|
+
count = data.length;
|
|
16
|
+
}
|
|
17
|
+
else if (data && typeof data === 'object') {
|
|
18
|
+
count = Object.keys(data).length;
|
|
19
|
+
}
|
|
20
|
+
return { exists: true, [countKey]: count };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// File exists but contains invalid JSON
|
|
24
|
+
return { exists: true, [countKey]: 0 };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function checkTextFile(filePath) {
|
|
28
|
+
try {
|
|
29
|
+
const info = await stat(filePath);
|
|
30
|
+
return { exists: true, bytes: info.size };
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return { exists: false };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function checkSitemapFile(filePath) {
|
|
37
|
+
try {
|
|
38
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
39
|
+
const urls = (raw.match(/<url>/g) ?? []).length;
|
|
40
|
+
return { exists: true, urls };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return { exists: false };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** GET /api/seo/status — SEO file status overview */
|
|
47
|
+
export const seoStatus = async (_req, ctx) => {
|
|
48
|
+
const basePath = ctx.config.paths.seoGeneratedDir;
|
|
49
|
+
const [structuredData, faqPages, llmsTxt, sitemap, contentDates] = await Promise.all([
|
|
50
|
+
checkJsonFile(join(basePath, 'structured-data.json'), 'entries'),
|
|
51
|
+
checkJsonFile(join(basePath, 'faq-pages.json'), 'routes'),
|
|
52
|
+
checkTextFile(join(basePath, 'llms.txt')),
|
|
53
|
+
checkSitemapFile(join(basePath, 'sitemap.xml')),
|
|
54
|
+
checkJsonFile(join(basePath, 'content-dates.json'), 'entries'),
|
|
55
|
+
]);
|
|
56
|
+
return {
|
|
57
|
+
status: 200,
|
|
58
|
+
body: { structuredData, faqPages, llmsTxt, sitemap, contentDates },
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=seo-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-status.js","sourceRoot":"","sources":["../../src/handlers/seo-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-structured-data.d.ts","sourceRoot":"","sources":["../../src/handlers/seo-structured-data.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,UAa/B,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/** GET /api/seo/structured-data — return generated structured-data.json */
|
|
4
|
+
export const seoStructuredData = async (_req, ctx) => {
|
|
5
|
+
const basePath = ctx.config.paths.seoGeneratedDir;
|
|
6
|
+
try {
|
|
7
|
+
const raw = await readFile(join(basePath, 'structured-data.json'), 'utf-8');
|
|
8
|
+
const data = JSON.parse(raw);
|
|
9
|
+
return { status: 200, body: data };
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {
|
|
13
|
+
status: 404,
|
|
14
|
+
body: { error: 'structured-data.json not found — run seo:generate to create it' },
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=seo-structured-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-structured-data.js","sourceRoot":"","sources":["../../src/handlers/seo-structured-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAe,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAA;IAEjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EAAE,OAAO,CAAC,CAAA;QAC3E,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,EAAE,KAAK,EAAE,gEAAgE,EAAE;SAClF,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ApiHandler } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/site-config — the browser-safe configuration (`PublicConfig`: site
|
|
4
|
+
* identity, SEO limits and readers, features, page-cache settings) and the
|
|
5
|
+
* collection schemas
|
|
6
|
+
*/
|
|
7
|
+
export declare const siteConfigHandler: ApiHandler;
|
|
8
|
+
//# sourceMappingURL=site-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-config.d.ts","sourceRoot":"","sources":["../../src/handlers/site-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAwB/B,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { toPublicConfig } from '@krantho/config/public';
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/site-config — the browser-safe configuration (`PublicConfig`: site
|
|
4
|
+
* identity, SEO limits and readers, features, page-cache settings) and the
|
|
5
|
+
* collection schemas
|
|
6
|
+
*/
|
|
7
|
+
export const siteConfigHandler = async (_req, ctx) => {
|
|
8
|
+
const collections = [];
|
|
9
|
+
for (const [name, collection] of ctx.contentConfig.collections) {
|
|
10
|
+
const schema = collection.schema;
|
|
11
|
+
let fieldCount = 0;
|
|
12
|
+
if (schema && 'shape' in schema && typeof schema.shape === 'object' && schema.shape) {
|
|
13
|
+
fieldCount = Object.keys(schema.shape).length;
|
|
14
|
+
}
|
|
15
|
+
collections.push({
|
|
16
|
+
name,
|
|
17
|
+
source: collection.source,
|
|
18
|
+
fieldCount,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
status: 200,
|
|
23
|
+
body: { ...toPublicConfig(ctx.config), collections },
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=site-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-config.js","sourceRoot":"","sources":["../../src/handlers/site-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAGvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAe,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/D,MAAM,WAAW,GAIZ,EAAE,CAAA;IAEP,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAChC,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACpF,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;QAC/C,CAAC;QACD,WAAW,CAAC,IAAI,CAAC;YACf,IAAI;YACJ,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE;KACrD,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ApiHandler } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/preview?collection=&slug= — may this user preview the document on
|
|
4
|
+
* the site, and at which path? Registered when the host renders drafts for
|
|
5
|
+
* editors (`sitePreview`). In `draft-mode` it answers `{ path }` and the host
|
|
6
|
+
* turns that into its own preview mode; in `signed-url` it sends the editor to
|
|
7
|
+
* the page with a short-lived token bound to that path.
|
|
8
|
+
*/
|
|
9
|
+
export declare const sitePreview: ApiHandler;
|
|
10
|
+
//# sourceMappingURL=site-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-preview.d.ts","sourceRoot":"","sources":["../../src/handlers/site-preview.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,aAAa,CAAA;AAM1D;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,UAezB,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { documentPath, resolveSitePath } from '@krantho/core';
|
|
2
|
+
import { requireRole } from '../permissions.js';
|
|
3
|
+
import { PREVIEW_PARAM, signPreviewToken } from '../preview-token.js';
|
|
4
|
+
import { requireParam, validateCollectionParam } from '../validators.js';
|
|
5
|
+
/** Any fixed origin: only the path of the redirect matters, and it must stay on it */
|
|
6
|
+
const SITE_ORIGIN = 'http://localhost';
|
|
7
|
+
/**
|
|
8
|
+
* GET /api/preview?collection=&slug= — may this user preview the document on
|
|
9
|
+
* the site, and at which path? Registered when the host renders drafts for
|
|
10
|
+
* editors (`sitePreview`). In `draft-mode` it answers `{ path }` and the host
|
|
11
|
+
* turns that into its own preview mode; in `signed-url` it sends the editor to
|
|
12
|
+
* the page with a short-lived token bound to that path.
|
|
13
|
+
*/
|
|
14
|
+
export const sitePreview = async (req, ctx) => {
|
|
15
|
+
const denied = requireRole(ctx.auth, 'editor');
|
|
16
|
+
if (denied)
|
|
17
|
+
return denied;
|
|
18
|
+
const validated = validateCollectionParam(req.query['collection'], ctx);
|
|
19
|
+
if (!validated.isValid)
|
|
20
|
+
return validated.response;
|
|
21
|
+
const slugResult = requireParam(req.query, 'slug');
|
|
22
|
+
if (!slugResult.isValid)
|
|
23
|
+
return slugResult.response;
|
|
24
|
+
const path = documentPath(validated.collectionDef, slugResult.value);
|
|
25
|
+
if (path === null) {
|
|
26
|
+
return { status: 400, body: { error: `"${validated.collection}" has no pages to preview` } };
|
|
27
|
+
}
|
|
28
|
+
if (ctx.sitePreview !== 'signed-url')
|
|
29
|
+
return { status: 200, body: { path } };
|
|
30
|
+
return signedRedirect(path, ctx.config.auth.jwtSecret);
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Send the editor to the page with a token signed for its path. The path is
|
|
34
|
+
* resolved as the browser will request it, and must stay on the site: a slug
|
|
35
|
+
* that normalises to another host (`..//host`) gets no link and no token.
|
|
36
|
+
*/
|
|
37
|
+
function signedRedirect(path, secret) {
|
|
38
|
+
// The API always resolves a signing secret (configured or ephemeral); never sign without one
|
|
39
|
+
if (!secret)
|
|
40
|
+
return { status: 500, body: { error: 'No signing secret for preview links' } };
|
|
41
|
+
const target = resolveSitePath(path, SITE_ORIGIN);
|
|
42
|
+
if (!target)
|
|
43
|
+
return { status: 400, body: { error: 'The page path leaves the site' } };
|
|
44
|
+
const token = signPreviewToken(target.pathname, secret);
|
|
45
|
+
return {
|
|
46
|
+
status: 307,
|
|
47
|
+
body: null,
|
|
48
|
+
headers: {
|
|
49
|
+
location: `${target.pathname}?${new URLSearchParams({ [PREVIEW_PARAM]: token })}`,
|
|
50
|
+
'cache-control': 'no-store',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=site-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-preview.js","sourceRoot":"","sources":["../../src/handlers/site-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAErE,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAExE,sFAAsF;AACtF,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC9C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAA;IACvE,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC,QAAQ,CAAA;IACjD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAClD,IAAI,CAAC,UAAU,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAA;IAEnD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACpE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,UAAU,2BAA2B,EAAE,EAAE,CAAA;IAC9F,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,YAAY;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAA;IAC5E,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACxD,CAAC,CAAA;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,MAA0B;IAC9D,6FAA6F;IAC7F,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,qCAAqC,EAAE,EAAE,CAAA;IAC3F,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,CAAA;IACrF,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACvD,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,eAAe,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;YACjF,eAAe,EAAE,UAAU;SAC5B;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ApiHandler } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/settings/locales — the site's locales.
|
|
4
|
+
*
|
|
5
|
+
* The default locale is always the configuration's `site.defaultLocale`.
|
|
6
|
+
* `configuredLocales` are the locales the configuration lists; `supportedLocales`
|
|
7
|
+
* are the active ones (`activeLocales`).
|
|
8
|
+
*/
|
|
9
|
+
export declare const getLocaleSettings: ApiHandler;
|
|
10
|
+
/**
|
|
11
|
+
* PUT /api/settings/locales — choose which of the configured locales are active.
|
|
12
|
+
*
|
|
13
|
+
* The body is `{ supportedLocales: string[] }`. The default locale is the
|
|
14
|
+
* configuration's and is not set here.
|
|
15
|
+
*/
|
|
16
|
+
export declare const updateLocaleSettings: ApiHandler;
|
|
17
|
+
//# sourceMappingURL=site-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-settings.d.ts","sourceRoot":"","sources":["../../src/handlers/site-settings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAa/B,CAAA;AAoBD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAiClC,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { activeLocales } from '../active-locales.js';
|
|
2
|
+
import { requireRole } from '../permissions.js';
|
|
3
|
+
import { validateRequestBody } from '../validators.js';
|
|
4
|
+
/**
|
|
5
|
+
* GET /api/settings/locales — the site's locales.
|
|
6
|
+
*
|
|
7
|
+
* The default locale is always the configuration's `site.defaultLocale`.
|
|
8
|
+
* `configuredLocales` are the locales the configuration lists; `supportedLocales`
|
|
9
|
+
* are the active ones (`activeLocales`).
|
|
10
|
+
*/
|
|
11
|
+
export const getLocaleSettings = async (_req, ctx) => {
|
|
12
|
+
const { defaultLocale, supportedLocales: configuredLocales } = ctx.config.site;
|
|
13
|
+
const { locales, stored } = await activeLocales(ctx);
|
|
14
|
+
return {
|
|
15
|
+
status: 200,
|
|
16
|
+
body: {
|
|
17
|
+
defaultLocale,
|
|
18
|
+
configuredLocales,
|
|
19
|
+
supportedLocales: locales,
|
|
20
|
+
source: stored ? 'database' : 'config',
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
/** The reason a list of active locales is not valid for the site, or null */
|
|
25
|
+
function localeListError(locales, configured, defaultLocale) {
|
|
26
|
+
if (locales.length === 0)
|
|
27
|
+
return 'At least one locale is required';
|
|
28
|
+
if (new Set(locales).size !== locales.length)
|
|
29
|
+
return 'The list names a locale more than once';
|
|
30
|
+
const unknown = locales.filter((locale) => !configured.includes(locale));
|
|
31
|
+
if (unknown.length > 0) {
|
|
32
|
+
return `${unknown.join(', ')} is not in site.supportedLocales in the configuration (${configured.join(', ')})`;
|
|
33
|
+
}
|
|
34
|
+
if (!locales.includes(defaultLocale)) {
|
|
35
|
+
return `The default locale ${defaultLocale} must stay active`;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* PUT /api/settings/locales — choose which of the configured locales are active.
|
|
41
|
+
*
|
|
42
|
+
* The body is `{ supportedLocales: string[] }`. The default locale is the
|
|
43
|
+
* configuration's and is not set here.
|
|
44
|
+
*/
|
|
45
|
+
export const updateLocaleSettings = async (req, ctx) => {
|
|
46
|
+
const denied = requireRole(ctx.auth, 'admin');
|
|
47
|
+
if (denied)
|
|
48
|
+
return denied;
|
|
49
|
+
if (!ctx.siteSettingsAdapter) {
|
|
50
|
+
return { status: 501, body: { error: 'Site settings storage not available' } };
|
|
51
|
+
}
|
|
52
|
+
const bodyCheck = validateRequestBody(req.body);
|
|
53
|
+
if (!bodyCheck.isValid)
|
|
54
|
+
return bodyCheck.response;
|
|
55
|
+
const payload = bodyCheck.body;
|
|
56
|
+
const requested = payload['supportedLocales'];
|
|
57
|
+
if (!Array.isArray(requested) || !requested.every((l) => typeof l === 'string')) {
|
|
58
|
+
return { status: 400, body: { error: 'supportedLocales must be an array of locale codes' } };
|
|
59
|
+
}
|
|
60
|
+
const { defaultLocale, supportedLocales: configuredLocales } = ctx.config.site;
|
|
61
|
+
const error = localeListError(requested, configuredLocales, defaultLocale);
|
|
62
|
+
if (error)
|
|
63
|
+
return { status: 400, body: { error } };
|
|
64
|
+
await ctx.siteSettingsAdapter.setSetting('supportedLocales', JSON.stringify(requested));
|
|
65
|
+
return {
|
|
66
|
+
status: 200,
|
|
67
|
+
body: {
|
|
68
|
+
defaultLocale,
|
|
69
|
+
configuredLocales,
|
|
70
|
+
supportedLocales: requested,
|
|
71
|
+
source: 'database',
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=site-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-settings.js","sourceRoot":"","sources":["../../src/handlers/site-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-create.d.ts","sourceRoot":"","sources":["../../src/handlers/snapshot-create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,yDAAyD;AACzD,eAAO,MAAM,cAAc,EAAE,UAa5B,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { requireRole } from '../permissions.js';
|
|
2
|
+
/** POST /api/checkpoints — create a manual checkpoint */
|
|
3
|
+
export const snapshotCreate = async (req, ctx) => {
|
|
4
|
+
const denied = requireRole(ctx.auth, 'editor');
|
|
5
|
+
if (denied)
|
|
6
|
+
return denied;
|
|
7
|
+
if (!ctx.checkpointAdapter) {
|
|
8
|
+
return { status: 501, body: { error: 'Checkpoint system not configured' } };
|
|
9
|
+
}
|
|
10
|
+
const body = req.body;
|
|
11
|
+
const name = typeof body?.name === 'string' ? body.name : undefined;
|
|
12
|
+
const checkpoint = await ctx.checkpointAdapter.createCheckpoint(name, 'manual');
|
|
13
|
+
return { status: 201, body: checkpoint };
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=snapshot-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-create.js","sourceRoot":"","sources":["../../src/handlers/snapshot-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC9C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,CAAA;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAqC,CAAA;IACtD,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IAEnE,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC/E,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC1C,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-delete.d.ts","sourceRoot":"","sources":["../../src/handlers/snapshot-delete.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,6DAA6D;AAC7D,eAAO,MAAM,cAAc,EAAE,UAkB5B,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { requireRole } from '../permissions.js';
|
|
2
|
+
import { parseCheckpointVersion } from '../validators.js';
|
|
3
|
+
/** DELETE /api/checkpoints/:version — delete a checkpoint */
|
|
4
|
+
export const snapshotDelete = async (req, ctx) => {
|
|
5
|
+
const denied = requireRole(ctx.auth, 'admin');
|
|
6
|
+
if (denied)
|
|
7
|
+
return denied;
|
|
8
|
+
if (!ctx.checkpointAdapter) {
|
|
9
|
+
return { status: 501, body: { error: 'Checkpoint system not configured' } };
|
|
10
|
+
}
|
|
11
|
+
const parsed = parseCheckpointVersion(req.params);
|
|
12
|
+
if (!parsed.isValid)
|
|
13
|
+
return parsed.response;
|
|
14
|
+
const { version } = parsed;
|
|
15
|
+
const deleted = await ctx.checkpointAdapter.deleteCheckpoint(version);
|
|
16
|
+
if (!deleted) {
|
|
17
|
+
return { status: 404, body: { error: `Checkpoint version ${version} not found` } };
|
|
18
|
+
}
|
|
19
|
+
return { status: 200, body: { deleted: true, version } };
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=snapshot-delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-delete.js","sourceRoot":"","sources":["../../src/handlers/snapshot-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,CAAA;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAE1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACrE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,sBAAsB,OAAO,YAAY,EAAE,EAAE,CAAA;IACpF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;AAC1D,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-get.d.ts","sourceRoot":"","sources":["../../src/handlers/snapshot-get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,6DAA6D;AAC7D,eAAO,MAAM,WAAW,EAAE,UAezB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { parseCheckpointVersion } from '../validators.js';
|
|
2
|
+
/** GET /api/checkpoints/:version — get checkpoint details */
|
|
3
|
+
export const snapshotGet = async (req, ctx) => {
|
|
4
|
+
if (!ctx.checkpointAdapter) {
|
|
5
|
+
return { status: 501, body: { error: 'Checkpoint system not configured' } };
|
|
6
|
+
}
|
|
7
|
+
const parsed = parseCheckpointVersion(req.params);
|
|
8
|
+
if (!parsed.isValid)
|
|
9
|
+
return parsed.response;
|
|
10
|
+
const { version } = parsed;
|
|
11
|
+
const checkpoint = await ctx.checkpointAdapter.getCheckpoint(version);
|
|
12
|
+
if (!checkpoint) {
|
|
13
|
+
return { status: 404, body: { error: `Checkpoint version ${version} not found` } };
|
|
14
|
+
}
|
|
15
|
+
return { status: 200, body: checkpoint };
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=snapshot-get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-get.js","sourceRoot":"","sources":["../../src/handlers/snapshot-get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACxD,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,CAAA;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAE1B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,sBAAsB,OAAO,YAAY,EAAE,EAAE,CAAA;IACpF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC1C,CAAC,CAAA"}
|