emdash 1.0.1 → 1.2.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/action-token-BdWad2YG.mjs +26 -0
- package/dist/action-token-BdWad2YG.mjs.map +1 -0
- package/dist/activation-xomsCMJg.mjs +387 -0
- package/dist/activation-xomsCMJg.mjs.map +1 -0
- package/dist/adapters-B4-nbElt.d.mts +173 -0
- package/dist/adapters-B4-nbElt.d.mts.map +1 -0
- package/dist/allowed-origins-CLpHGGlc.mjs +116 -0
- package/dist/allowed-origins-CLpHGGlc.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +4 -4
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +49 -48
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +10 -10
- package/dist/api-DBw_IWoi.mjs +5024 -0
- package/dist/api-DBw_IWoi.mjs.map +1 -0
- package/dist/api-tokens-B0ZipcZ-.mjs +173 -0
- package/dist/api-tokens-B0ZipcZ-.mjs.map +1 -0
- package/dist/apply-Cx48saFC.mjs +1680 -0
- package/dist/apply-Cx48saFC.mjs.map +1 -0
- package/dist/approvals-BXgtXA2s.mjs +460 -0
- package/dist/approvals-BXgtXA2s.mjs.map +1 -0
- package/dist/artifact-fetch-DsRczRGG.mjs +659 -0
- package/dist/artifact-fetch-DsRczRGG.mjs.map +1 -0
- package/dist/artifacts-D-O-qj9C.mjs +307 -0
- package/dist/artifacts-D-O-qj9C.mjs.map +1 -0
- package/dist/astro/image-endpoint.d.mts.map +1 -1
- package/dist/astro/image-endpoint.mjs +26 -6
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +253 -17
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +18 -13
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/media-usage-write-fence.mjs +6 -6
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +34 -32
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +99 -60
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -12
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +233 -128
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +15 -15
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +15 -15
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +8 -7
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +9 -8
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -22
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -23
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +19 -19
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/bulk.mjs +18 -18
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/index.mjs +18 -18
- package/dist/astro/routes/api/admin/core-update.mjs +8 -8
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +7 -7
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +6 -6
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +21 -21
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +23 -23
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +29 -29
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +73 -72
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -70
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -71
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -81
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +72 -71
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -70
- 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 +81 -80
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -70
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -71
- 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 +83 -82
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +10 -10
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -73
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -71
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -70
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -70
- 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 +8 -8
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -70
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +5 -5
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +39 -39
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +39 -39
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +41 -41
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +43 -43
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +7 -7
- package/dist/astro/routes/api/admin/users/index.mjs +15 -15
- package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
- package/dist/astro/routes/api/auth/handover.d.mts +8 -0
- package/dist/astro/routes/api/auth/handover.d.mts.map +1 -0
- package/dist/astro/routes/api/auth/handover.mjs +49 -0
- package/dist/astro/routes/api/auth/handover.mjs.map +1 -0
- package/dist/astro/routes/api/auth/invite/accept.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/complete.mjs +20 -20
- package/dist/astro/routes/api/auth/invite/index.mjs +17 -17
- package/dist/astro/routes/api/auth/invite/register-options.mjs +18 -18
- package/dist/astro/routes/api/auth/logout.mjs +6 -6
- package/dist/astro/routes/api/auth/magic-link/send.mjs +20 -19
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +24 -18
- package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/me.mjs +16 -16
- package/dist/astro/routes/api/auth/mode.mjs +6 -6
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +36 -13
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +20 -5
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +15 -15
- package/dist/astro/routes/api/auth/passkey/index.mjs +5 -5
- package/dist/astro/routes/api/auth/passkey/options.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +28 -21
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +18 -18
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +19 -19
- package/dist/astro/routes/api/auth/passkey/verify.mjs +20 -20
- package/dist/astro/routes/api/auth/signup/complete.mjs +20 -20
- package/dist/astro/routes/api/auth/signup/request.mjs +19 -18
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +5 -5
- package/dist/astro/routes/api/calendar.d.mts +8 -0
- package/dist/astro/routes/api/calendar.d.mts.map +1 -0
- package/dist/astro/routes/api/calendar.mjs +204 -0
- package/dist/astro/routes/api/calendar.mjs.map +1 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -14
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +20 -20
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +35 -35
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +35 -35
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -25
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/authors.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/index.mjs +16 -16
- package/dist/astro/routes/api/content/_collection_/trash.mjs +16 -16
- package/dist/astro/routes/api/dashboard.mjs +12 -12
- package/dist/astro/routes/api/dev/emails.mjs +6 -6
- package/dist/astro/routes/api/health.mjs +7 -7
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +25 -25
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs +31 -24
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs +20 -20
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +8 -0
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +67 -31
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +27 -27
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +25 -25
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +40 -33
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +10 -7
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +94 -94
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +36 -20
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/replace.mjs +17 -17
- package/dist/astro/routes/api/media/_id_/upload.mjs +10 -10
- package/dist/astro/routes/api/media/_id_/usage.mjs +31 -31
- package/dist/astro/routes/api/media/_id_.mjs +29 -29
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +7 -7
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +46 -16
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +17 -17
- package/dist/astro/routes/api/media/folders/index.mjs +17 -17
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +6 -6
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +6 -6
- package/dist/astro/routes/api/media/providers/index.mjs +6 -6
- package/dist/astro/routes/api/media/upload-url.mjs +45 -25
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +47 -36
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +18 -18
- package/dist/astro/routes/api/menus/_name_/items.mjs +18 -18
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +18 -18
- package/dist/astro/routes/api/menus/_name_/translations.mjs +18 -18
- package/dist/astro/routes/api/menus/_name_.mjs +18 -18
- package/dist/astro/routes/api/menus/index.mjs +18 -18
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +9 -9
- package/dist/astro/routes/api/oauth/device/code.mjs +13 -12
- package/dist/astro/routes/api/oauth/device/code.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/token.mjs +12 -11
- package/dist/astro/routes/api/oauth/device/token.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/register.mjs +9 -8
- package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/token/refresh.mjs +9 -9
- package/dist/astro/routes/api/oauth/token/revoke.mjs +9 -9
- package/dist/astro/routes/api/oauth/token.mjs +9 -9
- package/dist/astro/routes/api/openapi.json.mjs +23 -23
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +12 -12
- package/dist/astro/routes/api/redirects/404s/index.mjs +20 -19
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +20 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +20 -19
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +20 -19
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +35 -35
- package/dist/astro/routes/api/relations/index.mjs +35 -35
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +6 -6
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +17 -17
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -70
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -70
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/index.mjs +71 -70
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +71 -70
- 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 +71 -70
- 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 +71 -70
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -70
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +71 -70
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -70
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +17 -17
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -70
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +71 -70
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -19
- package/dist/astro/routes/api/search/index.mjs +18 -18
- package/dist/astro/routes/api/search/rebuild.mjs +19 -19
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +18 -18
- package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
- package/dist/astro/routes/api/sections/index.mjs +18 -18
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +8 -8
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +8 -8
- package/dist/astro/routes/api/settings/backups/export.mjs +8 -8
- package/dist/astro/routes/api/settings/backups/index.mjs +9 -9
- package/dist/astro/routes/api/settings/domain-notify.d.mts +8 -0
- package/dist/astro/routes/api/settings/domain-notify.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/domain-notify.mjs +125 -0
- package/dist/astro/routes/api/settings/domain-notify.mjs.map +1 -0
- package/dist/astro/routes/api/settings/domain.d.mts +9 -0
- package/dist/astro/routes/api/settings/domain.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/domain.mjs +61 -0
- package/dist/astro/routes/api/settings/domain.mjs.map +1 -0
- package/dist/astro/routes/api/settings/email.mjs +7 -7
- package/dist/astro/routes/api/settings.mjs +22 -22
- package/dist/astro/routes/api/setup/admin-verify.mjs +21 -21
- package/dist/astro/routes/api/setup/admin.mjs +19 -19
- package/dist/astro/routes/api/setup/dev-bypass.mjs +43 -43
- package/dist/astro/routes/api/setup/dev-reset.mjs +5 -5
- package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/index.mjs +59 -50
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +7 -7
- package/dist/astro/routes/api/site/domain-proof.d.mts +8 -0
- package/dist/astro/routes/api/site/domain-proof.d.mts.map +1 -0
- package/dist/astro/routes/api/site/domain-proof.mjs +33 -0
- package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -0
- package/dist/astro/routes/api/snapshot.mjs +10 -10
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
- package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -36
- package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
- package/dist/astro/routes/api/themes/preview.mjs +8 -8
- package/dist/astro/routes/api/typegen.mjs +7 -7
- package/dist/astro/routes/api/visual-editing/action-token.mjs +8 -8
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +20 -20
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +5 -5
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- 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 +17 -17
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
- package/dist/astro/routes/api/widget-components.mjs +6 -6
- package/dist/astro/routes/robots.txt.mjs +7 -7
- package/dist/astro/routes/sitemap-_collection_.xml.d.mts.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +30 -13
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.d.mts.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +14 -13
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +30 -18
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-CCH3MA4Y.mjs +127 -0
- package/dist/audit-CCH3MA4Y.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/auth/providers/microsoft.d.mts +27 -0
- package/dist/auth/providers/microsoft.d.mts.map +1 -0
- package/dist/auth/providers/microsoft.mjs +20 -0
- package/dist/auth/providers/microsoft.mjs.map +1 -0
- package/dist/authoritative-records-Dcs7l2H5.mjs +5183 -0
- package/dist/authoritative-records-Dcs7l2H5.mjs.map +1 -0
- package/dist/authorize-TdIGpRSE.mjs +49 -0
- package/dist/authorize-TdIGpRSE.mjs.map +1 -0
- package/dist/backup-CZt5Mzwx.mjs +246 -0
- package/dist/backup-CZt5Mzwx.mjs.map +1 -0
- package/dist/base64-BQBZwXCx.mjs +63 -0
- package/dist/base64-BQBZwXCx.mjs.map +1 -0
- package/dist/block-types-DHnkzE6u.mjs +132 -0
- package/dist/block-types-DHnkzE6u.mjs.map +1 -0
- package/dist/block-values-C4N_F2-G.mjs +175 -0
- package/dist/block-values-C4N_F2-G.mjs.map +1 -0
- package/dist/byline-BmVKOQ8l.mjs +909 -0
- package/dist/byline-BmVKOQ8l.mjs.map +1 -0
- package/dist/byline-fields-B8SDs3M_.mjs +123 -0
- package/dist/byline-fields-B8SDs3M_.mjs.map +1 -0
- package/dist/byline-fields-Bze3ZdAw.mjs +280 -0
- package/dist/byline-fields-Bze3ZdAw.mjs.map +1 -0
- package/dist/bylines-CHhR28r9.mjs +150 -0
- package/dist/bylines-CHhR28r9.mjs.map +1 -0
- package/dist/bylines-DZS4OflA.mjs +234 -0
- package/dist/bylines-DZS4OflA.mjs.map +1 -0
- package/dist/cache-x0z8t_m9.mjs +133 -0
- package/dist/cache-x0z8t_m9.mjs.map +1 -0
- package/dist/canonical-BUcKRYpG.mjs +174 -0
- package/dist/canonical-BUcKRYpG.mjs.map +1 -0
- package/dist/capture-triggers-C9JKoIdT.mjs +362 -0
- package/dist/capture-triggers-C9JKoIdT.mjs.map +1 -0
- package/dist/challenge-store-BHgdPVze.mjs +51 -0
- package/dist/challenge-store-BHgdPVze.mjs.map +1 -0
- package/dist/checksum-BYR5i7qe.mjs +162 -0
- package/dist/checksum-BYR5i7qe.mjs.map +1 -0
- package/dist/chrome-tags-BIKBMZYO.mjs +24 -0
- package/dist/chrome-tags-BIKBMZYO.mjs.map +1 -0
- package/dist/chunks-Dr5Vr0zA.mjs +25 -0
- package/dist/chunks-Dr5Vr0zA.mjs.map +1 -0
- package/dist/cli/index.mjs +54 -52
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +34 -34
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +2 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-slugs-cache-B2Gs9Jwx.mjs +85 -0
- package/dist/collection-slugs-cache-B2Gs9Jwx.mjs.map +1 -0
- package/dist/comment-CWla6OHV.mjs +325 -0
- package/dist/comment-CWla6OHV.mjs.map +1 -0
- package/dist/comment-reaction-RZrcs5cW.mjs +85 -0
- package/dist/comment-reaction-RZrcs5cW.mjs.map +1 -0
- package/dist/comments-BzmIKVb2.mjs +99 -0
- package/dist/comments-BzmIKVb2.mjs.map +1 -0
- package/dist/comments-Da_dI2O1.mjs +195 -0
- package/dist/comments-Da_dI2O1.mjs.map +1 -0
- package/dist/components-oFXumpf5.mjs +112 -0
- package/dist/components-oFXumpf5.mjs.map +1 -0
- package/dist/config--wamYxBW.d.mts +39 -0
- package/dist/config--wamYxBW.d.mts.map +1 -0
- package/dist/config-Bo4eOOdV.mjs +228 -0
- package/dist/config-Bo4eOOdV.mjs.map +1 -0
- package/dist/config-C4-UxIk7.d.mts +6790 -0
- package/dist/config-C4-UxIk7.d.mts.map +1 -0
- package/dist/connection-UpzYxtE2.mjs +36 -0
- package/dist/connection-UpzYxtE2.mjs.map +1 -0
- package/dist/content-CcHrqkgp.mjs +2072 -0
- package/dist/content-CcHrqkgp.mjs.map +1 -0
- package/dist/content-list-query-Bxxdd9fv.d.mts +26 -0
- package/dist/content-list-query-Bxxdd9fv.d.mts.map +1 -0
- package/dist/content-repair-havk1F0-.mjs +442 -0
- package/dist/content-repair-havk1F0-.mjs.map +1 -0
- package/dist/context-CvhgHgSH.mjs +2043 -0
- package/dist/context-CvhgHgSH.mjs.map +1 -0
- package/dist/credits-CygUrPOi.mjs +110 -0
- package/dist/credits-CygUrPOi.mjs.map +1 -0
- package/dist/cron-C6ytTOLw.mjs +306 -0
- package/dist/cron-C6ytTOLw.mjs.map +1 -0
- package/dist/dashboard-7_FYfafc.mjs +151 -0
- package/dist/dashboard-7_FYfafc.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/index.mjs.map +1 -1
- 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 +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/default-CHCUkV4Z.mjs +81 -0
- package/dist/default-CHCUkV4Z.mjs.map +1 -0
- package/dist/deferred-tasks-G0xhcJTl.d.mts +9 -0
- package/dist/deferred-tasks-G0xhcJTl.d.mts.map +1 -0
- package/dist/dev-typegen-Dtl8AfS6.mjs +29 -0
- package/dist/dev-typegen-Dtl8AfS6.mjs.map +1 -0
- package/dist/device-flow-CzDJmQ1q.mjs +521 -0
- package/dist/device-flow-CzDJmQ1q.mjs.map +1 -0
- package/dist/digest-xJmyPv2r.mjs +194 -0
- package/dist/digest-xJmyPv2r.mjs.map +1 -0
- package/dist/direct-executor-BXiYIVJ9.mjs +104 -0
- package/dist/direct-executor-BXiYIVJ9.mjs.map +1 -0
- package/dist/email-console-7ZPApLlm.mjs +50 -0
- package/dist/email-console-7ZPApLlm.mjs.map +1 -0
- package/dist/email-locale-DFdUA6UF.mjs +25 -0
- package/dist/email-locale-DFdUA6UF.mjs.map +1 -0
- package/dist/emdash-runtime-C4oFeVpN.mjs +4363 -0
- package/dist/emdash-runtime-C4oFeVpN.mjs.map +1 -0
- package/dist/enrich-Duu4sV3a.mjs +194 -0
- package/dist/enrich-Duu4sV3a.mjs.map +1 -0
- package/dist/entry-lock-B4n0HdQ_.mjs +163 -0
- package/dist/entry-lock-B4n0HdQ_.mjs.map +1 -0
- package/dist/entry-lock-BAAlKYrz.d.mts +4566 -0
- package/dist/entry-lock-BAAlKYrz.d.mts.map +1 -0
- package/dist/entry-lock-Cjz0h45X.mjs +1209 -0
- package/dist/entry-lock-Cjz0h45X.mjs.map +1 -0
- package/dist/env-types-4bkF6Bqg.mjs +38 -0
- package/dist/env-types-4bkF6Bqg.mjs.map +1 -0
- package/dist/error-DxgQdaZ_.mjs +90 -0
- package/dist/error-DxgQdaZ_.mjs.map +1 -0
- package/dist/errors-CjtE5aWF.mjs +120 -0
- package/dist/errors-CjtE5aWF.mjs.map +1 -0
- package/dist/errors-hskQ0C8G.mjs +479 -0
- package/dist/errors-hskQ0C8G.mjs.map +1 -0
- package/dist/escape-ESFhYzwG.mjs +9 -0
- package/dist/escape-ESFhYzwG.mjs.map +1 -0
- package/dist/fence-vc3aHgRA.mjs +162 -0
- package/dist/fence-vc3aHgRA.mjs.map +1 -0
- package/dist/field-defs-cache-zoow36nz.mjs +77 -0
- package/dist/field-defs-cache-zoow36nz.mjs.map +1 -0
- package/dist/field-map-JD1wG0Tq.mjs +83 -0
- package/dist/field-map-JD1wG0Tq.mjs.map +1 -0
- package/dist/fts-manager-WJCN8uU6.mjs +443 -0
- package/dist/fts-manager-WJCN8uU6.mjs.map +1 -0
- package/dist/gc-CsGZiKdH.mjs +75 -0
- package/dist/gc-CsGZiKdH.mjs.map +1 -0
- package/dist/hash-C4DFoJ7Z.mjs +37 -0
- package/dist/hash-C4DFoJ7Z.mjs.map +1 -0
- package/dist/hook-result-CXjtMk7Q.d.mts +31 -0
- package/dist/hook-result-CXjtMk7Q.d.mts.map +1 -0
- package/dist/hreflang-BAma7iRr.mjs +105 -0
- package/dist/hreflang-BAma7iRr.mjs.map +1 -0
- package/dist/hreflang-BsYo4x_M.d.mts +50 -0
- package/dist/hreflang-BsYo4x_M.d.mts.map +1 -0
- package/dist/http-route-dispatch-C8G7hAK6.mjs +342 -0
- package/dist/http-route-dispatch-C8G7hAK6.mjs.map +1 -0
- package/dist/identity-BwBKM1fH.mjs +35 -0
- package/dist/identity-BwBKM1fH.mjs.map +1 -0
- package/dist/import-DJ3Z2wxE.mjs +2021 -0
- package/dist/import-DJ3Z2wxE.mjs.map +1 -0
- package/dist/index-DYsn97dY.d.mts +623 -0
- package/dist/index-DYsn97dY.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +99 -98
- package/dist/init-lock-BGmew3r1.mjs +56 -0
- package/dist/init-lock-BGmew3r1.mjs.map +1 -0
- package/dist/install-finalization-DCFnFSHv.mjs +58 -0
- package/dist/install-finalization-DCFnFSHv.mjs.map +1 -0
- package/dist/keys-CGvAndSp.mjs +61 -0
- package/dist/keys-CGvAndSp.mjs.map +1 -0
- package/dist/kinds-DT1W4T4Y.mjs +974 -0
- package/dist/kinds-DT1W4T4Y.mjs.map +1 -0
- package/dist/lifecycle-BzglCSY0.mjs +25 -0
- package/dist/lifecycle-BzglCSY0.mjs.map +1 -0
- package/dist/load-DjUqmf3s.mjs +28 -0
- package/dist/load-DjUqmf3s.mjs.map +1 -0
- package/dist/loader-CetY659y.mjs +1355 -0
- package/dist/loader-CetY659y.mjs.map +1 -0
- package/dist/loops-DkT1zkPH.mjs +205 -0
- package/dist/loops-DkT1zkPH.mjs.map +1 -0
- package/dist/manifest-builder-BOFCd9rX.mjs +189 -0
- package/dist/manifest-builder-BOFCd9rX.mjs.map +1 -0
- package/dist/manifest-schema-BiFBPEsp.mjs +497 -0
- package/dist/manifest-schema-BiFBPEsp.mjs.map +1 -0
- package/dist/marketplace-CUlenvZm.mjs +257 -0
- package/dist/marketplace-CUlenvZm.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +26 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +73 -3
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +1 -1
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +7 -7
- package/dist/media-CRKsKlfK.mjs +416 -0
- package/dist/media-CRKsKlfK.mjs.map +1 -0
- package/dist/media-C_z7sRuC.mjs +294 -0
- package/dist/media-C_z7sRuC.mjs.map +1 -0
- package/dist/media-IT8hQleU.mjs +373 -0
- package/dist/media-IT8hQleU.mjs.map +1 -0
- package/dist/media-allowlist-Ct6wvnT2.mjs +45 -0
- package/dist/media-allowlist-Ct6wvnT2.mjs.map +1 -0
- package/dist/media-folders-DtMt-vAA.mjs +210 -0
- package/dist/media-folders-DtMt-vAA.mjs.map +1 -0
- package/dist/media-url-BpXLqCmf.mjs +43 -0
- package/dist/media-url-BpXLqCmf.mjs.map +1 -0
- package/dist/media-usage-DEPHZZ9X.mjs +282 -0
- package/dist/media-usage-DEPHZZ9X.mjs.map +1 -0
- package/dist/media-usage-activation-V2Siabtw.mjs +78 -0
- package/dist/media-usage-activation-V2Siabtw.mjs.map +1 -0
- package/dist/media-usage-work-Cv1OE59F.mjs +151 -0
- package/dist/media-usage-work-Cv1OE59F.mjs.map +1 -0
- package/dist/media-usage-work-cgDYGvrt.mjs +1015 -0
- package/dist/media-usage-work-cgDYGvrt.mjs.map +1 -0
- package/dist/menus-CvVYfsuk.mjs +753 -0
- package/dist/menus-CvVYfsuk.mjs.map +1 -0
- package/dist/menus-D1HC8npj.mjs +92 -0
- package/dist/menus-D1HC8npj.mjs.map +1 -0
- package/dist/menus-DL8IPIcm.mjs +3721 -0
- package/dist/menus-DL8IPIcm.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mime-B5M9R53H.mjs +81 -0
- package/dist/mime-B5M9R53H.mjs.map +1 -0
- package/dist/mode-eieqAWLe.mjs +23 -0
- package/dist/mode-eieqAWLe.mjs.map +1 -0
- package/dist/node-sqlite-compat-VuyzJw1b.mjs +63 -0
- package/dist/node-sqlite-compat-VuyzJw1b.mjs.map +1 -0
- package/dist/oauth-authorization-B6ZJbMd2.mjs +274 -0
- package/dist/oauth-authorization-B6ZJbMd2.mjs.map +1 -0
- package/dist/oauth-clients-DVjRc9v3.mjs +266 -0
- package/dist/oauth-clients-DVjRc9v3.mjs.map +1 -0
- package/dist/oauth-state-store-CnmYYsVQ.mjs +50 -0
- package/dist/oauth-state-store-CnmYYsVQ.mjs.map +1 -0
- package/dist/oauth-user-lookup-Dz1_R5vT.mjs +26 -0
- package/dist/oauth-user-lookup-Dz1_R5vT.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/options-BR9XZl7h.d.mts +81 -0
- package/dist/options-BR9XZl7h.d.mts.map +1 -0
- package/dist/ownership-COPyVysP.mjs +12 -0
- package/dist/ownership-COPyVysP.mjs.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +6 -6
- package/dist/parse-BOGhrwSq.d.mts +174 -0
- package/dist/parse-BOGhrwSq.d.mts.map +1 -0
- package/dist/parse-Cn5aSk1N.mjs +81 -0
- package/dist/parse-Cn5aSk1N.mjs.map +1 -0
- package/dist/passkey-config-mMFRQUCj.mjs +46 -0
- package/dist/passkey-config-mMFRQUCj.mjs.map +1 -0
- package/dist/paths-BmcAdBo9.mjs +77 -0
- package/dist/paths-BmcAdBo9.mjs.map +1 -0
- package/dist/patterns-CMNnYCgf.mjs +159 -0
- package/dist/patterns-CMNnYCgf.mjs.map +1 -0
- package/dist/placeholder-nOep3_Gn.d.mts +306 -0
- package/dist/placeholder-nOep3_Gn.d.mts.map +1 -0
- package/dist/plan-CDY4K8CH.mjs +135 -0
- package/dist/plan-CDY4K8CH.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.d.mts.map +1 -1
- package/dist/plugin-test-runtime.mjs +111 -110
- package/dist/plugin-types.d.mts +2 -2
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugin-utils.mjs +1 -1
- package/dist/plugin-utils.mjs.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
- package/dist/plugins/host.d.mts +5 -5
- package/dist/plugins/host.mjs +45 -44
- package/dist/plugins-DFBpfbO3.mjs +261 -0
- package/dist/plugins-DFBpfbO3.mjs.map +1 -0
- package/dist/policy-B_2qnHSy.mjs +45 -0
- package/dist/policy-B_2qnHSy.mjs.map +1 -0
- package/dist/portable-text-Dc2YAusw.mjs +307 -0
- package/dist/portable-text-Dc2YAusw.mjs.map +1 -0
- package/dist/preview-BtzikJ9O.mjs +107 -0
- package/dist/preview-BtzikJ9O.mjs.map +1 -0
- package/dist/protocol-M268ox8L.d.mts +61 -0
- package/dist/protocol-M268ox8L.d.mts.map +1 -0
- package/dist/public-submission-BQZavgZU.mjs +251 -0
- package/dist/public-submission-BQZavgZU.mjs.map +1 -0
- package/dist/public-url-uT1Ok2Tu.mjs +101 -0
- package/dist/public-url-uT1Ok2Tu.mjs.map +1 -0
- package/dist/query-BGG3sDEd.mjs +1127 -0
- package/dist/query-BGG3sDEd.mjs.map +1 -0
- package/dist/query-C_CWlifp.mjs +41 -0
- package/dist/query-C_CWlifp.mjs.map +1 -0
- package/dist/range-CXK_kDbI.mjs +51 -0
- package/dist/range-CXK_kDbI.mjs.map +1 -0
- package/dist/rate-limit-Dvamvay-.mjs +127 -0
- package/dist/rate-limit-Dvamvay-.mjs.map +1 -0
- package/dist/receipt-BmQGzquP.mjs +43 -0
- package/dist/receipt-BmQGzquP.mjs.map +1 -0
- package/dist/redirect-B39kTQ_0.mjs +423 -0
- package/dist/redirect-B39kTQ_0.mjs.map +1 -0
- package/dist/redirect-BguJ00Pv.mjs +19 -0
- package/dist/redirect-BguJ00Pv.mjs.map +1 -0
- package/dist/redirects-C8G4BsfP.mjs +446 -0
- package/dist/redirects-C8G4BsfP.mjs.map +1 -0
- package/dist/redirects-DFT7Wr-e.mjs +148 -0
- package/dist/redirects-DFT7Wr-e.mjs.map +1 -0
- package/dist/registry/testing.mjs +3 -3
- package/dist/registry-DeZ27gVi.mjs +8374 -0
- package/dist/registry-DeZ27gVi.mjs.map +1 -0
- package/dist/relations-DBB1bRJW.mjs +776 -0
- package/dist/relations-DBB1bRJW.mjs.map +1 -0
- package/dist/request-context.d.mts +2 -2
- package/dist/request-context.mjs.map +1 -1
- package/dist/request-meta-BSvkhIBX.mjs +141 -0
- package/dist/request-meta-BSvkhIBX.mjs.map +1 -0
- package/dist/resolve-BxH64HN9.mjs +100 -0
- package/dist/resolve-BxH64HN9.mjs.map +1 -0
- package/dist/revision-BWEH2qQB.mjs +368 -0
- package/dist/revision-BWEH2qQB.mjs.map +1 -0
- package/dist/route-wire-CwbWB_6O.mjs +197 -0
- package/dist/route-wire-CwbWB_6O.mjs.map +1 -0
- package/dist/routes-BfIxc7ft.mjs +272 -0
- package/dist/routes-BfIxc7ft.mjs.map +1 -0
- package/dist/runner-DkeafPBA.d.mts +68 -0
- package/dist/runner-DkeafPBA.d.mts.map +1 -0
- package/dist/runner-wqt4BrIW.mjs +6383 -0
- package/dist/runner-wqt4BrIW.mjs.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -3
- package/dist/schema/project-env-types.mjs +38 -38
- package/dist/schema-BXIW-JHi.mjs +815 -0
- package/dist/schema-BXIW-JHi.mjs.map +1 -0
- package/dist/schema-I74JwYte.mjs +13 -0
- package/dist/schema-I74JwYte.mjs.map +1 -0
- package/dist/scopes-RWZ5ft_Z.mjs +34 -0
- package/dist/scopes-RWZ5ft_Z.mjs.map +1 -0
- package/dist/search-DxwagyWS.mjs +450 -0
- package/dist/search-DxwagyWS.mjs.map +1 -0
- package/dist/secrets-Cc_O3Kp-.mjs +369 -0
- package/dist/secrets-Cc_O3Kp-.mjs.map +1 -0
- package/dist/sections-Ccq9ZgyD.mjs +346 -0
- package/dist/sections-Ccq9ZgyD.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +36 -36
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +23 -23
- package/dist/seo-CCnfPWAQ.mjs +133 -0
- package/dist/seo-CCnfPWAQ.mjs.map +1 -0
- package/dist/seo-QCtJ1jjV.mjs +188 -0
- package/dist/seo-QCtJ1jjV.mjs.map +1 -0
- package/dist/service-DX84s2rw.mjs +150 -0
- package/dist/service-DX84s2rw.mjs.map +1 -0
- package/dist/session-user-1dtJc2zv.mjs +61 -0
- package/dist/session-user-1dtJc2zv.mjs.map +1 -0
- package/dist/settings-B1jOxAIl.mjs +443 -0
- package/dist/settings-B1jOxAIl.mjs.map +1 -0
- package/dist/settings-Bc1IBl1t.mjs +66 -0
- package/dist/settings-Bc1IBl1t.mjs.map +1 -0
- package/dist/settings-GaZ5sVgg.mjs +73 -0
- package/dist/settings-GaZ5sVgg.mjs.map +1 -0
- package/dist/setup-complete-DidMAWJS.mjs +65 -0
- package/dist/setup-complete-DidMAWJS.mjs.map +1 -0
- package/dist/setup-nonce-DKl4S4c6.mjs +25 -0
- package/dist/setup-nonce-DKl4S4c6.mjs.map +1 -0
- package/dist/single-flight-cache-D0EaGbN1.mjs +104 -0
- package/dist/single-flight-cache-D0EaGbN1.mjs.map +1 -0
- package/dist/site-domain-CbI51Pc2.mjs +113 -0
- package/dist/site-domain-CbI51Pc2.mjs.map +1 -0
- package/dist/site-settings-CDdT4mVm.mjs +50 -0
- package/dist/site-settings-CDdT4mVm.mjs.map +1 -0
- package/dist/site-url-CrDZaAvo.mjs +45 -0
- package/dist/site-url-CrDZaAvo.mjs.map +1 -0
- package/dist/sitemap-name-W3BTor6X.mjs +26 -0
- package/dist/sitemap-name-W3BTor6X.mjs.map +1 -0
- package/dist/slug-BJhHKoOH.mjs +16 -0
- package/dist/slug-BJhHKoOH.mjs.map +1 -0
- package/dist/slugify-bu2-jKia.mjs +22 -0
- package/dist/slugify-bu2-jKia.mjs.map +1 -0
- package/dist/snapshot-BuI_2uDe.mjs +414 -0
- package/dist/snapshot-BuI_2uDe.mjs.map +1 -0
- package/dist/ssrf-LM_0wpGA.mjs +406 -0
- package/dist/ssrf-LM_0wpGA.mjs.map +1 -0
- package/dist/stage-DhzZuYaT.mjs +662 -0
- package/dist/stage-DhzZuYaT.mjs.map +1 -0
- package/dist/staged-DboEaWsV.mjs +686 -0
- package/dist/staged-DboEaWsV.mjs.map +1 -0
- package/dist/state-DCXDzjHq.mjs +178 -0
- package/dist/state-DCXDzjHq.mjs.map +1 -0
- package/dist/status-Dl85BK39.mjs +30 -0
- package/dist/status-Dl85BK39.mjs.map +1 -0
- package/dist/storage/local.d.mts +2 -2
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +12 -5
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +4 -2
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +56 -9
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/storage-query-BOBmeDMD.d.mts +1615 -0
- package/dist/storage-query-BOBmeDMD.d.mts.map +1 -0
- package/dist/tar-K40edFMt.mjs +449 -0
- package/dist/tar-K40edFMt.mjs.map +1 -0
- package/dist/target-BOighEY1.mjs +27 -0
- package/dist/target-BOighEY1.mjs.map +1 -0
- package/dist/taxonomies-DQSywBvX.mjs +697 -0
- package/dist/taxonomies-DQSywBvX.mjs.map +1 -0
- package/dist/taxonomies-Dj5eaobC.mjs +939 -0
- package/dist/taxonomies-Dj5eaobC.mjs.map +1 -0
- package/dist/taxonomy-QrNmTfIZ.mjs +550 -0
- package/dist/taxonomy-QrNmTfIZ.mjs.map +1 -0
- package/dist/tokens-j5L0as2H.mjs +171 -0
- package/dist/tokens-j5L0as2H.mjs.map +1 -0
- package/dist/transfer-CYEw8Tu4.mjs +8873 -0
- package/dist/transfer-CYEw8Tu4.mjs.map +1 -0
- package/dist/transfer-DDX10hkD.mjs +166 -0
- package/dist/transfer-DDX10hkD.mjs.map +1 -0
- package/dist/transfer-download-BAqq6GJv.mjs +33 -0
- package/dist/transfer-download-BAqq6GJv.mjs.map +1 -0
- package/dist/transformations-De44wqV_.mjs +196 -0
- package/dist/transformations-De44wqV_.mjs.map +1 -0
- package/dist/transport-1QjUhCRO.d.mts +42 -0
- package/dist/transport-1QjUhCRO.d.mts.map +1 -0
- package/dist/transport-Ds5pVX7p.mjs +136 -0
- package/dist/transport-Ds5pVX7p.mjs.map +1 -0
- package/dist/trusted-proxy-d4Tk6biT.mjs +51 -0
- package/dist/trusted-proxy-d4Tk6biT.mjs.map +1 -0
- package/dist/turnstile-DaFLtyrs.mjs +58 -0
- package/dist/turnstile-DaFLtyrs.mjs.map +1 -0
- package/dist/types-B4-1P2DK.d.mts +227 -0
- package/dist/types-B4-1P2DK.d.mts.map +1 -0
- package/dist/types-BKXA0f-c.mjs +16 -0
- package/dist/types-BKXA0f-c.mjs.map +1 -0
- package/dist/types-BiHcpUoO.d.mts +374 -0
- package/dist/types-BiHcpUoO.d.mts.map +1 -0
- package/dist/types-BihhvkyN.d.mts +85 -0
- package/dist/types-BihhvkyN.d.mts.map +1 -0
- package/dist/types-Bq9Wohd7.d.mts +363 -0
- package/dist/types-Bq9Wohd7.d.mts.map +1 -0
- package/dist/types-C-Xp0CcN.mjs +103 -0
- package/dist/types-C-Xp0CcN.mjs.map +1 -0
- package/dist/types-C4P7F1Vq.d.mts +1741 -0
- package/dist/types-C4P7F1Vq.d.mts.map +1 -0
- package/dist/types-CGaqwHw4.mjs +37 -0
- package/dist/types-CGaqwHw4.mjs.map +1 -0
- package/dist/types-Cj0_yZkn.mjs +18 -0
- package/dist/types-Cj0_yZkn.mjs.map +1 -0
- package/dist/types-D4ECCE4X.mjs +77 -0
- package/dist/types-D4ECCE4X.mjs.map +1 -0
- package/dist/types-DcRJp0vS.d.mts +125 -0
- package/dist/types-DcRJp0vS.d.mts.map +1 -0
- package/dist/types-Ff85fTzU.d.mts +289 -0
- package/dist/types-Ff85fTzU.d.mts.map +1 -0
- package/dist/types-UKr5Sf4y.d.mts +916 -0
- package/dist/types-UKr5Sf4y.d.mts.map +1 -0
- package/dist/types-YpN8hZW7.d.mts +204 -0
- package/dist/types-YpN8hZW7.d.mts.map +1 -0
- package/dist/update-check-DrlsK-tt.mjs +161 -0
- package/dist/update-check-DrlsK-tt.mjs.map +1 -0
- package/dist/upload-attempts-D8CPPvRU.mjs +32 -0
- package/dist/upload-attempts-D8CPPvRU.mjs.map +1 -0
- package/dist/url-pattern-Di4Nn3vP.mjs +41 -0
- package/dist/url-pattern-Di4Nn3vP.mjs.map +1 -0
- package/dist/user-B-ZdGjhI.mjs +171 -0
- package/dist/user-B-ZdGjhI.mjs.map +1 -0
- package/dist/utils-D7wL3r6-.mjs +437 -0
- package/dist/utils-D7wL3r6-.mjs.map +1 -0
- package/dist/validate-BSZbSUDk.mjs +524 -0
- package/dist/validate-BSZbSUDk.mjs.map +1 -0
- package/dist/validate-Dfv0DpZi.d.mts +468 -0
- package/dist/validate-Dfv0DpZi.d.mts.map +1 -0
- package/dist/validation-DRyC_Vm5.mjs +219 -0
- package/dist/validation-DRyC_Vm5.mjs.map +1 -0
- package/dist/version-C4kz0PcO.mjs +7 -0
- package/dist/version-C4kz0PcO.mjs.map +1 -0
- package/dist/version-jhs2BRtl.mjs +9 -0
- package/dist/version-jhs2BRtl.mjs.map +1 -0
- package/dist/video-DReZ48Un.mjs +54 -0
- package/dist/video-DReZ48Un.mjs.map +1 -0
- package/dist/virtual-modules-D0e6VbEv.mjs +516 -0
- package/dist/virtual-modules-D0e6VbEv.mjs.map +1 -0
- package/dist/widgets-BkcMzKct.mjs +121 -0
- package/dist/widgets-BkcMzKct.mjs.map +1 -0
- package/dist/wxr-taxonomies-BxI0CbTg.mjs +453 -0
- package/dist/wxr-taxonomies-BxI0CbTg.mjs.map +1 -0
- package/dist/wxr-taxonomies-Dad33GJi.d.mts +34 -0
- package/dist/wxr-taxonomies-Dad33GJi.d.mts.map +1 -0
- package/dist/zod-generator-BQilAboC.mjs +424 -0
- package/dist/zod-generator-BQilAboC.mjs.map +1 -0
- package/package.json +19 -10
- package/src/api/errors.ts +12 -0
- package/src/api/handlers/api-tokens.ts +12 -6
- package/src/api/handlers/bylines.ts +24 -3
- package/src/api/handlers/calendar.ts +246 -0
- package/src/api/handlers/content.ts +69 -13
- package/src/api/handlers/domain-move-notice.ts +94 -0
- package/src/api/handlers/index.ts +2 -0
- package/src/api/handlers/manifest.ts +5 -0
- package/src/api/handlers/media-allowlist.ts +1 -0
- package/src/api/handlers/media-upload.ts +13 -10
- package/src/api/handlers/media-usage.ts +2 -1
- package/src/api/handlers/media.ts +1 -0
- package/src/api/handlers/plugins.ts +21 -29
- package/src/api/handlers/redirects.ts +6 -6
- package/src/api/handlers/seo.ts +155 -59
- package/src/api/handlers/settings.ts +31 -1
- package/src/api/handlers/site-domain.ts +143 -0
- package/src/api/openapi/document.ts +2 -2
- package/src/api/public-url.ts +1 -1
- package/src/api/schemas/bylines.ts +3 -1
- package/src/api/schemas/content.ts +36 -0
- package/src/api/schemas/media-usage.ts +7 -1
- package/src/api/schemas/media.ts +12 -0
- package/src/api/site-url.ts +53 -5
- package/src/api/types.ts +2 -0
- package/src/astro/image-endpoint.ts +46 -4
- package/src/astro/integration/admin-locales.ts +168 -0
- package/src/astro/integration/dev-env.ts +84 -0
- package/src/astro/integration/index.ts +67 -10
- package/src/astro/integration/routes.ts +25 -0
- package/src/astro/integration/runtime.ts +15 -0
- package/src/astro/integration/vite-config.ts +29 -1
- package/src/astro/middleware/auth.ts +16 -3
- package/src/astro/middleware/csp.ts +2 -0
- package/src/astro/middleware/redirect.ts +47 -21
- package/src/astro/middleware/request-context.ts +64 -31
- package/src/astro/middleware.ts +150 -26
- package/src/astro/prefetch.ts +10 -3
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +0 -5
- package/src/astro/routes/api/admin/bylines/index.ts +1 -1
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +1 -0
- package/src/astro/routes/api/auth/handover.ts +58 -0
- package/src/astro/routes/api/auth/magic-link/verify.ts +11 -3
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +56 -4
- package/src/astro/routes/api/auth/oauth/[provider].ts +37 -4
- package/src/astro/routes/api/auth/passkey/options.ts +10 -2
- package/src/astro/routes/api/calendar.ts +35 -0
- package/src/astro/routes/api/import/wordpress/execute.ts +19 -0
- package/src/astro/routes/api/import/wordpress/rewrite-url-helpers.ts +80 -42
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +15 -0
- package/src/astro/routes/api/manifest.ts +10 -0
- package/src/astro/routes/api/media/[id]/confirm.ts +19 -0
- package/src/astro/routes/api/media/file/[...key].ts +60 -12
- package/src/astro/routes/api/media/upload-url.ts +35 -7
- package/src/astro/routes/api/media.ts +24 -5
- package/src/astro/routes/api/schema/index.ts +1 -1
- package/src/astro/routes/api/settings/domain-notify.ts +76 -0
- package/src/astro/routes/api/settings/domain.ts +63 -0
- package/src/astro/routes/api/setup/index.ts +21 -2
- package/src/astro/routes/api/site/domain-proof.ts +28 -0
- package/src/astro/routes/sitemap-[collection].xml.ts +31 -8
- package/src/astro/routes/sitemap.xml.ts +12 -10
- package/src/astro/types.ts +13 -1
- package/src/auth/providers/microsoft-admin.tsx +31 -0
- package/src/auth/providers/microsoft.ts +47 -0
- package/src/auth/rate-limit.ts +18 -13
- package/src/auth/types.ts +7 -0
- package/src/aws-sdk.d.ts +2 -1
- package/src/cleanup.ts +26 -0
- package/src/cli/commands/export-seed.ts +2 -0
- package/src/cli/commands/seed.ts +5 -4
- package/src/client/index.ts +6 -1
- package/src/comments/public-submission.ts +15 -8
- package/src/comments/turnstile.ts +6 -1
- package/src/components/CommentForm.astro +48 -8
- package/src/components/Comments.astro +50 -28
- package/src/components/EmDashImage.astro +6 -4
- package/src/components/Gallery.astro +4 -3
- package/src/components/HtmlBlock.astro +17 -6
- package/src/components/HtmlBlockFrame.astro +63 -0
- package/src/components/Iframe.astro +141 -0
- package/src/components/Image.astro +4 -3
- package/src/components/InlinePortableTextEditor.tsx +156 -33
- package/src/components/Video.astro +100 -0
- package/src/components/WebMcpSearch.astro +80 -0
- package/src/components/index.ts +8 -2
- package/src/components/inline-code-block.tsx +8 -0
- package/src/components/webmcp-search.ts +138 -0
- package/src/components/widgets/RecentPosts.astro +57 -17
- package/src/config/secrets.ts +27 -15
- package/src/content/converters/mark-safety.ts +3 -3
- package/src/content/converters/portable-text-identity.ts +2 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +43 -2
- package/src/content/converters/prosemirror-to-portable-text.ts +44 -2
- package/src/content/converters/types.ts +46 -0
- package/src/content/converters/video.ts +77 -0
- package/src/database/content-datetime.ts +11 -4
- package/src/database/datetime-storage.ts +1 -1
- package/src/database/migrations/090_redirect_enable_loop_guard.ts +70 -0
- package/src/database/migrations/091_redirect_artifacts.ts +141 -0
- package/src/database/migrations/runner.ts +17 -1
- package/src/database/repositories/comment.ts +17 -3
- package/src/database/repositories/content.ts +103 -29
- package/src/database/repositories/plugin-storage.ts +28 -19
- package/src/database/repositories/redirect.ts +30 -3
- package/src/database/repositories/taxonomy.ts +61 -46
- package/src/database/repositories/types.ts +2 -0
- package/src/database/request-scoped.ts +34 -0
- package/src/database/types.ts +23 -0
- package/src/db/adapters.ts +2 -0
- package/src/emdash-runtime.ts +245 -71
- package/src/import/menus.ts +3 -0
- package/src/import/sources/wordpress-plugin.ts +3 -2
- package/src/import/utils.ts +2 -3
- package/src/index.ts +4 -0
- package/src/loader.ts +360 -98
- package/src/mcp/server.ts +12 -4
- package/src/media/image-endpoint.ts +101 -1
- package/src/media/mime.ts +21 -0
- package/src/media/responsive.ts +14 -7
- package/src/media/usage/extractor.ts +19 -2
- package/src/media/usage/types.ts +5 -1
- package/src/menus/index.ts +30 -26
- package/src/plugin-utils.ts +1 -1
- package/src/plugins/context.ts +3 -7
- package/src/plugins/hooks.ts +11 -1
- package/src/plugins/http-route-dispatch.ts +5 -1
- package/src/plugins/manager.ts +12 -2
- package/src/plugins/manifest-schema.ts +1 -0
- package/src/plugins/route-error.ts +14 -0
- package/src/plugins/routes.ts +2 -2
- package/src/plugins/state.ts +36 -0
- package/src/plugins/types.ts +22 -0
- package/src/query.ts +20 -29
- package/src/redirects/artifacts.ts +460 -0
- package/src/redirects/cache.ts +76 -41
- package/src/redirects/patterns.ts +26 -2
- package/src/request-context.ts +1 -1
- package/src/schema/registry.ts +7 -4
- package/src/schema/slug.ts +19 -0
- package/src/search/text-extraction.ts +6 -1
- package/src/seed/apply.ts +65 -57
- package/src/seed/validate.ts +31 -0
- package/src/seo/sitemap-name.ts +22 -0
- package/src/settings/index.ts +17 -12
- package/src/storage/index.ts +2 -0
- package/src/storage/local.ts +10 -2
- package/src/storage/range.ts +54 -0
- package/src/storage/s3.ts +52 -8
- package/src/storage/types.ts +30 -3
- package/src/transfer/format/columns.ts +3 -0
- package/src/transfer/import/rebuild.ts +17 -2
- package/src/transfer/import/scaffold.ts +16 -9
- package/src/ui.ts +2 -0
- package/src/utils/sanitize.ts +14 -9
- package/src/utils/slugify.ts +6 -1
- package/src/virtual-modules.d.ts +3 -0
- package/src/visual-editing/toolbar.ts +80 -35
- package/src/widgets/components.ts +4 -0
- package/src/widgets/index.ts +74 -82
- package/src/widgets/recent-posts.ts +62 -0
- package/dist/action-token-D2KE1Rqf.mjs +0 -26
- package/dist/action-token-D2KE1Rqf.mjs.map +0 -1
- package/dist/activation-DDuqAat2.mjs +0 -387
- package/dist/activation-DDuqAat2.mjs.map +0 -1
- package/dist/adapters-Ds-1Pmkm.d.mts +0 -171
- package/dist/adapters-Ds-1Pmkm.d.mts.map +0 -1
- package/dist/allowed-origins-D78QvbTO.mjs +0 -116
- package/dist/allowed-origins-D78QvbTO.mjs.map +0 -1
- package/dist/api-BBZlif0y.mjs +0 -4974
- package/dist/api-BBZlif0y.mjs.map +0 -1
- package/dist/api-tokens-BGbfWZVO.mjs +0 -166
- package/dist/api-tokens-BGbfWZVO.mjs.map +0 -1
- package/dist/apply-CDNV4JJ-.mjs +0 -1672
- package/dist/apply-CDNV4JJ-.mjs.map +0 -1
- package/dist/approvals-CVvJSEBF.mjs +0 -460
- package/dist/approvals-CVvJSEBF.mjs.map +0 -1
- package/dist/artifact-fetch-CGK0DQLj.mjs +0 -659
- package/dist/artifact-fetch-CGK0DQLj.mjs.map +0 -1
- package/dist/audit-BszbE_BP.mjs +0 -127
- package/dist/audit-BszbE_BP.mjs.map +0 -1
- package/dist/authoritative-records-ChM8dTeV.mjs +0 -5172
- package/dist/authoritative-records-ChM8dTeV.mjs.map +0 -1
- package/dist/authorize-CTGywswM.mjs +0 -49
- package/dist/authorize-CTGywswM.mjs.map +0 -1
- package/dist/backup-CDrPP8fI.mjs +0 -246
- package/dist/backup-CDrPP8fI.mjs.map +0 -1
- package/dist/base64-DvnNgP7e.mjs +0 -63
- package/dist/base64-DvnNgP7e.mjs.map +0 -1
- package/dist/block-types-nNEaPkvx.mjs +0 -132
- package/dist/block-types-nNEaPkvx.mjs.map +0 -1
- package/dist/block-values-Bho1nsZF.mjs +0 -175
- package/dist/block-values-Bho1nsZF.mjs.map +0 -1
- package/dist/byline-02tu_Uc-.mjs +0 -909
- package/dist/byline-02tu_Uc-.mjs.map +0 -1
- package/dist/byline-fields-BYbTptTU.mjs +0 -280
- package/dist/byline-fields-BYbTptTU.mjs.map +0 -1
- package/dist/byline-fields-BjQH-1z9.mjs +0 -123
- package/dist/byline-fields-BjQH-1z9.mjs.map +0 -1
- package/dist/bylines-VytjeHBI.mjs +0 -214
- package/dist/bylines-VytjeHBI.mjs.map +0 -1
- package/dist/bylines-gyWBWUUc.mjs +0 -150
- package/dist/bylines-gyWBWUUc.mjs.map +0 -1
- package/dist/cache-CPanL9IO.mjs +0 -114
- package/dist/cache-CPanL9IO.mjs.map +0 -1
- package/dist/canonical-CAecl1UQ.mjs +0 -174
- package/dist/canonical-CAecl1UQ.mjs.map +0 -1
- package/dist/capture-triggers-CdZfvHtF.mjs +0 -362
- package/dist/capture-triggers-CdZfvHtF.mjs.map +0 -1
- package/dist/challenge-store-VePApay4.mjs +0 -51
- package/dist/challenge-store-VePApay4.mjs.map +0 -1
- package/dist/checksum-BSIhEAYW.mjs +0 -162
- package/dist/checksum-BSIhEAYW.mjs.map +0 -1
- package/dist/chrome-tags-CKELm-bo.mjs +0 -24
- package/dist/chrome-tags-CKELm-bo.mjs.map +0 -1
- package/dist/chunks-DBmkKmBH.mjs +0 -25
- package/dist/chunks-DBmkKmBH.mjs.map +0 -1
- package/dist/collection-slugs-cache-BNRAPNiu.mjs +0 -85
- package/dist/collection-slugs-cache-BNRAPNiu.mjs.map +0 -1
- package/dist/comment-Cq1UYN8_.mjs +0 -313
- package/dist/comment-Cq1UYN8_.mjs.map +0 -1
- package/dist/comment-reaction-B5sZzSoA.mjs +0 -85
- package/dist/comment-reaction-B5sZzSoA.mjs.map +0 -1
- package/dist/comments-B3F-ETyh.mjs +0 -195
- package/dist/comments-B3F-ETyh.mjs.map +0 -1
- package/dist/comments-zrTgWBSg.mjs +0 -99
- package/dist/comments-zrTgWBSg.mjs.map +0 -1
- package/dist/components-Dbf4Eq16.mjs +0 -108
- package/dist/components-Dbf4Eq16.mjs.map +0 -1
- package/dist/config-BCM5sQP7.d.mts +0 -6688
- package/dist/config-BCM5sQP7.d.mts.map +0 -1
- package/dist/config-CXPcy2iY.mjs +0 -228
- package/dist/config-CXPcy2iY.mjs.map +0 -1
- package/dist/config-CZkZBuBK.d.mts +0 -39
- package/dist/config-CZkZBuBK.d.mts.map +0 -1
- package/dist/connection-C5GIciX9.mjs +0 -36
- package/dist/connection-C5GIciX9.mjs.map +0 -1
- package/dist/content-RzEXY3QX.mjs +0 -2020
- package/dist/content-RzEXY3QX.mjs.map +0 -1
- package/dist/content-list-query-B6P37Ug_.d.mts +0 -26
- package/dist/content-list-query-B6P37Ug_.d.mts.map +0 -1
- package/dist/content-repair-BDVsYXWK.mjs +0 -442
- package/dist/content-repair-BDVsYXWK.mjs.map +0 -1
- package/dist/context-BpTIzY5h.mjs +0 -2026
- package/dist/context-BpTIzY5h.mjs.map +0 -1
- package/dist/credits-JOE92Gr7.mjs +0 -110
- package/dist/credits-JOE92Gr7.mjs.map +0 -1
- package/dist/cron-ktyapbdB.mjs +0 -306
- package/dist/cron-ktyapbdB.mjs.map +0 -1
- package/dist/dashboard-BoV4pwPP.mjs +0 -151
- package/dist/dashboard-BoV4pwPP.mjs.map +0 -1
- package/dist/default-B7KnYwtQ.mjs +0 -81
- package/dist/default-B7KnYwtQ.mjs.map +0 -1
- package/dist/deferred-tasks-eaUIqXj8.d.mts +0 -9
- package/dist/deferred-tasks-eaUIqXj8.d.mts.map +0 -1
- package/dist/dev-typegen-8JlYYFno.mjs +0 -29
- package/dist/dev-typegen-8JlYYFno.mjs.map +0 -1
- package/dist/device-flow-BlV_z24g.mjs +0 -521
- package/dist/device-flow-BlV_z24g.mjs.map +0 -1
- package/dist/digest-DiYAoZpf.mjs +0 -194
- package/dist/digest-DiYAoZpf.mjs.map +0 -1
- package/dist/direct-executor-Db8xA3zg.mjs +0 -104
- package/dist/direct-executor-Db8xA3zg.mjs.map +0 -1
- package/dist/email-console-Dm78wSmg.mjs +0 -50
- package/dist/email-console-Dm78wSmg.mjs.map +0 -1
- package/dist/email-locale-B4X9LXe9.mjs +0 -25
- package/dist/email-locale-B4X9LXe9.mjs.map +0 -1
- package/dist/emdash-runtime-BakQ6io7.mjs +0 -4239
- package/dist/emdash-runtime-BakQ6io7.mjs.map +0 -1
- package/dist/enrich-BDdVNeDK.mjs +0 -194
- package/dist/enrich-BDdVNeDK.mjs.map +0 -1
- package/dist/entry-lock-DY8B-xcr.d.mts +0 -4544
- package/dist/entry-lock-DY8B-xcr.d.mts.map +0 -1
- package/dist/entry-lock-DrUAdTzf.mjs +0 -163
- package/dist/entry-lock-DrUAdTzf.mjs.map +0 -1
- package/dist/entry-lock-yIkBduqJ.mjs +0 -1180
- package/dist/entry-lock-yIkBduqJ.mjs.map +0 -1
- package/dist/env-types-DkHYR2pl.mjs +0 -38
- package/dist/env-types-DkHYR2pl.mjs.map +0 -1
- package/dist/error-DIYXAVk4.mjs +0 -90
- package/dist/error-DIYXAVk4.mjs.map +0 -1
- package/dist/errors-CNvATh_7.mjs +0 -469
- package/dist/errors-CNvATh_7.mjs.map +0 -1
- package/dist/errors-CjXd1LgH.mjs +0 -120
- package/dist/errors-CjXd1LgH.mjs.map +0 -1
- package/dist/escape-B1GM0yJU.mjs +0 -9
- package/dist/escape-B1GM0yJU.mjs.map +0 -1
- package/dist/fence-8MaKKWhp.mjs +0 -162
- package/dist/fence-8MaKKWhp.mjs.map +0 -1
- package/dist/field-defs-cache-DEkFYCDE.mjs +0 -77
- package/dist/field-defs-cache-DEkFYCDE.mjs.map +0 -1
- package/dist/field-map-D7ioN0r0.mjs +0 -83
- package/dist/field-map-D7ioN0r0.mjs.map +0 -1
- package/dist/fts-manager-DU03MxWu.mjs +0 -443
- package/dist/fts-manager-DU03MxWu.mjs.map +0 -1
- package/dist/gc-DMiE7ezk.mjs +0 -75
- package/dist/gc-DMiE7ezk.mjs.map +0 -1
- package/dist/hash-CY4QdeMJ.mjs +0 -37
- package/dist/hash-CY4QdeMJ.mjs.map +0 -1
- package/dist/hook-result-Cb67D3P3.d.mts +0 -31
- package/dist/hook-result-Cb67D3P3.d.mts.map +0 -1
- package/dist/hreflang-Bterc3b7.mjs +0 -105
- package/dist/hreflang-Bterc3b7.mjs.map +0 -1
- package/dist/hreflang-uIBOE5yg.d.mts +0 -50
- package/dist/hreflang-uIBOE5yg.d.mts.map +0 -1
- package/dist/http-route-dispatch-DubjTibD.mjs +0 -339
- package/dist/http-route-dispatch-DubjTibD.mjs.map +0 -1
- package/dist/identity-DJ-5AcdG.mjs +0 -35
- package/dist/identity-DJ-5AcdG.mjs.map +0 -1
- package/dist/import-DEfuIgRz.mjs +0 -2020
- package/dist/import-DEfuIgRz.mjs.map +0 -1
- package/dist/index-xCy3j0f6.d.mts +0 -623
- package/dist/index-xCy3j0f6.d.mts.map +0 -1
- package/dist/init-lock-4eRRB4Le.mjs +0 -56
- package/dist/init-lock-4eRRB4Le.mjs.map +0 -1
- package/dist/install-finalization-DeGRbaVa.mjs +0 -58
- package/dist/install-finalization-DeGRbaVa.mjs.map +0 -1
- package/dist/keys-DWwMxdZh.mjs +0 -61
- package/dist/keys-DWwMxdZh.mjs.map +0 -1
- package/dist/kinds-D1A-00-F.mjs +0 -974
- package/dist/kinds-D1A-00-F.mjs.map +0 -1
- package/dist/lifecycle-BWtBGNEn.mjs +0 -25
- package/dist/lifecycle-BWtBGNEn.mjs.map +0 -1
- package/dist/load-BR1NEa_3.mjs +0 -28
- package/dist/load-BR1NEa_3.mjs.map +0 -1
- package/dist/loader-D4edocWH.mjs +0 -1197
- package/dist/loader-D4edocWH.mjs.map +0 -1
- package/dist/loops-DLaHFrvI.mjs +0 -205
- package/dist/loops-DLaHFrvI.mjs.map +0 -1
- package/dist/manifest-builder-8jsSLR7s.mjs +0 -189
- package/dist/manifest-builder-8jsSLR7s.mjs.map +0 -1
- package/dist/manifest-schema-DcZjRNEv.mjs +0 -496
- package/dist/manifest-schema-DcZjRNEv.mjs.map +0 -1
- package/dist/marketplace-CNxjq10S.mjs +0 -257
- package/dist/marketplace-CNxjq10S.mjs.map +0 -1
- package/dist/media-3v7mqAVX.mjs +0 -294
- package/dist/media-3v7mqAVX.mjs.map +0 -1
- package/dist/media-Bs6qmlVl.mjs +0 -408
- package/dist/media-Bs6qmlVl.mjs.map +0 -1
- package/dist/media-CputjGE1.mjs +0 -373
- package/dist/media-CputjGE1.mjs.map +0 -1
- package/dist/media-allowlist-isqF1gAh.mjs +0 -44
- package/dist/media-allowlist-isqF1gAh.mjs.map +0 -1
- package/dist/media-folders-D2VdVBf6.mjs +0 -210
- package/dist/media-folders-D2VdVBf6.mjs.map +0 -1
- package/dist/media-url-DbkMY3y6.mjs +0 -43
- package/dist/media-url-DbkMY3y6.mjs.map +0 -1
- package/dist/media-usage-activation-BaT4AlNI.mjs +0 -78
- package/dist/media-usage-activation-BaT4AlNI.mjs.map +0 -1
- package/dist/media-usage-v43L0kR_.mjs +0 -282
- package/dist/media-usage-v43L0kR_.mjs.map +0 -1
- package/dist/media-usage-work-CY8gIeU-.mjs +0 -151
- package/dist/media-usage-work-CY8gIeU-.mjs.map +0 -1
- package/dist/media-usage-work-VO108Q9E.mjs +0 -1015
- package/dist/media-usage-work-VO108Q9E.mjs.map +0 -1
- package/dist/menus-BYyeRemR.mjs +0 -3647
- package/dist/menus-BYyeRemR.mjs.map +0 -1
- package/dist/menus-mC_XTxD7.mjs +0 -92
- package/dist/menus-mC_XTxD7.mjs.map +0 -1
- package/dist/menus-trvc6_fW.mjs +0 -753
- package/dist/menus-trvc6_fW.mjs.map +0 -1
- package/dist/mime-IZf-LHIS.mjs +0 -36
- package/dist/mime-IZf-LHIS.mjs.map +0 -1
- package/dist/mode-B9-gMXL9.mjs +0 -23
- package/dist/mode-B9-gMXL9.mjs.map +0 -1
- package/dist/node-sqlite-compat-DztcWs4y.mjs +0 -63
- package/dist/node-sqlite-compat-DztcWs4y.mjs.map +0 -1
- package/dist/oauth-authorization-BIHy9SGU.mjs +0 -274
- package/dist/oauth-authorization-BIHy9SGU.mjs.map +0 -1
- package/dist/oauth-clients-BZWZvKXa.mjs +0 -266
- package/dist/oauth-clients-BZWZvKXa.mjs.map +0 -1
- package/dist/oauth-state-store-CxXTjXdI.mjs +0 -50
- package/dist/oauth-state-store-CxXTjXdI.mjs.map +0 -1
- package/dist/oauth-user-lookup-GWojfxRl.mjs +0 -26
- package/dist/oauth-user-lookup-GWojfxRl.mjs.map +0 -1
- package/dist/options-DRF6dlXY.d.mts +0 -81
- package/dist/options-DRF6dlXY.d.mts.map +0 -1
- package/dist/ownership-Bd77AmJz.mjs +0 -12
- package/dist/ownership-Bd77AmJz.mjs.map +0 -1
- package/dist/parse-5Y0W39xR.mjs +0 -81
- package/dist/parse-5Y0W39xR.mjs.map +0 -1
- package/dist/parse-BPblgoa-.d.mts +0 -172
- package/dist/parse-BPblgoa-.d.mts.map +0 -1
- package/dist/passkey-config-PiQ5cBnt.mjs +0 -46
- package/dist/passkey-config-PiQ5cBnt.mjs.map +0 -1
- package/dist/paths-DkS74lBM.mjs +0 -77
- package/dist/paths-DkS74lBM.mjs.map +0 -1
- package/dist/patterns-DyZJ67I7.mjs +0 -140
- package/dist/patterns-DyZJ67I7.mjs.map +0 -1
- package/dist/placeholder-Bez2282x.d.mts +0 -306
- package/dist/placeholder-Bez2282x.d.mts.map +0 -1
- package/dist/plan-Lw7iGnGD.mjs +0 -135
- package/dist/plan-Lw7iGnGD.mjs.map +0 -1
- package/dist/plugins-D7xSh1Lu.mjs +0 -277
- package/dist/plugins-D7xSh1Lu.mjs.map +0 -1
- package/dist/policy-DMRiMdLn.mjs +0 -45
- package/dist/policy-DMRiMdLn.mjs.map +0 -1
- package/dist/portable-text-kcyN3F-a.mjs +0 -307
- package/dist/portable-text-kcyN3F-a.mjs.map +0 -1
- package/dist/preview--2VDLaND.mjs +0 -107
- package/dist/preview--2VDLaND.mjs.map +0 -1
- package/dist/protocol-FvwLA8P-.d.mts +0 -61
- package/dist/protocol-FvwLA8P-.d.mts.map +0 -1
- package/dist/public-submission-BRyK76U8.mjs +0 -250
- package/dist/public-submission-BRyK76U8.mjs.map +0 -1
- package/dist/public-url-7j0cpCFc.mjs +0 -101
- package/dist/public-url-7j0cpCFc.mjs.map +0 -1
- package/dist/query-BRNTde3V.mjs +0 -41
- package/dist/query-BRNTde3V.mjs.map +0 -1
- package/dist/query-DyYYWOKk.mjs +0 -1161
- package/dist/query-DyYYWOKk.mjs.map +0 -1
- package/dist/rate-limit-D0BcE76H.mjs +0 -120
- package/dist/rate-limit-D0BcE76H.mjs.map +0 -1
- package/dist/receipt-C4icyHlC.mjs +0 -43
- package/dist/receipt-C4icyHlC.mjs.map +0 -1
- package/dist/redirect-9DbtxSNG.mjs +0 -19
- package/dist/redirect-9DbtxSNG.mjs.map +0 -1
- package/dist/redirect-BvFKh8Sz.mjs +0 -416
- package/dist/redirect-BvFKh8Sz.mjs.map +0 -1
- package/dist/redirects-1nhdEaTq.mjs +0 -148
- package/dist/redirects-1nhdEaTq.mjs.map +0 -1
- package/dist/redirects-D1yMnSR9.mjs +0 -446
- package/dist/redirects-D1yMnSR9.mjs.map +0 -1
- package/dist/registry-CzPJNu3H.mjs +0 -8366
- package/dist/registry-CzPJNu3H.mjs.map +0 -1
- package/dist/relations-C8JpSkU6.mjs +0 -776
- package/dist/relations-C8JpSkU6.mjs.map +0 -1
- package/dist/request-meta-Bs60XW1m.mjs +0 -141
- package/dist/request-meta-Bs60XW1m.mjs.map +0 -1
- package/dist/resolve-BHWgMU_X.mjs +0 -100
- package/dist/resolve-BHWgMU_X.mjs.map +0 -1
- package/dist/revision-CGkQA0e5.mjs +0 -366
- package/dist/revision-CGkQA0e5.mjs.map +0 -1
- package/dist/route-wire-ClUVQduA.mjs +0 -197
- package/dist/route-wire-ClUVQduA.mjs.map +0 -1
- package/dist/routes-D2GFl3B7.mjs +0 -272
- package/dist/routes-D2GFl3B7.mjs.map +0 -1
- package/dist/runner-CLpxmhl8.mjs +0 -6197
- package/dist/runner-CLpxmhl8.mjs.map +0 -1
- package/dist/runner-CWl76CH3.d.mts +0 -68
- package/dist/runner-CWl76CH3.d.mts.map +0 -1
- package/dist/schema-27XefSYG.mjs +0 -13
- package/dist/schema-27XefSYG.mjs.map +0 -1
- package/dist/schema-Btvj3BMh.mjs +0 -815
- package/dist/schema-Btvj3BMh.mjs.map +0 -1
- package/dist/scopes-DGCj6K4p.mjs +0 -34
- package/dist/scopes-DGCj6K4p.mjs.map +0 -1
- package/dist/search-pZRRmWjh.mjs +0 -448
- package/dist/search-pZRRmWjh.mjs.map +0 -1
- package/dist/secrets-CIi0nFiR.mjs +0 -341
- package/dist/secrets-CIi0nFiR.mjs.map +0 -1
- package/dist/sections-CIhqs3Ao.mjs +0 -346
- package/dist/sections-CIhqs3Ao.mjs.map +0 -1
- package/dist/seo-DifeiGdl.mjs +0 -114
- package/dist/seo-DifeiGdl.mjs.map +0 -1
- package/dist/seo-DpYxmGaL.mjs +0 -133
- package/dist/seo-DpYxmGaL.mjs.map +0 -1
- package/dist/service-COVdVpSK.mjs +0 -150
- package/dist/service-COVdVpSK.mjs.map +0 -1
- package/dist/session-user-C6IEjuty.mjs +0 -61
- package/dist/session-user-C6IEjuty.mjs.map +0 -1
- package/dist/settings-CwcrX-Ay.mjs +0 -61
- package/dist/settings-CwcrX-Ay.mjs.map +0 -1
- package/dist/settings-D_cJtT48.mjs +0 -439
- package/dist/settings-D_cJtT48.mjs.map +0 -1
- package/dist/settings-tnPQN3Z2.mjs +0 -51
- package/dist/settings-tnPQN3Z2.mjs.map +0 -1
- package/dist/setup-complete-BOrI10UY.mjs +0 -65
- package/dist/setup-complete-BOrI10UY.mjs.map +0 -1
- package/dist/setup-nonce-0XTBLTsX.mjs +0 -25
- package/dist/setup-nonce-0XTBLTsX.mjs.map +0 -1
- package/dist/single-flight-cache-B5O2qhO1.mjs +0 -104
- package/dist/single-flight-cache-B5O2qhO1.mjs.map +0 -1
- package/dist/site-settings-B7vGFRDT.mjs +0 -50
- package/dist/site-settings-B7vGFRDT.mjs.map +0 -1
- package/dist/site-url-wEYRMHBv.mjs +0 -16
- package/dist/site-url-wEYRMHBv.mjs.map +0 -1
- package/dist/slugify-T5GHH42D.mjs +0 -17
- package/dist/slugify-T5GHH42D.mjs.map +0 -1
- package/dist/snapshot-W36KbLmc.mjs +0 -414
- package/dist/snapshot-W36KbLmc.mjs.map +0 -1
- package/dist/ssrf-CRJ-xom5.mjs +0 -406
- package/dist/ssrf-CRJ-xom5.mjs.map +0 -1
- package/dist/stage-DA0NrTRZ.mjs +0 -662
- package/dist/stage-DA0NrTRZ.mjs.map +0 -1
- package/dist/staged-Bw5eHbKS.mjs +0 -686
- package/dist/staged-Bw5eHbKS.mjs.map +0 -1
- package/dist/state-BTlprvUF.mjs +0 -153
- package/dist/state-BTlprvUF.mjs.map +0 -1
- package/dist/status-C6IrSLMT.mjs +0 -30
- package/dist/status-C6IrSLMT.mjs.map +0 -1
- package/dist/storage-query-CdVF2bng.d.mts +0 -1614
- package/dist/storage-query-CdVF2bng.d.mts.map +0 -1
- package/dist/tar-BGOZARjy.mjs +0 -449
- package/dist/tar-BGOZARjy.mjs.map +0 -1
- package/dist/target-YhYH_0uc.mjs +0 -27
- package/dist/target-YhYH_0uc.mjs.map +0 -1
- package/dist/taxonomies-DK_XBrmT.mjs +0 -697
- package/dist/taxonomies-DK_XBrmT.mjs.map +0 -1
- package/dist/taxonomies-S1M3rUC0.mjs +0 -939
- package/dist/taxonomies-S1M3rUC0.mjs.map +0 -1
- package/dist/taxonomy-BesdHIwi.mjs +0 -525
- package/dist/taxonomy-BesdHIwi.mjs.map +0 -1
- package/dist/tokens-B_ffPF1q.mjs +0 -171
- package/dist/tokens-B_ffPF1q.mjs.map +0 -1
- package/dist/transfer-9fVSxyrV.mjs +0 -166
- package/dist/transfer-9fVSxyrV.mjs.map +0 -1
- package/dist/transfer-B7LUTaYD.mjs +0 -8855
- package/dist/transfer-B7LUTaYD.mjs.map +0 -1
- package/dist/transfer-download-BdNq4VWN.mjs +0 -33
- package/dist/transfer-download-BdNq4VWN.mjs.map +0 -1
- package/dist/transformations-BtQdvyly.mjs +0 -196
- package/dist/transformations-BtQdvyly.mjs.map +0 -1
- package/dist/transport-CriYXY1c.mjs +0 -136
- package/dist/transport-CriYXY1c.mjs.map +0 -1
- package/dist/transport-SnhS6xku.d.mts +0 -42
- package/dist/transport-SnhS6xku.d.mts.map +0 -1
- package/dist/trusted-proxy-C0eHXPd-.mjs +0 -51
- package/dist/trusted-proxy-C0eHXPd-.mjs.map +0 -1
- package/dist/turnstile-BNPrWd1e.mjs +0 -53
- package/dist/turnstile-BNPrWd1e.mjs.map +0 -1
- package/dist/types-B8sF_kE5.d.mts +0 -287
- package/dist/types-B8sF_kE5.d.mts.map +0 -1
- package/dist/types-BYVIYOlD.d.mts +0 -1720
- package/dist/types-BYVIYOlD.d.mts.map +0 -1
- package/dist/types-Bs4bi95j.d.mts +0 -374
- package/dist/types-Bs4bi95j.d.mts.map +0 -1
- package/dist/types-CGuODCZi.d.mts +0 -198
- package/dist/types-CGuODCZi.d.mts.map +0 -1
- package/dist/types-CVsmpTcU.mjs +0 -18
- package/dist/types-CVsmpTcU.mjs.map +0 -1
- package/dist/types-ClFEExxn.mjs +0 -37
- package/dist/types-ClFEExxn.mjs.map +0 -1
- package/dist/types-D994zUWB.d.mts +0 -85
- package/dist/types-D994zUWB.d.mts.map +0 -1
- package/dist/types-DAj1ByJQ.d.mts +0 -125
- package/dist/types-DAj1ByJQ.d.mts.map +0 -1
- package/dist/types-Dlv6esp4.mjs +0 -77
- package/dist/types-Dlv6esp4.mjs.map +0 -1
- package/dist/types-Dr1LVwL7.d.mts +0 -363
- package/dist/types-Dr1LVwL7.d.mts.map +0 -1
- package/dist/types-MN9bOQ1g.d.mts +0 -198
- package/dist/types-MN9bOQ1g.d.mts.map +0 -1
- package/dist/types-d2Szb1oz.mjs +0 -16
- package/dist/types-d2Szb1oz.mjs.map +0 -1
- package/dist/types-ibtP7GEA.d.mts +0 -896
- package/dist/types-ibtP7GEA.d.mts.map +0 -1
- package/dist/types-j6MBDjlZ.mjs +0 -103
- package/dist/types-j6MBDjlZ.mjs.map +0 -1
- package/dist/update-check-D8No-E5s.mjs +0 -161
- package/dist/update-check-D8No-E5s.mjs.map +0 -1
- package/dist/upload-attempts-BodUoFBu.mjs +0 -32
- package/dist/upload-attempts-BodUoFBu.mjs.map +0 -1
- package/dist/url-pattern-DGAG6ZP2.mjs +0 -41
- package/dist/url-pattern-DGAG6ZP2.mjs.map +0 -1
- package/dist/user-BOvuF1sQ.mjs +0 -171
- package/dist/user-BOvuF1sQ.mjs.map +0 -1
- package/dist/utils-Dr01wRKt.mjs +0 -439
- package/dist/utils-Dr01wRKt.mjs.map +0 -1
- package/dist/validate-BttYU7NK.mjs +0 -516
- package/dist/validate-BttYU7NK.mjs.map +0 -1
- package/dist/validate-Df09inbC.d.mts +0 -468
- package/dist/validate-Df09inbC.d.mts.map +0 -1
- package/dist/validation-DH2WRwWO.mjs +0 -219
- package/dist/validation-DH2WRwWO.mjs.map +0 -1
- package/dist/version-BbygH8CT.mjs +0 -7
- package/dist/version-BbygH8CT.mjs.map +0 -1
- package/dist/version-CseoDDOd.mjs +0 -9
- package/dist/version-CseoDDOd.mjs.map +0 -1
- package/dist/virtual-modules-82GlnQyG.mjs +0 -516
- package/dist/virtual-modules-82GlnQyG.mjs.map +0 -1
- package/dist/widgets-DMAgGcQt.mjs +0 -126
- package/dist/widgets-DMAgGcQt.mjs.map +0 -1
- package/dist/wxr-taxonomies-Bi5kFSxQ.mjs +0 -453
- package/dist/wxr-taxonomies-Bi5kFSxQ.mjs.map +0 -1
- package/dist/wxr-taxonomies-y_FpYlDn.d.mts +0 -34
- package/dist/wxr-taxonomies-y_FpYlDn.d.mts.map +0 -1
- package/dist/zod-generator-DnfG5sGQ.mjs +0 -424
- package/dist/zod-generator-DnfG5sGQ.mjs.map +0 -1
- /package/dist/{api-tokens-B4COohsb.mjs → api-tokens-D2zgAIEt.mjs} +0 -0
- /package/dist/{ssrf-sC4_5rxm.mjs → ssrf-BvNItdxk.mjs} +0 -0
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
import { a as pluginManifestSchema, o as reconcileManifestAccess } from "./manifest-schema-DcZjRNEv.mjs";
|
|
2
|
-
import { createGzipDecoder, unpackTar } from "modern-tar";
|
|
3
|
-
|
|
4
|
-
//#region src/plugins/marketplace.ts
|
|
5
|
-
/**
|
|
6
|
-
* MarketplaceClient — HTTP client for the EmDash Plugin Marketplace
|
|
7
|
-
*
|
|
8
|
-
* Used by the install/update/proxy endpoints in EmDash core to communicate
|
|
9
|
-
* with the marketplace Worker. The marketplace is a distribution channel,
|
|
10
|
-
* not a runtime dependency — bundles are copied to site-local R2 at install time.
|
|
11
|
-
*/
|
|
12
|
-
const TRAILING_SLASHES = /\/+$/;
|
|
13
|
-
const LEADING_DOT_SLASH = /^\.\//;
|
|
14
|
-
var MarketplaceError = class extends Error {
|
|
15
|
-
constructor(message, status, code) {
|
|
16
|
-
super(message);
|
|
17
|
-
this.status = status;
|
|
18
|
-
this.code = code;
|
|
19
|
-
this.name = "MarketplaceError";
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
var MarketplaceUnavailableError = class extends MarketplaceError {
|
|
23
|
-
constructor(cause) {
|
|
24
|
-
super("Plugin marketplace is unavailable", void 0, "MARKETPLACE_UNAVAILABLE");
|
|
25
|
-
if (cause) this.cause = cause;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
const MAX_REDIRECTS = 5;
|
|
29
|
-
/**
|
|
30
|
-
* Fetches a marketplace URL, following redirects only while they stay on
|
|
31
|
-
* that URL's origin. Throws a `MarketplaceError` coded
|
|
32
|
-
* `${codePrefix}_REDIRECT_UNTRUSTED` or `${codePrefix}_TOO_MANY_REDIRECTS`.
|
|
33
|
-
*/
|
|
34
|
-
async function fetchWithinOrigin(url, label, codePrefix) {
|
|
35
|
-
const origin = new URL(url).origin;
|
|
36
|
-
let currentUrl = url;
|
|
37
|
-
let response = await fetch(currentUrl, { redirect: "manual" });
|
|
38
|
-
for (let i = 0; i < MAX_REDIRECTS; i++) {
|
|
39
|
-
if (response.status < 300 || response.status >= 400) break;
|
|
40
|
-
const location = response.headers.get("location");
|
|
41
|
-
if (!location) break;
|
|
42
|
-
const target = new URL(location, currentUrl);
|
|
43
|
-
if (target.origin !== origin) throw new MarketplaceError(`${label} redirected to untrusted host: ${target.origin}`, response.status, `${codePrefix}_REDIRECT_UNTRUSTED`);
|
|
44
|
-
currentUrl = target.href;
|
|
45
|
-
response = await fetch(currentUrl, { redirect: "manual" });
|
|
46
|
-
}
|
|
47
|
-
if (response.status >= 300 && response.status < 400) throw new MarketplaceError(`${label} exceeded maximum redirects (${MAX_REDIRECTS})`, response.status, `${codePrefix}_TOO_MANY_REDIRECTS`);
|
|
48
|
-
return response;
|
|
49
|
-
}
|
|
50
|
-
var MarketplaceClientImpl = class {
|
|
51
|
-
baseUrl;
|
|
52
|
-
siteOrigin;
|
|
53
|
-
constructor(baseUrl, siteOrigin) {
|
|
54
|
-
this.baseUrl = baseUrl.replace(TRAILING_SLASHES, "");
|
|
55
|
-
this.siteOrigin = siteOrigin;
|
|
56
|
-
}
|
|
57
|
-
async search(query, opts) {
|
|
58
|
-
const params = new URLSearchParams();
|
|
59
|
-
if (query) params.set("q", query);
|
|
60
|
-
if (opts?.category) params.set("category", opts.category);
|
|
61
|
-
if (opts?.capability) params.set("capability", opts.capability);
|
|
62
|
-
if (opts?.sort) params.set("sort", opts.sort);
|
|
63
|
-
if (opts?.cursor) params.set("cursor", opts.cursor);
|
|
64
|
-
if (opts?.limit) params.set("limit", String(opts.limit));
|
|
65
|
-
const qs = params.toString();
|
|
66
|
-
const url = `${this.baseUrl}/api/v1/plugins${qs ? `?${qs}` : ""}`;
|
|
67
|
-
return await this.fetchJson(url);
|
|
68
|
-
}
|
|
69
|
-
async getPlugin(id) {
|
|
70
|
-
const url = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}`;
|
|
71
|
-
return this.fetchJson(url);
|
|
72
|
-
}
|
|
73
|
-
async getVersions(id) {
|
|
74
|
-
const url = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}/versions`;
|
|
75
|
-
return (await this.fetchJson(url)).items;
|
|
76
|
-
}
|
|
77
|
-
async downloadBundle(id, version) {
|
|
78
|
-
const bundleUrl = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}/versions/${encodeURIComponent(version)}/bundle`;
|
|
79
|
-
let response;
|
|
80
|
-
try {
|
|
81
|
-
response = await fetchWithinOrigin(bundleUrl, "Bundle download", "BUNDLE");
|
|
82
|
-
} catch (err) {
|
|
83
|
-
if (err instanceof MarketplaceError) throw err;
|
|
84
|
-
throw new MarketplaceUnavailableError(err);
|
|
85
|
-
}
|
|
86
|
-
if (!response.ok) throw new MarketplaceError(`Failed to download bundle: ${response.status} ${response.statusText}`, response.status, "BUNDLE_DOWNLOAD_FAILED");
|
|
87
|
-
const tarballBytes = new Uint8Array(await response.arrayBuffer());
|
|
88
|
-
try {
|
|
89
|
-
return await extractBundle(tarballBytes);
|
|
90
|
-
} catch (err) {
|
|
91
|
-
if (err instanceof MarketplaceError) throw err;
|
|
92
|
-
throw new MarketplaceError("Failed to extract plugin bundle", void 0, "BUNDLE_EXTRACT_FAILED");
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
async reportInstall(id, version) {
|
|
96
|
-
const siteHash = await generateSiteHash(this.siteOrigin);
|
|
97
|
-
const url = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}/installs`;
|
|
98
|
-
try {
|
|
99
|
-
await fetch(url, {
|
|
100
|
-
method: "POST",
|
|
101
|
-
headers: { "Content-Type": "application/json" },
|
|
102
|
-
body: JSON.stringify({
|
|
103
|
-
siteHash,
|
|
104
|
-
version
|
|
105
|
-
})
|
|
106
|
-
});
|
|
107
|
-
} catch {}
|
|
108
|
-
}
|
|
109
|
-
async searchThemes(query, opts) {
|
|
110
|
-
const params = new URLSearchParams();
|
|
111
|
-
if (query) params.set("q", query);
|
|
112
|
-
if (opts?.keyword) params.set("keyword", opts.keyword);
|
|
113
|
-
if (opts?.sort) params.set("sort", opts.sort);
|
|
114
|
-
if (opts?.cursor) params.set("cursor", opts.cursor);
|
|
115
|
-
if (opts?.limit) params.set("limit", String(opts.limit));
|
|
116
|
-
const qs = params.toString();
|
|
117
|
-
const url = `${this.baseUrl}/api/v1/themes${qs ? `?${qs}` : ""}`;
|
|
118
|
-
return this.fetchJson(url);
|
|
119
|
-
}
|
|
120
|
-
async getTheme(id) {
|
|
121
|
-
const url = `${this.baseUrl}/api/v1/themes/${encodeURIComponent(id)}`;
|
|
122
|
-
return this.fetchJson(url);
|
|
123
|
-
}
|
|
124
|
-
async fetchJson(url) {
|
|
125
|
-
let response;
|
|
126
|
-
try {
|
|
127
|
-
response = await fetch(url, { headers: { Accept: "application/json" } });
|
|
128
|
-
} catch (err) {
|
|
129
|
-
throw new MarketplaceUnavailableError(err);
|
|
130
|
-
}
|
|
131
|
-
if (!response.ok) {
|
|
132
|
-
let errorMessage = `Marketplace request failed: ${response.status}`;
|
|
133
|
-
try {
|
|
134
|
-
const body = await response.json();
|
|
135
|
-
if (body.error) errorMessage = body.error;
|
|
136
|
-
} catch {}
|
|
137
|
-
throw new MarketplaceError(errorMessage, response.status);
|
|
138
|
-
}
|
|
139
|
-
return await response.json();
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
/**
|
|
143
|
-
* Extract manifest + code files from a tarball.
|
|
144
|
-
*
|
|
145
|
-
* The tarball is a gzipped tar archive containing:
|
|
146
|
-
* - manifest.json
|
|
147
|
-
* - backend.js
|
|
148
|
-
* - admin.js (optional)
|
|
149
|
-
*
|
|
150
|
-
* We use a minimal tar parser since we only need to read a few small files.
|
|
151
|
-
*/
|
|
152
|
-
/**
|
|
153
|
-
* Exported so the experimental registry install handler can reuse the
|
|
154
|
-
* same parse / validate / hash primitive. Despite the file name, this
|
|
155
|
-
* function predates the marketplace-vs-registry split and is generic
|
|
156
|
-
* over plugin bundle tarballs regardless of distribution channel.
|
|
157
|
-
*/
|
|
158
|
-
const MAX_DECOMPRESSED_BUNDLE_BYTES = 256 * 1024;
|
|
159
|
-
const MAX_BUNDLE_TAR_ENTRIES = 32;
|
|
160
|
-
async function extractBundle(tarballBytes) {
|
|
161
|
-
const reader = new ReadableStream({ start(controller) {
|
|
162
|
-
controller.enqueue(tarballBytes);
|
|
163
|
-
controller.close();
|
|
164
|
-
} }).pipeThrough(createGzipDecoder()).getReader();
|
|
165
|
-
const chunks = [];
|
|
166
|
-
let total = 0;
|
|
167
|
-
while (true) {
|
|
168
|
-
const { done, value } = await reader.read();
|
|
169
|
-
if (done) break;
|
|
170
|
-
if (!value) continue;
|
|
171
|
-
total += value.byteLength;
|
|
172
|
-
if (total > MAX_DECOMPRESSED_BUNDLE_BYTES) {
|
|
173
|
-
try {
|
|
174
|
-
await reader.cancel();
|
|
175
|
-
} catch {}
|
|
176
|
-
throw new MarketplaceError(`Bundle decompressed size exceeds limit (${MAX_DECOMPRESSED_BUNDLE_BYTES} bytes)`, void 0, "INVALID_BUNDLE");
|
|
177
|
-
}
|
|
178
|
-
chunks.push(value);
|
|
179
|
-
}
|
|
180
|
-
const decompressedBytes = new Uint8Array(total);
|
|
181
|
-
{
|
|
182
|
-
let offset = 0;
|
|
183
|
-
for (const chunk of chunks) {
|
|
184
|
-
decompressedBytes.set(chunk, offset);
|
|
185
|
-
offset += chunk.byteLength;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
const entries = await unpackTar(new ReadableStream({ start(controller) {
|
|
189
|
-
controller.enqueue(decompressedBytes);
|
|
190
|
-
controller.close();
|
|
191
|
-
} }));
|
|
192
|
-
if (entries.length > MAX_BUNDLE_TAR_ENTRIES) throw new MarketplaceError(`Bundle has too many tar entries (${entries.length} > ${MAX_BUNDLE_TAR_ENTRIES})`, void 0, "INVALID_BUNDLE");
|
|
193
|
-
const decoder = new TextDecoder();
|
|
194
|
-
const files = /* @__PURE__ */ new Map();
|
|
195
|
-
for (const entry of entries) if (entry.data && entry.header.type === "file") {
|
|
196
|
-
const name = entry.header.name.replace(LEADING_DOT_SLASH, "");
|
|
197
|
-
files.set(name, decoder.decode(entry.data));
|
|
198
|
-
}
|
|
199
|
-
const manifestJson = files.get("manifest.json");
|
|
200
|
-
const backendCode = files.get("backend.js");
|
|
201
|
-
if (!manifestJson) throw new MarketplaceError("Invalid bundle: missing manifest.json", void 0, "INVALID_BUNDLE");
|
|
202
|
-
if (!backendCode) throw new MarketplaceError("Invalid bundle: missing backend.js", void 0, "INVALID_BUNDLE");
|
|
203
|
-
let manifest;
|
|
204
|
-
try {
|
|
205
|
-
const parsed = JSON.parse(manifestJson);
|
|
206
|
-
const result = pluginManifestSchema.safeParse(parsed);
|
|
207
|
-
if (!result.success) throw new MarketplaceError("Invalid bundle: manifest.json failed validation", void 0, "INVALID_BUNDLE");
|
|
208
|
-
manifest = reconcileManifestAccess(result.data);
|
|
209
|
-
} catch (err) {
|
|
210
|
-
if (err instanceof MarketplaceError) throw err;
|
|
211
|
-
throw new MarketplaceError("Invalid bundle: malformed manifest.json", void 0, "INVALID_BUNDLE");
|
|
212
|
-
}
|
|
213
|
-
const hashBuffer = await crypto.subtle.digest("SHA-256", tarballBytes);
|
|
214
|
-
const hashArray = new Uint8Array(hashBuffer);
|
|
215
|
-
const checksum = Array.from(hashArray, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
216
|
-
return {
|
|
217
|
-
manifest,
|
|
218
|
-
backendCode,
|
|
219
|
-
adminCode: files.get("admin.js"),
|
|
220
|
-
checksum
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Generate a stable non-identifying site hash from the site origin.
|
|
225
|
-
* The same origin always produces the same hash, so the marketplace
|
|
226
|
-
* installs table deduplicates correctly per (plugin_id, site_hash).
|
|
227
|
-
*/
|
|
228
|
-
async function generateSiteHash(siteOrigin) {
|
|
229
|
-
const seed = siteOrigin ? `emdash-site:${siteOrigin}` : `emdash-anonymous`;
|
|
230
|
-
try {
|
|
231
|
-
const hash = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(seed));
|
|
232
|
-
const arr = new Uint8Array(hash);
|
|
233
|
-
return Array.from(arr.slice(0, 8), (b) => b.toString(16).padStart(2, "0")).join("");
|
|
234
|
-
} catch {
|
|
235
|
-
let h = 2166136261;
|
|
236
|
-
for (let i = 0; i < seed.length; i++) {
|
|
237
|
-
h ^= seed.charCodeAt(i);
|
|
238
|
-
h = Math.imul(h, 16777619);
|
|
239
|
-
}
|
|
240
|
-
const h2 = h ^ h >>> 16;
|
|
241
|
-
return (h >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0");
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Create a MarketplaceClient for the given marketplace URL.
|
|
246
|
-
*
|
|
247
|
-
* @param baseUrl - The marketplace API base URL (e.g. "https://marketplace.emdashcms.com")
|
|
248
|
-
* @param siteOrigin - The origin of the EmDash site (e.g. "https://myblog.example.com").
|
|
249
|
-
* Used to generate a stable, non-identifying site hash for install deduplication.
|
|
250
|
-
*/
|
|
251
|
-
function createMarketplaceClient(baseUrl, siteOrigin) {
|
|
252
|
-
return new MarketplaceClientImpl(baseUrl, siteOrigin);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
//#endregion
|
|
256
|
-
export { fetchWithinOrigin as i, MarketplaceUnavailableError as n, createMarketplaceClient as r, MarketplaceError as t };
|
|
257
|
-
//# sourceMappingURL=marketplace-CNxjq10S.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace-CNxjq10S.mjs","names":[],"sources":["../src/plugins/marketplace.ts"],"sourcesContent":["/**\n * MarketplaceClient — HTTP client for the EmDash Plugin Marketplace\n *\n * Used by the install/update/proxy endpoints in EmDash core to communicate\n * with the marketplace Worker. The marketplace is a distribution channel,\n * not a runtime dependency — bundles are copied to site-local R2 at install time.\n */\n\nimport { createGzipDecoder, unpackTar } from \"modern-tar\";\n\nimport { pluginManifestSchema, reconcileManifestAccess } from \"./manifest-schema.js\";\nimport type { PluginManifest } from \"./types.js\";\n\n// ── Module-level regex patterns ───────────────────────────────────\n\nconst TRAILING_SLASHES = /\\/+$/;\nconst LEADING_DOT_SLASH = /^\\.\\//;\n\n// ── Types ──────────────────────────────────────────────────────────\n\nexport interface MarketplacePluginSummary {\n\tid: string;\n\tname: string;\n\tdescription: string | null;\n\tauthor: {\n\t\tname: string;\n\t\tverified: boolean;\n\t\tavatarUrl: string | null;\n\t};\n\tcapabilities: string[];\n\tkeywords: string[];\n\tinstallCount: number;\n\thasIcon: boolean;\n\ticonUrl: string;\n\tlatestVersion?: {\n\t\tversion: string;\n\t\taudit?: {\n\t\t\tverdict: string;\n\t\t\triskScore: number;\n\t\t};\n\t\timageAudit?: {\n\t\t\tverdict: string;\n\t\t};\n\t};\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface MarketplaceVersionSummary {\n\tversion: string;\n\tminEmDashVersion: string | null;\n\tbundleSize: number;\n\tchecksum: string;\n\tchangelog: string | null;\n\tcapabilities: string[];\n\tstatus: string;\n\tauditVerdict: string | null;\n\timageAuditVerdict: string | null;\n\tpublishedAt: string;\n}\n\nexport interface MarketplacePluginDetail extends MarketplacePluginSummary {\n\trepositoryUrl: string | null;\n\thomepageUrl: string | null;\n\tlicense: string | null;\n\tlatestVersion?: {\n\t\tversion: string;\n\t\tminEmDashVersion: string | null;\n\t\tbundleSize: number;\n\t\tchecksum: string;\n\t\tchangelog: string | null;\n\t\treadme: string | null;\n\t\thasIcon: boolean;\n\t\tscreenshotCount: number;\n\t\tscreenshotUrls: string[];\n\t\tcapabilities: string[];\n\t\tstatus: string;\n\t\taudit?: {\n\t\t\tverdict: string;\n\t\t\triskScore: number;\n\t\t};\n\t\timageAudit?: {\n\t\t\tverdict: string;\n\t\t};\n\t\tpublishedAt: string;\n\t};\n}\n\nexport interface MarketplaceSearchOpts {\n\tcategory?: string;\n\tcapability?: string;\n\tsort?: \"installs\" | \"updated\" | \"created\" | \"name\";\n\tcursor?: string;\n\tlimit?: number;\n}\n\nexport interface MarketplaceSearchResult {\n\titems: MarketplacePluginSummary[];\n\tnextCursor?: string;\n}\n\n// ── Theme types ───────────────────────────────────────────────────\n\nexport interface MarketplaceThemeSummary {\n\tid: string;\n\tname: string;\n\tdescription: string | null;\n\tauthor: {\n\t\tname: string;\n\t\tverified: boolean;\n\t\tavatarUrl: string | null;\n\t};\n\tkeywords: string[];\n\tpreviewUrl: string;\n\tdemoUrl: string | null;\n\thasThumbnail: boolean;\n\tthumbnailUrl: string | null;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface MarketplaceThemeDetail extends MarketplaceThemeSummary {\n\tauthor: {\n\t\tid: string;\n\t\tname: string;\n\t\tverified: boolean;\n\t\tavatarUrl: string | null;\n\t};\n\trepositoryUrl: string | null;\n\thomepageUrl: string | null;\n\tlicense: string | null;\n\tscreenshotCount: number;\n\tscreenshotUrls: string[];\n}\n\nexport interface MarketplaceThemeSearchOpts {\n\tkeyword?: string;\n\tsort?: \"name\" | \"created\" | \"updated\";\n\tcursor?: string;\n\tlimit?: number;\n}\n\nexport interface MarketplaceThemeSearchResult {\n\titems: MarketplaceThemeSummary[];\n\tnextCursor?: string;\n}\n\nexport interface PluginBundle {\n\tmanifest: PluginManifest;\n\tbackendCode: string;\n\tadminCode?: string;\n\tchecksum: string;\n}\n\n// ── Interface ──────────────────────────────────────────────────────\n\nexport interface MarketplaceClient {\n\t/** Search the marketplace catalog */\n\tsearch(query?: string, opts?: MarketplaceSearchOpts): Promise<MarketplaceSearchResult>;\n\n\t/** Get full plugin detail */\n\tgetPlugin(id: string): Promise<MarketplacePluginDetail>;\n\n\t/** Get version history for a plugin */\n\tgetVersions(id: string): Promise<MarketplaceVersionSummary[]>;\n\n\t/** Download and extract a plugin bundle */\n\tdownloadBundle(id: string, version: string): Promise<PluginBundle>;\n\n\t/** Fire-and-forget install stat (never throws) */\n\treportInstall(id: string, version: string): Promise<void>;\n\n\t/** Search theme listings */\n\tsearchThemes(\n\t\tquery?: string,\n\t\topts?: MarketplaceThemeSearchOpts,\n\t): Promise<MarketplaceThemeSearchResult>;\n\n\t/** Get full theme detail */\n\tgetTheme(id: string): Promise<MarketplaceThemeDetail>;\n}\n\n// ── Errors ─────────────────────────────────────────────────────────\n\nexport class MarketplaceError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status?: number,\n\t\tpublic readonly code?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"MarketplaceError\";\n\t}\n}\n\nexport class MarketplaceUnavailableError extends MarketplaceError {\n\tconstructor(cause?: unknown) {\n\t\tsuper(\"Plugin marketplace is unavailable\", undefined, \"MARKETPLACE_UNAVAILABLE\");\n\t\tif (cause) this.cause = cause;\n\t}\n}\n\nconst MAX_REDIRECTS = 5;\n\n/**\n * Fetches a marketplace URL, following redirects only while they stay on\n * that URL's origin. Throws a `MarketplaceError` coded\n * `${codePrefix}_REDIRECT_UNTRUSTED` or `${codePrefix}_TOO_MANY_REDIRECTS`.\n */\nexport async function fetchWithinOrigin(\n\turl: string,\n\tlabel: string,\n\tcodePrefix: string,\n): Promise<Response> {\n\tconst origin = new URL(url).origin;\n\tlet currentUrl = url;\n\tlet response = await fetch(currentUrl, { redirect: \"manual\" });\n\n\tfor (let i = 0; i < MAX_REDIRECTS; i++) {\n\t\tif (response.status < 300 || response.status >= 400) break;\n\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location) break;\n\n\t\tconst target = new URL(location, currentUrl);\n\t\tif (target.origin !== origin) {\n\t\t\tthrow new MarketplaceError(\n\t\t\t\t`${label} redirected to untrusted host: ${target.origin}`,\n\t\t\t\tresponse.status,\n\t\t\t\t`${codePrefix}_REDIRECT_UNTRUSTED`,\n\t\t\t);\n\t\t}\n\t\tcurrentUrl = target.href;\n\t\tresponse = await fetch(currentUrl, { redirect: \"manual\" });\n\t}\n\n\tif (response.status >= 300 && response.status < 400) {\n\t\tthrow new MarketplaceError(\n\t\t\t`${label} exceeded maximum redirects (${MAX_REDIRECTS})`,\n\t\t\tresponse.status,\n\t\t\t`${codePrefix}_TOO_MANY_REDIRECTS`,\n\t\t);\n\t}\n\treturn response;\n}\n\n// ── Implementation ─────────────────────────────────────────────────\n\nclass MarketplaceClientImpl implements MarketplaceClient {\n\tprivate readonly baseUrl: string;\n\tprivate readonly siteOrigin: string | undefined;\n\n\tconstructor(baseUrl: string, siteOrigin?: string) {\n\t\t// Strip trailing slash\n\t\tthis.baseUrl = baseUrl.replace(TRAILING_SLASHES, \"\");\n\t\tthis.siteOrigin = siteOrigin;\n\t}\n\n\tasync search(query?: string, opts?: MarketplaceSearchOpts): Promise<MarketplaceSearchResult> {\n\t\tconst params = new URLSearchParams();\n\t\tif (query) params.set(\"q\", query);\n\t\tif (opts?.category) params.set(\"category\", opts.category);\n\t\tif (opts?.capability) params.set(\"capability\", opts.capability);\n\t\tif (opts?.sort) params.set(\"sort\", opts.sort);\n\t\tif (opts?.cursor) params.set(\"cursor\", opts.cursor);\n\t\tif (opts?.limit) params.set(\"limit\", String(opts.limit));\n\n\t\tconst qs = params.toString();\n\t\tconst url = `${this.baseUrl}/api/v1/plugins${qs ? `?${qs}` : \"\"}`;\n\t\tconst data = await this.fetchJson<MarketplaceSearchResult>(url);\n\t\treturn data;\n\t}\n\n\tasync getPlugin(id: string): Promise<MarketplacePluginDetail> {\n\t\tconst url = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}`;\n\t\treturn this.fetchJson<MarketplacePluginDetail>(url);\n\t}\n\n\tasync getVersions(id: string): Promise<MarketplaceVersionSummary[]> {\n\t\tconst url = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}/versions`;\n\t\tconst data = await this.fetchJson<{ items: MarketplaceVersionSummary[] }>(url);\n\t\treturn data.items;\n\t}\n\n\tasync downloadBundle(id: string, version: string): Promise<PluginBundle> {\n\t\tconst bundleUrl = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}/versions/${encodeURIComponent(version)}/bundle`;\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await fetchWithinOrigin(bundleUrl, \"Bundle download\", \"BUNDLE\");\n\t\t} catch (err) {\n\t\t\tif (err instanceof MarketplaceError) throw err;\n\t\t\tthrow new MarketplaceUnavailableError(err);\n\t\t}\n\n\t\tif (!response.ok) {\n\t\t\tthrow new MarketplaceError(\n\t\t\t\t`Failed to download bundle: ${response.status} ${response.statusText}`,\n\t\t\t\tresponse.status,\n\t\t\t\t\"BUNDLE_DOWNLOAD_FAILED\",\n\t\t\t);\n\t\t}\n\n\t\tconst tarballBytes = new Uint8Array(await response.arrayBuffer());\n\t\ttry {\n\t\t\treturn await extractBundle(tarballBytes);\n\t\t} catch (err) {\n\t\t\tif (err instanceof MarketplaceError) throw err;\n\t\t\tthrow new MarketplaceError(\n\t\t\t\t\"Failed to extract plugin bundle\",\n\t\t\t\tundefined,\n\t\t\t\t\"BUNDLE_EXTRACT_FAILED\",\n\t\t\t);\n\t\t}\n\t}\n\n\tasync reportInstall(id: string, version: string): Promise<void> {\n\t\t// Generate a stable site hash from the site origin (best-effort, non-identifying)\n\t\tconst siteHash = await generateSiteHash(this.siteOrigin);\n\t\tconst url = `${this.baseUrl}/api/v1/plugins/${encodeURIComponent(id)}/installs`;\n\n\t\ttry {\n\t\t\tawait fetch(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({ siteHash, version }),\n\t\t\t});\n\t\t} catch {\n\t\t\t// Fire-and-forget — never throw\n\t\t}\n\t}\n\n\tasync searchThemes(\n\t\tquery?: string,\n\t\topts?: MarketplaceThemeSearchOpts,\n\t): Promise<MarketplaceThemeSearchResult> {\n\t\tconst params = new URLSearchParams();\n\t\tif (query) params.set(\"q\", query);\n\t\tif (opts?.keyword) params.set(\"keyword\", opts.keyword);\n\t\tif (opts?.sort) params.set(\"sort\", opts.sort);\n\t\tif (opts?.cursor) params.set(\"cursor\", opts.cursor);\n\t\tif (opts?.limit) params.set(\"limit\", String(opts.limit));\n\n\t\tconst qs = params.toString();\n\t\tconst url = `${this.baseUrl}/api/v1/themes${qs ? `?${qs}` : \"\"}`;\n\t\treturn this.fetchJson<MarketplaceThemeSearchResult>(url);\n\t}\n\n\tasync getTheme(id: string): Promise<MarketplaceThemeDetail> {\n\t\tconst url = `${this.baseUrl}/api/v1/themes/${encodeURIComponent(id)}`;\n\t\treturn this.fetchJson<MarketplaceThemeDetail>(url);\n\t}\n\n\tprivate async fetchJson<T>(url: string): Promise<T> {\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await fetch(url, {\n\t\t\t\theaders: { Accept: \"application/json\" },\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthrow new MarketplaceUnavailableError(err);\n\t\t}\n\n\t\tif (!response.ok) {\n\t\t\tlet errorMessage = `Marketplace request failed: ${response.status}`;\n\t\t\ttry {\n\t\t\t\tconst body: { error?: string } = await response.json();\n\t\t\t\tif (body.error) errorMessage = body.error;\n\t\t\t} catch {\n\t\t\t\t// use default message\n\t\t\t}\n\t\t\tthrow new MarketplaceError(errorMessage, response.status);\n\t\t}\n\n\t\tconst data: T = await response.json();\n\t\treturn data;\n\t}\n}\n\n// ── Bundle extraction ──────────────────────────────────────────────\n\n/**\n * Extract manifest + code files from a tarball.\n *\n * The tarball is a gzipped tar archive containing:\n * - manifest.json\n * - backend.js\n * - admin.js (optional)\n *\n * We use a minimal tar parser since we only need to read a few small files.\n */\n/**\n * Exported so the experimental registry install handler can reuse the\n * same parse / validate / hash primitive. Despite the file name, this\n * function predates the marketplace-vs-registry split and is generic\n * over plugin bundle tarballs regardless of distribution channel.\n */\n// Aligns with RFC 0001 §\"Bundle size limits\" (256 KiB decompressed,\n// 20 files). Matches `MAX_BUNDLE_SIZE` in @emdash-cms/plugin-cli. We\n// don't import that constant to keep this runtime module independent\n// of the authoring CLI; the two values must stay in sync.\n//\n// Tar adds per-file headers (~512 bytes each) plus directory entries,\n// so the entry count cap is set comfortably above RFC's 20-file limit.\n// Going over either is a strong signal the bundle isn't a legitimate\n// sandboxed plugin.\nconst MAX_DECOMPRESSED_BUNDLE_BYTES = 256 * 1024;\nconst MAX_BUNDLE_TAR_ENTRIES = 32;\n\nexport async function extractBundle(tarballBytes: Uint8Array): Promise<PluginBundle> {\n\t// Decompress fully into memory first, then parse the tar.\n\t// Passing a pipeThrough() stream directly to unpackTar causes a backpressure\n\t// deadlock in workerd: the tar decoder's body-stream pull() needs more\n\t// decompressed data, but the upstream pipe is stalled waiting for the\n\t// decoder's writable side to drain — a circular dependency.\n\tconst decompressedStream = new ReadableStream<Uint8Array>({\n\t\tstart(controller) {\n\t\t\tcontroller.enqueue(tarballBytes);\n\t\t\tcontroller.close();\n\t\t},\n\t}).pipeThrough(createGzipDecoder());\n\n\t// Collect decompressed bytes with a hard cap. A gzip-bomb -- a small\n\t// tarball that decompresses to gigabytes -- otherwise exhausts\n\t// worker / Node memory before we know to reject it. The cap matches\n\t// RFC 0001's publish-time bundle size limit (MAX_DECOMPRESSED_BUNDLE_BYTES);\n\t// anything past that isn't a legitimate sandboxed plugin.\n\tconst reader = decompressedStream.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) break;\n\t\tif (!value) continue;\n\t\ttotal += value.byteLength;\n\t\tif (total > MAX_DECOMPRESSED_BUNDLE_BYTES) {\n\t\t\ttry {\n\t\t\t\tawait reader.cancel();\n\t\t\t} catch {\n\t\t\t\t// nothing to do\n\t\t\t}\n\t\t\tthrow new MarketplaceError(\n\t\t\t\t`Bundle decompressed size exceeds limit (${MAX_DECOMPRESSED_BUNDLE_BYTES} bytes)`,\n\t\t\t\tundefined,\n\t\t\t\t\"INVALID_BUNDLE\",\n\t\t\t);\n\t\t}\n\t\tchunks.push(value);\n\t}\n\tconst decompressedBytes = new Uint8Array(total);\n\t{\n\t\tlet offset = 0;\n\t\tfor (const chunk of chunks) {\n\t\t\tdecompressedBytes.set(chunk, offset);\n\t\t\toffset += chunk.byteLength;\n\t\t}\n\t}\n\n\tconst decompressed = new ReadableStream<Uint8Array>({\n\t\tstart(controller) {\n\t\t\tcontroller.enqueue(decompressedBytes);\n\t\t\tcontroller.close();\n\t\t},\n\t});\n\n\tconst entries = await unpackTar(decompressed);\n\tif (entries.length > MAX_BUNDLE_TAR_ENTRIES) {\n\t\tthrow new MarketplaceError(\n\t\t\t`Bundle has too many tar entries (${entries.length} > ${MAX_BUNDLE_TAR_ENTRIES})`,\n\t\t\tundefined,\n\t\t\t\"INVALID_BUNDLE\",\n\t\t);\n\t}\n\n\tconst decoder = new TextDecoder();\n\tconst files = new Map<string, string>();\n\tfor (const entry of entries) {\n\t\tif (entry.data && entry.header.type === \"file\") {\n\t\t\t// Strip leading ./ prefix that tar tools commonly add\n\t\t\tconst name = entry.header.name.replace(LEADING_DOT_SLASH, \"\");\n\t\t\tfiles.set(name, decoder.decode(entry.data));\n\t\t}\n\t}\n\n\tconst manifestJson = files.get(\"manifest.json\");\n\tconst backendCode = files.get(\"backend.js\");\n\n\tif (!manifestJson) {\n\t\tthrow new MarketplaceError(\n\t\t\t\"Invalid bundle: missing manifest.json\",\n\t\t\tundefined,\n\t\t\t\"INVALID_BUNDLE\",\n\t\t);\n\t}\n\tif (!backendCode) {\n\t\tthrow new MarketplaceError(\"Invalid bundle: missing backend.js\", undefined, \"INVALID_BUNDLE\");\n\t}\n\n\tlet manifest: PluginManifest;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(manifestJson);\n\t\tconst result = pluginManifestSchema.safeParse(parsed);\n\t\tif (!result.success) {\n\t\t\tthrow new MarketplaceError(\n\t\t\t\t\"Invalid bundle: manifest.json failed validation\",\n\t\t\t\tundefined,\n\t\t\t\t\"INVALID_BUNDLE\",\n\t\t\t);\n\t\t}\n\t\tmanifest = reconcileManifestAccess(result.data);\n\t} catch (err) {\n\t\tif (err instanceof MarketplaceError) throw err;\n\t\tthrow new MarketplaceError(\n\t\t\t\"Invalid bundle: malformed manifest.json\",\n\t\t\tundefined,\n\t\t\t\"INVALID_BUNDLE\",\n\t\t);\n\t}\n\n\t// Compute SHA-256 checksum of the tarball for verification\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Uint8Array is a valid BufferSource at runtime; TS lib mismatch\n\tconst hashBuffer = await crypto.subtle.digest(\"SHA-256\", tarballBytes as unknown as BufferSource);\n\tconst hashArray = new Uint8Array(hashBuffer);\n\tconst checksum = Array.from(hashArray, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n\treturn {\n\t\tmanifest,\n\t\tbackendCode,\n\t\tadminCode: files.get(\"admin.js\"),\n\t\tchecksum,\n\t};\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\n/**\n * Generate a stable non-identifying site hash from the site origin.\n * The same origin always produces the same hash, so the marketplace\n * installs table deduplicates correctly per (plugin_id, site_hash).\n */\nasync function generateSiteHash(siteOrigin?: string): Promise<string> {\n\tconst seed = siteOrigin ? `emdash-site:${siteOrigin}` : `emdash-anonymous`;\n\ttry {\n\t\tconst hash = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(seed));\n\t\tconst arr = new Uint8Array(hash);\n\t\treturn Array.from(arr.slice(0, 8), (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\t} catch {\n\t\t// Fallback for environments without crypto.subtle: FNV-1a hash encoded as hex.\n\t\t// Deterministic, uniform distribution, no origin leakage.\n\t\tlet h = 0x811c9dc5;\n\t\tfor (let i = 0; i < seed.length; i++) {\n\t\t\th ^= seed.charCodeAt(i);\n\t\t\th = Math.imul(h, 0x01000193);\n\t\t}\n\t\tconst h2 = h ^ (h >>> 16);\n\t\treturn (h >>> 0).toString(16).padStart(8, \"0\") + (h2 >>> 0).toString(16).padStart(8, \"0\");\n\t}\n}\n\n// ── Factory ────────────────────────────────────────────────────────\n\n/**\n * Create a MarketplaceClient for the given marketplace URL.\n *\n * @param baseUrl - The marketplace API base URL (e.g. \"https://marketplace.emdashcms.com\")\n * @param siteOrigin - The origin of the EmDash site (e.g. \"https://myblog.example.com\").\n * Used to generate a stable, non-identifying site hash for install deduplication.\n */\nexport function createMarketplaceClient(baseUrl: string, siteOrigin?: string): MarketplaceClient {\n\treturn new MarketplaceClientImpl(baseUrl, siteOrigin);\n}\n"],"mappings":";;;;;;;;;;;AAeA,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAwK1B,IAAa,mBAAb,cAAsC,MAAM;CAC3C,YACC,SACA,AAAgB,QAChB,AAAgB,MACf;AACD,QAAM,QAAQ;EAHE;EACA;AAGhB,OAAK,OAAO;;;AAId,IAAa,8BAAb,cAAiD,iBAAiB;CACjE,YAAY,OAAiB;AAC5B,QAAM,qCAAqC,QAAW,0BAA0B;AAChF,MAAI,MAAO,MAAK,QAAQ;;;AAI1B,MAAM,gBAAgB;;;;;;AAOtB,eAAsB,kBACrB,KACA,OACA,YACoB;CACpB,MAAM,SAAS,IAAI,IAAI,IAAI,CAAC;CAC5B,IAAI,aAAa;CACjB,IAAI,WAAW,MAAM,MAAM,YAAY,EAAE,UAAU,UAAU,CAAC;AAE9D,MAAK,IAAI,IAAI,GAAG,IAAI,eAAe,KAAK;AACvC,MAAI,SAAS,SAAS,OAAO,SAAS,UAAU,IAAK;EAErD,MAAM,WAAW,SAAS,QAAQ,IAAI,WAAW;AACjD,MAAI,CAAC,SAAU;EAEf,MAAM,SAAS,IAAI,IAAI,UAAU,WAAW;AAC5C,MAAI,OAAO,WAAW,OACrB,OAAM,IAAI,iBACT,GAAG,MAAM,iCAAiC,OAAO,UACjD,SAAS,QACT,GAAG,WAAW,qBACd;AAEF,eAAa,OAAO;AACpB,aAAW,MAAM,MAAM,YAAY,EAAE,UAAU,UAAU,CAAC;;AAG3D,KAAI,SAAS,UAAU,OAAO,SAAS,SAAS,IAC/C,OAAM,IAAI,iBACT,GAAG,MAAM,+BAA+B,cAAc,IACtD,SAAS,QACT,GAAG,WAAW,qBACd;AAEF,QAAO;;AAKR,IAAM,wBAAN,MAAyD;CACxD,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAAiB,YAAqB;AAEjD,OAAK,UAAU,QAAQ,QAAQ,kBAAkB,GAAG;AACpD,OAAK,aAAa;;CAGnB,MAAM,OAAO,OAAgB,MAAgE;EAC5F,MAAM,SAAS,IAAI,iBAAiB;AACpC,MAAI,MAAO,QAAO,IAAI,KAAK,MAAM;AACjC,MAAI,MAAM,SAAU,QAAO,IAAI,YAAY,KAAK,SAAS;AACzD,MAAI,MAAM,WAAY,QAAO,IAAI,cAAc,KAAK,WAAW;AAC/D,MAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,KAAK,KAAK;AAC7C,MAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,OAAO;AACnD,MAAI,MAAM,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,MAAM,CAAC;EAExD,MAAM,KAAK,OAAO,UAAU;EAC5B,MAAM,MAAM,GAAG,KAAK,QAAQ,iBAAiB,KAAK,IAAI,OAAO;AAE7D,SADa,MAAM,KAAK,UAAmC,IAAI;;CAIhE,MAAM,UAAU,IAA8C;EAC7D,MAAM,MAAM,GAAG,KAAK,QAAQ,kBAAkB,mBAAmB,GAAG;AACpE,SAAO,KAAK,UAAmC,IAAI;;CAGpD,MAAM,YAAY,IAAkD;EACnE,MAAM,MAAM,GAAG,KAAK,QAAQ,kBAAkB,mBAAmB,GAAG,CAAC;AAErE,UADa,MAAM,KAAK,UAAkD,IAAI,EAClE;;CAGb,MAAM,eAAe,IAAY,SAAwC;EACxE,MAAM,YAAY,GAAG,KAAK,QAAQ,kBAAkB,mBAAmB,GAAG,CAAC,YAAY,mBAAmB,QAAQ,CAAC;EAEnH,IAAI;AACJ,MAAI;AACH,cAAW,MAAM,kBAAkB,WAAW,mBAAmB,SAAS;WAClE,KAAK;AACb,OAAI,eAAe,iBAAkB,OAAM;AAC3C,SAAM,IAAI,4BAA4B,IAAI;;AAG3C,MAAI,CAAC,SAAS,GACb,OAAM,IAAI,iBACT,8BAA8B,SAAS,OAAO,GAAG,SAAS,cAC1D,SAAS,QACT,yBACA;EAGF,MAAM,eAAe,IAAI,WAAW,MAAM,SAAS,aAAa,CAAC;AACjE,MAAI;AACH,UAAO,MAAM,cAAc,aAAa;WAChC,KAAK;AACb,OAAI,eAAe,iBAAkB,OAAM;AAC3C,SAAM,IAAI,iBACT,mCACA,QACA,wBACA;;;CAIH,MAAM,cAAc,IAAY,SAAgC;EAE/D,MAAM,WAAW,MAAM,iBAAiB,KAAK,WAAW;EACxD,MAAM,MAAM,GAAG,KAAK,QAAQ,kBAAkB,mBAAmB,GAAG,CAAC;AAErE,MAAI;AACH,SAAM,MAAM,KAAK;IAChB,QAAQ;IACR,SAAS,EAAE,gBAAgB,oBAAoB;IAC/C,MAAM,KAAK,UAAU;KAAE;KAAU;KAAS,CAAC;IAC3C,CAAC;UACK;;CAKT,MAAM,aACL,OACA,MACwC;EACxC,MAAM,SAAS,IAAI,iBAAiB;AACpC,MAAI,MAAO,QAAO,IAAI,KAAK,MAAM;AACjC,MAAI,MAAM,QAAS,QAAO,IAAI,WAAW,KAAK,QAAQ;AACtD,MAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,KAAK,KAAK;AAC7C,MAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,OAAO;AACnD,MAAI,MAAM,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,MAAM,CAAC;EAExD,MAAM,KAAK,OAAO,UAAU;EAC5B,MAAM,MAAM,GAAG,KAAK,QAAQ,gBAAgB,KAAK,IAAI,OAAO;AAC5D,SAAO,KAAK,UAAwC,IAAI;;CAGzD,MAAM,SAAS,IAA6C;EAC3D,MAAM,MAAM,GAAG,KAAK,QAAQ,iBAAiB,mBAAmB,GAAG;AACnE,SAAO,KAAK,UAAkC,IAAI;;CAGnD,MAAc,UAAa,KAAyB;EACnD,IAAI;AACJ,MAAI;AACH,cAAW,MAAM,MAAM,KAAK,EAC3B,SAAS,EAAE,QAAQ,oBAAoB,EACvC,CAAC;WACM,KAAK;AACb,SAAM,IAAI,4BAA4B,IAAI;;AAG3C,MAAI,CAAC,SAAS,IAAI;GACjB,IAAI,eAAe,+BAA+B,SAAS;AAC3D,OAAI;IACH,MAAM,OAA2B,MAAM,SAAS,MAAM;AACtD,QAAI,KAAK,MAAO,gBAAe,KAAK;WAC7B;AAGR,SAAM,IAAI,iBAAiB,cAAc,SAAS,OAAO;;AAI1D,SADgB,MAAM,SAAS,MAAM;;;;;;;;;;;;;;;;;;;AAgCvC,MAAM,gCAAgC,MAAM;AAC5C,MAAM,yBAAyB;AAE/B,eAAsB,cAAc,cAAiD;CAkBpF,MAAM,SAZqB,IAAI,eAA2B,EACzD,MAAM,YAAY;AACjB,aAAW,QAAQ,aAAa;AAChC,aAAW,OAAO;IAEnB,CAAC,CAAC,YAAY,mBAAmB,CAAC,CAOD,WAAW;CAC7C,MAAM,SAAuB,EAAE;CAC/B,IAAI,QAAQ;AACZ,QAAO,MAAM;EACZ,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,MAAI,KAAM;AACV,MAAI,CAAC,MAAO;AACZ,WAAS,MAAM;AACf,MAAI,QAAQ,+BAA+B;AAC1C,OAAI;AACH,UAAM,OAAO,QAAQ;WACd;AAGR,SAAM,IAAI,iBACT,2CAA2C,8BAA8B,UACzE,QACA,iBACA;;AAEF,SAAO,KAAK,MAAM;;CAEnB,MAAM,oBAAoB,IAAI,WAAW,MAAM;CAC/C;EACC,IAAI,SAAS;AACb,OAAK,MAAM,SAAS,QAAQ;AAC3B,qBAAkB,IAAI,OAAO,OAAO;AACpC,aAAU,MAAM;;;CAWlB,MAAM,UAAU,MAAM,UAPD,IAAI,eAA2B,EACnD,MAAM,YAAY;AACjB,aAAW,QAAQ,kBAAkB;AACrC,aAAW,OAAO;IAEnB,CAAC,CAE2C;AAC7C,KAAI,QAAQ,SAAS,uBACpB,OAAM,IAAI,iBACT,oCAAoC,QAAQ,OAAO,KAAK,uBAAuB,IAC/E,QACA,iBACA;CAGF,MAAM,UAAU,IAAI,aAAa;CACjC,MAAM,wBAAQ,IAAI,KAAqB;AACvC,MAAK,MAAM,SAAS,QACnB,KAAI,MAAM,QAAQ,MAAM,OAAO,SAAS,QAAQ;EAE/C,MAAM,OAAO,MAAM,OAAO,KAAK,QAAQ,mBAAmB,GAAG;AAC7D,QAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,KAAK,CAAC;;CAI7C,MAAM,eAAe,MAAM,IAAI,gBAAgB;CAC/C,MAAM,cAAc,MAAM,IAAI,aAAa;AAE3C,KAAI,CAAC,aACJ,OAAM,IAAI,iBACT,yCACA,QACA,iBACA;AAEF,KAAI,CAAC,YACJ,OAAM,IAAI,iBAAiB,sCAAsC,QAAW,iBAAiB;CAG9F,IAAI;AACJ,KAAI;EACH,MAAM,SAAkB,KAAK,MAAM,aAAa;EAChD,MAAM,SAAS,qBAAqB,UAAU,OAAO;AACrD,MAAI,CAAC,OAAO,QACX,OAAM,IAAI,iBACT,mDACA,QACA,iBACA;AAEF,aAAW,wBAAwB,OAAO,KAAK;UACvC,KAAK;AACb,MAAI,eAAe,iBAAkB,OAAM;AAC3C,QAAM,IAAI,iBACT,2CACA,QACA,iBACA;;CAKF,MAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,aAAwC;CACjG,MAAM,YAAY,IAAI,WAAW,WAAW;CAC5C,MAAM,WAAW,MAAM,KAAK,YAAY,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG;AAEvF,QAAO;EACN;EACA;EACA,WAAW,MAAM,IAAI,WAAW;EAChC;EACA;;;;;;;AAUF,eAAe,iBAAiB,YAAsC;CACrE,MAAM,OAAO,aAAa,eAAe,eAAe;AACxD,KAAI;EACH,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI,aAAa,CAAC,OAAO,KAAK,CAAC;EAClF,MAAM,MAAM,IAAI,WAAW,KAAK;AAChC,SAAO,MAAM,KAAK,IAAI,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG;SAC5E;EAGP,IAAI,IAAI;AACR,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,QAAK,KAAK,WAAW,EAAE;AACvB,OAAI,KAAK,KAAK,GAAG,SAAW;;EAE7B,MAAM,KAAK,IAAK,MAAM;AACtB,UAAQ,MAAM,GAAG,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,IAAI,OAAO,GAAG,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI;;;;;;;;;;AAa3F,SAAgB,wBAAwB,SAAiB,YAAwC;AAChG,QAAO,IAAI,sBAAsB,SAAS,WAAW"}
|
package/dist/media-3v7mqAVX.mjs
DELETED
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { i as InvalidCursorError } from "./types-j6MBDjlZ.mjs";
|
|
2
|
-
import { t as isValidFocalPointUpdate } from "./focal-point-JX8kcOTQ.mjs";
|
|
3
|
-
import { t as MediaRepository } from "./media-CputjGE1.mjs";
|
|
4
|
-
import { t as removeUploadAttempt } from "./upload-attempts-BodUoFBu.mjs";
|
|
5
|
-
|
|
6
|
-
//#region src/api/handlers/media.ts
|
|
7
|
-
const FOREIGN_KEY_VIOLATION_RE = /foreign key constraint failed/i;
|
|
8
|
-
/**
|
|
9
|
-
* List media items
|
|
10
|
-
*/
|
|
11
|
-
async function handleMediaList(db, params) {
|
|
12
|
-
try {
|
|
13
|
-
if (params.page !== void 0) {
|
|
14
|
-
const limit = Math.max(1, Math.min(params.limit || 50, 100));
|
|
15
|
-
const offset = (params.page - 1) * limit;
|
|
16
|
-
if (params.cursor !== void 0 || !Number.isSafeInteger(params.page) || params.page < 1 || !Number.isSafeInteger(offset)) return {
|
|
17
|
-
success: false,
|
|
18
|
-
error: {
|
|
19
|
-
code: "VALIDATION_ERROR",
|
|
20
|
-
message: "Invalid media page"
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
return {
|
|
24
|
-
success: true,
|
|
25
|
-
data: await new MediaRepository(db).findPage({
|
|
26
|
-
page: params.page,
|
|
27
|
-
limit,
|
|
28
|
-
mimeType: params.mimeType,
|
|
29
|
-
q: params.q,
|
|
30
|
-
folderId: params.folderId
|
|
31
|
-
})
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
const result = await new MediaRepository(db).findMany({
|
|
35
|
-
cursor: params.cursor,
|
|
36
|
-
limit: Math.max(1, Math.min(params.limit || 50, 100)),
|
|
37
|
-
mimeType: params.mimeType,
|
|
38
|
-
q: params.q,
|
|
39
|
-
folderId: params.folderId
|
|
40
|
-
});
|
|
41
|
-
return {
|
|
42
|
-
success: true,
|
|
43
|
-
data: {
|
|
44
|
-
items: result.items,
|
|
45
|
-
nextCursor: result.nextCursor
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
} catch (error) {
|
|
49
|
-
if (error instanceof InvalidCursorError) return {
|
|
50
|
-
success: false,
|
|
51
|
-
error: {
|
|
52
|
-
code: "INVALID_CURSOR",
|
|
53
|
-
message: error.message
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
return {
|
|
57
|
-
success: false,
|
|
58
|
-
error: {
|
|
59
|
-
code: "MEDIA_LIST_ERROR",
|
|
60
|
-
message: "Failed to list media"
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Get single media item
|
|
67
|
-
*/
|
|
68
|
-
async function handleMediaGet(db, id) {
|
|
69
|
-
try {
|
|
70
|
-
const item = await new MediaRepository(db).findById(id);
|
|
71
|
-
if (!item) return {
|
|
72
|
-
success: false,
|
|
73
|
-
error: {
|
|
74
|
-
code: "NOT_FOUND",
|
|
75
|
-
message: `Media item not found: ${id}`
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
return {
|
|
79
|
-
success: true,
|
|
80
|
-
data: { item }
|
|
81
|
-
};
|
|
82
|
-
} catch {
|
|
83
|
-
return {
|
|
84
|
-
success: false,
|
|
85
|
-
error: {
|
|
86
|
-
code: "MEDIA_GET_ERROR",
|
|
87
|
-
message: "Failed to get media"
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Create media item (after file upload)
|
|
94
|
-
*/
|
|
95
|
-
async function handleMediaCreate(db, input) {
|
|
96
|
-
try {
|
|
97
|
-
return {
|
|
98
|
-
success: true,
|
|
99
|
-
data: { item: await new MediaRepository(db).create(input) }
|
|
100
|
-
};
|
|
101
|
-
} catch {
|
|
102
|
-
return {
|
|
103
|
-
success: false,
|
|
104
|
-
error: {
|
|
105
|
-
code: "MEDIA_CREATE_ERROR",
|
|
106
|
-
message: "Failed to create media"
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Confirm an upload minted by the signed upload URL endpoint.
|
|
113
|
-
*
|
|
114
|
-
* The storage key must belong to a pending media row created for the same
|
|
115
|
-
* user; arbitrary keys never reach storage this way.
|
|
116
|
-
*/
|
|
117
|
-
async function handleMediaRegisterUpload(db, storage, input) {
|
|
118
|
-
const invalidKey = {
|
|
119
|
-
success: false,
|
|
120
|
-
error: {
|
|
121
|
-
code: "INVALID_STORAGE_KEY",
|
|
122
|
-
message: "storageKey does not match a pending upload created for this user; request a signed upload URL first"
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
try {
|
|
126
|
-
const repo = new MediaRepository(db);
|
|
127
|
-
const pending = await repo.findPendingByStorageKey(input.storageKey);
|
|
128
|
-
if (!pending) return invalidKey;
|
|
129
|
-
if ((pending.authorId ?? null) !== (input.authorId ?? null)) return invalidKey;
|
|
130
|
-
if (pending.size === null) return {
|
|
131
|
-
success: false,
|
|
132
|
-
error: {
|
|
133
|
-
code: "INVALID_STATE",
|
|
134
|
-
message: "Pending upload has no expected size"
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
if (!await storage.exists(input.storageKey)) return {
|
|
138
|
-
success: false,
|
|
139
|
-
error: {
|
|
140
|
-
code: "FILE_NOT_FOUND",
|
|
141
|
-
message: "File was not uploaded to storage"
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
const storedFile = await storage.download(input.storageKey);
|
|
145
|
-
try {
|
|
146
|
-
if (storedFile.size !== pending.size) return {
|
|
147
|
-
success: false,
|
|
148
|
-
error: {
|
|
149
|
-
code: "UPLOAD_SIZE_MISMATCH",
|
|
150
|
-
message: "Stored file size does not match the pending upload"
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
} finally {
|
|
154
|
-
try {
|
|
155
|
-
await storedFile.body.cancel();
|
|
156
|
-
} catch (error) {
|
|
157
|
-
console.error("[media] upload confirmation cancellation failed:", error);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
const item = await repo.confirmUpload(pending.id, void 0, input.storageKey);
|
|
161
|
-
if (!item) return invalidKey;
|
|
162
|
-
try {
|
|
163
|
-
await repo.deleteUploadAttempt(input.storageKey);
|
|
164
|
-
} catch (error) {
|
|
165
|
-
console.error("[media] upload attempt cleanup failed:", error);
|
|
166
|
-
}
|
|
167
|
-
return {
|
|
168
|
-
success: true,
|
|
169
|
-
data: { item }
|
|
170
|
-
};
|
|
171
|
-
} catch {
|
|
172
|
-
return {
|
|
173
|
-
success: false,
|
|
174
|
-
error: {
|
|
175
|
-
code: "MEDIA_REGISTER_ERROR",
|
|
176
|
-
message: "Failed to register the upload"
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Update media metadata
|
|
183
|
-
*/
|
|
184
|
-
async function handleMediaUpdate(db, id, input) {
|
|
185
|
-
if (!isValidFocalPointUpdate(input)) return {
|
|
186
|
-
success: false,
|
|
187
|
-
error: {
|
|
188
|
-
code: "VALIDATION_ERROR",
|
|
189
|
-
message: "focalX and focalY must both be valid numbers or both be null"
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
try {
|
|
193
|
-
const item = await new MediaRepository(db).update(id, input);
|
|
194
|
-
if (!item) return {
|
|
195
|
-
success: false,
|
|
196
|
-
error: {
|
|
197
|
-
code: "NOT_FOUND",
|
|
198
|
-
message: `Media item not found: ${id}`
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
return {
|
|
202
|
-
success: true,
|
|
203
|
-
data: { item }
|
|
204
|
-
};
|
|
205
|
-
} catch (error) {
|
|
206
|
-
if (isForeignKeyViolation(error)) return {
|
|
207
|
-
success: false,
|
|
208
|
-
error: {
|
|
209
|
-
code: "NOT_FOUND",
|
|
210
|
-
message: "Media folder not found"
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
return {
|
|
214
|
-
success: false,
|
|
215
|
-
error: {
|
|
216
|
-
code: "MEDIA_UPDATE_ERROR",
|
|
217
|
-
message: "Failed to update media"
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
async function handleMediaReplaceMetadata(db, id, expectedStorageKey, input) {
|
|
223
|
-
try {
|
|
224
|
-
const item = await new MediaRepository(db).replaceReadyFile(id, expectedStorageKey, input);
|
|
225
|
-
if (!item) return {
|
|
226
|
-
success: false,
|
|
227
|
-
error: {
|
|
228
|
-
code: "MEDIA_REPLACE_METADATA_ERROR",
|
|
229
|
-
message: "Failed to update replaced media metadata"
|
|
230
|
-
}
|
|
231
|
-
};
|
|
232
|
-
return {
|
|
233
|
-
success: true,
|
|
234
|
-
data: { item }
|
|
235
|
-
};
|
|
236
|
-
} catch {
|
|
237
|
-
return {
|
|
238
|
-
success: false,
|
|
239
|
-
error: {
|
|
240
|
-
code: "MEDIA_REPLACE_METADATA_ERROR",
|
|
241
|
-
message: "Failed to update replaced media metadata"
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
function isForeignKeyViolation(error) {
|
|
247
|
-
if (error && typeof error === "object") {
|
|
248
|
-
if ("code" in error && error.code === "23503") return true;
|
|
249
|
-
}
|
|
250
|
-
const message = error instanceof Error ? error.message : "";
|
|
251
|
-
if (FOREIGN_KEY_VIOLATION_RE.test(message)) return true;
|
|
252
|
-
return Boolean(error && typeof error === "object" && "cause" in error && isForeignKeyViolation(error.cause));
|
|
253
|
-
}
|
|
254
|
-
/** Delete a media item, then delete or queue cleanup of its stored object. */
|
|
255
|
-
async function handleMediaDelete(db, id, storage) {
|
|
256
|
-
try {
|
|
257
|
-
const repo = new MediaRepository(db);
|
|
258
|
-
const notFound = {
|
|
259
|
-
success: false,
|
|
260
|
-
error: {
|
|
261
|
-
code: "NOT_FOUND",
|
|
262
|
-
message: `Media item not found: ${id}`
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
const media = await repo.findById(id);
|
|
266
|
-
if (!media) return notFound;
|
|
267
|
-
if (storage) await repo.trackStorageKeyForCleanup(media.id, media.storageKey);
|
|
268
|
-
const storageKey = await repo.deleteWithStorageKey(id);
|
|
269
|
-
if (!storageKey) return notFound;
|
|
270
|
-
let storageDeleted = false;
|
|
271
|
-
if (storage) if (await repo.isStorageKeyReferenced(storageKey)) await repo.deleteUploadAttempt(storageKey);
|
|
272
|
-
else storageDeleted = await removeUploadAttempt(storage, repo, storageKey, { allowUntracked: true });
|
|
273
|
-
return {
|
|
274
|
-
success: true,
|
|
275
|
-
data: {
|
|
276
|
-
deleted: true,
|
|
277
|
-
storageKey,
|
|
278
|
-
storageDeleted
|
|
279
|
-
}
|
|
280
|
-
};
|
|
281
|
-
} catch {
|
|
282
|
-
return {
|
|
283
|
-
success: false,
|
|
284
|
-
error: {
|
|
285
|
-
code: "MEDIA_DELETE_ERROR",
|
|
286
|
-
message: "Failed to delete media"
|
|
287
|
-
}
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
//#endregion
|
|
293
|
-
export { handleMediaRegisterUpload as a, handleMediaList as i, handleMediaDelete as n, handleMediaReplaceMetadata as o, handleMediaGet as r, handleMediaUpdate as s, handleMediaCreate as t };
|
|
294
|
-
//# sourceMappingURL=media-3v7mqAVX.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-3v7mqAVX.mjs","names":[],"sources":["../src/api/handlers/media.ts"],"sourcesContent":["/**\n * Media CRUD handlers\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport { MediaRepository, type MediaItem } from \"../../database/repositories/media.js\";\nimport { InvalidCursorError } from \"../../database/repositories/types.js\";\nimport type { Database } from \"../../database/types.js\";\nimport { isValidFocalPointUpdate, type FocalPointUpdate } from \"../../media/focal-point.js\";\nimport { removeUploadAttempt } from \"../../media/upload-attempts.js\";\nimport type { Storage } from \"../../storage/types.js\";\nimport type { ApiResult } from \"../types.js\";\n\nconst FOREIGN_KEY_VIOLATION_RE = /foreign key constraint failed/i;\n\nexport interface MediaListResponse {\n\titems: MediaItem[];\n\tnextCursor?: string;\n\ttotalCount?: number;\n}\n\nexport interface MediaResponse {\n\titem: MediaItem;\n}\n\n/**\n * List media items\n */\nexport async function handleMediaList(\n\tdb: Kysely<Database>,\n\tparams: {\n\t\tcursor?: string;\n\t\tpage?: number;\n\t\tlimit?: number;\n\t\tmimeType?: string | readonly string[];\n\t\tq?: string;\n\t\tfolderId?: string | null;\n\t},\n): Promise<ApiResult<MediaListResponse>> {\n\ttry {\n\t\tif (params.page !== undefined) {\n\t\t\tconst limit = Math.max(1, Math.min(params.limit || 50, 100));\n\t\t\tconst offset = (params.page - 1) * limit;\n\t\t\tif (\n\t\t\t\tparams.cursor !== undefined ||\n\t\t\t\t!Number.isSafeInteger(params.page) ||\n\t\t\t\tparams.page < 1 ||\n\t\t\t\t!Number.isSafeInteger(offset)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: { code: \"VALIDATION_ERROR\", message: \"Invalid media page\" },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst repo = new MediaRepository(db);\n\t\t\tconst result = await repo.findPage({\n\t\t\t\tpage: params.page,\n\t\t\t\tlimit,\n\t\t\t\tmimeType: params.mimeType,\n\t\t\t\tq: params.q,\n\t\t\t\tfolderId: params.folderId,\n\t\t\t});\n\t\t\treturn { success: true, data: result };\n\t\t}\n\n\t\tconst repo = new MediaRepository(db);\n\t\tconst result = await repo.findMany({\n\t\t\tcursor: params.cursor,\n\t\t\tlimit: Math.max(1, Math.min(params.limit || 50, 100)),\n\t\t\tmimeType: params.mimeType,\n\t\t\tq: params.q,\n\t\t\tfolderId: params.folderId,\n\t\t});\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\titems: result.items,\n\t\t\t\tnextCursor: result.nextCursor,\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof InvalidCursorError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: { code: \"INVALID_CURSOR\", message: error.message },\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_LIST_ERROR\",\n\t\t\t\tmessage: \"Failed to list media\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n/**\n * Get single media item\n */\nexport async function handleMediaGet(\n\tdb: Kysely<Database>,\n\tid: string,\n): Promise<ApiResult<MediaResponse>> {\n\ttry {\n\t\tconst repo = new MediaRepository(db);\n\t\tconst item = await repo.findById(id);\n\n\t\tif (!item) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"NOT_FOUND\",\n\t\t\t\t\tmessage: `Media item not found: ${id}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { item },\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_GET_ERROR\",\n\t\t\t\tmessage: \"Failed to get media\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n/**\n * Create media item (after file upload)\n */\nexport async function handleMediaCreate(\n\tdb: Kysely<Database>,\n\tinput: {\n\t\tfilename: string;\n\t\tmimeType: string;\n\t\tsize?: number;\n\t\twidth?: number;\n\t\theight?: number;\n\t\talt?: string;\n\t\tstorageKey: string;\n\t\tcontentHash?: string;\n\t\tblurhash?: string;\n\t\tdominantColor?: string;\n\t\tauthorId?: string;\n\t\tfolderId?: string | null;\n\t},\n): Promise<ApiResult<MediaResponse>> {\n\ttry {\n\t\tconst repo = new MediaRepository(db);\n\t\tconst item = await repo.create(input);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { item },\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_CREATE_ERROR\",\n\t\t\t\tmessage: \"Failed to create media\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n/**\n * Confirm an upload minted by the signed upload URL endpoint.\n *\n * The storage key must belong to a pending media row created for the same\n * user; arbitrary keys never reach storage this way.\n */\nexport async function handleMediaRegisterUpload(\n\tdb: Kysely<Database>,\n\tstorage: Storage,\n\tinput: {\n\t\tstorageKey: string;\n\t\tauthorId?: string;\n\t},\n): Promise<ApiResult<MediaResponse>> {\n\tconst invalidKey: ApiResult<never> = {\n\t\tsuccess: false,\n\t\terror: {\n\t\t\tcode: \"INVALID_STORAGE_KEY\",\n\t\t\tmessage:\n\t\t\t\t\"storageKey does not match a pending upload created for this user; request a signed upload URL first\",\n\t\t},\n\t};\n\ttry {\n\t\tconst repo = new MediaRepository(db);\n\t\tconst pending = await repo.findPendingByStorageKey(input.storageKey);\n\t\tif (!pending) return invalidKey;\n\t\tif ((pending.authorId ?? null) !== (input.authorId ?? null)) return invalidKey;\n\t\tif (pending.size === null) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"INVALID_STATE\",\n\t\t\t\t\tmessage: \"Pending upload has no expected size\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (!(await storage.exists(input.storageKey))) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: { code: \"FILE_NOT_FOUND\", message: \"File was not uploaded to storage\" },\n\t\t\t};\n\t\t}\n\n\t\tconst storedFile = await storage.download(input.storageKey);\n\t\ttry {\n\t\t\tif (storedFile.size !== pending.size) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"UPLOAD_SIZE_MISMATCH\",\n\t\t\t\t\t\tmessage: \"Stored file size does not match the pending upload\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait storedFile.body.cancel();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[media] upload confirmation cancellation failed:\", error);\n\t\t\t}\n\t\t}\n\n\t\tconst item = await repo.confirmUpload(pending.id, undefined, input.storageKey);\n\t\tif (!item) return invalidKey;\n\t\ttry {\n\t\t\tawait repo.deleteUploadAttempt(input.storageKey);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[media] upload attempt cleanup failed:\", error);\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { item },\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_REGISTER_ERROR\",\n\t\t\t\tmessage: \"Failed to register the upload\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n/**\n * Update media metadata\n */\nexport async function handleMediaUpdate(\n\tdb: Kysely<Database>,\n\tid: string,\n\tinput: {\n\t\talt?: string;\n\t\tcaption?: string;\n\t\twidth?: number;\n\t\theight?: number;\n\t\tfolderId?: string | null;\n\t} & FocalPointUpdate,\n): Promise<ApiResult<MediaResponse>> {\n\tif (!isValidFocalPointUpdate(input)) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tmessage: \"focalX and focalY must both be valid numbers or both be null\",\n\t\t\t},\n\t\t};\n\t}\n\ttry {\n\t\tconst repo = new MediaRepository(db);\n\t\tconst item = await repo.update(id, input);\n\n\t\tif (!item) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"NOT_FOUND\",\n\t\t\t\t\tmessage: `Media item not found: ${id}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { item },\n\t\t};\n\t} catch (error) {\n\t\tif (isForeignKeyViolation(error)) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: { code: \"NOT_FOUND\", message: \"Media folder not found\" },\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_UPDATE_ERROR\",\n\t\t\t\tmessage: \"Failed to update media\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaReplaceMetadata(\n\tdb: Kysely<Database>,\n\tid: string,\n\texpectedStorageKey: string,\n\tinput: { size: number; width: number; height: number; contentHash: string },\n): Promise<ApiResult<MediaResponse>> {\n\ttry {\n\t\tconst item = await new MediaRepository(db).replaceReadyFile(id, expectedStorageKey, input);\n\t\tif (!item) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"MEDIA_REPLACE_METADATA_ERROR\",\n\t\t\t\t\tmessage: \"Failed to update replaced media metadata\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn { success: true, data: { item } };\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_REPLACE_METADATA_ERROR\",\n\t\t\t\tmessage: \"Failed to update replaced media metadata\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction isForeignKeyViolation(error: unknown): boolean {\n\tif (error && typeof error === \"object\") {\n\t\tif (\"code\" in error && error.code === \"23503\") return true;\n\t}\n\tconst message = error instanceof Error ? error.message : \"\";\n\tif (FOREIGN_KEY_VIOLATION_RE.test(message)) return true;\n\treturn Boolean(\n\t\terror && typeof error === \"object\" && \"cause\" in error && isForeignKeyViolation(error.cause),\n\t);\n}\n\n/** Delete a media item, then delete or queue cleanup of its stored object. */\nexport async function handleMediaDelete(\n\tdb: Kysely<Database>,\n\tid: string,\n\tstorage?: Storage | null,\n): Promise<ApiResult<{ deleted: true; storageKey: string; storageDeleted: boolean }>> {\n\ttry {\n\t\tconst repo = new MediaRepository(db);\n\t\tconst notFound: ApiResult<never> = {\n\t\t\tsuccess: false,\n\t\t\terror: { code: \"NOT_FOUND\", message: `Media item not found: ${id}` },\n\t\t};\n\n\t\tconst media = await repo.findById(id);\n\t\tif (!media) return notFound;\n\n\t\tif (storage) await repo.trackStorageKeyForCleanup(media.id, media.storageKey);\n\t\tconst storageKey = await repo.deleteWithStorageKey(id);\n\t\tif (!storageKey) return notFound;\n\n\t\tlet storageDeleted = false;\n\t\tif (storage) {\n\t\t\tif (await repo.isStorageKeyReferenced(storageKey)) {\n\t\t\t\t// A legacy or concurrently-created row still owns this object. Remove\n\t\t\t\t// the cleanup marker created above so scheduled cleanup cannot delete it.\n\t\t\t\tawait repo.deleteUploadAttempt(storageKey);\n\t\t\t} else {\n\t\t\t\tstorageDeleted = await removeUploadAttempt(storage, repo, storageKey, {\n\t\t\t\t\tallowUntracked: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { deleted: true, storageKey, storageDeleted },\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"MEDIA_DELETE_ERROR\",\n\t\t\t\tmessage: \"Failed to delete media\",\n\t\t\t},\n\t\t};\n\t}\n}\n"],"mappings":"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"}
|