emdash 0.37.0 → 0.38.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/dist/{activation-K0kGBWuJ.mjs → activation-DyNTe_Tl.mjs} +3 -3
- package/dist/{activation-K0kGBWuJ.mjs.map → activation-DyNTe_Tl.mjs.map} +1 -1
- package/dist/{adapters-BDQwg236.d.mts → adapters-DCEgOBXi.d.mts} +1 -1
- package/dist/{adapters-BDQwg236.d.mts.map → adapters-DCEgOBXi.d.mts.map} +1 -1
- package/dist/{allowed-origins-BGglilcs.mjs → allowed-origins-GFUVavRj.mjs} +2 -2
- package/dist/{allowed-origins-BGglilcs.mjs.map → allowed-origins-GFUVavRj.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +23 -22
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/{api-Dz6rgoa3.mjs → api-BvxJmnFY.mjs} +141 -87
- package/dist/api-BvxJmnFY.mjs.map +1 -0
- package/dist/{api-tokens-BSsQACNe.mjs → api-tokens-xpGqMHrC.mjs} +2 -2
- package/dist/{api-tokens-BSsQACNe.mjs.map → api-tokens-xpGqMHrC.mjs.map} +1 -1
- package/dist/{apply-B4SIOxR1.mjs → apply-DLmM3R7f.mjs} +25 -21
- package/dist/apply-DLmM3R7f.mjs.map +1 -0
- package/dist/{config-it29yDLA.mjs → artifact-fetch-P2JXVwOq.mjs} +8 -199
- package/dist/artifact-fetch-P2JXVwOq.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +37 -11
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +3 -3
- package/dist/astro/middleware/redirect.mjs +7 -5
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +154 -125
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -9
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +16 -16
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +16 -16
- package/dist/astro/routes/api/admin/bylines/index.mjs +16 -16
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +11 -11
- package/dist/astro/routes/api/admin/comments/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/counts.mjs +3 -3
- package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +16 -16
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +15 -15
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +15 -15
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +5 -4
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +56 -53
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +55 -52
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +54 -51
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +54 -51
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +54 -51
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/invite/index.mjs +8 -8
- package/dist/astro/routes/api/auth/invite/register-options.mjs +10 -10
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +10 -10
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +12 -12
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/request.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +13 -8
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts +10 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.d.mts.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +66 -0
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -0
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +14 -9
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +19 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +19 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +15 -8
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +15 -14
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +13 -8
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +23 -11
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +14 -9
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +6 -6
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +14 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +27 -26
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +71 -55
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +10 -10
- package/dist/astro/routes/api/media/_id_/replace.mjs +8 -8
- package/dist/astro/routes/api/media/_id_/upload.mjs +5 -5
- package/dist/astro/routes/api/media/_id_/usage.mjs +18 -18
- package/dist/astro/routes/api/media/_id_.mjs +17 -17
- package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +8 -8
- package/dist/astro/routes/api/media/folders/index.mjs +8 -8
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +9 -9
- package/dist/astro/routes/api/media.mjs +21 -21
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/items.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/translations.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_.mjs +9 -9
- package/dist/astro/routes/api/menus/index.mjs +9 -9
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
- package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
- package/dist/astro/routes/api/oauth/register.mjs +2 -2
- package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
- package/dist/astro/routes/api/oauth/token.mjs +5 -5
- package/dist/astro/routes/api/openapi.json.mjs +84 -18
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +19 -17
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +14 -12
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +19 -17
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +54 -51
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +13 -11
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +54 -51
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +54 -51
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +12 -11
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +11 -10
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +12 -11
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +7 -6
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +11 -10
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +11 -10
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +11 -10
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +6 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -6
- package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -7
- package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +14 -14
- package/dist/astro/routes/api/setup/admin-verify.mjs +12 -12
- package/dist/astro/routes/api/setup/admin.mjs +11 -11
- package/dist/astro/routes/api/setup/dev-bypass.mjs +33 -31
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +33 -31
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +8 -7
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +16 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -12
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/index.mjs +12 -12
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +11 -10
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +32 -17
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-Bkf_UHhD.mjs → authorize-C2QHlWSS.mjs} +2 -2
- package/dist/{authorize-Bkf_UHhD.mjs.map → authorize-C2QHlWSS.mjs.map} +1 -1
- package/dist/{backup-rwVAl9NI.mjs → backup-oS8ft5Cm.mjs} +5 -5
- package/dist/{backup-rwVAl9NI.mjs.map → backup-oS8ft5Cm.mjs.map} +1 -1
- package/dist/{bundle-C8S2Zl6U.mjs → bundle-CL0JjIPx.mjs} +4 -4
- package/dist/{bundle-C8S2Zl6U.mjs.map → bundle-CL0JjIPx.mjs.map} +1 -1
- package/dist/{byline-DuhF7NWl.mjs → byline-Vdi85CsZ.mjs} +6 -6
- package/dist/{byline-DuhF7NWl.mjs.map → byline-Vdi85CsZ.mjs.map} +1 -1
- package/dist/{byline-fields-BovY4KYM.mjs → byline-fields-DPVRFMz2.mjs} +2 -2
- package/dist/{byline-fields-BovY4KYM.mjs.map → byline-fields-DPVRFMz2.mjs.map} +1 -1
- package/dist/{byline-registry-Bpu9-MVs.mjs → byline-registry-BxDGIO0I.mjs} +2 -2
- package/dist/{byline-registry-Bpu9-MVs.mjs.map → byline-registry-BxDGIO0I.mjs.map} +1 -1
- package/dist/{bylines-CJ5nd6Lw.mjs → bylines-BX8QhcTk.mjs} +7 -7
- package/dist/{bylines-CJ5nd6Lw.mjs.map → bylines-BX8QhcTk.mjs.map} +1 -1
- package/dist/{bylines-RwBAeOF1.mjs → bylines-w-E1IEQd.mjs} +3 -3
- package/dist/{bylines-RwBAeOF1.mjs.map → bylines-w-E1IEQd.mjs.map} +1 -1
- package/dist/{cache-BF5Kvn59.mjs → cache--7HKu5Xm.mjs} +4 -4
- package/dist/{cache-BF5Kvn59.mjs.map → cache--7HKu5Xm.mjs.map} +1 -1
- package/dist/{capture-triggers-CNW1q3HK.mjs → capture-triggers-CeAsC76Z.mjs} +2 -2
- package/dist/{capture-triggers-CNW1q3HK.mjs.map → capture-triggers-CeAsC76Z.mjs.map} +1 -1
- package/dist/{challenge-store-DQN_Yrck.mjs → challenge-store-BIOak-tp.mjs} +1 -1
- package/dist/{challenge-store-DQN_Yrck.mjs.map → challenge-store-BIOak-tp.mjs.map} +1 -1
- package/dist/{chrome-tags-D8fiZG94.mjs → chrome-tags-DzDQBCjX.mjs} +1 -1
- package/dist/{chrome-tags-D8fiZG94.mjs.map → chrome-tags-DzDQBCjX.mjs.map} +1 -1
- package/dist/{chunks-C4szrD8o.mjs → chunks-VG_tyqnP.mjs} +2 -2
- package/dist/{chunks-C4szrD8o.mjs.map → chunks-VG_tyqnP.mjs.map} +1 -1
- package/dist/cli/index.mjs +66 -38
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +17 -7
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +17 -12
- package/dist/client/index.mjs.map +1 -1
- package/dist/{collection-deletion-Bj07NHbj.mjs → collection-deletion-BCwaWTDw.mjs} +4 -4
- package/dist/{collection-deletion-Bj07NHbj.mjs.map → collection-deletion-BCwaWTDw.mjs.map} +1 -1
- package/dist/collection-slugs-cache-7lTmNzeA.mjs +85 -0
- package/dist/collection-slugs-cache-7lTmNzeA.mjs.map +1 -0
- package/dist/{comment-reaction-BhrvSHml.mjs → comment-reaction-CDyvPQRj.mjs} +2 -2
- package/dist/{comment-reaction-BhrvSHml.mjs.map → comment-reaction-CDyvPQRj.mjs.map} +1 -1
- package/dist/{comments-Ct4ensnf.mjs → comments-VzmVLyaC.mjs} +1 -1
- package/dist/{comments-Ct4ensnf.mjs.map → comments-VzmVLyaC.mjs.map} +1 -1
- package/dist/{components-DJbo1z0S.mjs → components-CL6Wkdk-.mjs} +1 -1
- package/dist/{components-DJbo1z0S.mjs.map → components-CL6Wkdk-.mjs.map} +1 -1
- package/dist/config--eWjQJE5.mjs +217 -0
- package/dist/config--eWjQJE5.mjs.map +1 -0
- package/dist/{index-BJNMCWmu.d.mts → config-CGAhyOjP.d.mts} +138 -47
- package/dist/config-CGAhyOjP.d.mts.map +1 -0
- package/dist/{config-B9eZ340f.d.mts → config-ChFzshGd.d.mts} +1 -1
- package/dist/{config-B9eZ340f.d.mts.map → config-ChFzshGd.d.mts.map} +1 -1
- package/dist/{content-DjvM0T92.mjs → content-CNfMWuhY.mjs} +121 -5
- package/dist/content-CNfMWuhY.mjs.map +1 -0
- package/dist/{content-list-query-Btqd4uV2.d.mts → content-list-query-B8d4UQp9.d.mts} +1 -1
- package/dist/{content-list-query-Btqd4uV2.d.mts.map → content-list-query-B8d4UQp9.d.mts.map} +1 -1
- package/dist/{content-refresh-Bwp-8yGy.mjs → content-refresh-GTMyi2Xy.mjs} +8 -8
- package/dist/{content-refresh-Bwp-8yGy.mjs.map → content-refresh-GTMyi2Xy.mjs.map} +1 -1
- package/dist/{content-repair-Czdp7jz5.mjs → content-repair-CIMt5C0U.mjs} +4 -4
- package/dist/{content-repair-Czdp7jz5.mjs.map → content-repair-CIMt5C0U.mjs.map} +1 -1
- package/dist/{context-CX6gxOLW.mjs → context-C9PB8vGd.mjs} +265 -25
- package/dist/context-C9PB8vGd.mjs.map +1 -0
- package/dist/{cron-C6o7VppJ.mjs → cron-DHAy9oyq.mjs} +1 -1
- package/dist/{cron-C6o7VppJ.mjs.map → cron-DHAy9oyq.mjs.map} +1 -1
- package/dist/{dashboard-C2kTeeRI.mjs → dashboard-BNSvAN8A.mjs} +4 -4
- package/dist/{dashboard-C2kTeeRI.mjs.map → dashboard-BNSvAN8A.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +5 -5
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +5 -5
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +5 -5
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{default-Clra32mw.mjs → default-ByZ0JqZo.mjs} +1 -1
- package/dist/{default-Clra32mw.mjs.map → default-ByZ0JqZo.mjs.map} +1 -1
- package/dist/{deferred-tasks-CvDETTJO.d.mts → deferred-tasks-Cu4NSJpa.d.mts} +1 -1
- package/dist/{deferred-tasks-CvDETTJO.d.mts.map → deferred-tasks-Cu4NSJpa.d.mts.map} +1 -1
- package/dist/{dev-typegen-DzOPfsNj.mjs → dev-typegen-DHT7lcMU.mjs} +1 -1
- package/dist/{dev-typegen-DzOPfsNj.mjs.map → dev-typegen-DHT7lcMU.mjs.map} +1 -1
- package/dist/{device-flow-D2oCWvLJ.mjs → device-flow-Cf6bhCCT.mjs} +4 -4
- package/dist/{device-flow-D2oCWvLJ.mjs.map → device-flow-Cf6bhCCT.mjs.map} +1 -1
- package/dist/{dialect-helpers-BSbfaO3F.mjs → dialect-helpers-BcQvkHgn.mjs} +83 -2
- package/dist/dialect-helpers-BcQvkHgn.mjs.map +1 -0
- package/dist/{direct-executor-Bfa5_ToE.mjs → direct-executor-yAyUGSqB.mjs} +3 -3
- package/dist/{direct-executor-Bfa5_ToE.mjs.map → direct-executor-yAyUGSqB.mjs.map} +1 -1
- package/dist/{dist-89xCrGqi.mjs → dist-BAsh8dbf.mjs} +1 -1
- package/dist/{dist-89xCrGqi.mjs.map → dist-BAsh8dbf.mjs.map} +1 -1
- package/dist/{email-console-Dzb6uGYa.mjs → email-console-DNup1Fku.mjs} +1 -1
- package/dist/{email-console-Dzb6uGYa.mjs.map → email-console-DNup1Fku.mjs.map} +1 -1
- package/dist/{enrich-BX0IDp4z.mjs → enrich-t2Xvjdqa.mjs} +3 -3
- package/dist/{enrich-BX0IDp4z.mjs.map → enrich-t2Xvjdqa.mjs.map} +1 -1
- package/dist/entry-lock-BEr8gDkG.mjs +163 -0
- package/dist/entry-lock-BEr8gDkG.mjs.map +1 -0
- package/dist/{relations-DnRK4YIT.d.mts → entry-lock-CGAtrwAR.d.mts} +92 -37
- package/dist/entry-lock-CGAtrwAR.d.mts.map +1 -0
- package/dist/{redirects-BLNOWQTn.mjs → entry-lock-DIYHAaSw.mjs} +57 -14
- package/dist/entry-lock-DIYHAaSw.mjs.map +1 -0
- package/dist/entry-locks-BEcX7ET0.mjs +167 -0
- package/dist/entry-locks-BEcX7ET0.mjs.map +1 -0
- package/dist/{error-DFrQjppn.mjs → error-BDcFyoRt.mjs} +2 -2
- package/dist/{error-DFrQjppn.mjs.map → error-BDcFyoRt.mjs.map} +1 -1
- package/dist/{errors-DsVoDUjJ.mjs → errors-DvMdNrgf.mjs} +8 -1
- package/dist/errors-DvMdNrgf.mjs.map +1 -0
- package/dist/{escape-HmHTC1Is.mjs → escape-B3asJC6W.mjs} +1 -1
- package/dist/{escape-HmHTC1Is.mjs.map → escape-B3asJC6W.mjs.map} +1 -1
- package/dist/{field-defs-cache-BM4SIRqH.mjs → field-defs-cache-Cf5FHK0M.mjs} +5 -5
- package/dist/{field-defs-cache-BM4SIRqH.mjs.map → field-defs-cache-Cf5FHK0M.mjs.map} +1 -1
- package/dist/{fts-manager-Do1BlW2r.mjs → fts-manager-iddym8cd.mjs} +4 -4
- package/dist/{fts-manager-Do1BlW2r.mjs.map → fts-manager-iddym8cd.mjs.map} +1 -1
- package/dist/{hash-3JJPlHF2.mjs → hash-BRweX6jz.mjs} +1 -1
- package/dist/{hash-3JJPlHF2.mjs.map → hash-BRweX6jz.mjs.map} +1 -1
- package/dist/{hook-result-DCh2WUpe.d.mts → hook-result-BrshYHLx.d.mts} +1 -1
- package/dist/{hook-result-DCh2WUpe.d.mts.map → hook-result-BrshYHLx.d.mts.map} +1 -1
- package/dist/{hreflang-B6hbAuuO.d.mts → hreflang-CQpu5bMy.d.mts} +2 -2
- package/dist/{hreflang-B6hbAuuO.d.mts.map → hreflang-CQpu5bMy.d.mts.map} +1 -1
- package/dist/{hreflang-DQbPZliA.mjs → hreflang-DshnweTC.mjs} +9 -8
- package/dist/{hreflang-DQbPZliA.mjs.map → hreflang-DshnweTC.mjs.map} +1 -1
- package/dist/{identity-DksvEazf.mjs → identity-CjGKDq8J.mjs} +3 -3
- package/dist/{identity-DksvEazf.mjs.map → identity-CjGKDq8J.mjs.map} +1 -1
- package/dist/{import-CJpaBBBT.mjs → import-D96g2otw.mjs} +5 -5
- package/dist/{import-CJpaBBBT.mjs.map → import-D96g2otw.mjs.map} +1 -1
- package/dist/{index-Du8K7bWa.d.mts → index-1ECYpfiF.d.mts} +3 -3
- package/dist/{index-Du8K7bWa.d.mts.map → index-1ECYpfiF.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -22
- package/dist/index.mjs +81 -78
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-CFNBe_iH.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-CFNBe_iH.mjs.map} +1 -1
- package/dist/{load-CawHjTOH.mjs → load-DPtY9cZo.mjs} +2 -2
- package/dist/{load-CawHjTOH.mjs.map → load-DPtY9cZo.mjs.map} +1 -1
- package/dist/{loader-Z8vl7zTq.mjs → loader-WJi6GFRn.mjs} +46 -8
- package/dist/loader-WJi6GFRn.mjs.map +1 -0
- package/dist/{manifest-builder-COtzuca2.mjs → manifest-builder-BfNlGQIA.mjs} +2 -2
- package/dist/{manifest-builder-COtzuca2.mjs.map → manifest-builder-BfNlGQIA.mjs.map} +1 -1
- package/dist/{manifest-schema-BNWwR8Vd.mjs → manifest-schema-CILooI5J.mjs} +1 -1
- package/dist/{manifest-schema-BNWwR8Vd.mjs.map → manifest-schema-CILooI5J.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +3 -3
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +5 -5
- package/dist/{media-BHjus86Y.mjs → media-C1EIZKh1.mjs} +1 -1
- package/dist/{media-BHjus86Y.mjs.map → media-C1EIZKh1.mjs.map} +1 -1
- package/dist/{media-allowlist-CoTBWoDp.mjs → media-allowlist-elXJgb_K.mjs} +2 -2
- package/dist/{media-allowlist-CoTBWoDp.mjs.map → media-allowlist-elXJgb_K.mjs.map} +1 -1
- package/dist/{media-folders-BGkATs8n.mjs → media-folders-DASfX_DH.mjs} +1 -1
- package/dist/{media-folders-BGkATs8n.mjs.map → media-folders-DASfX_DH.mjs.map} +1 -1
- package/dist/{media-upload-BCidR-EY.mjs → media-upload-C7_AQJ5v.mjs} +8 -8
- package/dist/{media-upload-BCidR-EY.mjs.map → media-upload-C7_AQJ5v.mjs.map} +1 -1
- package/dist/{media-url-DHoPr0hq.mjs → media-url-8dVl1loq.mjs} +19 -2
- package/dist/media-url-8dVl1loq.mjs.map +1 -0
- package/dist/{media-usage-CdY5jhSR.mjs → media-usage-C1EswMTq.mjs} +9 -9
- package/dist/{media-usage-CdY5jhSR.mjs.map → media-usage-C1EswMTq.mjs.map} +1 -1
- package/dist/{media-usage-activation-BgeMtK5C.mjs → media-usage-activation-CrHNltlL.mjs} +3 -3
- package/dist/{media-usage-activation-BgeMtK5C.mjs.map → media-usage-activation-CrHNltlL.mjs.map} +1 -1
- package/dist/{media-usage-work-D6D9sMCA.mjs → media-usage-work-C5B1zT1c.mjs} +2 -2
- package/dist/{media-usage-work-D6D9sMCA.mjs.map → media-usage-work-C5B1zT1c.mjs.map} +1 -1
- package/dist/{media-usage-work-CnGCdHxx.mjs → media-usage-work-IkQx_Yz6.mjs} +4 -4
- package/dist/{media-usage-work-CnGCdHxx.mjs.map → media-usage-work-IkQx_Yz6.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-hjeD4u7s.mjs → media-usage-write-fence-B9anjOSg.mjs} +3 -3
- package/dist/{media-usage-write-fence-hjeD4u7s.mjs.map → media-usage-write-fence-B9anjOSg.mjs.map} +1 -1
- package/dist/{menus-6qSwTNxG.mjs → menus-D8mC4eaN.mjs} +115 -136
- package/dist/menus-D8mC4eaN.mjs.map +1 -0
- package/dist/{menus-uvPLXMZf.mjs → menus-UdwjHZJC.mjs} +11 -3
- package/dist/{menus-uvPLXMZf.mjs.map → menus-UdwjHZJC.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +4 -4
- package/dist/{mime-CUIG6x84.mjs → mime-DYpsOAny.mjs} +1 -1
- package/dist/{mime-CUIG6x84.mjs.map → mime-DYpsOAny.mjs.map} +1 -1
- package/dist/{mode-DN_WneRx.mjs → mode-Dm4BHhRH.mjs} +1 -1
- package/dist/{mode-DN_WneRx.mjs.map → mode-Dm4BHhRH.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-BuJXIeMz.mjs → node-sqlite-compat-2sezm-Zd.mjs} +1 -1
- package/dist/{node-sqlite-compat-BuJXIeMz.mjs.map → node-sqlite-compat-2sezm-Zd.mjs.map} +1 -1
- package/dist/{normalize-C2xNjTSG.mjs → normalize-4nkKGsuW.mjs} +1 -1
- package/dist/{normalize-C2xNjTSG.mjs.map → normalize-4nkKGsuW.mjs.map} +1 -1
- package/dist/{oauth-authorization-Dj6Kwc21.mjs → oauth-authorization-BxE_lURD.mjs} +4 -4
- package/dist/{oauth-authorization-Dj6Kwc21.mjs.map → oauth-authorization-BxE_lURD.mjs.map} +1 -1
- package/dist/{oauth-clients-FD7I0J8m.mjs → oauth-clients-DJIdOdq0.mjs} +1 -1
- package/dist/{oauth-clients-FD7I0J8m.mjs.map → oauth-clients-DJIdOdq0.mjs.map} +1 -1
- package/dist/{oauth-state-store-DkmDOmHs.mjs → oauth-state-store-CsdxP57n.mjs} +1 -1
- package/dist/{oauth-state-store-DkmDOmHs.mjs.map → oauth-state-store-CsdxP57n.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-CvIwGpYd.mjs → oauth-user-lookup-HzzW-dkF.mjs} +1 -1
- package/dist/{oauth-user-lookup-CvIwGpYd.mjs.map → oauth-user-lookup-HzzW-dkF.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-BHPeIbBd.mjs → options-D1FBiAv1.mjs} +60 -5
- package/dist/options-D1FBiAv1.mjs.map +1 -0
- package/dist/{options-CYb4y7hM.d.mts → options-D8Y0VHc7.d.mts} +9 -3
- package/dist/options-D8Y0VHc7.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.d.mts.map +1 -1
- package/dist/page/index.mjs +12 -0
- package/dist/page/index.mjs.map +1 -1
- package/dist/{parse-Ckpg-Qfp.mjs → parse-WRg5C3NX.mjs} +2 -2
- package/dist/{parse-Ckpg-Qfp.mjs.map → parse-WRg5C3NX.mjs.map} +1 -1
- package/dist/{passkey-config-O_lj3y0k.mjs → passkey-config-qIdO-wF6.mjs} +1 -1
- package/dist/{passkey-config-O_lj3y0k.mjs.map → passkey-config-qIdO-wF6.mjs.map} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs → patterns-DC8CLptu.mjs} +1 -1
- package/dist/{patterns-D9iDO3j8.mjs.map → patterns-DC8CLptu.mjs.map} +1 -1
- package/dist/{placeholder-4X9BrRrp.d.mts → placeholder-COrvARyD.d.mts} +1 -1
- package/dist/{placeholder-4X9BrRrp.d.mts.map → placeholder-COrvARyD.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +3 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{policy-Dhtwntrt.mjs → policy-XCfb-IE9.mjs} +2 -2
- package/dist/{policy-Dhtwntrt.mjs.map → policy-XCfb-IE9.mjs.map} +1 -1
- package/dist/{portable-text-U85hOafW.mjs → portable-text-BS3d5n-0.mjs} +1 -1
- package/dist/{portable-text-U85hOafW.mjs.map → portable-text-BS3d5n-0.mjs.map} +1 -1
- package/dist/{preview-B_vJLvf8.mjs → preview-BxwsGgGp.mjs} +2 -2
- package/dist/{preview-B_vJLvf8.mjs.map → preview-BxwsGgGp.mjs.map} +1 -1
- package/dist/{protocol-JdD2YhY9.d.mts → protocol-CLn58-nw.d.mts} +2 -2
- package/dist/{protocol-JdD2YhY9.d.mts.map → protocol-CLn58-nw.d.mts.map} +1 -1
- package/dist/{public-url-CarhZJgf.mjs → public-url-FWWAvnre.mjs} +1 -1
- package/dist/{public-url-CarhZJgf.mjs.map → public-url-FWWAvnre.mjs.map} +1 -1
- package/dist/{query-BZKZcG5b.mjs → query-DygOte9M.mjs} +25 -16
- package/dist/query-DygOte9M.mjs.map +1 -0
- package/dist/{query-BndaFxxp.mjs → query-gtXT03Wc.mjs} +4 -4
- package/dist/{query-BndaFxxp.mjs.map → query-gtXT03Wc.mjs.map} +1 -1
- package/dist/{rate-limit-BZmATC6W.mjs → rate-limit-CQUPm0dh.mjs} +2 -2
- package/dist/{rate-limit-BZmATC6W.mjs.map → rate-limit-CQUPm0dh.mjs.map} +1 -1
- package/dist/{redirect-CzqnLxK-.mjs → redirect-D1cWafi6.mjs} +1 -1
- package/dist/{redirect-CzqnLxK-.mjs.map → redirect-D1cWafi6.mjs.map} +1 -1
- package/dist/{redirect-CZkbozu9.mjs → redirect-DId44BS1.mjs} +19 -6
- package/dist/redirect-DId44BS1.mjs.map +1 -0
- package/dist/{redirects-CqzNM0KM.mjs → redirects-DN-ZE33W.mjs} +5 -5
- package/dist/{redirects-CqzNM0KM.mjs.map → redirects-DN-ZE33W.mjs.map} +1 -1
- package/dist/{registry-AZAsRsor.mjs → registry-DTqaqxed.mjs} +26 -10
- package/dist/registry-DTqaqxed.mjs.map +1 -0
- package/dist/{relation-04DfKRTO.mjs → relation-DxgCHOBw.mjs} +2 -2
- package/dist/{relation-04DfKRTO.mjs.map → relation-DxgCHOBw.mjs.map} +1 -1
- package/dist/{relations-CcFwDJdJ.mjs → relations-KKDSLUwS.mjs} +4 -4
- package/dist/{relations-CcFwDJdJ.mjs.map → relations-KKDSLUwS.mjs.map} +1 -1
- package/dist/{relations-C4htk5sb.mjs → relations-rOmbndUJ.mjs} +3 -3
- package/dist/{relations-C4htk5sb.mjs.map → relations-rOmbndUJ.mjs.map} +1 -1
- package/dist/{request-cache-DH9zdCOD.mjs → request-cache-DAZZmesc.mjs} +1 -1
- package/dist/{request-cache-DH9zdCOD.mjs.map → request-cache-DAZZmesc.mjs.map} +1 -1
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DYxLlnmz.mjs → request-meta-BgjUQLQ-.mjs} +2 -2
- package/dist/{request-meta-DYxLlnmz.mjs.map → request-meta-BgjUQLQ-.mjs.map} +1 -1
- package/dist/{resolve-prZ3mP7l.mjs → resolve-Cy0aWSRj.mjs} +37 -4
- package/dist/resolve-Cy0aWSRj.mjs.map +1 -0
- package/dist/{runner-YKfIMnaF.d.mts → runner-CfwysRM0.d.mts} +2 -2
- package/dist/{runner-YKfIMnaF.d.mts.map → runner-CfwysRM0.d.mts.map} +1 -1
- package/dist/{runner-BLIDKpmA.mjs → runner-nEzvnogG.mjs} +419 -295
- package/dist/runner-nEzvnogG.mjs.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +3 -2
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-CGnBeLiW.mjs → schema-CRu38Pr5.mjs} +3 -3
- package/dist/{schema-CGnBeLiW.mjs.map → schema-CRu38Pr5.mjs.map} +1 -1
- package/dist/{schema-DYr-Vd-L.mjs → schema-DifxndJx.mjs} +4 -4
- package/dist/{schema-DYr-Vd-L.mjs.map → schema-DifxndJx.mjs.map} +1 -1
- package/dist/{scopes-BhWvBavj.mjs → scopes-D5A1OZbq.mjs} +3 -3
- package/dist/{scopes-BhWvBavj.mjs.map → scopes-D5A1OZbq.mjs.map} +1 -1
- package/dist/{search-C-qDk4kx.mjs → search-DEPFSBFq.mjs} +4 -4
- package/dist/{search-C-qDk4kx.mjs.map → search-DEPFSBFq.mjs.map} +1 -1
- package/dist/{secrets-rEtHt-6z.mjs → secrets-CdfzLdoO.mjs} +3 -3
- package/dist/{secrets-rEtHt-6z.mjs.map → secrets-CdfzLdoO.mjs.map} +1 -1
- package/dist/{sections-B_nYvlwn.mjs → sections-3X52kmIR.mjs} +2 -2
- package/dist/{sections-B_nYvlwn.mjs.map → sections-3X52kmIR.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +26 -24
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +18 -19
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-926NRIgt.mjs → seo-Bw68KxRc.mjs} +2 -2
- package/dist/{seo-926NRIgt.mjs.map → seo-Bw68KxRc.mjs.map} +1 -1
- package/dist/{seo-CVWkdv6x.mjs → seo-C4AmbsMU.mjs} +3 -2
- package/dist/seo-C4AmbsMU.mjs.map +1 -0
- package/dist/{service-CJl3ZAYs.mjs → service-J_-Vgo7R.mjs} +2 -2
- package/dist/{service-CJl3ZAYs.mjs.map → service-J_-Vgo7R.mjs.map} +1 -1
- package/dist/{session-user-BlMgqCHS.mjs → session-user-CbnMMwk6.mjs} +1 -1
- package/dist/{session-user-BlMgqCHS.mjs.map → session-user-CbnMMwk6.mjs.map} +1 -1
- package/dist/{settings-Cwm6o2jY.mjs → settings-AnEFYICn.mjs} +3 -3
- package/dist/{settings-Cwm6o2jY.mjs.map → settings-AnEFYICn.mjs.map} +1 -1
- package/dist/{settings--wobrkkC.mjs → settings-DcMjREe5.mjs} +6 -6
- package/dist/{settings--wobrkkC.mjs.map → settings-DcMjREe5.mjs.map} +1 -1
- package/dist/{setup-complete-DQbClIN2.mjs → setup-complete-BClXXTvr.mjs} +2 -2
- package/dist/{setup-complete-DQbClIN2.mjs.map → setup-complete-BClXXTvr.mjs.map} +1 -1
- package/dist/{setup-nonce-DZCFS2sn.mjs → setup-nonce-BheRa4RG.mjs} +1 -1
- package/dist/{setup-nonce-DZCFS2sn.mjs.map → setup-nonce-BheRa4RG.mjs.map} +1 -1
- package/dist/{single-flight-cache-BPuGPdcN.mjs → single-flight-cache-jaswDzmQ.mjs} +2 -2
- package/dist/{single-flight-cache-BPuGPdcN.mjs.map → single-flight-cache-jaswDzmQ.mjs.map} +1 -1
- package/dist/{site-url-BrxA_E9H.mjs → site-url-Bqf-ea3N.mjs} +3 -3
- package/dist/{site-url-BrxA_E9H.mjs.map → site-url-Bqf-ea3N.mjs.map} +1 -1
- package/dist/{snapshot--OCDTqdb.mjs → snapshot-C4CtXntb.mjs} +51 -35
- package/dist/snapshot-C4CtXntb.mjs.map +1 -0
- package/dist/{ssrf-5sIM5jzl.mjs → ssrf-gl4gFNhw.mjs} +148 -91
- package/dist/ssrf-gl4gFNhw.mjs.map +1 -0
- package/dist/{state-BpFVsJZB.mjs → state-1F6IOhdQ.mjs} +1 -1
- package/dist/{state-BpFVsJZB.mjs.map → state-1F6IOhdQ.mjs.map} +1 -1
- package/dist/{status-B777-dXz.mjs → status-Cenfk_r5.mjs} +1 -1
- package/dist/{status-B777-dXz.mjs.map → status-Cenfk_r5.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{target-BmR0iTwz.mjs → target-CRzeTs8G.mjs} +1 -1
- package/dist/{target-BmR0iTwz.mjs.map → target-CRzeTs8G.mjs.map} +1 -1
- package/dist/{taxonomies-DkAkMupr.mjs → taxonomies-BOdxuZpV.mjs} +11 -4
- package/dist/taxonomies-BOdxuZpV.mjs.map +1 -0
- package/dist/{taxonomies-Wfy_Lg12.mjs → taxonomies-NcFDq5Gg.mjs} +23 -14
- package/dist/taxonomies-NcFDq5Gg.mjs.map +1 -0
- package/dist/{taxonomy-tJepplLL.mjs → taxonomy-DP1vny4K.mjs} +11 -3
- package/dist/{taxonomy-tJepplLL.mjs.map → taxonomy-DP1vny4K.mjs.map} +1 -1
- package/dist/{tokens-BCO1oruF.mjs → tokens-CDk8ox9p.mjs} +1 -1
- package/dist/{tokens-BCO1oruF.mjs.map → tokens-CDk8ox9p.mjs.map} +1 -1
- package/dist/{transport-xh6YKW2G.d.mts → transport-BVn4tVb9.d.mts} +1 -1
- package/dist/{transport-xh6YKW2G.d.mts.map → transport-BVn4tVb9.d.mts.map} +1 -1
- package/dist/{transport-Dr3qtwXC.mjs → transport-DP0JI-8i.mjs} +1 -1
- package/dist/{transport-Dr3qtwXC.mjs.map → transport-DP0JI-8i.mjs.map} +1 -1
- package/dist/{trusted-proxy-BR5F1Otp.mjs → trusted-proxy-BTM6UxqD.mjs} +1 -1
- package/dist/{trusted-proxy-BR5F1Otp.mjs.map → trusted-proxy-BTM6UxqD.mjs.map} +1 -1
- package/dist/{types-CXFkwEGC.d.mts → types-2n848aVW.d.mts} +1 -1
- package/dist/{types-CXFkwEGC.d.mts.map → types-2n848aVW.d.mts.map} +1 -1
- package/dist/{types-75KIqzL9.mjs → types-BMXnRIrX.mjs} +4 -2
- package/dist/types-BMXnRIrX.mjs.map +1 -0
- package/dist/{types-B6GrPic4.d.mts → types-BouXpOsa.d.mts} +115 -4
- package/dist/types-BouXpOsa.d.mts.map +1 -0
- package/dist/{types-3qNFPlci.mjs → types-ByG2coLw.mjs} +1 -1
- package/dist/{types-3qNFPlci.mjs.map → types-ByG2coLw.mjs.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-CDtkNSFQ.d.mts → types-DEfNJ__A.d.mts} +1 -1
- package/dist/{types-CDtkNSFQ.d.mts.map → types-DEfNJ__A.d.mts.map} +1 -1
- package/dist/{types-xDMtUFnO.d.mts → types-DKcKSbtB.d.mts} +23 -7
- package/dist/types-DKcKSbtB.d.mts.map +1 -0
- package/dist/{types-C00oyCZp.d.mts → types-DRYs7uTL.d.mts} +1 -1
- package/dist/{types-C00oyCZp.d.mts.map → types-DRYs7uTL.d.mts.map} +1 -1
- package/dist/{types-DczELMop.d.mts → types-DaEg7KX2.d.mts} +1 -1
- package/dist/{types-DczELMop.d.mts.map → types-DaEg7KX2.d.mts.map} +1 -1
- package/dist/{types-BuHW4xDE.d.mts → types-LU8utpP_.d.mts} +6 -3
- package/dist/types-LU8utpP_.d.mts.map +1 -0
- package/dist/{types-CPeXo1wF.d.mts → types-VpYfPUxN.d.mts} +1 -1
- package/dist/{types-CPeXo1wF.d.mts.map → types-VpYfPUxN.d.mts.map} +1 -1
- package/dist/{types-DM3vioBY.mjs → types-c9GP7Dj5.mjs} +1 -1
- package/dist/{types-DM3vioBY.mjs.map → types-c9GP7Dj5.mjs.map} +1 -1
- package/dist/{types-FV23hEoW.d.mts → types-tJWDK__M.d.mts} +14 -1
- package/dist/types-tJWDK__M.d.mts.map +1 -0
- package/dist/{upload-attempts-BsqoQ1fn.mjs → upload-attempts-C6S2y-lp.mjs} +1 -1
- package/dist/{upload-attempts-BsqoQ1fn.mjs.map → upload-attempts-C6S2y-lp.mjs.map} +1 -1
- package/dist/{url-pattern-D4c2czpJ.mjs → url-pattern-UYtxVTuj.mjs} +1 -1
- package/dist/{url-pattern-D4c2czpJ.mjs.map → url-pattern-UYtxVTuj.mjs.map} +1 -1
- package/dist/{user-BTZ40aq6.mjs → user-DIsIXogT.mjs} +2 -2
- package/dist/{user-BTZ40aq6.mjs.map → user-DIsIXogT.mjs.map} +1 -1
- package/dist/{utils-BKvNjjhY.mjs → utils-BicP5Qbg.mjs} +2 -2
- package/dist/{utils-BKvNjjhY.mjs.map → utils-BicP5Qbg.mjs.map} +1 -1
- package/dist/{validate-DE_LRwo9.mjs → validate-D8VPn4Hv.mjs} +8 -3
- package/dist/validate-D8VPn4Hv.mjs.map +1 -0
- package/dist/{validate-DUP27OYD.d.mts → validate-Df6Dvwbw.d.mts} +12 -7
- package/dist/validate-Df6Dvwbw.d.mts.map +1 -0
- package/dist/{validation-BMImFJ11.mjs → validation-CzMJn9Ku.mjs} +13 -11
- package/dist/{validation-BMImFJ11.mjs.map → validation-CzMJn9Ku.mjs.map} +1 -1
- package/dist/version-CK67_SXX.mjs +7 -0
- package/dist/{version-Bii3suaO.mjs.map → version-CK67_SXX.mjs.map} +1 -1
- package/dist/{widgets-D3gJ10xU.mjs → widgets-RFVAxQl3.mjs} +5 -5
- package/dist/{widgets-D3gJ10xU.mjs.map → widgets-RFVAxQl3.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-B2Og_6rU.d.mts → wxr-taxonomies-BX4yQL9s.d.mts} +1 -1
- package/dist/{wxr-taxonomies-B2Og_6rU.d.mts.map → wxr-taxonomies-BX4yQL9s.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Cxngsjwo.mjs → wxr-taxonomies-Csdp7yde.mjs} +4 -4
- package/dist/{wxr-taxonomies-Cxngsjwo.mjs.map → wxr-taxonomies-Csdp7yde.mjs.map} +1 -1
- package/dist/{zod-generator-BuYSQJB7.mjs → zod-generator-CNRGdnBY.mjs} +3 -3
- package/dist/{zod-generator-BuYSQJB7.mjs.map → zod-generator-CNRGdnBY.mjs.map} +1 -1
- package/package.json +12 -10
- package/src/api/errors.ts +7 -0
- package/src/api/handlers/content.ts +66 -79
- package/src/api/handlers/entry-lock.ts +206 -0
- package/src/api/handlers/manifest.ts +1 -0
- package/src/api/handlers/marketplace.ts +28 -20
- package/src/api/handlers/menus.ts +9 -0
- package/src/api/handlers/registry.ts +13 -8
- package/src/api/handlers/revision.ts +2 -1
- package/src/api/handlers/seo.ts +10 -1
- package/src/api/handlers/snapshot.ts +84 -72
- package/src/api/handlers/taxonomies.ts +9 -0
- package/src/api/openapi/document.ts +111 -6
- package/src/api/schemas/content.ts +8 -0
- package/src/api/schemas/entry-lock.ts +48 -0
- package/src/api/schemas/index.ts +1 -0
- package/src/api/schemas/schema.ts +10 -1
- package/src/api/types.ts +2 -0
- package/src/astro/integration/index.ts +9 -6
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/runtime.ts +13 -5
- package/src/astro/integration/vite-config.ts +30 -0
- package/src/astro/middleware.ts +16 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +10 -0
- package/src/astro/routes/api/content/[collection]/[id]/lock.ts +133 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +11 -1
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +20 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +10 -0
- package/src/astro/routes/api/content/[collection]/[id].ts +27 -2
- package/src/astro/routes/api/content/[collection]/index.ts +3 -0
- package/src/astro/routes/sitemap-[collection].xml.ts +4 -0
- package/src/astro/types.ts +13 -3
- package/src/cli/commands/content.ts +31 -5
- package/src/cli/commands/export-seed.ts +2 -0
- package/src/client/index.ts +34 -7
- package/src/components/EmDashBodyEnd.astro +4 -1
- package/src/components/EmDashBodyStart.astro +4 -1
- package/src/components/EmDashHead.astro +35 -16
- package/src/components/Gallery.astro +18 -4
- package/src/components/InlineEditor.astro +3 -1
- package/src/components/InlinePortableTextEditor.tsx +106 -11
- package/src/components/PortableText.astro +4 -0
- package/src/components/Table.astro +147 -62
- package/src/config/errors.ts +13 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +26 -2
- package/src/content/converters/prosemirror-to-portable-text.ts +35 -6
- package/src/content/converters/types.ts +10 -0
- package/src/database/dialect-helpers.ts +125 -0
- package/src/database/migrations/075_entry_edit_locks.ts +44 -0
- package/src/database/migrations/076_collection_nav_group.ts +22 -0
- package/src/database/migrations/077_plugin_storage_revisions.ts +89 -0
- package/src/database/migrations/runner.ts +6 -0
- package/src/database/repositories/content.ts +170 -1
- package/src/database/repositories/entry-locks.ts +257 -0
- package/src/database/repositories/options.ts +69 -5
- package/src/database/repositories/plugin-storage.ts +159 -0
- package/src/database/repositories/redirect.ts +17 -6
- package/src/database/repositories/taxonomy.ts +8 -0
- package/src/database/repositories/types.ts +3 -0
- package/src/database/types.ts +15 -1
- package/src/emdash-runtime.ts +117 -50
- package/src/i18n/resolve.ts +44 -4
- package/src/index.ts +14 -0
- package/src/loader.ts +35 -4
- package/src/mcp/server.ts +23 -5
- package/src/media/responsive.ts +23 -0
- package/src/media/usage/content-refresh.ts +2 -1
- package/src/menus/index.ts +17 -21
- package/src/page/seo-contributions.ts +78 -1
- package/src/page/seo-panel.ts +47 -0
- package/src/plugin-types.ts +9 -0
- package/src/plugins/conditional-storage.ts +30 -0
- package/src/plugins/context.ts +49 -17
- package/src/plugins/hooks.ts +7 -1
- package/src/plugins/index.ts +9 -0
- package/src/plugins/manager.ts +5 -2
- package/src/plugins/sandbox/types.ts +16 -2
- package/src/plugins/storage-query.ts +45 -0
- package/src/plugins/storage-update.ts +96 -0
- package/src/plugins/types.ts +114 -0
- package/src/query.ts +29 -3
- package/src/registry/config.ts +130 -27
- package/src/registry/types.ts +5 -6
- package/src/schema/collection-slugs-cache.ts +157 -0
- package/src/schema/registry.ts +19 -0
- package/src/schema/types.ts +25 -6
- package/src/security/ssrf.ts +167 -141
- package/src/seed/apply.ts +4 -0
- package/src/seed/types.ts +7 -2
- package/src/seed/validate.ts +18 -1
- package/src/seo/hreflang.ts +1 -0
- package/src/seo/index.ts +5 -10
- package/src/seo/media-url.ts +26 -0
- package/src/taxonomies/term-counts.ts +22 -5
- package/dist/api-Dz6rgoa3.mjs.map +0 -1
- package/dist/apply-B4SIOxR1.mjs.map +0 -1
- package/dist/config-it29yDLA.mjs.map +0 -1
- package/dist/content-DjvM0T92.mjs.map +0 -1
- package/dist/context-CX6gxOLW.mjs.map +0 -1
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +0 -1
- package/dist/errors-DsVoDUjJ.mjs.map +0 -1
- package/dist/index-BJNMCWmu.d.mts.map +0 -1
- package/dist/loader-Z8vl7zTq.mjs.map +0 -1
- package/dist/media-url-DHoPr0hq.mjs.map +0 -1
- package/dist/menus-6qSwTNxG.mjs.map +0 -1
- package/dist/options-BHPeIbBd.mjs.map +0 -1
- package/dist/options-CYb4y7hM.d.mts.map +0 -1
- package/dist/query-BZKZcG5b.mjs.map +0 -1
- package/dist/redirect-CZkbozu9.mjs.map +0 -1
- package/dist/redirects-BLNOWQTn.mjs.map +0 -1
- package/dist/registry-AZAsRsor.mjs.map +0 -1
- package/dist/relations-DnRK4YIT.d.mts.map +0 -1
- package/dist/resolve-prZ3mP7l.mjs.map +0 -1
- package/dist/runner-BLIDKpmA.mjs.map +0 -1
- package/dist/seo-CVWkdv6x.mjs.map +0 -1
- package/dist/snapshot--OCDTqdb.mjs.map +0 -1
- package/dist/ssrf-5sIM5jzl.mjs.map +0 -1
- package/dist/taxonomies-DkAkMupr.mjs.map +0 -1
- package/dist/taxonomies-Wfy_Lg12.mjs.map +0 -1
- package/dist/types-75KIqzL9.mjs.map +0 -1
- package/dist/types-B6GrPic4.d.mts.map +0 -1
- package/dist/types-BuHW4xDE.d.mts.map +0 -1
- package/dist/types-FV23hEoW.d.mts.map +0 -1
- package/dist/types-xDMtUFnO.d.mts.map +0 -1
- package/dist/validate-DE_LRwo9.mjs.map +0 -1
- package/dist/validate-DUP27OYD.d.mts.map +0 -1
- package/dist/version-Bii3suaO.mjs +0 -7
- /package/dist/{api-tokens-BfYts-sq.mjs → api-tokens-B_lfpmH3.mjs} +0 -0
- /package/dist/{ssrf-Dg3cIT-b.mjs → ssrf-TQhaljuI.mjs} +0 -0
- /package/dist/{types-DfuTR6dL.mjs → types-A2cN6a4a.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dist-89xCrGqi.mjs","names":[],"sources":["../../../node_modules/.pnpm/image-size@2.0.2_patch_hash=77c12533e3a635c4066c55da8952f4912e8210416539dc1249550fa639271595/node_modules/image-size/dist/index.mjs"],"sourcesContent":["// lib/types/utils.ts\nvar decoder = new TextDecoder();\nvar toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));\nvar toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + `0${i.toString(16)}`.slice(-2), \"\");\nvar getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset);\nvar readInt16LE = (input, offset = 0) => getView(input, offset).getInt16(0, true);\nvar readUInt16BE = (input, offset = 0) => getView(input, offset).getUint16(0, false);\nvar readUInt16LE = (input, offset = 0) => getView(input, offset).getUint16(0, true);\nvar readUInt24LE = (input, offset = 0) => {\n const view = getView(input, offset);\n return view.getUint16(0, true) + (view.getUint8(2) << 16);\n};\nvar readInt32LE = (input, offset = 0) => getView(input, offset).getInt32(0, true);\nvar readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false);\nvar readUInt32LE = (input, offset = 0) => getView(input, offset).getUint32(0, true);\nvar readUInt64 = (input, offset, isBigEndian) => getView(input, offset).getBigUint64(0, !isBigEndian);\nvar methods = {\n readUInt16BE,\n readUInt16LE,\n readUInt32BE,\n readUInt32LE\n};\nfunction readUInt(input, bits, offset = 0, isBigEndian = false) {\n const endian = isBigEndian ? \"BE\" : \"LE\";\n const methodName = `readUInt${bits}${endian}`;\n return methods[methodName](input, offset);\n}\nfunction readBox(input, offset) {\n if (input.length - offset < 4) return;\n const boxSize = readUInt32BE(input, offset);\n if (input.length - offset < boxSize) return;\n return {\n name: toUTF8String(input, 4 + offset, 8 + offset),\n offset,\n size: boxSize\n };\n}\nfunction findBox(input, boxName, currentOffset) {\n while (currentOffset < input.length) {\n const box = readBox(input, currentOffset);\n if (!box) break;\n if (box.name === boxName) return box;\n currentOffset += box.size > 0 ? box.size : 8;\n }\n}\n\n// lib/types/bmp.ts\nvar BMP = {\n validate: (input) => toUTF8String(input, 0, 2) === \"BM\",\n calculate: (input) => ({\n height: Math.abs(readInt32LE(input, 22)),\n width: readUInt32LE(input, 18)\n })\n};\n\n// lib/types/ico.ts\nvar TYPE_ICON = 1;\nvar SIZE_HEADER = 2 + 2 + 2;\nvar SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4;\nfunction getSizeFromOffset(input, offset) {\n const value = input[offset];\n return value === 0 ? 256 : value;\n}\nfunction getImageSize(input, imageIndex) {\n const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY;\n return {\n height: getSizeFromOffset(input, offset + 1),\n width: getSizeFromOffset(input, offset)\n };\n}\nvar ICO = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0) return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_ICON;\n },\n calculate(input) {\n const nbImages = readUInt16LE(input, 4);\n const imageSize2 = getImageSize(input, 0);\n if (nbImages === 1) return imageSize2;\n const images = [];\n for (let imageIndex = 0; imageIndex < nbImages; imageIndex += 1) {\n images.push(getImageSize(input, imageIndex));\n }\n return {\n width: imageSize2.width,\n height: imageSize2.height,\n images\n };\n }\n};\n\n// lib/types/cur.ts\nvar TYPE_CURSOR = 2;\nvar CUR = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0) return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_CURSOR;\n },\n calculate: (input) => ICO.calculate(input)\n};\n\n// lib/types/dds.ts\nvar DDS = {\n validate: (input) => readUInt32LE(input, 0) === 542327876,\n calculate: (input) => ({\n height: readUInt32LE(input, 12),\n width: readUInt32LE(input, 16)\n })\n};\n\n// lib/types/gif.ts\nvar gifRegexp = /^GIF8[79]a/;\nvar GIF = {\n validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)),\n calculate: (input) => ({\n height: readUInt16LE(input, 8),\n width: readUInt16LE(input, 6)\n })\n};\n\n// lib/types/heif.ts\nvar brandMap = {\n avif: \"avif\",\n mif1: \"heif\",\n msf1: \"heif\",\n // heif-sequence\n heic: \"heic\",\n heix: \"heic\",\n hevc: \"heic\",\n // heic-sequence\n hevx: \"heic\"\n // heic-sequence\n};\nvar HEIF = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"ftyp\") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand in brandMap;\n },\n calculate(input) {\n const metaBox = findBox(input, \"meta\", 0);\n const iprpBox = metaBox && findBox(input, \"iprp\", metaBox.offset + 12);\n const ipcoBox = iprpBox && findBox(input, \"ipco\", iprpBox.offset + 8);\n if (!ipcoBox) {\n throw new TypeError(\"Invalid HEIF, no ipco box found\");\n }\n const type = toUTF8String(input, 8, 12);\n const images = [];\n let currentOffset = ipcoBox.offset + 8;\n while (currentOffset < ipcoBox.offset + ipcoBox.size) {\n const ispeBox = findBox(input, \"ispe\", currentOffset);\n if (!ispeBox) break;\n const rawWidth = readUInt32BE(input, ispeBox.offset + 12);\n const rawHeight = readUInt32BE(input, ispeBox.offset + 16);\n const clapBox = findBox(input, \"clap\", currentOffset);\n let width = rawWidth;\n let height = rawHeight;\n if (clapBox && clapBox.offset < ipcoBox.offset + ipcoBox.size) {\n const cropRight = readUInt32BE(input, clapBox.offset + 12);\n width = rawWidth - cropRight;\n }\n images.push({ height, width });\n currentOffset = ispeBox.offset + (ispeBox.size > 0 ? ispeBox.size : 8);\n }\n if (images.length === 0) {\n throw new TypeError(\"Invalid HEIF, no sizes found\");\n }\n return {\n width: images[0].width,\n height: images[0].height,\n type,\n ...images.length > 1 ? { images } : {}\n };\n }\n};\n\n// lib/types/icns.ts\nvar SIZE_HEADER2 = 4 + 4;\nvar FILE_LENGTH_OFFSET = 4;\nvar ENTRY_LENGTH_OFFSET = 4;\nvar ICON_TYPE_SIZE = {\n ICON: 32,\n \"ICN#\": 32,\n // m => 16 x 16\n \"icm#\": 16,\n icm4: 16,\n icm8: 16,\n // s => 16 x 16\n \"ics#\": 16,\n ics4: 16,\n ics8: 16,\n is32: 16,\n s8mk: 16,\n icp4: 16,\n // l => 32 x 32\n icl4: 32,\n icl8: 32,\n il32: 32,\n l8mk: 32,\n icp5: 32,\n ic11: 32,\n // h => 48 x 48\n ich4: 48,\n ich8: 48,\n ih32: 48,\n h8mk: 48,\n // . => 64 x 64\n icp6: 64,\n ic12: 32,\n // t => 128 x 128\n it32: 128,\n t8mk: 128,\n ic07: 128,\n // . => 256 x 256\n ic08: 256,\n ic13: 256,\n // . => 512 x 512\n ic09: 512,\n ic14: 512,\n // . => 1024 x 1024\n ic10: 1024\n};\nfunction readImageHeader(input, imageOffset) {\n const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET;\n return [\n toUTF8String(input, imageOffset, imageLengthOffset),\n readUInt32BE(input, imageLengthOffset)\n ];\n}\nfunction getImageSize2(type) {\n const size = ICON_TYPE_SIZE[type];\n return { width: size, height: size, type };\n}\nvar ICNS = {\n validate: (input) => toUTF8String(input, 0, 4) === \"icns\",\n calculate(input) {\n const inputLength = input.length;\n const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET);\n let imageOffset = SIZE_HEADER2;\n const images = [];\n while (imageOffset < fileLength && imageOffset < inputLength) {\n const imageHeader = readImageHeader(input, imageOffset);\n const imageSize2 = getImageSize2(imageHeader[0]);\n images.push(imageSize2);\n imageOffset += imageHeader[1] > 0 ? imageHeader[1] : 8;\n }\n if (images.length === 0) {\n throw new TypeError(\"Invalid ICNS, no sizes found\");\n }\n return {\n width: images[0].width,\n height: images[0].height,\n ...images.length > 1 ? { images } : {}\n };\n }\n};\n\n// lib/types/j2c.ts\nvar J2C = {\n // TODO: this doesn't seem right. SIZ marker doesn't have to be right after the SOC\n validate: (input) => readUInt32BE(input, 0) === 4283432785,\n calculate: (input) => ({\n height: readUInt32BE(input, 12),\n width: readUInt32BE(input, 8)\n })\n};\n\n// lib/types/jp2.ts\nvar JP2 = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"jP \") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === \"jp2 \";\n },\n calculate(input) {\n const jp2hBox = findBox(input, \"jp2h\", 0);\n const ihdrBox = jp2hBox && findBox(input, \"ihdr\", jp2hBox.offset + 8);\n if (ihdrBox) {\n return {\n height: readUInt32BE(input, ihdrBox.offset + 8),\n width: readUInt32BE(input, ihdrBox.offset + 12)\n };\n }\n throw new TypeError(\"Unsupported JPEG 2000 format\");\n }\n};\n\n// lib/types/jpg.ts\nvar EXIF_MARKER = \"45786966\";\nvar APP1_DATA_SIZE_BYTES = 2;\nvar EXIF_HEADER_BYTES = 6;\nvar TIFF_BYTE_ALIGN_BYTES = 2;\nvar BIG_ENDIAN_BYTE_ALIGN = \"4d4d\";\nvar LITTLE_ENDIAN_BYTE_ALIGN = \"4949\";\nvar IDF_ENTRY_BYTES = 12;\nvar NUM_DIRECTORY_ENTRIES_BYTES = 2;\nfunction isEXIF(input) {\n return toHexString(input, 2, 6) === EXIF_MARKER;\n}\nfunction extractSize(input, index) {\n return {\n height: readUInt16BE(input, index),\n width: readUInt16BE(input, index + 2)\n };\n}\nfunction extractOrientation(exifBlock, isBigEndian) {\n const idfOffset = 8;\n const offset = EXIF_HEADER_BYTES + idfOffset;\n const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian);\n for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) {\n const start = offset + NUM_DIRECTORY_ENTRIES_BYTES + directoryEntryNumber * IDF_ENTRY_BYTES;\n const end = start + IDF_ENTRY_BYTES;\n if (start > exifBlock.length) {\n return;\n }\n const block = exifBlock.slice(start, end);\n const tagNumber = readUInt(block, 16, 0, isBigEndian);\n if (tagNumber === 274) {\n const dataFormat = readUInt(block, 16, 2, isBigEndian);\n if (dataFormat !== 3) {\n return;\n }\n const numberOfComponents = readUInt(block, 32, 4, isBigEndian);\n if (numberOfComponents !== 1) {\n return;\n }\n return readUInt(block, 16, 8, isBigEndian);\n }\n }\n}\nfunction validateExifBlock(input, index) {\n const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index);\n const byteAlign = toHexString(\n exifBlock,\n EXIF_HEADER_BYTES,\n EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES\n );\n const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN;\n const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN;\n if (isBigEndian || isLittleEndian) {\n return extractOrientation(exifBlock, isBigEndian);\n }\n}\nfunction validateInput(input, index) {\n if (index > input.length) {\n throw new TypeError(\"Corrupt JPG, exceeded buffer limits\");\n }\n}\nvar JPG = {\n validate: (input) => toHexString(input, 0, 2) === \"ffd8\",\n calculate(_input) {\n let input = _input.slice(4);\n let orientation;\n let next;\n while (input.length) {\n const i = readUInt16BE(input, 0);\n validateInput(input, i);\n if (input[i] !== 255) {\n input = input.slice(1);\n continue;\n }\n if (isEXIF(input)) {\n orientation = validateExifBlock(input, i);\n }\n next = input[i + 1];\n if (next === 192 || next === 193 || next === 194) {\n const size = extractSize(input, i + 5);\n if (!orientation) {\n return size;\n }\n return {\n height: size.height,\n orientation,\n width: size.width\n };\n }\n input = input.slice(i + 2);\n }\n throw new TypeError(\"Invalid JPG, no size found\");\n }\n};\n\n// lib/utils/bit-reader.ts\nvar BitReader = class {\n constructor(input, endianness) {\n this.input = input;\n this.endianness = endianness;\n // Skip the first 16 bits (2 bytes) of signature\n this.byteOffset = 2;\n this.bitOffset = 0;\n }\n /** Reads a specified number of bits, and move the offset */\n getBits(length = 1) {\n let result = 0;\n let bitsRead = 0;\n while (bitsRead < length) {\n if (this.byteOffset >= this.input.length) {\n throw new Error(\"Reached end of input\");\n }\n const currentByte = this.input[this.byteOffset];\n const bitsLeft = 8 - this.bitOffset;\n const bitsToRead = Math.min(length - bitsRead, bitsLeft);\n if (this.endianness === \"little-endian\") {\n const mask = (1 << bitsToRead) - 1;\n const bits = currentByte >> this.bitOffset & mask;\n result |= bits << bitsRead;\n } else {\n const mask = (1 << bitsToRead) - 1 << 8 - this.bitOffset - bitsToRead;\n const bits = (currentByte & mask) >> 8 - this.bitOffset - bitsToRead;\n result = result << bitsToRead | bits;\n }\n bitsRead += bitsToRead;\n this.bitOffset += bitsToRead;\n if (this.bitOffset === 8) {\n this.byteOffset++;\n this.bitOffset = 0;\n }\n }\n return result;\n }\n};\n\n// lib/types/jxl-stream.ts\nfunction calculateImageDimension(reader, isSmallImage) {\n if (isSmallImage) {\n return 8 * (1 + reader.getBits(5));\n }\n const sizeClass = reader.getBits(2);\n const extraBits = [9, 13, 18, 30][sizeClass];\n return 1 + reader.getBits(extraBits);\n}\nfunction calculateImageWidth(reader, isSmallImage, widthMode, height) {\n if (isSmallImage && widthMode === 0) {\n return 8 * (1 + reader.getBits(5));\n }\n if (widthMode === 0) {\n return calculateImageDimension(reader, false);\n }\n const aspectRatios = [1, 1.2, 4 / 3, 1.5, 16 / 9, 5 / 4, 2];\n return Math.floor(height * aspectRatios[widthMode - 1]);\n}\nvar JXLStream = {\n validate: (input) => {\n return toHexString(input, 0, 2) === \"ff0a\";\n },\n calculate(input) {\n const reader = new BitReader(input, \"little-endian\");\n const isSmallImage = reader.getBits(1) === 1;\n const height = calculateImageDimension(reader, isSmallImage);\n const widthMode = reader.getBits(3);\n const width = calculateImageWidth(reader, isSmallImage, widthMode, height);\n return { width, height };\n }\n};\n\n// lib/types/jxl.ts\nfunction extractCodestream(input) {\n const jxlcBox = findBox(input, \"jxlc\", 0);\n if (jxlcBox) {\n return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size);\n }\n const partialStreams = extractPartialStreams(input);\n if (partialStreams.length > 0) {\n return concatenateCodestreams(partialStreams);\n }\n return void 0;\n}\nfunction extractPartialStreams(input) {\n const partialStreams = [];\n let offset = 0;\n while (offset < input.length) {\n const jxlpBox = findBox(input, \"jxlp\", offset);\n if (!jxlpBox) break;\n partialStreams.push(\n input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size)\n );\n offset = jxlpBox.offset + (jxlpBox.size > 0 ? jxlpBox.size : 8);\n }\n return partialStreams;\n}\nfunction concatenateCodestreams(partialCodestreams) {\n const totalLength = partialCodestreams.reduce(\n (acc, curr) => acc + curr.length,\n 0\n );\n const codestream = new Uint8Array(totalLength);\n let position = 0;\n for (const partial of partialCodestreams) {\n codestream.set(partial, position);\n position += partial.length;\n }\n return codestream;\n}\nvar JXL = {\n validate: (input) => {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"JXL \") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === \"jxl \";\n },\n calculate(input) {\n const codestream = extractCodestream(input);\n if (codestream) return JXLStream.calculate(codestream);\n throw new Error(\"No codestream found in JXL container\");\n }\n};\n\n// lib/types/ktx.ts\nvar KTX = {\n validate: (input) => {\n const signature = toUTF8String(input, 1, 7);\n return [\"KTX 11\", \"KTX 20\"].includes(signature);\n },\n calculate: (input) => {\n const type = input[5] === 49 ? \"ktx\" : \"ktx2\";\n const offset = type === \"ktx\" ? 36 : 20;\n return {\n height: readUInt32LE(input, offset + 4),\n width: readUInt32LE(input, offset),\n type\n };\n }\n};\n\n// lib/types/png.ts\nvar pngSignature = \"PNG\\r\\n\u001a\\n\";\nvar pngImageHeaderChunkName = \"IHDR\";\nvar pngFriedChunkName = \"CgBI\";\nvar PNG = {\n validate(input) {\n if (pngSignature === toUTF8String(input, 1, 8)) {\n let chunkName = toUTF8String(input, 12, 16);\n if (chunkName === pngFriedChunkName) {\n chunkName = toUTF8String(input, 28, 32);\n }\n if (chunkName !== pngImageHeaderChunkName) {\n throw new TypeError(\"Invalid PNG\");\n }\n return true;\n }\n return false;\n },\n calculate(input) {\n if (toUTF8String(input, 12, 16) === pngFriedChunkName) {\n return {\n height: readUInt32BE(input, 36),\n width: readUInt32BE(input, 32)\n };\n }\n return {\n height: readUInt32BE(input, 20),\n width: readUInt32BE(input, 16)\n };\n }\n};\n\n// lib/types/pnm.ts\nvar PNMTypes = {\n P1: \"pbm/ascii\",\n P2: \"pgm/ascii\",\n P3: \"ppm/ascii\",\n P4: \"pbm\",\n P5: \"pgm\",\n P6: \"ppm\",\n P7: \"pam\",\n PF: \"pfm\"\n};\nvar handlers = {\n default: (lines) => {\n let dimensions = [];\n while (lines.length > 0) {\n const line = lines.shift();\n if (line[0] === \"#\") {\n continue;\n }\n dimensions = line.split(\" \");\n break;\n }\n if (dimensions.length === 2) {\n return {\n height: Number.parseInt(dimensions[1], 10),\n width: Number.parseInt(dimensions[0], 10)\n };\n }\n throw new TypeError(\"Invalid PNM\");\n },\n pam: (lines) => {\n const size = {};\n while (lines.length > 0) {\n const line = lines.shift();\n if (line.length > 16 || line.charCodeAt(0) > 128) {\n continue;\n }\n const [key, value] = line.split(\" \");\n if (key && value) {\n size[key.toLowerCase()] = Number.parseInt(value, 10);\n }\n if (size.height && size.width) {\n break;\n }\n }\n if (size.height && size.width) {\n return {\n height: size.height,\n width: size.width\n };\n }\n throw new TypeError(\"Invalid PAM\");\n }\n};\nvar PNM = {\n validate: (input) => toUTF8String(input, 0, 2) in PNMTypes,\n calculate(input) {\n const signature = toUTF8String(input, 0, 2);\n const type = PNMTypes[signature];\n const lines = toUTF8String(input, 3).split(/[\\r\\n]+/);\n const handler = handlers[type] || handlers.default;\n return handler(lines);\n }\n};\n\n// lib/types/psd.ts\nvar PSD = {\n validate: (input) => toUTF8String(input, 0, 4) === \"8BPS\",\n calculate: (input) => ({\n height: readUInt32BE(input, 14),\n width: readUInt32BE(input, 18)\n })\n};\n\n// lib/types/svg.ts\nvar svgReg = /<svg\\s([^>\"']|\"[^\"]*\"|'[^']*')*>/;\nvar extractorRegExps = {\n height: /\\sheight=(['\"])([^%]+?)\\1/,\n root: svgReg,\n viewbox: /\\sviewBox=(['\"])(.+?)\\1/i,\n width: /\\swidth=(['\"])([^%]+?)\\1/\n};\nvar INCH_CM = 2.54;\nvar units = {\n in: 96,\n cm: 96 / INCH_CM,\n em: 16,\n ex: 8,\n m: 96 / INCH_CM * 100,\n mm: 96 / INCH_CM / 10,\n pc: 96 / 72 / 12,\n pt: 96 / 72,\n px: 1\n};\nvar unitsReg = new RegExp(\n `^([0-9.]+(?:e\\\\d+)?)(${Object.keys(units).join(\"|\")})?$`\n);\nfunction parseLength(len) {\n const m = unitsReg.exec(len);\n if (!m) {\n return void 0;\n }\n return Math.round(Number(m[1]) * (units[m[2]] || 1));\n}\nfunction parseViewbox(viewbox) {\n const bounds = viewbox.split(\" \");\n return {\n height: parseLength(bounds[3]),\n width: parseLength(bounds[2])\n };\n}\nfunction parseAttributes(root) {\n const width = root.match(extractorRegExps.width);\n const height = root.match(extractorRegExps.height);\n const viewbox = root.match(extractorRegExps.viewbox);\n return {\n height: height && parseLength(height[2]),\n viewbox: viewbox && parseViewbox(viewbox[2]),\n width: width && parseLength(width[2])\n };\n}\nfunction calculateByDimensions(attrs) {\n return {\n height: attrs.height,\n width: attrs.width\n };\n}\nfunction calculateByViewbox(attrs, viewbox) {\n const ratio = viewbox.width / viewbox.height;\n if (attrs.width) {\n return {\n height: Math.floor(attrs.width / ratio),\n width: attrs.width\n };\n }\n if (attrs.height) {\n return {\n height: attrs.height,\n width: Math.floor(attrs.height * ratio)\n };\n }\n return {\n height: viewbox.height,\n width: viewbox.width\n };\n}\nvar SVG = {\n // Scan only the first kilo-byte to speed up the check on larger files\n validate: (input) => svgReg.test(toUTF8String(input, 0, 1e3)),\n calculate(input) {\n const root = toUTF8String(input).match(extractorRegExps.root);\n if (root) {\n const attrs = parseAttributes(root[0]);\n if (attrs.width && attrs.height) {\n return calculateByDimensions(attrs);\n }\n if (attrs.viewbox) {\n return calculateByViewbox(attrs, attrs.viewbox);\n }\n }\n throw new TypeError(\"Invalid SVG\");\n }\n};\n\n// lib/types/tga.ts\nvar TGA = {\n validate(input) {\n return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0;\n },\n calculate(input) {\n return {\n height: readUInt16LE(input, 14),\n width: readUInt16LE(input, 12)\n };\n }\n};\n\n// lib/types/tiff.ts\nvar CONSTANTS = {\n TAG: {\n WIDTH: 256,\n HEIGHT: 257,\n COMPRESSION: 259\n },\n TYPE: {\n SHORT: 3,\n LONG: 4,\n LONG8: 16\n },\n ENTRY_SIZE: {\n STANDARD: 12,\n BIG: 20\n },\n COUNT_SIZE: {\n STANDARD: 2,\n BIG: 8\n }\n};\nfunction readIFD(input, { isBigEndian, isBigTiff }) {\n const ifdOffset = isBigTiff ? Number(readUInt64(input, 8, isBigEndian)) : readUInt(input, 32, 4, isBigEndian);\n const entryCountSize = isBigTiff ? CONSTANTS.COUNT_SIZE.BIG : CONSTANTS.COUNT_SIZE.STANDARD;\n return input.slice(ifdOffset + entryCountSize);\n}\nfunction readTagValue(input, type, offset, isBigEndian) {\n switch (type) {\n case CONSTANTS.TYPE.SHORT:\n return readUInt(input, 16, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG:\n return readUInt(input, 32, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG8: {\n const value = Number(readUInt64(input, offset, isBigEndian));\n if (value > Number.MAX_SAFE_INTEGER) {\n throw new TypeError(\"Value too large\");\n }\n return value;\n }\n default:\n return 0;\n }\n}\nfunction nextTag(input, isBigTiff) {\n const entrySize = isBigTiff ? CONSTANTS.ENTRY_SIZE.BIG : CONSTANTS.ENTRY_SIZE.STANDARD;\n if (input.length > entrySize) {\n return input.slice(entrySize);\n }\n}\nfunction extractTags(input, { isBigEndian, isBigTiff }) {\n const tags = {};\n let temp = input;\n while (temp?.length) {\n const code = readUInt(temp, 16, 0, isBigEndian);\n const type = readUInt(temp, 16, 2, isBigEndian);\n const length = isBigTiff ? Number(readUInt64(temp, 4, isBigEndian)) : readUInt(temp, 32, 4, isBigEndian);\n if (code === 0) break;\n if (length === 1 && (type === CONSTANTS.TYPE.SHORT || type === CONSTANTS.TYPE.LONG || isBigTiff && type === CONSTANTS.TYPE.LONG8)) {\n const valueOffset = isBigTiff ? 12 : 8;\n tags[code] = readTagValue(temp, type, valueOffset, isBigEndian);\n }\n temp = nextTag(temp, isBigTiff);\n }\n return tags;\n}\nfunction determineFormat(input) {\n const signature = toUTF8String(input, 0, 2);\n const version = readUInt(input, 16, 2, signature === \"MM\");\n return {\n isBigEndian: signature === \"MM\",\n isBigTiff: version === 43\n };\n}\nfunction validateBigTIFFHeader(input, isBigEndian) {\n const byteSize = readUInt(input, 16, 4, isBigEndian);\n const reserved = readUInt(input, 16, 6, isBigEndian);\n if (byteSize !== 8 || reserved !== 0) {\n throw new TypeError(\"Invalid BigTIFF header\");\n }\n}\nvar signatures = /* @__PURE__ */ new Set([\n \"49492a00\",\n // Little Endian\n \"4d4d002a\",\n // Big Endian\n \"49492b00\",\n // BigTIFF Little Endian\n \"4d4d002b\"\n // BigTIFF Big Endian\n]);\nvar TIFF = {\n validate: (input) => {\n const signature = toHexString(input, 0, 4);\n return signatures.has(signature);\n },\n calculate(input) {\n const format = determineFormat(input);\n if (format.isBigTiff) {\n validateBigTIFFHeader(input, format.isBigEndian);\n }\n const ifdBuffer = readIFD(input, format);\n const tags = extractTags(ifdBuffer, format);\n const info = {\n height: tags[CONSTANTS.TAG.HEIGHT],\n width: tags[CONSTANTS.TAG.WIDTH],\n type: format.isBigTiff ? \"bigtiff\" : \"tiff\"\n };\n if (tags[CONSTANTS.TAG.COMPRESSION]) {\n info.compression = tags[CONSTANTS.TAG.COMPRESSION];\n }\n if (!info.width || !info.height) {\n throw new TypeError(\"Invalid Tiff. Missing tags\");\n }\n return info;\n }\n};\n\n// lib/types/webp.ts\nfunction calculateExtended(input) {\n return {\n height: 1 + readUInt24LE(input, 7),\n width: 1 + readUInt24LE(input, 4)\n };\n}\nfunction calculateLossless(input) {\n return {\n height: 1 + ((input[4] & 15) << 10 | input[3] << 2 | (input[2] & 192) >> 6),\n width: 1 + ((input[2] & 63) << 8 | input[1])\n };\n}\nfunction calculateLossy(input) {\n return {\n height: readInt16LE(input, 8) & 16383,\n width: readInt16LE(input, 6) & 16383\n };\n}\nvar WEBP = {\n validate(input) {\n const riffHeader = \"RIFF\" === toUTF8String(input, 0, 4);\n const webpHeader = \"WEBP\" === toUTF8String(input, 8, 12);\n const vp8Header = \"VP8\" === toUTF8String(input, 12, 15);\n return riffHeader && webpHeader && vp8Header;\n },\n calculate(_input) {\n const chunkHeader = toUTF8String(_input, 12, 16);\n const input = _input.slice(20, 30);\n if (chunkHeader === \"VP8X\") {\n const extendedHeader = input[0];\n const validStart = (extendedHeader & 192) === 0;\n const validEnd = (extendedHeader & 1) === 0;\n if (validStart && validEnd) {\n return calculateExtended(input);\n }\n throw new TypeError(\"Invalid WebP\");\n }\n if (chunkHeader === \"VP8 \" && input[0] !== 47) {\n return calculateLossy(input);\n }\n const signature = toHexString(input, 3, 6);\n if (chunkHeader === \"VP8L\" && signature !== \"9d012a\") {\n return calculateLossless(input);\n }\n throw new TypeError(\"Invalid WebP\");\n }\n};\n\n// lib/types/index.ts\nvar typeHandlers = /* @__PURE__ */ new Map([\n [\"bmp\", BMP],\n [\"cur\", CUR],\n [\"dds\", DDS],\n [\"gif\", GIF],\n [\"heif\", HEIF],\n [\"icns\", ICNS],\n [\"ico\", ICO],\n [\"j2c\", J2C],\n [\"jp2\", JP2],\n [\"jpg\", JPG],\n [\"jxl\", JXL],\n [\"jxl-stream\", JXLStream],\n [\"ktx\", KTX],\n [\"png\", PNG],\n [\"pnm\", PNM],\n [\"psd\", PSD],\n [\"svg\", SVG],\n [\"tga\", TGA],\n [\"tiff\", TIFF],\n [\"webp\", WEBP]\n]);\nvar types = Array.from(typeHandlers.keys());\n\n// lib/detector.ts\nvar firstBytes = /* @__PURE__ */ new Map([\n [0, \"heif\"],\n [56, \"psd\"],\n [66, \"bmp\"],\n [68, \"dds\"],\n [71, \"gif\"],\n [73, \"tiff\"],\n [77, \"tiff\"],\n [82, \"webp\"],\n [105, \"icns\"],\n [137, \"png\"],\n [255, \"jpg\"]\n]);\nfunction detector(input) {\n const byte = input[0];\n const type = firstBytes.get(byte);\n if (type && typeHandlers.get(type).validate(input)) {\n return type;\n }\n return types.find((type2) => typeHandlers.get(type2).validate(input));\n}\n\n// lib/lookup.ts\nvar globalOptions = {\n disabledTypes: []\n};\nfunction imageSize(input) {\n const type = detector(input);\n if (typeof type !== \"undefined\") {\n if (globalOptions.disabledTypes.indexOf(type) > -1) {\n throw new TypeError(`disabled file type: ${type}`);\n }\n const size = typeHandlers.get(type).calculate(input);\n if (size !== void 0) {\n size.type = size.type ?? type;\n if (size.images && size.images.length > 1) {\n const largestImage = size.images.reduce((largest, current) => {\n return current.width * current.height > largest.width * largest.height ? current : largest;\n }, size.images[0]);\n size.width = largestImage.width;\n size.height = largestImage.height;\n }\n return size;\n }\n }\n throw new TypeError(`unsupported file type: ${type}`);\n}\nvar disableTypes = (types2) => {\n globalOptions.disabledTypes = types2;\n};\n\nexport { imageSize as default, disableTypes, imageSize, types };\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dist-BAsh8dbf.mjs","names":[],"sources":["../../../node_modules/.pnpm/image-size@2.0.2_patch_hash=77c12533e3a635c4066c55da8952f4912e8210416539dc1249550fa639271595/node_modules/image-size/dist/index.mjs"],"sourcesContent":["// lib/types/utils.ts\nvar decoder = new TextDecoder();\nvar toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));\nvar toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + `0${i.toString(16)}`.slice(-2), \"\");\nvar getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset);\nvar readInt16LE = (input, offset = 0) => getView(input, offset).getInt16(0, true);\nvar readUInt16BE = (input, offset = 0) => getView(input, offset).getUint16(0, false);\nvar readUInt16LE = (input, offset = 0) => getView(input, offset).getUint16(0, true);\nvar readUInt24LE = (input, offset = 0) => {\n const view = getView(input, offset);\n return view.getUint16(0, true) + (view.getUint8(2) << 16);\n};\nvar readInt32LE = (input, offset = 0) => getView(input, offset).getInt32(0, true);\nvar readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false);\nvar readUInt32LE = (input, offset = 0) => getView(input, offset).getUint32(0, true);\nvar readUInt64 = (input, offset, isBigEndian) => getView(input, offset).getBigUint64(0, !isBigEndian);\nvar methods = {\n readUInt16BE,\n readUInt16LE,\n readUInt32BE,\n readUInt32LE\n};\nfunction readUInt(input, bits, offset = 0, isBigEndian = false) {\n const endian = isBigEndian ? \"BE\" : \"LE\";\n const methodName = `readUInt${bits}${endian}`;\n return methods[methodName](input, offset);\n}\nfunction readBox(input, offset) {\n if (input.length - offset < 4) return;\n const boxSize = readUInt32BE(input, offset);\n if (input.length - offset < boxSize) return;\n return {\n name: toUTF8String(input, 4 + offset, 8 + offset),\n offset,\n size: boxSize\n };\n}\nfunction findBox(input, boxName, currentOffset) {\n while (currentOffset < input.length) {\n const box = readBox(input, currentOffset);\n if (!box) break;\n if (box.name === boxName) return box;\n currentOffset += box.size > 0 ? box.size : 8;\n }\n}\n\n// lib/types/bmp.ts\nvar BMP = {\n validate: (input) => toUTF8String(input, 0, 2) === \"BM\",\n calculate: (input) => ({\n height: Math.abs(readInt32LE(input, 22)),\n width: readUInt32LE(input, 18)\n })\n};\n\n// lib/types/ico.ts\nvar TYPE_ICON = 1;\nvar SIZE_HEADER = 2 + 2 + 2;\nvar SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4;\nfunction getSizeFromOffset(input, offset) {\n const value = input[offset];\n return value === 0 ? 256 : value;\n}\nfunction getImageSize(input, imageIndex) {\n const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY;\n return {\n height: getSizeFromOffset(input, offset + 1),\n width: getSizeFromOffset(input, offset)\n };\n}\nvar ICO = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0) return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_ICON;\n },\n calculate(input) {\n const nbImages = readUInt16LE(input, 4);\n const imageSize2 = getImageSize(input, 0);\n if (nbImages === 1) return imageSize2;\n const images = [];\n for (let imageIndex = 0; imageIndex < nbImages; imageIndex += 1) {\n images.push(getImageSize(input, imageIndex));\n }\n return {\n width: imageSize2.width,\n height: imageSize2.height,\n images\n };\n }\n};\n\n// lib/types/cur.ts\nvar TYPE_CURSOR = 2;\nvar CUR = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0) return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_CURSOR;\n },\n calculate: (input) => ICO.calculate(input)\n};\n\n// lib/types/dds.ts\nvar DDS = {\n validate: (input) => readUInt32LE(input, 0) === 542327876,\n calculate: (input) => ({\n height: readUInt32LE(input, 12),\n width: readUInt32LE(input, 16)\n })\n};\n\n// lib/types/gif.ts\nvar gifRegexp = /^GIF8[79]a/;\nvar GIF = {\n validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)),\n calculate: (input) => ({\n height: readUInt16LE(input, 8),\n width: readUInt16LE(input, 6)\n })\n};\n\n// lib/types/heif.ts\nvar brandMap = {\n avif: \"avif\",\n mif1: \"heif\",\n msf1: \"heif\",\n // heif-sequence\n heic: \"heic\",\n heix: \"heic\",\n hevc: \"heic\",\n // heic-sequence\n hevx: \"heic\"\n // heic-sequence\n};\nvar HEIF = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"ftyp\") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand in brandMap;\n },\n calculate(input) {\n const metaBox = findBox(input, \"meta\", 0);\n const iprpBox = metaBox && findBox(input, \"iprp\", metaBox.offset + 12);\n const ipcoBox = iprpBox && findBox(input, \"ipco\", iprpBox.offset + 8);\n if (!ipcoBox) {\n throw new TypeError(\"Invalid HEIF, no ipco box found\");\n }\n const type = toUTF8String(input, 8, 12);\n const images = [];\n let currentOffset = ipcoBox.offset + 8;\n while (currentOffset < ipcoBox.offset + ipcoBox.size) {\n const ispeBox = findBox(input, \"ispe\", currentOffset);\n if (!ispeBox) break;\n const rawWidth = readUInt32BE(input, ispeBox.offset + 12);\n const rawHeight = readUInt32BE(input, ispeBox.offset + 16);\n const clapBox = findBox(input, \"clap\", currentOffset);\n let width = rawWidth;\n let height = rawHeight;\n if (clapBox && clapBox.offset < ipcoBox.offset + ipcoBox.size) {\n const cropRight = readUInt32BE(input, clapBox.offset + 12);\n width = rawWidth - cropRight;\n }\n images.push({ height, width });\n currentOffset = ispeBox.offset + (ispeBox.size > 0 ? ispeBox.size : 8);\n }\n if (images.length === 0) {\n throw new TypeError(\"Invalid HEIF, no sizes found\");\n }\n return {\n width: images[0].width,\n height: images[0].height,\n type,\n ...images.length > 1 ? { images } : {}\n };\n }\n};\n\n// lib/types/icns.ts\nvar SIZE_HEADER2 = 4 + 4;\nvar FILE_LENGTH_OFFSET = 4;\nvar ENTRY_LENGTH_OFFSET = 4;\nvar ICON_TYPE_SIZE = {\n ICON: 32,\n \"ICN#\": 32,\n // m => 16 x 16\n \"icm#\": 16,\n icm4: 16,\n icm8: 16,\n // s => 16 x 16\n \"ics#\": 16,\n ics4: 16,\n ics8: 16,\n is32: 16,\n s8mk: 16,\n icp4: 16,\n // l => 32 x 32\n icl4: 32,\n icl8: 32,\n il32: 32,\n l8mk: 32,\n icp5: 32,\n ic11: 32,\n // h => 48 x 48\n ich4: 48,\n ich8: 48,\n ih32: 48,\n h8mk: 48,\n // . => 64 x 64\n icp6: 64,\n ic12: 32,\n // t => 128 x 128\n it32: 128,\n t8mk: 128,\n ic07: 128,\n // . => 256 x 256\n ic08: 256,\n ic13: 256,\n // . => 512 x 512\n ic09: 512,\n ic14: 512,\n // . => 1024 x 1024\n ic10: 1024\n};\nfunction readImageHeader(input, imageOffset) {\n const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET;\n return [\n toUTF8String(input, imageOffset, imageLengthOffset),\n readUInt32BE(input, imageLengthOffset)\n ];\n}\nfunction getImageSize2(type) {\n const size = ICON_TYPE_SIZE[type];\n return { width: size, height: size, type };\n}\nvar ICNS = {\n validate: (input) => toUTF8String(input, 0, 4) === \"icns\",\n calculate(input) {\n const inputLength = input.length;\n const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET);\n let imageOffset = SIZE_HEADER2;\n const images = [];\n while (imageOffset < fileLength && imageOffset < inputLength) {\n const imageHeader = readImageHeader(input, imageOffset);\n const imageSize2 = getImageSize2(imageHeader[0]);\n images.push(imageSize2);\n imageOffset += imageHeader[1] > 0 ? imageHeader[1] : 8;\n }\n if (images.length === 0) {\n throw new TypeError(\"Invalid ICNS, no sizes found\");\n }\n return {\n width: images[0].width,\n height: images[0].height,\n ...images.length > 1 ? { images } : {}\n };\n }\n};\n\n// lib/types/j2c.ts\nvar J2C = {\n // TODO: this doesn't seem right. SIZ marker doesn't have to be right after the SOC\n validate: (input) => readUInt32BE(input, 0) === 4283432785,\n calculate: (input) => ({\n height: readUInt32BE(input, 12),\n width: readUInt32BE(input, 8)\n })\n};\n\n// lib/types/jp2.ts\nvar JP2 = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"jP \") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === \"jp2 \";\n },\n calculate(input) {\n const jp2hBox = findBox(input, \"jp2h\", 0);\n const ihdrBox = jp2hBox && findBox(input, \"ihdr\", jp2hBox.offset + 8);\n if (ihdrBox) {\n return {\n height: readUInt32BE(input, ihdrBox.offset + 8),\n width: readUInt32BE(input, ihdrBox.offset + 12)\n };\n }\n throw new TypeError(\"Unsupported JPEG 2000 format\");\n }\n};\n\n// lib/types/jpg.ts\nvar EXIF_MARKER = \"45786966\";\nvar APP1_DATA_SIZE_BYTES = 2;\nvar EXIF_HEADER_BYTES = 6;\nvar TIFF_BYTE_ALIGN_BYTES = 2;\nvar BIG_ENDIAN_BYTE_ALIGN = \"4d4d\";\nvar LITTLE_ENDIAN_BYTE_ALIGN = \"4949\";\nvar IDF_ENTRY_BYTES = 12;\nvar NUM_DIRECTORY_ENTRIES_BYTES = 2;\nfunction isEXIF(input) {\n return toHexString(input, 2, 6) === EXIF_MARKER;\n}\nfunction extractSize(input, index) {\n return {\n height: readUInt16BE(input, index),\n width: readUInt16BE(input, index + 2)\n };\n}\nfunction extractOrientation(exifBlock, isBigEndian) {\n const idfOffset = 8;\n const offset = EXIF_HEADER_BYTES + idfOffset;\n const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian);\n for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) {\n const start = offset + NUM_DIRECTORY_ENTRIES_BYTES + directoryEntryNumber * IDF_ENTRY_BYTES;\n const end = start + IDF_ENTRY_BYTES;\n if (start > exifBlock.length) {\n return;\n }\n const block = exifBlock.slice(start, end);\n const tagNumber = readUInt(block, 16, 0, isBigEndian);\n if (tagNumber === 274) {\n const dataFormat = readUInt(block, 16, 2, isBigEndian);\n if (dataFormat !== 3) {\n return;\n }\n const numberOfComponents = readUInt(block, 32, 4, isBigEndian);\n if (numberOfComponents !== 1) {\n return;\n }\n return readUInt(block, 16, 8, isBigEndian);\n }\n }\n}\nfunction validateExifBlock(input, index) {\n const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index);\n const byteAlign = toHexString(\n exifBlock,\n EXIF_HEADER_BYTES,\n EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES\n );\n const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN;\n const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN;\n if (isBigEndian || isLittleEndian) {\n return extractOrientation(exifBlock, isBigEndian);\n }\n}\nfunction validateInput(input, index) {\n if (index > input.length) {\n throw new TypeError(\"Corrupt JPG, exceeded buffer limits\");\n }\n}\nvar JPG = {\n validate: (input) => toHexString(input, 0, 2) === \"ffd8\",\n calculate(_input) {\n let input = _input.slice(4);\n let orientation;\n let next;\n while (input.length) {\n const i = readUInt16BE(input, 0);\n validateInput(input, i);\n if (input[i] !== 255) {\n input = input.slice(1);\n continue;\n }\n if (isEXIF(input)) {\n orientation = validateExifBlock(input, i);\n }\n next = input[i + 1];\n if (next === 192 || next === 193 || next === 194) {\n const size = extractSize(input, i + 5);\n if (!orientation) {\n return size;\n }\n return {\n height: size.height,\n orientation,\n width: size.width\n };\n }\n input = input.slice(i + 2);\n }\n throw new TypeError(\"Invalid JPG, no size found\");\n }\n};\n\n// lib/utils/bit-reader.ts\nvar BitReader = class {\n constructor(input, endianness) {\n this.input = input;\n this.endianness = endianness;\n // Skip the first 16 bits (2 bytes) of signature\n this.byteOffset = 2;\n this.bitOffset = 0;\n }\n /** Reads a specified number of bits, and move the offset */\n getBits(length = 1) {\n let result = 0;\n let bitsRead = 0;\n while (bitsRead < length) {\n if (this.byteOffset >= this.input.length) {\n throw new Error(\"Reached end of input\");\n }\n const currentByte = this.input[this.byteOffset];\n const bitsLeft = 8 - this.bitOffset;\n const bitsToRead = Math.min(length - bitsRead, bitsLeft);\n if (this.endianness === \"little-endian\") {\n const mask = (1 << bitsToRead) - 1;\n const bits = currentByte >> this.bitOffset & mask;\n result |= bits << bitsRead;\n } else {\n const mask = (1 << bitsToRead) - 1 << 8 - this.bitOffset - bitsToRead;\n const bits = (currentByte & mask) >> 8 - this.bitOffset - bitsToRead;\n result = result << bitsToRead | bits;\n }\n bitsRead += bitsToRead;\n this.bitOffset += bitsToRead;\n if (this.bitOffset === 8) {\n this.byteOffset++;\n this.bitOffset = 0;\n }\n }\n return result;\n }\n};\n\n// lib/types/jxl-stream.ts\nfunction calculateImageDimension(reader, isSmallImage) {\n if (isSmallImage) {\n return 8 * (1 + reader.getBits(5));\n }\n const sizeClass = reader.getBits(2);\n const extraBits = [9, 13, 18, 30][sizeClass];\n return 1 + reader.getBits(extraBits);\n}\nfunction calculateImageWidth(reader, isSmallImage, widthMode, height) {\n if (isSmallImage && widthMode === 0) {\n return 8 * (1 + reader.getBits(5));\n }\n if (widthMode === 0) {\n return calculateImageDimension(reader, false);\n }\n const aspectRatios = [1, 1.2, 4 / 3, 1.5, 16 / 9, 5 / 4, 2];\n return Math.floor(height * aspectRatios[widthMode - 1]);\n}\nvar JXLStream = {\n validate: (input) => {\n return toHexString(input, 0, 2) === \"ff0a\";\n },\n calculate(input) {\n const reader = new BitReader(input, \"little-endian\");\n const isSmallImage = reader.getBits(1) === 1;\n const height = calculateImageDimension(reader, isSmallImage);\n const widthMode = reader.getBits(3);\n const width = calculateImageWidth(reader, isSmallImage, widthMode, height);\n return { width, height };\n }\n};\n\n// lib/types/jxl.ts\nfunction extractCodestream(input) {\n const jxlcBox = findBox(input, \"jxlc\", 0);\n if (jxlcBox) {\n return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size);\n }\n const partialStreams = extractPartialStreams(input);\n if (partialStreams.length > 0) {\n return concatenateCodestreams(partialStreams);\n }\n return void 0;\n}\nfunction extractPartialStreams(input) {\n const partialStreams = [];\n let offset = 0;\n while (offset < input.length) {\n const jxlpBox = findBox(input, \"jxlp\", offset);\n if (!jxlpBox) break;\n partialStreams.push(\n input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size)\n );\n offset = jxlpBox.offset + (jxlpBox.size > 0 ? jxlpBox.size : 8);\n }\n return partialStreams;\n}\nfunction concatenateCodestreams(partialCodestreams) {\n const totalLength = partialCodestreams.reduce(\n (acc, curr) => acc + curr.length,\n 0\n );\n const codestream = new Uint8Array(totalLength);\n let position = 0;\n for (const partial of partialCodestreams) {\n codestream.set(partial, position);\n position += partial.length;\n }\n return codestream;\n}\nvar JXL = {\n validate: (input) => {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"JXL \") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === \"jxl \";\n },\n calculate(input) {\n const codestream = extractCodestream(input);\n if (codestream) return JXLStream.calculate(codestream);\n throw new Error(\"No codestream found in JXL container\");\n }\n};\n\n// lib/types/ktx.ts\nvar KTX = {\n validate: (input) => {\n const signature = toUTF8String(input, 1, 7);\n return [\"KTX 11\", \"KTX 20\"].includes(signature);\n },\n calculate: (input) => {\n const type = input[5] === 49 ? \"ktx\" : \"ktx2\";\n const offset = type === \"ktx\" ? 36 : 20;\n return {\n height: readUInt32LE(input, offset + 4),\n width: readUInt32LE(input, offset),\n type\n };\n }\n};\n\n// lib/types/png.ts\nvar pngSignature = \"PNG\\r\\n\u001a\\n\";\nvar pngImageHeaderChunkName = \"IHDR\";\nvar pngFriedChunkName = \"CgBI\";\nvar PNG = {\n validate(input) {\n if (pngSignature === toUTF8String(input, 1, 8)) {\n let chunkName = toUTF8String(input, 12, 16);\n if (chunkName === pngFriedChunkName) {\n chunkName = toUTF8String(input, 28, 32);\n }\n if (chunkName !== pngImageHeaderChunkName) {\n throw new TypeError(\"Invalid PNG\");\n }\n return true;\n }\n return false;\n },\n calculate(input) {\n if (toUTF8String(input, 12, 16) === pngFriedChunkName) {\n return {\n height: readUInt32BE(input, 36),\n width: readUInt32BE(input, 32)\n };\n }\n return {\n height: readUInt32BE(input, 20),\n width: readUInt32BE(input, 16)\n };\n }\n};\n\n// lib/types/pnm.ts\nvar PNMTypes = {\n P1: \"pbm/ascii\",\n P2: \"pgm/ascii\",\n P3: \"ppm/ascii\",\n P4: \"pbm\",\n P5: \"pgm\",\n P6: \"ppm\",\n P7: \"pam\",\n PF: \"pfm\"\n};\nvar handlers = {\n default: (lines) => {\n let dimensions = [];\n while (lines.length > 0) {\n const line = lines.shift();\n if (line[0] === \"#\") {\n continue;\n }\n dimensions = line.split(\" \");\n break;\n }\n if (dimensions.length === 2) {\n return {\n height: Number.parseInt(dimensions[1], 10),\n width: Number.parseInt(dimensions[0], 10)\n };\n }\n throw new TypeError(\"Invalid PNM\");\n },\n pam: (lines) => {\n const size = {};\n while (lines.length > 0) {\n const line = lines.shift();\n if (line.length > 16 || line.charCodeAt(0) > 128) {\n continue;\n }\n const [key, value] = line.split(\" \");\n if (key && value) {\n size[key.toLowerCase()] = Number.parseInt(value, 10);\n }\n if (size.height && size.width) {\n break;\n }\n }\n if (size.height && size.width) {\n return {\n height: size.height,\n width: size.width\n };\n }\n throw new TypeError(\"Invalid PAM\");\n }\n};\nvar PNM = {\n validate: (input) => toUTF8String(input, 0, 2) in PNMTypes,\n calculate(input) {\n const signature = toUTF8String(input, 0, 2);\n const type = PNMTypes[signature];\n const lines = toUTF8String(input, 3).split(/[\\r\\n]+/);\n const handler = handlers[type] || handlers.default;\n return handler(lines);\n }\n};\n\n// lib/types/psd.ts\nvar PSD = {\n validate: (input) => toUTF8String(input, 0, 4) === \"8BPS\",\n calculate: (input) => ({\n height: readUInt32BE(input, 14),\n width: readUInt32BE(input, 18)\n })\n};\n\n// lib/types/svg.ts\nvar svgReg = /<svg\\s([^>\"']|\"[^\"]*\"|'[^']*')*>/;\nvar extractorRegExps = {\n height: /\\sheight=(['\"])([^%]+?)\\1/,\n root: svgReg,\n viewbox: /\\sviewBox=(['\"])(.+?)\\1/i,\n width: /\\swidth=(['\"])([^%]+?)\\1/\n};\nvar INCH_CM = 2.54;\nvar units = {\n in: 96,\n cm: 96 / INCH_CM,\n em: 16,\n ex: 8,\n m: 96 / INCH_CM * 100,\n mm: 96 / INCH_CM / 10,\n pc: 96 / 72 / 12,\n pt: 96 / 72,\n px: 1\n};\nvar unitsReg = new RegExp(\n `^([0-9.]+(?:e\\\\d+)?)(${Object.keys(units).join(\"|\")})?$`\n);\nfunction parseLength(len) {\n const m = unitsReg.exec(len);\n if (!m) {\n return void 0;\n }\n return Math.round(Number(m[1]) * (units[m[2]] || 1));\n}\nfunction parseViewbox(viewbox) {\n const bounds = viewbox.split(\" \");\n return {\n height: parseLength(bounds[3]),\n width: parseLength(bounds[2])\n };\n}\nfunction parseAttributes(root) {\n const width = root.match(extractorRegExps.width);\n const height = root.match(extractorRegExps.height);\n const viewbox = root.match(extractorRegExps.viewbox);\n return {\n height: height && parseLength(height[2]),\n viewbox: viewbox && parseViewbox(viewbox[2]),\n width: width && parseLength(width[2])\n };\n}\nfunction calculateByDimensions(attrs) {\n return {\n height: attrs.height,\n width: attrs.width\n };\n}\nfunction calculateByViewbox(attrs, viewbox) {\n const ratio = viewbox.width / viewbox.height;\n if (attrs.width) {\n return {\n height: Math.floor(attrs.width / ratio),\n width: attrs.width\n };\n }\n if (attrs.height) {\n return {\n height: attrs.height,\n width: Math.floor(attrs.height * ratio)\n };\n }\n return {\n height: viewbox.height,\n width: viewbox.width\n };\n}\nvar SVG = {\n // Scan only the first kilo-byte to speed up the check on larger files\n validate: (input) => svgReg.test(toUTF8String(input, 0, 1e3)),\n calculate(input) {\n const root = toUTF8String(input).match(extractorRegExps.root);\n if (root) {\n const attrs = parseAttributes(root[0]);\n if (attrs.width && attrs.height) {\n return calculateByDimensions(attrs);\n }\n if (attrs.viewbox) {\n return calculateByViewbox(attrs, attrs.viewbox);\n }\n }\n throw new TypeError(\"Invalid SVG\");\n }\n};\n\n// lib/types/tga.ts\nvar TGA = {\n validate(input) {\n return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0;\n },\n calculate(input) {\n return {\n height: readUInt16LE(input, 14),\n width: readUInt16LE(input, 12)\n };\n }\n};\n\n// lib/types/tiff.ts\nvar CONSTANTS = {\n TAG: {\n WIDTH: 256,\n HEIGHT: 257,\n COMPRESSION: 259\n },\n TYPE: {\n SHORT: 3,\n LONG: 4,\n LONG8: 16\n },\n ENTRY_SIZE: {\n STANDARD: 12,\n BIG: 20\n },\n COUNT_SIZE: {\n STANDARD: 2,\n BIG: 8\n }\n};\nfunction readIFD(input, { isBigEndian, isBigTiff }) {\n const ifdOffset = isBigTiff ? Number(readUInt64(input, 8, isBigEndian)) : readUInt(input, 32, 4, isBigEndian);\n const entryCountSize = isBigTiff ? CONSTANTS.COUNT_SIZE.BIG : CONSTANTS.COUNT_SIZE.STANDARD;\n return input.slice(ifdOffset + entryCountSize);\n}\nfunction readTagValue(input, type, offset, isBigEndian) {\n switch (type) {\n case CONSTANTS.TYPE.SHORT:\n return readUInt(input, 16, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG:\n return readUInt(input, 32, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG8: {\n const value = Number(readUInt64(input, offset, isBigEndian));\n if (value > Number.MAX_SAFE_INTEGER) {\n throw new TypeError(\"Value too large\");\n }\n return value;\n }\n default:\n return 0;\n }\n}\nfunction nextTag(input, isBigTiff) {\n const entrySize = isBigTiff ? CONSTANTS.ENTRY_SIZE.BIG : CONSTANTS.ENTRY_SIZE.STANDARD;\n if (input.length > entrySize) {\n return input.slice(entrySize);\n }\n}\nfunction extractTags(input, { isBigEndian, isBigTiff }) {\n const tags = {};\n let temp = input;\n while (temp?.length) {\n const code = readUInt(temp, 16, 0, isBigEndian);\n const type = readUInt(temp, 16, 2, isBigEndian);\n const length = isBigTiff ? Number(readUInt64(temp, 4, isBigEndian)) : readUInt(temp, 32, 4, isBigEndian);\n if (code === 0) break;\n if (length === 1 && (type === CONSTANTS.TYPE.SHORT || type === CONSTANTS.TYPE.LONG || isBigTiff && type === CONSTANTS.TYPE.LONG8)) {\n const valueOffset = isBigTiff ? 12 : 8;\n tags[code] = readTagValue(temp, type, valueOffset, isBigEndian);\n }\n temp = nextTag(temp, isBigTiff);\n }\n return tags;\n}\nfunction determineFormat(input) {\n const signature = toUTF8String(input, 0, 2);\n const version = readUInt(input, 16, 2, signature === \"MM\");\n return {\n isBigEndian: signature === \"MM\",\n isBigTiff: version === 43\n };\n}\nfunction validateBigTIFFHeader(input, isBigEndian) {\n const byteSize = readUInt(input, 16, 4, isBigEndian);\n const reserved = readUInt(input, 16, 6, isBigEndian);\n if (byteSize !== 8 || reserved !== 0) {\n throw new TypeError(\"Invalid BigTIFF header\");\n }\n}\nvar signatures = /* @__PURE__ */ new Set([\n \"49492a00\",\n // Little Endian\n \"4d4d002a\",\n // Big Endian\n \"49492b00\",\n // BigTIFF Little Endian\n \"4d4d002b\"\n // BigTIFF Big Endian\n]);\nvar TIFF = {\n validate: (input) => {\n const signature = toHexString(input, 0, 4);\n return signatures.has(signature);\n },\n calculate(input) {\n const format = determineFormat(input);\n if (format.isBigTiff) {\n validateBigTIFFHeader(input, format.isBigEndian);\n }\n const ifdBuffer = readIFD(input, format);\n const tags = extractTags(ifdBuffer, format);\n const info = {\n height: tags[CONSTANTS.TAG.HEIGHT],\n width: tags[CONSTANTS.TAG.WIDTH],\n type: format.isBigTiff ? \"bigtiff\" : \"tiff\"\n };\n if (tags[CONSTANTS.TAG.COMPRESSION]) {\n info.compression = tags[CONSTANTS.TAG.COMPRESSION];\n }\n if (!info.width || !info.height) {\n throw new TypeError(\"Invalid Tiff. Missing tags\");\n }\n return info;\n }\n};\n\n// lib/types/webp.ts\nfunction calculateExtended(input) {\n return {\n height: 1 + readUInt24LE(input, 7),\n width: 1 + readUInt24LE(input, 4)\n };\n}\nfunction calculateLossless(input) {\n return {\n height: 1 + ((input[4] & 15) << 10 | input[3] << 2 | (input[2] & 192) >> 6),\n width: 1 + ((input[2] & 63) << 8 | input[1])\n };\n}\nfunction calculateLossy(input) {\n return {\n height: readInt16LE(input, 8) & 16383,\n width: readInt16LE(input, 6) & 16383\n };\n}\nvar WEBP = {\n validate(input) {\n const riffHeader = \"RIFF\" === toUTF8String(input, 0, 4);\n const webpHeader = \"WEBP\" === toUTF8String(input, 8, 12);\n const vp8Header = \"VP8\" === toUTF8String(input, 12, 15);\n return riffHeader && webpHeader && vp8Header;\n },\n calculate(_input) {\n const chunkHeader = toUTF8String(_input, 12, 16);\n const input = _input.slice(20, 30);\n if (chunkHeader === \"VP8X\") {\n const extendedHeader = input[0];\n const validStart = (extendedHeader & 192) === 0;\n const validEnd = (extendedHeader & 1) === 0;\n if (validStart && validEnd) {\n return calculateExtended(input);\n }\n throw new TypeError(\"Invalid WebP\");\n }\n if (chunkHeader === \"VP8 \" && input[0] !== 47) {\n return calculateLossy(input);\n }\n const signature = toHexString(input, 3, 6);\n if (chunkHeader === \"VP8L\" && signature !== \"9d012a\") {\n return calculateLossless(input);\n }\n throw new TypeError(\"Invalid WebP\");\n }\n};\n\n// lib/types/index.ts\nvar typeHandlers = /* @__PURE__ */ new Map([\n [\"bmp\", BMP],\n [\"cur\", CUR],\n [\"dds\", DDS],\n [\"gif\", GIF],\n [\"heif\", HEIF],\n [\"icns\", ICNS],\n [\"ico\", ICO],\n [\"j2c\", J2C],\n [\"jp2\", JP2],\n [\"jpg\", JPG],\n [\"jxl\", JXL],\n [\"jxl-stream\", JXLStream],\n [\"ktx\", KTX],\n [\"png\", PNG],\n [\"pnm\", PNM],\n [\"psd\", PSD],\n [\"svg\", SVG],\n [\"tga\", TGA],\n [\"tiff\", TIFF],\n [\"webp\", WEBP]\n]);\nvar types = Array.from(typeHandlers.keys());\n\n// lib/detector.ts\nvar firstBytes = /* @__PURE__ */ new Map([\n [0, \"heif\"],\n [56, \"psd\"],\n [66, \"bmp\"],\n [68, \"dds\"],\n [71, \"gif\"],\n [73, \"tiff\"],\n [77, \"tiff\"],\n [82, \"webp\"],\n [105, \"icns\"],\n [137, \"png\"],\n [255, \"jpg\"]\n]);\nfunction detector(input) {\n const byte = input[0];\n const type = firstBytes.get(byte);\n if (type && typeHandlers.get(type).validate(input)) {\n return type;\n }\n return types.find((type2) => typeHandlers.get(type2).validate(input));\n}\n\n// lib/lookup.ts\nvar globalOptions = {\n disabledTypes: []\n};\nfunction imageSize(input) {\n const type = detector(input);\n if (typeof type !== \"undefined\") {\n if (globalOptions.disabledTypes.indexOf(type) > -1) {\n throw new TypeError(`disabled file type: ${type}`);\n }\n const size = typeHandlers.get(type).calculate(input);\n if (size !== void 0) {\n size.type = size.type ?? type;\n if (size.images && size.images.length > 1) {\n const largestImage = size.images.reduce((largest, current) => {\n return current.width * current.height > largest.width * largest.height ? current : largest;\n }, size.images[0]);\n size.width = largestImage.width;\n size.height = largestImage.height;\n }\n return size;\n }\n }\n throw new TypeError(`unsupported file type: ${type}`);\n}\nvar disableTypes = (types2) => {\n globalOptions.disabledTypes = types2;\n};\n\nexport { imageSize as default, disableTypes, imageSize, types };\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -47,4 +47,4 @@ async function devConsoleEmailDeliver(event, _ctx) {
|
|
|
47
47
|
|
|
48
48
|
//#endregion
|
|
49
49
|
export { getDevEmails as i, clearDevEmails as n, devConsoleEmailDeliver as r, DEV_CONSOLE_EMAIL_PLUGIN_ID as t };
|
|
50
|
-
//# sourceMappingURL=email-console-
|
|
50
|
+
//# sourceMappingURL=email-console-DNup1Fku.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-console-
|
|
1
|
+
{"version":3,"file":"email-console-DNup1Fku.mjs","names":[],"sources":["../src/plugins/email-console.ts"],"sourcesContent":["/**\n * Dev Console Email Provider\n *\n * Built-in plugin that registers email:deliver as an exclusive hook.\n * Logs emails to console and stores them in memory (capped at 100).\n * Auto-activated when import.meta.env.DEV is true and no other provider is selected.\n *\n */\n\nimport type { EmailDeliverEvent, EmailMessage, PluginContext } from \"./types.js\";\n\n/** Plugin ID for the dev console email provider */\nexport const DEV_CONSOLE_EMAIL_PLUGIN_ID = \"emdash-console-email\";\n\n/** Maximum number of emails to keep in memory */\nconst MAX_STORED_EMAILS = 100;\n\n/**\n * Stored email record (in-memory only)\n */\nexport interface StoredEmail {\n\tmessage: EmailMessage;\n\tsource: string;\n\tsentAt: string;\n}\n\n/**\n * In-memory store for dev emails.\n * Uses globalThis so the same array is shared across Vite SSR module\n * instances (the runtime and the route handler may load separate copies\n * of this module, but globalThis is always the same object).\n */\nconst GLOBAL_KEY = Symbol.for(\"emdash:dev-emails\");\nconst g = globalThis as Record<symbol, unknown>;\nconst storedEmails: StoredEmail[] = (() => {\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)\n\tconst existing = g[GLOBAL_KEY] as StoredEmail[] | undefined;\n\tif (existing) return existing;\n\tconst fresh: StoredEmail[] = [];\n\tg[GLOBAL_KEY] = fresh;\n\treturn fresh;\n})();\n\n/**\n * Get all stored dev emails (most recent first).\n */\nexport function getDevEmails(): StoredEmail[] {\n\treturn storedEmails.toReversed();\n}\n\n/**\n * Clear all stored dev emails.\n */\nexport function clearDevEmails(): void {\n\tstoredEmails.length = 0;\n}\n\n/**\n * The email:deliver handler for the dev console provider.\n * Logs to console and stores in memory.\n */\nexport async function devConsoleEmailDeliver(\n\tevent: EmailDeliverEvent,\n\t_ctx: PluginContext,\n): Promise<void> {\n\tconst { message, source } = event;\n\n\tconsole.log(\n\t\t`\\n📧 [dev-email] Email sent\\n` +\n\t\t\t` From: ${source}\\n` +\n\t\t\t` To: ${message.to}\\n` +\n\t\t\t` Subject: ${message.subject}\\n` +\n\t\t\t` Text: ${message.text.slice(0, 200)}${message.text.length > 200 ? \"...\" : \"\"}\\n`,\n\t);\n\n\t// Store the email\n\tstoredEmails.push({\n\t\tmessage,\n\t\tsource,\n\t\tsentAt: new Date().toISOString(),\n\t});\n\n\t// Cap at MAX_STORED_EMAILS\n\twhile (storedEmails.length > MAX_STORED_EMAILS) {\n\t\tstoredEmails.shift();\n\t}\n}\n"],"mappings":";;AAYA,MAAa,8BAA8B;;AAG3C,MAAM,oBAAoB;;;;;;;AAiB1B,MAAM,aAAa,OAAO,IAAI,oBAAoB;AAClD,MAAM,IAAI;AACV,MAAM,sBAAqC;CAE1C,MAAM,WAAW,EAAE;AACnB,KAAI,SAAU,QAAO;CACrB,MAAM,QAAuB,EAAE;AAC/B,GAAE,cAAc;AAChB,QAAO;IACJ;;;;AAKJ,SAAgB,eAA8B;AAC7C,QAAO,aAAa,YAAY;;;;;AAMjC,SAAgB,iBAAuB;AACtC,cAAa,SAAS;;;;;;AAOvB,eAAsB,uBACrB,OACA,MACgB;CAChB,MAAM,EAAE,SAAS,WAAW;AAE5B,SAAQ,IACP,yCACa,OAAO,WACT,QAAQ,GAAG,gBACN,QAAQ,QAAQ,aACnB,QAAQ,KAAK,MAAM,GAAG,IAAI,GAAG,QAAQ,KAAK,SAAS,MAAM,QAAQ,GAAG,IACjF;AAGD,cAAa,KAAK;EACjB;EACA;EACA,yBAAQ,IAAI,MAAM,EAAC,aAAa;EAChC,CAAC;AAGF,QAAO,aAAa,SAAS,kBAC5B,cAAa,OAAO"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as imageSize } from "./dist-
|
|
2
|
-
import { n as normalizeMime } from "./mime-
|
|
1
|
+
import { t as imageSize } from "./dist-BAsh8dbf.mjs";
|
|
2
|
+
import { n as normalizeMime } from "./mime-DYpsOAny.mjs";
|
|
3
3
|
import { encode } from "blurhash";
|
|
4
4
|
|
|
5
5
|
//#region src/media/placeholder.ts
|
|
@@ -191,4 +191,4 @@ async function enrichImageMetadata(bytes, contentType, opts) {
|
|
|
191
191
|
|
|
192
192
|
//#endregion
|
|
193
193
|
export { generatePlaceholder as n, enrichImageMetadata as t };
|
|
194
|
-
//# sourceMappingURL=enrich-
|
|
194
|
+
//# sourceMappingURL=enrich-t2Xvjdqa.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich-BX0IDp4z.mjs","names":[],"sources":["../src/media/placeholder.ts","../src/media/enrich.ts"],"sourcesContent":["/**\n * Image Placeholder Generation\n *\n * Generates blurhash and dominant color from image buffers for LQIP support.\n * Decodes images via jpeg-js (pure JS) and upng-js (pure JS, uses pako for\n * deflate). No Node-specific dependencies — works in Workers and Node SSR.\n */\n\nimport { encode } from \"blurhash\";\nimport { imageSize } from \"image-size\";\n\nimport { normalizeMime } from \"./mime.js\";\n\nexport interface PlaceholderData {\n\tblurhash: string;\n\tdominantColor: string;\n}\n\nconst SUPPORTED_TYPES: Record<string, \"jpeg\" | \"png\"> = {\n\t\"image/jpeg\": \"jpeg\",\n\t\"image/jpg\": \"jpeg\",\n\t\"image/png\": \"png\",\n};\n\n/** Max width for blurhash input. Encode is O(w*h*components), so downsample first. */\nconst MAX_ENCODE_WIDTH = 32;\n\n/** Max decoded RGBA size (32 MB). Images exceeding this skip placeholder generation. */\nconst MAX_DECODED_BYTES = 32 * 1024 * 1024;\n\ninterface DecodedImage {\n\twidth: number;\n\theight: number;\n\tdata: Uint8Array;\n}\n\n/**\n * Decode a JPEG buffer into raw RGBA pixel data.\n */\nasync function decodeJpeg(buffer: Uint8Array): Promise<DecodedImage> {\n\tconst { decode } = await import(\"jpeg-js\");\n\tconst result = decode(buffer, { useTArray: true });\n\treturn { width: result.width, height: result.height, data: result.data };\n}\n\n/**\n * Decode a PNG buffer into raw RGBA pixel data.\n * Uses upng-js (pure JS with pako deflate) — no Node zlib dependency.\n */\nasync function decodePng(buffer: Uint8Array): Promise<DecodedImage> {\n\t// @ts-expect-error -- upng-js has no type declarations\n\tconst UPNG = (await import(\"upng-js\")).default;\n\tconst img = UPNG.decode(buffer.buffer);\n\t// toRGBA8 returns an array of frames; take the first frame\n\tconst frames: ArrayBuffer[] = UPNG.toRGBA8(img);\n\tconst rgba = new Uint8Array(frames[0]);\n\treturn { width: img.width, height: img.height, data: rgba };\n}\n\n/**\n * Extract the dominant color from RGBA pixel data.\n * Simple average of all non-transparent pixels.\n */\nfunction extractDominantColor(data: Uint8Array, width: number, height: number): string {\n\tlet r = 0;\n\tlet g = 0;\n\tlet b = 0;\n\tlet count = 0;\n\n\tconst len = width * height * 4;\n\tfor (let i = 0; i < len; i += 4) {\n\t\tconst a = data[i + 3];\n\t\tif (a < 128) continue; // skip mostly-transparent pixels\n\t\tr += data[i];\n\t\tg += data[i + 1];\n\t\tb += data[i + 2];\n\t\tcount++;\n\t}\n\n\tif (count === 0) return \"rgb(0,0,0)\";\n\n\tconst avgR = Math.round(r / count);\n\tconst avgG = Math.round(g / count);\n\tconst avgB = Math.round(b / count);\n\treturn `rgb(${avgR},${avgG},${avgB})`;\n}\n\n/**\n * Read image dimensions from headers without decoding pixel data.\n * Returns null when the header cannot be parsed.\n *\n * Shared by every caller that needs pixel dimensions so the header is parsed\n * once per buffer, not re-read inside generatePlaceholder.\n */\nexport function readDimensions(buffer: Uint8Array): { width: number; height: number } | null {\n\ttry {\n\t\tconst result = imageSize(buffer);\n\t\tif (result.width != null && result.height != null) {\n\t\t\treturn { width: result.width, height: result.height };\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Generate blurhash and dominant color from an image buffer.\n * Returns null for non-image MIME types or on failure.\n *\n * @param dimensions - Optional pre-known dimensions. When present they are\n * trusted verbatim (the caller has typically already read them via\n * readDimensions); otherwise dimensions are read from this buffer's header.\n * Generation is skipped (returns null) when no dimensions are available at\n * all, or when the decoded size (width * height * 4) exceeds\n * MAX_DECODED_BYTES — both guards avoid OOM from unbounded decodes on\n * memory-constrained runtimes.\n */\nexport async function generatePlaceholder(\n\tbuffer: Uint8Array,\n\tmimeType: string,\n\tdimensions?: { width: number; height: number },\n): Promise<PlaceholderData | null> {\n\tconst format = SUPPORTED_TYPES[normalizeMime(mimeType)];\n\tif (!format) return null;\n\n\ttry {\n\t\t// Trust caller-supplied dimensions when present (the caller has usually\n\t\t// already read them via readDimensions); otherwise read them from this\n\t\t// buffer. The header is parsed at most once per call.\n\t\tconst dims = dimensions ?? readDimensions(buffer);\n\n\t\t// Safety net: the decoders allocate the full RGBA buffer with no internal\n\t\t// cap, so refuse to decode unless we can bound the output size. When we\n\t\t// have no parseable header AND no known dimensions, the decoded size is\n\t\t// unbounded — a crafted/truncated PNG whose header image-size can't read\n\t\t// could still be decodable by upng-js, so we must bail to avoid OOM on\n\t\t// memory-constrained runtimes. LQIP is progressive enhancement; missing\n\t\t// it is preferable to crashing the request.\n\t\tif (!dims) return null;\n\t\tif (dims.width * dims.height * 4 > MAX_DECODED_BYTES) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst imageData = format === \"jpeg\" ? await decodeJpeg(buffer) : await decodePng(buffer);\n\t\tconst { width, height, data } = imageData;\n\n\t\tif (width === 0 || height === 0) return null;\n\n\t\t// Downsample for blurhash encoding if needed\n\t\tlet encodePixels: Uint8ClampedArray;\n\t\tlet encodeWidth: number;\n\t\tlet encodeHeight: number;\n\n\t\tif (width > MAX_ENCODE_WIDTH) {\n\t\t\tconst scale = MAX_ENCODE_WIDTH / width;\n\t\t\tencodeWidth = MAX_ENCODE_WIDTH;\n\t\t\tencodeHeight = Math.max(1, Math.round(height * scale));\n\t\t\tencodePixels = downsample(data, width, height, encodeWidth, encodeHeight);\n\t\t} else {\n\t\t\tencodeWidth = width;\n\t\t\tencodeHeight = height;\n\t\t\tencodePixels = new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength);\n\t\t}\n\n\t\tconst blurhash = encode(encodePixels, encodeWidth, encodeHeight, 4, 3);\n\t\tconst dominantColor = extractDominantColor(data, width, height);\n\n\t\treturn { blurhash, dominantColor };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Nearest-neighbor downsample of RGBA pixel data.\n */\nfunction downsample(\n\tsrc: Uint8Array,\n\tsrcW: number,\n\tsrcH: number,\n\tdstW: number,\n\tdstH: number,\n): Uint8ClampedArray {\n\tconst dst = new Uint8ClampedArray(dstW * dstH * 4);\n\n\tfor (let y = 0; y < dstH; y++) {\n\t\tconst srcY = Math.floor((y * srcH) / dstH);\n\t\tfor (let x = 0; x < dstW; x++) {\n\t\t\tconst srcX = Math.floor((x * srcW) / dstW);\n\t\t\tconst srcIdx = (srcY * srcW + srcX) * 4;\n\t\t\tconst dstIdx = (y * dstW + x) * 4;\n\t\t\tdst[dstIdx] = src[srcIdx]!;\n\t\t\tdst[dstIdx + 1] = src[srcIdx + 1]!;\n\t\t\tdst[dstIdx + 2] = src[srcIdx + 2]!;\n\t\t\tdst[dstIdx + 3] = src[srcIdx + 3]!;\n\t\t}\n\t}\n\n\treturn dst;\n}\n","/**\n * Image Metadata Enrichment\n *\n * Single seam that derives image dimensions and LQIP placeholders (blurhash,\n * dominant color) from raw image bytes. Every server-side media-creation path\n * routes through this so records are populated consistently. Pure-JS and\n * Workers-safe (image-size reads headers only; generatePlaceholder guards\n * decode size).\n */\n\nimport { normalizeMime } from \"./mime.js\";\nimport { generatePlaceholder, readDimensions } from \"./placeholder.js\";\n\nexport interface EnrichedImageMetadata {\n\twidth?: number;\n\theight?: number;\n\tblurhash?: string;\n\tdominantColor?: string;\n}\n\n/**\n * Derive dimensions + LQIP placeholders from image bytes.\n *\n * - Non-image content types return `{}`.\n * - `knownDimensions` (e.g. browser `naturalWidth/Height`) win over `image-size`\n * for the *stored record* because the browser applies EXIF orientation;\n * `image-size` reports raw header dimensions, which are swapped for\n * 90°/270°-rotated JPEGs. They are NOT used for the decode OOM guard — see below.\n * - The placeholder OOM guard uses only header dimensions read from the bytes\n * actually decoded. Caller-supplied `knownDimensions` are untrusted for the\n * guard: a client could claim a tiny size for a huge image to bypass the cap.\n * - `placeholder` lets a caller decode a smaller thumbnail for the blurhash to\n * avoid OOM on large originals; dimensions still come from `bytes`.\n * - Placeholders are jpeg/png only (the generator's supported formats); other\n * image types still get dimensions.\n */\nexport async function enrichImageMetadata(\n\tbytes: Uint8Array,\n\tcontentType: string,\n\topts?: {\n\t\tknownDimensions?: { width: number; height: number };\n\t\tplaceholder?: { bytes: Uint8Array; contentType: string };\n\t},\n): Promise<EnrichedImageMetadata> {\n\tconst normalizedContentType = normalizeMime(contentType);\n\tif (!normalizedContentType.startsWith(\"image/\")) return {};\n\n\t// Header dimensions are read once from the actual bytes. They feed the\n\t// placeholder OOM guard, which must never trust caller-supplied dimensions:\n\t// `knownDimensions` is decoupled from the buffer, so a client could claim a\n\t// tiny size for a huge image and slip past the decoded-size cap, making the\n\t// decoder allocate an unbounded RGBA buffer and OOM the runtime. Only dims\n\t// read from the buffer that actually gets decoded can bound the decode.\n\tconst headerDims = readDimensions(bytes) ?? undefined;\n\n\t// Dimensions published on the record prefer the caller's knownDimensions\n\t// (e.g. browser naturalWidth/Height, which apply EXIF orientation) over the\n\t// raw header dims, which are swapped for 90°/270°-rotated JPEGs.\n\tconst recordDims = opts?.knownDimensions ?? headerDims;\n\n\t// When a smaller thumbnail override is supplied, decode that for the blurhash\n\t// and let generatePlaceholder read the thumbnail's own header for the OOM\n\t// guard (the override buffer is what actually gets decoded). On the common\n\t// no-override path pass the header dims already read from this same buffer.\n\tconst override = opts?.placeholder;\n\tconst placeholder = await generatePlaceholder(\n\t\toverride ? override.bytes : bytes,\n\t\toverride ? normalizeMime(override.contentType) : normalizedContentType,\n\t\toverride ? undefined : headerDims,\n\t);\n\n\treturn {\n\t\twidth: recordDims?.width,\n\t\theight: recordDims?.height,\n\t\tblurhash: placeholder?.blurhash,\n\t\tdominantColor: placeholder?.dominantColor,\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enrich-t2Xvjdqa.mjs","names":[],"sources":["../src/media/placeholder.ts","../src/media/enrich.ts"],"sourcesContent":["/**\n * Image Placeholder Generation\n *\n * Generates blurhash and dominant color from image buffers for LQIP support.\n * Decodes images via jpeg-js (pure JS) and upng-js (pure JS, uses pako for\n * deflate). No Node-specific dependencies — works in Workers and Node SSR.\n */\n\nimport { encode } from \"blurhash\";\nimport { imageSize } from \"image-size\";\n\nimport { normalizeMime } from \"./mime.js\";\n\nexport interface PlaceholderData {\n\tblurhash: string;\n\tdominantColor: string;\n}\n\nconst SUPPORTED_TYPES: Record<string, \"jpeg\" | \"png\"> = {\n\t\"image/jpeg\": \"jpeg\",\n\t\"image/jpg\": \"jpeg\",\n\t\"image/png\": \"png\",\n};\n\n/** Max width for blurhash input. Encode is O(w*h*components), so downsample first. */\nconst MAX_ENCODE_WIDTH = 32;\n\n/** Max decoded RGBA size (32 MB). Images exceeding this skip placeholder generation. */\nconst MAX_DECODED_BYTES = 32 * 1024 * 1024;\n\ninterface DecodedImage {\n\twidth: number;\n\theight: number;\n\tdata: Uint8Array;\n}\n\n/**\n * Decode a JPEG buffer into raw RGBA pixel data.\n */\nasync function decodeJpeg(buffer: Uint8Array): Promise<DecodedImage> {\n\tconst { decode } = await import(\"jpeg-js\");\n\tconst result = decode(buffer, { useTArray: true });\n\treturn { width: result.width, height: result.height, data: result.data };\n}\n\n/**\n * Decode a PNG buffer into raw RGBA pixel data.\n * Uses upng-js (pure JS with pako deflate) — no Node zlib dependency.\n */\nasync function decodePng(buffer: Uint8Array): Promise<DecodedImage> {\n\t// @ts-expect-error -- upng-js has no type declarations\n\tconst UPNG = (await import(\"upng-js\")).default;\n\tconst img = UPNG.decode(buffer.buffer);\n\t// toRGBA8 returns an array of frames; take the first frame\n\tconst frames: ArrayBuffer[] = UPNG.toRGBA8(img);\n\tconst rgba = new Uint8Array(frames[0]);\n\treturn { width: img.width, height: img.height, data: rgba };\n}\n\n/**\n * Extract the dominant color from RGBA pixel data.\n * Simple average of all non-transparent pixels.\n */\nfunction extractDominantColor(data: Uint8Array, width: number, height: number): string {\n\tlet r = 0;\n\tlet g = 0;\n\tlet b = 0;\n\tlet count = 0;\n\n\tconst len = width * height * 4;\n\tfor (let i = 0; i < len; i += 4) {\n\t\tconst a = data[i + 3];\n\t\tif (a < 128) continue; // skip mostly-transparent pixels\n\t\tr += data[i];\n\t\tg += data[i + 1];\n\t\tb += data[i + 2];\n\t\tcount++;\n\t}\n\n\tif (count === 0) return \"rgb(0,0,0)\";\n\n\tconst avgR = Math.round(r / count);\n\tconst avgG = Math.round(g / count);\n\tconst avgB = Math.round(b / count);\n\treturn `rgb(${avgR},${avgG},${avgB})`;\n}\n\n/**\n * Read image dimensions from headers without decoding pixel data.\n * Returns null when the header cannot be parsed.\n *\n * Shared by every caller that needs pixel dimensions so the header is parsed\n * once per buffer, not re-read inside generatePlaceholder.\n */\nexport function readDimensions(buffer: Uint8Array): { width: number; height: number } | null {\n\ttry {\n\t\tconst result = imageSize(buffer);\n\t\tif (result.width != null && result.height != null) {\n\t\t\treturn { width: result.width, height: result.height };\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Generate blurhash and dominant color from an image buffer.\n * Returns null for non-image MIME types or on failure.\n *\n * @param dimensions - Optional pre-known dimensions. When present they are\n * trusted verbatim (the caller has typically already read them via\n * readDimensions); otherwise dimensions are read from this buffer's header.\n * Generation is skipped (returns null) when no dimensions are available at\n * all, or when the decoded size (width * height * 4) exceeds\n * MAX_DECODED_BYTES — both guards avoid OOM from unbounded decodes on\n * memory-constrained runtimes.\n */\nexport async function generatePlaceholder(\n\tbuffer: Uint8Array,\n\tmimeType: string,\n\tdimensions?: { width: number; height: number },\n): Promise<PlaceholderData | null> {\n\tconst format = SUPPORTED_TYPES[normalizeMime(mimeType)];\n\tif (!format) return null;\n\n\ttry {\n\t\t// Trust caller-supplied dimensions when present (the caller has usually\n\t\t// already read them via readDimensions); otherwise read them from this\n\t\t// buffer. The header is parsed at most once per call.\n\t\tconst dims = dimensions ?? readDimensions(buffer);\n\n\t\t// Safety net: the decoders allocate the full RGBA buffer with no internal\n\t\t// cap, so refuse to decode unless we can bound the output size. When we\n\t\t// have no parseable header AND no known dimensions, the decoded size is\n\t\t// unbounded — a crafted/truncated PNG whose header image-size can't read\n\t\t// could still be decodable by upng-js, so we must bail to avoid OOM on\n\t\t// memory-constrained runtimes. LQIP is progressive enhancement; missing\n\t\t// it is preferable to crashing the request.\n\t\tif (!dims) return null;\n\t\tif (dims.width * dims.height * 4 > MAX_DECODED_BYTES) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst imageData = format === \"jpeg\" ? await decodeJpeg(buffer) : await decodePng(buffer);\n\t\tconst { width, height, data } = imageData;\n\n\t\tif (width === 0 || height === 0) return null;\n\n\t\t// Downsample for blurhash encoding if needed\n\t\tlet encodePixels: Uint8ClampedArray;\n\t\tlet encodeWidth: number;\n\t\tlet encodeHeight: number;\n\n\t\tif (width > MAX_ENCODE_WIDTH) {\n\t\t\tconst scale = MAX_ENCODE_WIDTH / width;\n\t\t\tencodeWidth = MAX_ENCODE_WIDTH;\n\t\t\tencodeHeight = Math.max(1, Math.round(height * scale));\n\t\t\tencodePixels = downsample(data, width, height, encodeWidth, encodeHeight);\n\t\t} else {\n\t\t\tencodeWidth = width;\n\t\t\tencodeHeight = height;\n\t\t\tencodePixels = new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength);\n\t\t}\n\n\t\tconst blurhash = encode(encodePixels, encodeWidth, encodeHeight, 4, 3);\n\t\tconst dominantColor = extractDominantColor(data, width, height);\n\n\t\treturn { blurhash, dominantColor };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Nearest-neighbor downsample of RGBA pixel data.\n */\nfunction downsample(\n\tsrc: Uint8Array,\n\tsrcW: number,\n\tsrcH: number,\n\tdstW: number,\n\tdstH: number,\n): Uint8ClampedArray {\n\tconst dst = new Uint8ClampedArray(dstW * dstH * 4);\n\n\tfor (let y = 0; y < dstH; y++) {\n\t\tconst srcY = Math.floor((y * srcH) / dstH);\n\t\tfor (let x = 0; x < dstW; x++) {\n\t\t\tconst srcX = Math.floor((x * srcW) / dstW);\n\t\t\tconst srcIdx = (srcY * srcW + srcX) * 4;\n\t\t\tconst dstIdx = (y * dstW + x) * 4;\n\t\t\tdst[dstIdx] = src[srcIdx]!;\n\t\t\tdst[dstIdx + 1] = src[srcIdx + 1]!;\n\t\t\tdst[dstIdx + 2] = src[srcIdx + 2]!;\n\t\t\tdst[dstIdx + 3] = src[srcIdx + 3]!;\n\t\t}\n\t}\n\n\treturn dst;\n}\n","/**\n * Image Metadata Enrichment\n *\n * Single seam that derives image dimensions and LQIP placeholders (blurhash,\n * dominant color) from raw image bytes. Every server-side media-creation path\n * routes through this so records are populated consistently. Pure-JS and\n * Workers-safe (image-size reads headers only; generatePlaceholder guards\n * decode size).\n */\n\nimport { normalizeMime } from \"./mime.js\";\nimport { generatePlaceholder, readDimensions } from \"./placeholder.js\";\n\nexport interface EnrichedImageMetadata {\n\twidth?: number;\n\theight?: number;\n\tblurhash?: string;\n\tdominantColor?: string;\n}\n\n/**\n * Derive dimensions + LQIP placeholders from image bytes.\n *\n * - Non-image content types return `{}`.\n * - `knownDimensions` (e.g. browser `naturalWidth/Height`) win over `image-size`\n * for the *stored record* because the browser applies EXIF orientation;\n * `image-size` reports raw header dimensions, which are swapped for\n * 90°/270°-rotated JPEGs. They are NOT used for the decode OOM guard — see below.\n * - The placeholder OOM guard uses only header dimensions read from the bytes\n * actually decoded. Caller-supplied `knownDimensions` are untrusted for the\n * guard: a client could claim a tiny size for a huge image to bypass the cap.\n * - `placeholder` lets a caller decode a smaller thumbnail for the blurhash to\n * avoid OOM on large originals; dimensions still come from `bytes`.\n * - Placeholders are jpeg/png only (the generator's supported formats); other\n * image types still get dimensions.\n */\nexport async function enrichImageMetadata(\n\tbytes: Uint8Array,\n\tcontentType: string,\n\topts?: {\n\t\tknownDimensions?: { width: number; height: number };\n\t\tplaceholder?: { bytes: Uint8Array; contentType: string };\n\t},\n): Promise<EnrichedImageMetadata> {\n\tconst normalizedContentType = normalizeMime(contentType);\n\tif (!normalizedContentType.startsWith(\"image/\")) return {};\n\n\t// Header dimensions are read once from the actual bytes. They feed the\n\t// placeholder OOM guard, which must never trust caller-supplied dimensions:\n\t// `knownDimensions` is decoupled from the buffer, so a client could claim a\n\t// tiny size for a huge image and slip past the decoded-size cap, making the\n\t// decoder allocate an unbounded RGBA buffer and OOM the runtime. Only dims\n\t// read from the buffer that actually gets decoded can bound the decode.\n\tconst headerDims = readDimensions(bytes) ?? undefined;\n\n\t// Dimensions published on the record prefer the caller's knownDimensions\n\t// (e.g. browser naturalWidth/Height, which apply EXIF orientation) over the\n\t// raw header dims, which are swapped for 90°/270°-rotated JPEGs.\n\tconst recordDims = opts?.knownDimensions ?? headerDims;\n\n\t// When a smaller thumbnail override is supplied, decode that for the blurhash\n\t// and let generatePlaceholder read the thumbnail's own header for the OOM\n\t// guard (the override buffer is what actually gets decoded). On the common\n\t// no-override path pass the header dims already read from this same buffer.\n\tconst override = opts?.placeholder;\n\tconst placeholder = await generatePlaceholder(\n\t\toverride ? override.bytes : bytes,\n\t\toverride ? normalizeMime(override.contentType) : normalizedContentType,\n\t\toverride ? undefined : headerDims,\n\t);\n\n\treturn {\n\t\twidth: recordDims?.width,\n\t\theight: recordDims?.height,\n\t\tblurhash: placeholder?.blurhash,\n\t\tdominantColor: placeholder?.dominantColor,\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { t as EntryLockRepository } from "./entry-locks-BEcX7ET0.mjs";
|
|
2
|
+
import { t as ErrorCode } from "./errors-DvMdNrgf.mjs";
|
|
3
|
+
import { ulid } from "ulidx";
|
|
4
|
+
|
|
5
|
+
//#region src/api/handlers/entry-lock.ts
|
|
6
|
+
/**
|
|
7
|
+
* How long an entry stays locked without a heartbeat or save. Long enough to
|
|
8
|
+
* survive a pause in typing, short enough that a closed tab frees the entry
|
|
9
|
+
* within a coffee break.
|
|
10
|
+
*/
|
|
11
|
+
const ENTRY_LOCK_LEASE_MS = 420 * 1e3;
|
|
12
|
+
const ENTRY_LOCK_LEASE_SECONDS = ENTRY_LOCK_LEASE_MS / 1e3;
|
|
13
|
+
function toHolder(lock) {
|
|
14
|
+
return {
|
|
15
|
+
userId: lock.userId,
|
|
16
|
+
userName: lock.userName,
|
|
17
|
+
acquiredAt: lock.acquiredAt,
|
|
18
|
+
expiresAt: lock.expiresAt
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function holderLabel(holder) {
|
|
22
|
+
return holder.userName?.trim() ? holder.userName : "Another editor";
|
|
23
|
+
}
|
|
24
|
+
async function isLockingEnabled(db, collection) {
|
|
25
|
+
const row = await db.selectFrom("_emdash_collections").select("edit_locking").where("slug", "=", collection).executeTakeFirst();
|
|
26
|
+
if (!row) return null;
|
|
27
|
+
return row.edit_locking !== 0;
|
|
28
|
+
}
|
|
29
|
+
function collectionNotFound(collection) {
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
error: {
|
|
33
|
+
code: ErrorCode.COLLECTION_NOT_FOUND,
|
|
34
|
+
message: `Collection '${collection}' not found`
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Takes the entry's lock for `userId`, or reports who is holding it. A
|
|
40
|
+
* take-over is only granted when the caller asks for one.
|
|
41
|
+
*/
|
|
42
|
+
async function handleEntryLockAcquire(db, collection, entryId, userId, options = {}) {
|
|
43
|
+
try {
|
|
44
|
+
const enabled = await isLockingEnabled(db, collection);
|
|
45
|
+
if (enabled === null) return collectionNotFound(collection);
|
|
46
|
+
if (!enabled) return {
|
|
47
|
+
success: true,
|
|
48
|
+
data: {
|
|
49
|
+
enabled: false,
|
|
50
|
+
holder: null,
|
|
51
|
+
heldByCaller: false
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const claim = await new EntryLockRepository(db).acquire({
|
|
55
|
+
collection,
|
|
56
|
+
entryId,
|
|
57
|
+
userId,
|
|
58
|
+
token: options.token ?? ulid(),
|
|
59
|
+
leaseSeconds: ENTRY_LOCK_LEASE_SECONDS,
|
|
60
|
+
takeover: options.takeover
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
data: {
|
|
65
|
+
enabled: true,
|
|
66
|
+
holder: toHolder(claim.lock),
|
|
67
|
+
heldByCaller: claim.outcome === "acquired"
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.error("[entry-lock] acquire failed:", error);
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
error: {
|
|
75
|
+
code: ErrorCode.ENTRY_LOCK_ERROR,
|
|
76
|
+
message: "Failed to acquire the entry lock"
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function handleEntryLockRead(db, collection, entryId, userId) {
|
|
82
|
+
try {
|
|
83
|
+
const enabled = await isLockingEnabled(db, collection);
|
|
84
|
+
if (enabled === null) return collectionNotFound(collection);
|
|
85
|
+
if (!enabled) return {
|
|
86
|
+
success: true,
|
|
87
|
+
data: {
|
|
88
|
+
enabled: false,
|
|
89
|
+
holder: null,
|
|
90
|
+
heldByCaller: false
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const lock = await new EntryLockRepository(db).findLive(collection, entryId);
|
|
94
|
+
return {
|
|
95
|
+
success: true,
|
|
96
|
+
data: {
|
|
97
|
+
enabled: true,
|
|
98
|
+
holder: lock ? toHolder(lock) : null,
|
|
99
|
+
heldByCaller: lock?.userId === userId
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error("[entry-lock] read failed:", error);
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
error: {
|
|
107
|
+
code: ErrorCode.ENTRY_LOCK_ERROR,
|
|
108
|
+
message: "Failed to read the entry lock"
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function handleEntryLockRelease(db, collection, entryId, userId, options = {}) {
|
|
114
|
+
try {
|
|
115
|
+
return {
|
|
116
|
+
success: true,
|
|
117
|
+
data: { released: await new EntryLockRepository(db).release({
|
|
118
|
+
collection,
|
|
119
|
+
entryId,
|
|
120
|
+
userId,
|
|
121
|
+
token: options.token
|
|
122
|
+
}) }
|
|
123
|
+
};
|
|
124
|
+
} catch (error) {
|
|
125
|
+
console.error("[entry-lock] release failed:", error);
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
error: {
|
|
129
|
+
code: ErrorCode.ENTRY_LOCK_ERROR,
|
|
130
|
+
message: "Failed to release the entry lock"
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Decides whether a write may proceed, and keeps the caller's own lease alive
|
|
137
|
+
* while it does. Resolves to `null` when the write is allowed.
|
|
138
|
+
*
|
|
139
|
+
* A write never takes a lock it was not given, so a CLI or API caller writing
|
|
140
|
+
* an unlocked entry leaves it unlocked.
|
|
141
|
+
*/
|
|
142
|
+
async function claimEntryLockForWrite(db, collection, entryId, userId, options = {}) {
|
|
143
|
+
if (options.override === true) return null;
|
|
144
|
+
const repo = new EntryLockRepository(db);
|
|
145
|
+
if (await repo.refreshHeld({
|
|
146
|
+
collection,
|
|
147
|
+
entryId,
|
|
148
|
+
userId,
|
|
149
|
+
leaseSeconds: ENTRY_LOCK_LEASE_SECONDS
|
|
150
|
+
})) return null;
|
|
151
|
+
const holder = await repo.findEnforceable(collection, entryId);
|
|
152
|
+
if (!holder) return null;
|
|
153
|
+
const details = toHolder(holder);
|
|
154
|
+
return {
|
|
155
|
+
code: ErrorCode.ENTRY_LOCKED,
|
|
156
|
+
message: `${holderLabel(details)} is holding this entry`,
|
|
157
|
+
details
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
//#endregion
|
|
162
|
+
export { handleEntryLockRelease as i, handleEntryLockAcquire as n, handleEntryLockRead as r, claimEntryLockForWrite as t };
|
|
163
|
+
//# sourceMappingURL=entry-lock-BEr8gDkG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-lock-BEr8gDkG.mjs","names":[],"sources":["../src/api/handlers/entry-lock.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { EntryLockRepository, type EntryLock } from \"../../database/repositories/entry-locks.js\";\nimport type { Database } from \"../../database/types.js\";\nimport { ErrorCode } from \"../errors.js\";\nimport type { ApiResult } from \"../types.js\";\n\n/**\n * How long an entry stays locked without a heartbeat or save. Long enough to\n * survive a pause in typing, short enough that a closed tab frees the entry\n * within a coffee break.\n */\nexport const ENTRY_LOCK_LEASE_MS = 7 * 60 * 1000;\n\nconst ENTRY_LOCK_LEASE_SECONDS = ENTRY_LOCK_LEASE_MS / 1000;\n\nexport interface EntryLockHolder {\n\tuserId: string;\n\tuserName: string | null;\n\tacquiredAt: string;\n\texpiresAt: string;\n}\n\nexport interface EntryLockStatus {\n\t/** Whether the collection takes edit locks at all. */\n\tenabled: boolean;\n\t/** The live lease, whoever holds it. */\n\tholder: EntryLockHolder | null;\n\t/** Whether `holder` is the caller. */\n\theldByCaller: boolean;\n}\n\nexport interface EntryLockRefusal {\n\tcode: typeof ErrorCode.ENTRY_LOCKED;\n\tmessage: string;\n\tdetails: EntryLockHolder;\n}\n\nfunction toHolder(lock: EntryLock): EntryLockHolder {\n\treturn {\n\t\tuserId: lock.userId,\n\t\tuserName: lock.userName,\n\t\tacquiredAt: lock.acquiredAt,\n\t\texpiresAt: lock.expiresAt,\n\t};\n}\n\nfunction holderLabel(holder: EntryLockHolder): string {\n\treturn holder.userName?.trim() ? holder.userName : \"Another editor\";\n}\n\nasync function isLockingEnabled(db: Kysely<Database>, collection: string): Promise<boolean | null> {\n\tconst row = await db\n\t\t.selectFrom(\"_emdash_collections\")\n\t\t.select(\"edit_locking\")\n\t\t.where(\"slug\", \"=\", collection)\n\t\t.executeTakeFirst();\n\tif (!row) return null;\n\treturn row.edit_locking !== 0;\n}\n\nfunction collectionNotFound(collection: string): ApiResult<never> {\n\treturn {\n\t\tsuccess: false,\n\t\terror: {\n\t\t\tcode: ErrorCode.COLLECTION_NOT_FOUND,\n\t\t\tmessage: `Collection '${collection}' not found`,\n\t\t},\n\t};\n}\n\n/**\n * Takes the entry's lock for `userId`, or reports who is holding it. A\n * take-over is only granted when the caller asks for one.\n */\nexport async function handleEntryLockAcquire(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\tuserId: string,\n\toptions: { takeover?: boolean; token?: string } = {},\n): Promise<ApiResult<EntryLockStatus>> {\n\ttry {\n\t\tconst enabled = await isLockingEnabled(db, collection);\n\t\tif (enabled === null) return collectionNotFound(collection);\n\t\tif (!enabled) {\n\t\t\treturn { success: true, data: { enabled: false, holder: null, heldByCaller: false } };\n\t\t}\n\n\t\tconst claim = await new EntryLockRepository(db).acquire({\n\t\t\tcollection,\n\t\t\tentryId,\n\t\t\tuserId,\n\t\t\ttoken: options.token ?? ulid(),\n\t\t\tleaseSeconds: ENTRY_LOCK_LEASE_SECONDS,\n\t\t\ttakeover: options.takeover,\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\tenabled: true,\n\t\t\t\tholder: toHolder(claim.lock),\n\t\t\t\theldByCaller: claim.outcome === \"acquired\",\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[entry-lock] acquire failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.ENTRY_LOCK_ERROR, message: \"Failed to acquire the entry lock\" },\n\t\t};\n\t}\n}\n\nexport async function handleEntryLockRead(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\tuserId: string,\n): Promise<ApiResult<EntryLockStatus>> {\n\ttry {\n\t\tconst enabled = await isLockingEnabled(db, collection);\n\t\tif (enabled === null) return collectionNotFound(collection);\n\t\tif (!enabled) {\n\t\t\treturn { success: true, data: { enabled: false, holder: null, heldByCaller: false } };\n\t\t}\n\n\t\tconst lock = await new EntryLockRepository(db).findLive(collection, entryId);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\tenabled: true,\n\t\t\t\tholder: lock ? toHolder(lock) : null,\n\t\t\t\theldByCaller: lock?.userId === userId,\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\"[entry-lock] read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.ENTRY_LOCK_ERROR, message: \"Failed to read the entry lock\" },\n\t\t};\n\t}\n}\n\nexport async function handleEntryLockRelease(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\tuserId: string,\n\toptions: { token?: string } = {},\n): Promise<ApiResult<{ released: boolean }>> {\n\ttry {\n\t\tconst released = await new EntryLockRepository(db).release({\n\t\t\tcollection,\n\t\t\tentryId,\n\t\t\tuserId,\n\t\t\ttoken: options.token,\n\t\t});\n\t\treturn { success: true, data: { released } };\n\t} catch (error) {\n\t\tconsole.error(\"[entry-lock] release failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: { code: ErrorCode.ENTRY_LOCK_ERROR, message: \"Failed to release the entry lock\" },\n\t\t};\n\t}\n}\n\n/**\n * Decides whether a write may proceed, and keeps the caller's own lease alive\n * while it does. Resolves to `null` when the write is allowed.\n *\n * A write never takes a lock it was not given, so a CLI or API caller writing\n * an unlocked entry leaves it unlocked.\n */\nexport async function claimEntryLockForWrite(\n\tdb: Kysely<Database>,\n\tcollection: string,\n\tentryId: string,\n\tuserId: string,\n\toptions: { override?: boolean } = {},\n): Promise<EntryLockRefusal | null> {\n\tif (options.override === true) return null;\n\n\tconst repo = new EntryLockRepository(db);\n\tconst heldByCaller = await repo.refreshHeld({\n\t\tcollection,\n\t\tentryId,\n\t\tuserId,\n\t\tleaseSeconds: ENTRY_LOCK_LEASE_SECONDS,\n\t});\n\tif (heldByCaller) return null;\n\n\tconst holder = await repo.findEnforceable(collection, entryId);\n\tif (!holder) return null;\n\n\tconst details = toHolder(holder);\n\treturn {\n\t\tcode: ErrorCode.ENTRY_LOCKED,\n\t\tmessage: `${holderLabel(details)} is holding this entry`,\n\t\tdetails,\n\t};\n}\n"],"mappings":"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"}
|