emdash 0.41.0 → 0.42.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-DBki7IT4.mjs +26 -0
- package/dist/action-token-DBki7IT4.mjs.map +1 -0
- package/dist/activation-DDuqAat2.mjs +387 -0
- package/dist/activation-DDuqAat2.mjs.map +1 -0
- package/dist/adapters-BrZxU6vM.d.mts +171 -0
- package/dist/adapters-BrZxU6vM.d.mts.map +1 -0
- package/dist/allowed-origins-CFtudhyw.mjs +116 -0
- package/dist/allowed-origins-CFtudhyw.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +5 -4
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +52 -47
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +11 -10
- package/dist/api-CFQn8VLR.mjs +4973 -0
- package/dist/api-CFQn8VLR.mjs.map +1 -0
- package/dist/api-tokens-P3mAaQgr.mjs +166 -0
- package/dist/api-tokens-P3mAaQgr.mjs.map +1 -0
- package/dist/apply-C1kq5l7p.mjs +1672 -0
- package/dist/apply-C1kq5l7p.mjs.map +1 -0
- package/dist/approvals-l9sGqPmL.mjs +460 -0
- package/dist/approvals-l9sGqPmL.mjs.map +1 -0
- package/dist/artifact-fetch-CWxyELVI.mjs +659 -0
- package/dist/artifact-fetch-CWxyELVI.mjs.map +1 -0
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +96 -546
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.mjs +10 -10
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +19 -9
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.d.mts +2 -1
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +15 -6
- 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.mjs +114 -110
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +15 -14
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +15 -14
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +18 -17
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +18 -17
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +18 -17
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +36 -27
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +32 -26
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +32 -26
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +20 -19
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/bulk.mjs +19 -18
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/index.mjs +19 -18
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/core-update.d.mts +8 -0
- package/dist/astro/routes/api/admin/core-update.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/core-update.mjs +28 -0
- package/dist/astro/routes/api/admin/core-update.mjs.map +1 -0
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +21 -20
- package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +26 -25
- package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +32 -31
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +75 -73
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +74 -72
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +75 -73
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +86 -83
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +75 -73
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +10 -7
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +74 -72
- 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 +85 -82
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +74 -72
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +75 -73
- 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 +87 -84
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +77 -75
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +75 -73
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +74 -72
- 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 +74 -72
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +10 -7
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +74 -72
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +42 -41
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +42 -41
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +45 -44
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +45 -44
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +45 -44
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +16 -15
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/index.mjs +15 -14
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +23 -19
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +17 -16
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +18 -17
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +5 -5
- package/dist/astro/routes/api/auth/magic-link/send.mjs +19 -18
- 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 +19 -15
- package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/me.mjs +16 -15
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +5 -5
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +13 -4
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +15 -14
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
- package/dist/astro/routes/api/auth/passkey/options.mjs +20 -19
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +18 -17
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +19 -18
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +23 -19
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +23 -19
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +18 -17
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +20 -19
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +12 -11
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +33 -32
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +36 -35
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +36 -35
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +27 -26
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/index.mjs +16 -15
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +16 -15
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +13 -11
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +5 -5
- package/dist/astro/routes/api/health.mjs +6 -6
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +25 -24
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -14
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +167 -21
- 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 -19
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -18
- package/dist/astro/routes/api/import/wordpress/prepare.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 +29 -28
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +25 -24
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +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 +36 -35
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +6 -6
- package/dist/astro/routes/api/mcp.mjs +167 -110
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +20 -19
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/replace.mjs +17 -16
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/usage.mjs +34 -33
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +32 -31
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
- package/dist/astro/routes/api/media/folders/_id_.mjs +17 -16
- package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/index.mjs +17 -16
- package/dist/astro/routes/api/media/folders/index.mjs.map +1 -1
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
- package/dist/astro/routes/api/media/providers/index.mjs +5 -5
- package/dist/astro/routes/api/media/upload-url.mjs +19 -18
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +36 -35
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +19 -18
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
- package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
- package/dist/astro/routes/api/oauth/register.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/register.mjs +15 -7
- package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
- package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
- package/dist/astro/routes/api/oauth/token.mjs +8 -8
- package/dist/astro/routes/api/openapi.json.mjs +21 -20
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +12 -11
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- 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 +36 -35
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +36 -35
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
- package/dist/astro/routes/api/revisions/_revisionId_/restore.d.mts.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +26 -6
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +74 -72
- 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 +74 -72
- 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 +74 -72
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +74 -72
- 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 +74 -72
- 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 +74 -72
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +74 -72
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +74 -72
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +74 -72
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +17 -16
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +74 -72
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +74 -72
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +20 -19
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +19 -18
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +20 -19
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +19 -18
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +19 -18
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +19 -18
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +23 -22
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +26 -24
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +19 -18
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +47 -46
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +52 -51
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +6 -6
- package/dist/astro/routes/api/snapshot.mjs +8 -8
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +24 -23
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +42 -41
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.d.mts.map +1 -1
- package/dist/astro/routes/api/typegen.mjs +8 -39
- package/dist/astro/routes/api/typegen.mjs.map +1 -1
- package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +20 -19
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
- 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 -16
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +20 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/index.mjs +20 -19
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +5 -5
- package/dist/astro/routes/robots.txt.mjs +7 -7
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
- package/dist/astro/routes/sitemap.xml.mjs +8 -8
- package/dist/astro/types.d.mts +23 -17
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-BszbE_BP.mjs +127 -0
- package/dist/audit-BszbE_BP.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/authoritative-records-dSvXCfzb.mjs +5172 -0
- package/dist/authoritative-records-dSvXCfzb.mjs.map +1 -0
- package/dist/authorize-soZXK7U0.mjs +49 -0
- package/dist/authorize-soZXK7U0.mjs.map +1 -0
- package/dist/backup-DQ3CABsO.mjs +246 -0
- package/dist/backup-DQ3CABsO.mjs.map +1 -0
- package/dist/block-types-DIG_KZwi.mjs +132 -0
- package/dist/block-types-DIG_KZwi.mjs.map +1 -0
- package/dist/block-values-BrTrtA-v.mjs +175 -0
- package/dist/block-values-BrTrtA-v.mjs.map +1 -0
- package/dist/byline-02tu_Uc-.mjs +909 -0
- package/dist/byline-02tu_Uc-.mjs.map +1 -0
- package/dist/byline-fields-B01Txzyx.mjs +123 -0
- package/dist/byline-fields-B01Txzyx.mjs.map +1 -0
- package/dist/byline-fields-DHJs0Mja.mjs +280 -0
- package/dist/byline-fields-DHJs0Mja.mjs.map +1 -0
- package/dist/byline-registry-dvt4N3xV.mjs +406 -0
- package/dist/byline-registry-dvt4N3xV.mjs.map +1 -0
- package/dist/bylines-COTwmMBF.mjs +150 -0
- package/dist/bylines-COTwmMBF.mjs.map +1 -0
- package/dist/bylines-D_S8UKRX.mjs +214 -0
- package/dist/bylines-D_S8UKRX.mjs.map +1 -0
- package/dist/cache-CPanL9IO.mjs +114 -0
- package/dist/cache-CPanL9IO.mjs.map +1 -0
- package/dist/canonical-CAecl1UQ.mjs +174 -0
- package/dist/canonical-CAecl1UQ.mjs.map +1 -0
- package/dist/capture-triggers-CdZfvHtF.mjs +362 -0
- package/dist/capture-triggers-CdZfvHtF.mjs.map +1 -0
- package/dist/challenge-store-CxZxPqaw.mjs +51 -0
- package/dist/challenge-store-CxZxPqaw.mjs.map +1 -0
- package/dist/checksum-DtH6m5uk.mjs +162 -0
- package/dist/checksum-DtH6m5uk.mjs.map +1 -0
- package/dist/chrome-tags-CKELm-bo.mjs +24 -0
- package/dist/chrome-tags-CKELm-bo.mjs.map +1 -0
- package/dist/chunks-DBmkKmBH.mjs +25 -0
- package/dist/chunks-DBmkKmBH.mjs.map +1 -0
- package/dist/cli/index.mjs +58 -911
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +39 -34
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +8 -3
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-deletion-JecE26cS.mjs +436 -0
- package/dist/collection-deletion-JecE26cS.mjs.map +1 -0
- package/dist/collection-deletion-processor-DgCfF3a1.mjs +217 -0
- package/dist/collection-deletion-processor-DgCfF3a1.mjs.map +1 -0
- package/dist/collection-slugs-cache-BNRAPNiu.mjs +85 -0
- package/dist/collection-slugs-cache-BNRAPNiu.mjs.map +1 -0
- package/dist/comment-Cq1UYN8_.mjs +313 -0
- package/dist/comment-Cq1UYN8_.mjs.map +1 -0
- package/dist/comment-reaction-DPeGAfjd.mjs +85 -0
- package/dist/comment-reaction-DPeGAfjd.mjs.map +1 -0
- package/dist/comments-BRtp992B.mjs +99 -0
- package/dist/comments-BRtp992B.mjs.map +1 -0
- package/dist/comments-Bi2j9IoX.mjs +195 -0
- package/dist/comments-Bi2j9IoX.mjs.map +1 -0
- package/dist/components-CQY-Sgm-.mjs +108 -0
- package/dist/components-CQY-Sgm-.mjs.map +1 -0
- package/dist/config-BnuORwSP.mjs +242 -0
- package/dist/config-BnuORwSP.mjs.map +1 -0
- package/dist/config-CDmPF4p7.d.mts +39 -0
- package/dist/config-CDmPF4p7.d.mts.map +1 -0
- package/dist/config-DHsDMpXc.d.mts +6707 -0
- package/dist/config-DHsDMpXc.d.mts.map +1 -0
- package/dist/connection-B9pIasFd.mjs +36 -0
- package/dist/connection-B9pIasFd.mjs.map +1 -0
- package/dist/content-RzEXY3QX.mjs +2020 -0
- package/dist/content-RzEXY3QX.mjs.map +1 -0
- package/dist/content-list-query-CnXfe1Nu.d.mts +26 -0
- package/dist/content-list-query-CnXfe1Nu.d.mts.map +1 -0
- package/dist/content-policy-Dm32n9C6.mjs +46 -0
- package/dist/content-policy-Dm32n9C6.mjs.map +1 -0
- package/dist/content-repair-B-k5JrVN.mjs +442 -0
- package/dist/content-repair-B-k5JrVN.mjs.map +1 -0
- package/dist/context-CtRvoSAj.mjs +2026 -0
- package/dist/context-CtRvoSAj.mjs.map +1 -0
- package/dist/credits-CAFPFhuk.mjs +110 -0
- package/dist/credits-CAFPFhuk.mjs.map +1 -0
- package/dist/cron-xe5XKqA-.mjs +306 -0
- package/dist/cron-xe5XKqA-.mjs.map +1 -0
- package/dist/dashboard-BoV4pwPP.mjs +151 -0
- package/dist/dashboard-BoV4pwPP.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- 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-DaoYyFRS.mjs +81 -0
- package/dist/default-DaoYyFRS.mjs.map +1 -0
- package/dist/deferred-tasks-OBADxoFf.d.mts +9 -0
- package/dist/deferred-tasks-OBADxoFf.d.mts.map +1 -0
- package/dist/destination-r2zIAZ2S.mjs +18 -0
- package/dist/destination-r2zIAZ2S.mjs.map +1 -0
- package/dist/dev-typegen-8JlYYFno.mjs +29 -0
- package/dist/dev-typegen-8JlYYFno.mjs.map +1 -0
- package/dist/device-flow-CzKi6tID.mjs +521 -0
- package/dist/device-flow-CzKi6tID.mjs.map +1 -0
- package/dist/digest-DiYAoZpf.mjs +194 -0
- package/dist/digest-DiYAoZpf.mjs.map +1 -0
- package/dist/direct-executor-CsEmH_2m.mjs +104 -0
- package/dist/direct-executor-CsEmH_2m.mjs.map +1 -0
- package/dist/dist-Cfu8mMBs.mjs +810 -0
- package/dist/dist-Cfu8mMBs.mjs.map +1 -0
- package/dist/email-console-DmqVF5J_.mjs +50 -0
- package/dist/email-console-DmqVF5J_.mjs.map +1 -0
- package/dist/email-locale-B5OjmAj_.mjs +25 -0
- package/dist/email-locale-B5OjmAj_.mjs.map +1 -0
- package/dist/emdash-runtime-CMdYH2Of.mjs +4229 -0
- package/dist/emdash-runtime-CMdYH2Of.mjs.map +1 -0
- package/dist/enrich-BDdVNeDK.mjs +194 -0
- package/dist/enrich-BDdVNeDK.mjs.map +1 -0
- package/dist/entry-lock-B-1bUDxX.d.mts +4544 -0
- package/dist/entry-lock-B-1bUDxX.d.mts.map +1 -0
- package/dist/entry-lock-B5eaZEZP.mjs +163 -0
- package/dist/entry-lock-B5eaZEZP.mjs.map +1 -0
- package/dist/entry-lock-PP1JCXBB.mjs +1180 -0
- package/dist/entry-lock-PP1JCXBB.mjs.map +1 -0
- package/dist/entry-locks-DJAqVweV.mjs +167 -0
- package/dist/entry-locks-DJAqVweV.mjs.map +1 -0
- package/dist/env-types-BaTCgn-y.mjs +38 -0
- package/dist/env-types-BaTCgn-y.mjs.map +1 -0
- package/dist/error-CEdm_AWU.mjs +90 -0
- package/dist/error-CEdm_AWU.mjs.map +1 -0
- package/dist/errors-CNvATh_7.mjs +469 -0
- package/dist/errors-CNvATh_7.mjs.map +1 -0
- package/dist/errors-CjXd1LgH.mjs +120 -0
- package/dist/errors-CjXd1LgH.mjs.map +1 -0
- package/dist/escape-nJW7dR0s.mjs +9 -0
- package/dist/escape-nJW7dR0s.mjs.map +1 -0
- package/dist/fence-BrnQffdY.mjs +162 -0
- package/dist/fence-BrnQffdY.mjs.map +1 -0
- package/dist/field-defs-cache-DEkFYCDE.mjs +77 -0
- package/dist/field-defs-cache-DEkFYCDE.mjs.map +1 -0
- package/dist/field-map-Cp5hDSRU.mjs +83 -0
- package/dist/field-map-Cp5hDSRU.mjs.map +1 -0
- package/dist/focal-point-JX8kcOTQ.mjs +23 -0
- package/dist/focal-point-JX8kcOTQ.mjs.map +1 -0
- package/dist/fts-manager-DU03MxWu.mjs +443 -0
- package/dist/fts-manager-DU03MxWu.mjs.map +1 -0
- package/dist/gc-Gf9LOF42.mjs +75 -0
- package/dist/gc-Gf9LOF42.mjs.map +1 -0
- package/dist/hash-CY4QdeMJ.mjs +37 -0
- package/dist/hash-CY4QdeMJ.mjs.map +1 -0
- package/dist/hook-result-DjdVwWpw.d.mts +31 -0
- package/dist/hook-result-DjdVwWpw.d.mts.map +1 -0
- package/dist/hreflang-Bq0ahAd4.mjs +105 -0
- package/dist/hreflang-Bq0ahAd4.mjs.map +1 -0
- package/dist/hreflang-C7ETs0Tv.d.mts +50 -0
- package/dist/hreflang-C7ETs0Tv.d.mts.map +1 -0
- package/dist/http-route-dispatch-B2G7_OOm.mjs +339 -0
- package/dist/http-route-dispatch-B2G7_OOm.mjs.map +1 -0
- package/dist/identity-u3KgtUC9.mjs +35 -0
- package/dist/identity-u3KgtUC9.mjs.map +1 -0
- package/dist/import-CzP9ffo0.mjs +2020 -0
- package/dist/import-CzP9ffo0.mjs.map +1 -0
- package/dist/index-D1_ykO2u.d.mts +623 -0
- package/dist/index-D1_ykO2u.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +108 -104
- package/dist/install-finalization-TbcQozrV.mjs +58 -0
- package/dist/install-finalization-TbcQozrV.mjs.map +1 -0
- package/dist/keys-r08WvAng.mjs +61 -0
- package/dist/keys-r08WvAng.mjs.map +1 -0
- package/dist/kinds-CXY-fwQ6.mjs +974 -0
- package/dist/kinds-CXY-fwQ6.mjs.map +1 -0
- package/dist/lifecycle-CpebZNAA.mjs +25 -0
- package/dist/lifecycle-CpebZNAA.mjs.map +1 -0
- package/dist/load-dHcR5yh9.mjs +28 -0
- package/dist/load-dHcR5yh9.mjs.map +1 -0
- package/dist/loader-B_bcoE1h.mjs +1197 -0
- package/dist/loader-B_bcoE1h.mjs.map +1 -0
- package/dist/loops-Dn1i16FP.mjs +205 -0
- package/dist/loops-Dn1i16FP.mjs.map +1 -0
- package/dist/manifest-builder-D7Y8iirE.mjs +189 -0
- package/dist/manifest-builder-D7Y8iirE.mjs.map +1 -0
- package/dist/manifest-schema-gy37bD_D.mjs +496 -0
- package/dist/manifest-schema-gy37bD_D.mjs.map +1 -0
- package/dist/marketplace-tHWSsCUo.mjs +257 -0
- package/dist/marketplace-tHWSsCUo.mjs.map +1 -0
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +4 -4
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +7 -7
- package/dist/media-3v7mqAVX.mjs +294 -0
- package/dist/media-3v7mqAVX.mjs.map +1 -0
- package/dist/media-CputjGE1.mjs +373 -0
- package/dist/media-CputjGE1.mjs.map +1 -0
- package/dist/media-D1z_jisb.mjs +408 -0
- package/dist/media-D1z_jisb.mjs.map +1 -0
- package/dist/media-allowlist-D5a4d-RA.mjs +44 -0
- package/dist/media-allowlist-D5a4d-RA.mjs.map +1 -0
- package/dist/media-folders-D2VdVBf6.mjs +210 -0
- package/dist/media-folders-D2VdVBf6.mjs.map +1 -0
- package/dist/media-url-DloW2xrP.mjs +43 -0
- package/dist/media-url-DloW2xrP.mjs.map +1 -0
- package/dist/media-usage-B8q0owWQ.mjs +1629 -0
- package/dist/media-usage-B8q0owWQ.mjs.map +1 -0
- package/dist/media-usage-activation-CQWOOTJi.mjs +78 -0
- package/dist/media-usage-activation-CQWOOTJi.mjs.map +1 -0
- package/dist/media-usage-work-BC0qpkMD.mjs +152 -0
- package/dist/media-usage-work-BC0qpkMD.mjs.map +1 -0
- package/dist/media-usage-work-BlMjwPg8.mjs +586 -0
- package/dist/media-usage-work-BlMjwPg8.mjs.map +1 -0
- package/dist/menus-BQKqf0Up.mjs +92 -0
- package/dist/menus-BQKqf0Up.mjs.map +1 -0
- package/dist/menus-DiuhXKWf.mjs +3646 -0
- package/dist/menus-DiuhXKWf.mjs.map +1 -0
- package/dist/menus-trvc6_fW.mjs +753 -0
- package/dist/menus-trvc6_fW.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mime-IZf-LHIS.mjs +36 -0
- package/dist/mime-IZf-LHIS.mjs.map +1 -0
- package/dist/mode-nh0ppSX5.mjs +23 -0
- package/dist/mode-nh0ppSX5.mjs.map +1 -0
- package/dist/node-sqlite-compat-CDOEcc97.mjs +63 -0
- package/dist/node-sqlite-compat-CDOEcc97.mjs.map +1 -0
- package/dist/normalize-BuWa0lvd.mjs +191 -0
- package/dist/normalize-BuWa0lvd.mjs.map +1 -0
- package/dist/oauth-authorization-BcRdGojQ.mjs +274 -0
- package/dist/oauth-authorization-BcRdGojQ.mjs.map +1 -0
- package/dist/oauth-clients-C-8WDTqj.mjs +266 -0
- package/dist/oauth-clients-C-8WDTqj.mjs.map +1 -0
- package/dist/oauth-state-store-CM5ZEYQS.mjs +50 -0
- package/dist/oauth-state-store-CM5ZEYQS.mjs.map +1 -0
- package/dist/oauth-user-lookup-DrrqvTZC.mjs +26 -0
- package/dist/oauth-user-lookup-DrrqvTZC.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/object-cache-Bo6DGaC9.mjs +586 -0
- package/dist/object-cache-Bo6DGaC9.mjs.map +1 -0
- package/dist/options-C2IDQnD2.d.mts +81 -0
- package/dist/options-C2IDQnD2.d.mts.map +1 -0
- package/dist/ownership-DoeAIuTg.mjs +12 -0
- package/dist/ownership-DoeAIuTg.mjs.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +6 -6
- package/dist/parse-D5Sw9wAI.d.mts +172 -0
- package/dist/parse-D5Sw9wAI.d.mts.map +1 -0
- package/dist/parse-Gt2l4Sld.mjs +81 -0
- package/dist/parse-Gt2l4Sld.mjs.map +1 -0
- package/dist/passkey-config-CkQsrcU-.mjs +46 -0
- package/dist/passkey-config-CkQsrcU-.mjs.map +1 -0
- package/dist/paths-DiENGBx5.mjs +77 -0
- package/dist/paths-DiENGBx5.mjs.map +1 -0
- package/dist/patterns-DyZJ67I7.mjs +140 -0
- package/dist/patterns-DyZJ67I7.mjs.map +1 -0
- package/dist/placeholder-Cq5wLDCX.d.mts +306 -0
- package/dist/placeholder-Cq5wLDCX.d.mts.map +1 -0
- package/dist/plan-BxCS1tl5.mjs +135 -0
- package/dist/plan-BxCS1tl5.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.mjs +115 -111
- package/dist/plugin-types.d.mts +5 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-types.mjs.map +1 -1
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +48 -10
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/plugins/host.d.mts +6 -6
- package/dist/plugins/host.mjs +49 -44
- package/dist/plugins-BpLkXA1S.mjs +277 -0
- package/dist/plugins-BpLkXA1S.mjs.map +1 -0
- package/dist/policy-C1qpNxrr.mjs +45 -0
- package/dist/policy-C1qpNxrr.mjs.map +1 -0
- package/dist/portable-text-BnRuiR1-.mjs +307 -0
- package/dist/portable-text-BnRuiR1-.mjs.map +1 -0
- package/dist/preview-DU5rwz_m.mjs +107 -0
- package/dist/preview-DU5rwz_m.mjs.map +1 -0
- package/dist/protocol-B9GEhEyi.d.mts +61 -0
- package/dist/protocol-B9GEhEyi.d.mts.map +1 -0
- package/dist/public-submission-yZaTTfsC.mjs +250 -0
- package/dist/public-submission-yZaTTfsC.mjs.map +1 -0
- package/dist/public-url-B5a0QAh6.mjs +101 -0
- package/dist/public-url-B5a0QAh6.mjs.map +1 -0
- package/dist/query-6e2CQxUv.mjs +1161 -0
- package/dist/query-6e2CQxUv.mjs.map +1 -0
- package/dist/query-DC3bv__4.mjs +41 -0
- package/dist/query-DC3bv__4.mjs.map +1 -0
- package/dist/rate-limit-BXx3Ecp9.mjs +120 -0
- package/dist/rate-limit-BXx3Ecp9.mjs.map +1 -0
- package/dist/receipt-q1VK9jhj.mjs +43 -0
- package/dist/receipt-q1VK9jhj.mjs.map +1 -0
- package/dist/redirect-BvFKh8Sz.mjs +416 -0
- package/dist/redirect-BvFKh8Sz.mjs.map +1 -0
- package/dist/redirect-D1AmADlk.mjs +19 -0
- package/dist/redirect-D1AmADlk.mjs.map +1 -0
- package/dist/redirects-CWQMKYOS.mjs +446 -0
- package/dist/redirects-CWQMKYOS.mjs.map +1 -0
- package/dist/redirects-D4EWeXAo.mjs +148 -0
- package/dist/redirects-D4EWeXAo.mjs.map +1 -0
- package/dist/registry/testing.d.mts +16 -4
- package/dist/registry/testing.d.mts.map +1 -1
- package/dist/registry/testing.mjs +20 -10
- package/dist/registry/testing.mjs.map +1 -1
- package/dist/registry-CtHRqVe-.mjs +6771 -0
- package/dist/registry-CtHRqVe-.mjs.map +1 -0
- package/dist/relations-CVI2nbrn.mjs +776 -0
- package/dist/relations-CVI2nbrn.mjs.map +1 -0
- package/dist/request-cache-C4CIo5ad.mjs +104 -0
- package/dist/request-cache-C4CIo5ad.mjs.map +1 -0
- package/dist/request-context.d.mts +9 -1
- package/dist/request-context.d.mts.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/request-meta-B6blULFY.mjs +141 -0
- package/dist/request-meta-B6blULFY.mjs.map +1 -0
- package/dist/resolve-Cx0Pwz0-.mjs +100 -0
- package/dist/resolve-Cx0Pwz0-.mjs.map +1 -0
- package/dist/resolve-D-kqyKns.mjs +199 -0
- package/dist/resolve-D-kqyKns.mjs.map +1 -0
- package/dist/revision-CGkQA0e5.mjs +366 -0
- package/dist/revision-CGkQA0e5.mjs.map +1 -0
- package/dist/route-wire-DK600v4u.mjs +197 -0
- package/dist/route-wire-DK600v4u.mjs.map +1 -0
- package/dist/routes-DTduBPzX.mjs +272 -0
- package/dist/routes-DTduBPzX.mjs.map +1 -0
- package/dist/runner-CLpxmhl8.mjs +6197 -0
- package/dist/runner-CLpxmhl8.mjs.map +1 -0
- package/dist/runner-Ji7qyH2A.d.mts +68 -0
- package/dist/runner-Ji7qyH2A.d.mts.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -3
- package/dist/schema/project-env-types.d.mts +12 -0
- package/dist/schema/project-env-types.d.mts.map +1 -0
- package/dist/schema/project-env-types.mjs +86 -0
- package/dist/schema/project-env-types.mjs.map +1 -0
- package/dist/schema-BZPj3kwZ.mjs +13 -0
- package/dist/schema-BZPj3kwZ.mjs.map +1 -0
- package/dist/schema-Berj5VQx.mjs +815 -0
- package/dist/schema-Berj5VQx.mjs.map +1 -0
- package/dist/scopes-C1HJaIyf.mjs +34 -0
- package/dist/scopes-C1HJaIyf.mjs.map +1 -0
- package/dist/search-thYf8j9F.mjs +448 -0
- package/dist/search-thYf8j9F.mjs.map +1 -0
- package/dist/sections-2k1uIgJ0.mjs +346 -0
- package/dist/sections-2k1uIgJ0.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +39 -38
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +24 -23
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-C61bnPuV.mjs +114 -0
- package/dist/seo-C61bnPuV.mjs.map +1 -0
- package/dist/seo-DpYxmGaL.mjs +133 -0
- package/dist/seo-DpYxmGaL.mjs.map +1 -0
- package/dist/service-BFUImckH.mjs +150 -0
- package/dist/service-BFUImckH.mjs.map +1 -0
- package/dist/session-user-DVcHsFD5.mjs +61 -0
- package/dist/session-user-DVcHsFD5.mjs.map +1 -0
- package/dist/settings-B0zQj_Tj.mjs +61 -0
- package/dist/settings-B0zQj_Tj.mjs.map +1 -0
- package/dist/settings-BJjK_X7x.mjs +51 -0
- package/dist/settings-BJjK_X7x.mjs.map +1 -0
- package/dist/settings-BbVRRGDp.mjs +439 -0
- package/dist/settings-BbVRRGDp.mjs.map +1 -0
- package/dist/setup-complete-CuLcTDTU.mjs +65 -0
- package/dist/setup-complete-CuLcTDTU.mjs.map +1 -0
- package/dist/setup-nonce-CAQoY5PC.mjs +25 -0
- package/dist/setup-nonce-CAQoY5PC.mjs.map +1 -0
- package/dist/site-settings-AYFvhwQn.mjs +50 -0
- package/dist/site-settings-AYFvhwQn.mjs.map +1 -0
- package/dist/site-url-Ceq_AUK0.mjs +16 -0
- package/dist/site-url-Ceq_AUK0.mjs.map +1 -0
- package/dist/snapshot-Dzsn3NZa.mjs +414 -0
- package/dist/snapshot-Dzsn3NZa.mjs.map +1 -0
- package/dist/ssrf-DsmvZB80.mjs +406 -0
- package/dist/ssrf-DsmvZB80.mjs.map +1 -0
- package/dist/stage-Cf9PqdUB.mjs +662 -0
- package/dist/stage-Cf9PqdUB.mjs.map +1 -0
- package/dist/staged-Bw5eHbKS.mjs +686 -0
- package/dist/staged-Bw5eHbKS.mjs.map +1 -0
- package/dist/state-kGdOMQRY.mjs +153 -0
- package/dist/state-kGdOMQRY.mjs.map +1 -0
- package/dist/status-D39Fpy8R.mjs +30 -0
- package/dist/status-D39Fpy8R.mjs.map +1 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage-query-C9bK0Dg6.d.mts +1614 -0
- package/dist/storage-query-C9bK0Dg6.d.mts.map +1 -0
- package/dist/tar-lDI_fzLD.mjs +449 -0
- package/dist/tar-lDI_fzLD.mjs.map +1 -0
- package/dist/target-DOFs5oUC.mjs +27 -0
- package/dist/target-DOFs5oUC.mjs.map +1 -0
- package/dist/taxonomies-DQGomz9p.mjs +939 -0
- package/dist/taxonomies-DQGomz9p.mjs.map +1 -0
- package/dist/taxonomies-DWv-OYT0.mjs +697 -0
- package/dist/taxonomies-DWv-OYT0.mjs.map +1 -0
- package/dist/taxonomy-BesdHIwi.mjs +525 -0
- package/dist/taxonomy-BesdHIwi.mjs.map +1 -0
- package/dist/tokens-BIGxi8sP.mjs +171 -0
- package/dist/tokens-BIGxi8sP.mjs.map +1 -0
- package/dist/transaction-BVYIo_yu.mjs +29 -0
- package/dist/transaction-BVYIo_yu.mjs.map +1 -0
- package/dist/transfer-BtzoaXLk.mjs +166 -0
- package/dist/transfer-BtzoaXLk.mjs.map +1 -0
- package/dist/transfer-DLu_6AXL.mjs +8856 -0
- package/dist/transfer-DLu_6AXL.mjs.map +1 -0
- package/dist/transfer-download-b_PCrqJJ.mjs +33 -0
- package/dist/transfer-download-b_PCrqJJ.mjs.map +1 -0
- package/dist/transformations-DdnpSdeC.mjs +196 -0
- package/dist/transformations-DdnpSdeC.mjs.map +1 -0
- package/dist/transport-flR-Zmds.d.mts +42 -0
- package/dist/transport-flR-Zmds.d.mts.map +1 -0
- package/dist/transport-umzEbgYO.mjs +136 -0
- package/dist/transport-umzEbgYO.mjs.map +1 -0
- package/dist/trusted-proxy-BqfQFs6a.mjs +51 -0
- package/dist/trusted-proxy-BqfQFs6a.mjs.map +1 -0
- package/dist/turnstile-IvQp2uyD.mjs +53 -0
- package/dist/turnstile-IvQp2uyD.mjs.map +1 -0
- package/dist/types-2V_MVPYy.d.mts +125 -0
- package/dist/types-2V_MVPYy.d.mts.map +1 -0
- package/dist/types-B-WCvzdi.d.mts +198 -0
- package/dist/types-B-WCvzdi.d.mts.map +1 -0
- package/dist/types-BGmQ0uXs.mjs +201 -0
- package/dist/types-BGmQ0uXs.mjs.map +1 -0
- package/dist/types-CVsmpTcU.mjs +18 -0
- package/dist/types-CVsmpTcU.mjs.map +1 -0
- package/dist/types-C_V-_vMS.d.mts +198 -0
- package/dist/types-C_V-_vMS.d.mts.map +1 -0
- package/dist/types-CdEMurNh.mjs +77 -0
- package/dist/types-CdEMurNh.mjs.map +1 -0
- package/dist/types-CsmwbOwa.mjs +22 -0
- package/dist/types-CsmwbOwa.mjs.map +1 -0
- package/dist/types-Cw-1it3n.d.mts +287 -0
- package/dist/types-Cw-1it3n.d.mts.map +1 -0
- package/dist/types-D7B20WFC.d.mts +374 -0
- package/dist/types-D7B20WFC.d.mts.map +1 -0
- package/dist/types-DGw8KMX_.mjs +16 -0
- package/dist/types-DGw8KMX_.mjs.map +1 -0
- package/dist/types-DZeDpzMc.d.mts +896 -0
- package/dist/types-DZeDpzMc.d.mts.map +1 -0
- package/dist/types-DuQAIPA-.d.mts +363 -0
- package/dist/types-DuQAIPA-.d.mts.map +1 -0
- package/dist/types-edRPQchz.d.mts +85 -0
- package/dist/types-edRPQchz.d.mts.map +1 -0
- package/dist/types-j6MBDjlZ.mjs +103 -0
- package/dist/types-j6MBDjlZ.mjs.map +1 -0
- package/dist/types-pOLeFKGq.d.mts +1720 -0
- package/dist/types-pOLeFKGq.d.mts.map +1 -0
- package/dist/update-check-CaZyFHZC.mjs +161 -0
- package/dist/update-check-CaZyFHZC.mjs.map +1 -0
- package/dist/upload-attempts-BodUoFBu.mjs +32 -0
- package/dist/upload-attempts-BodUoFBu.mjs.map +1 -0
- package/dist/url-Dn3IStq8.mjs +104 -0
- package/dist/url-Dn3IStq8.mjs.map +1 -0
- package/dist/url-pattern-DGAG6ZP2.mjs +41 -0
- package/dist/url-pattern-DGAG6ZP2.mjs.map +1 -0
- package/dist/user-BOvuF1sQ.mjs +171 -0
- package/dist/user-BOvuF1sQ.mjs.map +1 -0
- package/dist/utils-CoV-PYhg.mjs +439 -0
- package/dist/utils-CoV-PYhg.mjs.map +1 -0
- package/dist/validate-WkjGwBSO.mjs +516 -0
- package/dist/validate-WkjGwBSO.mjs.map +1 -0
- package/dist/validate-dK97qe7F.d.mts +468 -0
- package/dist/validate-dK97qe7F.d.mts.map +1 -0
- package/dist/validation-D-ICq_tY.mjs +219 -0
- package/dist/validation-D-ICq_tY.mjs.map +1 -0
- package/dist/version-DbT04wbH.mjs +9 -0
- package/dist/version-DbT04wbH.mjs.map +1 -0
- package/dist/version-IneBU54o.mjs +7 -0
- package/dist/version-IneBU54o.mjs.map +1 -0
- package/dist/virtual-modules-Brh6mRVe.mjs +516 -0
- package/dist/virtual-modules-Brh6mRVe.mjs.map +1 -0
- package/dist/widgets-D8T0xBYs.mjs +126 -0
- package/dist/widgets-D8T0xBYs.mjs.map +1 -0
- package/dist/wxr-taxonomies-B6iE8m9I.d.mts +34 -0
- package/dist/wxr-taxonomies-B6iE8m9I.d.mts.map +1 -0
- package/dist/wxr-taxonomies-DEzR9N7e.mjs +453 -0
- package/dist/wxr-taxonomies-DEzR9N7e.mjs.map +1 -0
- package/dist/zod-generator-DnfG5sGQ.mjs +424 -0
- package/dist/zod-generator-DnfG5sGQ.mjs.map +1 -0
- package/package.json +13 -14
- package/src/api/errors.ts +11 -0
- package/src/api/handlers/bulk-tag.ts +4 -4
- package/src/api/handlers/content.ts +39 -17
- package/src/api/handlers/index.ts +3 -0
- package/src/api/handlers/manifest.ts +2 -0
- package/src/api/handlers/media-upload.ts +3 -0
- package/src/api/handlers/media.ts +2 -2
- package/src/api/handlers/registry.ts +123 -70
- package/src/api/handlers/revision.ts +10 -2
- package/src/api/handlers/staged-references.ts +72 -6
- package/src/api/handlers/update-check.ts +236 -0
- package/src/api/redirect.ts +9 -1
- package/src/api/schemas/content.ts +4 -0
- package/src/api/schemas/import.ts +50 -14
- package/src/api/schemas/schema.ts +12 -6
- package/src/api/setup-complete.ts +49 -1
- package/src/api/types.ts +4 -0
- package/src/astro/dev-typegen.ts +15 -22
- package/src/astro/integration/dev-typegen.ts +32 -3
- package/src/astro/integration/index.ts +88 -22
- package/src/astro/integration/routes.ts +6 -0
- package/src/astro/integration/runtime.ts +33 -7
- package/src/astro/integration/virtual-modules.ts +1 -0
- package/src/astro/integration/vite-config.ts +16 -8
- package/src/astro/middleware/redirect.ts +15 -2
- package/src/astro/middleware/request-context.ts +13 -6
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +11 -1
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +7 -1
- package/src/astro/routes/api/admin/bylines/index.ts +6 -1
- package/src/astro/routes/api/admin/core-update.ts +34 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +6 -2
- package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +6 -2
- package/src/astro/routes/api/auth/invite/complete.ts +4 -4
- package/src/astro/routes/api/auth/magic-link/verify.ts +4 -1
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +9 -4
- package/src/astro/routes/api/auth/passkey/verify.ts +4 -4
- package/src/astro/routes/api/auth/signup/complete.ts +4 -4
- package/src/astro/routes/api/import/wordpress/execute.ts +252 -6
- package/src/astro/routes/api/import/wordpress/prepare.ts +1 -2
- package/src/astro/routes/api/oauth/register.ts +22 -2
- package/src/astro/routes/api/revisions/[revisionId]/restore.ts +17 -1
- package/src/astro/routes/api/setup/admin-verify.ts +6 -5
- package/src/astro/routes/api/typegen.ts +4 -46
- package/src/astro/session-user.ts +14 -0
- package/src/astro/types.ts +6 -0
- package/src/bylines/credits.ts +149 -0
- package/src/bylines/index.ts +4 -142
- package/src/cli/commands/seed.ts +2 -0
- package/src/cli/credentials.ts +1 -60
- package/src/cli/index.ts +0 -2
- package/src/client/index.ts +8 -2
- package/src/components/Image.astro +24 -13
- package/src/components/InlinePortableTextEditor.tsx +25 -8
- package/src/content/converters/portable-text-to-prosemirror.ts +23 -17
- package/src/content/converters/prosemirror-to-portable-text.ts +16 -5
- package/src/content/converters/types.ts +1 -0
- package/src/database/content-datetime.ts +111 -23
- package/src/database/migrations/036_i18n_menus_and_taxonomies.ts +132 -92
- package/src/database/migrations/088_cron_oneshot_utc.ts +39 -0
- package/src/database/migrations/089_auto_seed_completion.ts +13 -0
- package/src/database/migrations/runner.ts +4 -0
- package/src/database/repositories/comment.ts +2 -2
- package/src/database/repositories/content.ts +15 -8
- package/src/database/repositories/plugin-storage.ts +1 -1
- package/src/database/repositories/redirect.ts +7 -2
- package/src/database/repositories/relation.ts +2 -2
- package/src/database/types.ts +1 -1
- package/src/db/node-sqlite-compat.ts +63 -37
- package/src/emdash-runtime.ts +63 -35
- package/src/import/wxr-taxonomies.ts +163 -88
- package/src/index.ts +10 -0
- package/src/loader.ts +8 -1
- package/src/mcp/server.ts +90 -8
- package/src/media/usage/activation.ts +18 -9
- package/src/migrations/config-loader.ts +5 -0
- package/src/object-cache/index.ts +19 -7
- package/src/object-cache/types.ts +3 -2
- package/src/plugin-types.ts +7 -0
- package/src/plugins/adapt-sandbox-entry.ts +47 -12
- package/src/plugins/byline-access.ts +158 -0
- package/src/plugins/context.ts +7 -1
- package/src/plugins/cron.ts +27 -4
- package/src/plugins/hooks.ts +47 -0
- package/src/plugins/host.ts +1 -0
- package/src/plugins/index.ts +10 -1
- package/src/plugins/manifest-schema.ts +5 -1
- package/src/plugins/marketplace.ts +48 -36
- package/src/plugins/sandbox/proxy.ts +1 -0
- package/src/plugins/types.ts +95 -0
- package/src/query.ts +9 -2
- package/src/redirects/cache.ts +11 -1
- package/src/redirects/destination.ts +20 -0
- package/src/redirects/loops.ts +10 -6
- package/src/redirects/patterns.ts +12 -30
- package/src/references/staged.ts +40 -0
- package/src/registry/testing.ts +59 -14
- package/src/request-context.ts +8 -0
- package/src/schema/block-type-registry.ts +1 -1
- package/src/schema/env-types.ts +37 -0
- package/src/schema/project-env-types.ts +41 -0
- package/src/schema/registry.ts +33 -2
- package/src/schema/types.ts +5 -0
- package/src/schema/url-pattern.ts +10 -0
- package/src/schema/zod-generator.ts +11 -1
- package/src/seed/apply.ts +34 -1
- package/src/seed/ownership.ts +15 -0
- package/src/seed/validate.ts +45 -2
- package/src/transfer/analyze/validate.ts +113 -1
- package/src/transfer/analyze/values.ts +104 -1
- package/src/transfer/analyze/write-rules.ts +8 -0
- package/src/utils/url.ts +58 -3
- package/src/virtual-modules.d.ts +3 -0
- package/dist/action-token-CbKDcPJi.mjs +0 -26
- package/dist/action-token-CbKDcPJi.mjs.map +0 -1
- package/dist/activation-PtniBLt9.mjs +0 -382
- package/dist/activation-PtniBLt9.mjs.map +0 -1
- package/dist/adapters-C_Tf5x90.d.mts +0 -171
- package/dist/adapters-C_Tf5x90.d.mts.map +0 -1
- package/dist/allowed-origins-U1z4TdEZ.mjs +0 -116
- package/dist/allowed-origins-U1z4TdEZ.mjs.map +0 -1
- package/dist/api-CXwQkV_m.mjs +0 -5122
- package/dist/api-CXwQkV_m.mjs.map +0 -1
- package/dist/api-tokens-89WlohEN.mjs +0 -166
- package/dist/api-tokens-89WlohEN.mjs.map +0 -1
- package/dist/apply-Do3KNnUk.mjs +0 -1659
- package/dist/apply-Do3KNnUk.mjs.map +0 -1
- package/dist/approvals-CAX9Yw33.mjs +0 -460
- package/dist/approvals-CAX9Yw33.mjs.map +0 -1
- package/dist/artifact-fetch-B9W4CEST.mjs +0 -659
- package/dist/artifact-fetch-B9W4CEST.mjs.map +0 -1
- package/dist/audit-CrgmE9LE.mjs +0 -127
- package/dist/audit-CrgmE9LE.mjs.map +0 -1
- package/dist/authoritative-records-C2YzIdbu.mjs +0 -5172
- package/dist/authoritative-records-C2YzIdbu.mjs.map +0 -1
- package/dist/authorize-WgdKF8QY.mjs +0 -49
- package/dist/authorize-WgdKF8QY.mjs.map +0 -1
- package/dist/backup-Ck8_lMO3.mjs +0 -246
- package/dist/backup-Ck8_lMO3.mjs.map +0 -1
- package/dist/block-types-BQ90asVI.mjs +0 -132
- package/dist/block-types-BQ90asVI.mjs.map +0 -1
- package/dist/block-values-ACFqgB1D.mjs +0 -175
- package/dist/block-values-ACFqgB1D.mjs.map +0 -1
- package/dist/bundle-Db1iNMv_.mjs +0 -667
- package/dist/bundle-Db1iNMv_.mjs.map +0 -1
- package/dist/byline-BayaYGoj.mjs +0 -909
- package/dist/byline-BayaYGoj.mjs.map +0 -1
- package/dist/byline-fields-B8HH-35f.mjs +0 -254
- package/dist/byline-fields-B8HH-35f.mjs.map +0 -1
- package/dist/byline-fields-hMPjf6Eu.mjs +0 -123
- package/dist/byline-fields-hMPjf6Eu.mjs.map +0 -1
- package/dist/byline-registry-B_EK_TQf.mjs +0 -406
- package/dist/byline-registry-B_EK_TQf.mjs.map +0 -1
- package/dist/bylines-DFAaFXWi.mjs +0 -214
- package/dist/bylines-DFAaFXWi.mjs.map +0 -1
- package/dist/bylines-DkIxUxmr.mjs +0 -232
- package/dist/bylines-DkIxUxmr.mjs.map +0 -1
- package/dist/cache-DkvhQ8XE.mjs +0 -108
- package/dist/cache-DkvhQ8XE.mjs.map +0 -1
- package/dist/canonical-CcSuuTlH.mjs +0 -174
- package/dist/canonical-CcSuuTlH.mjs.map +0 -1
- package/dist/capture-triggers-DJEoOTOq.mjs +0 -362
- package/dist/capture-triggers-DJEoOTOq.mjs.map +0 -1
- package/dist/challenge-store-CvBl81AQ.mjs +0 -51
- package/dist/challenge-store-CvBl81AQ.mjs.map +0 -1
- package/dist/checksum-CClweQzI.mjs +0 -162
- package/dist/checksum-CClweQzI.mjs.map +0 -1
- package/dist/chrome-tags-D5caJwwp.mjs +0 -24
- package/dist/chrome-tags-D5caJwwp.mjs.map +0 -1
- package/dist/chunks-DwBaj8aT.mjs +0 -25
- package/dist/chunks-DwBaj8aT.mjs.map +0 -1
- package/dist/collection-deletion-CLCdXsnV.mjs +0 -436
- package/dist/collection-deletion-CLCdXsnV.mjs.map +0 -1
- package/dist/collection-deletion-processor-hNw8x01F.mjs +0 -217
- package/dist/collection-deletion-processor-hNw8x01F.mjs.map +0 -1
- package/dist/collection-slugs-cache-CUuiduLq.mjs +0 -85
- package/dist/collection-slugs-cache-CUuiduLq.mjs.map +0 -1
- package/dist/comment-D2uvL63j.mjs +0 -313
- package/dist/comment-D2uvL63j.mjs.map +0 -1
- package/dist/comment-reaction-DevUuzg4.mjs +0 -85
- package/dist/comment-reaction-DevUuzg4.mjs.map +0 -1
- package/dist/comments-Cq0s7_hO.mjs +0 -195
- package/dist/comments-Cq0s7_hO.mjs.map +0 -1
- package/dist/comments-M4EDYAHw.mjs +0 -99
- package/dist/comments-M4EDYAHw.mjs.map +0 -1
- package/dist/components-CuIGwXMs.mjs +0 -108
- package/dist/components-CuIGwXMs.mjs.map +0 -1
- package/dist/config-52Ea5IWt.d.mts +0 -39
- package/dist/config-52Ea5IWt.d.mts.map +0 -1
- package/dist/config-CCz3xOLc.mjs +0 -242
- package/dist/config-CCz3xOLc.mjs.map +0 -1
- package/dist/config-D3d5Qudq.d.mts +0 -6669
- package/dist/config-D3d5Qudq.d.mts.map +0 -1
- package/dist/content-CbnufDsM.mjs +0 -2018
- package/dist/content-CbnufDsM.mjs.map +0 -1
- package/dist/content-list-query-D_7B1FE5.d.mts +0 -26
- package/dist/content-list-query-D_7B1FE5.d.mts.map +0 -1
- package/dist/content-policy-CYu6K1KB.mjs +0 -46
- package/dist/content-policy-CYu6K1KB.mjs.map +0 -1
- package/dist/content-repair-DlDUgFGp.mjs +0 -442
- package/dist/content-repair-DlDUgFGp.mjs.map +0 -1
- package/dist/context-CGQLA1-a.mjs +0 -1922
- package/dist/context-CGQLA1-a.mjs.map +0 -1
- package/dist/cron-c4D5C5Fx.mjs +0 -284
- package/dist/cron-c4D5C5Fx.mjs.map +0 -1
- package/dist/dashboard-CBq9kmOn.mjs +0 -151
- package/dist/dashboard-CBq9kmOn.mjs.map +0 -1
- package/dist/default-DPsys51U.mjs +0 -81
- package/dist/default-DPsys51U.mjs.map +0 -1
- package/dist/deferred-tasks-CZ7rzBdo.d.mts +0 -9
- package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +0 -1
- package/dist/dev-typegen-HRxwLRcT.mjs +0 -29
- package/dist/dev-typegen-HRxwLRcT.mjs.map +0 -1
- package/dist/device-flow-OcSqE9uY.mjs +0 -521
- package/dist/device-flow-OcSqE9uY.mjs.map +0 -1
- package/dist/digest-DVZ--cE9.mjs +0 -194
- package/dist/digest-DVZ--cE9.mjs.map +0 -1
- package/dist/direct-executor-DyjAqkpT.mjs +0 -104
- package/dist/direct-executor-DyjAqkpT.mjs.map +0 -1
- package/dist/dist-FPR93_xf.mjs +0 -810
- package/dist/dist-FPR93_xf.mjs.map +0 -1
- package/dist/email-console-DyQIgEnz.mjs +0 -50
- package/dist/email-console-DyQIgEnz.mjs.map +0 -1
- package/dist/email-locale-BYb16rVd.mjs +0 -25
- package/dist/email-locale-BYb16rVd.mjs.map +0 -1
- package/dist/emdash-runtime-CrzxJFmF.mjs +0 -4214
- package/dist/emdash-runtime-CrzxJFmF.mjs.map +0 -1
- package/dist/enrich-DBtCncE2.mjs +0 -194
- package/dist/enrich-DBtCncE2.mjs.map +0 -1
- package/dist/entry-lock-BN5y4YbO.d.mts +0 -4481
- package/dist/entry-lock-BN5y4YbO.d.mts.map +0 -1
- package/dist/entry-lock-BaRBHCsH.mjs +0 -1173
- package/dist/entry-lock-BaRBHCsH.mjs.map +0 -1
- package/dist/entry-lock-C6NcnZPV.mjs +0 -163
- package/dist/entry-lock-C6NcnZPV.mjs.map +0 -1
- package/dist/entry-locks-BTyQLdbC.mjs +0 -167
- package/dist/entry-locks-BTyQLdbC.mjs.map +0 -1
- package/dist/error-BfsNNrIE.mjs +0 -90
- package/dist/error-BfsNNrIE.mjs.map +0 -1
- package/dist/errors-BN1QAnEY.mjs +0 -460
- package/dist/errors-BN1QAnEY.mjs.map +0 -1
- package/dist/errors-Bt3goF8I.mjs +0 -120
- package/dist/errors-Bt3goF8I.mjs.map +0 -1
- package/dist/escape-BveidMa2.mjs +0 -9
- package/dist/escape-BveidMa2.mjs.map +0 -1
- package/dist/fence-Bb_IbCxI.mjs +0 -162
- package/dist/fence-Bb_IbCxI.mjs.map +0 -1
- package/dist/field-defs-cache-CsZctvbu.mjs +0 -77
- package/dist/field-defs-cache-CsZctvbu.mjs.map +0 -1
- package/dist/field-map-6m9rF49t.mjs +0 -83
- package/dist/field-map-6m9rF49t.mjs.map +0 -1
- package/dist/focal-point-CZ3d1wK5.mjs +0 -23
- package/dist/focal-point-CZ3d1wK5.mjs.map +0 -1
- package/dist/fts-manager-CCaZTp8y.mjs +0 -443
- package/dist/fts-manager-CCaZTp8y.mjs.map +0 -1
- package/dist/gc-xowRjczI.mjs +0 -75
- package/dist/gc-xowRjczI.mjs.map +0 -1
- package/dist/hash-COVK27Pc.mjs +0 -37
- package/dist/hash-COVK27Pc.mjs.map +0 -1
- package/dist/hook-result-CYSk0XFe.d.mts +0 -31
- package/dist/hook-result-CYSk0XFe.d.mts.map +0 -1
- package/dist/hreflang-CChPV7jx.mjs +0 -105
- package/dist/hreflang-CChPV7jx.mjs.map +0 -1
- package/dist/hreflang-DRslq3QI.d.mts +0 -50
- package/dist/hreflang-DRslq3QI.d.mts.map +0 -1
- package/dist/http-route-dispatch-CAdp2onn.mjs +0 -339
- package/dist/http-route-dispatch-CAdp2onn.mjs.map +0 -1
- package/dist/identity-NVTOOQyq.mjs +0 -35
- package/dist/identity-NVTOOQyq.mjs.map +0 -1
- package/dist/import-wpSO2N0x.mjs +0 -2020
- package/dist/import-wpSO2N0x.mjs.map +0 -1
- package/dist/index-CDs2wq4X.d.mts +0 -623
- package/dist/index-CDs2wq4X.d.mts.map +0 -1
- package/dist/install-finalization-D9R9R-W8.mjs +0 -58
- package/dist/install-finalization-D9R9R-W8.mjs.map +0 -1
- package/dist/keys-Bck6LBfF.mjs +0 -61
- package/dist/keys-Bck6LBfF.mjs.map +0 -1
- package/dist/kinds-CYmRESWj.mjs +0 -974
- package/dist/kinds-CYmRESWj.mjs.map +0 -1
- package/dist/lifecycle-C815ZQfV.mjs +0 -25
- package/dist/lifecycle-C815ZQfV.mjs.map +0 -1
- package/dist/load-D99axixL.mjs +0 -28
- package/dist/load-D99axixL.mjs.map +0 -1
- package/dist/loader-CrRPfkHS.mjs +0 -1197
- package/dist/loader-CrRPfkHS.mjs.map +0 -1
- package/dist/loops-DMKlygqX.mjs +0 -203
- package/dist/loops-DMKlygqX.mjs.map +0 -1
- package/dist/manifest-builder-BQzCHNgB.mjs +0 -189
- package/dist/manifest-builder-BQzCHNgB.mjs.map +0 -1
- package/dist/manifest-schema-Ci2gmd0u.mjs +0 -492
- package/dist/manifest-schema-Ci2gmd0u.mjs.map +0 -1
- package/dist/media-BUQePMxP.mjs +0 -373
- package/dist/media-BUQePMxP.mjs.map +0 -1
- package/dist/media-DH8ibNlY.mjs +0 -294
- package/dist/media-DH8ibNlY.mjs.map +0 -1
- package/dist/media-OEIQ3bVc.mjs +0 -408
- package/dist/media-OEIQ3bVc.mjs.map +0 -1
- package/dist/media-allowlist-pYtaBA95.mjs +0 -44
- package/dist/media-allowlist-pYtaBA95.mjs.map +0 -1
- package/dist/media-folders-Bf8_s4de.mjs +0 -210
- package/dist/media-folders-Bf8_s4de.mjs.map +0 -1
- package/dist/media-url-C6klEuNd.mjs +0 -43
- package/dist/media-url-C6klEuNd.mjs.map +0 -1
- package/dist/media-usage-D7Y64m6v.mjs +0 -1629
- package/dist/media-usage-D7Y64m6v.mjs.map +0 -1
- package/dist/media-usage-activation-DrqbmgLA.mjs +0 -78
- package/dist/media-usage-activation-DrqbmgLA.mjs.map +0 -1
- package/dist/media-usage-work-DommYhYA.mjs +0 -152
- package/dist/media-usage-work-DommYhYA.mjs.map +0 -1
- package/dist/media-usage-work-HU63hNDu.mjs +0 -586
- package/dist/media-usage-work-HU63hNDu.mjs.map +0 -1
- package/dist/menus-BQfusWEC.mjs +0 -3608
- package/dist/menus-BQfusWEC.mjs.map +0 -1
- package/dist/menus-BtwjQt5s.mjs +0 -753
- package/dist/menus-BtwjQt5s.mjs.map +0 -1
- package/dist/menus-p_M1V7J_.mjs +0 -139
- package/dist/menus-p_M1V7J_.mjs.map +0 -1
- package/dist/mime-C94qBG-P.mjs +0 -36
- package/dist/mime-C94qBG-P.mjs.map +0 -1
- package/dist/mode-DpYW3w6U.mjs +0 -23
- package/dist/mode-DpYW3w6U.mjs.map +0 -1
- package/dist/node-sqlite-compat-pWFw0lcc.mjs +0 -46
- package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +0 -1
- package/dist/normalize-DduyxBjf.mjs +0 -191
- package/dist/normalize-DduyxBjf.mjs.map +0 -1
- package/dist/oauth-authorization-DAXsH1H9.mjs +0 -274
- package/dist/oauth-authorization-DAXsH1H9.mjs.map +0 -1
- package/dist/oauth-clients-DENiDQri.mjs +0 -266
- package/dist/oauth-clients-DENiDQri.mjs.map +0 -1
- package/dist/oauth-state-store-y8mEYVq9.mjs +0 -50
- package/dist/oauth-state-store-y8mEYVq9.mjs.map +0 -1
- package/dist/oauth-user-lookup-CtTYAy-O.mjs +0 -26
- package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +0 -1
- package/dist/object-cache-CqWNY5uP.mjs +0 -582
- package/dist/object-cache-CqWNY5uP.mjs.map +0 -1
- package/dist/options-BYa1FgIM.d.mts +0 -81
- package/dist/options-BYa1FgIM.d.mts.map +0 -1
- package/dist/parse-CORGGhHf.mjs +0 -81
- package/dist/parse-CORGGhHf.mjs.map +0 -1
- package/dist/parse-avNM1xWV.d.mts +0 -168
- package/dist/parse-avNM1xWV.d.mts.map +0 -1
- package/dist/passkey-config-Dih5YeIS.mjs +0 -46
- package/dist/passkey-config-Dih5YeIS.mjs.map +0 -1
- package/dist/paths-d51RFm8M.mjs +0 -77
- package/dist/paths-d51RFm8M.mjs.map +0 -1
- package/dist/patterns-CoqlXUvk.mjs +0 -145
- package/dist/patterns-CoqlXUvk.mjs.map +0 -1
- package/dist/placeholder-D2aksPMF.d.mts +0 -306
- package/dist/placeholder-D2aksPMF.d.mts.map +0 -1
- package/dist/plan-DqeZKuaR.mjs +0 -135
- package/dist/plan-DqeZKuaR.mjs.map +0 -1
- package/dist/plugins-Bb7oqjQA.mjs +0 -277
- package/dist/plugins-Bb7oqjQA.mjs.map +0 -1
- package/dist/policy-BcEqut3n.mjs +0 -45
- package/dist/policy-BcEqut3n.mjs.map +0 -1
- package/dist/portable-text-DXE8ymtD.mjs +0 -307
- package/dist/portable-text-DXE8ymtD.mjs.map +0 -1
- package/dist/preview-DEDWbwA_.mjs +0 -107
- package/dist/preview-DEDWbwA_.mjs.map +0 -1
- package/dist/protocol-BJbTzvwl.d.mts +0 -61
- package/dist/protocol-BJbTzvwl.d.mts.map +0 -1
- package/dist/public-submission-D9c9S14m.mjs +0 -250
- package/dist/public-submission-D9c9S14m.mjs.map +0 -1
- package/dist/public-url-CIRe-2T6.mjs +0 -101
- package/dist/public-url-CIRe-2T6.mjs.map +0 -1
- package/dist/query-BzifXlPS.mjs +0 -1156
- package/dist/query-BzifXlPS.mjs.map +0 -1
- package/dist/query-OzMJ6vJP.mjs +0 -41
- package/dist/query-OzMJ6vJP.mjs.map +0 -1
- package/dist/rate-limit-Csp60Vik.mjs +0 -120
- package/dist/rate-limit-Csp60Vik.mjs.map +0 -1
- package/dist/receipt-B-aU4hpJ.mjs +0 -43
- package/dist/receipt-B-aU4hpJ.mjs.map +0 -1
- package/dist/redirect-CDSw1sU3.mjs +0 -17
- package/dist/redirect-CDSw1sU3.mjs.map +0 -1
- package/dist/redirect-D1ArbO85.mjs +0 -411
- package/dist/redirect-D1ArbO85.mjs.map +0 -1
- package/dist/redirects-BjTwDTsV.mjs +0 -148
- package/dist/redirects-BjTwDTsV.mjs.map +0 -1
- package/dist/redirects-Ck50kH3n.mjs +0 -446
- package/dist/redirects-Ck50kH3n.mjs.map +0 -1
- package/dist/registry-CFcNCayZ.mjs +0 -6754
- package/dist/registry-CFcNCayZ.mjs.map +0 -1
- package/dist/relations-Cfaa1fDl.mjs +0 -776
- package/dist/relations-Cfaa1fDl.mjs.map +0 -1
- package/dist/request-cache-iHRlHx1d.mjs +0 -104
- package/dist/request-cache-iHRlHx1d.mjs.map +0 -1
- package/dist/request-meta-D47mqyev.mjs +0 -141
- package/dist/request-meta-D47mqyev.mjs.map +0 -1
- package/dist/resolve-BPE8sMvx.mjs +0 -99
- package/dist/resolve-BPE8sMvx.mjs.map +0 -1
- package/dist/resolve-C0s1E_fH.mjs +0 -199
- package/dist/resolve-C0s1E_fH.mjs.map +0 -1
- package/dist/revision-j1p4-bOj.mjs +0 -302
- package/dist/revision-j1p4-bOj.mjs.map +0 -1
- package/dist/route-wire-C9PJV9aL.mjs +0 -197
- package/dist/route-wire-C9PJV9aL.mjs.map +0 -1
- package/dist/routes-lyYw0mMf.mjs +0 -272
- package/dist/routes-lyYw0mMf.mjs.map +0 -1
- package/dist/runner-B3eyB9Gb.mjs +0 -6121
- package/dist/runner-B3eyB9Gb.mjs.map +0 -1
- package/dist/runner-DoYH2Jcu.d.mts +0 -68
- package/dist/runner-DoYH2Jcu.d.mts.map +0 -1
- package/dist/schema-BAayK46S.mjs +0 -13
- package/dist/schema-BAayK46S.mjs.map +0 -1
- package/dist/schema-Gqcl-8G4.mjs +0 -815
- package/dist/schema-Gqcl-8G4.mjs.map +0 -1
- package/dist/scopes-BqPOKoKf.mjs +0 -34
- package/dist/scopes-BqPOKoKf.mjs.map +0 -1
- package/dist/search-YJKPIEV6.mjs +0 -448
- package/dist/search-YJKPIEV6.mjs.map +0 -1
- package/dist/sections-BR_e-wK5.mjs +0 -346
- package/dist/sections-BR_e-wK5.mjs.map +0 -1
- package/dist/seo-Dsj8hy3j.mjs +0 -114
- package/dist/seo-Dsj8hy3j.mjs.map +0 -1
- package/dist/seo-XvH4LNNp.mjs +0 -133
- package/dist/seo-XvH4LNNp.mjs.map +0 -1
- package/dist/service-BsVG05gS.mjs +0 -150
- package/dist/service-BsVG05gS.mjs.map +0 -1
- package/dist/session-user-DgKbYrlj.mjs +0 -51
- package/dist/session-user-DgKbYrlj.mjs.map +0 -1
- package/dist/settings-CNPUntkh.mjs +0 -51
- package/dist/settings-CNPUntkh.mjs.map +0 -1
- package/dist/settings-D5EHi0Tk.mjs +0 -439
- package/dist/settings-D5EHi0Tk.mjs.map +0 -1
- package/dist/settings-DSfE7wOa.mjs +0 -61
- package/dist/settings-DSfE7wOa.mjs.map +0 -1
- package/dist/setup-complete-B8W8sJ9v.mjs +0 -26
- package/dist/setup-complete-B8W8sJ9v.mjs.map +0 -1
- package/dist/setup-nonce-DnSBP260.mjs +0 -25
- package/dist/setup-nonce-DnSBP260.mjs.map +0 -1
- package/dist/site-settings-NGzdrt7O.mjs +0 -50
- package/dist/site-settings-NGzdrt7O.mjs.map +0 -1
- package/dist/site-url-D6JB7tLW.mjs +0 -16
- package/dist/site-url-D6JB7tLW.mjs.map +0 -1
- package/dist/snapshot-CdcwwWAf.mjs +0 -414
- package/dist/snapshot-CdcwwWAf.mjs.map +0 -1
- package/dist/ssrf-Dv0_tRpo.mjs +0 -406
- package/dist/ssrf-Dv0_tRpo.mjs.map +0 -1
- package/dist/stage-CUjhED3P.mjs +0 -662
- package/dist/stage-CUjhED3P.mjs.map +0 -1
- package/dist/staged-C36IWXff.mjs +0 -659
- package/dist/staged-C36IWXff.mjs.map +0 -1
- package/dist/state-CKouMCSY.mjs +0 -153
- package/dist/state-CKouMCSY.mjs.map +0 -1
- package/dist/status-lzyj4Uu7.mjs +0 -30
- package/dist/status-lzyj4Uu7.mjs.map +0 -1
- package/dist/storage-query-B-cWcTjJ.d.mts +0 -1594
- package/dist/storage-query-B-cWcTjJ.d.mts.map +0 -1
- package/dist/tar-DsTXX6ch.mjs +0 -449
- package/dist/tar-DsTXX6ch.mjs.map +0 -1
- package/dist/target-DLQCwp_Z.mjs +0 -27
- package/dist/target-DLQCwp_Z.mjs.map +0 -1
- package/dist/taxonomies-BlAjr4BL.mjs +0 -697
- package/dist/taxonomies-BlAjr4BL.mjs.map +0 -1
- package/dist/taxonomies-Byyo7LOZ.mjs +0 -939
- package/dist/taxonomies-Byyo7LOZ.mjs.map +0 -1
- package/dist/taxonomy-CKDwM61Y.mjs +0 -525
- package/dist/taxonomy-CKDwM61Y.mjs.map +0 -1
- package/dist/tokens-BojXlk49.mjs +0 -171
- package/dist/tokens-BojXlk49.mjs.map +0 -1
- package/dist/transaction-DLPQWik1.mjs +0 -29
- package/dist/transaction-DLPQWik1.mjs.map +0 -1
- package/dist/transfer-XSTh2BCr.mjs +0 -8706
- package/dist/transfer-XSTh2BCr.mjs.map +0 -1
- package/dist/transfer-download-DkoCDA9d.mjs +0 -33
- package/dist/transfer-download-DkoCDA9d.mjs.map +0 -1
- package/dist/transfer-iQ26J-RT.mjs +0 -166
- package/dist/transfer-iQ26J-RT.mjs.map +0 -1
- package/dist/transformations-C7RQabKQ.mjs +0 -196
- package/dist/transformations-C7RQabKQ.mjs.map +0 -1
- package/dist/transport-D3RulfD6.mjs +0 -136
- package/dist/transport-D3RulfD6.mjs.map +0 -1
- package/dist/transport-DhlZlf4D.d.mts +0 -42
- package/dist/transport-DhlZlf4D.d.mts.map +0 -1
- package/dist/trusted-proxy-B6ECOZJc.mjs +0 -51
- package/dist/trusted-proxy-B6ECOZJc.mjs.map +0 -1
- package/dist/turnstile-lqUiY7lP.mjs +0 -53
- package/dist/turnstile-lqUiY7lP.mjs.map +0 -1
- package/dist/types-4Dn9bZhu.mjs +0 -77
- package/dist/types-4Dn9bZhu.mjs.map +0 -1
- package/dist/types-5LSo7PPx.d.mts +0 -85
- package/dist/types-5LSo7PPx.d.mts.map +0 -1
- package/dist/types-BQ3hwYJT.d.mts +0 -896
- package/dist/types-BQ3hwYJT.d.mts.map +0 -1
- package/dist/types-BYEk7qo3.d.mts +0 -198
- package/dist/types-BYEk7qo3.d.mts.map +0 -1
- package/dist/types-CJKsWVFR.mjs +0 -199
- package/dist/types-CJKsWVFR.mjs.map +0 -1
- package/dist/types-Ca_w8mmY.d.mts +0 -363
- package/dist/types-Ca_w8mmY.d.mts.map +0 -1
- package/dist/types-CkE41ZAG.mjs +0 -18
- package/dist/types-CkE41ZAG.mjs.map +0 -1
- package/dist/types-D0aJW2uR.d.mts +0 -1641
- package/dist/types-D0aJW2uR.d.mts.map +0 -1
- package/dist/types-DbpN4Qto.d.mts +0 -372
- package/dist/types-DbpN4Qto.d.mts.map +0 -1
- package/dist/types-ILDI1sdY.mjs +0 -16
- package/dist/types-ILDI1sdY.mjs.map +0 -1
- package/dist/types-OC5c-edM.mjs +0 -22
- package/dist/types-OC5c-edM.mjs.map +0 -1
- package/dist/types-aOOxRSx6.mjs +0 -103
- package/dist/types-aOOxRSx6.mjs.map +0 -1
- package/dist/types-m1WbUffD.d.mts +0 -198
- package/dist/types-m1WbUffD.d.mts.map +0 -1
- package/dist/types-uxLoPBio.d.mts +0 -124
- package/dist/types-uxLoPBio.d.mts.map +0 -1
- package/dist/types-we5uR-tV.d.mts +0 -287
- package/dist/types-we5uR-tV.d.mts.map +0 -1
- package/dist/upload-attempts-DduMy6B0.mjs +0 -32
- package/dist/upload-attempts-DduMy6B0.mjs.map +0 -1
- package/dist/url-pattern-B3EwxAAk.mjs +0 -33
- package/dist/url-pattern-B3EwxAAk.mjs.map +0 -1
- package/dist/user-ElwQjTQT.mjs +0 -171
- package/dist/user-ElwQjTQT.mjs.map +0 -1
- package/dist/utils-BlAXmfOG.mjs +0 -439
- package/dist/utils-BlAXmfOG.mjs.map +0 -1
- package/dist/validate-CH0X5b2c.d.mts +0 -468
- package/dist/validate-CH0X5b2c.d.mts.map +0 -1
- package/dist/validate-CfgRpcjA.mjs +0 -492
- package/dist/validate-CfgRpcjA.mjs.map +0 -1
- package/dist/validation-DvYJtv4k.mjs +0 -218
- package/dist/validation-DvYJtv4k.mjs.map +0 -1
- package/dist/version-DgYjhTud.mjs +0 -9
- package/dist/version-DgYjhTud.mjs.map +0 -1
- package/dist/version-Dq71scUb.mjs +0 -7
- package/dist/version-Dq71scUb.mjs.map +0 -1
- package/dist/widgets-ChFIj0be.mjs +0 -126
- package/dist/widgets-ChFIj0be.mjs.map +0 -1
- package/dist/wxr-taxonomies-CBZMp2YX.mjs +0 -372
- package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +0 -1
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts +0 -34
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +0 -1
- package/dist/zod-generator-DmTKI-Ig.mjs +0 -426
- package/dist/zod-generator-DmTKI-Ig.mjs.map +0 -1
- package/src/cli/commands/bundle-utils.ts +0 -408
- package/src/cli/commands/bundle.ts +0 -659
- package/src/cli/commands/plugin-init.ts +0 -417
- package/src/cli/commands/plugin-validate.ts +0 -31
- package/src/cli/commands/plugin.ts +0 -33
- package/src/cli/commands/publish.ts +0 -721
- /package/dist/{api-tokens-FaG1zPsj.mjs → api-tokens-BLz2MtQs.mjs} +0 -0
- /package/dist/{ssrf-DZOt8Qof.mjs → ssrf-tA45vIPX.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/media.ts"],"sourcesContent":["/**\n * WordPress media import endpoint\n *\n * POST /_emdash/api/import/wordpress/media\n *\n * Downloads media attachments from WordPress URLs and uploads to EmDash storage.\n * Streams progress updates as newline-delimited JSON (NDJSON).\n * Each line is either a progress update or the final result.\n */\n\nimport * as path from \"node:path\";\n\nimport type { APIRoute } from \"astro\";\nimport { MediaRepository, computeContentHash } from \"emdash\";\nimport mime from \"mime/lite\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpMediaImportBody } from \"#api/schemas.js\";\nimport { validateExternalUrl, ssrfSafeFetch, SsrfError } from \"#import/ssrf.js\";\nimport { enrichImageMetadata } from \"#media/enrich.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport type { AttachmentInfo } from \"./analyze.js\";\n\nexport const prerender = false;\n\n/** Progress update sent during streaming */\nexport interface MediaImportProgress {\n\ttype: \"progress\";\n\tcurrent: number;\n\ttotal: number;\n\tfilename?: string;\n\tstatus: \"downloading\" | \"uploading\" | \"done\" | \"skipped\" | \"failed\";\n\terror?: string;\n}\n\n/** Final result sent at end of stream */\nexport interface MediaImportResult {\n\ttype?: \"result\";\n\t/** Successfully imported items */\n\timported: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\tnewUrl: string;\n\t\tmediaId: string;\n\t}>;\n\t/** Failed items */\n\tfailed: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\terror: string;\n\t}>;\n\t/** Map of old URLs to new URLs (for content rewriting) */\n\turlMap: Record<string, string>;\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\tif (!emdash?.storage) {\n\t\treturn apiError(\"NO_STORAGE\", \"Storage not configured. Media import requires storage.\", 501);\n\t}\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NO_DB\", \"Database not initialized\", 500);\n\t}\n\n\ttry {\n\t\tconst body = await parseBody(request, wpMediaImportBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst attachments = body.attachments as AttachmentInfo[];\n\n\t\t// Check if streaming is requested (default: true)\n\t\tconst shouldStream = body.stream !== false;\n\n\t\tif (shouldStream) {\n\t\t\t// Stream progress updates as NDJSON\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tasync start(controller) {\n\t\t\t\t\tconst encoder = new TextEncoder();\n\t\t\t\t\tconst sendProgress = (progress: MediaImportProgress) => {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify(progress) + \"\\n\"));\n\t\t\t\t\t};\n\n\t\t\t\t\tconst result = await importMediaWithProgress(\n\t\t\t\t\t\tattachments,\n\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\temdash.storage,\n\t\t\t\t\t\tsendProgress,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Send final result\n\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify({ ...result, type: \"result\" }) + \"\\n\"));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn new Response(stream, {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-ndjson\",\n\t\t\t\t\t\"Cache-Control\": \"private, no-store\",\n\t\t\t\t\t\"Transfer-Encoding\": \"chunked\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Non-streaming mode\n\t\tconst result = await importMediaWithProgress(\n\t\t\tattachments,\n\t\t\temdash.db,\n\t\t\temdash.storage,\n\t\t\t() => {}, // No-op progress callback\n\t\t);\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import media\", \"IMPORT_ERROR\");\n\t}\n};\n\nexport async function importMediaWithProgress(\n\tattachments: AttachmentInfo[],\n\tdb: NonNullable<EmDashHandlers[\"db\"]>,\n\tstorage: NonNullable<EmDashHandlers[\"storage\"]>,\n\tonProgress: (progress: MediaImportProgress) => void,\n): Promise<MediaImportResult> {\n\tconst repo = new MediaRepository(db);\n\tconst total = attachments.length;\n\n\tconst result: MediaImportResult = {\n\t\timported: [],\n\t\tfailed: [],\n\t\turlMap: {},\n\t};\n\n\tfor (let i = 0; i < attachments.length; i++) {\n\t\tconst attachment = attachments[i];\n\t\tconst current = i + 1;\n\t\tconst filename = attachment.filename || `file-${attachment.id}`;\n\n\t\tif (!attachment.url) {\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: \"\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// SSRF: validate URL before fetching\n\t\t\ttry {\n\t\t\t\tvalidateExternalUrl(attachment.url);\n\t\t\t} catch (e) {\n\t\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report downloading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"downloading\",\n\t\t\t});\n\n\t\t\t// Download from WordPress (ssrfSafeFetch re-validates redirect targets)\n\t\t\tconst response = await ssrfSafeFetch(attachment.url, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": \"EmDash-Importer/1.0\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `HTTP ${response.status}: ${response.statusText}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `HTTP ${response.status}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get content type from response or guess from filename\n\t\t\tconst contentType =\n\t\t\t\tresponse.headers.get(\"content-type\") || attachment.mimeType || \"application/octet-stream\";\n\n\t\t\t// Get the file data\n\t\t\tconst buffer = await response.arrayBuffer();\n\t\t\tconst size = buffer.byteLength;\n\n\t\t\t// Compute content hash for deduplication\n\t\t\tconst contentHash = await computeContentHash(buffer);\n\n\t\t\t// Check if we already have this exact content\n\t\t\tconst existing = await repo.findByContentHash(contentHash);\n\t\t\tif (existing) {\n\t\t\t\t// Same content already exists - reuse it\n\t\t\t\tconst existingUrl = `/_emdash/api/media/file/${existing.storageKey}`;\n\t\t\t\tresult.urlMap[attachment.url] = existingUrl;\n\t\t\t\tresult.imported.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\tnewUrl: existingUrl,\n\t\t\t\t\tmediaId: existing.id,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"skipped\",\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report uploading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"uploading\",\n\t\t\t});\n\n\t\t\t// Generate storage key\n\t\t\tconst id = ulid();\n\t\t\tconst ext = attachment.filename\n\t\t\t\t? path.extname(attachment.filename)\n\t\t\t\t: getExtensionFromMimeType(contentType);\n\t\t\tconst storageKey = `${id}${ext}`;\n\n\t\t\t// Upload to storage\n\t\t\tawait storage.upload({\n\t\t\t\tkey: storageKey,\n\t\t\t\tbody: new Uint8Array(buffer),\n\t\t\t\tcontentType,\n\t\t\t});\n\n\t\t\t// Derive dimensions + LQIP placeholders (no-op for non-images).\n\t\t\tconst enriched = await enrichImageMetadata(new Uint8Array(buffer), contentType);\n\n\t\t\t// Create media record with content hash\n\t\t\tconst mediaItem = await repo.create({\n\t\t\t\tfilename: attachment.filename || `media-${attachment.id}${ext}`,\n\t\t\t\tmimeType: contentType,\n\t\t\t\tsize,\n\t\t\t\tstorageKey,\n\t\t\t\tcontentHash,\n\t\t\t\twidth: enriched.width,\n\t\t\t\theight: enriched.height,\n\t\t\t\tblurhash: enriched.blurhash,\n\t\t\t\tdominantColor: enriched.dominantColor,\n\t\t\t});\n\n\t\t\t// Build the new URL\n\t\t\tconst newUrl = `/_emdash/api/media/file/${storageKey}`;\n\n\t\t\tresult.imported.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\tnewUrl,\n\t\t\t\tmediaId: mediaItem.id,\n\t\t\t});\n\n\t\t\t// Add to URL map\n\t\t\tresult.urlMap[attachment.url] = newUrl;\n\n\t\t\t// Report done\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"done\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(`Media import error for \"${filename}\":`, error);\n\t\t\tconst errorMsg = \"Failed to import media\";\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction getExtensionFromMimeType(mimeType: string): string {\n\tconst ext = mime.getExtension(mimeType);\n\treturn ext ? `.${ext}` : \"\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/media.ts"],"sourcesContent":["/**\n * WordPress media import endpoint\n *\n * POST /_emdash/api/import/wordpress/media\n *\n * Downloads media attachments from WordPress URLs and uploads to EmDash storage.\n * Streams progress updates as newline-delimited JSON (NDJSON).\n * Each line is either a progress update or the final result.\n */\n\nimport * as path from \"node:path\";\n\nimport type { APIRoute } from \"astro\";\nimport { MediaRepository, computeContentHash } from \"emdash\";\nimport mime from \"mime/lite\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpMediaImportBody } from \"#api/schemas.js\";\nimport { validateExternalUrl, ssrfSafeFetch, SsrfError } from \"#import/ssrf.js\";\nimport { enrichImageMetadata } from \"#media/enrich.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport type { AttachmentInfo } from \"./analyze.js\";\n\nexport const prerender = false;\n\n/** Progress update sent during streaming */\nexport interface MediaImportProgress {\n\ttype: \"progress\";\n\tcurrent: number;\n\ttotal: number;\n\tfilename?: string;\n\tstatus: \"downloading\" | \"uploading\" | \"done\" | \"skipped\" | \"failed\";\n\terror?: string;\n}\n\n/** Final result sent at end of stream */\nexport interface MediaImportResult {\n\ttype?: \"result\";\n\t/** Successfully imported items */\n\timported: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\tnewUrl: string;\n\t\tmediaId: string;\n\t}>;\n\t/** Failed items */\n\tfailed: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\terror: string;\n\t}>;\n\t/** Map of old URLs to new URLs (for content rewriting) */\n\turlMap: Record<string, string>;\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\tif (!emdash?.storage) {\n\t\treturn apiError(\"NO_STORAGE\", \"Storage not configured. Media import requires storage.\", 501);\n\t}\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NO_DB\", \"Database not initialized\", 500);\n\t}\n\n\ttry {\n\t\tconst body = await parseBody(request, wpMediaImportBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst attachments = body.attachments as AttachmentInfo[];\n\n\t\t// Check if streaming is requested (default: true)\n\t\tconst shouldStream = body.stream !== false;\n\n\t\tif (shouldStream) {\n\t\t\t// Stream progress updates as NDJSON\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tasync start(controller) {\n\t\t\t\t\tconst encoder = new TextEncoder();\n\t\t\t\t\tconst sendProgress = (progress: MediaImportProgress) => {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify(progress) + \"\\n\"));\n\t\t\t\t\t};\n\n\t\t\t\t\tconst result = await importMediaWithProgress(\n\t\t\t\t\t\tattachments,\n\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\temdash.storage,\n\t\t\t\t\t\tsendProgress,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Send final result\n\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify({ ...result, type: \"result\" }) + \"\\n\"));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn new Response(stream, {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-ndjson\",\n\t\t\t\t\t\"Cache-Control\": \"private, no-store\",\n\t\t\t\t\t\"Transfer-Encoding\": \"chunked\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Non-streaming mode\n\t\tconst result = await importMediaWithProgress(\n\t\t\tattachments,\n\t\t\temdash.db,\n\t\t\temdash.storage,\n\t\t\t() => {}, // No-op progress callback\n\t\t);\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import media\", \"IMPORT_ERROR\");\n\t}\n};\n\nexport async function importMediaWithProgress(\n\tattachments: AttachmentInfo[],\n\tdb: NonNullable<EmDashHandlers[\"db\"]>,\n\tstorage: NonNullable<EmDashHandlers[\"storage\"]>,\n\tonProgress: (progress: MediaImportProgress) => void,\n): Promise<MediaImportResult> {\n\tconst repo = new MediaRepository(db);\n\tconst total = attachments.length;\n\n\tconst result: MediaImportResult = {\n\t\timported: [],\n\t\tfailed: [],\n\t\turlMap: {},\n\t};\n\n\tfor (let i = 0; i < attachments.length; i++) {\n\t\tconst attachment = attachments[i];\n\t\tconst current = i + 1;\n\t\tconst filename = attachment.filename || `file-${attachment.id}`;\n\n\t\tif (!attachment.url) {\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: \"\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// SSRF: validate URL before fetching\n\t\t\ttry {\n\t\t\t\tvalidateExternalUrl(attachment.url);\n\t\t\t} catch (e) {\n\t\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report downloading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"downloading\",\n\t\t\t});\n\n\t\t\t// Download from WordPress (ssrfSafeFetch re-validates redirect targets)\n\t\t\tconst response = await ssrfSafeFetch(attachment.url, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": \"EmDash-Importer/1.0\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `HTTP ${response.status}: ${response.statusText}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `HTTP ${response.status}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get content type from response or guess from filename\n\t\t\tconst contentType =\n\t\t\t\tresponse.headers.get(\"content-type\") || attachment.mimeType || \"application/octet-stream\";\n\n\t\t\t// Get the file data\n\t\t\tconst buffer = await response.arrayBuffer();\n\t\t\tconst size = buffer.byteLength;\n\n\t\t\t// Compute content hash for deduplication\n\t\t\tconst contentHash = await computeContentHash(buffer);\n\n\t\t\t// Check if we already have this exact content\n\t\t\tconst existing = await repo.findByContentHash(contentHash);\n\t\t\tif (existing) {\n\t\t\t\t// Same content already exists - reuse it\n\t\t\t\tconst existingUrl = `/_emdash/api/media/file/${existing.storageKey}`;\n\t\t\t\tresult.urlMap[attachment.url] = existingUrl;\n\t\t\t\tresult.imported.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\tnewUrl: existingUrl,\n\t\t\t\t\tmediaId: existing.id,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"skipped\",\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report uploading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"uploading\",\n\t\t\t});\n\n\t\t\t// Generate storage key\n\t\t\tconst id = ulid();\n\t\t\tconst ext = attachment.filename\n\t\t\t\t? path.extname(attachment.filename)\n\t\t\t\t: getExtensionFromMimeType(contentType);\n\t\t\tconst storageKey = `${id}${ext}`;\n\n\t\t\t// Upload to storage\n\t\t\tawait storage.upload({\n\t\t\t\tkey: storageKey,\n\t\t\t\tbody: new Uint8Array(buffer),\n\t\t\t\tcontentType,\n\t\t\t});\n\n\t\t\t// Derive dimensions + LQIP placeholders (no-op for non-images).\n\t\t\tconst enriched = await enrichImageMetadata(new Uint8Array(buffer), contentType);\n\n\t\t\t// Create media record with content hash\n\t\t\tconst mediaItem = await repo.create({\n\t\t\t\tfilename: attachment.filename || `media-${attachment.id}${ext}`,\n\t\t\t\tmimeType: contentType,\n\t\t\t\tsize,\n\t\t\t\tstorageKey,\n\t\t\t\tcontentHash,\n\t\t\t\twidth: enriched.width,\n\t\t\t\theight: enriched.height,\n\t\t\t\tblurhash: enriched.blurhash,\n\t\t\t\tdominantColor: enriched.dominantColor,\n\t\t\t});\n\n\t\t\t// Build the new URL\n\t\t\tconst newUrl = `/_emdash/api/media/file/${storageKey}`;\n\n\t\t\tresult.imported.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\tnewUrl,\n\t\t\t\tmediaId: mediaItem.id,\n\t\t\t});\n\n\t\t\t// Add to URL map\n\t\t\tresult.urlMap[attachment.url] = newUrl;\n\n\t\t\t// Report done\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"done\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(`Media import error for \"${filename}\":`, error);\n\t\t\tconst errorMsg = \"Failed to import media\";\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction getExtensionFromMimeType(mimeType: string): string {\n\tconst ext = mime.getExtension(mimeType);\n\treturn ext ? `.${ext}` : \"\";\n}\n"],"mappings":"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"}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import "../../../../../config-CvmjJcVw.mjs";
|
|
2
2
|
import "../../../../../base64-DvnNgP7e.mjs";
|
|
3
|
-
import { n as FIELD_TYPES } from "../../../../../types-
|
|
4
|
-
import "../../../../../
|
|
5
|
-
import "../../../../../
|
|
6
|
-
import "../../../../../
|
|
7
|
-
import "../../../../../
|
|
8
|
-
import "../../../../../
|
|
9
|
-
import
|
|
10
|
-
import { n as
|
|
11
|
-
import "../../../../../
|
|
12
|
-
import "../../../../../
|
|
13
|
-
import "../../../../../
|
|
14
|
-
import "../../../../../
|
|
15
|
-
import
|
|
16
|
-
import "../../../../../
|
|
17
|
-
import "../../../../../
|
|
3
|
+
import { n as FIELD_TYPES } from "../../../../../types-BGmQ0uXs.mjs";
|
|
4
|
+
import "../../../../../url-Dn3IStq8.mjs";
|
|
5
|
+
import "../../../../../types-j6MBDjlZ.mjs";
|
|
6
|
+
import "../../../../../errors-CjXd1LgH.mjs";
|
|
7
|
+
import "../../../../../errors-CNvATh_7.mjs";
|
|
8
|
+
import "../../../../../settings-B0zQj_Tj.mjs";
|
|
9
|
+
import "../../../../../site-settings-AYFvhwQn.mjs";
|
|
10
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CEdm_AWU.mjs";
|
|
11
|
+
import { n as parseBody, t as isParseError } from "../../../../../parse-Gt2l4Sld.mjs";
|
|
12
|
+
import "../../../../../redirects-D4EWeXAo.mjs";
|
|
13
|
+
import "../../../../../entry-lock-PP1JCXBB.mjs";
|
|
14
|
+
import "../../../../../media-D1z_jisb.mjs";
|
|
15
|
+
import "../../../../../comments-BRtp992B.mjs";
|
|
16
|
+
import { g as wpPrepareBody } from "../../../../../byline-fields-DHJs0Mja.mjs";
|
|
17
|
+
import "../../../../../menus-BQKqf0Up.mjs";
|
|
18
|
+
import "../../../../../status-D39Fpy8R.mjs";
|
|
18
19
|
import "../../../../../api/schemas/index.mjs";
|
|
19
|
-
import { i as requirePerm } from "../../../../../authorize-
|
|
20
|
+
import { i as requirePerm } from "../../../../../authorize-soZXK7U0.mjs";
|
|
20
21
|
import { capitalize, sanitizeSlug, singularize } from "./analyze.mjs";
|
|
21
22
|
|
|
22
23
|
//#region src/astro/routes/api/import/wordpress/prepare.ts
|
|
@@ -41,7 +42,7 @@ const POST = async ({ request, locals }) => {
|
|
|
41
42
|
}
|
|
42
43
|
};
|
|
43
44
|
async function prepareImport(db, request) {
|
|
44
|
-
const { SchemaRegistry } = await import("../../../../../registry-
|
|
45
|
+
const { SchemaRegistry } = await import("../../../../../registry-CtHRqVe-.mjs").then((n) => n.r);
|
|
45
46
|
const registry = new SchemaRegistry(db);
|
|
46
47
|
const result = {
|
|
47
48
|
success: true,
|
|
@@ -107,7 +108,7 @@ async function prepareImport(db, request) {
|
|
|
107
108
|
"post",
|
|
108
109
|
"page"
|
|
109
110
|
].includes(collectionSlug)) {
|
|
110
|
-
const { FTSManager } = await import("../../../../../fts-manager-
|
|
111
|
+
const { FTSManager } = await import("../../../../../fts-manager-DU03MxWu.mjs").then((n) => n.n);
|
|
111
112
|
const ftsManager = new FTSManager(db);
|
|
112
113
|
if ((await ftsManager.getSearchableFields(collectionSlug)).length > 0) try {
|
|
113
114
|
await ftsManager.enableSearch(collectionSlug);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/prepare.ts"],"sourcesContent":["/**\n * WordPress import prepare endpoint\n *\n * POST /_emdash/api/import/wordpress/prepare\n *\n * Creates collections and fields needed for import.\n * This is called after analyze, before execute.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpPrepareBody } from \"#api/schemas.js\";\nimport { FIELD_TYPES, type FieldType } from \"#schema/types.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport { capitalize, sanitizeSlug, singularize, type ImportFieldDef } from \"./analyze.js\";\n\n/** Validate that a string is a known FieldType, returning undefined if not */\nfunction asFieldType(value: string): FieldType | undefined {\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- validated by includes check\n\treturn (FIELD_TYPES as readonly string[]).includes(value) ? (value as FieldType) : undefined;\n}\n\nexport const prerender = false;\n\ninterface PrepareRequest {\n\tpostTypes: Array<{\n\t\tname: string;\n\t\tcollection: string;\n\t\tfields: ImportFieldDef[];\n\t}>;\n}\n\nexport interface PrepareResult {\n\tsuccess: boolean;\n\tcollectionsCreated: string[];\n\tfieldsCreated: Array<{ collection: string; field: string }>;\n\terrors: Array<{ collection: string; error: string }>;\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, wpPrepareBody);\n\t\tif (isParseError(body)) return body;\n\n\t\
|
|
1
|
+
{"version":3,"file":"prepare.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/prepare.ts"],"sourcesContent":["/**\n * WordPress import prepare endpoint\n *\n * POST /_emdash/api/import/wordpress/prepare\n *\n * Creates collections and fields needed for import.\n * This is called after analyze, before execute.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpPrepareBody } from \"#api/schemas.js\";\nimport { FIELD_TYPES, type FieldType } from \"#schema/types.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport { capitalize, sanitizeSlug, singularize, type ImportFieldDef } from \"./analyze.js\";\n\n/** Validate that a string is a known FieldType, returning undefined if not */\nfunction asFieldType(value: string): FieldType | undefined {\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- validated by includes check\n\treturn (FIELD_TYPES as readonly string[]).includes(value) ? (value as FieldType) : undefined;\n}\n\nexport const prerender = false;\n\ninterface PrepareRequest {\n\tpostTypes: Array<{\n\t\tname: string;\n\t\tcollection: string;\n\t\tfields: ImportFieldDef[];\n\t}>;\n}\n\nexport interface PrepareResult {\n\tsuccess: boolean;\n\tcollectionsCreated: string[];\n\tfieldsCreated: Array<{ collection: string; field: string }>;\n\terrors: Array<{ collection: string; error: string }>;\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, wpPrepareBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await prepareImport(emdash.db, body);\n\n\t\t// Invalidate the URL pattern cache when prepare adds new collections so\n\t\t// public routing picks up their patterns immediately. The manifest\n\t\t// itself is built fresh per admin request, so cross-request\n\t\t// staleness (the original failure mode in #747) is no longer\n\t\t// possible — the execute step always reads live schema.\n\t\tif (result.collectionsCreated.length > 0) {\n\t\t\temdash.invalidateUrlPatternCache();\n\t\t}\n\n\t\treturn apiSuccess(result, result.success ? 200 : 400);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to prepare import\", \"WXR_PREPARE_ERROR\");\n\t}\n};\n\nasync function prepareImport(\n\tdb: NonNullable<EmDashHandlers[\"db\"]>,\n\trequest: PrepareRequest,\n): Promise<PrepareResult> {\n\tconst { SchemaRegistry } = await import(\"#schema/registry.js\");\n\tconst registry = new SchemaRegistry(db);\n\n\tconst result: PrepareResult = {\n\t\tsuccess: true,\n\t\tcollectionsCreated: [],\n\t\tfieldsCreated: [],\n\t\terrors: [],\n\t};\n\n\tfor (const postType of request.postTypes) {\n\t\tconst collectionSlug = sanitizeSlug(postType.collection);\n\n\t\ttry {\n\t\t\t// Check if collection exists\n\t\t\tlet collection = await registry.getCollection(collectionSlug);\n\n\t\t\tif (!collection) {\n\t\t\t\t// Create the collection\n\t\t\t\tconst label = capitalize(collectionSlug);\n\t\t\t\tconst labelSingular = capitalize(singularize(collectionSlug));\n\n\t\t\t\t// Enable search by default for posts and pages\n\t\t\t\tconst isSearchable = [\"posts\", \"pages\", \"post\", \"page\"].includes(collectionSlug);\n\t\t\t\tconst supports: (\"revisions\" | \"drafts\" | \"search\")[] = [\"revisions\", \"drafts\"];\n\t\t\t\tif (isSearchable) {\n\t\t\t\t\tsupports.push(\"search\");\n\t\t\t\t}\n\n\t\t\t\t// Default URL patterns for known post types\n\t\t\t\tconst urlPattern =\n\t\t\t\t\tcollectionSlug === \"pages\"\n\t\t\t\t\t\t? \"/{slug}\"\n\t\t\t\t\t\t: collectionSlug === \"posts\"\n\t\t\t\t\t\t\t? \"/blog/{slug}\"\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\tcollection = await registry.createCollection({\n\t\t\t\t\tslug: collectionSlug,\n\t\t\t\t\tlabel,\n\t\t\t\t\tlabelSingular,\n\t\t\t\t\tdescription: `Imported from WordPress post type: ${postType.name}`,\n\t\t\t\t\tsupports,\n\t\t\t\t\turlPattern,\n\t\t\t\t});\n\n\t\t\t\tresult.collectionsCreated.push(collectionSlug);\n\t\t\t}\n\n\t\t\t// Create missing fields\n\t\t\tconst existingFields = await registry.listFields(collection.id);\n\t\t\tconst existingFieldSlugs = new Set(existingFields.map((f) => f.slug));\n\n\t\t\tfor (const field of postType.fields) {\n\t\t\t\tif (existingFieldSlugs.has(field.slug)) {\n\t\t\t\t\t// Field already exists - skip\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst fieldType = asFieldType(field.type);\n\t\t\t\tif (!fieldType) {\n\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\tcollection: collectionSlug,\n\t\t\t\t\t\terror: `Unknown field type \"${field.type}\" for field \"${field.slug}\"`,\n\t\t\t\t\t});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tawait registry.createField(collectionSlug, {\n\t\t\t\t\tslug: field.slug,\n\t\t\t\t\tlabel: field.label,\n\t\t\t\t\ttype: fieldType,\n\t\t\t\t\trequired: field.required,\n\t\t\t\t\tunique: false,\n\t\t\t\t\tsearchable: field.searchable ?? false,\n\t\t\t\t\tsortOrder: existingFields.length + result.fieldsCreated.length,\n\t\t\t\t});\n\n\t\t\t\tresult.fieldsCreated.push({\n\t\t\t\t\tcollection: collectionSlug,\n\t\t\t\t\tfield: field.slug,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Enable search if collection supports it and has searchable fields\n\t\t\tconst isSearchable = [\"posts\", \"pages\", \"post\", \"page\"].includes(collectionSlug);\n\t\t\tif (isSearchable) {\n\t\t\t\tconst { FTSManager } = await import(\"#search/fts-manager.js\");\n\t\t\t\tconst ftsManager = new FTSManager(db);\n\n\t\t\t\tconst searchableFields = await ftsManager.getSearchableFields(collectionSlug);\n\t\t\t\tif (searchableFields.length > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait ftsManager.enableSearch(collectionSlug);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore - search can be enabled manually later\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Prepare error for collection \"${collectionSlug}\":`, error);\n\t\t\tresult.success = false;\n\t\t\tresult.errors.push({\n\t\t\t\tcollection: collectionSlug,\n\t\t\t\terror: \"Failed to prepare collection\",\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n"],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import "../../../../../parse-
|
|
2
|
-
import "../../../../../types-
|
|
3
|
-
import "../../../../../types-
|
|
4
|
-
import "../../../../../options-
|
|
5
|
-
import "../../../../../entry-lock-
|
|
6
|
-
import { f as MediaProvider } from "../../../../../placeholder-
|
|
7
|
-
import { Yr as markContentMediaUsageCollectionStaleSafely } from "../../../../../config-
|
|
8
|
-
import "../../../../../runner-
|
|
9
|
-
import "../../../../../storage-query-
|
|
10
|
-
import "../../../../../index-
|
|
11
|
-
import "../../../../../types-
|
|
12
|
-
import "../../../../../hreflang-
|
|
13
|
-
import "../../../../../validate-
|
|
1
|
+
import "../../../../../parse-D5Sw9wAI.mjs";
|
|
2
|
+
import "../../../../../types-DZeDpzMc.mjs";
|
|
3
|
+
import "../../../../../types-pOLeFKGq.mjs";
|
|
4
|
+
import "../../../../../options-C2IDQnD2.mjs";
|
|
5
|
+
import "../../../../../entry-lock-B-1bUDxX.mjs";
|
|
6
|
+
import { f as MediaProvider } from "../../../../../placeholder-Cq5wLDCX.mjs";
|
|
7
|
+
import { Yr as markContentMediaUsageCollectionStaleSafely } from "../../../../../config-DHsDMpXc.mjs";
|
|
8
|
+
import "../../../../../runner-Ji7qyH2A.mjs";
|
|
9
|
+
import "../../../../../storage-query-C9bK0Dg6.mjs";
|
|
10
|
+
import "../../../../../index-D1_ykO2u.mjs";
|
|
11
|
+
import "../../../../../types-DuQAIPA-.mjs";
|
|
12
|
+
import "../../../../../hreflang-C7ETs0Tv.mjs";
|
|
13
|
+
import "../../../../../validate-dK97qe7F.mjs";
|
|
14
14
|
import { EmDashHandlers } from "../../../../types.mjs";
|
|
15
15
|
import { APIRoute } from "astro";
|
|
16
16
|
|
|
@@ -2,34 +2,35 @@ import { t as validateIdentifier } from "../../../../../validate-DANX1-Qi.mjs";
|
|
|
2
2
|
import "../../../../../dialect-helpers-7_IqPdh9.mjs";
|
|
3
3
|
import "../../../../../config-CvmjJcVw.mjs";
|
|
4
4
|
import "../../../../../base64-DvnNgP7e.mjs";
|
|
5
|
-
import "../../../../../
|
|
6
|
-
import "../../../../../
|
|
7
|
-
import
|
|
8
|
-
import "../../../../../
|
|
9
|
-
import "../../../../../
|
|
10
|
-
import "../../../../../
|
|
11
|
-
import "../../../../../
|
|
12
|
-
import "../../../../../
|
|
13
|
-
import
|
|
14
|
-
import "../../../../../
|
|
15
|
-
import "../../../../../
|
|
16
|
-
import "../../../../../
|
|
17
|
-
import "../../../../../
|
|
18
|
-
import "../../../../../
|
|
19
|
-
import "../../../../../
|
|
20
|
-
import "../../../../../
|
|
21
|
-
import "../../../../../
|
|
22
|
-
import
|
|
23
|
-
import { n as
|
|
24
|
-
import "../../../../../
|
|
25
|
-
import "../../../../../
|
|
26
|
-
import "../../../../../
|
|
27
|
-
import "../../../../../
|
|
28
|
-
import
|
|
29
|
-
import "../../../../../
|
|
30
|
-
import "../../../../../
|
|
5
|
+
import "../../../../../request-cache-C4CIo5ad.mjs";
|
|
6
|
+
import "../../../../../url-Dn3IStq8.mjs";
|
|
7
|
+
import "../../../../../types-j6MBDjlZ.mjs";
|
|
8
|
+
import { n as normalizeMediaValue } from "../../../../../normalize-BuWa0lvd.mjs";
|
|
9
|
+
import "../../../../../fts-manager-DU03MxWu.mjs";
|
|
10
|
+
import "../../../../../collection-slugs-cache-BNRAPNiu.mjs";
|
|
11
|
+
import "../../../../../capture-triggers-CdZfvHtF.mjs";
|
|
12
|
+
import "../../../../../activation-DDuqAat2.mjs";
|
|
13
|
+
import "../../../../../collection-deletion-JecE26cS.mjs";
|
|
14
|
+
import { U as markContentMediaUsageCollectionStaleSafely } from "../../../../../registry-CtHRqVe-.mjs";
|
|
15
|
+
import "../../../../../hash-CY4QdeMJ.mjs";
|
|
16
|
+
import "../../../../../zod-generator-DnfG5sGQ.mjs";
|
|
17
|
+
import "../../../../../errors-CjXd1LgH.mjs";
|
|
18
|
+
import "../../../../../canonical-CAecl1UQ.mjs";
|
|
19
|
+
import "../../../../../digest-DiYAoZpf.mjs";
|
|
20
|
+
import "../../../../../errors-CNvATh_7.mjs";
|
|
21
|
+
import "../../../../../settings-B0zQj_Tj.mjs";
|
|
22
|
+
import "../../../../../site-settings-AYFvhwQn.mjs";
|
|
23
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CEdm_AWU.mjs";
|
|
24
|
+
import { n as parseBody, t as isParseError } from "../../../../../parse-Gt2l4Sld.mjs";
|
|
25
|
+
import "../../../../../redirects-D4EWeXAo.mjs";
|
|
26
|
+
import "../../../../../entry-lock-PP1JCXBB.mjs";
|
|
27
|
+
import "../../../../../media-D1z_jisb.mjs";
|
|
28
|
+
import "../../../../../comments-BRtp992B.mjs";
|
|
29
|
+
import { _ as wpRewriteUrlsBody } from "../../../../../byline-fields-DHJs0Mja.mjs";
|
|
30
|
+
import "../../../../../menus-BQKqf0Up.mjs";
|
|
31
|
+
import "../../../../../status-D39Fpy8R.mjs";
|
|
31
32
|
import "../../../../../api/schemas/index.mjs";
|
|
32
|
-
import { i as requirePerm } from "../../../../../authorize-
|
|
33
|
+
import { i as requirePerm } from "../../../../../authorize-soZXK7U0.mjs";
|
|
33
34
|
import { buildBaseUrlMap, extractMediaUrl, findMatchingUrl, rewritePortableTextUrls, rewriteStringUrls } from "./rewrite-url-helpers.mjs";
|
|
34
35
|
import { sql } from "kysely";
|
|
35
36
|
|
|
@@ -56,7 +57,7 @@ const POST = async ({ request, locals }) => {
|
|
|
56
57
|
}
|
|
57
58
|
};
|
|
58
59
|
async function rewriteUrls(db, urlMap, getProvider, collections, markUsageCollectionStale = markContentMediaUsageCollectionStaleSafely) {
|
|
59
|
-
const { SchemaRegistry } = await import("../../../../../registry-
|
|
60
|
+
const { SchemaRegistry } = await import("../../../../../registry-CtHRqVe-.mjs").then((n) => n.r);
|
|
60
61
|
const registry = new SchemaRegistry(db);
|
|
61
62
|
const result = {
|
|
62
63
|
updated: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rewrite-urls.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/rewrite-urls.ts"],"sourcesContent":["/**\n * WordPress URL rewrite endpoint\n *\n * POST /_emdash/api/import/wordpress/rewrite-urls\n *\n * Rewrites old WordPress media URLs in Portable Text content\n * to point to newly imported EmDash media URLs.\n *\n * Handles URL variants (e.g., image.jpg vs image.jpg?w=200) by matching\n * on the base URL path without query parameters.\n */\n\nimport type { APIRoute } from \"astro\";\nimport { sql } from \"kysely\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpRewriteUrlsBody } from \"#api/schemas.js\";\nimport { validateIdentifier } from \"#db/validate.js\";\nimport { normalizeMediaValue } from \"#media/normalize.js\";\nimport type { MediaProvider } from \"#media/types.js\";\nimport { markContentMediaUsageCollectionStaleSafely } from \"#media/usage/content-refresh.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport {\n\tbuildBaseUrlMap,\n\textractMediaUrl,\n\tfindMatchingUrl,\n\trewritePortableTextUrls,\n\trewriteStringUrls,\n} from \"./rewrite-url-helpers.js\";\nimport type { PortableTextBlock } from \"./rewrite-url-helpers.js\";\n\nexport interface RewriteUrlsResult {\n\t/** Total items updated */\n\tupdated: number;\n\t/** Updates by collection */\n\tbyCollection: Record<string, number>;\n\t/** URLs that were rewritten */\n\turlsRewritten: number;\n\t/** Any errors encountered */\n\terrors: Array<{ collection: string; id: string; error: string }>;\n}\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NO_DB\", \"Database not initialized\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, wpRewriteUrlsBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst urlEntries = Object.entries(body.urlMap);\n\t\tif (urlEntries.length === 0) {\n\t\t\treturn apiSuccess({\n\t\t\t\tupdated: 0,\n\t\t\t\tbyCollection: {},\n\t\t\t\turlsRewritten: 0,\n\t\t\t\terrors: [],\n\t\t\t});\n\t\t}\n\n\t\tconst getProvider = (id: string) => emdash.getMediaProvider(id);\n\t\tconst result = await rewriteUrls(emdash.db, body.urlMap, getProvider, body.collections);\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to rewrite URLs\", \"REWRITE_ERROR\");\n\t}\n};\n\nexport async function rewriteUrls(\n\tdb: NonNullable<EmDashHandlers[\"db\"]>,\n\turlMap: Record<string, string>,\n\tgetProvider: (id: string) => MediaProvider | undefined,\n\tcollections?: string[],\n\tmarkUsageCollectionStale: typeof markContentMediaUsageCollectionStaleSafely = markContentMediaUsageCollectionStaleSafely,\n): Promise<RewriteUrlsResult> {\n\tconst { SchemaRegistry } = await import(\"#schema/registry.js\");\n\tconst registry = new SchemaRegistry(db);\n\n\tconst result: RewriteUrlsResult = {\n\t\tupdated: 0,\n\t\tbyCollection: {},\n\t\turlsRewritten: 0,\n\t\terrors: [],\n\t};\n\tconst staleMarkedCollections = new Set<string>();\n\tconst staleMarkFailedCollections = new Set<string>();\n\tconst markCollectionStale = async (collectionSlug: string): Promise<void> => {\n\t\tif (staleMarkedCollections.has(collectionSlug)) return;\n\t\tconst marked = await markUsageCollectionStale(db, collectionSlug, \"CONTENT_USAGE_STALE\");\n\t\tif (marked) {\n\t\t\tstaleMarkedCollections.add(collectionSlug);\n\t\t\tstaleMarkFailedCollections.delete(collectionSlug);\n\t\t} else {\n\t\t\tstaleMarkFailedCollections.add(collectionSlug);\n\t\t}\n\t};\n\n\t// Build base URL map for flexible matching\n\tconst baseMap = buildBaseUrlMap(urlMap);\n\n\t// Get all collections or filter to specified ones\n\tconst allCollections = await registry.listCollections();\n\tconst targetCollections = collections?.length\n\t\t? allCollections.filter((c) => collections.includes(c.slug))\n\t\t: allCollections;\n\n\ttry {\n\t\tfor (const collection of targetCollections) {\n\t\t\t// Get fields that might contain URLs\n\t\t\tconst fields = await registry.listFields(collection.id);\n\t\t\tconst portableTextFields = fields.filter((f) => f.type === \"portableText\");\n\t\t\tconst stringFields = fields.filter((f) => [\"text\", \"string\"].includes(f.type));\n\t\t\t// Image and file fields store URLs directly as TEXT\n\t\t\tconst mediaFields = fields.filter((f) => [\"image\", \"file\"].includes(f.type));\n\n\t\t\tif (portableTextFields.length === 0 && stringFields.length === 0 && mediaFields.length === 0)\n\t\t\t\tcontinue;\n\n\t\t\t// Get table name\n\t\t\tvalidateIdentifier(collection.slug, \"collection slug\");\n\t\t\tconst tableName = `ec_${collection.slug}`;\n\n\t\t\ttry {\n\t\t\t\t// Query all rows\n\t\t\t\tconst rows = await sql<{ id: string; [key: string]: unknown }>`\n\t\t\t\tSELECT * FROM ${sql.ref(tableName)}\n\t\t\t\tWHERE deleted_at IS NULL\n\t\t\t`.execute(db);\n\n\t\t\t\tfor (const row of rows.rows) {\n\t\t\t\t\tlet rowUpdated = false;\n\t\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\t\tlet rowUrlsRewritten = 0;\n\n\t\t\t\t\t// Handle Portable Text fields - parse JSON and rewrite URLs in blocks\n\t\t\t\t\tfor (const field of portableTextFields) {\n\t\t\t\t\t\tconst value = row[field.slug];\n\t\t\t\t\t\tif (!value || typeof value !== \"string\") continue;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- JSON.parse returns unknown; validated by Array.isArray below\n\t\t\t\t\t\t\tconst blocks = JSON.parse(value) as PortableTextBlock[];\n\t\t\t\t\t\t\tif (!Array.isArray(blocks)) continue;\n\n\t\t\t\t\t\t\tconst rewriteResult = rewritePortableTextUrls(blocks, urlMap, baseMap);\n\n\t\t\t\t\t\t\tif (rewriteResult.changed) {\n\t\t\t\t\t\t\t\tupdates[field.slug] = JSON.stringify(blocks);\n\t\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\t\trowUrlsRewritten += rewriteResult.urlsRewritten;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Not valid JSON, try string replacement as fallback\n\t\t\t\t\t\t\tconst stringResult = rewriteStringUrls(value, urlMap, baseMap);\n\t\t\t\t\t\t\tif (stringResult.changed) {\n\t\t\t\t\t\t\t\tupdates[field.slug] = stringResult.newValue;\n\t\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\t\trowUrlsRewritten += stringResult.urlsRewritten;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Handle string/text fields - simple string replacement\n\t\t\t\t\tfor (const field of stringFields) {\n\t\t\t\t\t\tconst value = row[field.slug];\n\t\t\t\t\t\tif (!value || typeof value !== \"string\") continue;\n\n\t\t\t\t\t\tconst stringResult = rewriteStringUrls(value, urlMap, baseMap);\n\t\t\t\t\t\tif (stringResult.changed) {\n\t\t\t\t\t\t\tupdates[field.slug] = stringResult.newValue;\n\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\trowUrlsRewritten += stringResult.urlsRewritten;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Handle image/file fields - normalize to MediaValue objects\n\t\t\t\t\tfor (const field of mediaFields) {\n\t\t\t\t\t\tconst value = row[field.slug];\n\t\t\t\t\t\tif (!value || typeof value !== \"string\") continue;\n\n\t\t\t\t\t\t// Values are stored as JSON MediaValue objects (e.g. featured_image from\n\t\t\t\t\t\t// import normalizes to {\"provider\":\"external\",\"src\":\"<wp url>\"}). Match on the\n\t\t\t\t\t\t// inner `src`, falling back to the raw value for legacy bare-URL rows.\n\t\t\t\t\t\tconst newUrl = findMatchingUrl(extractMediaUrl(value), urlMap, baseMap);\n\t\t\t\t\t\tif (newUrl) {\n\t\t\t\t\t\t\t// Normalize into a proper MediaValue instead of storing a bare URL\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst normalized = await normalizeMediaValue(newUrl, getProvider);\n\t\t\t\t\t\t\t\tupdates[field.slug] = normalized ? JSON.stringify(normalized) : newUrl;\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tupdates[field.slug] = newUrl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\trowUrlsRewritten++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (rowUpdated) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Build update query dynamically\n\t\t\t\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Kysely dynamic table requires type assertion\n\t\t\t\t\t\t\tlet query = db.updateTable(tableName as any).where(\"id\", \"=\", row.id);\n\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(updates)) {\n\t\t\t\t\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Kysely dynamic column update requires type assertion\n\t\t\t\t\t\t\t\tquery = query.set({ [key]: value } as any);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait query.execute();\n\n\t\t\t\t\t\t\tresult.updated++;\n\t\t\t\t\t\t\tresult.urlsRewritten += rowUrlsRewritten;\n\t\t\t\t\t\t\tresult.byCollection[collection.slug] =\n\t\t\t\t\t\t\t\t(result.byCollection[collection.slug] || 0) + 1;\n\t\t\t\t\t\t\tawait markCollectionStale(collection.slug);\n\t\t\t\t\t\t} catch (updateError) {\n\t\t\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\t\t\tcollection: collection.slug,\n\t\t\t\t\t\t\t\tid: row.id,\n\t\t\t\t\t\t\t\terror: updateError instanceof Error ? updateError.message : \"Update failed\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (queryError) {\n\t\t\t\tresult.errors.push({\n\t\t\t\t\tcollection: collection.slug,\n\t\t\t\t\tid: \"*\",\n\t\t\t\t\terror: queryError instanceof Error ? queryError.message : \"Query failed for collection\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tfor (const collectionSlug of staleMarkFailedCollections) {\n\t\t\tif (staleMarkedCollections.has(collectionSlug)) continue;\n\t\t\tconst marked = await markUsageCollectionStale(db, collectionSlug, \"CONTENT_USAGE_STALE\");\n\t\t\tif (marked) staleMarkedCollections.add(collectionSlug);\n\t\t}\n\t}\n\n\treturn result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rewrite-urls.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/rewrite-urls.ts"],"sourcesContent":["/**\n * WordPress URL rewrite endpoint\n *\n * POST /_emdash/api/import/wordpress/rewrite-urls\n *\n * Rewrites old WordPress media URLs in Portable Text content\n * to point to newly imported EmDash media URLs.\n *\n * Handles URL variants (e.g., image.jpg vs image.jpg?w=200) by matching\n * on the base URL path without query parameters.\n */\n\nimport type { APIRoute } from \"astro\";\nimport { sql } from \"kysely\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpRewriteUrlsBody } from \"#api/schemas.js\";\nimport { validateIdentifier } from \"#db/validate.js\";\nimport { normalizeMediaValue } from \"#media/normalize.js\";\nimport type { MediaProvider } from \"#media/types.js\";\nimport { markContentMediaUsageCollectionStaleSafely } from \"#media/usage/content-refresh.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport {\n\tbuildBaseUrlMap,\n\textractMediaUrl,\n\tfindMatchingUrl,\n\trewritePortableTextUrls,\n\trewriteStringUrls,\n} from \"./rewrite-url-helpers.js\";\nimport type { PortableTextBlock } from \"./rewrite-url-helpers.js\";\n\nexport interface RewriteUrlsResult {\n\t/** Total items updated */\n\tupdated: number;\n\t/** Updates by collection */\n\tbyCollection: Record<string, number>;\n\t/** URLs that were rewritten */\n\turlsRewritten: number;\n\t/** Any errors encountered */\n\terrors: Array<{ collection: string; id: string; error: string }>;\n}\n\nexport const prerender = false;\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NO_DB\", \"Database not initialized\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, wpRewriteUrlsBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst urlEntries = Object.entries(body.urlMap);\n\t\tif (urlEntries.length === 0) {\n\t\t\treturn apiSuccess({\n\t\t\t\tupdated: 0,\n\t\t\t\tbyCollection: {},\n\t\t\t\turlsRewritten: 0,\n\t\t\t\terrors: [],\n\t\t\t});\n\t\t}\n\n\t\tconst getProvider = (id: string) => emdash.getMediaProvider(id);\n\t\tconst result = await rewriteUrls(emdash.db, body.urlMap, getProvider, body.collections);\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to rewrite URLs\", \"REWRITE_ERROR\");\n\t}\n};\n\nexport async function rewriteUrls(\n\tdb: NonNullable<EmDashHandlers[\"db\"]>,\n\turlMap: Record<string, string>,\n\tgetProvider: (id: string) => MediaProvider | undefined,\n\tcollections?: string[],\n\tmarkUsageCollectionStale: typeof markContentMediaUsageCollectionStaleSafely = markContentMediaUsageCollectionStaleSafely,\n): Promise<RewriteUrlsResult> {\n\tconst { SchemaRegistry } = await import(\"#schema/registry.js\");\n\tconst registry = new SchemaRegistry(db);\n\n\tconst result: RewriteUrlsResult = {\n\t\tupdated: 0,\n\t\tbyCollection: {},\n\t\turlsRewritten: 0,\n\t\terrors: [],\n\t};\n\tconst staleMarkedCollections = new Set<string>();\n\tconst staleMarkFailedCollections = new Set<string>();\n\tconst markCollectionStale = async (collectionSlug: string): Promise<void> => {\n\t\tif (staleMarkedCollections.has(collectionSlug)) return;\n\t\tconst marked = await markUsageCollectionStale(db, collectionSlug, \"CONTENT_USAGE_STALE\");\n\t\tif (marked) {\n\t\t\tstaleMarkedCollections.add(collectionSlug);\n\t\t\tstaleMarkFailedCollections.delete(collectionSlug);\n\t\t} else {\n\t\t\tstaleMarkFailedCollections.add(collectionSlug);\n\t\t}\n\t};\n\n\t// Build base URL map for flexible matching\n\tconst baseMap = buildBaseUrlMap(urlMap);\n\n\t// Get all collections or filter to specified ones\n\tconst allCollections = await registry.listCollections();\n\tconst targetCollections = collections?.length\n\t\t? allCollections.filter((c) => collections.includes(c.slug))\n\t\t: allCollections;\n\n\ttry {\n\t\tfor (const collection of targetCollections) {\n\t\t\t// Get fields that might contain URLs\n\t\t\tconst fields = await registry.listFields(collection.id);\n\t\t\tconst portableTextFields = fields.filter((f) => f.type === \"portableText\");\n\t\t\tconst stringFields = fields.filter((f) => [\"text\", \"string\"].includes(f.type));\n\t\t\t// Image and file fields store URLs directly as TEXT\n\t\t\tconst mediaFields = fields.filter((f) => [\"image\", \"file\"].includes(f.type));\n\n\t\t\tif (portableTextFields.length === 0 && stringFields.length === 0 && mediaFields.length === 0)\n\t\t\t\tcontinue;\n\n\t\t\t// Get table name\n\t\t\tvalidateIdentifier(collection.slug, \"collection slug\");\n\t\t\tconst tableName = `ec_${collection.slug}`;\n\n\t\t\ttry {\n\t\t\t\t// Query all rows\n\t\t\t\tconst rows = await sql<{ id: string; [key: string]: unknown }>`\n\t\t\t\tSELECT * FROM ${sql.ref(tableName)}\n\t\t\t\tWHERE deleted_at IS NULL\n\t\t\t`.execute(db);\n\n\t\t\t\tfor (const row of rows.rows) {\n\t\t\t\t\tlet rowUpdated = false;\n\t\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\t\tlet rowUrlsRewritten = 0;\n\n\t\t\t\t\t// Handle Portable Text fields - parse JSON and rewrite URLs in blocks\n\t\t\t\t\tfor (const field of portableTextFields) {\n\t\t\t\t\t\tconst value = row[field.slug];\n\t\t\t\t\t\tif (!value || typeof value !== \"string\") continue;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- JSON.parse returns unknown; validated by Array.isArray below\n\t\t\t\t\t\t\tconst blocks = JSON.parse(value) as PortableTextBlock[];\n\t\t\t\t\t\t\tif (!Array.isArray(blocks)) continue;\n\n\t\t\t\t\t\t\tconst rewriteResult = rewritePortableTextUrls(blocks, urlMap, baseMap);\n\n\t\t\t\t\t\t\tif (rewriteResult.changed) {\n\t\t\t\t\t\t\t\tupdates[field.slug] = JSON.stringify(blocks);\n\t\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\t\trowUrlsRewritten += rewriteResult.urlsRewritten;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Not valid JSON, try string replacement as fallback\n\t\t\t\t\t\t\tconst stringResult = rewriteStringUrls(value, urlMap, baseMap);\n\t\t\t\t\t\t\tif (stringResult.changed) {\n\t\t\t\t\t\t\t\tupdates[field.slug] = stringResult.newValue;\n\t\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\t\trowUrlsRewritten += stringResult.urlsRewritten;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Handle string/text fields - simple string replacement\n\t\t\t\t\tfor (const field of stringFields) {\n\t\t\t\t\t\tconst value = row[field.slug];\n\t\t\t\t\t\tif (!value || typeof value !== \"string\") continue;\n\n\t\t\t\t\t\tconst stringResult = rewriteStringUrls(value, urlMap, baseMap);\n\t\t\t\t\t\tif (stringResult.changed) {\n\t\t\t\t\t\t\tupdates[field.slug] = stringResult.newValue;\n\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\trowUrlsRewritten += stringResult.urlsRewritten;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Handle image/file fields - normalize to MediaValue objects\n\t\t\t\t\tfor (const field of mediaFields) {\n\t\t\t\t\t\tconst value = row[field.slug];\n\t\t\t\t\t\tif (!value || typeof value !== \"string\") continue;\n\n\t\t\t\t\t\t// Values are stored as JSON MediaValue objects (e.g. featured_image from\n\t\t\t\t\t\t// import normalizes to {\"provider\":\"external\",\"src\":\"<wp url>\"}). Match on the\n\t\t\t\t\t\t// inner `src`, falling back to the raw value for legacy bare-URL rows.\n\t\t\t\t\t\tconst newUrl = findMatchingUrl(extractMediaUrl(value), urlMap, baseMap);\n\t\t\t\t\t\tif (newUrl) {\n\t\t\t\t\t\t\t// Normalize into a proper MediaValue instead of storing a bare URL\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst normalized = await normalizeMediaValue(newUrl, getProvider);\n\t\t\t\t\t\t\t\tupdates[field.slug] = normalized ? JSON.stringify(normalized) : newUrl;\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tupdates[field.slug] = newUrl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trowUpdated = true;\n\t\t\t\t\t\t\trowUrlsRewritten++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (rowUpdated) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Build update query dynamically\n\t\t\t\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Kysely dynamic table requires type assertion\n\t\t\t\t\t\t\tlet query = db.updateTable(tableName as any).where(\"id\", \"=\", row.id);\n\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(updates)) {\n\t\t\t\t\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Kysely dynamic column update requires type assertion\n\t\t\t\t\t\t\t\tquery = query.set({ [key]: value } as any);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait query.execute();\n\n\t\t\t\t\t\t\tresult.updated++;\n\t\t\t\t\t\t\tresult.urlsRewritten += rowUrlsRewritten;\n\t\t\t\t\t\t\tresult.byCollection[collection.slug] =\n\t\t\t\t\t\t\t\t(result.byCollection[collection.slug] || 0) + 1;\n\t\t\t\t\t\t\tawait markCollectionStale(collection.slug);\n\t\t\t\t\t\t} catch (updateError) {\n\t\t\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\t\t\tcollection: collection.slug,\n\t\t\t\t\t\t\t\tid: row.id,\n\t\t\t\t\t\t\t\terror: updateError instanceof Error ? updateError.message : \"Update failed\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (queryError) {\n\t\t\t\tresult.errors.push({\n\t\t\t\t\tcollection: collection.slug,\n\t\t\t\t\tid: \"*\",\n\t\t\t\t\terror: queryError instanceof Error ? queryError.message : \"Query failed for collection\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tfor (const collectionSlug of staleMarkFailedCollections) {\n\t\t\tif (staleMarkedCollections.has(collectionSlug)) continue;\n\t\t\tconst marked = await markUsageCollectionStale(db, collectionSlug, \"CONTENT_USAGE_STALE\");\n\t\t\tif (marked) staleMarkedCollections.add(collectionSlug);\n\t\t}\n\t}\n\n\treturn result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,MAAa,YAAY;AAEzB,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,SAAS,4BAA4B,IAAI;CAG1D,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,kBAAkB;AACxD,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,MADmB,OAAO,QAAQ,KAAK,OAAO,CAC/B,WAAW,EACzB,QAAO,WAAW;GACjB,SAAS;GACT,cAAc,EAAE;GAChB,eAAe;GACf,QAAQ,EAAE;GACV,CAAC;EAGH,MAAM,eAAe,OAAe,OAAO,iBAAiB,GAAG;AAG/D,SAAO,WAFQ,MAAM,YAAY,OAAO,IAAI,KAAK,QAAQ,aAAa,KAAK,YAAY,CAE9D;UACjB,OAAO;AACf,SAAO,YAAY,OAAO,0BAA0B,gBAAgB;;;AAItE,eAAsB,YACrB,IACA,QACA,aACA,aACA,2BAA8E,4CACjD;CAC7B,MAAM,EAAE,mBAAmB,MAAM,OAAO;CACxC,MAAM,WAAW,IAAI,eAAe,GAAG;CAEvC,MAAM,SAA4B;EACjC,SAAS;EACT,cAAc,EAAE;EAChB,eAAe;EACf,QAAQ,EAAE;EACV;CACD,MAAM,yCAAyB,IAAI,KAAa;CAChD,MAAM,6CAA6B,IAAI,KAAa;CACpD,MAAM,sBAAsB,OAAO,mBAA0C;AAC5E,MAAI,uBAAuB,IAAI,eAAe,CAAE;AAEhD,MADe,MAAM,yBAAyB,IAAI,gBAAgB,sBAAsB,EAC5E;AACX,0BAAuB,IAAI,eAAe;AAC1C,8BAA2B,OAAO,eAAe;QAEjD,4BAA2B,IAAI,eAAe;;CAKhD,MAAM,UAAU,gBAAgB,OAAO;CAGvC,MAAM,iBAAiB,MAAM,SAAS,iBAAiB;CACvD,MAAM,oBAAoB,aAAa,SACpC,eAAe,QAAQ,MAAM,YAAY,SAAS,EAAE,KAAK,CAAC,GAC1D;AAEH,KAAI;AACH,OAAK,MAAM,cAAc,mBAAmB;GAE3C,MAAM,SAAS,MAAM,SAAS,WAAW,WAAW,GAAG;GACvD,MAAM,qBAAqB,OAAO,QAAQ,MAAM,EAAE,SAAS,eAAe;GAC1E,MAAM,eAAe,OAAO,QAAQ,MAAM,CAAC,QAAQ,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC;GAE9E,MAAM,cAAc,OAAO,QAAQ,MAAM,CAAC,SAAS,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;AAE5E,OAAI,mBAAmB,WAAW,KAAK,aAAa,WAAW,KAAK,YAAY,WAAW,EAC1F;AAGD,sBAAmB,WAAW,MAAM,kBAAkB;GACtD,MAAM,YAAY,MAAM,WAAW;AAEnC,OAAI;IAEH,MAAM,OAAO,MAAM,GAA2C;oBAC9C,IAAI,IAAI,UAAU,CAAC;;KAElC,QAAQ,GAAG;AAEZ,SAAK,MAAM,OAAO,KAAK,MAAM;KAC5B,IAAI,aAAa;KACjB,MAAM,UAAmC,EAAE;KAC3C,IAAI,mBAAmB;AAGvB,UAAK,MAAM,SAAS,oBAAoB;MACvC,MAAM,QAAQ,IAAI,MAAM;AACxB,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AAEzC,UAAI;OAEH,MAAM,SAAS,KAAK,MAAM,MAAM;AAChC,WAAI,CAAC,MAAM,QAAQ,OAAO,CAAE;OAE5B,MAAM,gBAAgB,wBAAwB,QAAQ,QAAQ,QAAQ;AAEtE,WAAI,cAAc,SAAS;AAC1B,gBAAQ,MAAM,QAAQ,KAAK,UAAU,OAAO;AAC5C,qBAAa;AACb,4BAAoB,cAAc;;cAE5B;OAEP,MAAM,eAAe,kBAAkB,OAAO,QAAQ,QAAQ;AAC9D,WAAI,aAAa,SAAS;AACzB,gBAAQ,MAAM,QAAQ,aAAa;AACnC,qBAAa;AACb,4BAAoB,aAAa;;;;AAMpC,UAAK,MAAM,SAAS,cAAc;MACjC,MAAM,QAAQ,IAAI,MAAM;AACxB,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU;MAEzC,MAAM,eAAe,kBAAkB,OAAO,QAAQ,QAAQ;AAC9D,UAAI,aAAa,SAAS;AACzB,eAAQ,MAAM,QAAQ,aAAa;AACnC,oBAAa;AACb,2BAAoB,aAAa;;;AAKnC,UAAK,MAAM,SAAS,aAAa;MAChC,MAAM,QAAQ,IAAI,MAAM;AACxB,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU;MAKzC,MAAM,SAAS,gBAAgB,gBAAgB,MAAM,EAAE,QAAQ,QAAQ;AACvE,UAAI,QAAQ;AAEX,WAAI;QACH,MAAM,aAAa,MAAM,oBAAoB,QAAQ,YAAY;AACjE,gBAAQ,MAAM,QAAQ,aAAa,KAAK,UAAU,WAAW,GAAG;eACzD;AACP,gBAAQ,MAAM,QAAQ;;AAEvB,oBAAa;AACb;;;AAIF,SAAI,WACH,KAAI;MAGH,IAAI,QAAQ,GAAG,YAAY,UAAiB,CAAC,MAAM,MAAM,KAAK,IAAI,GAAG;AAErE,WAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAEjD,SAAQ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAQ;AAG3C,YAAM,MAAM,SAAS;AAErB,aAAO;AACP,aAAO,iBAAiB;AACxB,aAAO,aAAa,WAAW,SAC7B,OAAO,aAAa,WAAW,SAAS,KAAK;AAC/C,YAAM,oBAAoB,WAAW,KAAK;cAClC,aAAa;AACrB,aAAO,OAAO,KAAK;OAClB,YAAY,WAAW;OACvB,IAAI,IAAI;OACR,OAAO,uBAAuB,QAAQ,YAAY,UAAU;OAC5D,CAAC;;;YAIG,YAAY;AACpB,WAAO,OAAO,KAAK;KAClB,YAAY,WAAW;KACvB,IAAI;KACJ,OAAO,sBAAsB,QAAQ,WAAW,UAAU;KAC1D,CAAC;;;WAGK;AACT,OAAK,MAAM,kBAAkB,4BAA4B;AACxD,OAAI,uBAAuB,IAAI,eAAe,CAAE;AAEhD,OADe,MAAM,yBAAyB,IAAI,gBAAgB,sBAAsB,CAC5E,wBAAuB,IAAI,eAAe;;;AAIxD,QAAO"}
|
|
@@ -4,32 +4,33 @@ import "../../../../../after-PcEvMY_6.mjs";
|
|
|
4
4
|
import "../../../../../options-DhrI7eMv.mjs";
|
|
5
5
|
import "../../../../../base64-DvnNgP7e.mjs";
|
|
6
6
|
import "../../../../../secrets-CIi0nFiR.mjs";
|
|
7
|
-
import "../../../../../object-cache-
|
|
7
|
+
import "../../../../../object-cache-Bo6DGaC9.mjs";
|
|
8
8
|
import "../../../../../slugify-T5GHH42D.mjs";
|
|
9
|
-
import "../../../../../
|
|
10
|
-
import "../../../../../
|
|
11
|
-
import "../../../../../
|
|
12
|
-
import "../../../../../
|
|
13
|
-
import "../../../../../
|
|
14
|
-
import "../../../../../
|
|
15
|
-
import "../../../../../
|
|
16
|
-
import "../../../../../
|
|
17
|
-
import "../../../../../settings-
|
|
18
|
-
import
|
|
19
|
-
import {
|
|
20
|
-
import { n as
|
|
21
|
-
import "../../../../../
|
|
22
|
-
import "../../../../../
|
|
23
|
-
import "../../../../../
|
|
24
|
-
import "../../../../../
|
|
25
|
-
import
|
|
26
|
-
import "../../../../../
|
|
27
|
-
import "../../../../../
|
|
9
|
+
import "../../../../../request-cache-C4CIo5ad.mjs";
|
|
10
|
+
import "../../../../../url-Dn3IStq8.mjs";
|
|
11
|
+
import "../../../../../types-j6MBDjlZ.mjs";
|
|
12
|
+
import "../../../../../media-CputjGE1.mjs";
|
|
13
|
+
import "../../../../../loader-B_bcoE1h.mjs";
|
|
14
|
+
import "../../../../../errors-CjXd1LgH.mjs";
|
|
15
|
+
import "../../../../../errors-CNvATh_7.mjs";
|
|
16
|
+
import "../../../../../settings-B0zQj_Tj.mjs";
|
|
17
|
+
import "../../../../../site-settings-AYFvhwQn.mjs";
|
|
18
|
+
import "../../../../../settings-BbVRRGDp.mjs";
|
|
19
|
+
import { r as resolveAndValidateExternalUrl, t as SsrfError } from "../../../../../ssrf-DsmvZB80.mjs";
|
|
20
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CEdm_AWU.mjs";
|
|
21
|
+
import { n as parseBody, t as isParseError } from "../../../../../parse-Gt2l4Sld.mjs";
|
|
22
|
+
import "../../../../../redirects-D4EWeXAo.mjs";
|
|
23
|
+
import "../../../../../entry-lock-PP1JCXBB.mjs";
|
|
24
|
+
import "../../../../../media-D1z_jisb.mjs";
|
|
25
|
+
import "../../../../../comments-BRtp992B.mjs";
|
|
26
|
+
import { m as wpPluginAnalyzeBody } from "../../../../../byline-fields-DHJs0Mja.mjs";
|
|
27
|
+
import "../../../../../menus-BQKqf0Up.mjs";
|
|
28
|
+
import "../../../../../status-D39Fpy8R.mjs";
|
|
28
29
|
import "../../../../../api/schemas/index.mjs";
|
|
29
|
-
import { p as getSource } from "../../../../../import-
|
|
30
|
-
import "../../../../../ssrf-
|
|
31
|
-
import "../../../../../utils-
|
|
32
|
-
import { i as requirePerm } from "../../../../../authorize-
|
|
30
|
+
import { p as getSource } from "../../../../../import-CzP9ffo0.mjs";
|
|
31
|
+
import "../../../../../ssrf-tA45vIPX.mjs";
|
|
32
|
+
import "../../../../../utils-CoV-PYhg.mjs";
|
|
33
|
+
import { i as requirePerm } from "../../../../../authorize-soZXK7U0.mjs";
|
|
33
34
|
import { SchemaRegistry } from "emdash";
|
|
34
35
|
|
|
35
36
|
//#region src/astro/routes/api/import/wordpress-plugin/analyze.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress-plugin/analyze.ts"],"sourcesContent":["/**\n * WordPress Plugin analyze endpoint\n *\n * POST /_emdash/api/import/wordpress-plugin/analyze\n *\n * Analyzes a WordPress site with EmDash Exporter plugin installed.\n * Returns content counts, schema compatibility, etc.\n */\n\nimport type { APIRoute } from \"astro\";\nimport { SchemaRegistry } from \"emdash\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpPluginAnalyzeBody } from \"#api/schemas.js\";\nimport { getSource } from \"#import/index.js\";\nimport { resolveAndValidateExternalUrl, SsrfError } from \"#import/ssrf.js\";\nimport type { ImportAnalysis } from \"#import/types.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nexport const prerender = false;\n\nexport interface WpPluginAnalyzeResponse {\n\tsuccess: boolean;\n\tanalysis?: ImportAnalysis;\n\terror?: { message: string };\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, wpPluginAnalyzeBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// SSRF: reject internal/private network targets. Uses DNS resolution\n\t\t// to catch hostnames that resolve to private addresses.\n\t\ttry {\n\t\t\tawait resolveAndValidateExternalUrl(body.url);\n\t\t} catch (e) {\n\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\treturn apiError(\"SSRF_BLOCKED\", msg, 400);\n\t\t}\n\n\t\t// Get the WordPress plugin source\n\t\tconst source = getSource(\"wordpress-plugin\");\n\t\tif (!source) {\n\t\t\treturn apiError(\"NOT_CONFIGURED\", \"WordPress plugin source not available\", 500);\n\t\t}\n\n\t\t// Build context with existing collections info\n\t\tconst existingCollections = await fetchExistingCollections(emdash?.db);\n\n\t\t// Analyze the site\n\t\tconst analysis = await source.analyze(\n\t\t\t{ type: \"url\", url: body.url, token: body.token },\n\t\t\t{\n\t\t\t\tdb: emdash?.db,\n\t\t\t\tgetExistingCollections: async () => existingCollections,\n\t\t\t},\n\t\t);\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\tanalysis,\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to analyze WordPress site\", \"WP_PLUGIN_ANALYZE_ERROR\");\n\t}\n};\n\n/** Existing collection info from schema registry */\ninterface ExistingCollection {\n\tslug: string;\n\tfields: Map<string, { type: string }>;\n}\n\n/** Fetch collections and their fields from schema registry */\nasync function fetchExistingCollections(\n\tdb: EmDashHandlers[\"db\"] | undefined,\n): Promise<Map<string, ExistingCollection>> {\n\tconst result = new Map<string, ExistingCollection>();\n\n\tif (!db) return result;\n\n\ttry {\n\t\tconst registry = new SchemaRegistry(db);\n\t\tconst collections = await registry.listCollections();\n\n\t\tfor (const collection of collections) {\n\t\t\tconst fields = await registry.listFields(collection.id);\n\t\t\tconst fieldMap = new Map<string, { type: string }>();\n\n\t\t\tfor (const field of fields) {\n\t\t\t\tfieldMap.set(field.slug, { type: field.type });\n\t\t\t}\n\n\t\t\tresult.set(collection.slug, {\n\t\t\t\tslug: collection.slug,\n\t\t\t\tfields: fieldMap,\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(\"Could not fetch schema registry:\", error);\n\t}\n\n\treturn result;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress-plugin/analyze.ts"],"sourcesContent":["/**\n * WordPress Plugin analyze endpoint\n *\n * POST /_emdash/api/import/wordpress-plugin/analyze\n *\n * Analyzes a WordPress site with EmDash Exporter plugin installed.\n * Returns content counts, schema compatibility, etc.\n */\n\nimport type { APIRoute } from \"astro\";\nimport { SchemaRegistry } from \"emdash\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpPluginAnalyzeBody } from \"#api/schemas.js\";\nimport { getSource } from \"#import/index.js\";\nimport { resolveAndValidateExternalUrl, SsrfError } from \"#import/ssrf.js\";\nimport type { ImportAnalysis } from \"#import/types.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nexport const prerender = false;\n\nexport interface WpPluginAnalyzeResponse {\n\tsuccess: boolean;\n\tanalysis?: ImportAnalysis;\n\terror?: { message: string };\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, wpPluginAnalyzeBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// SSRF: reject internal/private network targets. Uses DNS resolution\n\t\t// to catch hostnames that resolve to private addresses.\n\t\ttry {\n\t\t\tawait resolveAndValidateExternalUrl(body.url);\n\t\t} catch (e) {\n\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\treturn apiError(\"SSRF_BLOCKED\", msg, 400);\n\t\t}\n\n\t\t// Get the WordPress plugin source\n\t\tconst source = getSource(\"wordpress-plugin\");\n\t\tif (!source) {\n\t\t\treturn apiError(\"NOT_CONFIGURED\", \"WordPress plugin source not available\", 500);\n\t\t}\n\n\t\t// Build context with existing collections info\n\t\tconst existingCollections = await fetchExistingCollections(emdash?.db);\n\n\t\t// Analyze the site\n\t\tconst analysis = await source.analyze(\n\t\t\t{ type: \"url\", url: body.url, token: body.token },\n\t\t\t{\n\t\t\t\tdb: emdash?.db,\n\t\t\t\tgetExistingCollections: async () => existingCollections,\n\t\t\t},\n\t\t);\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\tanalysis,\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to analyze WordPress site\", \"WP_PLUGIN_ANALYZE_ERROR\");\n\t}\n};\n\n/** Existing collection info from schema registry */\ninterface ExistingCollection {\n\tslug: string;\n\tfields: Map<string, { type: string }>;\n}\n\n/** Fetch collections and their fields from schema registry */\nasync function fetchExistingCollections(\n\tdb: EmDashHandlers[\"db\"] | undefined,\n): Promise<Map<string, ExistingCollection>> {\n\tconst result = new Map<string, ExistingCollection>();\n\n\tif (!db) return result;\n\n\ttry {\n\t\tconst registry = new SchemaRegistry(db);\n\t\tconst collections = await registry.listCollections();\n\n\t\tfor (const collection of collections) {\n\t\t\tconst fields = await registry.listFields(collection.id);\n\t\t\tconst fieldMap = new Map<string, { type: string }>();\n\n\t\t\tfor (const field of fields) {\n\t\t\t\tfieldMap.set(field.slug, { type: field.type });\n\t\t\t}\n\n\t\t\tresult.set(collection.slug, {\n\t\t\t\tslug: collection.slug,\n\t\t\t\tfields: fieldMap,\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(\"Could not fetch schema registry:\", error);\n\t}\n\n\treturn result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,MAAa,YAAY;AAQzB,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,oBAAoB;AAC1D,MAAI,aAAa,KAAK,CAAE,QAAO;AAI/B,MAAI;AACH,SAAM,8BAA8B,KAAK,IAAI;WACrC,GAAG;AAEX,UAAO,SAAS,gBADJ,aAAa,YAAY,EAAE,UAAU,eACZ,IAAI;;EAI1C,MAAM,SAAS,UAAU,mBAAmB;AAC5C,MAAI,CAAC,OACJ,QAAO,SAAS,kBAAkB,yCAAyC,IAAI;EAIhF,MAAM,sBAAsB,MAAM,yBAAyB,QAAQ,GAAG;AAWtE,SAAO,WAAW;GACjB,SAAS;GACT,UAVgB,MAAM,OAAO,QAC7B;IAAE,MAAM;IAAO,KAAK,KAAK;IAAK,OAAO,KAAK;IAAO,EACjD;IACC,IAAI,QAAQ;IACZ,wBAAwB,YAAY;IACpC,CACD;GAKA,CAAC;UACM,OAAO;AACf,SAAO,YAAY,OAAO,oCAAoC,0BAA0B;;;;AAW1F,eAAe,yBACd,IAC2C;CAC3C,MAAM,yBAAS,IAAI,KAAiC;AAEpD,KAAI,CAAC,GAAI,QAAO;AAEhB,KAAI;EACH,MAAM,WAAW,IAAI,eAAe,GAAG;EACvC,MAAM,cAAc,MAAM,SAAS,iBAAiB;AAEpD,OAAK,MAAM,cAAc,aAAa;GACrC,MAAM,SAAS,MAAM,SAAS,WAAW,WAAW,GAAG;GACvD,MAAM,2BAAW,IAAI,KAA+B;AAEpD,QAAK,MAAM,SAAS,OACnB,UAAS,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,MAAM,CAAC;AAG/C,UAAO,IAAI,WAAW,MAAM;IAC3B,MAAM,WAAW;IACjB,QAAQ;IACR,CAAC;;UAEK,OAAO;AACf,UAAQ,KAAK,oCAAoC,MAAM;;AAGxD,QAAO"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import "../../../../../parse-
|
|
2
|
-
import "../../../../../types-
|
|
3
|
-
import "../../../../../types-
|
|
4
|
-
import "../../../../../options-
|
|
5
|
-
import "../../../../../entry-lock-
|
|
6
|
-
import "../../../../../config-
|
|
7
|
-
import "../../../../../runner-
|
|
8
|
-
import "../../../../../storage-query-
|
|
9
|
-
import { t as fetchPluginTaxonomies } from "../../../../../index-
|
|
10
|
-
import { f as NormalizedItem, s as ImportConfig, u as ImportResult } from "../../../../../types-
|
|
11
|
-
import "../../../../../hreflang-
|
|
12
|
-
import "../../../../../validate-
|
|
1
|
+
import "../../../../../parse-D5Sw9wAI.mjs";
|
|
2
|
+
import "../../../../../types-DZeDpzMc.mjs";
|
|
3
|
+
import "../../../../../types-pOLeFKGq.mjs";
|
|
4
|
+
import "../../../../../options-C2IDQnD2.mjs";
|
|
5
|
+
import "../../../../../entry-lock-B-1bUDxX.mjs";
|
|
6
|
+
import "../../../../../config-DHsDMpXc.mjs";
|
|
7
|
+
import "../../../../../runner-Ji7qyH2A.mjs";
|
|
8
|
+
import "../../../../../storage-query-C9bK0Dg6.mjs";
|
|
9
|
+
import { t as fetchPluginTaxonomies } from "../../../../../index-D1_ykO2u.mjs";
|
|
10
|
+
import { f as NormalizedItem, s as ImportConfig, u as ImportResult } from "../../../../../types-DuQAIPA-.mjs";
|
|
11
|
+
import "../../../../../hreflang-C7ETs0Tv.mjs";
|
|
12
|
+
import "../../../../../validate-dK97qe7F.mjs";
|
|
13
13
|
import { EmDashHandlers, EmDashManifest } from "../../../../types.mjs";
|
|
14
|
-
import { t as TaxonomyImportPlan } from "../../../../../wxr-taxonomies-
|
|
14
|
+
import { t as TaxonomyImportPlan } from "../../../../../wxr-taxonomies-B6iE8m9I.mjs";
|
|
15
15
|
import { APIRoute } from "astro";
|
|
16
16
|
|
|
17
17
|
//#region src/astro/routes/api/import/wordpress-plugin/execute.d.ts
|
|
@@ -4,43 +4,44 @@ import "../../../../../after-PcEvMY_6.mjs";
|
|
|
4
4
|
import "../../../../../options-DhrI7eMv.mjs";
|
|
5
5
|
import "../../../../../base64-DvnNgP7e.mjs";
|
|
6
6
|
import "../../../../../secrets-CIi0nFiR.mjs";
|
|
7
|
-
import "../../../../../object-cache-
|
|
7
|
+
import "../../../../../object-cache-Bo6DGaC9.mjs";
|
|
8
8
|
import { n as slugify } from "../../../../../slugify-T5GHH42D.mjs";
|
|
9
|
-
import "../../../../../
|
|
10
|
-
import "../../../../../
|
|
11
|
-
import "../../../../../
|
|
12
|
-
import "../../../../../
|
|
13
|
-
import "../../../../../
|
|
14
|
-
import "../../../../../
|
|
15
|
-
import "../../../../../
|
|
16
|
-
import
|
|
17
|
-
import "../../../../../
|
|
18
|
-
import "../../../../../
|
|
19
|
-
import "../../../../../
|
|
20
|
-
import "../../../../../
|
|
21
|
-
import "../../../../../
|
|
22
|
-
import "../../../../../
|
|
23
|
-
import "../../../../../
|
|
24
|
-
import "../../../../../
|
|
25
|
-
import "../../../../../
|
|
26
|
-
import "../../../../../settings-
|
|
27
|
-
import
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import { n as
|
|
31
|
-
import "../../../../../
|
|
32
|
-
import "../../../../../
|
|
33
|
-
import "../../../../../
|
|
34
|
-
import "../../../../../
|
|
35
|
-
import
|
|
36
|
-
import "../../../../../
|
|
37
|
-
import "../../../../../
|
|
9
|
+
import "../../../../../request-cache-C4CIo5ad.mjs";
|
|
10
|
+
import "../../../../../url-Dn3IStq8.mjs";
|
|
11
|
+
import "../../../../../types-j6MBDjlZ.mjs";
|
|
12
|
+
import "../../../../../media-CputjGE1.mjs";
|
|
13
|
+
import "../../../../../taxonomy-BesdHIwi.mjs";
|
|
14
|
+
import "../../../../../resolve-D-kqyKns.mjs";
|
|
15
|
+
import "../../../../../byline-registry-dvt4N3xV.mjs";
|
|
16
|
+
import "../../../../../field-defs-cache-DEkFYCDE.mjs";
|
|
17
|
+
import { t as BylineRepository } from "../../../../../byline-02tu_Uc-.mjs";
|
|
18
|
+
import "../../../../../dist-Cfu8mMBs.mjs";
|
|
19
|
+
import "../../../../../enrich-BDdVNeDK.mjs";
|
|
20
|
+
import "../../../../../loader-B_bcoE1h.mjs";
|
|
21
|
+
import "../../../../../collection-slugs-cache-BNRAPNiu.mjs";
|
|
22
|
+
import "../../../../../taxonomies-DWv-OYT0.mjs";
|
|
23
|
+
import "../../../../../errors-CjXd1LgH.mjs";
|
|
24
|
+
import "../../../../../errors-CNvATh_7.mjs";
|
|
25
|
+
import "../../../../../settings-B0zQj_Tj.mjs";
|
|
26
|
+
import "../../../../../site-settings-AYFvhwQn.mjs";
|
|
27
|
+
import "../../../../../settings-BbVRRGDp.mjs";
|
|
28
|
+
import { t as handleTaxonomyCreate } from "../../../../../taxonomies-DQGomz9p.mjs";
|
|
29
|
+
import { r as resolveAndValidateExternalUrl, t as SsrfError } from "../../../../../ssrf-DsmvZB80.mjs";
|
|
30
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CEdm_AWU.mjs";
|
|
31
|
+
import { n as parseBody, t as isParseError } from "../../../../../parse-Gt2l4Sld.mjs";
|
|
32
|
+
import "../../../../../redirects-D4EWeXAo.mjs";
|
|
33
|
+
import "../../../../../entry-lock-PP1JCXBB.mjs";
|
|
34
|
+
import "../../../../../media-D1z_jisb.mjs";
|
|
35
|
+
import "../../../../../comments-BRtp992B.mjs";
|
|
36
|
+
import { h as wpPluginExecuteBody } from "../../../../../byline-fields-DHJs0Mja.mjs";
|
|
37
|
+
import "../../../../../menus-BQKqf0Up.mjs";
|
|
38
|
+
import "../../../../../status-D39Fpy8R.mjs";
|
|
38
39
|
import "../../../../../api/schemas/index.mjs";
|
|
39
|
-
import { _ as importSiteSettings, a as fetchPluginOptions, i as fetchPluginMenus, n as fetchPluginCommentsPage, o as fetchPluginTaxonomies, p as getSource, r as fetchPluginContentPage, t as fetchPluginComments, v as parseSiteSettingsFromPlugin, x as importMenusFromPlugin, y as importCommentsFromPlugin } from "../../../../../import-
|
|
40
|
-
import "../../../../../ssrf-
|
|
41
|
-
import { _ as sanitizeFieldSlug, g as resolveImportByline } from "../../../../../utils-
|
|
42
|
-
import { i as requirePerm } from "../../../../../authorize-
|
|
43
|
-
import { a as preImportWxrTaxonomies, r as loadTaxonomyPlanFromDb, t as attachPostTaxonomies } from "../../../../../wxr-taxonomies-
|
|
40
|
+
import { _ as importSiteSettings, a as fetchPluginOptions, i as fetchPluginMenus, n as fetchPluginCommentsPage, o as fetchPluginTaxonomies, p as getSource, r as fetchPluginContentPage, t as fetchPluginComments, v as parseSiteSettingsFromPlugin, x as importMenusFromPlugin, y as importCommentsFromPlugin } from "../../../../../import-CzP9ffo0.mjs";
|
|
41
|
+
import "../../../../../ssrf-tA45vIPX.mjs";
|
|
42
|
+
import { _ as sanitizeFieldSlug, g as resolveImportByline } from "../../../../../utils-CoV-PYhg.mjs";
|
|
43
|
+
import { i as requirePerm } from "../../../../../authorize-soZXK7U0.mjs";
|
|
44
|
+
import { a as preImportWxrTaxonomies, r as loadTaxonomyPlanFromDb, t as attachPostTaxonomies } from "../../../../../wxr-taxonomies-DEzR9N7e.mjs";
|
|
44
45
|
import { importMediaWithProgress } from "../wordpress/media.mjs";
|
|
45
46
|
import { ContentRepository, SchemaRegistry } from "emdash";
|
|
46
47
|
|