emdash 1.1.0 → 1.3.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-SK8zyN7w.mjs +26 -0
- package/dist/action-token-SK8zyN7w.mjs.map +1 -0
- package/dist/activation-Dim4YMM7.mjs +387 -0
- package/dist/activation-Dim4YMM7.mjs.map +1 -0
- package/dist/adapters-F_xorvWv.d.mts +173 -0
- package/dist/adapters-F_xorvWv.d.mts.map +1 -0
- package/dist/allowed-origins-CEug-p0t.mjs +116 -0
- package/dist/allowed-origins-CEug-p0t.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +4 -4
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +48 -46
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +10 -10
- package/dist/api-D-7BNHoz.mjs +5025 -0
- package/dist/api-D-7BNHoz.mjs.map +1 -0
- package/dist/api-tokens-Bx38ZCQp.mjs +173 -0
- package/dist/api-tokens-Bx38ZCQp.mjs.map +1 -0
- package/dist/apply-T7ATgzCh.mjs +1702 -0
- package/dist/apply-T7ATgzCh.mjs.map +1 -0
- package/dist/approvals-D-m6wvGl.mjs +460 -0
- package/dist/approvals-D-m6wvGl.mjs.map +1 -0
- package/dist/artifact-fetch-DIh7iyOV.mjs +659 -0
- package/dist/artifact-fetch-DIh7iyOV.mjs.map +1 -0
- package/dist/artifacts-htGyfCSt.mjs +307 -0
- package/dist/artifacts-htGyfCSt.mjs.map +1 -0
- package/dist/astro/image-endpoint.d.mts.map +1 -1
- package/dist/astro/image-endpoint.mjs +26 -6
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +324 -23
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +18 -13
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +81 -46
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +117 -56
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -12
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +145 -415
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +7 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +8 -7
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +16 -16
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +16 -16
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +16 -16
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -21
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -21
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +22 -21
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
- package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
- package/dist/astro/routes/api/admin/core-update.mjs +7 -7
- 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 +20 -20
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +21 -21
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +21 -21
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +29 -28
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +21 -21
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +21 -21
- 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 +72 -70
- 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 +71 -69
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +71 -70
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +80 -79
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +72 -70
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -69
- 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 +79 -78
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -69
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +71 -70
- 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 +81 -80
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +10 -10
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +73 -72
- 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 +72 -70
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -69
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -69
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +7 -7
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -69
- 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 +38 -37
- 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 +38 -37
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +40 -39
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +40 -39
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +40 -39
- 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 +41 -40
- 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 +41 -40
- 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 +40 -39
- 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 +41 -40
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +42 -41
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +40 -39
- 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 +40 -39
- 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 +42 -41
- 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 +40 -39
- 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 +42 -41
- 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 +40 -39
- 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 +40 -39
- 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 +42 -41
- 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 +40 -39
- 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 +40 -39
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +42 -41
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +14 -14
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/index.mjs +14 -14
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/handover.d.mts +8 -0
- package/dist/astro/routes/api/auth/handover.d.mts.map +1 -0
- package/dist/astro/routes/api/auth/handover.mjs +49 -0
- package/dist/astro/routes/api/auth/handover.mjs.map +1 -0
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.mjs +19 -19
- package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
- package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
- 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 +23 -17
- package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/me.mjs +15 -15
- package/dist/astro/routes/api/auth/mode.mjs +5 -5
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +8 -8
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
- package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
- package/dist/astro/routes/api/auth/passkey/options.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +27 -20
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/passkey/verify.mjs +19 -19
- package/dist/astro/routes/api/auth/signup/complete.mjs +19 -19
- 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/calendar.mjs +15 -15
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +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 +7 -10
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +20 -17
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +7 -6
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +30 -29
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.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 +35 -34
- 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 +35 -34
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +7 -6
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +19 -18
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +31 -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.d.mts.map +1 -1
- 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_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +27 -20
- 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 +18 -21
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
- package/dist/astro/routes/api/dashboard.d.mts.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +18 -12
- 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/dev/scheduled-tasks.d.mts +12 -0
- package/dist/astro/routes/api/dev/scheduled-tasks.d.mts.map +1 -0
- package/dist/astro/routes/api/dev/scheduled-tasks.mjs +140 -0
- package/dist/astro/routes/api/dev/scheduled-tasks.mjs.map +1 -0
- 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 -23
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +7 -20
- package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +15 -14
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +36 -30
- 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 +17 -17
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -17
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +8 -0
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +67 -31
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +27 -26
- 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 +26 -23
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +63 -35
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +9 -6
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +135 -101
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +34 -18
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/replace.mjs +15 -15
- package/dist/astro/routes/api/media/_id_/upload.mjs +8 -8
- package/dist/astro/routes/api/media/_id_/usage.mjs +31 -30
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +29 -28
- 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_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +45 -15
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
- package/dist/astro/routes/api/media/folders/index.mjs +16 -16
- 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 +40 -20
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +40 -29
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.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.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +18 -17
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +18 -17
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +18 -17
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.d.mts.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.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +18 -17
- 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 +12 -11
- package/dist/astro/routes/api/oauth/device/code.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/token.mjs +11 -10
- package/dist/astro/routes/api/oauth/device/token.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/register.mjs +8 -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 +22 -22
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
- package/dist/astro/routes/api/redirects/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +32 -23
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.d.mts.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +24 -21
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +35 -34
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +35 -34
- 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.mjs +16 -16
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -69
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -69
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/index.mjs +71 -69
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +71 -69
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -69
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -69
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -69
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +71 -69
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -69
- 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 +71 -69
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +71 -69
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -18
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +18 -17
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +19 -18
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +9 -8
- package/dist/astro/routes/api/search/stats.mjs.map +1 -1
- package/dist/astro/routes/api/search/suggest.mjs +18 -17
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +18 -17
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +18 -17
- 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/domain-notify.d.mts +8 -0
- package/dist/astro/routes/api/settings/domain-notify.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/domain-notify.mjs +125 -0
- package/dist/astro/routes/api/settings/domain-notify.mjs.map +1 -0
- package/dist/astro/routes/api/settings/domain.d.mts +9 -0
- package/dist/astro/routes/api/settings/domain.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/domain.mjs +64 -0
- package/dist/astro/routes/api/settings/domain.mjs.map +1 -0
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.d.mts.map +1 -1
- package/dist/astro/routes/api/settings.mjs +23 -20
- 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 +25 -21
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +18 -18
- package/dist/astro/routes/api/setup/dev-bypass.mjs +43 -41
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/index.mjs +53 -47
- 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/site/domain-proof.d.mts +8 -0
- package/dist/astro/routes/api/site/domain-proof.d.mts.map +1 -0
- package/dist/astro/routes/api/site/domain-proof.mjs +35 -0
- package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -0
- package/dist/astro/routes/api/snapshot.mjs +8 -8
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +24 -22
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +24 -22
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +24 -22
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -21
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -23
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +35 -34
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +24 -22
- 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.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +18 -18
- 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.d.mts.map +1 -1
- 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_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +21 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -18
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +10 -8
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +20 -18
- 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.d.mts.map +1 -1
- package/dist/astro/routes/robots.txt.mjs +38 -5
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.d.mts.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +33 -11
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.d.mts.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +17 -11
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +32 -18
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-_gieLVGU.mjs +127 -0
- package/dist/audit-_gieLVGU.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/auth/providers/microsoft.d.mts +1 -1
- package/dist/authoritative-records-CQlB3JzE.mjs +5183 -0
- package/dist/authoritative-records-CQlB3JzE.mjs.map +1 -0
- package/dist/authorize-DPFBGbE6.mjs +74 -0
- package/dist/authorize-DPFBGbE6.mjs.map +1 -0
- package/dist/backup-3FgVxiDJ.mjs +246 -0
- package/dist/backup-3FgVxiDJ.mjs.map +1 -0
- package/dist/block-types-CYcG56JB.mjs +132 -0
- package/dist/block-types-CYcG56JB.mjs.map +1 -0
- package/dist/block-values-gCX4HBSl.mjs +215 -0
- package/dist/block-values-gCX4HBSl.mjs.map +1 -0
- package/dist/byline-BR1qhyiw.mjs +909 -0
- package/dist/byline-BR1qhyiw.mjs.map +1 -0
- package/dist/byline-fields-4ClDC88c.mjs +123 -0
- package/dist/byline-fields-4ClDC88c.mjs.map +1 -0
- package/dist/byline-fields-BLXZnX7N.mjs +280 -0
- package/dist/byline-fields-BLXZnX7N.mjs.map +1 -0
- package/dist/bylines-CVOvRUL7.mjs +234 -0
- package/dist/bylines-CVOvRUL7.mjs.map +1 -0
- package/dist/bylines-DxOs9B7z.mjs +150 -0
- package/dist/bylines-DxOs9B7z.mjs.map +1 -0
- package/dist/cache-CEU9wo_h.mjs +151 -0
- package/dist/cache-CEU9wo_h.mjs.map +1 -0
- package/dist/canonical-BudtH-Fx.mjs +174 -0
- package/dist/canonical-BudtH-Fx.mjs.map +1 -0
- package/dist/capture-triggers-CT6dK9zd.mjs +362 -0
- package/dist/capture-triggers-CT6dK9zd.mjs.map +1 -0
- package/dist/challenge-store-C17BYx2-.mjs +51 -0
- package/dist/challenge-store-C17BYx2-.mjs.map +1 -0
- package/dist/checksum-CEqvfxGX.mjs +162 -0
- package/dist/checksum-CEqvfxGX.mjs.map +1 -0
- package/dist/chunks-xC4UD5-S.mjs +25 -0
- package/dist/chunks-xC4UD5-S.mjs.map +1 -0
- package/dist/cli/index.mjs +134 -118
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +122 -122
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +12 -10
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-slugs-cache-e09QeJQt.mjs +85 -0
- package/dist/collection-slugs-cache-e09QeJQt.mjs.map +1 -0
- package/dist/comment-UvIWDKcW.mjs +325 -0
- package/dist/comment-UvIWDKcW.mjs.map +1 -0
- package/dist/comment-reaction-dGp6_FRo.mjs +85 -0
- package/dist/comment-reaction-dGp6_FRo.mjs.map +1 -0
- package/dist/comments-pej-_BUO.mjs +195 -0
- package/dist/comments-pej-_BUO.mjs.map +1 -0
- package/dist/comments-yiRFx3w5.mjs +99 -0
- package/dist/comments-yiRFx3w5.mjs.map +1 -0
- package/dist/components-Brp__9xo.mjs +112 -0
- package/dist/components-Brp__9xo.mjs.map +1 -0
- package/dist/config-Bsm_u_oE.d.mts +6799 -0
- package/dist/config-Bsm_u_oE.d.mts.map +1 -0
- package/dist/config-CFMojMFK.d.mts +39 -0
- package/dist/config-CFMojMFK.d.mts.map +1 -0
- package/dist/config-DBU6iUQB.mjs +228 -0
- package/dist/config-DBU6iUQB.mjs.map +1 -0
- package/dist/connection-BtEN_lP9.mjs +36 -0
- package/dist/connection-BtEN_lP9.mjs.map +1 -0
- package/dist/content-DQSRZTVw.mjs +2075 -0
- package/dist/content-DQSRZTVw.mjs.map +1 -0
- package/dist/content-list-query-CYKcY6Vi.d.mts +26 -0
- package/dist/content-list-query-CYKcY6Vi.d.mts.map +1 -0
- package/dist/content-repair-DNh5--x5.mjs +442 -0
- package/dist/content-repair-DNh5--x5.mjs.map +1 -0
- package/dist/context-BYptmCN0.mjs +2090 -0
- package/dist/context-BYptmCN0.mjs.map +1 -0
- package/dist/credits-B9iORdWB.mjs +110 -0
- package/dist/credits-B9iORdWB.mjs.map +1 -0
- package/dist/cron-D7obTIfk.mjs +306 -0
- package/dist/cron-D7obTIfk.mjs.map +1 -0
- package/dist/dashboard-D0jcgBD7.mjs +167 -0
- package/dist/dashboard-D0jcgBD7.mjs.map +1 -0
- package/dist/database/migration-lock.d.mts +17 -4
- package/dist/database/migration-lock.d.mts.map +1 -1
- package/dist/database/migration-lock.mjs +32 -5
- package/dist/database/migration-lock.mjs.map +1 -1
- 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-C0W-PhAp.mjs +81 -0
- package/dist/default-C0W-PhAp.mjs.map +1 -0
- package/dist/deferred-tasks-ZvUECSzI.d.mts +9 -0
- package/dist/deferred-tasks-ZvUECSzI.d.mts.map +1 -0
- package/dist/dev-typegen-EBni_pOQ.mjs +29 -0
- package/dist/dev-typegen-EBni_pOQ.mjs.map +1 -0
- package/dist/device-flow-BkFKBoAn.mjs +521 -0
- package/dist/device-flow-BkFKBoAn.mjs.map +1 -0
- package/dist/digest-DJ1tHCgy.mjs +194 -0
- package/dist/digest-DJ1tHCgy.mjs.map +1 -0
- package/dist/direct-executor-Cbxzg4qe.mjs +117 -0
- package/dist/direct-executor-Cbxzg4qe.mjs.map +1 -0
- package/dist/email-console-FFVJWb9N.mjs +50 -0
- package/dist/email-console-FFVJWb9N.mjs.map +1 -0
- package/dist/email-locale-BJ8DjTzZ.mjs +25 -0
- package/dist/email-locale-BJ8DjTzZ.mjs.map +1 -0
- package/dist/emdash-runtime-DVi7vtXC.mjs +4379 -0
- package/dist/emdash-runtime-DVi7vtXC.mjs.map +1 -0
- package/dist/entry-lock-C7VX0NGK.d.mts +4568 -0
- package/dist/entry-lock-C7VX0NGK.d.mts.map +1 -0
- package/dist/entry-lock-DLxCffFW.mjs +163 -0
- package/dist/entry-lock-DLxCffFW.mjs.map +1 -0
- package/dist/entry-lock-Df6-XhIu.mjs +1211 -0
- package/dist/entry-lock-Df6-XhIu.mjs.map +1 -0
- package/dist/env-types-C3FCVBWe.mjs +38 -0
- package/dist/env-types-C3FCVBWe.mjs.map +1 -0
- package/dist/error-CVWeIOku.mjs +90 -0
- package/dist/error-CVWeIOku.mjs.map +1 -0
- package/dist/errors-B4f4It-2.mjs +120 -0
- package/dist/errors-B4f4It-2.mjs.map +1 -0
- package/dist/errors-BOYNdIo3.mjs +479 -0
- package/dist/errors-BOYNdIo3.mjs.map +1 -0
- package/dist/escape-lsNq38PP.mjs +9 -0
- package/dist/escape-lsNq38PP.mjs.map +1 -0
- package/dist/fence-C3MUitUN.mjs +162 -0
- package/dist/fence-C3MUitUN.mjs.map +1 -0
- package/dist/field-defs-cache-Dez5iWJJ.mjs +77 -0
- package/dist/field-defs-cache-Dez5iWJJ.mjs.map +1 -0
- package/dist/field-map-Bft9LKak.mjs +83 -0
- package/dist/field-map-Bft9LKak.mjs.map +1 -0
- package/dist/fts-manager-Beg3e4bI.mjs +443 -0
- package/dist/fts-manager-Beg3e4bI.mjs.map +1 -0
- package/dist/gc-ByyAYiYE.mjs +75 -0
- package/dist/gc-ByyAYiYE.mjs.map +1 -0
- package/dist/hash-BJaeek87.mjs +37 -0
- package/dist/hash-BJaeek87.mjs.map +1 -0
- package/dist/hook-result-BrdLyOdI.d.mts +31 -0
- package/dist/hook-result-BrdLyOdI.d.mts.map +1 -0
- package/dist/hreflang-C8Jb-hrf.mjs +105 -0
- package/dist/hreflang-C8Jb-hrf.mjs.map +1 -0
- package/dist/hreflang-CY_F5OjF.d.mts +50 -0
- package/dist/hreflang-CY_F5OjF.d.mts.map +1 -0
- package/dist/http-route-dispatch-CyeW6iPv.mjs +342 -0
- package/dist/http-route-dispatch-CyeW6iPv.mjs.map +1 -0
- package/dist/identity-Cael5uTT.mjs +35 -0
- package/dist/identity-Cael5uTT.mjs.map +1 -0
- package/dist/import-BUXjdZUn.mjs +2126 -0
- package/dist/import-BUXjdZUn.mjs.map +1 -0
- package/dist/index-BB9sVisO.d.mts +623 -0
- package/dist/index-BB9sVisO.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +97 -95
- package/dist/install-finalization-3JX5qQEA.mjs +58 -0
- package/dist/install-finalization-3JX5qQEA.mjs.map +1 -0
- package/dist/json-recordset-BUjxhr77.mjs +12 -0
- package/dist/json-recordset-BUjxhr77.mjs.map +1 -0
- package/dist/json-schema-v_D_pPNG.mjs +15 -0
- package/dist/json-schema-v_D_pPNG.mjs.map +1 -0
- package/dist/keys-CifIkT0N.mjs +61 -0
- package/dist/keys-CifIkT0N.mjs.map +1 -0
- package/dist/kinds-B_Qcl5pz.mjs +974 -0
- package/dist/kinds-B_Qcl5pz.mjs.map +1 -0
- package/dist/lifecycle-7vUJeFRe.mjs +25 -0
- package/dist/lifecycle-7vUJeFRe.mjs.map +1 -0
- package/dist/load-CdAG9wz-.mjs +28 -0
- package/dist/load-CdAG9wz-.mjs.map +1 -0
- package/dist/loader-CswroUbe.mjs +1380 -0
- package/dist/loader-CswroUbe.mjs.map +1 -0
- package/dist/loops-uA4iTOzd.mjs +205 -0
- package/dist/loops-uA4iTOzd.mjs.map +1 -0
- package/dist/manifest-builder-B8zjuH3f.mjs +189 -0
- package/dist/manifest-builder-B8zjuH3f.mjs.map +1 -0
- package/dist/manifest-schema-DNb4XmTS.mjs +497 -0
- package/dist/manifest-schema-DNb4XmTS.mjs.map +1 -0
- package/dist/marketplace-CqbgeIa7.mjs +257 -0
- package/dist/marketplace-CqbgeIa7.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +26 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +73 -3
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +10 -5
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/media--dJRU6i2.mjs +294 -0
- package/dist/media--dJRU6i2.mjs.map +1 -0
- package/dist/media-1WC65OCB.mjs +416 -0
- package/dist/media-1WC65OCB.mjs.map +1 -0
- package/dist/media-Bws9f18T.mjs +373 -0
- package/dist/media-Bws9f18T.mjs.map +1 -0
- package/dist/media-allowlist-BJB7MFx6.mjs +45 -0
- package/dist/media-allowlist-BJB7MFx6.mjs.map +1 -0
- package/dist/media-folders-Dn3C16B8.mjs +210 -0
- package/dist/media-folders-Dn3C16B8.mjs.map +1 -0
- package/dist/media-url-BQgKvpQ5.mjs +43 -0
- package/dist/media-url-BQgKvpQ5.mjs.map +1 -0
- package/dist/media-usage-CF0WVcLO.mjs +282 -0
- package/dist/media-usage-CF0WVcLO.mjs.map +1 -0
- package/dist/media-usage-activation-C9HwVw5w.mjs +78 -0
- package/dist/media-usage-activation-C9HwVw5w.mjs.map +1 -0
- package/dist/media-usage-work-CkLa5-nc.mjs +1036 -0
- package/dist/media-usage-work-CkLa5-nc.mjs.map +1 -0
- package/dist/media-usage-work-m3AWTmmC.mjs +151 -0
- package/dist/media-usage-work-m3AWTmmC.mjs.map +1 -0
- package/dist/menus-BCVSSp1z.mjs +753 -0
- package/dist/menus-BCVSSp1z.mjs.map +1 -0
- package/dist/menus-BSzwObhV.mjs +92 -0
- package/dist/menus-BSzwObhV.mjs.map +1 -0
- package/dist/menus-Cl4kwdt7.mjs +3721 -0
- package/dist/menus-Cl4kwdt7.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.d.mts.map +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mode-C-D3qICy.mjs +23 -0
- package/dist/mode-C-D3qICy.mjs.map +1 -0
- package/dist/node-sqlite-compat-CrKzRr0J.mjs +63 -0
- package/dist/node-sqlite-compat-CrKzRr0J.mjs.map +1 -0
- package/dist/oauth-authorization-TpEJrYB7.mjs +274 -0
- package/dist/oauth-authorization-TpEJrYB7.mjs.map +1 -0
- package/dist/oauth-clients-BT0Pg-MO.mjs +266 -0
- package/dist/oauth-clients-BT0Pg-MO.mjs.map +1 -0
- package/dist/oauth-state-store-CHMn_mwc.mjs +50 -0
- package/dist/oauth-state-store-CHMn_mwc.mjs.map +1 -0
- package/dist/oauth-user-lookup-BDgF6IVG.mjs +26 -0
- package/dist/oauth-user-lookup-BDgF6IVG.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/options-DJWaq3Ie.d.mts +81 -0
- package/dist/options-DJWaq3Ie.d.mts.map +1 -0
- package/dist/ownership-MiyA7qKO.mjs +12 -0
- package/dist/ownership-MiyA7qKO.mjs.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +9 -4
- package/dist/page/index.mjs.map +1 -1
- package/dist/parse-CWHOFc6z.d.mts +176 -0
- package/dist/parse-CWHOFc6z.d.mts.map +1 -0
- package/dist/parse-DgQ2NABT.mjs +81 -0
- package/dist/parse-DgQ2NABT.mjs.map +1 -0
- package/dist/passkey-config-D0kdzEao.mjs +46 -0
- package/dist/passkey-config-D0kdzEao.mjs.map +1 -0
- package/dist/paths-biDzFTY2.mjs +77 -0
- package/dist/paths-biDzFTY2.mjs.map +1 -0
- package/dist/patterns-CMNnYCgf.mjs +159 -0
- package/dist/patterns-CMNnYCgf.mjs.map +1 -0
- package/dist/placeholder-D41vk11_.d.mts +306 -0
- package/dist/placeholder-D41vk11_.d.mts.map +1 -0
- package/dist/plan-CCoqxNoU.mjs +135 -0
- package/dist/plan-CCoqxNoU.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.d.mts.map +1 -1
- package/dist/plugin-test-runtime.mjs +110 -108
- package/dist/plugin-tool-name-DDUgN_0p.mjs +27 -0
- package/dist/plugin-tool-name-DDUgN_0p.mjs.map +1 -0
- package/dist/plugin-types.d.mts +2 -2
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugin-utils.mjs +1 -1
- package/dist/plugin-utils.mjs.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +9 -8
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/plugins/host.d.mts +5 -5
- package/dist/plugins/host.mjs +46 -42
- package/dist/plugins-COJ2L49n.mjs +261 -0
- package/dist/plugins-COJ2L49n.mjs.map +1 -0
- package/dist/policy-DLQ--Hnm.mjs +45 -0
- package/dist/policy-DLQ--Hnm.mjs.map +1 -0
- package/dist/portable-text-BH4zgkSm.mjs +311 -0
- package/dist/portable-text-BH4zgkSm.mjs.map +1 -0
- package/dist/preview-DLexxwp3.mjs +107 -0
- package/dist/preview-DLexxwp3.mjs.map +1 -0
- package/dist/protocol-79kUO7jP.d.mts +65 -0
- package/dist/protocol-79kUO7jP.d.mts.map +1 -0
- package/dist/public-plugin-api-routes-BuAMJ8nN.mjs +316 -0
- package/dist/public-plugin-api-routes-BuAMJ8nN.mjs.map +1 -0
- package/dist/public-submission-Di3TsgzX.mjs +251 -0
- package/dist/public-submission-Di3TsgzX.mjs.map +1 -0
- package/dist/public-url-Bt98vysr.mjs +101 -0
- package/dist/public-url-Bt98vysr.mjs.map +1 -0
- package/dist/query-CpnRlBh8.mjs +1156 -0
- package/dist/query-CpnRlBh8.mjs.map +1 -0
- package/dist/query-haKvLAWl.mjs +41 -0
- package/dist/query-haKvLAWl.mjs.map +1 -0
- package/dist/range-CYfeXgGK.mjs +51 -0
- package/dist/range-CYfeXgGK.mjs.map +1 -0
- package/dist/rate-limit-Xp4d0NBY.mjs +127 -0
- package/dist/rate-limit-Xp4d0NBY.mjs.map +1 -0
- package/dist/receipt-BUsQCOeM.mjs +43 -0
- package/dist/receipt-BUsQCOeM.mjs.map +1 -0
- package/dist/redirect-CQAV7mCo.mjs +19 -0
- package/dist/redirect-CQAV7mCo.mjs.map +1 -0
- package/dist/redirect-DiS_3mA4.mjs +423 -0
- package/dist/redirect-DiS_3mA4.mjs.map +1 -0
- package/dist/redirect-paths-CNYq7w80.mjs +36 -0
- package/dist/redirect-paths-CNYq7w80.mjs.map +1 -0
- package/dist/redirects-BEVSRMa2.mjs +148 -0
- package/dist/redirects-BEVSRMa2.mjs.map +1 -0
- package/dist/redirects-BHpy-VsZ.mjs +446 -0
- package/dist/redirects-BHpy-VsZ.mjs.map +1 -0
- package/dist/registry/testing.mjs +3 -3
- package/dist/registry-TUVaid9Z.mjs +8369 -0
- package/dist/registry-TUVaid9Z.mjs.map +1 -0
- package/dist/relations-CA_QuMTU.mjs +776 -0
- package/dist/relations-CA_QuMTU.mjs.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/request-meta-bwZ_NsvU.mjs +141 -0
- package/dist/request-meta-bwZ_NsvU.mjs.map +1 -0
- package/dist/resolve-DwNM-CXl.mjs +101 -0
- package/dist/resolve-DwNM-CXl.mjs.map +1 -0
- package/dist/revision-BVp8S0e_.mjs +374 -0
- package/dist/revision-BVp8S0e_.mjs.map +1 -0
- package/dist/route-cache-QSOyDEw0.mjs +20 -0
- package/dist/route-cache-QSOyDEw0.mjs.map +1 -0
- package/dist/route-wire-Ca_HWCZ5.mjs +197 -0
- package/dist/route-wire-Ca_HWCZ5.mjs.map +1 -0
- package/dist/routes-BerZFrvV.mjs +272 -0
- package/dist/routes-BerZFrvV.mjs.map +1 -0
- package/dist/runner-BObHz5FC.d.mts +68 -0
- package/dist/runner-BObHz5FC.d.mts.map +1 -0
- package/dist/runner-C5NeAkBQ.mjs +6595 -0
- package/dist/runner-C5NeAkBQ.mjs.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -2
- package/dist/runtime.mjs.map +1 -1
- package/dist/schema/project-env-types.mjs +40 -36
- package/dist/schema/project-env-types.mjs.map +1 -1
- package/dist/schema-C4OBuv6Z.mjs +13 -0
- package/dist/schema-C4OBuv6Z.mjs.map +1 -0
- package/dist/schema-DJRfvM_o.mjs +815 -0
- package/dist/schema-DJRfvM_o.mjs.map +1 -0
- package/dist/scopes-BU03K7Uo.mjs +34 -0
- package/dist/scopes-BU03K7Uo.mjs.map +1 -0
- package/dist/search-DfVzks89.mjs +450 -0
- package/dist/search-DfVzks89.mjs.map +1 -0
- package/dist/sections-BMy4JVUz.mjs +346 -0
- package/dist/sections-BMy4JVUz.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +38 -34
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +25 -21
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-ClB-dw9w.mjs +188 -0
- package/dist/seo-ClB-dw9w.mjs.map +1 -0
- package/dist/seo-VZYOEy8f.mjs +133 -0
- package/dist/seo-VZYOEy8f.mjs.map +1 -0
- package/dist/service-Bo_usgSk.mjs +150 -0
- package/dist/service-Bo_usgSk.mjs.map +1 -0
- package/dist/session-user-DlpPdf8L.mjs +61 -0
- package/dist/session-user-DlpPdf8L.mjs.map +1 -0
- package/dist/settings-CWb84sDm.mjs +452 -0
- package/dist/settings-CWb84sDm.mjs.map +1 -0
- package/dist/settings-DS914jjE.mjs +66 -0
- package/dist/settings-DS914jjE.mjs.map +1 -0
- package/dist/settings-Dd1uivmQ.mjs +73 -0
- package/dist/settings-Dd1uivmQ.mjs.map +1 -0
- package/dist/setup-complete-BuNxAUiN.mjs +65 -0
- package/dist/setup-complete-BuNxAUiN.mjs.map +1 -0
- package/dist/setup-nonce-BnEAX0iy.mjs +25 -0
- package/dist/setup-nonce-BnEAX0iy.mjs.map +1 -0
- package/dist/site-domain-Bq5j5bVg.mjs +131 -0
- package/dist/site-domain-Bq5j5bVg.mjs.map +1 -0
- package/dist/site-settings-DRHfX7bq.mjs +50 -0
- package/dist/site-settings-DRHfX7bq.mjs.map +1 -0
- package/dist/site-url-MB685I5X.mjs +45 -0
- package/dist/site-url-MB685I5X.mjs.map +1 -0
- package/dist/sitemap-name-BTg2NJJv.mjs +26 -0
- package/dist/sitemap-name-BTg2NJJv.mjs.map +1 -0
- package/dist/slug-aVnUV4SL.mjs +16 -0
- package/dist/slug-aVnUV4SL.mjs.map +1 -0
- package/dist/slugify-bu2-jKia.mjs +22 -0
- package/dist/slugify-bu2-jKia.mjs.map +1 -0
- package/dist/snapshot-DYsG4uOq.mjs +414 -0
- package/dist/snapshot-DYsG4uOq.mjs.map +1 -0
- package/dist/ssrf-BcYjyM4M.mjs +406 -0
- package/dist/ssrf-BcYjyM4M.mjs.map +1 -0
- package/dist/stage-D8DWgPcO.mjs +662 -0
- package/dist/stage-D8DWgPcO.mjs.map +1 -0
- package/dist/staged-CD_imitH.mjs +686 -0
- package/dist/staged-CD_imitH.mjs.map +1 -0
- package/dist/state-CFbGZziM.mjs +178 -0
- package/dist/state-CFbGZziM.mjs.map +1 -0
- package/dist/status-BFNdxzKc.mjs +30 -0
- package/dist/status-BFNdxzKc.mjs.map +1 -0
- package/dist/storage/local.d.mts +2 -2
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +12 -5
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +4 -2
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +56 -9
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/storage-query-DRyu3bSU.d.mts +1615 -0
- package/dist/storage-query-DRyu3bSU.d.mts.map +1 -0
- package/dist/tar-DFjExb9X.mjs +449 -0
- package/dist/tar-DFjExb9X.mjs.map +1 -0
- package/dist/target-CWZs2-o6.mjs +27 -0
- package/dist/target-CWZs2-o6.mjs.map +1 -0
- package/dist/taxonomies-ChnU7Mc8.mjs +697 -0
- package/dist/taxonomies-ChnU7Mc8.mjs.map +1 -0
- package/dist/taxonomies-Dd9JJv_a.mjs +939 -0
- package/dist/taxonomies-Dd9JJv_a.mjs.map +1 -0
- package/dist/taxonomy-C_C_LBAU.mjs +550 -0
- package/dist/taxonomy-C_C_LBAU.mjs.map +1 -0
- package/dist/tokens-BnhSnGwJ.mjs +171 -0
- package/dist/tokens-BnhSnGwJ.mjs.map +1 -0
- package/dist/transfer-ClH6w6BV.mjs +8873 -0
- package/dist/transfer-ClH6w6BV.mjs.map +1 -0
- package/dist/transfer-WmWiR3xf.mjs +166 -0
- package/dist/transfer-WmWiR3xf.mjs.map +1 -0
- package/dist/transfer-download--ofRj9Cw.mjs +33 -0
- package/dist/transfer-download--ofRj9Cw.mjs.map +1 -0
- package/dist/transformations-Bx4lYY0Y.mjs +196 -0
- package/dist/transformations-Bx4lYY0Y.mjs.map +1 -0
- package/dist/transport-BjbqNiPI.mjs +136 -0
- package/dist/transport-BjbqNiPI.mjs.map +1 -0
- package/dist/transport-DxiXnbXk.d.mts +42 -0
- package/dist/transport-DxiXnbXk.d.mts.map +1 -0
- package/dist/trusted-proxy-BU3Nx9g1.mjs +51 -0
- package/dist/trusted-proxy-BU3Nx9g1.mjs.map +1 -0
- package/dist/turnstile-CJwvsOqw.mjs +58 -0
- package/dist/turnstile-CJwvsOqw.mjs.map +1 -0
- package/dist/types-BA3ey2QH.d.mts +87 -0
- package/dist/types-BA3ey2QH.d.mts.map +1 -0
- package/dist/types-Bwpzb5o6.d.mts +227 -0
- package/dist/types-Bwpzb5o6.d.mts.map +1 -0
- package/dist/types-CNB-dj6F.d.mts +289 -0
- package/dist/types-CNB-dj6F.d.mts.map +1 -0
- package/dist/types-CgfFGfO5.mjs +16 -0
- package/dist/types-CgfFGfO5.mjs.map +1 -0
- package/dist/types-D2NEXtgB.mjs +127 -0
- package/dist/types-D2NEXtgB.mjs.map +1 -0
- package/dist/types-DCFavOii.d.mts +916 -0
- package/dist/types-DCFavOii.d.mts.map +1 -0
- package/dist/types-DHO7Pd25.d.mts +366 -0
- package/dist/types-DHO7Pd25.d.mts.map +1 -0
- package/dist/types-DvqVxZXa.d.mts +125 -0
- package/dist/types-DvqVxZXa.d.mts.map +1 -0
- package/dist/types-QoPHm-2w.d.mts +1741 -0
- package/dist/types-QoPHm-2w.d.mts.map +1 -0
- package/dist/types-RLgeIpnF.d.mts +374 -0
- package/dist/types-RLgeIpnF.d.mts.map +1 -0
- package/dist/types-qHVygneX.mjs +77 -0
- package/dist/types-qHVygneX.mjs.map +1 -0
- package/dist/types-sUHaH7lC.mjs +37 -0
- package/dist/types-sUHaH7lC.mjs.map +1 -0
- package/dist/types-slSqujQL.d.mts +204 -0
- package/dist/types-slSqujQL.d.mts.map +1 -0
- package/dist/update-check-BxNg9T6N.mjs +161 -0
- package/dist/update-check-BxNg9T6N.mjs.map +1 -0
- package/dist/upload-attempts-DPFC4COv.mjs +32 -0
- package/dist/upload-attempts-DPFC4COv.mjs.map +1 -0
- package/dist/url-pattern-QATUE_rv.mjs +41 -0
- package/dist/url-pattern-QATUE_rv.mjs.map +1 -0
- package/dist/user-BlCTKVAm.mjs +171 -0
- package/dist/user-BlCTKVAm.mjs.map +1 -0
- package/dist/utils-TPt7w2cS.mjs +442 -0
- package/dist/utils-TPt7w2cS.mjs.map +1 -0
- package/dist/validate-DxYhJQA-.mjs +524 -0
- package/dist/validate-DxYhJQA-.mjs.map +1 -0
- package/dist/validate-emKxGC5F.d.mts +468 -0
- package/dist/validate-emKxGC5F.d.mts.map +1 -0
- package/dist/validation-Ckq4vsVg.mjs +220 -0
- package/dist/validation-Ckq4vsVg.mjs.map +1 -0
- package/dist/version-BZj18Q7G.mjs +9 -0
- package/dist/version-BZj18Q7G.mjs.map +1 -0
- package/dist/version-DHmGpcch.mjs +7 -0
- package/dist/version-DHmGpcch.mjs.map +1 -0
- package/dist/video-DytCnw3L.mjs +54 -0
- package/dist/video-DytCnw3L.mjs.map +1 -0
- package/dist/virtual-modules-DO954n7P.mjs +515 -0
- package/dist/virtual-modules-DO954n7P.mjs.map +1 -0
- package/dist/widgets-DA5XmvVC.mjs +121 -0
- package/dist/widgets-DA5XmvVC.mjs.map +1 -0
- package/dist/wxr-taxonomies-CrMonejI.d.mts +34 -0
- package/dist/wxr-taxonomies-CrMonejI.d.mts.map +1 -0
- package/dist/wxr-taxonomies-RgRG0d5e.mjs +453 -0
- package/dist/wxr-taxonomies-RgRG0d5e.mjs.map +1 -0
- package/dist/zod-generator-D0JKy94C.mjs +424 -0
- package/dist/zod-generator-D0JKy94C.mjs.map +1 -0
- package/package.json +15 -11
- package/src/api/authorize.ts +42 -0
- package/src/api/errors.ts +9 -0
- package/src/api/handlers/api-tokens.ts +12 -6
- package/src/api/handlers/content.ts +57 -8
- package/src/api/handlers/dashboard.ts +33 -10
- package/src/api/handlers/domain-move-notice.ts +94 -0
- package/src/api/handlers/index.ts +2 -0
- package/src/api/handlers/manifest.ts +6 -0
- package/src/api/handlers/media-usage.ts +2 -1
- package/src/api/handlers/media.ts +1 -0
- package/src/api/handlers/plugins.ts +1 -0
- package/src/api/handlers/revision.ts +6 -2
- package/src/api/handlers/seo.ts +155 -59
- package/src/api/handlers/settings.ts +31 -1
- package/src/api/handlers/site-domain.ts +159 -0
- package/src/api/openapi/document.ts +2 -2
- package/src/api/public-url.ts +1 -1
- package/src/api/schemas/content.ts +20 -0
- package/src/api/schemas/media-usage.ts +7 -1
- package/src/api/schemas/media.ts +12 -0
- package/src/api/schemas/settings.ts +2 -0
- package/src/api/site-url.ts +53 -5
- package/src/api/types.ts +4 -0
- package/src/astro/image-endpoint.ts +46 -4
- package/src/astro/integration/admin-locales.ts +168 -0
- package/src/astro/integration/dev-env.ts +84 -0
- package/src/astro/integration/dev-scheduler-bridge.ts +91 -0
- package/src/astro/integration/index.ts +97 -10
- package/src/astro/integration/routes.ts +28 -0
- package/src/astro/integration/runtime.ts +17 -1
- package/src/astro/integration/virtual-modules.ts +9 -16
- package/src/astro/integration/vite-config.ts +22 -16
- package/src/astro/middleware/auth.ts +19 -4
- package/src/astro/middleware/csp.ts +1 -0
- package/src/astro/middleware/redirect.ts +94 -50
- package/src/astro/middleware/request-context.ts +12 -6
- package/src/astro/middleware.ts +71 -17
- package/src/astro/prefetch.ts +7 -5
- package/src/astro/public-plugin-api-routes.ts +10 -2
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +1 -1
- package/src/astro/routes/api/auth/handover.ts +58 -0
- package/src/astro/routes/api/auth/magic-link/verify.ts +11 -3
- package/src/astro/routes/api/auth/passkey/options.ts +10 -2
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +1 -5
- package/src/astro/routes/api/content/[collection]/[id]/lock.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +3 -2
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +5 -4
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id].ts +18 -6
- package/src/astro/routes/api/content/[collection]/index.ts +1 -5
- package/src/astro/routes/api/dashboard.ts +4 -1
- package/src/astro/routes/api/dev/scheduled-tasks.ts +20 -0
- package/src/astro/routes/api/import/wordpress/analyze.ts +1 -16
- package/src/astro/routes/api/import/wordpress/execute.ts +27 -3
- package/src/astro/routes/api/import/wordpress/rewrite-url-helpers.ts +80 -42
- package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +4 -1
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +49 -5
- package/src/astro/routes/api/manifest.ts +10 -0
- package/src/astro/routes/api/media/[id]/confirm.ts +19 -0
- package/src/astro/routes/api/media/file/[...key].ts +60 -12
- package/src/astro/routes/api/media/upload-url.ts +28 -4
- package/src/astro/routes/api/media.ts +15 -0
- package/src/astro/routes/api/menus/[name]/items/[id].ts +3 -2
- package/src/astro/routes/api/menus/[name]/items.ts +2 -1
- package/src/astro/routes/api/menus/[name]/reorder.ts +2 -1
- package/src/astro/routes/api/menus/[name]/translations.ts +2 -1
- package/src/astro/routes/api/menus/[name].ts +3 -2
- package/src/astro/routes/api/menus/index.ts +2 -1
- package/src/astro/routes/api/redirects/[id].ts +15 -2
- package/src/astro/routes/api/redirects/index.ts +5 -1
- package/src/astro/routes/api/schema/index.ts +1 -1
- package/src/astro/routes/api/settings/domain-notify.ts +76 -0
- package/src/astro/routes/api/settings/domain.ts +64 -0
- package/src/astro/routes/api/settings.ts +2 -1
- package/src/astro/routes/api/setup/admin-verify.ts +7 -1
- package/src/astro/routes/api/setup/index.ts +7 -0
- package/src/astro/routes/api/site/domain-proof.ts +28 -0
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +2 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +2 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +3 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +2 -1
- package/src/astro/routes/api/taxonomies/[name].ts +3 -2
- package/src/astro/routes/api/taxonomies/index.ts +2 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +2 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +3 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +2 -1
- package/src/astro/routes/api/widget-areas/[name].ts +2 -1
- package/src/astro/routes/api/widget-areas/index.ts +2 -1
- package/src/astro/routes/robots.txt.ts +33 -2
- package/src/astro/routes/sitemap-[collection].xml.ts +31 -8
- package/src/astro/routes/sitemap.xml.ts +12 -10
- package/src/astro/types.ts +23 -2
- package/src/auth/rate-limit.ts +18 -13
- package/src/auth/types.ts +11 -4
- package/src/aws-sdk.d.ts +2 -1
- package/src/cache/redirect-paths.ts +56 -0
- package/src/cache/route-cache.ts +22 -0
- package/src/cleanup.ts +26 -0
- package/src/cli/commands/export-seed.ts +2 -0
- package/src/cli/commands/import/wordpress.ts +3 -27
- package/src/cli/commands/login.ts +35 -43
- package/src/cli/commands/migrate.ts +36 -4
- package/src/cli/commands/seed.ts +23 -12
- package/src/cli/wxr/parser.ts +2 -2
- package/src/client/index.ts +18 -3
- package/src/client/portable-text.ts +21 -7
- package/src/comments/public-submission.ts +15 -8
- package/src/comments/query.ts +8 -2
- package/src/components/CommentForm.astro +50 -10
- package/src/components/Comments.astro +51 -29
- package/src/components/EmDashImage.astro +6 -4
- package/src/components/Gallery.astro +4 -3
- package/src/components/Image.astro +4 -3
- package/src/components/InlinePortableTextEditor.tsx +269 -1320
- package/src/components/Video.astro +100 -0
- package/src/components/index.ts +4 -1
- package/src/components/inline-block-types.ts +278 -0
- package/src/components/inline-bubble-menu.tsx +696 -0
- package/src/components/inline-code-block.tsx +8 -0
- package/src/components/inline-editor-ui.tsx +1192 -0
- package/src/components/inline-image.tsx +722 -0
- package/src/components/inline-media-picker.tsx +1221 -0
- package/src/components/inline-slash-menu.tsx +556 -0
- package/src/components/webmcp-search.ts +15 -19
- package/src/components/widgets/RecentPosts.astro +57 -17
- package/src/content/converters/mark-safety.ts +3 -3
- package/src/content/converters/portable-text-identity.ts +1 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +7 -0
- package/src/content/converters/prosemirror-to-portable-text.ts +16 -0
- package/src/content/converters/types.ts +22 -0
- package/src/content/converters/video.ts +77 -0
- package/src/database/collection-cleanup.ts +30 -0
- package/src/database/datetime-storage.ts +337 -60
- package/src/database/migration-lock.ts +43 -7
- package/src/database/migrations/runner.ts +13 -1
- package/src/database/repositories/comment.ts +17 -3
- package/src/database/repositories/content.ts +25 -4
- package/src/database/repositories/plugin-storage.ts +137 -27
- package/src/database/repositories/redirect.ts +24 -2
- package/src/database/repositories/revision.ts +24 -6
- package/src/database/repositories/taxonomy.ts +61 -46
- package/src/database/repositories/types.ts +67 -7
- package/src/emdash-runtime.ts +393 -228
- package/src/import/index.ts +1 -0
- package/src/import/registry.ts +17 -0
- package/src/import/sources/wordpress-plugin.ts +154 -11
- package/src/import/types.ts +3 -0
- package/src/import/utils.ts +7 -3
- package/src/index.ts +3 -0
- package/src/loader.ts +170 -45
- package/src/mcp/json-schema.ts +14 -0
- package/src/mcp/plugin-tool-name.ts +36 -0
- package/src/mcp/server.ts +74 -15
- package/src/media/image-endpoint.ts +101 -1
- package/src/media/responsive.ts +14 -7
- package/src/media/usage/collection-deletion.ts +4 -0
- package/src/media/usage/extractor.ts +19 -2
- package/src/media/usage/types.ts +5 -1
- package/src/migrations/direct-executor.ts +42 -12
- package/src/migrations/protocol.ts +6 -2
- package/src/plugin-utils.ts +1 -1
- package/src/plugins/adapt-sandbox-entry.ts +16 -6
- package/src/plugins/context.ts +3 -7
- package/src/plugins/hooks.ts +1 -1
- package/src/plugins/http-route-dispatch.ts +5 -1
- package/src/plugins/manifest-schema.ts +1 -0
- package/src/plugins/route-error.ts +14 -0
- package/src/plugins/routes.ts +2 -2
- package/src/plugins/state.ts +41 -8
- package/src/plugins/types.ts +6 -0
- package/src/query.ts +59 -10
- package/src/redirects/cache.ts +34 -2
- package/src/redirects/patterns.ts +26 -2
- package/src/schema/block-values.ts +80 -17
- package/src/schema/registry.ts +16 -5
- package/src/schema/slug.ts +19 -0
- package/src/search/query.ts +3 -1
- package/src/search/text-extraction.ts +6 -1
- package/src/seed/apply.ts +32 -8
- package/src/seed/validate.ts +31 -0
- package/src/seo/sitemap-name.ts +22 -0
- package/src/settings/index.ts +20 -0
- package/src/settings/types.ts +2 -0
- package/src/storage/index.ts +2 -0
- package/src/storage/local.ts +10 -2
- package/src/storage/range.ts +54 -0
- package/src/storage/s3.ts +52 -8
- package/src/storage/types.ts +30 -3
- package/src/ui.ts +1 -0
- package/src/utils/slugify.ts +6 -1
- package/src/visual-editing/toolbar.ts +126 -47
- package/src/widgets/components.ts +4 -0
- package/src/widgets/index.ts +74 -82
- package/src/widgets/recent-posts.ts +62 -0
- package/dist/action-token-AgOs1UWD.mjs +0 -26
- package/dist/action-token-AgOs1UWD.mjs.map +0 -1
- package/dist/activation-xomsCMJg.mjs +0 -387
- package/dist/activation-xomsCMJg.mjs.map +0 -1
- package/dist/adapters-DM1oyHIN.d.mts +0 -173
- package/dist/adapters-DM1oyHIN.d.mts.map +0 -1
- package/dist/allowed-origins-CFtudhyw.mjs +0 -116
- package/dist/allowed-origins-CFtudhyw.mjs.map +0 -1
- package/dist/api-CltsXhiX.mjs +0 -4980
- package/dist/api-CltsXhiX.mjs.map +0 -1
- package/dist/api-tokens-P3mAaQgr.mjs +0 -166
- package/dist/api-tokens-P3mAaQgr.mjs.map +0 -1
- package/dist/apply-Q7uvzBWW.mjs +0 -1680
- package/dist/apply-Q7uvzBWW.mjs.map +0 -1
- package/dist/approvals-DycwI6lZ.mjs +0 -460
- package/dist/approvals-DycwI6lZ.mjs.map +0 -1
- package/dist/artifact-fetch-CWxyELVI.mjs +0 -659
- package/dist/artifact-fetch-CWxyELVI.mjs.map +0 -1
- package/dist/artifacts-UzWbysb8.mjs +0 -307
- package/dist/artifacts-UzWbysb8.mjs.map +0 -1
- package/dist/audit-CCH3MA4Y.mjs +0 -127
- package/dist/audit-CCH3MA4Y.mjs.map +0 -1
- package/dist/authoritative-records-dSvXCfzb.mjs +0 -5172
- package/dist/authoritative-records-dSvXCfzb.mjs.map +0 -1
- package/dist/authorize-DeWfk--K.mjs +0 -49
- package/dist/authorize-DeWfk--K.mjs.map +0 -1
- package/dist/backup-CFnbdTSJ.mjs +0 -246
- package/dist/backup-CFnbdTSJ.mjs.map +0 -1
- package/dist/block-types-C0YFSfR7.mjs +0 -132
- package/dist/block-types-C0YFSfR7.mjs.map +0 -1
- package/dist/block-values-H4E0XwE8.mjs +0 -175
- package/dist/block-values-H4E0XwE8.mjs.map +0 -1
- package/dist/byline-BhVslYLz.mjs +0 -909
- package/dist/byline-BhVslYLz.mjs.map +0 -1
- package/dist/byline-fields-DHJs0Mja.mjs +0 -280
- package/dist/byline-fields-DHJs0Mja.mjs.map +0 -1
- package/dist/byline-fields-xdxE9kxZ.mjs +0 -123
- package/dist/byline-fields-xdxE9kxZ.mjs.map +0 -1
- package/dist/bylines-B_nN9liM.mjs +0 -234
- package/dist/bylines-B_nN9liM.mjs.map +0 -1
- package/dist/bylines-C71YACkL.mjs +0 -150
- package/dist/bylines-C71YACkL.mjs.map +0 -1
- package/dist/cache-aTYCL9nK.mjs +0 -133
- package/dist/cache-aTYCL9nK.mjs.map +0 -1
- package/dist/canonical-Y1dpjCnp.mjs +0 -174
- package/dist/canonical-Y1dpjCnp.mjs.map +0 -1
- package/dist/capture-triggers-C9JKoIdT.mjs +0 -362
- package/dist/capture-triggers-C9JKoIdT.mjs.map +0 -1
- package/dist/challenge-store-CxZxPqaw.mjs +0 -51
- package/dist/challenge-store-CxZxPqaw.mjs.map +0 -1
- package/dist/checksum-DtH6m5uk.mjs +0 -162
- package/dist/checksum-DtH6m5uk.mjs.map +0 -1
- package/dist/chunks-zlGB5IQP.mjs +0 -25
- package/dist/chunks-zlGB5IQP.mjs.map +0 -1
- package/dist/collection-slugs-cache-B2Gs9Jwx.mjs +0 -85
- package/dist/collection-slugs-cache-B2Gs9Jwx.mjs.map +0 -1
- package/dist/comment-Bu08Wvr3.mjs +0 -313
- package/dist/comment-Bu08Wvr3.mjs.map +0 -1
- package/dist/comment-reaction-B8SfT-yM.mjs +0 -85
- package/dist/comment-reaction-B8SfT-yM.mjs.map +0 -1
- package/dist/comments-BRtp992B.mjs +0 -99
- package/dist/comments-BRtp992B.mjs.map +0 -1
- package/dist/comments-DVUYqdyC.mjs +0 -195
- package/dist/comments-DVUYqdyC.mjs.map +0 -1
- package/dist/components-CQY-Sgm-.mjs +0 -108
- package/dist/components-CQY-Sgm-.mjs.map +0 -1
- package/dist/config-B-uePMLj.d.mts +0 -39
- package/dist/config-B-uePMLj.d.mts.map +0 -1
- package/dist/config-B6BDSsz2.d.mts +0 -6712
- package/dist/config-B6BDSsz2.d.mts.map +0 -1
- package/dist/config-BsJHiQxC.mjs +0 -228
- package/dist/config-BsJHiQxC.mjs.map +0 -1
- package/dist/connection-B9pIasFd.mjs +0 -36
- package/dist/connection-B9pIasFd.mjs.map +0 -1
- package/dist/content-Dji9vEiW.mjs +0 -2063
- package/dist/content-Dji9vEiW.mjs.map +0 -1
- package/dist/content-list-query-DiNwyKtd.d.mts +0 -26
- package/dist/content-list-query-DiNwyKtd.d.mts.map +0 -1
- package/dist/content-repair-B7wnbzhN.mjs +0 -442
- package/dist/content-repair-B7wnbzhN.mjs.map +0 -1
- package/dist/context-Ctcxc8Ia.mjs +0 -2026
- package/dist/context-Ctcxc8Ia.mjs.map +0 -1
- package/dist/credits-Bu7dlobo.mjs +0 -110
- package/dist/credits-Bu7dlobo.mjs.map +0 -1
- package/dist/cron-xe5XKqA-.mjs +0 -306
- package/dist/cron-xe5XKqA-.mjs.map +0 -1
- package/dist/dashboard-B5hVHOtf.mjs +0 -151
- package/dist/dashboard-B5hVHOtf.mjs.map +0 -1
- package/dist/default-DaoYyFRS.mjs +0 -81
- package/dist/default-DaoYyFRS.mjs.map +0 -1
- package/dist/deferred-tasks-BYcDx2o_.d.mts +0 -9
- package/dist/deferred-tasks-BYcDx2o_.d.mts.map +0 -1
- package/dist/dev-typegen-Dtl8AfS6.mjs +0 -29
- package/dist/dev-typegen-Dtl8AfS6.mjs.map +0 -1
- package/dist/device-flow-Ma5P5d2e.mjs +0 -521
- package/dist/device-flow-Ma5P5d2e.mjs.map +0 -1
- package/dist/digest-xIpR3o64.mjs +0 -194
- package/dist/digest-xIpR3o64.mjs.map +0 -1
- package/dist/direct-executor-DMWwCey3.mjs +0 -104
- package/dist/direct-executor-DMWwCey3.mjs.map +0 -1
- package/dist/email-console-DmqVF5J_.mjs +0 -50
- package/dist/email-console-DmqVF5J_.mjs.map +0 -1
- package/dist/email-locale-Cc5YSXfJ.mjs +0 -25
- package/dist/email-locale-Cc5YSXfJ.mjs.map +0 -1
- package/dist/emdash-runtime-BlybX9Ui.mjs +0 -4249
- package/dist/emdash-runtime-BlybX9Ui.mjs.map +0 -1
- package/dist/entry-lock-De1L8qUQ.mjs +0 -163
- package/dist/entry-lock-De1L8qUQ.mjs.map +0 -1
- package/dist/entry-lock-esmMbgI9.d.mts +0 -4551
- package/dist/entry-lock-esmMbgI9.d.mts.map +0 -1
- package/dist/entry-lock-sxz2PGAT.mjs +0 -1197
- package/dist/entry-lock-sxz2PGAT.mjs.map +0 -1
- package/dist/env-types-BkjCtN13.mjs +0 -38
- package/dist/env-types-BkjCtN13.mjs.map +0 -1
- package/dist/error-B0rgPgsQ.mjs +0 -90
- package/dist/error-B0rgPgsQ.mjs.map +0 -1
- package/dist/errors-CuHQRiBW.mjs +0 -120
- package/dist/errors-CuHQRiBW.mjs.map +0 -1
- package/dist/errors-DTE6C3K_.mjs +0 -470
- package/dist/errors-DTE6C3K_.mjs.map +0 -1
- package/dist/escape-nJW7dR0s.mjs +0 -9
- package/dist/escape-nJW7dR0s.mjs.map +0 -1
- package/dist/fence-CGw57S4v.mjs +0 -162
- package/dist/fence-CGw57S4v.mjs.map +0 -1
- package/dist/field-defs-cache-Bw8w499w.mjs +0 -77
- package/dist/field-defs-cache-Bw8w499w.mjs.map +0 -1
- package/dist/field-map-hn-D-SyH.mjs +0 -83
- package/dist/field-map-hn-D-SyH.mjs.map +0 -1
- package/dist/fts-manager-DacCYIe4.mjs +0 -443
- package/dist/fts-manager-DacCYIe4.mjs.map +0 -1
- package/dist/gc-BBplHrv6.mjs +0 -75
- package/dist/gc-BBplHrv6.mjs.map +0 -1
- package/dist/hash-C4DFoJ7Z.mjs +0 -37
- package/dist/hash-C4DFoJ7Z.mjs.map +0 -1
- package/dist/hook-result-DSRRxu_-.d.mts +0 -31
- package/dist/hook-result-DSRRxu_-.d.mts.map +0 -1
- package/dist/hreflang-CKPunvU0.mjs +0 -105
- package/dist/hreflang-CKPunvU0.mjs.map +0 -1
- package/dist/hreflang-egumj6WF.d.mts +0 -50
- package/dist/hreflang-egumj6WF.d.mts.map +0 -1
- package/dist/http-route-dispatch-DjNFZcJ2.mjs +0 -339
- package/dist/http-route-dispatch-DjNFZcJ2.mjs.map +0 -1
- package/dist/identity-Dfrx2_Bc.mjs +0 -35
- package/dist/identity-Dfrx2_Bc.mjs.map +0 -1
- package/dist/import-ROBvhbNc.mjs +0 -2021
- package/dist/import-ROBvhbNc.mjs.map +0 -1
- package/dist/index-B4sIdCAT.d.mts +0 -623
- package/dist/index-B4sIdCAT.d.mts.map +0 -1
- package/dist/install-finalization-CPM7Gged.mjs +0 -58
- package/dist/install-finalization-CPM7Gged.mjs.map +0 -1
- package/dist/keys-DxqxcAD4.mjs +0 -61
- package/dist/keys-DxqxcAD4.mjs.map +0 -1
- package/dist/kinds-BQl5gN6e.mjs +0 -974
- package/dist/kinds-BQl5gN6e.mjs.map +0 -1
- package/dist/lifecycle-DGQI7itS.mjs +0 -25
- package/dist/lifecycle-DGQI7itS.mjs.map +0 -1
- package/dist/load-DMxRl4VK.mjs +0 -28
- package/dist/load-DMxRl4VK.mjs.map +0 -1
- package/dist/loader-1DMiOq5s.mjs +0 -1303
- package/dist/loader-1DMiOq5s.mjs.map +0 -1
- package/dist/loops-Dn1i16FP.mjs +0 -205
- package/dist/loops-Dn1i16FP.mjs.map +0 -1
- package/dist/manifest-builder-CTw4FmZk.mjs +0 -189
- package/dist/manifest-builder-CTw4FmZk.mjs.map +0 -1
- package/dist/manifest-schema-gy37bD_D.mjs +0 -496
- package/dist/manifest-schema-gy37bD_D.mjs.map +0 -1
- package/dist/marketplace-tHWSsCUo.mjs +0 -257
- package/dist/marketplace-tHWSsCUo.mjs.map +0 -1
- package/dist/media-Bw-Q65ve.mjs +0 -294
- package/dist/media-Bw-Q65ve.mjs.map +0 -1
- package/dist/media-BzUDu7nl.mjs +0 -373
- package/dist/media-BzUDu7nl.mjs.map +0 -1
- package/dist/media-aahnKHze.mjs +0 -408
- package/dist/media-aahnKHze.mjs.map +0 -1
- package/dist/media-allowlist-RMrjo8TU.mjs +0 -45
- package/dist/media-allowlist-RMrjo8TU.mjs.map +0 -1
- package/dist/media-folders-kabR1oJf.mjs +0 -210
- package/dist/media-folders-kabR1oJf.mjs.map +0 -1
- package/dist/media-url-DloW2xrP.mjs +0 -43
- package/dist/media-url-DloW2xrP.mjs.map +0 -1
- package/dist/media-usage-CHHpV7ee.mjs +0 -282
- package/dist/media-usage-CHHpV7ee.mjs.map +0 -1
- package/dist/media-usage-activation-BinYqC_r.mjs +0 -78
- package/dist/media-usage-activation-BinYqC_r.mjs.map +0 -1
- package/dist/media-usage-work-C734aq6s.mjs +0 -1015
- package/dist/media-usage-work-C734aq6s.mjs.map +0 -1
- package/dist/media-usage-work-lxvV0-UO.mjs +0 -151
- package/dist/media-usage-work-lxvV0-UO.mjs.map +0 -1
- package/dist/menus-6RHNq4ZK.mjs +0 -753
- package/dist/menus-6RHNq4ZK.mjs.map +0 -1
- package/dist/menus-AuCTaO9W.mjs +0 -3704
- package/dist/menus-AuCTaO9W.mjs.map +0 -1
- package/dist/menus-BQKqf0Up.mjs +0 -92
- package/dist/menus-BQKqf0Up.mjs.map +0 -1
- package/dist/mode-nh0ppSX5.mjs +0 -23
- package/dist/mode-nh0ppSX5.mjs.map +0 -1
- package/dist/node-sqlite-compat-CDOEcc97.mjs +0 -63
- package/dist/node-sqlite-compat-CDOEcc97.mjs.map +0 -1
- package/dist/oauth-authorization-BtYQ80uU.mjs +0 -274
- package/dist/oauth-authorization-BtYQ80uU.mjs.map +0 -1
- package/dist/oauth-clients-C1S4NQHh.mjs +0 -266
- package/dist/oauth-clients-C1S4NQHh.mjs.map +0 -1
- package/dist/oauth-state-store-CpGi2FZH.mjs +0 -50
- package/dist/oauth-state-store-CpGi2FZH.mjs.map +0 -1
- package/dist/oauth-user-lookup-BNp1aFAr.mjs +0 -26
- package/dist/oauth-user-lookup-BNp1aFAr.mjs.map +0 -1
- package/dist/options-B41aLm1I.d.mts +0 -81
- package/dist/options-B41aLm1I.d.mts.map +0 -1
- package/dist/ownership-DoeAIuTg.mjs +0 -12
- package/dist/ownership-DoeAIuTg.mjs.map +0 -1
- package/dist/parse-CmFDTGzp.mjs +0 -81
- package/dist/parse-CmFDTGzp.mjs.map +0 -1
- package/dist/parse-QVS0t5oR.d.mts +0 -172
- package/dist/parse-QVS0t5oR.d.mts.map +0 -1
- package/dist/passkey-config-C-MxsV22.mjs +0 -46
- package/dist/passkey-config-C-MxsV22.mjs.map +0 -1
- package/dist/paths-kr8hAMMI.mjs +0 -77
- package/dist/paths-kr8hAMMI.mjs.map +0 -1
- package/dist/patterns-DyZJ67I7.mjs +0 -140
- package/dist/patterns-DyZJ67I7.mjs.map +0 -1
- package/dist/placeholder-Dn7MMdWr.d.mts +0 -306
- package/dist/placeholder-Dn7MMdWr.d.mts.map +0 -1
- package/dist/plan-CuQOeU9g.mjs +0 -135
- package/dist/plan-CuQOeU9g.mjs.map +0 -1
- package/dist/plugins-CGb-G98c.mjs +0 -261
- package/dist/plugins-CGb-G98c.mjs.map +0 -1
- package/dist/policy-C5wrDXYV.mjs +0 -45
- package/dist/policy-C5wrDXYV.mjs.map +0 -1
- package/dist/portable-text-BnRuiR1-.mjs +0 -307
- package/dist/portable-text-BnRuiR1-.mjs.map +0 -1
- package/dist/preview-xWNSR1Li.mjs +0 -107
- package/dist/preview-xWNSR1Li.mjs.map +0 -1
- package/dist/protocol-ClxN-m1e.d.mts +0 -61
- package/dist/protocol-ClxN-m1e.d.mts.map +0 -1
- package/dist/public-submission-CkmT2SKv.mjs +0 -250
- package/dist/public-submission-CkmT2SKv.mjs.map +0 -1
- package/dist/public-url-B5a0QAh6.mjs +0 -101
- package/dist/public-url-B5a0QAh6.mjs.map +0 -1
- package/dist/query-DHqFiqqH.mjs +0 -41
- package/dist/query-DHqFiqqH.mjs.map +0 -1
- package/dist/query-DT85BehD.mjs +0 -1125
- package/dist/query-DT85BehD.mjs.map +0 -1
- package/dist/rate-limit-iMvcu3eu.mjs +0 -120
- package/dist/rate-limit-iMvcu3eu.mjs.map +0 -1
- package/dist/receipt-Dpp1uaX9.mjs +0 -43
- package/dist/receipt-Dpp1uaX9.mjs.map +0 -1
- package/dist/redirect-BRoLiWQE.mjs +0 -19
- package/dist/redirect-BRoLiWQE.mjs.map +0 -1
- package/dist/redirect-xZNpBoGp.mjs +0 -417
- package/dist/redirect-xZNpBoGp.mjs.map +0 -1
- package/dist/redirects-D4EWeXAo.mjs +0 -148
- package/dist/redirects-D4EWeXAo.mjs.map +0 -1
- package/dist/redirects-DCKqwiWp.mjs +0 -446
- package/dist/redirects-DCKqwiWp.mjs.map +0 -1
- package/dist/registry-DaXmUsD4.mjs +0 -8369
- package/dist/registry-DaXmUsD4.mjs.map +0 -1
- package/dist/relations-JvBP8nGP.mjs +0 -776
- package/dist/relations-JvBP8nGP.mjs.map +0 -1
- package/dist/request-meta-B6blULFY.mjs +0 -141
- package/dist/request-meta-B6blULFY.mjs.map +0 -1
- package/dist/resolve-DAhHi5tn.mjs +0 -100
- package/dist/resolve-DAhHi5tn.mjs.map +0 -1
- package/dist/revision-BWEH2qQB.mjs +0 -368
- package/dist/revision-BWEH2qQB.mjs.map +0 -1
- package/dist/route-wire-DK600v4u.mjs +0 -197
- package/dist/route-wire-DK600v4u.mjs.map +0 -1
- package/dist/routes-BeZyaCzv.mjs +0 -272
- package/dist/routes-BeZyaCzv.mjs.map +0 -1
- package/dist/runner-CskI4Hmq.mjs +0 -6372
- package/dist/runner-CskI4Hmq.mjs.map +0 -1
- package/dist/runner-J3Cj6DGk.d.mts +0 -68
- package/dist/runner-J3Cj6DGk.d.mts.map +0 -1
- package/dist/schema-CK0ihqMR.mjs +0 -815
- package/dist/schema-CK0ihqMR.mjs.map +0 -1
- package/dist/schema-VtaZSrC-.mjs +0 -13
- package/dist/schema-VtaZSrC-.mjs.map +0 -1
- package/dist/scopes-BRnGlL9t.mjs +0 -34
- package/dist/scopes-BRnGlL9t.mjs.map +0 -1
- package/dist/search-D6-XK1Sn.mjs +0 -448
- package/dist/search-D6-XK1Sn.mjs.map +0 -1
- package/dist/sections-CBDCf7qR.mjs +0 -346
- package/dist/sections-CBDCf7qR.mjs.map +0 -1
- package/dist/seo-BdeEPDNW.mjs +0 -133
- package/dist/seo-BdeEPDNW.mjs.map +0 -1
- package/dist/seo-C61bnPuV.mjs +0 -114
- package/dist/seo-C61bnPuV.mjs.map +0 -1
- package/dist/service-BuRKLMxa.mjs +0 -150
- package/dist/service-BuRKLMxa.mjs.map +0 -1
- package/dist/session-user-CqkPtrPL.mjs +0 -61
- package/dist/session-user-CqkPtrPL.mjs.map +0 -1
- package/dist/settings-0u0lTthS.mjs +0 -51
- package/dist/settings-0u0lTthS.mjs.map +0 -1
- package/dist/settings-WHr45II1.mjs +0 -61
- package/dist/settings-WHr45II1.mjs.map +0 -1
- package/dist/settings-m5tIYnF0.mjs +0 -443
- package/dist/settings-m5tIYnF0.mjs.map +0 -1
- package/dist/setup-complete-B2_dhZZz.mjs +0 -65
- package/dist/setup-complete-B2_dhZZz.mjs.map +0 -1
- package/dist/setup-nonce-CJV9ftSK.mjs +0 -25
- package/dist/setup-nonce-CJV9ftSK.mjs.map +0 -1
- package/dist/site-settings-KJOqJW6W.mjs +0 -50
- package/dist/site-settings-KJOqJW6W.mjs.map +0 -1
- package/dist/site-url-Ceq_AUK0.mjs +0 -16
- package/dist/site-url-Ceq_AUK0.mjs.map +0 -1
- package/dist/slugify-T5GHH42D.mjs +0 -17
- package/dist/slugify-T5GHH42D.mjs.map +0 -1
- package/dist/snapshot-Dzsn3NZa.mjs +0 -414
- package/dist/snapshot-Dzsn3NZa.mjs.map +0 -1
- package/dist/ssrf-DsmvZB80.mjs +0 -406
- package/dist/ssrf-DsmvZB80.mjs.map +0 -1
- package/dist/stage-Csnh_yEd.mjs +0 -662
- package/dist/stage-Csnh_yEd.mjs.map +0 -1
- package/dist/staged-Q7pnEVvI.mjs +0 -686
- package/dist/staged-Q7pnEVvI.mjs.map +0 -1
- package/dist/state-kGdOMQRY.mjs +0 -153
- package/dist/state-kGdOMQRY.mjs.map +0 -1
- package/dist/status-D39Fpy8R.mjs +0 -30
- package/dist/status-D39Fpy8R.mjs.map +0 -1
- package/dist/storage-query-C7iy6eUb.d.mts +0 -1615
- package/dist/storage-query-C7iy6eUb.d.mts.map +0 -1
- package/dist/tar-BWiraSUY.mjs +0 -449
- package/dist/tar-BWiraSUY.mjs.map +0 -1
- package/dist/target-DOFs5oUC.mjs +0 -27
- package/dist/target-DOFs5oUC.mjs.map +0 -1
- package/dist/taxonomies-BS40Wxvi.mjs +0 -939
- package/dist/taxonomies-BS40Wxvi.mjs.map +0 -1
- package/dist/taxonomies-DAZU9VDd.mjs +0 -697
- package/dist/taxonomies-DAZU9VDd.mjs.map +0 -1
- package/dist/taxonomy-XzLE95Vx.mjs +0 -525
- package/dist/taxonomy-XzLE95Vx.mjs.map +0 -1
- package/dist/tokens-DSQan4p7.mjs +0 -171
- package/dist/tokens-DSQan4p7.mjs.map +0 -1
- package/dist/transfer-BcCVxDgf.mjs +0 -166
- package/dist/transfer-BcCVxDgf.mjs.map +0 -1
- package/dist/transfer-OMrancOt.mjs +0 -8873
- package/dist/transfer-OMrancOt.mjs.map +0 -1
- package/dist/transfer-download-Dc-ltjZY.mjs +0 -33
- package/dist/transfer-download-Dc-ltjZY.mjs.map +0 -1
- package/dist/transformations-Ddx7UtrY.mjs +0 -196
- package/dist/transformations-Ddx7UtrY.mjs.map +0 -1
- package/dist/transport-flR-Zmds.d.mts +0 -42
- package/dist/transport-flR-Zmds.d.mts.map +0 -1
- package/dist/transport-umzEbgYO.mjs +0 -136
- package/dist/transport-umzEbgYO.mjs.map +0 -1
- package/dist/trusted-proxy-BqfQFs6a.mjs +0 -51
- package/dist/trusted-proxy-BqfQFs6a.mjs.map +0 -1
- package/dist/turnstile-Do60baId.mjs +0 -58
- package/dist/turnstile-Do60baId.mjs.map +0 -1
- package/dist/types-BT1p3uyb.d.mts +0 -1735
- package/dist/types-BT1p3uyb.d.mts.map +0 -1
- package/dist/types-BYaPWs_F.d.mts +0 -198
- package/dist/types-BYaPWs_F.d.mts.map +0 -1
- package/dist/types-C-Xp0CcN.mjs +0 -103
- package/dist/types-C-Xp0CcN.mjs.map +0 -1
- package/dist/types-CLTQ9b_r.d.mts +0 -374
- package/dist/types-CLTQ9b_r.d.mts.map +0 -1
- package/dist/types-CPkQw2T2.d.mts +0 -85
- package/dist/types-CPkQw2T2.d.mts.map +0 -1
- package/dist/types-CQLvuXoZ.d.mts +0 -198
- package/dist/types-CQLvuXoZ.d.mts.map +0 -1
- package/dist/types-CV5xszpF.d.mts +0 -363
- package/dist/types-CV5xszpF.d.mts.map +0 -1
- package/dist/types-CdEMurNh.mjs +0 -77
- package/dist/types-CdEMurNh.mjs.map +0 -1
- package/dist/types-CxwtnuSS.mjs +0 -37
- package/dist/types-CxwtnuSS.mjs.map +0 -1
- package/dist/types-DGw8KMX_.mjs +0 -16
- package/dist/types-DGw8KMX_.mjs.map +0 -1
- package/dist/types-DOfVMPoo.d.mts +0 -125
- package/dist/types-DOfVMPoo.d.mts.map +0 -1
- package/dist/types-LtS0SM4F.d.mts +0 -287
- package/dist/types-LtS0SM4F.d.mts.map +0 -1
- package/dist/types-ifgOkcBa.d.mts +0 -916
- package/dist/types-ifgOkcBa.d.mts.map +0 -1
- package/dist/update-check-DOc2aBIU.mjs +0 -161
- package/dist/update-check-DOc2aBIU.mjs.map +0 -1
- package/dist/upload-attempts-nzdc3cay.mjs +0 -32
- package/dist/upload-attempts-nzdc3cay.mjs.map +0 -1
- package/dist/url-pattern-hVbqpXs6.mjs +0 -41
- package/dist/url-pattern-hVbqpXs6.mjs.map +0 -1
- package/dist/user-Dnp53zTq.mjs +0 -171
- package/dist/user-Dnp53zTq.mjs.map +0 -1
- package/dist/utils-CoV-PYhg.mjs +0 -439
- package/dist/utils-CoV-PYhg.mjs.map +0 -1
- package/dist/validate-CfQ9_YlD.d.mts +0 -468
- package/dist/validate-CfQ9_YlD.d.mts.map +0 -1
- package/dist/validate-DBX3DKtL.mjs +0 -516
- package/dist/validate-DBX3DKtL.mjs.map +0 -1
- package/dist/validation-BJMiDhB1.mjs +0 -219
- package/dist/validation-BJMiDhB1.mjs.map +0 -1
- package/dist/version-BaT8yKIT.mjs +0 -7
- package/dist/version-BaT8yKIT.mjs.map +0 -1
- package/dist/version-BwEGkqkx.mjs +0 -9
- package/dist/version-BwEGkqkx.mjs.map +0 -1
- package/dist/virtual-modules-B6vJW15k.mjs +0 -516
- package/dist/virtual-modules-B6vJW15k.mjs.map +0 -1
- package/dist/widgets-BkxBAgZ_.mjs +0 -126
- package/dist/widgets-BkxBAgZ_.mjs.map +0 -1
- package/dist/wxr-taxonomies-D7gAJyOF.mjs +0 -453
- package/dist/wxr-taxonomies-D7gAJyOF.mjs.map +0 -1
- package/dist/wxr-taxonomies-DM5J9AsT.d.mts +0 -34
- package/dist/wxr-taxonomies-DM5J9AsT.d.mts.map +0 -1
- package/dist/zod-generator-BQilAboC.mjs +0 -424
- package/dist/zod-generator-BQilAboC.mjs.map +0 -1
- /package/dist/{api-tokens-BLz2MtQs.mjs → api-tokens-CdP49zVF.mjs} +0 -0
- /package/dist/{ssrf-tA45vIPX.mjs → ssrf-DM0E-D_8.mjs} +0 -0
|
@@ -5,32 +5,34 @@ import "../../../../options-DhrI7eMv.mjs";
|
|
|
5
5
|
import "../../../../secrets-Cc_O3Kp-.mjs";
|
|
6
6
|
import "../../../../base64-BQBZwXCx.mjs";
|
|
7
7
|
import "../../../../object-cache-Bo6DGaC9.mjs";
|
|
8
|
-
import "../../../../slugify-
|
|
8
|
+
import "../../../../slugify-bu2-jKia.mjs";
|
|
9
9
|
import "../../../../request-cache-C4CIo5ad.mjs";
|
|
10
10
|
import "../../../../url-Dn3IStq8.mjs";
|
|
11
|
-
import "../../../../types-
|
|
12
|
-
import "../../../../media-
|
|
13
|
-
import "../../../../loader-
|
|
14
|
-
import "../../../../
|
|
15
|
-
import "../../../../errors-
|
|
16
|
-
import "../../../../
|
|
17
|
-
import "../../../../
|
|
18
|
-
import "../../../../settings-
|
|
19
|
-
import
|
|
20
|
-
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-
|
|
21
|
-
import
|
|
22
|
-
import "../../../../
|
|
23
|
-
import "../../../../
|
|
24
|
-
import "../../../../
|
|
25
|
-
import "../../../../
|
|
26
|
-
import
|
|
27
|
-
import "../../../../
|
|
28
|
-
import "../../../../
|
|
11
|
+
import "../../../../types-D2NEXtgB.mjs";
|
|
12
|
+
import "../../../../media-Bws9f18T.mjs";
|
|
13
|
+
import "../../../../loader-CswroUbe.mjs";
|
|
14
|
+
import "../../../../json-recordset-BUjxhr77.mjs";
|
|
15
|
+
import "../../../../errors-B4f4It-2.mjs";
|
|
16
|
+
import "../../../../errors-BOYNdIo3.mjs";
|
|
17
|
+
import "../../../../settings-Dd1uivmQ.mjs";
|
|
18
|
+
import "../../../../site-settings-DRHfX7bq.mjs";
|
|
19
|
+
import "../../../../settings-CWb84sDm.mjs";
|
|
20
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-CVWeIOku.mjs";
|
|
21
|
+
import "../../../../fence-C3MUitUN.mjs";
|
|
22
|
+
import { t as SsrfError } from "../../../../ssrf-BcYjyM4M.mjs";
|
|
23
|
+
import { n as parseBody, t as isParseError } from "../../../../parse-DgQ2NABT.mjs";
|
|
24
|
+
import "../../../../redirects-BEVSRMa2.mjs";
|
|
25
|
+
import "../../../../entry-lock-Df6-XhIu.mjs";
|
|
26
|
+
import "../../../../media-1WC65OCB.mjs";
|
|
27
|
+
import "../../../../comments-yiRFx3w5.mjs";
|
|
28
|
+
import { f as importProbeBody } from "../../../../byline-fields-BLXZnX7N.mjs";
|
|
29
|
+
import "../../../../menus-BSzwObhV.mjs";
|
|
30
|
+
import "../../../../status-BFNdxzKc.mjs";
|
|
29
31
|
import "../../../../api/schemas/index.mjs";
|
|
30
|
-
import {
|
|
31
|
-
import "../../../../ssrf-
|
|
32
|
-
import "../../../../utils-
|
|
33
|
-
import {
|
|
32
|
+
import { g as probeUrl } from "../../../../import-BUXjdZUn.mjs";
|
|
33
|
+
import "../../../../ssrf-DM0E-D_8.mjs";
|
|
34
|
+
import "../../../../utils-TPt7w2cS.mjs";
|
|
35
|
+
import { o as requirePerm } from "../../../../authorize-DPFBGbE6.mjs";
|
|
34
36
|
|
|
35
37
|
//#region src/astro/routes/api/import/probe.ts
|
|
36
38
|
const prerender = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe.mjs","names":[],"sources":["../../../../../src/astro/routes/api/import/probe.ts"],"sourcesContent":["/**\n * URL probe endpoint\n *\n * POST /_emdash/api/import/probe\n *\n * Probes a URL to detect what import source can handle it.\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 { importProbeBody } from \"#api/schemas.js\";\nimport { probeUrl, type ProbeResult } from \"#import/index.js\";\nimport { SsrfError } from \"#import/ssrf.js\";\n\nexport const prerender = false;\n\nexport interface ProbeResponse {\n\tsuccess: boolean;\n\tresult?: ProbeResult;\n\terror?: { message: string };\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { user } = locals;\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, importProbeBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await probeUrl(body.url);\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\tresult,\n\t\t});\n\t} catch (error) {\n\t\tif (error instanceof SsrfError) {\n\t\t\treturn apiError(\"SSRF_BLOCKED\", error.message, 400);\n\t\t}\n\t\treturn handleError(error, \"Failed to probe URL\", \"PROBE_ERROR\");\n\t}\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"probe.mjs","names":[],"sources":["../../../../../src/astro/routes/api/import/probe.ts"],"sourcesContent":["/**\n * URL probe endpoint\n *\n * POST /_emdash/api/import/probe\n *\n * Probes a URL to detect what import source can handle it.\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 { importProbeBody } from \"#api/schemas.js\";\nimport { probeUrl, type ProbeResult } from \"#import/index.js\";\nimport { SsrfError } from \"#import/ssrf.js\";\n\nexport const prerender = false;\n\nexport interface ProbeResponse {\n\tsuccess: boolean;\n\tresult?: ProbeResult;\n\terror?: { message: string };\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { user } = locals;\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, importProbeBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await probeUrl(body.url);\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\tresult,\n\t\t});\n\t} catch (error) {\n\t\tif (error instanceof SsrfError) {\n\t\t\treturn apiError(\"SSRF_BLOCKED\", error.message, 400);\n\t\t}\n\t\treturn handleError(error, \"Failed to probe URL\", \"PROBE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAa,YAAY;AAQzB,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,SAAS;CACjB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,gBAAgB;AACtD,MAAI,aAAa,KAAK,CAAE,QAAO;AAI/B,SAAO,WAAW;GACjB,SAAS;GACT,QAJc,MAAM,SAAS,KAAK,IAAI;GAKtC,CAAC;UACM,OAAO;AACf,MAAI,iBAAiB,UACpB,QAAO,SAAS,gBAAgB,MAAM,SAAS,IAAI;AAEpD,SAAO,YAAY,OAAO,uBAAuB,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.mts","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/analyze.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"analyze.d.mts","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/analyze.ts"],"mappings":";;;cAmBa,SAAA;;KAOD,kBAAA;;UAMK,cAAA;EAChB,IAAA;EACA,KAAA;EACA,IAAA;EACA,QAAA;EACA,UAAA;AAAA;;UAIgB,sBAAA;EAJN;EAMV,MAAA;EAFgB;EAIhB,WAAA,EAAa,MAAA;IAGX,MAAA,EAAQ,kBAAA;IACR,YAAA;IACA,YAAA;EAAA;EALW;EASb,SAAA;EANU;EAQV,MAAA;AAAA;;UAIgB,gBAAA;EAJV;EAMN,IAAA;EAFgB;EAIhB,KAAA;;EAEA,mBAAA;EAJA;EAMA,cAAA,EAAgB,cAAA;EAFhB;EAIA,YAAA,EAAc,sBAAA;AAAA;;UAIE,cAAA;EAChB,EAAA;EACA,KAAA;EACA,GAAA;EACA,QAAA;EACA,QAAA;AAAA;;UAIgB,YAAA;EAChB,EAAA;EACA,KAAA;EACA,KAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,UAGgB,WAAA;EAChB,IAAA;IACC,KAAA;IACA,GAAA;EAAA;EAED,SAAA,EAAW,gBAAA;EACX,WAAA;IACC,KAAA;IACA,KAAA,EAAO,cAAA;EAAA;EAER,UAAA;EACA,IAAA;EACA,OAAA,EAAS,YAAA;EACT,YAAA,EAAc,KAAA;IACb,GAAA;IACA,KAAA;IACA,OAAA;IACA,cAAA;IACA,aAAA;IACA,UAAA;EAAA;AAAA;AAAA,cAIW,IAAA,EAAM,QAAA;AAAA,iBAyUV,YAAA,CAAa,IAAA;AAAA,iBAUb,uBAAA,CAAwB,QAAA;AAAA,iBAmDxB,UAAA,CAAW,GAAA;AAAA,iBAIX,WAAA,CAAY,GAAA"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import "../../../../../base64-BQBZwXCx.mjs";
|
|
2
2
|
import { u as RESERVED_COLLECTION_SLUGS } from "../../../../../types-BGmQ0uXs.mjs";
|
|
3
|
-
import "../../../../../
|
|
4
|
-
import "../../../../../
|
|
5
|
-
import "../../../../../errors-
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
3
|
+
import "../../../../../slugify-bu2-jKia.mjs";
|
|
4
|
+
import "../../../../../types-D2NEXtgB.mjs";
|
|
5
|
+
import "../../../../../errors-B4f4It-2.mjs";
|
|
6
|
+
import "../../../../../errors-BOYNdIo3.mjs";
|
|
7
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CVWeIOku.mjs";
|
|
8
|
+
import { l as isInternalPostType } from "../../../../../utils-TPt7w2cS.mjs";
|
|
9
|
+
import { o as requirePerm } from "../../../../../authorize-DPFBGbE6.mjs";
|
|
8
10
|
import mime from "mime/lite";
|
|
9
11
|
import { SchemaRegistry, parseWxrString } from "emdash";
|
|
10
12
|
|
|
@@ -232,21 +234,6 @@ function isTypeCompatible(requiredType, existingType) {
|
|
|
232
234
|
integer: ["number", "integer"]
|
|
233
235
|
}[requiredType]?.includes(existingType) ?? false;
|
|
234
236
|
}
|
|
235
|
-
function isInternalPostType(type) {
|
|
236
|
-
return [
|
|
237
|
-
"revision",
|
|
238
|
-
"nav_menu_item",
|
|
239
|
-
"custom_css",
|
|
240
|
-
"customize_changeset",
|
|
241
|
-
"oembed_cache",
|
|
242
|
-
"wp_global_styles",
|
|
243
|
-
"wp_navigation",
|
|
244
|
-
"wp_template",
|
|
245
|
-
"wp_template_part",
|
|
246
|
-
"attachment",
|
|
247
|
-
"wp_block"
|
|
248
|
-
].includes(type);
|
|
249
|
-
}
|
|
250
237
|
function isInternalMetaKey(key) {
|
|
251
238
|
if (key.startsWith("_edit_")) return true;
|
|
252
239
|
if (key.startsWith("_wp_")) return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/analyze.ts"],"sourcesContent":["/**\n * WordPress WXR analyze endpoint\n *\n * POST /_emdash/api/import/wordpress/analyze\n *\n * Accepts a WXR file upload and returns analysis of its contents,\n * including post types, counts, custom fields, and schema compatibility.\n */\n\nimport type { APIRoute } from \"astro\";\nimport { parseWxrString, SchemaRegistry, type WxrData } from \"emdash\";\nimport mime from \"mime/lite\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { RESERVED_COLLECTION_SLUGS } from \"#schema/types.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nexport const prerender = false;\n\nconst NUMERIC_PATTERN = /^-?\\d+(\\.\\d+)?$/;\nconst INVALID_SLUG_CHARS = /[^a-z0-9_]/g;\nconst LEADING_NON_ALPHA = /^[^a-z]+/;\n\n/** Field compatibility status */\nexport type FieldCompatibility =\n\t| \"compatible\" // Field exists with compatible type\n\t| \"type_mismatch\" // Field exists but type differs\n\t| \"missing\"; // Field doesn't exist\n\n/** Single field definition for import */\nexport interface ImportFieldDef {\n\tslug: string;\n\tlabel: string;\n\ttype: string;\n\trequired: boolean;\n\tsearchable?: boolean;\n}\n\n/** Schema status for a collection */\nexport interface CollectionSchemaStatus {\n\t/** Whether collection exists */\n\texists: boolean;\n\t/** If exists, per-field compatibility */\n\tfieldStatus: Record<\n\t\tstring,\n\t\t{\n\t\t\tstatus: FieldCompatibility;\n\t\t\texistingType?: string;\n\t\t\trequiredType: string;\n\t\t}\n\t>;\n\t/** Can we safely import to this collection? */\n\tcanImport: boolean;\n\t/** Human-readable reason if canImport is false */\n\treason?: string;\n}\n\n/** Post type with full schema info */\nexport interface PostTypeAnalysis {\n\t/** WordPress post type name */\n\tname: string;\n\t/** Number of items to import */\n\tcount: number;\n\t/** Suggested collection slug */\n\tsuggestedCollection: string;\n\t/** Fields we need to create */\n\trequiredFields: ImportFieldDef[];\n\t/** Schema compatibility status */\n\tschemaStatus: CollectionSchemaStatus;\n}\n\n/** Individual attachment info for media import */\nexport interface AttachmentInfo {\n\tid?: number;\n\ttitle?: string;\n\turl?: string;\n\tfilename?: string;\n\tmimeType?: string;\n}\n\n/** Author info from WordPress */\nexport interface WpAuthorInfo {\n\tid?: number;\n\tlogin?: string;\n\temail?: string;\n\tdisplayName?: string;\n\tpostCount: number;\n}\n\nexport interface WxrAnalysis {\n\tsite: {\n\t\ttitle: string;\n\t\turl: string;\n\t};\n\tpostTypes: PostTypeAnalysis[];\n\tattachments: {\n\t\tcount: number;\n\t\titems: AttachmentInfo[];\n\t};\n\tcategories: number;\n\ttags: number;\n\tauthors: WpAuthorInfo[];\n\tcustomFields: Array<{\n\t\tkey: string;\n\t\tcount: number;\n\t\tsamples: string[];\n\t\tsuggestedField: string;\n\t\tsuggestedType: \"string\" | \"number\" | \"boolean\" | \"date\" | \"json\";\n\t\tisInternal: boolean;\n\t}>;\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 formData = await request.formData();\n\t\tconst fileEntry = formData.get(\"file\");\n\t\tconst file = fileEntry instanceof File ? fileEntry : null;\n\n\t\tif (!file) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No file provided\", 400);\n\t\t}\n\n\t\t// Parse WXR\n\t\tconst text = await file.text();\n\t\tconst wxr = await parseWxrString(text);\n\n\t\t// Fetch existing collections from schema registry\n\t\tconst existingCollections = await fetchExistingCollections(emdash?.db);\n\n\t\t// Analyze content with schema compatibility\n\t\tconst analysis = analyzeWxr(wxr, existingCollections);\n\n\t\treturn apiSuccess(analysis);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to analyze file\", \"WXR_ANALYZE_ERROR\");\n\t}\n};\n\n/** Existing collection info from schema registry */\ninterface ExistingCollection {\n\tslug: string;\n\tfields: Map<string, { type: string; columnType: 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\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; columnType: string }>();\n\n\t\t\tfor (const field of fields) {\n\t\t\t\tfieldMap.set(field.slug, {\n\t\t\t\t\ttype: field.type,\n\t\t\t\t\tcolumnType: field.columnType,\n\t\t\t\t});\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\n/** Base fields required for any WordPress import */\nconst BASE_REQUIRED_FIELDS: ImportFieldDef[] = [\n\t{ slug: \"title\", label: \"Title\", type: \"string\", required: true, searchable: true },\n\t{ slug: \"content\", label: \"Content\", type: \"portableText\", required: false, searchable: true },\n\t{ slug: \"excerpt\", label: \"Excerpt\", type: \"text\", required: false },\n];\n\n/** Featured image field - only added to post types that have _thumbnail_id */\nconst FEATURED_IMAGE_FIELD: ImportFieldDef = {\n\tslug: \"featured_image\",\n\tlabel: \"Featured Image\",\n\ttype: \"image\",\n\trequired: false,\n};\n\nfunction analyzeWxr(\n\twxr: WxrData,\n\texistingCollections: Map<string, ExistingCollection>,\n): WxrAnalysis {\n\t// Count post types and track which have featured images\n\tconst postTypeCounts = new Map<string, number>();\n\tconst postTypesWithThumbnails = new Set<string>();\n\tconst metaKeys = new Map<string, { count: number; samples: string[]; isInternal: boolean }>();\n\tconst authorPostCounts = new Map<string, number>();\n\n\tfor (const post of wxr.posts) {\n\t\tconst type = post.postType || \"post\";\n\t\tpostTypeCounts.set(type, (postTypeCounts.get(type) || 0) + 1);\n\n\t\t// Count posts per author (by login)\n\t\tif (post.creator) {\n\t\t\tauthorPostCounts.set(post.creator, (authorPostCounts.get(post.creator) || 0) + 1);\n\t\t}\n\n\t\t// Track if this post type has featured images\n\t\tif (post.meta.has(\"_thumbnail_id\")) {\n\t\t\tpostTypesWithThumbnails.add(type);\n\t\t}\n\n\t\t// Analyze meta keys\n\t\tfor (const [key, value] of post.meta) {\n\t\t\tconst existing = metaKeys.get(key);\n\t\t\tif (existing) {\n\t\t\t\texisting.count++;\n\t\t\t\tif (existing.samples.length < 3 && value) {\n\t\t\t\t\texisting.samples.push(value.slice(0, 100));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmetaKeys.set(key, {\n\t\t\t\t\tcount: 1,\n\t\t\t\t\tsamples: value ? [value.slice(0, 100)] : [],\n\t\t\t\t\tisInternal: isInternalMetaKey(key),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Map meta keys to fields (for custom fields analysis)\n\tconst customFields = [...metaKeys.entries()]\n\t\t.filter(([_, info]) => !info.isInternal)\n\t\t.map(([key, info]) => ({\n\t\t\tkey,\n\t\t\tcount: info.count,\n\t\t\tsamples: info.samples,\n\t\t\tsuggestedField: mapMetaKeyToField(key),\n\t\t\tsuggestedType: inferMetaType(key, info.samples[0]),\n\t\t\tisInternal: info.isInternal,\n\t\t}))\n\t\t.toSorted((a, b) => b.count - a.count);\n\n\t// Build post type analysis with schema compatibility\n\tconst seenSlugs = new Map<string, number>();\n\tconst postTypes: PostTypeAnalysis[] = [...postTypeCounts.entries()]\n\t\t.filter(([type]) => !isInternalPostType(type))\n\t\t.map(([name, count]) => {\n\t\t\tlet suggestedCollection = mapPostTypeToCollection(name);\n\n\t\t\t// Deduplicate: if multiple post types produce the same slug, append a suffix\n\t\t\tconst seen = seenSlugs.get(suggestedCollection) ?? 0;\n\t\t\tseenSlugs.set(suggestedCollection, seen + 1);\n\t\t\tif (seen > 0) {\n\t\t\t\tsuggestedCollection = `${suggestedCollection}_${seen}`;\n\t\t\t}\n\t\t\tconst existingCollection = existingCollections.get(suggestedCollection);\n\n\t\t\t// Build required fields - add featured_image only if posts have thumbnails\n\t\t\tconst requiredFields = [...BASE_REQUIRED_FIELDS];\n\t\t\tif (postTypesWithThumbnails.has(name)) {\n\t\t\t\trequiredFields.push(FEATURED_IMAGE_FIELD);\n\t\t\t}\n\n\t\t\tconst schemaStatus = checkSchemaCompatibility(requiredFields, existingCollection);\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tcount,\n\t\t\t\tsuggestedCollection,\n\t\t\t\trequiredFields,\n\t\t\t\tschemaStatus,\n\t\t\t};\n\t\t})\n\t\t.toSorted((a, b) => b.count - a.count);\n\n\t// Build attachment info list\n\tconst attachmentItems: AttachmentInfo[] = wxr.attachments.map((att) => {\n\t\tconst filename = att.url ? getFilenameFromUrl(att.url) : undefined;\n\t\tconst mimeType = filename ? guessMimeType(filename) : undefined;\n\t\treturn {\n\t\t\tid: att.id,\n\t\t\ttitle: att.title,\n\t\t\turl: att.url,\n\t\t\tfilename,\n\t\t\tmimeType,\n\t\t};\n\t});\n\n\treturn {\n\t\tsite: {\n\t\t\ttitle: wxr.site.title || \"WordPress Site\",\n\t\t\turl: wxr.site.link || \"\",\n\t\t},\n\t\tpostTypes,\n\t\tattachments: {\n\t\t\tcount: wxr.attachments.length,\n\t\t\titems: attachmentItems,\n\t\t},\n\t\tcategories: wxr.categories.length,\n\t\ttags: wxr.tags.length,\n\t\tauthors: wxr.authors.map((a) => ({\n\t\t\tid: a.id,\n\t\t\tlogin: a.login,\n\t\t\temail: a.email,\n\t\t\tdisplayName: a.displayName || a.login || \"Unknown\",\n\t\t\tpostCount: a.login ? authorPostCounts.get(a.login) || 0 : 0,\n\t\t})),\n\t\tcustomFields,\n\t};\n}\n\n/** Extract filename from URL */\nfunction getFilenameFromUrl(url: string): string | undefined {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\tconst segments = parsed.pathname.split(\"/\").filter(Boolean);\n\t\treturn segments.pop();\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Guess MIME type from filename extension */\nfunction guessMimeType(filename: string): string | undefined {\n\treturn mime.getType(filename) ?? undefined;\n}\n\n/** Check if a collection schema is compatible with import requirements */\nfunction checkSchemaCompatibility(\n\trequiredFields: ImportFieldDef[],\n\texistingCollection: ExistingCollection | undefined,\n): CollectionSchemaStatus {\n\tif (!existingCollection) {\n\t\t// Collection doesn't exist - will need to create it\n\t\tconst fieldStatus: CollectionSchemaStatus[\"fieldStatus\"] = {};\n\t\tfor (const field of requiredFields) {\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"missing\",\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\texists: false,\n\t\t\tfieldStatus,\n\t\t\tcanImport: true, // We can create it\n\t\t};\n\t}\n\n\t// Collection exists - check field compatibility\n\tconst fieldStatus: CollectionSchemaStatus[\"fieldStatus\"] = {};\n\tconst incompatibleFields: string[] = [];\n\n\tfor (const field of requiredFields) {\n\t\tconst existingField = existingCollection.fields.get(field.slug);\n\n\t\tif (!existingField) {\n\t\t\t// Field missing - we can add it\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"missing\",\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t} else if (isTypeCompatible(field.type, existingField.type)) {\n\t\t\t// Field exists and is compatible\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"compatible\",\n\t\t\t\texistingType: existingField.type,\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t} else {\n\t\t\t// Field exists but type doesn't match\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"type_mismatch\",\n\t\t\t\texistingType: existingField.type,\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t\tincompatibleFields.push(field.slug);\n\t\t}\n\t}\n\n\tconst canImport = incompatibleFields.length === 0;\n\tconst reason = canImport\n\t\t? undefined\n\t\t: `Incompatible field types: ${incompatibleFields.join(\", \")}. ` +\n\t\t\t`Existing fields have different types than required for import.`;\n\n\treturn {\n\t\texists: true,\n\t\tfieldStatus,\n\t\tcanImport,\n\t\treason,\n\t};\n}\n\n/** Check if two field types are compatible for import */\nfunction isTypeCompatible(requiredType: string, existingType: string): boolean {\n\t// Exact match\n\tif (requiredType === existingType) return true;\n\n\t// Compatible mappings\n\tconst compatibleTypes: Record<string, string[]> = {\n\t\tstring: [\"string\", \"text\", \"slug\"],\n\t\ttext: [\"string\", \"text\"],\n\t\tportableText: [\"portableText\", \"json\"],\n\t\tnumber: [\"number\", \"integer\"],\n\t\tinteger: [\"number\", \"integer\"],\n\t};\n\n\tconst compatible = compatibleTypes[requiredType];\n\treturn compatible?.includes(existingType) ?? false;\n}\n\nfunction isInternalPostType(type: string): boolean {\n\treturn [\n\t\t\"revision\",\n\t\t\"nav_menu_item\",\n\t\t\"custom_css\",\n\t\t\"customize_changeset\",\n\t\t\"oembed_cache\",\n\t\t\"wp_global_styles\",\n\t\t\"wp_navigation\",\n\t\t\"wp_template\",\n\t\t\"wp_template_part\",\n\t\t\"attachment\", // Handled separately as media\n\t\t\"wp_block\", // Handled separately as sections (reusable blocks)\n\t].includes(type);\n}\n\nfunction isInternalMetaKey(key: string): boolean {\n\tif (key.startsWith(\"_edit_\")) return true;\n\tif (key.startsWith(\"_wp_\")) return true;\n\tif (key === \"_edit_last\" || key === \"_edit_lock\") return true;\n\tif (key === \"_pingme\" || key === \"_encloseme\") return true;\n\n\t// Keep these useful ones\n\tif (key === \"_thumbnail_id\") return false;\n\tif (key.startsWith(\"_yoast_\")) return false;\n\tif (key.startsWith(\"_rank_math_\")) return false;\n\n\t// Other underscore prefixes are usually internal\n\tif (key.startsWith(\"_\")) return true;\n\n\treturn false;\n}\n\nfunction sanitizeSlug(slug: string): string {\n\tconst sanitized = slug\n\t\t.toLowerCase()\n\t\t.replace(INVALID_SLUG_CHARS, \"_\")\n\t\t.replace(LEADING_NON_ALPHA, \"\");\n\tif (!sanitized) return \"imported\";\n\tif (RESERVED_COLLECTION_SLUGS.includes(sanitized)) return `wp_${sanitized}`;\n\treturn sanitized;\n}\n\nfunction mapPostTypeToCollection(postType: string): string {\n\tconst mapping: Record<string, string> = {\n\t\tpost: \"posts\",\n\t\tpage: \"pages\",\n\t\tattachment: \"media\",\n\t\tproduct: \"products\",\n\t\tportfolio: \"portfolio\",\n\t\ttestimonial: \"testimonials\",\n\t\tteam: \"team\",\n\t\tevent: \"events\",\n\t\tfaq: \"faqs\",\n\t};\n\treturn mapping[postType] || sanitizeSlug(postType);\n}\n\nfunction mapMetaKeyToField(key: string): string {\n\t// SEO plugins\n\tif (key === \"_yoast_wpseo_title\") return \"seo_title\";\n\tif (key === \"_yoast_wpseo_metadesc\") return \"seo_description\";\n\tif (key === \"_rank_math_title\") return \"seo_title\";\n\tif (key === \"_rank_math_description\") return \"seo_description\";\n\tif (key === \"_thumbnail_id\") return \"featured_image\";\n\n\t// Remove leading underscore\n\tif (key.startsWith(\"_\")) return key.slice(1);\n\n\treturn key;\n}\n\nfunction inferMetaType(\n\tkey: string,\n\tvalue: string | undefined,\n): \"string\" | \"number\" | \"boolean\" | \"date\" | \"json\" {\n\tif (key.endsWith(\"_id\") || key === \"_thumbnail_id\") return \"string\"; // reference\n\tif (key.endsWith(\"_date\") || key.endsWith(\"_time\")) return \"date\";\n\tif (key.endsWith(\"_count\") || key.endsWith(\"_number\")) return \"number\";\n\n\tif (!value) return \"string\";\n\n\t// Serialized PHP or JSON\n\tif (value.startsWith(\"a:\") || value.startsWith(\"{\") || value.startsWith(\"[\")) return \"json\";\n\n\t// Number\n\tif (NUMERIC_PATTERN.test(value)) return \"number\";\n\n\t// Boolean\n\tif ([\"0\", \"1\", \"true\", \"false\"].includes(value)) return \"boolean\";\n\n\treturn \"string\";\n}\n\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction singularize(str: string): string {\n\tif (str.endsWith(\"ies\")) return str.slice(0, -3) + \"y\";\n\tif (str.endsWith(\"s\")) return str.slice(0, -1);\n\treturn str;\n}\n\n// Export helpers for use in prepare endpoint\nexport { capitalize, sanitizeSlug, singularize, mapPostTypeToCollection };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyze.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/analyze.ts"],"sourcesContent":["/**\n * WordPress WXR analyze endpoint\n *\n * POST /_emdash/api/import/wordpress/analyze\n *\n * Accepts a WXR file upload and returns analysis of its contents,\n * including post types, counts, custom fields, and schema compatibility.\n */\n\nimport type { APIRoute } from \"astro\";\nimport { parseWxrString, SchemaRegistry, type WxrData } from \"emdash\";\nimport mime from \"mime/lite\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isInternalPostType } from \"#import/utils.js\";\nimport { RESERVED_COLLECTION_SLUGS } from \"#schema/types.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nexport const prerender = false;\n\nconst NUMERIC_PATTERN = /^-?\\d+(\\.\\d+)?$/;\nconst INVALID_SLUG_CHARS = /[^a-z0-9_]/g;\nconst LEADING_NON_ALPHA = /^[^a-z]+/;\n\n/** Field compatibility status */\nexport type FieldCompatibility =\n\t| \"compatible\" // Field exists with compatible type\n\t| \"type_mismatch\" // Field exists but type differs\n\t| \"missing\"; // Field doesn't exist\n\n/** Single field definition for import */\nexport interface ImportFieldDef {\n\tslug: string;\n\tlabel: string;\n\ttype: string;\n\trequired: boolean;\n\tsearchable?: boolean;\n}\n\n/** Schema status for a collection */\nexport interface CollectionSchemaStatus {\n\t/** Whether collection exists */\n\texists: boolean;\n\t/** If exists, per-field compatibility */\n\tfieldStatus: Record<\n\t\tstring,\n\t\t{\n\t\t\tstatus: FieldCompatibility;\n\t\t\texistingType?: string;\n\t\t\trequiredType: string;\n\t\t}\n\t>;\n\t/** Can we safely import to this collection? */\n\tcanImport: boolean;\n\t/** Human-readable reason if canImport is false */\n\treason?: string;\n}\n\n/** Post type with full schema info */\nexport interface PostTypeAnalysis {\n\t/** WordPress post type name */\n\tname: string;\n\t/** Number of items to import */\n\tcount: number;\n\t/** Suggested collection slug */\n\tsuggestedCollection: string;\n\t/** Fields we need to create */\n\trequiredFields: ImportFieldDef[];\n\t/** Schema compatibility status */\n\tschemaStatus: CollectionSchemaStatus;\n}\n\n/** Individual attachment info for media import */\nexport interface AttachmentInfo {\n\tid?: number;\n\ttitle?: string;\n\turl?: string;\n\tfilename?: string;\n\tmimeType?: string;\n}\n\n/** Author info from WordPress */\nexport interface WpAuthorInfo {\n\tid?: number;\n\tlogin?: string;\n\temail?: string;\n\tdisplayName?: string;\n\tpostCount: number;\n}\n\nexport interface WxrAnalysis {\n\tsite: {\n\t\ttitle: string;\n\t\turl: string;\n\t};\n\tpostTypes: PostTypeAnalysis[];\n\tattachments: {\n\t\tcount: number;\n\t\titems: AttachmentInfo[];\n\t};\n\tcategories: number;\n\ttags: number;\n\tauthors: WpAuthorInfo[];\n\tcustomFields: Array<{\n\t\tkey: string;\n\t\tcount: number;\n\t\tsamples: string[];\n\t\tsuggestedField: string;\n\t\tsuggestedType: \"string\" | \"number\" | \"boolean\" | \"date\" | \"json\";\n\t\tisInternal: boolean;\n\t}>;\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 formData = await request.formData();\n\t\tconst fileEntry = formData.get(\"file\");\n\t\tconst file = fileEntry instanceof File ? fileEntry : null;\n\n\t\tif (!file) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No file provided\", 400);\n\t\t}\n\n\t\t// Parse WXR\n\t\tconst text = await file.text();\n\t\tconst wxr = await parseWxrString(text);\n\n\t\t// Fetch existing collections from schema registry\n\t\tconst existingCollections = await fetchExistingCollections(emdash?.db);\n\n\t\t// Analyze content with schema compatibility\n\t\tconst analysis = analyzeWxr(wxr, existingCollections);\n\n\t\treturn apiSuccess(analysis);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to analyze file\", \"WXR_ANALYZE_ERROR\");\n\t}\n};\n\n/** Existing collection info from schema registry */\ninterface ExistingCollection {\n\tslug: string;\n\tfields: Map<string, { type: string; columnType: 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\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; columnType: string }>();\n\n\t\t\tfor (const field of fields) {\n\t\t\t\tfieldMap.set(field.slug, {\n\t\t\t\t\ttype: field.type,\n\t\t\t\t\tcolumnType: field.columnType,\n\t\t\t\t});\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\n/** Base fields required for any WordPress import */\nconst BASE_REQUIRED_FIELDS: ImportFieldDef[] = [\n\t{ slug: \"title\", label: \"Title\", type: \"string\", required: true, searchable: true },\n\t{ slug: \"content\", label: \"Content\", type: \"portableText\", required: false, searchable: true },\n\t{ slug: \"excerpt\", label: \"Excerpt\", type: \"text\", required: false },\n];\n\n/** Featured image field - only added to post types that have _thumbnail_id */\nconst FEATURED_IMAGE_FIELD: ImportFieldDef = {\n\tslug: \"featured_image\",\n\tlabel: \"Featured Image\",\n\ttype: \"image\",\n\trequired: false,\n};\n\nfunction analyzeWxr(\n\twxr: WxrData,\n\texistingCollections: Map<string, ExistingCollection>,\n): WxrAnalysis {\n\t// Count post types and track which have featured images\n\tconst postTypeCounts = new Map<string, number>();\n\tconst postTypesWithThumbnails = new Set<string>();\n\tconst metaKeys = new Map<string, { count: number; samples: string[]; isInternal: boolean }>();\n\tconst authorPostCounts = new Map<string, number>();\n\n\tfor (const post of wxr.posts) {\n\t\tconst type = post.postType || \"post\";\n\t\tpostTypeCounts.set(type, (postTypeCounts.get(type) || 0) + 1);\n\n\t\t// Count posts per author (by login)\n\t\tif (post.creator) {\n\t\t\tauthorPostCounts.set(post.creator, (authorPostCounts.get(post.creator) || 0) + 1);\n\t\t}\n\n\t\t// Track if this post type has featured images\n\t\tif (post.meta.has(\"_thumbnail_id\")) {\n\t\t\tpostTypesWithThumbnails.add(type);\n\t\t}\n\n\t\t// Analyze meta keys\n\t\tfor (const [key, value] of post.meta) {\n\t\t\tconst existing = metaKeys.get(key);\n\t\t\tif (existing) {\n\t\t\t\texisting.count++;\n\t\t\t\tif (existing.samples.length < 3 && value) {\n\t\t\t\t\texisting.samples.push(value.slice(0, 100));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmetaKeys.set(key, {\n\t\t\t\t\tcount: 1,\n\t\t\t\t\tsamples: value ? [value.slice(0, 100)] : [],\n\t\t\t\t\tisInternal: isInternalMetaKey(key),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Map meta keys to fields (for custom fields analysis)\n\tconst customFields = [...metaKeys.entries()]\n\t\t.filter(([_, info]) => !info.isInternal)\n\t\t.map(([key, info]) => ({\n\t\t\tkey,\n\t\t\tcount: info.count,\n\t\t\tsamples: info.samples,\n\t\t\tsuggestedField: mapMetaKeyToField(key),\n\t\t\tsuggestedType: inferMetaType(key, info.samples[0]),\n\t\t\tisInternal: info.isInternal,\n\t\t}))\n\t\t.toSorted((a, b) => b.count - a.count);\n\n\t// Build post type analysis with schema compatibility\n\tconst seenSlugs = new Map<string, number>();\n\tconst postTypes: PostTypeAnalysis[] = [...postTypeCounts.entries()]\n\t\t.filter(([type]) => !isInternalPostType(type))\n\t\t.map(([name, count]) => {\n\t\t\tlet suggestedCollection = mapPostTypeToCollection(name);\n\n\t\t\t// Deduplicate: if multiple post types produce the same slug, append a suffix\n\t\t\tconst seen = seenSlugs.get(suggestedCollection) ?? 0;\n\t\t\tseenSlugs.set(suggestedCollection, seen + 1);\n\t\t\tif (seen > 0) {\n\t\t\t\tsuggestedCollection = `${suggestedCollection}_${seen}`;\n\t\t\t}\n\t\t\tconst existingCollection = existingCollections.get(suggestedCollection);\n\n\t\t\t// Build required fields - add featured_image only if posts have thumbnails\n\t\t\tconst requiredFields = [...BASE_REQUIRED_FIELDS];\n\t\t\tif (postTypesWithThumbnails.has(name)) {\n\t\t\t\trequiredFields.push(FEATURED_IMAGE_FIELD);\n\t\t\t}\n\n\t\t\tconst schemaStatus = checkSchemaCompatibility(requiredFields, existingCollection);\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tcount,\n\t\t\t\tsuggestedCollection,\n\t\t\t\trequiredFields,\n\t\t\t\tschemaStatus,\n\t\t\t};\n\t\t})\n\t\t.toSorted((a, b) => b.count - a.count);\n\n\t// Build attachment info list\n\tconst attachmentItems: AttachmentInfo[] = wxr.attachments.map((att) => {\n\t\tconst filename = att.url ? getFilenameFromUrl(att.url) : undefined;\n\t\tconst mimeType = filename ? guessMimeType(filename) : undefined;\n\t\treturn {\n\t\t\tid: att.id,\n\t\t\ttitle: att.title,\n\t\t\turl: att.url,\n\t\t\tfilename,\n\t\t\tmimeType,\n\t\t};\n\t});\n\n\treturn {\n\t\tsite: {\n\t\t\ttitle: wxr.site.title || \"WordPress Site\",\n\t\t\turl: wxr.site.link || \"\",\n\t\t},\n\t\tpostTypes,\n\t\tattachments: {\n\t\t\tcount: wxr.attachments.length,\n\t\t\titems: attachmentItems,\n\t\t},\n\t\tcategories: wxr.categories.length,\n\t\ttags: wxr.tags.length,\n\t\tauthors: wxr.authors.map((a) => ({\n\t\t\tid: a.id,\n\t\t\tlogin: a.login,\n\t\t\temail: a.email,\n\t\t\tdisplayName: a.displayName || a.login || \"Unknown\",\n\t\t\tpostCount: a.login ? authorPostCounts.get(a.login) || 0 : 0,\n\t\t})),\n\t\tcustomFields,\n\t};\n}\n\n/** Extract filename from URL */\nfunction getFilenameFromUrl(url: string): string | undefined {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\tconst segments = parsed.pathname.split(\"/\").filter(Boolean);\n\t\treturn segments.pop();\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Guess MIME type from filename extension */\nfunction guessMimeType(filename: string): string | undefined {\n\treturn mime.getType(filename) ?? undefined;\n}\n\n/** Check if a collection schema is compatible with import requirements */\nfunction checkSchemaCompatibility(\n\trequiredFields: ImportFieldDef[],\n\texistingCollection: ExistingCollection | undefined,\n): CollectionSchemaStatus {\n\tif (!existingCollection) {\n\t\t// Collection doesn't exist - will need to create it\n\t\tconst fieldStatus: CollectionSchemaStatus[\"fieldStatus\"] = {};\n\t\tfor (const field of requiredFields) {\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"missing\",\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\texists: false,\n\t\t\tfieldStatus,\n\t\t\tcanImport: true, // We can create it\n\t\t};\n\t}\n\n\t// Collection exists - check field compatibility\n\tconst fieldStatus: CollectionSchemaStatus[\"fieldStatus\"] = {};\n\tconst incompatibleFields: string[] = [];\n\n\tfor (const field of requiredFields) {\n\t\tconst existingField = existingCollection.fields.get(field.slug);\n\n\t\tif (!existingField) {\n\t\t\t// Field missing - we can add it\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"missing\",\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t} else if (isTypeCompatible(field.type, existingField.type)) {\n\t\t\t// Field exists and is compatible\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"compatible\",\n\t\t\t\texistingType: existingField.type,\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t} else {\n\t\t\t// Field exists but type doesn't match\n\t\t\tfieldStatus[field.slug] = {\n\t\t\t\tstatus: \"type_mismatch\",\n\t\t\t\texistingType: existingField.type,\n\t\t\t\trequiredType: field.type,\n\t\t\t};\n\t\t\tincompatibleFields.push(field.slug);\n\t\t}\n\t}\n\n\tconst canImport = incompatibleFields.length === 0;\n\tconst reason = canImport\n\t\t? undefined\n\t\t: `Incompatible field types: ${incompatibleFields.join(\", \")}. ` +\n\t\t\t`Existing fields have different types than required for import.`;\n\n\treturn {\n\t\texists: true,\n\t\tfieldStatus,\n\t\tcanImport,\n\t\treason,\n\t};\n}\n\n/** Check if two field types are compatible for import */\nfunction isTypeCompatible(requiredType: string, existingType: string): boolean {\n\t// Exact match\n\tif (requiredType === existingType) return true;\n\n\t// Compatible mappings\n\tconst compatibleTypes: Record<string, string[]> = {\n\t\tstring: [\"string\", \"text\", \"slug\"],\n\t\ttext: [\"string\", \"text\"],\n\t\tportableText: [\"portableText\", \"json\"],\n\t\tnumber: [\"number\", \"integer\"],\n\t\tinteger: [\"number\", \"integer\"],\n\t};\n\n\tconst compatible = compatibleTypes[requiredType];\n\treturn compatible?.includes(existingType) ?? false;\n}\n\nfunction isInternalMetaKey(key: string): boolean {\n\tif (key.startsWith(\"_edit_\")) return true;\n\tif (key.startsWith(\"_wp_\")) return true;\n\tif (key === \"_edit_last\" || key === \"_edit_lock\") return true;\n\tif (key === \"_pingme\" || key === \"_encloseme\") return true;\n\n\t// Keep these useful ones\n\tif (key === \"_thumbnail_id\") return false;\n\tif (key.startsWith(\"_yoast_\")) return false;\n\tif (key.startsWith(\"_rank_math_\")) return false;\n\n\t// Other underscore prefixes are usually internal\n\tif (key.startsWith(\"_\")) return true;\n\n\treturn false;\n}\n\nfunction sanitizeSlug(slug: string): string {\n\tconst sanitized = slug\n\t\t.toLowerCase()\n\t\t.replace(INVALID_SLUG_CHARS, \"_\")\n\t\t.replace(LEADING_NON_ALPHA, \"\");\n\tif (!sanitized) return \"imported\";\n\tif (RESERVED_COLLECTION_SLUGS.includes(sanitized)) return `wp_${sanitized}`;\n\treturn sanitized;\n}\n\nfunction mapPostTypeToCollection(postType: string): string {\n\tconst mapping: Record<string, string> = {\n\t\tpost: \"posts\",\n\t\tpage: \"pages\",\n\t\tattachment: \"media\",\n\t\tproduct: \"products\",\n\t\tportfolio: \"portfolio\",\n\t\ttestimonial: \"testimonials\",\n\t\tteam: \"team\",\n\t\tevent: \"events\",\n\t\tfaq: \"faqs\",\n\t};\n\treturn mapping[postType] || sanitizeSlug(postType);\n}\n\nfunction mapMetaKeyToField(key: string): string {\n\t// SEO plugins\n\tif (key === \"_yoast_wpseo_title\") return \"seo_title\";\n\tif (key === \"_yoast_wpseo_metadesc\") return \"seo_description\";\n\tif (key === \"_rank_math_title\") return \"seo_title\";\n\tif (key === \"_rank_math_description\") return \"seo_description\";\n\tif (key === \"_thumbnail_id\") return \"featured_image\";\n\n\t// Remove leading underscore\n\tif (key.startsWith(\"_\")) return key.slice(1);\n\n\treturn key;\n}\n\nfunction inferMetaType(\n\tkey: string,\n\tvalue: string | undefined,\n): \"string\" | \"number\" | \"boolean\" | \"date\" | \"json\" {\n\tif (key.endsWith(\"_id\") || key === \"_thumbnail_id\") return \"string\"; // reference\n\tif (key.endsWith(\"_date\") || key.endsWith(\"_time\")) return \"date\";\n\tif (key.endsWith(\"_count\") || key.endsWith(\"_number\")) return \"number\";\n\n\tif (!value) return \"string\";\n\n\t// Serialized PHP or JSON\n\tif (value.startsWith(\"a:\") || value.startsWith(\"{\") || value.startsWith(\"[\")) return \"json\";\n\n\t// Number\n\tif (NUMERIC_PATTERN.test(value)) return \"number\";\n\n\t// Boolean\n\tif ([\"0\", \"1\", \"true\", \"false\"].includes(value)) return \"boolean\";\n\n\treturn \"string\";\n}\n\nfunction capitalize(str: string): string {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction singularize(str: string): string {\n\tif (str.endsWith(\"ies\")) return str.slice(0, -3) + \"y\";\n\tif (str.endsWith(\"s\")) return str.slice(0, -1);\n\treturn str;\n}\n\n// Export helpers for use in prepare endpoint\nexport { capitalize, sanitizeSlug, singularize, mapPostTypeToCollection };\n"],"mappings":"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"}
|
|
@@ -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 "../../../../../index-
|
|
10
|
-
import "../../../../../types-
|
|
11
|
-
import "../../../../../hreflang-
|
|
12
|
-
import "../../../../../validate-
|
|
1
|
+
import "../../../../../parse-CWHOFc6z.mjs";
|
|
2
|
+
import "../../../../../types-DCFavOii.mjs";
|
|
3
|
+
import "../../../../../types-QoPHm-2w.mjs";
|
|
4
|
+
import "../../../../../options-DJWaq3Ie.mjs";
|
|
5
|
+
import "../../../../../entry-lock-C7VX0NGK.mjs";
|
|
6
|
+
import "../../../../../config-Bsm_u_oE.mjs";
|
|
7
|
+
import "../../../../../runner-BObHz5FC.mjs";
|
|
8
|
+
import "../../../../../storage-query-DRyu3bSU.mjs";
|
|
9
|
+
import "../../../../../index-BB9sVisO.mjs";
|
|
10
|
+
import "../../../../../types-DHO7Pd25.mjs";
|
|
11
|
+
import "../../../../../hreflang-CY_F5OjF.mjs";
|
|
12
|
+
import "../../../../../validate-emKxGC5F.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-CrMonejI.mjs";
|
|
15
15
|
import { WxrPost } from "emdash";
|
|
16
16
|
import { APIRoute } from "astro";
|
|
17
17
|
|
|
@@ -35,6 +35,7 @@ interface ImportConfig {
|
|
|
35
35
|
interface ImportResult {
|
|
36
36
|
success: boolean;
|
|
37
37
|
imported: number;
|
|
38
|
+
/** Entries not imported because the slug already exists in the collection and locale. */
|
|
38
39
|
skipped: number;
|
|
39
40
|
errors: Array<{
|
|
40
41
|
title: string;
|
|
@@ -60,7 +61,7 @@ interface ImportResult {
|
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
63
|
declare const POST: APIRoute;
|
|
63
|
-
declare function importContent(posts: WxrPost[], config: ImportConfig, emdash: EmDashHandlers, manifest: EmDashManifest, attachmentMap: Map<string, string>, locale: string | undefined, authorDisplayNames: Map<string, string> | undefined, taxonomyPlan: TaxonomyImportPlan, translationGroupMap?: Map<string, string
|
|
64
|
+
declare function importContent(posts: WxrPost[], config: ImportConfig, emdash: EmDashHandlers, manifest: EmDashManifest, attachmentMap: Map<string, string>, locale: string | undefined, authorDisplayNames: Map<string, string> | undefined, taxonomyPlan: TaxonomyImportPlan, translationGroupMap?: Map<string, string>, siteUrl?: string): Promise<ImportResult>;
|
|
64
65
|
//#endregion
|
|
65
66
|
export { ImportConfig, ImportResult, POST, importContent, prerender };
|
|
66
67
|
//# sourceMappingURL=execute.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.mts","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/execute.ts"],"mappings":";;;;;;;;;;;;;;;;;;cAqCa,SAAA;AAAA,UA0BI,YAAA;;EAEhB,gBAAA,EAAkB,MAAA;IAGhB,UAAA;IACA,OAAA;EAAA;EAhCU;EAoCZ,YAAA;;EAEA,cAAA;EAtCqB;EAwCrB,cAAA,GAAiB,MAAA;EAdW;EAgB5B,MAAA;AAAA;AAAA,UAGgB,YAAA;EAChB,OAAA;EACA,QAAA;
|
|
1
|
+
{"version":3,"file":"execute.d.mts","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/execute.ts"],"mappings":";;;;;;;;;;;;;;;;;;cAqCa,SAAA;AAAA,UA0BI,YAAA;;EAEhB,gBAAA,EAAkB,MAAA;IAGhB,UAAA;IACA,OAAA;EAAA;EAhCU;EAoCZ,YAAA;;EAEA,cAAA;EAtCqB;EAwCrB,cAAA,GAAiB,MAAA;EAdW;EAgB5B,MAAA;AAAA;AAAA,UAGgB,YAAA;EAChB,OAAA;EACA,QAAA;EAfE;EAiBF,OAAA;EACA,MAAA,EAAQ,KAAA;IAAQ,KAAA;IAAe,KAAA;EAAA;EAC/B,YAAA,EAAc,MAAA;EATR;EAWN,QAAA;IACC,OAAA;IACA,OAAA;EAAA;EAJa;EAOd,UAAA;IAIc,sEAFb,YAAA,EAAc,MAAA,kBAEK;IAAnB,WAAA,EAAa,MAAA,kBAfd;IAiBC,WAAA;IAdD;;;;;IAoBC,iBAAA;EAAA;AAAA;AAAA,cAIW,IAAA,EAAM,QAAA;AAAA,iBA8VG,aAAA,CACrB,KAAA,EAAO,OAAA,IACP,MAAA,EAAQ,YAAA,EACR,MAAA,EAAQ,cAAA,EACR,QAAA,EAAU,cAAA,EACV,aAAA,EAAe,GAAA,kBACf,MAAA,sBACA,kBAAA,EAAoB,GAAA,8BACpB,YAAA,EAAc,kBAAA,EACd,mBAAA,GAAmB,GAAA,kBACnB,OAAA,YACE,OAAA,CAAQ,YAAA"}
|
|
@@ -3,35 +3,36 @@ import "../../../../../config-CvmjJcVw.mjs";
|
|
|
3
3
|
import "../../../../../after-PcEvMY_6.mjs";
|
|
4
4
|
import "../../../../../base64-BQBZwXCx.mjs";
|
|
5
5
|
import "../../../../../object-cache-Bo6DGaC9.mjs";
|
|
6
|
-
import { n as slugify } from "../../../../../slugify-
|
|
6
|
+
import { n as slugify } from "../../../../../slugify-bu2-jKia.mjs";
|
|
7
7
|
import "../../../../../request-cache-C4CIo5ad.mjs";
|
|
8
8
|
import "../../../../../url-Dn3IStq8.mjs";
|
|
9
|
-
import "../../../../../types-
|
|
10
|
-
import "../../../../../taxonomy-
|
|
9
|
+
import "../../../../../types-D2NEXtgB.mjs";
|
|
10
|
+
import "../../../../../taxonomy-C_C_LBAU.mjs";
|
|
11
11
|
import "../../../../../resolve-D-kqyKns.mjs";
|
|
12
12
|
import "../../../../../byline-registry-dvt4N3xV.mjs";
|
|
13
|
-
import "../../../../../field-defs-cache-
|
|
14
|
-
import { t as BylineRepository } from "../../../../../byline-
|
|
15
|
-
import "../../../../../loader-
|
|
16
|
-
import "../../../../../
|
|
17
|
-
import "../../../../../
|
|
18
|
-
import "../../../../../
|
|
19
|
-
import "../../../../../errors-
|
|
20
|
-
import "../../../../../
|
|
21
|
-
import "../../../../../
|
|
22
|
-
import
|
|
23
|
-
import "../../../../../
|
|
24
|
-
import "../../../../../
|
|
25
|
-
import "../../../../../
|
|
26
|
-
import "../../../../../
|
|
27
|
-
import
|
|
28
|
-
import "../../../../../
|
|
29
|
-
import "../../../../../
|
|
13
|
+
import "../../../../../field-defs-cache-Dez5iWJJ.mjs";
|
|
14
|
+
import { t as BylineRepository } from "../../../../../byline-BR1qhyiw.mjs";
|
|
15
|
+
import "../../../../../loader-CswroUbe.mjs";
|
|
16
|
+
import "../../../../../json-recordset-BUjxhr77.mjs";
|
|
17
|
+
import "../../../../../collection-slugs-cache-e09QeJQt.mjs";
|
|
18
|
+
import "../../../../../taxonomies-ChnU7Mc8.mjs";
|
|
19
|
+
import "../../../../../errors-B4f4It-2.mjs";
|
|
20
|
+
import "../../../../../errors-BOYNdIo3.mjs";
|
|
21
|
+
import "../../../../../settings-Dd1uivmQ.mjs";
|
|
22
|
+
import "../../../../../site-settings-DRHfX7bq.mjs";
|
|
23
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CVWeIOku.mjs";
|
|
24
|
+
import "../../../../../redirects-BEVSRMa2.mjs";
|
|
25
|
+
import "../../../../../entry-lock-Df6-XhIu.mjs";
|
|
26
|
+
import "../../../../../media-1WC65OCB.mjs";
|
|
27
|
+
import "../../../../../comments-yiRFx3w5.mjs";
|
|
28
|
+
import { b as wxrImportConfig, v as wxrChunkCursor, y as wxrChunkState } from "../../../../../byline-fields-BLXZnX7N.mjs";
|
|
29
|
+
import "../../../../../menus-BSzwObhV.mjs";
|
|
30
|
+
import "../../../../../status-BFNdxzKc.mjs";
|
|
30
31
|
import "../../../../../api/schemas/index.mjs";
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
32
|
+
import { _ as resolveImportByline, g as relativizeContentLinks } from "../../../../../utils-TPt7w2cS.mjs";
|
|
33
|
+
import { o as requirePerm } from "../../../../../authorize-DPFBGbE6.mjs";
|
|
33
34
|
import { sanitizeSlug } from "./analyze.mjs";
|
|
34
|
-
import { a as preImportWxrTaxonomies, i as mirrorTermsToLocales, n as isWxrTaxonomyConflictError, o as setPostTermAssignmentsReplacing, r as loadTaxonomyPlanFromDb, t as attachPostTaxonomies } from "../../../../../wxr-taxonomies-
|
|
35
|
+
import { a as preImportWxrTaxonomies, i as mirrorTermsToLocales, n as isWxrTaxonomyConflictError, o as setPostTermAssignmentsReplacing, r as loadTaxonomyPlanFromDb, t as attachPostTaxonomies } from "../../../../../wxr-taxonomies-RgRG0d5e.mjs";
|
|
35
36
|
import { gutenbergToPortableText } from "@emdash-cms/gutenberg-to-portable-text";
|
|
36
37
|
import { ContentRepository, importReusableBlocksAsSections, parseWxrDate, parseWxrString } from "emdash";
|
|
37
38
|
|
|
@@ -165,7 +166,7 @@ const POST = async ({ request, locals }) => {
|
|
|
165
166
|
}
|
|
166
167
|
throw mirrorError;
|
|
167
168
|
}
|
|
168
|
-
const result = await importContent(wxr.posts, config, emdash, emdashManifest, attachmentMap, config.locale, authorDisplayNames, taxonomyPlan);
|
|
169
|
+
const result = await importContent(wxr.posts, config, emdash, emdashManifest, attachmentMap, config.locale, authorDisplayNames, taxonomyPlan, /* @__PURE__ */ new Map(), wxr.site.link);
|
|
169
170
|
if (config.importSections !== false) {
|
|
170
171
|
const sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);
|
|
171
172
|
result.sections = {
|
|
@@ -208,7 +209,7 @@ async function runContentChunk(wxr, config, emdash, manifest, attachmentMap, aut
|
|
|
208
209
|
const posts = wxr.posts.slice(offset, offset + WXR_CONTENT_CHUNK_SIZE);
|
|
209
210
|
const taxonomyPlan = await loadTaxonomyPlanFromDb(emdash.db);
|
|
210
211
|
const translationGroupMap = new Map(Object.entries(incomingChunk?.translationGroups ?? {}));
|
|
211
|
-
const result = await importContent(posts, config, emdash, manifest, attachmentMap, config.locale, authorDisplayNames, taxonomyPlan, translationGroupMap);
|
|
212
|
+
const result = await importContent(posts, config, emdash, manifest, attachmentMap, config.locale, authorDisplayNames, taxonomyPlan, translationGroupMap, wxr.site.link);
|
|
212
213
|
const nextOffset = offset + posts.length;
|
|
213
214
|
const done = nextOffset >= wxr.posts.length;
|
|
214
215
|
return {
|
|
@@ -230,7 +231,7 @@ async function prepareTaxonomies(wxr, emdash, locale) {
|
|
|
230
231
|
if (postLocales.size > 0) await mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, locale);
|
|
231
232
|
return taxonomyPlan;
|
|
232
233
|
}
|
|
233
|
-
async function importContent(posts, config, emdash, manifest, attachmentMap, locale, authorDisplayNames, taxonomyPlan, translationGroupMap = /* @__PURE__ */ new Map()) {
|
|
234
|
+
async function importContent(posts, config, emdash, manifest, attachmentMap, locale, authorDisplayNames, taxonomyPlan, translationGroupMap = /* @__PURE__ */ new Map(), siteUrl = "") {
|
|
234
235
|
const result = {
|
|
235
236
|
success: true,
|
|
236
237
|
imported: 0,
|
|
@@ -250,10 +251,7 @@ async function importContent(posts, config, emdash, manifest, attachmentMap, loc
|
|
|
250
251
|
for (const post of posts) {
|
|
251
252
|
const postType = post.postType || "post";
|
|
252
253
|
const mapping = config.postTypeMappings[postType];
|
|
253
|
-
if (!mapping || !mapping.enabled)
|
|
254
|
-
result.skipped++;
|
|
255
|
-
continue;
|
|
256
|
-
}
|
|
254
|
+
if (!mapping || !mapping.enabled) continue;
|
|
257
255
|
const collection = sanitizeSlug(mapping.collection);
|
|
258
256
|
if (!manifest?.collections[collection]) {
|
|
259
257
|
result.errors.push({
|
|
@@ -264,6 +262,7 @@ async function importContent(posts, config, emdash, manifest, attachmentMap, loc
|
|
|
264
262
|
}
|
|
265
263
|
try {
|
|
266
264
|
const content = post.content ? gutenbergToPortableText(post.content) : [];
|
|
265
|
+
if (siteUrl) relativizeContentLinks(content, siteUrl);
|
|
267
266
|
const slug = post.postName || slugify(post.title || `post-${post.id || Date.now()}`);
|
|
268
267
|
const postLocale = post.locale ?? locale;
|
|
269
268
|
if (config.skipExisting) {
|
|
@@ -323,6 +322,13 @@ async function importContent(posts, config, emdash, manifest, attachmentMap, loc
|
|
|
323
322
|
error: taxError instanceof Error && taxError.message ? `Imported but failed to attach taxonomies: ${taxError.message}` : "Imported but failed to attach taxonomies"
|
|
324
323
|
});
|
|
325
324
|
}
|
|
325
|
+
if (createdItem && post.status === "future" && createdAt && Date.parse(createdAt) > Date.now()) {
|
|
326
|
+
const scheduled = await emdash.handleContentSchedule(collection, createdItem.id, createdAt);
|
|
327
|
+
if (!scheduled.success) result.errors.push({
|
|
328
|
+
title: post.title || "Untitled",
|
|
329
|
+
error: `Imported as draft but failed to schedule: ${scheduled.error?.message ?? "Unknown error"}`
|
|
330
|
+
});
|
|
331
|
+
}
|
|
326
332
|
} else result.errors.push({
|
|
327
333
|
title: post.title || "Untitled",
|
|
328
334
|
error: typeof createResult.error === "object" && createResult.error !== null ? createResult.error.message || "Unknown error" : String(createResult.error)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/execute.ts"],"sourcesContent":["/**\n * WordPress WXR execute import endpoint\n *\n * POST /_emdash/api/import/wordpress/execute\n *\n * Accepts WXR file and import configuration, imports content into the database.\n */\n\nimport { gutenbergToPortableText } from \"@emdash-cms/gutenberg-to-portable-text\";\nimport type { APIRoute } from \"astro\";\nimport {\n\tparseWxrString,\n\tContentRepository,\n\timportReusableBlocksAsSections,\n\ttype WxrPost,\n\tparseWxrDate,\n} from \"emdash\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { wxrChunkCursor, wxrChunkState, wxrImportConfig } from \"#api/schemas.js\";\nimport { BylineRepository } from \"#db/repositories/byline.js\";\nimport { resolveImportByline } from \"#import/utils.js\";\nimport {\n\tattachPostTaxonomies,\n\tisWxrTaxonomyConflictError,\n\tloadTaxonomyPlanFromDb,\n\tmirrorTermsToLocales,\n\tpreImportWxrTaxonomies,\n\tsetPostTermAssignmentsReplacing,\n\ttype TaxonomyImportPlan,\n} from \"#import/wxr-taxonomies.js\";\nimport type { EmDashHandlers, EmDashManifest } from \"#types\";\nimport { slugify } from \"#utils/slugify.js\";\n\nimport { sanitizeSlug } from \"./analyze.js\";\n\nexport const prerender = false;\n\n/** Posts processed per Worker invocation in chunked WXR imports. */\nconst WXR_CONTENT_CHUNK_SIZE = 30;\n\n/** Phase/cursor payload for chunked WXR imports. */\ninterface WxrChunkCursor {\n\toffset: number;\n\tsource: string;\n\ttaxonomiesReady: true;\n}\n\n/** Cross-chunk state carried by the client. */\ninterface WxrChunkState {\n\ttranslationGroups: Record<string, string>;\n}\n\n/** Chunked response shape mirrors the wordpress-plugin execute endpoint. */\ninterface WxrChunkResponse {\n\tsuccess: boolean;\n\tresult: ImportResult;\n\tdone: boolean;\n\tcursor?: WxrChunkCursor;\n\tchunk?: WxrChunkState;\n}\n\nexport interface ImportConfig {\n\t/** Map WordPress post types to EmDash collections */\n\tpostTypeMappings: Record<\n\t\tstring,\n\t\t{\n\t\t\tcollection: string;\n\t\t\tenabled: boolean;\n\t\t}\n\t>;\n\t/** Whether to skip items that already exist (by slug) */\n\tskipExisting: boolean;\n\t/** Whether to import reusable blocks (wp_block) as sections */\n\timportSections?: boolean;\n\t/** Author mappings (WP author login -> EmDash user ID) */\n\tauthorMappings?: Record<string, string | null>;\n\t/** BCP 47 locale for all imported items. When omitted, defaults to defaultLocale. */\n\tlocale?: string;\n}\n\nexport interface ImportResult {\n\tsuccess: boolean;\n\timported: number;\n\tskipped: number;\n\terrors: Array<{ title: string; error: string }>;\n\tbyCollection: Record<string, number>;\n\t/** Sections import results (if enabled) */\n\tsections?: {\n\t\tcreated: number;\n\t\tskipped: number;\n\t};\n\t/** Taxonomy import results (categories, tags, custom taxonomies). */\n\ttaxonomies?: {\n\t\t/** Terms newly created during this import, keyed by taxonomy name. */\n\t\ttermsCreated: Record<string, number>;\n\t\t/** Existing terms that were re-used, keyed by taxonomy name. */\n\t\ttermsReused: Record<string, number>;\n\t\t/** Total pivot rows (post <-> term) written to `content_taxonomies`. */\n\t\tassignments: number;\n\t\t/**\n\t\t * Custom taxonomy names from the WXR file that had no matching EmDash\n\t\t * definition and were therefore skipped. Lets the admin UI surface a\n\t\t * \"create taxonomy X first\" hint without re-running the import.\n\t\t */\n\t\tmissingTaxonomies: string[];\n\t};\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?.handleContentCreate) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\ttry {\n\t\tconst emdashManifest = await emdash.getManifest();\n\n\t\tconst formData = await request.formData();\n\t\tconst fileEntry = formData.get(\"file\");\n\t\tconst file = fileEntry instanceof File ? fileEntry : null;\n\t\tconst configEntry = formData.get(\"config\");\n\t\tconst configJson = typeof configEntry === \"string\" ? configEntry : null;\n\n\t\tif (!file) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No file provided\", 400);\n\t\t}\n\n\t\tif (!configJson) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No config provided\", 400);\n\t\t}\n\n\t\tconst parsedConfig = parseJsonField(configJson, \"config\");\n\t\tif (\"response\" in parsedConfig) return parsedConfig.response;\n\t\tconst configResult = wxrImportConfig.safeParse(parsedConfig.value);\n\t\tif (!configResult.success) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import config\", 400);\n\t\t}\n\t\tconst config: ImportConfig = configResult.data;\n\n\t\tconst phaseEntry = formData.get(\"phase\");\n\t\tif (\n\t\t\tphaseEntry !== null &&\n\t\t\tphaseEntry !== \"taxonomy\" &&\n\t\t\tphaseEntry !== \"content\" &&\n\t\t\tphaseEntry !== \"finalize\"\n\t\t) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import phase\", 400);\n\t\t}\n\t\tconst phase = phaseEntry;\n\n\t\tconst cursorEntry = formData.get(\"cursor\");\n\t\tlet cursor: WxrChunkCursor | undefined;\n\t\tif (typeof cursorEntry === \"string\" && cursorEntry.length > 0) {\n\t\t\tconst parsedCursor = parseJsonField(cursorEntry, \"cursor\");\n\t\t\tif (\"response\" in parsedCursor) return parsedCursor.response;\n\t\t\tconst cursorResult = wxrChunkCursor.safeParse(parsedCursor.value);\n\t\t\tif (!cursorResult.success) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import cursor\", 400);\n\t\t\t}\n\t\t\tcursor = cursorResult.data;\n\t\t}\n\n\t\tconst chunkEntry = formData.get(\"chunk\");\n\t\tlet incomingChunk: WxrChunkState | undefined;\n\t\tif (typeof chunkEntry === \"string\" && chunkEntry.length > 0) {\n\t\t\tconst parsedChunk = parseJsonField(chunkEntry, \"chunk\");\n\t\t\tif (\"response\" in parsedChunk) return parsedChunk.response;\n\t\t\tconst chunkResult = wxrChunkState.safeParse(parsedChunk.value);\n\t\t\tif (!chunkResult.success) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import chunk state\", 400);\n\t\t\t}\n\t\t\tincomingChunk = chunkResult.data;\n\t\t}\n\n\t\t// Parse WXR\n\t\tconst text = await file.text();\n\t\tconst wxr = await parseWxrString(text);\n\t\tconst source = await importFingerprint(text, configJson);\n\n\t\tif (cursor && cursor.source !== source) {\n\t\t\treturn apiError(\n\t\t\t\t\"WXR_IMPORT_SOURCE_CHANGED\",\n\t\t\t\t\"The WXR file or import configuration changed after this import started\",\n\t\t\t\t409,\n\t\t\t);\n\t\t}\n\n\t\t// Build attachment ID -> URL map for featured images\n\t\tconst attachmentMap = new Map<string, string>();\n\t\tfor (const att of wxr.attachments) {\n\t\t\tif (att.id && att.url) {\n\t\t\t\tattachmentMap.set(String(att.id), att.url);\n\t\t\t}\n\t\t}\n\n\t\t// Build author login -> display name map\n\t\tconst authorDisplayNames = new Map<string, string>();\n\t\tfor (const author of wxr.authors) {\n\t\t\tif (!author.login) continue;\n\t\t\tauthorDisplayNames.set(author.login, author.displayName || author.login);\n\t\t}\n\n\t\tif (phase === \"content\") {\n\t\t\tif (!cursor?.taxonomiesReady) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Taxonomy preparation is not complete\", 400);\n\t\t\t}\n\t\t\tconst chunkResponse = await runContentChunk(\n\t\t\t\twxr,\n\t\t\t\tconfig,\n\t\t\t\temdash,\n\t\t\t\temdashManifest,\n\t\t\t\tattachmentMap,\n\t\t\t\tauthorDisplayNames,\n\t\t\t\tcursor,\n\t\t\t\tincomingChunk,\n\t\t\t\tsource,\n\t\t\t);\n\t\t\tif (chunkResponse instanceof Response) return chunkResponse;\n\t\t\treturn apiSuccess(chunkResponse);\n\t\t}\n\n\t\tif (phase === \"taxonomy\") {\n\t\t\tif (cursor || incomingChunk) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Taxonomy preparation cannot be resumed\", 400);\n\t\t\t}\n\t\t\tlet taxonomyPlan: TaxonomyImportPlan;\n\t\t\ttry {\n\t\t\t\ttaxonomyPlan = await prepareTaxonomies(wxr, emdash, config.locale);\n\t\t\t} catch (error) {\n\t\t\t\tif (isWxrTaxonomyConflictError(error)) {\n\t\t\t\t\tconsole.error(\"[WXR_IMPORT_TAXONOMY_CONFLICT]\", error);\n\t\t\t\t\treturn apiError(\"WXR_IMPORT_TAXONOMY_CONFLICT\", error.publicMessage, 409);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst result = emptyImportResult();\n\t\t\tresult.taxonomies = {\n\t\t\t\ttermsCreated: taxonomyPlan.termsCreated,\n\t\t\t\ttermsReused: taxonomyPlan.termsReused,\n\t\t\t\tassignments: 0,\n\t\t\t\tmissingTaxonomies: taxonomyPlan.missingTaxonomies,\n\t\t\t};\n\t\t\treturn apiSuccess({\n\t\t\t\tsuccess: true,\n\t\t\t\tresult,\n\t\t\t\tdone: true,\n\t\t\t\tcursor: { offset: 0, source, taxonomiesReady: true as const },\n\t\t\t\tchunk: { translationGroups: {} },\n\t\t\t});\n\t\t}\n\n\t\tif (phase === \"finalize\") {\n\t\t\tif (!cursor || cursor.offset !== wxr.posts.length) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Content import is not complete\", 400);\n\t\t\t}\n\t\t\tconst result = emptyImportResult();\n\t\t\tif (config.importSections !== false) {\n\t\t\t\tconst sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);\n\t\t\t\tresult.sections = {\n\t\t\t\t\tcreated: sectionsResult.sectionsCreated,\n\t\t\t\t\tskipped: sectionsResult.sectionsSkipped,\n\t\t\t\t};\n\t\t\t\tresult.errors.push(...sectionsResult.errors);\n\t\t\t\tresult.success = result.errors.length === 0;\n\t\t\t}\n\t\t\treturn apiSuccess({ success: result.success, result, done: true });\n\t\t}\n\n\t\tif (wxr.posts.length > WXR_CONTENT_CHUNK_SIZE) {\n\t\t\treturn apiError(\n\t\t\t\t\"WXR_IMPORT_TOO_LARGE\",\n\t\t\t\t`This WXR contains ${wxr.posts.length} posts, which exceeds the ${WXR_CONTENT_CHUNK_SIZE}-post limit for a single import request. ` +\n\t\t\t\t\t`Run the import in chunked mode or split the file into smaller exports.`,\n\t\t\t\t413,\n\t\t\t);\n\t\t}\n\n\t\t// Pre-create taxonomy terms (categories, tags, custom taxonomies) so\n\t\t// per-post assignments can resolve to existing rows. Done before any\n\t\t// content insert because WXR exports list terms at the top of the\n\t\t// file but per-item assignments only reference them by slug.\n\t\tconst taxonomyPlan = await preImportWxrTaxonomies(\n\t\t\temdash.db,\n\t\t\twxr.posts,\n\t\t\twxr.categories,\n\t\t\twxr.tags,\n\t\t\twxr.terms,\n\t\t\tconfig.locale,\n\t\t);\n\n\t\t// Multilingual imports (WPML / Polylang -- see #1080) need a term\n\t\t// row at each per-post locale, all sharing the canonical term's\n\t\t// `translation_group`. Without this, `getTermsForEntry(..., locale)`\n\t\t// on non-canonical translations comes back empty.\n\t\t//\n\t\t// The mirror raises `WxrTaxonomyConflictError` with an operator-\n\t\t// actionable message when an existing locale row has an\n\t\t// incompatible group. Surface its `publicMessage` directly so the\n\t\t// admin UI can tell the user which (taxonomy, slug, locale) needs\n\t\t// reconciliation. Other errors (DB connectivity, unexpected\n\t\t// repository failures) re-throw to the outer catch where\n\t\t// `handleError` masks them with the generic \"Failed to import\n\t\t// content\" -- exposing raw DB errors to clients would leak schema\n\t\t// names and bypass the AGENTS.md \"never expose error.message\" rule.\n\t\tconst postLocales = new Set<string>();\n\t\tfor (const post of wxr.posts) {\n\t\t\tif (post.locale) postLocales.add(post.locale);\n\t\t}\n\t\tif (postLocales.size > 0) {\n\t\t\ttry {\n\t\t\t\tawait mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, config.locale);\n\t\t\t} catch (mirrorError) {\n\t\t\t\tif (isWxrTaxonomyConflictError(mirrorError)) {\n\t\t\t\t\tconsole.error(\"[WXR_IMPORT_TAXONOMY_CONFLICT]\", mirrorError);\n\t\t\t\t\treturn apiError(\"WXR_IMPORT_TAXONOMY_CONFLICT\", mirrorError.publicMessage, 409);\n\t\t\t\t}\n\t\t\t\tthrow mirrorError;\n\t\t\t}\n\t\t}\n\n\t\t// Import content (locale from config scopes all items)\n\t\tconst result = await importContent(\n\t\t\twxr.posts,\n\t\t\tconfig,\n\t\t\temdash,\n\t\t\temdashManifest,\n\t\t\tattachmentMap,\n\t\t\tconfig.locale,\n\t\t\tauthorDisplayNames,\n\t\t\ttaxonomyPlan,\n\t\t);\n\n\t\t// Import reusable blocks as sections (if enabled)\n\t\tif (config.importSections !== false) {\n\t\t\tconst sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);\n\t\t\tresult.sections = {\n\t\t\t\tcreated: sectionsResult.sectionsCreated,\n\t\t\t\tskipped: sectionsResult.sectionsSkipped,\n\t\t\t};\n\t\t\t// Add section errors to main errors array\n\t\t\tresult.errors.push(...sectionsResult.errors);\n\t\t\tif (sectionsResult.errors.length > 0) {\n\t\t\t\tresult.success = false;\n\t\t\t}\n\t\t}\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import content\", \"WXR_IMPORT_ERROR\");\n\t}\n};\n\nfunction parseJsonField(\n\tvalue: string,\n\tfieldName: string,\n): { value: unknown } | { response: Response } {\n\ttry {\n\t\treturn { value: JSON.parse(value) };\n\t} catch {\n\t\treturn { response: apiError(\"VALIDATION_ERROR\", `Invalid JSON in ${fieldName}`, 400) };\n\t}\n}\n\nasync function importFingerprint(text: string, configJson: string): Promise<string> {\n\tconst bytes = new TextEncoder().encode(`${configJson}\\u0000${text}`);\n\tconst digest = await crypto.subtle.digest(\"SHA-256\", bytes);\n\treturn Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction emptyImportResult(): ImportResult {\n\treturn {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t};\n}\n\n/** Import a bounded WXR post chunk using taxonomy rows prepared in the prior phase. */\nasync function runContentChunk(\n\twxr: Awaited<ReturnType<typeof parseWxrString>>,\n\tconfig: ImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\tattachmentMap: Map<string, string>,\n\tauthorDisplayNames: Map<string, string>,\n\tcursor: WxrChunkCursor | undefined,\n\tincomingChunk: WxrChunkState | undefined,\n\tsource: string,\n): Promise<WxrChunkResponse | Response> {\n\tconst offset = cursor?.offset ?? 0;\n\tif (offset > wxr.posts.length || (offset > 0 && offset % WXR_CONTENT_CHUNK_SIZE !== 0)) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import cursor offset\", 400);\n\t}\n\tconst posts = wxr.posts.slice(offset, offset + WXR_CONTENT_CHUNK_SIZE);\n\tconst taxonomyPlan = await loadTaxonomyPlanFromDb(emdash.db);\n\n\t// Seed translation-group state from earlier chunks so a translation that\n\t// appears on chunk N can link to its sibling imported on chunk N-1.\n\tconst translationGroupMap = new Map<string, string>(\n\t\tObject.entries(incomingChunk?.translationGroups ?? {}),\n\t);\n\n\tconst result = await importContent(\n\t\tposts,\n\t\tconfig,\n\t\temdash,\n\t\tmanifest,\n\t\tattachmentMap,\n\t\tconfig.locale,\n\t\tauthorDisplayNames,\n\t\ttaxonomyPlan,\n\t\ttranslationGroupMap,\n\t);\n\n\tconst nextOffset = offset + posts.length;\n\tconst done = nextOffset >= wxr.posts.length;\n\n\treturn {\n\t\tsuccess: result.errors.length === 0,\n\t\tresult,\n\t\tdone,\n\t\tcursor: { offset: nextOffset, source, taxonomiesReady: true },\n\t\tchunk: { translationGroups: Object.fromEntries(translationGroupMap) },\n\t};\n}\n\nasync function prepareTaxonomies(\n\twxr: Awaited<ReturnType<typeof parseWxrString>>,\n\temdash: EmDashHandlers,\n\tlocale: string | undefined,\n): Promise<TaxonomyImportPlan> {\n\tconst taxonomyPlan = await preImportWxrTaxonomies(\n\t\temdash.db,\n\t\twxr.posts,\n\t\twxr.categories,\n\t\twxr.tags,\n\t\twxr.terms,\n\t\tlocale,\n\t);\n\tconst postLocales = new Set<string>();\n\tfor (const post of wxr.posts) {\n\t\tif (post.locale) postLocales.add(post.locale);\n\t}\n\tif (postLocales.size > 0) {\n\t\tawait mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, locale);\n\t}\n\treturn taxonomyPlan;\n}\n\nexport async function importContent(\n\tposts: WxrPost[],\n\tconfig: ImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\tattachmentMap: Map<string, string>,\n\tlocale: string | undefined,\n\tauthorDisplayNames: Map<string, string> | undefined,\n\ttaxonomyPlan: TaxonomyImportPlan,\n\ttranslationGroupMap = new Map<string, string>(),\n): Promise<ImportResult> {\n\tconst result: ImportResult = {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t\ttaxonomies: {\n\t\t\ttermsCreated: taxonomyPlan.termsCreated,\n\t\t\ttermsReused: taxonomyPlan.termsReused,\n\t\t\tassignments: 0,\n\t\t\tmissingTaxonomies: taxonomyPlan.missingTaxonomies,\n\t\t},\n\t};\n\n\t// Create content repository for checking existing items\n\tconst contentRepo = new ContentRepository(emdash.db);\n\tconst bylineRepo = new BylineRepository(emdash.db);\n\tconst bylineCache = new Map<string, string>();\n\n\tfor (const post of posts) {\n\t\tconst postType = post.postType || \"post\";\n\t\tconst mapping = config.postTypeMappings[postType];\n\n\t\t// Skip if not mapped or disabled\n\t\tif (!mapping || !mapping.enabled) {\n\t\t\tresult.skipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Defensive: mapping.collection is already sanitized by prepare, but the user\n\t\t// could manually edit the import config between prepare and execute.\n\t\tconst collection = sanitizeSlug(mapping.collection);\n\n\t\t// Check if collection exists in manifest\n\t\tif (!manifest?.collections[collection]) {\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: `Collection \"${collection}\" does not exist`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert content to Portable Text\n\t\t\tconst content = post.content ? gutenbergToPortableText(post.content) : [];\n\n\t\t\t// Generate slug from post name or title\n\t\t\tconst slug = post.postName || slugify(post.title || `post-${post.id || Date.now()}`);\n\n\t\t\t// Per-post locale: prefer the value extracted from WPML/Polylang\n\t\t\t// metadata; fall back to the upload-wide locale. Two translations\n\t\t\t// sharing `post_name` (e.g. /en/hello + /ar/hello) collide on the\n\t\t\t// `UNIQUE(slug, locale)` constraint when they share a locale, so\n\t\t\t// honouring the per-post value is what makes multilingual imports\n\t\t\t// land correctly. See issue #1080.\n\t\t\tconst postLocale = post.locale ?? locale;\n\n\t\t\t// Check if already exists (idempotency). Match against the\n\t\t\t// per-post locale so the same slug in different locales doesn't\n\t\t\t// false-positive as duplicate.\n\t\t\tif (config.skipExisting) {\n\t\t\t\tconst existing = await contentRepo.findBySlug(collection, slug, postLocale);\n\t\t\t\tif (existing) {\n\t\t\t\t\t// Record the translation group mapping so later\n\t\t\t\t\t// translations in this WXR can link to the existing\n\t\t\t\t\t// item. We deliberately trust the WXR's grouping over\n\t\t\t\t\t// the existing row's `translation_group`: a singleton\n\t\t\t\t\t// existing row gets folded into the WXR's group when\n\t\t\t\t\t// `handleContentCreate` resolves the new translation's\n\t\t\t\t\t// `translationOf`. Pre-existing translations that\n\t\t\t\t\t// already belong to a different group are left alone --\n\t\t\t\t\t// the user is responsible for reconciling those through\n\t\t\t\t\t// the admin if they don't match the WXR.\n\t\t\t\t\tif (post.translationGroup) {\n\t\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, existing.id);\n\t\t\t\t\t}\n\t\t\t\t\tresult.skipped++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve translation group: if this post belongs to a group and\n\t\t\t// we've already imported one of its translations, link to it.\n\t\t\tlet translationOf: string | undefined;\n\t\t\tif (post.translationGroup) {\n\t\t\t\ttranslationOf = translationGroupMap.get(post.translationGroup);\n\t\t\t}\n\n\t\t\t// Map WordPress status to EmDash status\n\t\t\tconst status = mapStatus(post.status);\n\n\t\t\t// Build data object with required fields\n\t\t\tconst data: Record<string, unknown> = {\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\tcontent,\n\t\t\t\texcerpt: post.excerpt || undefined,\n\t\t\t};\n\n\t\t\t// Only add featured_image if the collection has this field and we have a value\n\t\t\tconst collectionSchema = manifest.collections[collection];\n\t\t\tconst hasFeaturedImageField = collectionSchema?.fields\n\t\t\t\t? \"featured_image\" in collectionSchema.fields\n\t\t\t\t: false;\n\t\t\tif (hasFeaturedImageField) {\n\t\t\t\tconst thumbnailId = post.meta.get(\"_thumbnail_id\");\n\t\t\t\tconst featuredImage = thumbnailId ? attachmentMap.get(String(thumbnailId)) : undefined;\n\t\t\t\tif (featuredImage) {\n\t\t\t\t\tdata.featured_image = featuredImage;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve author ID from mappings\n\t\t\tlet authorId: string | undefined;\n\t\t\tif (config.authorMappings && post.creator) {\n\t\t\t\tconst mappedUserId = config.authorMappings[post.creator];\n\t\t\t\tif (mappedUserId !== undefined && mappedUserId !== null) {\n\t\t\t\t\tauthorId = mappedUserId;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst bylineId = await resolveImportByline(\n\t\t\t\tpost.creator,\n\t\t\t\tauthorDisplayNames?.get(post.creator ?? \"\") ?? post.creator,\n\t\t\t\tauthorId,\n\t\t\t\tbylineRepo,\n\t\t\t\tbylineCache,\n\t\t\t);\n\n\t\t\t// Preserve original WordPress dates using the shared WXR date parser.\n\t\t\t// Fallback chain: postDateGmt (UTC) → pubDate (RFC 2822) → postDate (site-local).\n\t\t\tconst parsedDate = parseWxrDate(post.postDateGmt, post.pubDate, post.postDate);\n\t\t\tconst createdAt = parsedDate ? parsedDate.toISOString() : undefined;\n\t\t\tconst publishedAt = status === \"published\" && createdAt ? createdAt : undefined;\n\n\t\t\t// Create the content item\n\t\t\tconst createResult = await emdash.handleContentCreate(collection, {\n\t\t\t\tdata,\n\t\t\t\tslug,\n\t\t\t\tstatus,\n\t\t\t\tauthorId,\n\t\t\t\tbylines: bylineId ? [{ bylineId }] : undefined,\n\t\t\t\tlocale: postLocale,\n\t\t\t\ttranslationOf,\n\t\t\t\tcreatedAt,\n\t\t\t\tpublishedAt,\n\t\t\t});\n\n\t\t\tif (createResult.success) {\n\t\t\t\tresult.imported++;\n\t\t\t\tresult.byCollection[collection] = (result.byCollection[collection] || 0) + 1;\n\n\t\t\t\t// `handleContentCreate` returns `data: { item, _rev? }` on\n\t\t\t\t// success (see `ApiResult<ContentResponse>` in\n\t\t\t\t// `api/handlers/content.ts`). `HandlerResponse.data` is\n\t\t\t\t// typed as `unknown` to avoid coupling the route surface to\n\t\t\t\t// internal handler types, so we narrow here.\n\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- handler contract documented at handleContentCreate\n\t\t\t\tconst createdItem = (createResult.data as { item: { id: string } } | undefined)?.item;\n\n\t\t\t\t// Track translation group: the first imported post in a group\n\t\t\t\t// becomes the anchor that later translations link to.\n\t\t\t\tif (\n\t\t\t\t\tcreatedItem &&\n\t\t\t\t\tpost.translationGroup &&\n\t\t\t\t\t!translationGroupMap.has(post.translationGroup)\n\t\t\t\t) {\n\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, createdItem.id);\n\t\t\t\t}\n\n\t\t\t\t// Attach taxonomy assignments parsed from the WXR's per-item\n\t\t\t\t// <category> elements.\n\t\t\t\t//\n\t\t\t\t// Anchors (no `translationOf`) get an additive attach -- the\n\t\t\t\t// row is fresh, no inherited pivots to consider.\n\t\t\t\t//\n\t\t\t\t// Translations replace only taxonomies they explicitly carry.\n\t\t\t\t// Since assignments belong to the content translation_group,\n\t\t\t\t// that replacement is reflected in every sibling locale.\n\t\t\t\tif (createdItem) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst written = translationOf\n\t\t\t\t\t\t\t? await setPostTermAssignmentsReplacing(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: await attachPostTaxonomies(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\tif (result.taxonomies) {\n\t\t\t\t\t\t\tresult.taxonomies.assignments += written;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (taxError) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t`Failed to attach taxonomies for \"${post.title || \"Untitled\"}\":`,\n\t\t\t\t\t\t\ttaxError,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\ttaxError instanceof Error && taxError.message\n\t\t\t\t\t\t\t\t\t? `Imported but failed to attach taxonomies: ${taxError.message}`\n\t\t\t\t\t\t\t\t\t: \"Imported but failed to attach taxonomies\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.errors.push({\n\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\terror:\n\t\t\t\t\t\ttypeof createResult.error === \"object\" && createResult.error !== null\n\t\t\t\t\t\t\t? (createResult.error as { message?: string }).message || \"Unknown error\"\n\t\t\t\t\t\t\t: String(createResult.error),\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Import error for \"${post.title || \"Untitled\"}\":`, error);\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: error instanceof Error && error.message ? error.message : \"Failed to import item\",\n\t\t\t});\n\t\t}\n\t}\n\n\tresult.success = result.errors.length === 0;\n\treturn result;\n}\n\nfunction mapStatus(wpStatus: string | undefined): string {\n\tswitch (wpStatus) {\n\t\tcase \"publish\":\n\t\t\treturn \"published\";\n\t\tcase \"draft\":\n\t\t\treturn \"draft\";\n\t\tcase \"pending\":\n\t\t\treturn \"draft\";\n\t\tcase \"private\":\n\t\t\treturn \"draft\";\n\t\tdefault:\n\t\t\treturn \"draft\";\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"execute.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/execute.ts"],"sourcesContent":["/**\n * WordPress WXR execute import endpoint\n *\n * POST /_emdash/api/import/wordpress/execute\n *\n * Accepts WXR file and import configuration, imports content into the database.\n */\n\nimport { gutenbergToPortableText } from \"@emdash-cms/gutenberg-to-portable-text\";\nimport type { APIRoute } from \"astro\";\nimport {\n\tparseWxrString,\n\tContentRepository,\n\timportReusableBlocksAsSections,\n\ttype WxrPost,\n\tparseWxrDate,\n} from \"emdash\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { wxrChunkCursor, wxrChunkState, wxrImportConfig } from \"#api/schemas.js\";\nimport { BylineRepository } from \"#db/repositories/byline.js\";\nimport { relativizeContentLinks, resolveImportByline } from \"#import/utils.js\";\nimport {\n\tattachPostTaxonomies,\n\tisWxrTaxonomyConflictError,\n\tloadTaxonomyPlanFromDb,\n\tmirrorTermsToLocales,\n\tpreImportWxrTaxonomies,\n\tsetPostTermAssignmentsReplacing,\n\ttype TaxonomyImportPlan,\n} from \"#import/wxr-taxonomies.js\";\nimport type { EmDashHandlers, EmDashManifest } from \"#types\";\nimport { slugify } from \"#utils/slugify.js\";\n\nimport { sanitizeSlug } from \"./analyze.js\";\n\nexport const prerender = false;\n\n/** Posts processed per Worker invocation in chunked WXR imports. */\nconst WXR_CONTENT_CHUNK_SIZE = 30;\n\n/** Phase/cursor payload for chunked WXR imports. */\ninterface WxrChunkCursor {\n\toffset: number;\n\tsource: string;\n\ttaxonomiesReady: true;\n}\n\n/** Cross-chunk state carried by the client. */\ninterface WxrChunkState {\n\ttranslationGroups: Record<string, string>;\n}\n\n/** Chunked response shape mirrors the wordpress-plugin execute endpoint. */\ninterface WxrChunkResponse {\n\tsuccess: boolean;\n\tresult: ImportResult;\n\tdone: boolean;\n\tcursor?: WxrChunkCursor;\n\tchunk?: WxrChunkState;\n}\n\nexport interface ImportConfig {\n\t/** Map WordPress post types to EmDash collections */\n\tpostTypeMappings: Record<\n\t\tstring,\n\t\t{\n\t\t\tcollection: string;\n\t\t\tenabled: boolean;\n\t\t}\n\t>;\n\t/** Whether to skip items that already exist (by slug) */\n\tskipExisting: boolean;\n\t/** Whether to import reusable blocks (wp_block) as sections */\n\timportSections?: boolean;\n\t/** Author mappings (WP author login -> EmDash user ID) */\n\tauthorMappings?: Record<string, string | null>;\n\t/** BCP 47 locale for all imported items. When omitted, defaults to defaultLocale. */\n\tlocale?: string;\n}\n\nexport interface ImportResult {\n\tsuccess: boolean;\n\timported: number;\n\t/** Entries not imported because the slug already exists in the collection and locale. */\n\tskipped: number;\n\terrors: Array<{ title: string; error: string }>;\n\tbyCollection: Record<string, number>;\n\t/** Sections import results (if enabled) */\n\tsections?: {\n\t\tcreated: number;\n\t\tskipped: number;\n\t};\n\t/** Taxonomy import results (categories, tags, custom taxonomies). */\n\ttaxonomies?: {\n\t\t/** Terms newly created during this import, keyed by taxonomy name. */\n\t\ttermsCreated: Record<string, number>;\n\t\t/** Existing terms that were re-used, keyed by taxonomy name. */\n\t\ttermsReused: Record<string, number>;\n\t\t/** Total pivot rows (post <-> term) written to `content_taxonomies`. */\n\t\tassignments: number;\n\t\t/**\n\t\t * Custom taxonomy names from the WXR file that had no matching EmDash\n\t\t * definition and were therefore skipped. Lets the admin UI surface a\n\t\t * \"create taxonomy X first\" hint without re-running the import.\n\t\t */\n\t\tmissingTaxonomies: string[];\n\t};\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?.handleContentCreate) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\ttry {\n\t\tconst emdashManifest = await emdash.getManifest();\n\n\t\tconst formData = await request.formData();\n\t\tconst fileEntry = formData.get(\"file\");\n\t\tconst file = fileEntry instanceof File ? fileEntry : null;\n\t\tconst configEntry = formData.get(\"config\");\n\t\tconst configJson = typeof configEntry === \"string\" ? configEntry : null;\n\n\t\tif (!file) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No file provided\", 400);\n\t\t}\n\n\t\tif (!configJson) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No config provided\", 400);\n\t\t}\n\n\t\tconst parsedConfig = parseJsonField(configJson, \"config\");\n\t\tif (\"response\" in parsedConfig) return parsedConfig.response;\n\t\tconst configResult = wxrImportConfig.safeParse(parsedConfig.value);\n\t\tif (!configResult.success) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import config\", 400);\n\t\t}\n\t\tconst config: ImportConfig = configResult.data;\n\n\t\tconst phaseEntry = formData.get(\"phase\");\n\t\tif (\n\t\t\tphaseEntry !== null &&\n\t\t\tphaseEntry !== \"taxonomy\" &&\n\t\t\tphaseEntry !== \"content\" &&\n\t\t\tphaseEntry !== \"finalize\"\n\t\t) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import phase\", 400);\n\t\t}\n\t\tconst phase = phaseEntry;\n\n\t\tconst cursorEntry = formData.get(\"cursor\");\n\t\tlet cursor: WxrChunkCursor | undefined;\n\t\tif (typeof cursorEntry === \"string\" && cursorEntry.length > 0) {\n\t\t\tconst parsedCursor = parseJsonField(cursorEntry, \"cursor\");\n\t\t\tif (\"response\" in parsedCursor) return parsedCursor.response;\n\t\t\tconst cursorResult = wxrChunkCursor.safeParse(parsedCursor.value);\n\t\t\tif (!cursorResult.success) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import cursor\", 400);\n\t\t\t}\n\t\t\tcursor = cursorResult.data;\n\t\t}\n\n\t\tconst chunkEntry = formData.get(\"chunk\");\n\t\tlet incomingChunk: WxrChunkState | undefined;\n\t\tif (typeof chunkEntry === \"string\" && chunkEntry.length > 0) {\n\t\t\tconst parsedChunk = parseJsonField(chunkEntry, \"chunk\");\n\t\t\tif (\"response\" in parsedChunk) return parsedChunk.response;\n\t\t\tconst chunkResult = wxrChunkState.safeParse(parsedChunk.value);\n\t\t\tif (!chunkResult.success) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import chunk state\", 400);\n\t\t\t}\n\t\t\tincomingChunk = chunkResult.data;\n\t\t}\n\n\t\t// Parse WXR\n\t\tconst text = await file.text();\n\t\tconst wxr = await parseWxrString(text);\n\t\tconst source = await importFingerprint(text, configJson);\n\n\t\tif (cursor && cursor.source !== source) {\n\t\t\treturn apiError(\n\t\t\t\t\"WXR_IMPORT_SOURCE_CHANGED\",\n\t\t\t\t\"The WXR file or import configuration changed after this import started\",\n\t\t\t\t409,\n\t\t\t);\n\t\t}\n\n\t\t// Build attachment ID -> URL map for featured images\n\t\tconst attachmentMap = new Map<string, string>();\n\t\tfor (const att of wxr.attachments) {\n\t\t\tif (att.id && att.url) {\n\t\t\t\tattachmentMap.set(String(att.id), att.url);\n\t\t\t}\n\t\t}\n\n\t\t// Build author login -> display name map\n\t\tconst authorDisplayNames = new Map<string, string>();\n\t\tfor (const author of wxr.authors) {\n\t\t\tif (!author.login) continue;\n\t\t\tauthorDisplayNames.set(author.login, author.displayName || author.login);\n\t\t}\n\n\t\tif (phase === \"content\") {\n\t\t\tif (!cursor?.taxonomiesReady) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Taxonomy preparation is not complete\", 400);\n\t\t\t}\n\t\t\tconst chunkResponse = await runContentChunk(\n\t\t\t\twxr,\n\t\t\t\tconfig,\n\t\t\t\temdash,\n\t\t\t\temdashManifest,\n\t\t\t\tattachmentMap,\n\t\t\t\tauthorDisplayNames,\n\t\t\t\tcursor,\n\t\t\t\tincomingChunk,\n\t\t\t\tsource,\n\t\t\t);\n\t\t\tif (chunkResponse instanceof Response) return chunkResponse;\n\t\t\treturn apiSuccess(chunkResponse);\n\t\t}\n\n\t\tif (phase === \"taxonomy\") {\n\t\t\tif (cursor || incomingChunk) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Taxonomy preparation cannot be resumed\", 400);\n\t\t\t}\n\t\t\tlet taxonomyPlan: TaxonomyImportPlan;\n\t\t\ttry {\n\t\t\t\ttaxonomyPlan = await prepareTaxonomies(wxr, emdash, config.locale);\n\t\t\t} catch (error) {\n\t\t\t\tif (isWxrTaxonomyConflictError(error)) {\n\t\t\t\t\tconsole.error(\"[WXR_IMPORT_TAXONOMY_CONFLICT]\", error);\n\t\t\t\t\treturn apiError(\"WXR_IMPORT_TAXONOMY_CONFLICT\", error.publicMessage, 409);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst result = emptyImportResult();\n\t\t\tresult.taxonomies = {\n\t\t\t\ttermsCreated: taxonomyPlan.termsCreated,\n\t\t\t\ttermsReused: taxonomyPlan.termsReused,\n\t\t\t\tassignments: 0,\n\t\t\t\tmissingTaxonomies: taxonomyPlan.missingTaxonomies,\n\t\t\t};\n\t\t\treturn apiSuccess({\n\t\t\t\tsuccess: true,\n\t\t\t\tresult,\n\t\t\t\tdone: true,\n\t\t\t\tcursor: { offset: 0, source, taxonomiesReady: true as const },\n\t\t\t\tchunk: { translationGroups: {} },\n\t\t\t});\n\t\t}\n\n\t\tif (phase === \"finalize\") {\n\t\t\tif (!cursor || cursor.offset !== wxr.posts.length) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Content import is not complete\", 400);\n\t\t\t}\n\t\t\tconst result = emptyImportResult();\n\t\t\tif (config.importSections !== false) {\n\t\t\t\tconst sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);\n\t\t\t\tresult.sections = {\n\t\t\t\t\tcreated: sectionsResult.sectionsCreated,\n\t\t\t\t\tskipped: sectionsResult.sectionsSkipped,\n\t\t\t\t};\n\t\t\t\tresult.errors.push(...sectionsResult.errors);\n\t\t\t\tresult.success = result.errors.length === 0;\n\t\t\t}\n\t\t\treturn apiSuccess({ success: result.success, result, done: true });\n\t\t}\n\n\t\tif (wxr.posts.length > WXR_CONTENT_CHUNK_SIZE) {\n\t\t\treturn apiError(\n\t\t\t\t\"WXR_IMPORT_TOO_LARGE\",\n\t\t\t\t`This WXR contains ${wxr.posts.length} posts, which exceeds the ${WXR_CONTENT_CHUNK_SIZE}-post limit for a single import request. ` +\n\t\t\t\t\t`Run the import in chunked mode or split the file into smaller exports.`,\n\t\t\t\t413,\n\t\t\t);\n\t\t}\n\n\t\t// Pre-create taxonomy terms (categories, tags, custom taxonomies) so\n\t\t// per-post assignments can resolve to existing rows. Done before any\n\t\t// content insert because WXR exports list terms at the top of the\n\t\t// file but per-item assignments only reference them by slug.\n\t\tconst taxonomyPlan = await preImportWxrTaxonomies(\n\t\t\temdash.db,\n\t\t\twxr.posts,\n\t\t\twxr.categories,\n\t\t\twxr.tags,\n\t\t\twxr.terms,\n\t\t\tconfig.locale,\n\t\t);\n\n\t\t// Multilingual imports (WPML / Polylang -- see #1080) need a term\n\t\t// row at each per-post locale, all sharing the canonical term's\n\t\t// `translation_group`. Without this, `getTermsForEntry(..., locale)`\n\t\t// on non-canonical translations comes back empty.\n\t\t//\n\t\t// The mirror raises `WxrTaxonomyConflictError` with an operator-\n\t\t// actionable message when an existing locale row has an\n\t\t// incompatible group. Surface its `publicMessage` directly so the\n\t\t// admin UI can tell the user which (taxonomy, slug, locale) needs\n\t\t// reconciliation. Other errors (DB connectivity, unexpected\n\t\t// repository failures) re-throw to the outer catch where\n\t\t// `handleError` masks them with the generic \"Failed to import\n\t\t// content\" -- exposing raw DB errors to clients would leak schema\n\t\t// names and bypass the AGENTS.md \"never expose error.message\" rule.\n\t\tconst postLocales = new Set<string>();\n\t\tfor (const post of wxr.posts) {\n\t\t\tif (post.locale) postLocales.add(post.locale);\n\t\t}\n\t\tif (postLocales.size > 0) {\n\t\t\ttry {\n\t\t\t\tawait mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, config.locale);\n\t\t\t} catch (mirrorError) {\n\t\t\t\tif (isWxrTaxonomyConflictError(mirrorError)) {\n\t\t\t\t\tconsole.error(\"[WXR_IMPORT_TAXONOMY_CONFLICT]\", mirrorError);\n\t\t\t\t\treturn apiError(\"WXR_IMPORT_TAXONOMY_CONFLICT\", mirrorError.publicMessage, 409);\n\t\t\t\t}\n\t\t\t\tthrow mirrorError;\n\t\t\t}\n\t\t}\n\n\t\t// Import content (locale from config scopes all items)\n\t\tconst result = await importContent(\n\t\t\twxr.posts,\n\t\t\tconfig,\n\t\t\temdash,\n\t\t\temdashManifest,\n\t\t\tattachmentMap,\n\t\t\tconfig.locale,\n\t\t\tauthorDisplayNames,\n\t\t\ttaxonomyPlan,\n\t\t\tnew Map(),\n\t\t\twxr.site.link,\n\t\t);\n\n\t\t// Import reusable blocks as sections (if enabled)\n\t\tif (config.importSections !== false) {\n\t\t\tconst sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);\n\t\t\tresult.sections = {\n\t\t\t\tcreated: sectionsResult.sectionsCreated,\n\t\t\t\tskipped: sectionsResult.sectionsSkipped,\n\t\t\t};\n\t\t\t// Add section errors to main errors array\n\t\t\tresult.errors.push(...sectionsResult.errors);\n\t\t\tif (sectionsResult.errors.length > 0) {\n\t\t\t\tresult.success = false;\n\t\t\t}\n\t\t}\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import content\", \"WXR_IMPORT_ERROR\");\n\t}\n};\n\nfunction parseJsonField(\n\tvalue: string,\n\tfieldName: string,\n): { value: unknown } | { response: Response } {\n\ttry {\n\t\treturn { value: JSON.parse(value) };\n\t} catch {\n\t\treturn { response: apiError(\"VALIDATION_ERROR\", `Invalid JSON in ${fieldName}`, 400) };\n\t}\n}\n\nasync function importFingerprint(text: string, configJson: string): Promise<string> {\n\tconst bytes = new TextEncoder().encode(`${configJson}\\u0000${text}`);\n\tconst digest = await crypto.subtle.digest(\"SHA-256\", bytes);\n\treturn Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction emptyImportResult(): ImportResult {\n\treturn {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t};\n}\n\n/** Import a bounded WXR post chunk using taxonomy rows prepared in the prior phase. */\nasync function runContentChunk(\n\twxr: Awaited<ReturnType<typeof parseWxrString>>,\n\tconfig: ImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\tattachmentMap: Map<string, string>,\n\tauthorDisplayNames: Map<string, string>,\n\tcursor: WxrChunkCursor | undefined,\n\tincomingChunk: WxrChunkState | undefined,\n\tsource: string,\n): Promise<WxrChunkResponse | Response> {\n\tconst offset = cursor?.offset ?? 0;\n\tif (offset > wxr.posts.length || (offset > 0 && offset % WXR_CONTENT_CHUNK_SIZE !== 0)) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import cursor offset\", 400);\n\t}\n\tconst posts = wxr.posts.slice(offset, offset + WXR_CONTENT_CHUNK_SIZE);\n\tconst taxonomyPlan = await loadTaxonomyPlanFromDb(emdash.db);\n\n\t// Seed translation-group state from earlier chunks so a translation that\n\t// appears on chunk N can link to its sibling imported on chunk N-1.\n\tconst translationGroupMap = new Map<string, string>(\n\t\tObject.entries(incomingChunk?.translationGroups ?? {}),\n\t);\n\n\tconst result = await importContent(\n\t\tposts,\n\t\tconfig,\n\t\temdash,\n\t\tmanifest,\n\t\tattachmentMap,\n\t\tconfig.locale,\n\t\tauthorDisplayNames,\n\t\ttaxonomyPlan,\n\t\ttranslationGroupMap,\n\t\twxr.site.link,\n\t);\n\n\tconst nextOffset = offset + posts.length;\n\tconst done = nextOffset >= wxr.posts.length;\n\n\treturn {\n\t\tsuccess: result.errors.length === 0,\n\t\tresult,\n\t\tdone,\n\t\tcursor: { offset: nextOffset, source, taxonomiesReady: true },\n\t\tchunk: { translationGroups: Object.fromEntries(translationGroupMap) },\n\t};\n}\n\nasync function prepareTaxonomies(\n\twxr: Awaited<ReturnType<typeof parseWxrString>>,\n\temdash: EmDashHandlers,\n\tlocale: string | undefined,\n): Promise<TaxonomyImportPlan> {\n\tconst taxonomyPlan = await preImportWxrTaxonomies(\n\t\temdash.db,\n\t\twxr.posts,\n\t\twxr.categories,\n\t\twxr.tags,\n\t\twxr.terms,\n\t\tlocale,\n\t);\n\tconst postLocales = new Set<string>();\n\tfor (const post of wxr.posts) {\n\t\tif (post.locale) postLocales.add(post.locale);\n\t}\n\tif (postLocales.size > 0) {\n\t\tawait mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, locale);\n\t}\n\treturn taxonomyPlan;\n}\n\nexport async function importContent(\n\tposts: WxrPost[],\n\tconfig: ImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\tattachmentMap: Map<string, string>,\n\tlocale: string | undefined,\n\tauthorDisplayNames: Map<string, string> | undefined,\n\ttaxonomyPlan: TaxonomyImportPlan,\n\ttranslationGroupMap = new Map<string, string>(),\n\tsiteUrl = \"\",\n): Promise<ImportResult> {\n\tconst result: ImportResult = {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t\ttaxonomies: {\n\t\t\ttermsCreated: taxonomyPlan.termsCreated,\n\t\t\ttermsReused: taxonomyPlan.termsReused,\n\t\t\tassignments: 0,\n\t\t\tmissingTaxonomies: taxonomyPlan.missingTaxonomies,\n\t\t},\n\t};\n\n\t// Create content repository for checking existing items\n\tconst contentRepo = new ContentRepository(emdash.db);\n\tconst bylineRepo = new BylineRepository(emdash.db);\n\tconst bylineCache = new Map<string, string>();\n\n\tfor (const post of posts) {\n\t\tconst postType = post.postType || \"post\";\n\t\tconst mapping = config.postTypeMappings[postType];\n\n\t\t// Not part of the import: internal post types, or ones left disabled.\n\t\tif (!mapping || !mapping.enabled) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Defensive: mapping.collection is already sanitized by prepare, but the user\n\t\t// could manually edit the import config between prepare and execute.\n\t\tconst collection = sanitizeSlug(mapping.collection);\n\n\t\t// Check if collection exists in manifest\n\t\tif (!manifest?.collections[collection]) {\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: `Collection \"${collection}\" does not exist`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert content to Portable Text\n\t\t\tconst content = post.content ? gutenbergToPortableText(post.content) : [];\n\t\t\tif (siteUrl) relativizeContentLinks(content, siteUrl);\n\n\t\t\t// Generate slug from post name or title\n\t\t\tconst slug = post.postName || slugify(post.title || `post-${post.id || Date.now()}`);\n\n\t\t\t// Per-post locale: prefer the value extracted from WPML/Polylang\n\t\t\t// metadata; fall back to the upload-wide locale. Two translations\n\t\t\t// sharing `post_name` (e.g. /en/hello + /ar/hello) collide on the\n\t\t\t// `UNIQUE(slug, locale)` constraint when they share a locale, so\n\t\t\t// honouring the per-post value is what makes multilingual imports\n\t\t\t// land correctly. See issue #1080.\n\t\t\tconst postLocale = post.locale ?? locale;\n\n\t\t\t// Check if already exists (idempotency). Match against the\n\t\t\t// per-post locale so the same slug in different locales doesn't\n\t\t\t// false-positive as duplicate.\n\t\t\tif (config.skipExisting) {\n\t\t\t\tconst existing = await contentRepo.findBySlug(collection, slug, postLocale);\n\t\t\t\tif (existing) {\n\t\t\t\t\t// Record the translation group mapping so later\n\t\t\t\t\t// translations in this WXR can link to the existing\n\t\t\t\t\t// item. We deliberately trust the WXR's grouping over\n\t\t\t\t\t// the existing row's `translation_group`: a singleton\n\t\t\t\t\t// existing row gets folded into the WXR's group when\n\t\t\t\t\t// `handleContentCreate` resolves the new translation's\n\t\t\t\t\t// `translationOf`. Pre-existing translations that\n\t\t\t\t\t// already belong to a different group are left alone --\n\t\t\t\t\t// the user is responsible for reconciling those through\n\t\t\t\t\t// the admin if they don't match the WXR.\n\t\t\t\t\tif (post.translationGroup) {\n\t\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, existing.id);\n\t\t\t\t\t}\n\t\t\t\t\tresult.skipped++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve translation group: if this post belongs to a group and\n\t\t\t// we've already imported one of its translations, link to it.\n\t\t\tlet translationOf: string | undefined;\n\t\t\tif (post.translationGroup) {\n\t\t\t\ttranslationOf = translationGroupMap.get(post.translationGroup);\n\t\t\t}\n\n\t\t\t// Map WordPress status to EmDash status\n\t\t\tconst status = mapStatus(post.status);\n\n\t\t\t// Build data object with required fields\n\t\t\tconst data: Record<string, unknown> = {\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\tcontent,\n\t\t\t\texcerpt: post.excerpt || undefined,\n\t\t\t};\n\n\t\t\t// Only add featured_image if the collection has this field and we have a value\n\t\t\tconst collectionSchema = manifest.collections[collection];\n\t\t\tconst hasFeaturedImageField = collectionSchema?.fields\n\t\t\t\t? \"featured_image\" in collectionSchema.fields\n\t\t\t\t: false;\n\t\t\tif (hasFeaturedImageField) {\n\t\t\t\tconst thumbnailId = post.meta.get(\"_thumbnail_id\");\n\t\t\t\tconst featuredImage = thumbnailId ? attachmentMap.get(String(thumbnailId)) : undefined;\n\t\t\t\tif (featuredImage) {\n\t\t\t\t\tdata.featured_image = featuredImage;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve author ID from mappings\n\t\t\tlet authorId: string | undefined;\n\t\t\tif (config.authorMappings && post.creator) {\n\t\t\t\tconst mappedUserId = config.authorMappings[post.creator];\n\t\t\t\tif (mappedUserId !== undefined && mappedUserId !== null) {\n\t\t\t\t\tauthorId = mappedUserId;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst bylineId = await resolveImportByline(\n\t\t\t\tpost.creator,\n\t\t\t\tauthorDisplayNames?.get(post.creator ?? \"\") ?? post.creator,\n\t\t\t\tauthorId,\n\t\t\t\tbylineRepo,\n\t\t\t\tbylineCache,\n\t\t\t);\n\n\t\t\t// Preserve original WordPress dates using the shared WXR date parser.\n\t\t\t// Fallback chain: postDateGmt (UTC) → pubDate (RFC 2822) → postDate (site-local).\n\t\t\tconst parsedDate = parseWxrDate(post.postDateGmt, post.pubDate, post.postDate);\n\t\t\tconst createdAt = parsedDate ? parsedDate.toISOString() : undefined;\n\t\t\tconst publishedAt = status === \"published\" && createdAt ? createdAt : undefined;\n\n\t\t\t// Create the content item\n\t\t\tconst createResult = await emdash.handleContentCreate(collection, {\n\t\t\t\tdata,\n\t\t\t\tslug,\n\t\t\t\tstatus,\n\t\t\t\tauthorId,\n\t\t\t\tbylines: bylineId ? [{ bylineId }] : undefined,\n\t\t\t\tlocale: postLocale,\n\t\t\t\ttranslationOf,\n\t\t\t\tcreatedAt,\n\t\t\t\tpublishedAt,\n\t\t\t});\n\n\t\t\tif (createResult.success) {\n\t\t\t\tresult.imported++;\n\t\t\t\tresult.byCollection[collection] = (result.byCollection[collection] || 0) + 1;\n\n\t\t\t\t// `handleContentCreate` returns `data: { item, _rev? }` on\n\t\t\t\t// success (see `ApiResult<ContentResponse>` in\n\t\t\t\t// `api/handlers/content.ts`). `HandlerResponse.data` is\n\t\t\t\t// typed as `unknown` to avoid coupling the route surface to\n\t\t\t\t// internal handler types, so we narrow here.\n\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- handler contract documented at handleContentCreate\n\t\t\t\tconst createdItem = (createResult.data as { item: { id: string } } | undefined)?.item;\n\n\t\t\t\t// Track translation group: the first imported post in a group\n\t\t\t\t// becomes the anchor that later translations link to.\n\t\t\t\tif (\n\t\t\t\t\tcreatedItem &&\n\t\t\t\t\tpost.translationGroup &&\n\t\t\t\t\t!translationGroupMap.has(post.translationGroup)\n\t\t\t\t) {\n\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, createdItem.id);\n\t\t\t\t}\n\n\t\t\t\t// Attach taxonomy assignments parsed from the WXR's per-item\n\t\t\t\t// <category> elements.\n\t\t\t\t//\n\t\t\t\t// Anchors (no `translationOf`) get an additive attach -- the\n\t\t\t\t// row is fresh, no inherited pivots to consider.\n\t\t\t\t//\n\t\t\t\t// Translations replace only taxonomies they explicitly carry.\n\t\t\t\t// Since assignments belong to the content translation_group,\n\t\t\t\t// that replacement is reflected in every sibling locale.\n\t\t\t\tif (createdItem) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst written = translationOf\n\t\t\t\t\t\t\t? await setPostTermAssignmentsReplacing(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: await attachPostTaxonomies(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\tif (result.taxonomies) {\n\t\t\t\t\t\t\tresult.taxonomies.assignments += written;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (taxError) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t`Failed to attach taxonomies for \"${post.title || \"Untitled\"}\":`,\n\t\t\t\t\t\t\ttaxError,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\ttaxError instanceof Error && taxError.message\n\t\t\t\t\t\t\t\t\t? `Imported but failed to attach taxonomies: ${taxError.message}`\n\t\t\t\t\t\t\t\t\t: \"Imported but failed to attach taxonomies\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tcreatedItem &&\n\t\t\t\t\tpost.status === \"future\" &&\n\t\t\t\t\tcreatedAt &&\n\t\t\t\t\tDate.parse(createdAt) > Date.now()\n\t\t\t\t) {\n\t\t\t\t\tconst scheduled = await emdash.handleContentSchedule(\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\tcreatedAt,\n\t\t\t\t\t);\n\t\t\t\t\tif (!scheduled.success) {\n\t\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\t\t\terror: `Imported as draft but failed to schedule: ${scheduled.error?.message ?? \"Unknown error\"}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.errors.push({\n\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\terror:\n\t\t\t\t\t\ttypeof createResult.error === \"object\" && createResult.error !== null\n\t\t\t\t\t\t\t? (createResult.error as { message?: string }).message || \"Unknown error\"\n\t\t\t\t\t\t\t: String(createResult.error),\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Import error for \"${post.title || \"Untitled\"}\":`, error);\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: error instanceof Error && error.message ? error.message : \"Failed to import item\",\n\t\t\t});\n\t\t}\n\t}\n\n\tresult.success = result.errors.length === 0;\n\treturn result;\n}\n\nfunction mapStatus(wpStatus: string | undefined): string {\n\tswitch (wpStatus) {\n\t\tcase \"publish\":\n\t\t\treturn \"published\";\n\t\tcase \"draft\":\n\t\t\treturn \"draft\";\n\t\tcase \"pending\":\n\t\t\treturn \"draft\";\n\t\tcase \"private\":\n\t\t\treturn \"draft\";\n\t\tdefault:\n\t\t\treturn \"draft\";\n\t}\n}\n"],"mappings":"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"}
|