@krantho/api 0.0.0-stage → 1.0.1
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 +51 -3
- package/README.md +0 -3
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { MediaSection } from '@krantho/config';
|
|
2
|
+
import type { ImageFormat, ImagePreset } from './image-presets.js';
|
|
3
|
+
/** Result of normalizing an uploaded image */
|
|
4
|
+
export interface NormalizeResult {
|
|
5
|
+
buffer: Buffer;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
mimeType: string;
|
|
9
|
+
}
|
|
10
|
+
/** Result of generating an image variant */
|
|
11
|
+
export interface VariantResult {
|
|
12
|
+
bytes: Buffer;
|
|
13
|
+
contentType: string;
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
}
|
|
17
|
+
/** Dimension overrides for cropping and hotspot */
|
|
18
|
+
export interface DimensionOverrides {
|
|
19
|
+
aspectRatio?: string | undefined;
|
|
20
|
+
/** Crop region as percentages (0-100) — applied before resize */
|
|
21
|
+
crop?: {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
} | undefined;
|
|
27
|
+
/** Hotspot center + ellipse for adaptive aspect-ratio cropping (0-100%) */
|
|
28
|
+
hotspot?: {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
} | undefined;
|
|
34
|
+
}
|
|
35
|
+
/** Image processing settings, as the configuration tree declares them */
|
|
36
|
+
export type ImageSettings = MediaSection['image'];
|
|
37
|
+
/**
|
|
38
|
+
* Image processing pipeline using sharp.
|
|
39
|
+
*
|
|
40
|
+
* Handles upload normalization (EXIF, cap dimensions, JPEG re-encode)
|
|
41
|
+
* and on-demand variant generation (resize to preset, format conversion).
|
|
42
|
+
*/
|
|
43
|
+
export declare class ImageOptimizer {
|
|
44
|
+
private readonly settings;
|
|
45
|
+
private sharpFn;
|
|
46
|
+
constructor(settings: ImageSettings);
|
|
47
|
+
/**
|
|
48
|
+
* Normalize an uploaded image:
|
|
49
|
+
* 1. Auto-orient from EXIF
|
|
50
|
+
* 2. Cap width to maxWidth
|
|
51
|
+
* 3. Re-encode as JPEG at the configured normalize quality
|
|
52
|
+
*
|
|
53
|
+
* Returns the normalized buffer and detected dimensions.
|
|
54
|
+
* Skips normalization for SVG (returns input unchanged).
|
|
55
|
+
*/
|
|
56
|
+
normalize(buffer: Uint8Array, mimeType: string): Promise<NormalizeResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Generate a resized variant for serving.
|
|
59
|
+
*
|
|
60
|
+
* Resizes to the preset width (preserving aspect ratio) and encodes
|
|
61
|
+
* to the requested format. If overrides specify an aspect ratio,
|
|
62
|
+
* applies center crop before resizing.
|
|
63
|
+
*/
|
|
64
|
+
generateVariant(buffer: Uint8Array, preset: ImagePreset, format: ImageFormat, overrides?: DimensionOverrides): Promise<VariantResult>;
|
|
65
|
+
/** Pixel width for a preset. Null means serve at the original size. */
|
|
66
|
+
private presetWidth;
|
|
67
|
+
/** Apply a percentage-based crop region, converting to pixel coordinates */
|
|
68
|
+
private applyCrop;
|
|
69
|
+
/**
|
|
70
|
+
* Hotspot-aware aspect crop: crop to a target aspect ratio, keeping the
|
|
71
|
+
* hotspot center visible. Then resize to target width.
|
|
72
|
+
*
|
|
73
|
+
* Only the hotspot center (x, y) is used for positioning. The hotspot
|
|
74
|
+
* width/height (ellipse) are stored for Studio visualization but do not
|
|
75
|
+
* affect the image processing.
|
|
76
|
+
*
|
|
77
|
+
* Example: a 3:2 landscape photo served as 1:1 thumbnail — the crop
|
|
78
|
+
* centers on the hotspot instead of the image center.
|
|
79
|
+
*/
|
|
80
|
+
private applyHotspotCrop;
|
|
81
|
+
/** Lazy-load sharp to avoid loading native bindings until needed */
|
|
82
|
+
private getSharp;
|
|
83
|
+
}
|
|
84
|
+
/** Compute an ETag from image bytes (first 8 chars of SHA-256) */
|
|
85
|
+
export declare function computeEtag(bytes: Uint8Array): string;
|
|
86
|
+
//# sourceMappingURL=image-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-optimizer.d.ts","sourceRoot":"","sources":["../src/image-optimizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKlE,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,iEAAiE;IACjE,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IAC1E,2EAA2E;IAC3E,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;CAC9E;AAED,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;AAKjD;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,OAAO,CAAqB;gBAExB,QAAQ,EAAE,aAAa;IAInC;;;;;;;;OAQG;IACG,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB/E;;;;;;OAMG;IACG,eAAe,CACnB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,aAAa,CAAC;IA0EzB,uEAAuE;IACvE,OAAO,CAAC,WAAW;IAInB,4EAA4E;YAC9D,SAAS;IAmBvB;;;;;;;;;;OAUG;YACW,gBAAgB;IA2C9B,oEAAoE;YACtD,QAAQ;CAOvB;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { getContentType } from './image-presets.js';
|
|
3
|
+
// SVG should not be processed by sharp
|
|
4
|
+
const SKIP_NORMALIZE_TYPES = new Set(['image/svg+xml']);
|
|
5
|
+
/**
|
|
6
|
+
* Image processing pipeline using sharp.
|
|
7
|
+
*
|
|
8
|
+
* Handles upload normalization (EXIF, cap dimensions, JPEG re-encode)
|
|
9
|
+
* and on-demand variant generation (resize to preset, format conversion).
|
|
10
|
+
*/
|
|
11
|
+
export class ImageOptimizer {
|
|
12
|
+
settings;
|
|
13
|
+
sharpFn;
|
|
14
|
+
constructor(settings) {
|
|
15
|
+
this.settings = settings;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Normalize an uploaded image:
|
|
19
|
+
* 1. Auto-orient from EXIF
|
|
20
|
+
* 2. Cap width to maxWidth
|
|
21
|
+
* 3. Re-encode as JPEG at the configured normalize quality
|
|
22
|
+
*
|
|
23
|
+
* Returns the normalized buffer and detected dimensions.
|
|
24
|
+
* Skips normalization for SVG (returns input unchanged).
|
|
25
|
+
*/
|
|
26
|
+
async normalize(buffer, mimeType) {
|
|
27
|
+
if (SKIP_NORMALIZE_TYPES.has(mimeType)) {
|
|
28
|
+
return {
|
|
29
|
+
buffer: Buffer.from(buffer),
|
|
30
|
+
width: 0,
|
|
31
|
+
height: 0,
|
|
32
|
+
mimeType,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const sharpFn = await this.getSharp();
|
|
36
|
+
const result = await sharpFn(Buffer.from(buffer))
|
|
37
|
+
.rotate() // Auto-orient from EXIF
|
|
38
|
+
.resize({ width: this.settings.maxWidth, withoutEnlargement: true })
|
|
39
|
+
.jpeg({ quality: this.settings.quality.normalize })
|
|
40
|
+
.toBuffer({ resolveWithObject: true });
|
|
41
|
+
return {
|
|
42
|
+
buffer: result.data,
|
|
43
|
+
width: result.info.width,
|
|
44
|
+
height: result.info.height,
|
|
45
|
+
mimeType: 'image/jpeg',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generate a resized variant for serving.
|
|
50
|
+
*
|
|
51
|
+
* Resizes to the preset width (preserving aspect ratio) and encodes
|
|
52
|
+
* to the requested format. If overrides specify an aspect ratio,
|
|
53
|
+
* applies center crop before resizing.
|
|
54
|
+
*/
|
|
55
|
+
async generateVariant(buffer, preset, format, overrides) {
|
|
56
|
+
const sharpFn = await this.getSharp();
|
|
57
|
+
const targetWidth = this.presetWidth(preset);
|
|
58
|
+
let pipeline = sharpFn(Buffer.from(buffer)).rotate();
|
|
59
|
+
// Hotspot-aware aspect crop takes precedence over explicit crop — they are
|
|
60
|
+
// mutually exclusive because hotspot crop operates on the original image coordinates.
|
|
61
|
+
if (overrides?.hotspot && overrides.aspectRatio && targetWidth) {
|
|
62
|
+
const [wRatio, hRatio] = parseAspectRatio(overrides.aspectRatio);
|
|
63
|
+
if (wRatio && hRatio) {
|
|
64
|
+
pipeline = await this.applyHotspotCrop(pipeline, buffer, overrides.hotspot, wRatio / hRatio, targetWidth);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Apply percentage-based crop region when hotspot+aspect is not active
|
|
69
|
+
if (overrides?.crop) {
|
|
70
|
+
pipeline = await this.applyCrop(pipeline, buffer, overrides.crop);
|
|
71
|
+
}
|
|
72
|
+
if (overrides?.aspectRatio) {
|
|
73
|
+
// Apply explicit aspect ratio crop
|
|
74
|
+
const [wRatio, hRatio] = parseAspectRatio(overrides.aspectRatio);
|
|
75
|
+
if (wRatio && hRatio && targetWidth) {
|
|
76
|
+
const targetHeight = Math.round(targetWidth * (hRatio / wRatio));
|
|
77
|
+
pipeline = pipeline.resize({
|
|
78
|
+
width: targetWidth,
|
|
79
|
+
height: targetHeight,
|
|
80
|
+
fit: 'cover',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (targetWidth) {
|
|
85
|
+
// Standard resize — preserve aspect ratio, no upscaling
|
|
86
|
+
pipeline = pipeline.resize({
|
|
87
|
+
width: targetWidth,
|
|
88
|
+
withoutEnlargement: true,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// 'full' preset: no resize at all
|
|
92
|
+
}
|
|
93
|
+
// Encode to target format
|
|
94
|
+
switch (format) {
|
|
95
|
+
case 'webp':
|
|
96
|
+
pipeline = pipeline.webp({ quality: this.settings.quality.webp });
|
|
97
|
+
break;
|
|
98
|
+
case 'jpeg':
|
|
99
|
+
pipeline = pipeline.jpeg({ quality: this.settings.quality.jpeg });
|
|
100
|
+
break;
|
|
101
|
+
case 'png':
|
|
102
|
+
pipeline = pipeline.png();
|
|
103
|
+
break;
|
|
104
|
+
case 'avif':
|
|
105
|
+
pipeline = pipeline.avif({ quality: this.settings.quality.avif });
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
const result = await pipeline.toBuffer({ resolveWithObject: true });
|
|
109
|
+
const contentType = getContentType(format);
|
|
110
|
+
return {
|
|
111
|
+
bytes: result.data,
|
|
112
|
+
contentType,
|
|
113
|
+
width: result.info.width,
|
|
114
|
+
height: result.info.height,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Pixel width for a preset. Null means serve at the original size. */
|
|
118
|
+
presetWidth(preset) {
|
|
119
|
+
return this.settings.presets[preset] ?? null;
|
|
120
|
+
}
|
|
121
|
+
/** Apply a percentage-based crop region, converting to pixel coordinates */
|
|
122
|
+
async applyCrop(pipeline, buffer, crop) {
|
|
123
|
+
const sharpFn = await this.getSharp();
|
|
124
|
+
const metadata = await sharpFn(Buffer.from(buffer)).metadata();
|
|
125
|
+
if (metadata.width && metadata.height) {
|
|
126
|
+
const left = Math.round((crop.x / 100) * metadata.width);
|
|
127
|
+
const top = Math.round((crop.y / 100) * metadata.height);
|
|
128
|
+
const width = Math.round((crop.width / 100) * metadata.width);
|
|
129
|
+
const height = Math.round((crop.height / 100) * metadata.height);
|
|
130
|
+
if (width > 0 && height > 0) {
|
|
131
|
+
return pipeline.extract({ left, top, width, height });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return pipeline;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Hotspot-aware aspect crop: crop to a target aspect ratio, keeping the
|
|
138
|
+
* hotspot center visible. Then resize to target width.
|
|
139
|
+
*
|
|
140
|
+
* Only the hotspot center (x, y) is used for positioning. The hotspot
|
|
141
|
+
* width/height (ellipse) are stored for Studio visualization but do not
|
|
142
|
+
* affect the image processing.
|
|
143
|
+
*
|
|
144
|
+
* Example: a 3:2 landscape photo served as 1:1 thumbnail — the crop
|
|
145
|
+
* centers on the hotspot instead of the image center.
|
|
146
|
+
*/
|
|
147
|
+
async applyHotspotCrop(pipeline, buffer, hotspot, targetAspect, targetWidth) {
|
|
148
|
+
const sharpFn = await this.getSharp();
|
|
149
|
+
const metadata = await sharpFn(Buffer.from(buffer)).metadata();
|
|
150
|
+
if (!metadata.width || !metadata.height)
|
|
151
|
+
return pipeline;
|
|
152
|
+
const srcW = metadata.width;
|
|
153
|
+
const srcH = metadata.height;
|
|
154
|
+
const srcAspect = srcW / srcH;
|
|
155
|
+
// Compute the largest crop region at the target aspect that fits the source
|
|
156
|
+
let cropW;
|
|
157
|
+
let cropH;
|
|
158
|
+
if (targetAspect > srcAspect) {
|
|
159
|
+
// Target is wider — constrain by width
|
|
160
|
+
cropW = srcW;
|
|
161
|
+
cropH = Math.round(srcW / targetAspect);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Target is taller — constrain by height
|
|
165
|
+
cropH = srcH;
|
|
166
|
+
cropW = Math.round(srcH * targetAspect);
|
|
167
|
+
}
|
|
168
|
+
// Hotspot center in pixels
|
|
169
|
+
const hotX = Math.round((hotspot.x / 100) * srcW);
|
|
170
|
+
const hotY = Math.round((hotspot.y / 100) * srcH);
|
|
171
|
+
// Center crop on hotspot, clamp to image bounds
|
|
172
|
+
let left = Math.round(hotX - cropW / 2);
|
|
173
|
+
let top = Math.round(hotY - cropH / 2);
|
|
174
|
+
left = Math.max(0, Math.min(left, srcW - cropW));
|
|
175
|
+
top = Math.max(0, Math.min(top, srcH - cropH));
|
|
176
|
+
return pipeline
|
|
177
|
+
.extract({ left, top, width: cropW, height: cropH })
|
|
178
|
+
.resize({ width: targetWidth, withoutEnlargement: true });
|
|
179
|
+
}
|
|
180
|
+
/** Lazy-load sharp to avoid loading native bindings until needed */
|
|
181
|
+
async getSharp() {
|
|
182
|
+
if (!this.sharpFn) {
|
|
183
|
+
const mod = await import('sharp');
|
|
184
|
+
this.sharpFn = mod.default;
|
|
185
|
+
}
|
|
186
|
+
return this.sharpFn;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** Compute an ETag from image bytes (first 8 chars of SHA-256) */
|
|
190
|
+
export function computeEtag(bytes) {
|
|
191
|
+
return createHash('sha256').update(bytes).digest('hex').slice(0, 16);
|
|
192
|
+
}
|
|
193
|
+
/** Parse an aspect ratio string like '16:9' into [16, 9] */
|
|
194
|
+
function parseAspectRatio(ratio) {
|
|
195
|
+
const parts = ratio.split(':');
|
|
196
|
+
const rawW = parts[0];
|
|
197
|
+
const rawH = parts[1];
|
|
198
|
+
if (parts.length !== 2 || !rawW || !rawH)
|
|
199
|
+
return [undefined, undefined];
|
|
200
|
+
const w = Number.parseInt(rawW, 10);
|
|
201
|
+
const h = Number.parseInt(rawH, 10);
|
|
202
|
+
if (Number.isNaN(w) || Number.isNaN(h) || w <= 0 || h <= 0)
|
|
203
|
+
return [undefined, undefined];
|
|
204
|
+
return [w, h];
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=image-optimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-optimizer.js","sourceRoot":"","sources":["../src/image-optimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Image size presets — fixed classes, not arbitrary dimensions */
|
|
2
|
+
export type ImagePreset = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
3
|
+
/** Supported output formats */
|
|
4
|
+
export type ImageFormat = 'webp' | 'jpeg' | 'png' | 'avif';
|
|
5
|
+
/** Parse and validate a preset string. Returns 'md' as default. */
|
|
6
|
+
export declare function parsePreset(value: string | undefined): ImagePreset;
|
|
7
|
+
/** Parse and validate a format string. Negotiates from Accept header if not explicit. */
|
|
8
|
+
export declare function parseFormat(value: string | undefined, acceptHeader: string | undefined): ImageFormat;
|
|
9
|
+
/** Get the content type for a format */
|
|
10
|
+
export declare function getContentType(format: ImageFormat): string;
|
|
11
|
+
/**
|
|
12
|
+
* Clamp an arbitrary pixel width to the nearest preset.
|
|
13
|
+
*
|
|
14
|
+
* 0–64 → xs, 65–160 → sm, 161–384 → md, 385–768 → lg, 769+ → xl
|
|
15
|
+
*/
|
|
16
|
+
export declare function clampToPreset(width: number): ImagePreset;
|
|
17
|
+
//# sourceMappingURL=image-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-presets.d.ts","sourceRoot":"","sources":["../src/image-presets.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;AAEnE,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAY1D,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAGlE;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,WAAW,CAWb;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAMxD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const PRESET_NAMES = new Set(['xs', 'sm', 'md', 'lg', 'xl', 'full']);
|
|
2
|
+
const FORMAT_NAMES = new Set(['webp', 'jpeg', 'png', 'avif']);
|
|
3
|
+
const FORMAT_CONTENT_TYPES = {
|
|
4
|
+
webp: 'image/webp',
|
|
5
|
+
jpeg: 'image/jpeg',
|
|
6
|
+
png: 'image/png',
|
|
7
|
+
avif: 'image/avif',
|
|
8
|
+
};
|
|
9
|
+
/** Parse and validate a preset string. Returns 'md' as default. */
|
|
10
|
+
export function parsePreset(value) {
|
|
11
|
+
if (value && PRESET_NAMES.has(value))
|
|
12
|
+
return value;
|
|
13
|
+
return 'md';
|
|
14
|
+
}
|
|
15
|
+
/** Parse and validate a format string. Negotiates from Accept header if not explicit. */
|
|
16
|
+
export function parseFormat(value, acceptHeader) {
|
|
17
|
+
if (value && FORMAT_NAMES.has(value))
|
|
18
|
+
return value;
|
|
19
|
+
// Negotiate from Accept header — prefer AVIF (smallest), then WebP
|
|
20
|
+
if (acceptHeader) {
|
|
21
|
+
if (acceptHeader.includes('image/avif'))
|
|
22
|
+
return 'avif';
|
|
23
|
+
if (acceptHeader.includes('image/webp'))
|
|
24
|
+
return 'webp';
|
|
25
|
+
if (acceptHeader.includes('image/png'))
|
|
26
|
+
return 'png';
|
|
27
|
+
}
|
|
28
|
+
return 'avif'; // default — best compression
|
|
29
|
+
}
|
|
30
|
+
/** Get the content type for a format */
|
|
31
|
+
export function getContentType(format) {
|
|
32
|
+
return FORMAT_CONTENT_TYPES[format];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Clamp an arbitrary pixel width to the nearest preset.
|
|
36
|
+
*
|
|
37
|
+
* 0–64 → xs, 65–160 → sm, 161–384 → md, 385–768 → lg, 769+ → xl
|
|
38
|
+
*/
|
|
39
|
+
export function clampToPreset(width) {
|
|
40
|
+
if (width <= 64)
|
|
41
|
+
return 'xs';
|
|
42
|
+
if (width <= 160)
|
|
43
|
+
return 'sm';
|
|
44
|
+
if (width <= 384)
|
|
45
|
+
return 'md';
|
|
46
|
+
if (width <= 768)
|
|
47
|
+
return 'lg';
|
|
48
|
+
return 'xl';
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=image-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-presets.js","sourceRoot":"","sources":["../src/image-presets.ts"],"names":[],"mappings":"AAMA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;AAErE,MAAM,oBAAoB,GAAgC;IACxD,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;CACnB,CAAA;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAoB,CAAA;IACjE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,WAAW,CACzB,KAAyB,EACzB,YAAgC;IAEhC,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAoB,CAAA;IAEjE,mEAAmE;IACnE,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,MAAM,CAAA;QACtD,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,MAAM,CAAA;QACtD,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAA;IACtD,CAAC;IAED,OAAO,MAAM,CAAA,CAAC,6BAA6B;AAC7C,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,IAAI,CAAA;IAC5B,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IAC7B,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IAC7B,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { MediaItem } from '@krantho/persistence';
|
|
2
|
+
import type { ImageFormat, ImagePreset } from './image-presets.js';
|
|
3
|
+
/** One concrete rendition of a media item: every choice made, nothing negotiated */
|
|
4
|
+
export interface ImageVariant {
|
|
5
|
+
preset: ImagePreset;
|
|
6
|
+
/** `original` serves the stored bytes unchanged (SVG without a raster format) */
|
|
7
|
+
format: ImageFormat | 'original';
|
|
8
|
+
aspect: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The item's image revision: changes when the bytes or their framing change
|
|
12
|
+
* (a replace gives a new url; crop and hotspot reshape every variant), and
|
|
13
|
+
* stays put for alt text, tags, folder and rename edits.
|
|
14
|
+
*/
|
|
15
|
+
export declare function imageRevision(item: MediaItem): string;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a request's variant: `w` maps to a preset, `fmt` is explicit or
|
|
18
|
+
* negotiated from `Accept`, and an SVG without an explicit raster format is
|
|
19
|
+
* served as the original.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveVariant(item: MediaItem, query: Record<string, string | undefined>, headers?: Record<string, string> | undefined): ImageVariant;
|
|
22
|
+
/** The versioned, immutable URL of a variant at a revision */
|
|
23
|
+
export declare function variantUrl(id: string, variant: ImageVariant, rev: string): string;
|
|
24
|
+
/** The in-memory cache key of a rendered variant; a new revision never hits an old entry */
|
|
25
|
+
export declare function variantCacheKey(id: string, variant: ImageVariant, rev: string): string;
|
|
26
|
+
//# sourceMappingURL=image-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-url.d.ts","sourceRoot":"","sources":["../src/image-url.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGlE,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAA;IACnB,iFAAiF;IACjF,MAAM,EAAE,WAAW,GAAG,UAAU,CAAA;IAChC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B;AAOD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAGrD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC3C,YAAY,CAId;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjF;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { clampToPreset, parseFormat, parsePreset } from './image-presets.js';
|
|
3
|
+
const SVG = 'image/svg+xml';
|
|
4
|
+
const FORMATS = new Set(['webp', 'jpeg', 'png', 'avif']);
|
|
5
|
+
/** Only N:N ratios, so arbitrary values cannot flood the variant cache */
|
|
6
|
+
const ASPECT_PATTERN = /^\d+:\d+$/;
|
|
7
|
+
/**
|
|
8
|
+
* The item's image revision: changes when the bytes or their framing change
|
|
9
|
+
* (a replace gives a new url; crop and hotspot reshape every variant), and
|
|
10
|
+
* stays put for alt text, tags, folder and rename edits.
|
|
11
|
+
*/
|
|
12
|
+
export function imageRevision(item) {
|
|
13
|
+
const source = `${item.url}|${JSON.stringify(item.crop)}|${JSON.stringify(item.hotspot)}`;
|
|
14
|
+
return createHash('sha256').update(source).digest('hex').slice(0, 12);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a request's variant: `w` maps to a preset, `fmt` is explicit or
|
|
18
|
+
* negotiated from `Accept`, and an SVG without an explicit raster format is
|
|
19
|
+
* served as the original.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveVariant(item, query, headers) {
|
|
22
|
+
const rawAspect = query['aspect'];
|
|
23
|
+
const aspect = rawAspect && ASPECT_PATTERN.test(rawAspect) ? rawAspect : undefined;
|
|
24
|
+
return { preset: resolvePreset(query), format: resolveFormat(item, query, headers), aspect };
|
|
25
|
+
}
|
|
26
|
+
/** The versioned, immutable URL of a variant at a revision */
|
|
27
|
+
export function variantUrl(id, variant, rev) {
|
|
28
|
+
const aspect = variant.aspect ? `&aspect=${variant.aspect}` : '';
|
|
29
|
+
return `/api/media/${encodeURIComponent(id)}/image?preset=${variant.preset}&fmt=${variant.format}${aspect}&rev=${rev}`;
|
|
30
|
+
}
|
|
31
|
+
/** The in-memory cache key of a rendered variant; a new revision never hits an old entry */
|
|
32
|
+
export function variantCacheKey(id, variant, rev) {
|
|
33
|
+
return `${id}/${rev}/${variant.preset}/${variant.format}/${variant.aspect ?? ''}`;
|
|
34
|
+
}
|
|
35
|
+
function resolvePreset(query) {
|
|
36
|
+
const rawW = query['w'];
|
|
37
|
+
const width = rawW ? Number.parseInt(rawW, 10) : Number.NaN;
|
|
38
|
+
return Number.isNaN(width) ? parsePreset(query['preset']) : clampToPreset(width);
|
|
39
|
+
}
|
|
40
|
+
function resolveFormat(item, query, headers) {
|
|
41
|
+
const fmt = query['fmt'];
|
|
42
|
+
const explicitRaster = fmt !== undefined && FORMATS.has(fmt);
|
|
43
|
+
if (item.mimeType === SVG && !explicitRaster)
|
|
44
|
+
return 'original';
|
|
45
|
+
return parseFormat(fmt, headers?.['accept']);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=image-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-url.js","sourceRoot":"","sources":["../src/image-url.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type { AssistantActivity, AssistantChatRequest, AssistantDoneReason, AssistantErrorCode, AssistantEvent, DocumentChange, DocumentRef, FieldChange, PendingActionKind, PendingActionView, SeoFinding, } from './assistant/protocol.js';
|
|
2
|
+
export { deliverChange, deliverChanges } from './content-change.js';
|
|
3
|
+
export { accessCookieName, buildCookie, refreshCookieName } from './cookies.js';
|
|
4
|
+
export type { ApiHandlers, CreateApiHandlersConfig } from './create-api-handlers.js';
|
|
5
|
+
export { createApiHandlers } from './create-api-handlers.js';
|
|
6
|
+
export { createContent, deleteContent, getContent, getSchema, getVersion, listCollection, listCollections, listContent, listContentTree, listVersions, mediaDelete, mediaGet, mediaImage, mediaImageInfo, mediaList, mediaRegister, mediaUpdate, mediaUpload, publishContent, resolvePageRoute, restoreVersion, updateContent, validateAll, } from './handlers/index.js';
|
|
7
|
+
export { storedBaseUrlSetting, storedModelSetting } from './handlers/llm-credential.js';
|
|
8
|
+
export type { AfterMutationContext, BeforeSaveContext, ContentHooks } from './hooks.js';
|
|
9
|
+
export type { CachedVariant, ImageCacheSettings } from './image-cache.js';
|
|
10
|
+
export { ImageCache } from './image-cache.js';
|
|
11
|
+
export type { ImageDimensions } from './image-dimensions.js';
|
|
12
|
+
export { detectDimensions } from './image-dimensions.js';
|
|
13
|
+
export type { ImageSettings } from './image-optimizer.js';
|
|
14
|
+
export { ImageOptimizer } from './image-optimizer.js';
|
|
15
|
+
export type { ImageFormat, ImagePreset } from './image-presets.js';
|
|
16
|
+
export { clampToPreset, getContentType, parseFormat, parsePreset, } from './image-presets.js';
|
|
17
|
+
export type { ImageVariant } from './image-url.js';
|
|
18
|
+
export { imageRevision, resolveVariant, variantUrl } from './image-url.js';
|
|
19
|
+
export type { JwtClaims } from './jwt.js';
|
|
20
|
+
export { resolveJwtSecret, verifyJwt } from './jwt.js';
|
|
21
|
+
export type { MediaLibrarySettings } from './media-library.js';
|
|
22
|
+
export { MediaLibrary } from './media-library.js';
|
|
23
|
+
export type { AuthResult } from './middleware/auth.js';
|
|
24
|
+
export { checkAuth } from './middleware/auth.js';
|
|
25
|
+
export type { KranthoPlugin, PluginFieldType, PluginRegistry, PluginRoute, PluginStudioPage, } from './plugins.js';
|
|
26
|
+
export { loadPlugins } from './plugins.js';
|
|
27
|
+
export { PREVIEW_PARAM, verifyPreviewToken } from './preview-token.js';
|
|
28
|
+
export { ApiRouter } from './router.js';
|
|
29
|
+
export type { PageJsonLdInput } from './seo-compose.js';
|
|
30
|
+
export { composePageJsonLd } from './seo-compose.js';
|
|
31
|
+
export { startSeo } from './seo-subsystem.js';
|
|
32
|
+
export type { ApiContext, ApiHandler, ApiRequest, ApiResponse, AuthenticatedUser, ContentItemResponse, ErrorResponse, MediaConfig, ServerFramework, SitePreviewMode, WebhookConfig, } from './types.js';
|
|
33
|
+
export { hasVersioning } from './types.js';
|
|
34
|
+
export { parseCookie } from './validators.js';
|
|
35
|
+
export { processWebhookRetries } from './webhooks.js';
|
|
36
|
+
export { checkWorkloadAuth, WORKLOAD_PATHS } from './workload-identity.js';
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { deliverChange, deliverChanges } from './content-change.js';
|
|
2
|
+
export { accessCookieName, buildCookie, refreshCookieName } from './cookies.js';
|
|
3
|
+
export { createApiHandlers } from './create-api-handlers.js';
|
|
4
|
+
export { createContent, deleteContent, getContent, getSchema, getVersion, listCollection, listCollections, listContent, listContentTree, listVersions, mediaDelete, mediaGet, mediaImage, mediaImageInfo, mediaList, mediaRegister, mediaUpdate, mediaUpload, publishContent, resolvePageRoute, restoreVersion, updateContent, validateAll, } from './handlers/index.js';
|
|
5
|
+
export { storedBaseUrlSetting, storedModelSetting } from './handlers/llm-credential.js';
|
|
6
|
+
export { ImageCache } from './image-cache.js';
|
|
7
|
+
export { detectDimensions } from './image-dimensions.js';
|
|
8
|
+
export { ImageOptimizer } from './image-optimizer.js';
|
|
9
|
+
export { clampToPreset, getContentType, parseFormat, parsePreset, } from './image-presets.js';
|
|
10
|
+
export { imageRevision, resolveVariant, variantUrl } from './image-url.js';
|
|
11
|
+
export { resolveJwtSecret, verifyJwt } from './jwt.js';
|
|
12
|
+
export { MediaLibrary } from './media-library.js';
|
|
13
|
+
export { checkAuth } from './middleware/auth.js';
|
|
14
|
+
export { loadPlugins } from './plugins.js';
|
|
15
|
+
export { PREVIEW_PARAM, verifyPreviewToken } from './preview-token.js';
|
|
16
|
+
export { ApiRouter } from './router.js';
|
|
17
|
+
export { composePageJsonLd } from './seo-compose.js';
|
|
18
|
+
export { startSeo } from './seo-subsystem.js';
|
|
19
|
+
export { hasVersioning } from './types.js';
|
|
20
|
+
export { parseCookie } from './validators.js';
|
|
21
|
+
export { processWebhookRetries } from './webhooks.js';
|
|
22
|
+
export { checkWorkloadAuth, WORKLOAD_PATHS } from './workload-identity.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,UAAU,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAGvF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE1E,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAQhD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAc7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/jwt.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AuthSection } from '@krantho/config';
|
|
2
|
+
import type { Role } from '@krantho/persistence';
|
|
3
|
+
/** Claims embedded in a krantho access token JWT */
|
|
4
|
+
export interface JwtClaims {
|
|
5
|
+
/** User ID (UUID) */
|
|
6
|
+
sub: string;
|
|
7
|
+
/** User email */
|
|
8
|
+
email: string;
|
|
9
|
+
/** Display name */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Assigned roles */
|
|
12
|
+
roles: Role[];
|
|
13
|
+
/** Issued at (unix seconds) */
|
|
14
|
+
iat: number;
|
|
15
|
+
/** Expires at (unix seconds) */
|
|
16
|
+
exp: number;
|
|
17
|
+
}
|
|
18
|
+
/** Result of verifying a JWT */
|
|
19
|
+
export type VerifyResult = {
|
|
20
|
+
valid: true;
|
|
21
|
+
claims: JwtClaims;
|
|
22
|
+
} | {
|
|
23
|
+
valid: false;
|
|
24
|
+
error: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Sign a JWT with HS256.
|
|
28
|
+
*
|
|
29
|
+
* @param claims - Token claims (sub, email, name, roles)
|
|
30
|
+
* @param secret - HMAC secret (`config.auth.jwtSecret`)
|
|
31
|
+
* @param expiresInSeconds - Token lifetime in seconds (default: 900 = 15 minutes)
|
|
32
|
+
*/
|
|
33
|
+
export declare function signJwt(claims: Omit<JwtClaims, 'iat' | 'exp'>, secret: string, expiresInSeconds?: number): string;
|
|
34
|
+
/**
|
|
35
|
+
* Verify a JWT signature and check expiry.
|
|
36
|
+
*
|
|
37
|
+
* @param token - The full JWT string
|
|
38
|
+
* @param secret - HMAC secret (must match the signing secret)
|
|
39
|
+
*/
|
|
40
|
+
export declare function verifyJwt(token: string, secret: string): VerifyResult;
|
|
41
|
+
/** Generate a cryptographically random refresh token (64 hex chars) */
|
|
42
|
+
export declare function generateRefreshToken(): string;
|
|
43
|
+
/** Hash a refresh token for database storage */
|
|
44
|
+
export declare function hashRefreshToken(token: string, secret: string): string;
|
|
45
|
+
/** Generate a random JWT secret (for dev mode when none is configured) */
|
|
46
|
+
export declare function generateJwtSecret(): string;
|
|
47
|
+
/**
|
|
48
|
+
* The effective signing secret: the configured one (KRANTHO_JWT_SECRET beats a
|
|
49
|
+
* `jwtSecret` set in code, as the config tree resolves it), or, when neither is
|
|
50
|
+
* set, one ephemeral secret for the whole process — generated with a warning —
|
|
51
|
+
* so the API and the pages it serves (a signed preview link) agree on it.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveJwtSecret(auth: Pick<AuthSection, 'jwtSecret'>): string;
|
|
54
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,gCAAgC;AAChC,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAmB/F;;;;;;GAMG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,gBAAgB,SAAM,GACrB,MAAM,CAaR;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAyCrE;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAcD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,CAW7E"}
|