emdash 0.26.0 → 0.28.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/{adapters-DAAjOID4.d.mts → adapters-hUy8vOB-.d.mts} +1 -1
- package/dist/{adapters-DAAjOID4.d.mts.map → adapters-hUy8vOB-.d.mts.map} +1 -1
- package/dist/{allowed-origins-D5FxMUo8.mjs → allowed-origins-CRsJ6BPM.mjs} +2 -2
- package/dist/{allowed-origins-D5FxMUo8.mjs.map → allowed-origins-CRsJ6BPM.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +17 -16
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +1 -1
- package/dist/api/schemas/index.mjs +3 -3
- package/dist/{api-BMfveMoB.mjs → api-BFURZn1i.mjs} +104 -38
- package/dist/api-BFURZn1i.mjs.map +1 -0
- package/dist/{api-tokens-D6ppjIVi.mjs → api-tokens-DvqeZmVq.mjs} +2 -2
- package/dist/{api-tokens-D6ppjIVi.mjs.map → api-tokens-DvqeZmVq.mjs.map} +1 -1
- package/dist/{apply--IVNSdXn.mjs → apply-Bu-8nYHL.mjs} +113 -76
- package/dist/apply-Bu-8nYHL.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -11
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +13 -5
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -9
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +52 -12
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.mjs +5 -5
- package/dist/astro/middleware/request-context.mjs +2 -2
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +2 -9
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +125 -71
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -8
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/index.mjs +14 -14
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +38 -37
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +38 -37
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +37 -36
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +36 -35
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +36 -35
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +37 -36
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +36 -35
- 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 +36 -35
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +36 -35
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +36 -35
- 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 +37 -36
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +36 -35
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +37 -36
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +36 -35
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +36 -35
- 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 +3 -3
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +36 -35
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
- package/dist/astro/routes/api/auth/invite/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
- package/dist/astro/routes/api/auth/logout.mjs +3 -3
- package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/options.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +7 -7
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +7 -7
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +7 -7
- package/dist/astro/routes/api/content/_collection_/authors.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/index.mjs +7 -7
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +8 -8
- package/dist/astro/routes/api/dev/emails.mjs +3 -3
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +19 -11
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -40
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +12 -407
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -9
- package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +19 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +97 -79
- 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 +19 -11
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +40 -2
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +519 -39
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.d.mts.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +14 -5
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +39 -39
- package/dist/astro/routes/api/media/_id_/confirm.mjs +7 -7
- package/dist/astro/routes/api/media/_id_.mjs +7 -7
- package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
- package/dist/astro/routes/api/media/providers/index.mjs +3 -3
- package/dist/astro/routes/api/media/upload-url.mjs +8 -8
- package/dist/astro/routes/api/media.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/items.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_/translations.mjs +9 -9
- package/dist/astro/routes/api/menus/_name_.mjs +9 -9
- package/dist/astro/routes/api/menus/index.mjs +9 -9
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
- package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
- package/dist/astro/routes/api/oauth/register.mjs +3 -3
- package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
- package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
- package/dist/astro/routes/api/oauth/token.mjs +6 -6
- package/dist/astro/routes/api/openapi.json.mjs +4 -4
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +9 -9
- package/dist/astro/routes/api/redirects/404s/summary.mjs +9 -9
- package/dist/astro/routes/api/redirects/_id_.mjs +10 -10
- package/dist/astro/routes/api/redirects/index.mjs +10 -10
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +36 -35
- 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 +36 -35
- 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 +36 -35
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +36 -35
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +36 -35
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +7 -6
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +36 -35
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +36 -35
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +10 -10
- package/dist/astro/routes/api/search/index.mjs +9 -9
- package/dist/astro/routes/api/search/rebuild.mjs +10 -10
- package/dist/astro/routes/api/search/stats.mjs +6 -6
- package/dist/astro/routes/api/search/suggest.mjs +9 -9
- package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
- package/dist/astro/routes/api/sections/index.mjs +9 -9
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +12 -12
- package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
- package/dist/astro/routes/api/setup/admin.mjs +10 -10
- package/dist/astro/routes/api/setup/dev-bypass.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +28 -25
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +26 -25
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +4 -4
- package/dist/astro/routes/api/snapshot.mjs +6 -6
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/index.mjs +13 -13
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +5 -5
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
- package/dist/astro/routes/api/widget-areas/index.mjs +9 -9
- package/dist/astro/routes/api/widget-components.mjs +3 -3
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +14 -12
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-BZnOGJFo.mjs → authorize-Dz88F_Fw.mjs} +2 -2
- package/dist/{authorize-BZnOGJFo.mjs.map → authorize-Dz88F_Fw.mjs.map} +1 -1
- package/dist/{byline-LL8lyqdb.mjs → byline-Bm8ZgUP9.mjs} +6 -6
- package/dist/{byline-LL8lyqdb.mjs.map → byline-Bm8ZgUP9.mjs.map} +1 -1
- package/dist/{byline-fields-eyJMblSr.mjs → byline-fields-2Lp5Hbgf.mjs} +18 -3
- package/dist/byline-fields-2Lp5Hbgf.mjs.map +1 -0
- package/dist/{byline-fields-DaMKzkhO.mjs → byline-fields-CIx_GuN4.mjs} +1 -1
- package/dist/{byline-fields-DaMKzkhO.mjs.map → byline-fields-CIx_GuN4.mjs.map} +1 -1
- package/dist/{byline-fields-KD3JFRuH.d.mts → byline-fields-Cgrt9-aL.d.mts} +18 -3
- package/dist/{byline-fields-KD3JFRuH.d.mts.map → byline-fields-Cgrt9-aL.d.mts.map} +1 -1
- package/dist/{bylines-BmJ7Vg7J.mjs → bylines-6tm9mgQb.mjs} +4 -4
- package/dist/{bylines-BmJ7Vg7J.mjs.map → bylines-6tm9mgQb.mjs.map} +1 -1
- package/dist/{bylines-DE47vP8d.mjs → bylines-Woq87129.mjs} +6 -6
- package/dist/{bylines-DE47vP8d.mjs.map → bylines-Woq87129.mjs.map} +1 -1
- package/dist/{cache-D9jF5bYw.mjs → cache-CEBAZjir.mjs} +2 -2
- package/dist/{cache-D9jF5bYw.mjs.map → cache-CEBAZjir.mjs.map} +1 -1
- package/dist/{challenge-store-LhiqMccz.mjs → challenge-store-anhwVER0.mjs} +1 -1
- package/dist/{challenge-store-LhiqMccz.mjs.map → challenge-store-anhwVER0.mjs.map} +1 -1
- package/dist/{chunks-OCG163rN.mjs → chunks-B2isWQhr.mjs} +2 -2
- package/dist/{chunks-OCG163rN.mjs.map → chunks-B2isWQhr.mjs.map} +1 -1
- package/dist/cli/index.mjs +23 -22
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +2 -2
- package/dist/{comment-D9BLDpZI.mjs → comment-CzeatwBV.mjs} +3 -3
- package/dist/{comment-D9BLDpZI.mjs.map → comment-CzeatwBV.mjs.map} +1 -1
- package/dist/{comment-reaction-Drl9SkNu.mjs → comment-reaction-Cj9QJY7I.mjs} +2 -2
- package/dist/{comment-reaction-Drl9SkNu.mjs.map → comment-reaction-Cj9QJY7I.mjs.map} +1 -1
- package/dist/{comments-BjJ9SKGU.mjs → comments-BLE-jv5k.mjs} +3 -3
- package/dist/{comments-BjJ9SKGU.mjs.map → comments-BLE-jv5k.mjs.map} +1 -1
- package/dist/{components-CYt4uVK9.mjs → components-B_sATNUc.mjs} +1 -1
- package/dist/{components-CYt4uVK9.mjs.map → components-B_sATNUc.mjs.map} +1 -1
- package/dist/{content-ncUWWjna.mjs → content-DhgEth4k.mjs} +4 -4
- package/dist/{content-ncUWWjna.mjs.map → content-DhgEth4k.mjs.map} +1 -1
- package/dist/content-refresh-CA4uKwzH.mjs +1531 -0
- package/dist/content-refresh-CA4uKwzH.mjs.map +1 -0
- package/dist/{context-C_g-iJVA.mjs → context-CUsR9dXL.mjs} +76 -54
- package/dist/context-CUsR9dXL.mjs.map +1 -0
- package/dist/{cron-C5LVoNmP.mjs → cron-v4FTEFR_.mjs} +1 -1
- package/dist/{cron-C5LVoNmP.mjs.map → cron-v4FTEFR_.mjs.map} +1 -1
- package/dist/{dashboard-CotyqQrW.mjs → dashboard-EvEKF5en.mjs} +4 -4
- package/dist/{dashboard-CotyqQrW.mjs.map → dashboard-EvEKF5en.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{default-CeRG-Ot4.mjs → default-CM_D83Mg.mjs} +1 -1
- package/dist/{default-CeRG-Ot4.mjs.map → default-CM_D83Mg.mjs.map} +1 -1
- package/dist/{device-flow-DENDCQ9F.mjs → device-flow-CfGP18Uw.mjs} +4 -4
- package/dist/{device-flow-DENDCQ9F.mjs.map → device-flow-CfGP18Uw.mjs.map} +1 -1
- package/dist/{email-console-DJP32ucW.mjs → email-console-CIf4Lfvv.mjs} +1 -1
- package/dist/{email-console-DJP32ucW.mjs.map → email-console-CIf4Lfvv.mjs.map} +1 -1
- package/dist/{error-rVGiqWDt.mjs → error-CkAseSqZ.mjs} +2 -2
- package/dist/{error-rVGiqWDt.mjs.map → error-CkAseSqZ.mjs.map} +1 -1
- package/dist/{escape-Bjio4ZsM.mjs → escape-DqD0aCKu.mjs} +1 -1
- package/dist/{escape-Bjio4ZsM.mjs.map → escape-DqD0aCKu.mjs.map} +1 -1
- package/dist/{field-defs-cache-ljXzJCfc.mjs → field-defs-cache-WUI88LX5.mjs} +2 -2
- package/dist/{field-defs-cache-ljXzJCfc.mjs.map → field-defs-cache-WUI88LX5.mjs.map} +1 -1
- package/dist/{fts-manager-BbCCbEKA.mjs → fts-manager-BbFaF_V8.mjs} +2 -2
- package/dist/{fts-manager-BbCCbEKA.mjs.map → fts-manager-BbFaF_V8.mjs.map} +1 -1
- package/dist/{import-Bb1T9WJS.mjs → import-fYLf14Co.mjs} +514 -25
- package/dist/import-fYLf14Co.mjs.map +1 -0
- package/dist/{index-BRNabKrx.d.mts → index-B9sIxwe4.d.mts} +2420 -2379
- package/dist/index-B9sIxwe4.d.mts.map +1 -0
- package/dist/{index-Dt0OKJB4.d.mts → index-Bm-Gy8Mh.d.mts} +25 -4
- package/dist/index-Bm-Gy8Mh.d.mts.map +1 -0
- package/dist/index.d.mts +18 -17
- package/dist/index.mjs +54 -53
- package/dist/{load-DMjXghbZ.mjs → load-Djn3HWQS.mjs} +2 -2
- package/dist/{load-DMjXghbZ.mjs.map → load-Djn3HWQS.mjs.map} +1 -1
- package/dist/{loader-BA_zhkS_.mjs → loader-CB6YHeul.mjs} +6 -5
- package/dist/loader-CB6YHeul.mjs.map +1 -0
- package/dist/{manifest-schema-kPGX7VS-.mjs → manifest-schema-BHlgZM1W.mjs} +1 -1
- package/dist/{manifest-schema-kPGX7VS-.mjs.map → manifest-schema-BHlgZM1W.mjs.map} +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +12 -11
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +5 -5
- package/dist/{media-C5t_eCnk.mjs → media-BrXIaMFN.mjs} +2 -2
- package/dist/{media-C5t_eCnk.mjs.map → media-BrXIaMFN.mjs.map} +1 -1
- package/dist/{media-allowlist-Du8t1u6a.mjs → media-allowlist-CRHEeJ_i.mjs} +1 -1
- package/dist/{media-allowlist-Du8t1u6a.mjs.map → media-allowlist-CRHEeJ_i.mjs.map} +1 -1
- package/dist/{media-url-O4rm9-SQ.mjs → media-url-CKi5XSw4.mjs} +1 -1
- package/dist/{media-url-O4rm9-SQ.mjs.map → media-url-CKi5XSw4.mjs.map} +1 -1
- package/dist/{menus-CBb6UrMU.mjs → menus-Cfivc2Ad.mjs} +3 -3
- package/dist/{menus-CBb6UrMU.mjs.map → menus-Cfivc2Ad.mjs.map} +1 -1
- package/dist/{menus-CYH09a41.mjs → menus-CsZ2ZEK2.mjs} +16 -12
- package/dist/{menus-CYH09a41.mjs.map → menus-CsZ2ZEK2.mjs.map} +1 -1
- package/dist/{mode-BB0F8xTC.mjs → mode-BM9QgEmt.mjs} +1 -1
- package/dist/{mode-BB0F8xTC.mjs.map → mode-BM9QgEmt.mjs.map} +1 -1
- package/dist/{oauth-authorization-CsvzIp_F.mjs → oauth-authorization-CXWkIGT4.mjs} +4 -4
- package/dist/{oauth-authorization-CsvzIp_F.mjs.map → oauth-authorization-CXWkIGT4.mjs.map} +1 -1
- package/dist/{oauth-clients-C9SYwEbZ.mjs → oauth-clients-BmTI5rsl.mjs} +1 -1
- package/dist/{oauth-clients-C9SYwEbZ.mjs.map → oauth-clients-BmTI5rsl.mjs.map} +1 -1
- package/dist/{oauth-state-store---zrApfB.mjs → oauth-state-store-YLFLcH5F.mjs} +1 -1
- package/dist/{oauth-state-store---zrApfB.mjs.map → oauth-state-store-YLFLcH5F.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-SHsWRlG9.mjs → oauth-user-lookup-Bsc_GsX-.mjs} +1 -1
- package/dist/{oauth-user-lookup-SHsWRlG9.mjs.map → oauth-user-lookup-Bsc_GsX-.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-CHbHv83-.mjs → object-cache-Bok5j2ae.mjs} +43 -3
- package/dist/object-cache-Bok5j2ae.mjs.map +1 -0
- package/dist/{options-41nCWqi9.d.mts → options-iMpRRxIe.d.mts} +3 -3
- package/dist/{options-41nCWqi9.d.mts.map → options-iMpRRxIe.d.mts.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BwAdS7FZ.mjs → parse-GmjecGct.mjs} +2 -2
- package/dist/{parse-BwAdS7FZ.mjs.map → parse-GmjecGct.mjs.map} +1 -1
- package/dist/{passkey-config-C0YfSBko.mjs → passkey-config-De0ahnRg.mjs} +1 -1
- package/dist/{passkey-config-C0YfSBko.mjs.map → passkey-config-De0ahnRg.mjs.map} +1 -1
- package/dist/{placeholder-Cuce9U-m.d.mts → placeholder-BSKwzRe4.d.mts} +1 -1
- package/dist/{placeholder-Cuce9U-m.d.mts.map → placeholder-BSKwzRe4.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +1 -1
- package/dist/plugin-utils.d.mts +10 -9
- package/dist/plugin-utils.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{portable-text-BICg8bTk.mjs → portable-text-cCa0cGV6.mjs} +1 -1
- package/dist/{portable-text-BICg8bTk.mjs.map → portable-text-cCa0cGV6.mjs.map} +1 -1
- package/dist/{preview-DKGCt2_p.mjs → preview-SSXNVPAC.mjs} +2 -2
- package/dist/{preview-DKGCt2_p.mjs.map → preview-SSXNVPAC.mjs.map} +1 -1
- package/dist/{public-url-CTVqgMmg.mjs → public-url-Danv47cS.mjs} +1 -1
- package/dist/{public-url-CTVqgMmg.mjs.map → public-url-Danv47cS.mjs.map} +1 -1
- package/dist/{query-BpQb-blG.mjs → query-ByGq6ver.mjs} +14 -14
- package/dist/{query-BpQb-blG.mjs.map → query-ByGq6ver.mjs.map} +1 -1
- package/dist/{rate-limit-Dap6HMNM.mjs → rate-limit-C_Lf63Dd.mjs} +2 -2
- package/dist/{rate-limit-Dap6HMNM.mjs.map → rate-limit-C_Lf63Dd.mjs.map} +1 -1
- package/dist/{redirect-CS-PHtNh.mjs → redirect-CoW3G-0U.mjs} +1 -1
- package/dist/{redirect-CS-PHtNh.mjs.map → redirect-CoW3G-0U.mjs.map} +1 -1
- package/dist/{redirect-_M0trWoo.mjs → redirect-IyfNirgS.mjs} +2 -2
- package/dist/{redirect-_M0trWoo.mjs.map → redirect-IyfNirgS.mjs.map} +1 -1
- package/dist/{redirects-w0V9vj_j.mjs → redirects-Bs1g42Ri.mjs} +4 -4
- package/dist/{redirects-w0V9vj_j.mjs.map → redirects-Bs1g42Ri.mjs.map} +1 -1
- package/dist/{redirects-Dcbuisoj.mjs → redirects-DXEXBAII.mjs} +2 -2
- package/dist/{redirects-Dcbuisoj.mjs.map → redirects-DXEXBAII.mjs.map} +1 -1
- package/dist/{registry-g8yYt4cC.mjs → registry-B65mUtPa.mjs} +122 -79
- package/dist/registry-B65mUtPa.mjs.map +1 -0
- package/dist/{request-meta-CmS1tDFf.mjs → request-meta-DbvXaAvU.mjs} +2 -2
- package/dist/{request-meta-CmS1tDFf.mjs.map → request-meta-DbvXaAvU.mjs.map} +1 -1
- package/dist/{resolve-C7I0qiR0.mjs → resolve-DR3wqMTy.mjs} +1 -1
- package/dist/{resolve-C7I0qiR0.mjs.map → resolve-DR3wqMTy.mjs.map} +1 -1
- package/dist/{runner-BbR3DfrL.d.mts → runner-DvFWoz8-.d.mts} +2 -2
- package/dist/{runner-BbR3DfrL.d.mts.map → runner-DvFWoz8-.d.mts.map} +1 -1
- package/dist/{runner-DPdt_Wpa.mjs → runner-K8XK101B.mjs} +351 -199
- package/dist/runner-K8XK101B.mjs.map +1 -0
- package/dist/runtime.d.mts +11 -10
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +2 -2
- package/dist/scheduled-publish-Drffrf2a.d.mts +11 -0
- package/dist/scheduled-publish-Drffrf2a.d.mts.map +1 -0
- package/dist/{schema-DoLd3j2e.mjs → schema-Blhoxp3P.mjs} +5 -5
- package/dist/{schema-DoLd3j2e.mjs.map → schema-Blhoxp3P.mjs.map} +1 -1
- package/dist/{search-BR0ZeZmh.mjs → search-DZN2HZ-V.mjs} +6 -4
- package/dist/search-DZN2HZ-V.mjs.map +1 -0
- package/dist/{secrets-BSf9pRRY.mjs → secrets-kp760LlD.mjs} +2 -2
- package/dist/{secrets-BSf9pRRY.mjs.map → secrets-kp760LlD.mjs.map} +1 -1
- package/dist/{sections-5J2YJPqJ.mjs → sections-CpF5SaGr.mjs} +3 -3
- package/dist/{sections-5J2YJPqJ.mjs.map → sections-CpF5SaGr.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +19 -18
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.mjs +1 -1
- package/dist/{seo-BkhuuaaE.mjs → seo-89-53DDs.mjs} +1 -1
- package/dist/{seo-BkhuuaaE.mjs.map → seo-89-53DDs.mjs.map} +1 -1
- package/dist/{seo-DKeXHkzE.mjs → seo-DXu2UQnC.mjs} +3 -3
- package/dist/{seo-DKeXHkzE.mjs.map → seo-DXu2UQnC.mjs.map} +1 -1
- package/dist/{service-BbO2s8gT.mjs → service-DQmiBMzt.mjs} +3 -3
- package/dist/{service-BbO2s8gT.mjs.map → service-DQmiBMzt.mjs.map} +1 -1
- package/dist/{session-user-B8aLtKAH.mjs → session-user-Cascbax7.mjs} +1 -1
- package/dist/{session-user-B8aLtKAH.mjs.map → session-user-Cascbax7.mjs.map} +1 -1
- package/dist/{settings-BMNr9Dmi.mjs → settings-rZyHEcNT.mjs} +3 -3
- package/dist/{settings-BMNr9Dmi.mjs.map → settings-rZyHEcNT.mjs.map} +1 -1
- package/dist/{settings-DJeki-97.mjs → settings-zhmdKyJQ.mjs} +5 -5
- package/dist/{settings-DJeki-97.mjs.map → settings-zhmdKyJQ.mjs.map} +1 -1
- package/dist/{setup-complete-gEiySUc-.mjs → setup-complete-Cb3LRyzy.mjs} +1 -1
- package/dist/{setup-complete-gEiySUc-.mjs.map → setup-complete-Cb3LRyzy.mjs.map} +1 -1
- package/dist/{setup-nonce-DzS50zme.mjs → setup-nonce-Z8x0tHf8.mjs} +1 -1
- package/dist/{setup-nonce-DzS50zme.mjs.map → setup-nonce-Z8x0tHf8.mjs.map} +1 -1
- package/dist/{single-flight-cache-Cdfkic3t.mjs → single-flight-cache-BG3B_GhN.mjs} +1 -1
- package/dist/{single-flight-cache-Cdfkic3t.mjs.map → single-flight-cache-BG3B_GhN.mjs.map} +1 -1
- package/dist/{site-url-BLebyON8.mjs → site-url-BBfDTgZB.mjs} +1 -1
- package/dist/{site-url-BLebyON8.mjs.map → site-url-BBfDTgZB.mjs.map} +1 -1
- package/dist/{ssrf-BRKb343l.mjs → ssrf-1g7usGBg.mjs} +1 -1
- package/dist/{ssrf-BRKb343l.mjs.map → ssrf-1g7usGBg.mjs.map} +1 -1
- package/dist/{status-vUK0SA17.mjs → status-CqJQX1QN.mjs} +1 -1
- package/dist/{status-vUK0SA17.mjs.map → status-CqJQX1QN.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-CM_fUqLU.mjs → taxonomies-BGBd16Eu.mjs} +4 -4
- package/dist/{taxonomies-CM_fUqLU.mjs.map → taxonomies-BGBd16Eu.mjs.map} +1 -1
- package/dist/{taxonomies-D13i2ctt.mjs → taxonomies-Cnb4F-Pb.mjs} +7 -7
- package/dist/{taxonomies-D13i2ctt.mjs.map → taxonomies-Cnb4F-Pb.mjs.map} +1 -1
- package/dist/{taxonomy-BU0LjdVb.mjs → taxonomy-BxGxZZdu.mjs} +4 -4
- package/dist/{taxonomy-BU0LjdVb.mjs.map → taxonomy-BxGxZZdu.mjs.map} +1 -1
- package/dist/{tokens-LeuXF9gG.mjs → tokens-BGT0TUUo.mjs} +1 -1
- package/dist/{tokens-LeuXF9gG.mjs.map → tokens-BGT0TUUo.mjs.map} +1 -1
- package/dist/{transport-BZ-03aFT.d.mts → transport-BMDWHSgZ.d.mts} +1 -1
- package/dist/{transport-BZ-03aFT.d.mts.map → transport-BMDWHSgZ.d.mts.map} +1 -1
- package/dist/{transport-_2nBz7e9.mjs → transport-DPefPMcz.mjs} +1 -1
- package/dist/{transport-_2nBz7e9.mjs.map → transport-DPefPMcz.mjs.map} +1 -1
- package/dist/{trusted-proxy-DZY5WCn2.mjs → trusted-proxy-VTPRiX2s.mjs} +1 -1
- package/dist/{trusted-proxy-DZY5WCn2.mjs.map → trusted-proxy-VTPRiX2s.mjs.map} +1 -1
- package/dist/{types-ETmO_jQr.d.mts → types-BcLUUbbR.d.mts} +2 -2
- package/dist/{types-ETmO_jQr.d.mts.map → types-BcLUUbbR.d.mts.map} +1 -1
- package/dist/{types-BYnDBVwe.d.mts → types-CGbYowGQ.d.mts} +2 -2
- package/dist/{types-BYnDBVwe.d.mts.map → types-CGbYowGQ.d.mts.map} +1 -1
- package/dist/{types-BWqGVhFn.d.mts → types-CgvhU-hF.d.mts} +1 -1
- package/dist/{types-BWqGVhFn.d.mts.map → types-CgvhU-hF.d.mts.map} +1 -1
- package/dist/{types-fS7-VTdR.d.mts → types-ClUkdbWb.d.mts} +1 -1
- package/dist/{types-fS7-VTdR.d.mts.map → types-ClUkdbWb.d.mts.map} +1 -1
- package/dist/{types-CZgK3EMW.mjs → types-CuW0zWDA.mjs} +2 -2
- package/dist/{types-CZgK3EMW.mjs.map → types-CuW0zWDA.mjs.map} +1 -1
- package/dist/{types-BG8_XTLj.d.mts → types-DmHk7vAt.d.mts} +1 -1
- package/dist/{types-BG8_XTLj.d.mts.map → types-DmHk7vAt.d.mts.map} +1 -1
- package/dist/{types-CQAugunJ.mjs → types-Jo3UYd6b.mjs} +1 -1
- package/dist/{types-CQAugunJ.mjs.map → types-Jo3UYd6b.mjs.map} +1 -1
- package/dist/{types-xIfVRNLp.d.mts → types-_HFLRzTn.d.mts} +22 -1
- package/dist/types-_HFLRzTn.d.mts.map +1 -0
- package/dist/{types-DrYMm9s5.d.mts → types-ea9sAPck.d.mts} +1 -1
- package/dist/{types-DrYMm9s5.d.mts.map → types-ea9sAPck.d.mts.map} +1 -1
- package/dist/{types-CNlaBFzx.d.mts → types-g_aFIdW0.d.mts} +1 -1
- package/dist/{types-CNlaBFzx.d.mts.map → types-g_aFIdW0.d.mts.map} +1 -1
- package/dist/{types-CUsXGRVj.d.mts → types-vgEWF18A.d.mts} +19 -1
- package/dist/{types-CUsXGRVj.d.mts.map → types-vgEWF18A.d.mts.map} +1 -1
- package/dist/{user-DkG2jKCp.mjs → user-BjAOvU3Z.mjs} +3 -3
- package/dist/{user-DkG2jKCp.mjs.map → user-BjAOvU3Z.mjs.map} +1 -1
- package/dist/{utils-B7A57fm9.mjs → utils-BJXElxdw.mjs} +156 -7
- package/dist/utils-BJXElxdw.mjs.map +1 -0
- package/dist/{validate-CuJ1Ps9j.mjs → validate-CWSnKVIJ.mjs} +2 -2
- package/dist/{validate-CuJ1Ps9j.mjs.map → validate-CWSnKVIJ.mjs.map} +1 -1
- package/dist/{validate-CG0V0wNR.d.mts → validate-Z1b86_3B.d.mts} +11 -6
- package/dist/{validate-CG0V0wNR.d.mts.map → validate-Z1b86_3B.d.mts.map} +1 -1
- package/dist/{validation-CwUfTdGF.mjs → validation-c8WjhH8z.mjs} +8 -5
- package/dist/{validation-CwUfTdGF.mjs.map → validation-c8WjhH8z.mjs.map} +1 -1
- package/dist/version-CaccU7DM.mjs +7 -0
- package/dist/{version-BoNBItP_.mjs.map → version-CaccU7DM.mjs.map} +1 -1
- package/dist/{widgets-BfOZ-ajY.mjs → widgets-hWcIicX8.mjs} +3 -3
- package/dist/{widgets-BfOZ-ajY.mjs.map → widgets-hWcIicX8.mjs.map} +1 -1
- package/dist/wxr-taxonomies-0_uxSrmf.d.mts +34 -0
- package/dist/wxr-taxonomies-0_uxSrmf.d.mts.map +1 -0
- package/dist/wxr-taxonomies-BC3OYpvx.mjs +425 -0
- package/dist/wxr-taxonomies-BC3OYpvx.mjs.map +1 -0
- package/dist/{zod-generator-gFsRuNNy.mjs → zod-generator-CacrR-i8.mjs} +2 -2
- package/dist/{zod-generator-gFsRuNNy.mjs.map → zod-generator-CacrR-i8.mjs.map} +1 -1
- package/package.json +6 -6
- package/src/api/handlers/content.ts +69 -23
- package/src/api/handlers/plugins.ts +77 -10
- package/src/api/schemas/import.ts +19 -0
- package/src/astro/integration/runtime.ts +3 -6
- package/src/astro/integration/vite-config.ts +19 -1
- package/src/astro/middleware/auth.ts +10 -3
- package/src/astro/middleware/csp.ts +54 -3
- package/src/astro/middleware.ts +1 -0
- package/src/astro/routes/admin.astro +9 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +6 -1
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +6 -1
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +1 -0
- package/src/astro/routes/api/admin/plugins/index.ts +1 -0
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +122 -98
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +794 -44
- package/src/astro/routes/api/manifest.ts +20 -1
- package/src/astro/routes/api/setup/dev-bypass.ts +7 -2
- package/src/astro/types.ts +4 -0
- package/src/cli/commands/seed.ts +1 -1
- package/src/components/EmDashImage.astro +59 -23
- package/src/components/Image.astro +36 -35
- package/src/components/LiveSearch.astro +40 -4
- package/src/components/live-search-routing.ts +30 -0
- package/src/database/migrations/036_i18n_menus_and_taxonomies.ts +23 -18
- package/src/database/migrations/048_restore_content_taxonomies_term_index.ts +32 -0
- package/src/database/migrations/049_taxonomies_name_locale_index.ts +42 -0
- package/src/database/migrations/050_media_usage_index_status.ts +142 -0
- package/src/database/migrations/runner.ts +6 -0
- package/src/database/repositories/media-usage.ts +932 -58
- package/src/database/types.ts +22 -0
- package/src/emdash-runtime.ts +123 -3
- package/src/import/comments.ts +159 -0
- package/src/import/index.ts +8 -1
- package/src/import/settings.ts +65 -189
- package/src/import/sources/wordpress-plugin.ts +338 -42
- package/src/import/sources/wxr.ts +4 -1
- package/src/import/types.ts +12 -0
- package/src/import/utils.ts +207 -0
- package/src/import/wxr-taxonomies.ts +39 -0
- package/src/loader.ts +13 -2
- package/src/media/usage/content-fields.ts +119 -0
- package/src/media/usage/content-refresh.ts +524 -0
- package/src/media/usage/content-repair.ts +491 -0
- package/src/media/usage/content-snapshots.ts +435 -0
- package/src/media/usage/extractor.ts +4 -4
- package/src/media/usage/source-key.ts +22 -0
- package/src/menus/index.ts +17 -1
- package/src/object-cache/index.ts +82 -7
- package/src/plugins/context.ts +100 -71
- package/src/schema/registry.ts +240 -154
- package/src/search/query.ts +3 -0
- package/src/search/types.ts +2 -0
- package/src/seed/apply.ts +158 -101
- package/src/seed/types.ts +6 -1
- package/dist/api-BMfveMoB.mjs.map +0 -1
- package/dist/apply--IVNSdXn.mjs.map +0 -1
- package/dist/byline-fields-eyJMblSr.mjs.map +0 -1
- package/dist/context-C_g-iJVA.mjs.map +0 -1
- package/dist/import-Bb1T9WJS.mjs.map +0 -1
- package/dist/index-BRNabKrx.d.mts.map +0 -1
- package/dist/index-Dt0OKJB4.d.mts.map +0 -1
- package/dist/loader-BA_zhkS_.mjs.map +0 -1
- package/dist/object-cache-CHbHv83-.mjs.map +0 -1
- package/dist/registry-g8yYt4cC.mjs.map +0 -1
- package/dist/runner-DPdt_Wpa.mjs.map +0 -1
- package/dist/search-BR0ZeZmh.mjs.map +0 -1
- package/dist/types-xIfVRNLp.d.mts.map +0 -1
- package/dist/utils-B7A57fm9.mjs.map +0 -1
- package/dist/version-BoNBItP_.mjs +0 -7
- /package/dist/{api-tokens-B4BQybOp.mjs → api-tokens-DsvvCtdh.mjs} +0 -0
- /package/dist/{ssrf-CcX9zvMK.mjs → ssrf-CmuGgCq3.mjs} +0 -0
- /package/dist/{types-BvbeGEtr.mjs → types-DROWRxYV.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress-plugin/execute.ts"],"sourcesContent":["/**\n * WordPress Plugin execute import endpoint\n *\n * POST /_emdash/api/import/wordpress-plugin/execute\n *\n * Imports content from WordPress via EmDash Exporter plugin API.\n */\n\nimport type { APIRoute } from \"astro\";\nimport { ContentRepository, SchemaRegistry } from \"emdash\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpPluginExecuteBody } from \"#api/schemas.js\";\nimport { BylineRepository } from \"#db/repositories/byline.js\";\nimport { getSource } from \"#import/index.js\";\nimport { resolveAndValidateExternalUrl, SsrfError } from \"#import/ssrf.js\";\nimport type { ImportConfig, ImportResult, NormalizedItem } from \"#import/types.js\";\nimport { resolveImportByline } from \"#import/utils.js\";\nimport type { FieldType } from \"#schema/types.js\";\nimport type { EmDashHandlers, EmDashManifest } from \"#types\";\nimport { slugify } from \"#utils/slugify.js\";\n\nexport const prerender = false;\n\nexport interface WpPluginImportConfig extends ImportConfig {\n\t/** Author mappings (WP author login -> EmDash user ID) */\n\tauthorMappings?: Record<string, string | null>;\n}\n\nexport interface WpPluginImportResponse {\n\tsuccess: boolean;\n\tresult?: ImportResult;\n\terror?: { message: string };\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\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 body = await parseBody(request, wpPluginExecuteBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// SSRF: reject internal/private network targets. Uses DNS resolution\n\t\t// to catch hostnames that resolve to private addresses.\n\t\ttry {\n\t\t\tawait resolveAndValidateExternalUrl(body.url);\n\t\t} catch (e) {\n\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\treturn apiError(\"SSRF_BLOCKED\", msg, 400);\n\t\t}\n\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Zod schema output narrowed to WpPluginImportConfig\n\t\tconst config = body.config as unknown as WpPluginImportConfig;\n\n\t\t// Get the WordPress plugin source\n\t\tconst source = getSource(\"wordpress-plugin\");\n\t\tif (!source) {\n\t\t\treturn apiError(\"NOT_CONFIGURED\", \"WordPress plugin source not available\", 500);\n\t\t}\n\n\t\t// Build the list of post types to fetch\n\t\tconst postTypes = Object.entries(config.postTypeMappings)\n\t\t\t.filter(([_, mapping]) => mapping.enabled)\n\t\t\t.map(([postType]) => postType);\n\n\t\tif (postTypes.length === 0) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No post types selected for import\", 400);\n\t\t}\n\n\t\tconsole.log(\"[WP Plugin Import] Starting import for:\", body.url);\n\t\tconsole.log(\"[WP Plugin Import] Post types:\", postTypes);\n\n\t\t// Import content (including drafts since we have auth)\n\t\tconst result = await importContent(\n\t\t\tsource.fetchContent(\n\t\t\t\t{ type: \"url\", url: body.url, token: body.token },\n\t\t\t\t{ postTypes, includeDrafts: true },\n\t\t\t),\n\t\t\tconfig,\n\t\t\temdash,\n\t\t\temdashManifest,\n\t\t);\n\n\t\tconsole.log(\"[WP Plugin Import] Import result:\", JSON.stringify(result, null, 2));\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\tresult,\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import from WordPress\", \"WP_PLUGIN_IMPORT_ERROR\");\n\t}\n};\n\n/** Fields that should be auto-created if they don't exist */\nconst IMPORT_FIELDS: Array<{\n\tslug: string;\n\tlabel: string;\n\ttype: FieldType;\n\tcheck: (item: NormalizedItem) => boolean;\n}> = [\n\t{\n\t\tslug: \"title\",\n\t\tlabel: \"Title\",\n\t\ttype: \"string\",\n\t\tcheck: () => true,\n\t},\n\t{\n\t\tslug: \"content\",\n\t\tlabel: \"Content\",\n\t\ttype: \"portableText\",\n\t\tcheck: () => true,\n\t},\n\t{\n\t\tslug: \"excerpt\",\n\t\tlabel: \"Excerpt\",\n\t\ttype: \"text\",\n\t\tcheck: (item) => !!item.excerpt,\n\t},\n\t{\n\t\tslug: \"featured_image\",\n\t\tlabel: \"Featured Image\",\n\t\ttype: \"image\",\n\t\tcheck: (item) => !!item.featuredImage,\n\t},\n];\n\nasync function importContent(\n\titems: AsyncGenerator<NormalizedItem>,\n\tconfig: WpPluginImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\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};\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\tconst schemaRegistry = new SchemaRegistry(emdash.db);\n\n\t// Track which collections have had fields ensured\n\tconst ensuredCollections = new Set<string>();\n\n\t// Track source translationGroup -> EmDash item ID for translation linking.\n\t// Maps source-side translation group ID to the EmDash ID of the first item\n\t// imported for that group (the default-locale item).\n\tconst translationGroupMap = new Map<string, string>();\n\n\tfor await (const item of items) {\n\t\tconsole.log(\"[WP Plugin Import] Processing item:\", {\n\t\t\tsourceId: item.sourceId,\n\t\t\ttitle: item.title,\n\t\t\tpostType: item.postType,\n\t\t\tstatus: item.status,\n\t\t\tcontentBlocks: Array.isArray(item.content) ? item.content.length : 0,\n\t\t\tfeaturedImage: item.featuredImage,\n\t\t\tlocale: item.locale,\n\t\t\ttranslationGroup: item.translationGroup,\n\t\t});\n\n\t\tconst mapping = config.postTypeMappings[item.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\tconst collection = 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: item.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// Ensure required fields exist in the collection schema (once per collection)\n\t\t\tif (!ensuredCollections.has(collection)) {\n\t\t\t\tfor (const field of IMPORT_FIELDS) {\n\t\t\t\t\tif (field.check(item)) {\n\t\t\t\t\t\tconst existingField = await schemaRegistry.getField(collection, field.slug);\n\t\t\t\t\t\tif (!existingField) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`[WP Plugin Import] Creating missing field \"${field.slug}\" in collection \"${collection}\"`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait schemaRegistry.createField(collection, {\n\t\t\t\t\t\t\t\t\tslug: field.slug,\n\t\t\t\t\t\t\t\t\tlabel: field.label,\n\t\t\t\t\t\t\t\t\ttype: field.type,\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t// Field might already exist from concurrent creation\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t`[WP Plugin Import] Field \"${field.slug}\" creation skipped:`,\n\t\t\t\t\t\t\t\t\te instanceof Error ? e.message : e,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tensuredCollections.add(collection);\n\t\t\t}\n\n\t\t\t// Generate slug from item slug or title\n\t\t\tconst slug = item.slug || slugify(item.title || `post-${item.sourceId}`);\n\n\t\t\t// Check if already exists (idempotency) — locale-aware lookup\n\t\t\tif (config.skipExisting) {\n\t\t\t\tconst existing = await contentRepo.findBySlug(collection, slug, item.locale);\n\t\t\t\tif (existing) {\n\t\t\t\t\t// Still track the translation group mapping for later items\n\t\t\t\t\tif (item.translationGroup) {\n\t\t\t\t\t\ttranslationGroupMap.set(item.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// Map WordPress status to EmDash status\n\t\t\tconst status = mapStatus(item.status);\n\n\t\t\t// Build data object - add all applicable fields\n\t\t\tconst data: Record<string, unknown> = {};\n\n\t\t\t// Add standard fields\n\t\t\tdata.title = item.title || \"Untitled\";\n\t\t\tdata.content = item.content;\n\n\t\t\tif (item.excerpt) {\n\t\t\t\tdata.excerpt = item.excerpt;\n\t\t\t}\n\t\t\tif (item.featuredImage) {\n\t\t\t\tdata.featured_image = item.featuredImage;\n\t\t\t\tconsole.log(\"[WP Plugin Import] Adding featured_image:\", item.featuredImage);\n\t\t\t}\n\n\t\t\t// Note: ACF/Yoast/RankMath fields are not added automatically\n\t\t\t// They would need matching fields in the EmDash schema\n\n\t\t\t// Resolve author ID from mappings\n\t\t\tlet authorId: string | undefined;\n\t\t\tif (config.authorMappings && item.author) {\n\t\t\t\tconst mappedUserId = config.authorMappings[item.author];\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\titem.author,\n\t\t\t\titem.author, // display name fallback is the login\n\t\t\t\tauthorId,\n\t\t\t\tbylineRepo,\n\t\t\t\tbylineCache,\n\t\t\t);\n\n\t\t\t// Resolve translation link: if this item has a translationGroup and\n\t\t\t// we've already imported another item in the same group, link them.\n\t\t\tlet translationOf: string | undefined;\n\t\t\tif (item.translationGroup) {\n\t\t\t\tconst existingGroupItem = translationGroupMap.get(item.translationGroup);\n\t\t\t\tif (existingGroupItem) {\n\t\t\t\t\ttranslationOf = existingGroupItem;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Preserve original dates from the source\n\t\t\tconst itemDateTime = item.date?.getTime();\n\t\t\tconst createdAt =\n\t\t\t\titemDateTime !== undefined && !Number.isNaN(itemDateTime)\n\t\t\t\t\t? item.date.toISOString()\n\t\t\t\t\t: 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: item.locale,\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// Track translation group: first item in a group establishes the mapping\n\t\t\t\tif (item.translationGroup && !translationGroupMap.has(item.translationGroup)) {\n\t\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- handler success data includes id\n\t\t\t\t\tconst createdData = createResult.data as { id?: string } | undefined;\n\t\t\t\t\tif (createdData?.id) {\n\t\t\t\t\t\ttranslationGroupMap.set(item.translationGroup, createdData.id);\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: item.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 \"${item.title || \"Untitled\"}\":`, error);\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: item.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-plugin/execute.ts"],"sourcesContent":["/**\n * WordPress Plugin execute import endpoint\n *\n * POST /_emdash/api/import/wordpress-plugin/execute\n *\n * Imports content from WordPress via EmDash Exporter plugin API.\n */\n\nimport type { APIRoute } from \"astro\";\nimport {\n\tContentRepository,\n\tSchemaRegistry,\n\ttype WxrCategory,\n\ttype WxrPost,\n\ttype WxrTag,\n\ttype WxrTerm,\n} from \"emdash\";\nimport type { z } from \"zod\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { handleTaxonomyCreate } from \"#api/handlers/taxonomies.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpPluginExecuteBody } from \"#api/schemas.js\";\nimport { BylineRepository } from \"#db/repositories/byline.js\";\nimport { importCommentsFromPlugin } from \"#import/comments.js\";\nimport { getSource } from \"#import/index.js\";\nimport { importMenusFromPlugin } from \"#import/menus.js\";\nimport { importSiteSettings, parseSiteSettingsFromPlugin } from \"#import/settings.js\";\nimport {\n\tfetchPluginComments,\n\tfetchPluginCommentsPage,\n\tfetchPluginContentPage,\n\tfetchPluginMenus,\n\tfetchPluginOptions,\n\tfetchPluginTaxonomies,\n} from \"#import/sources/wordpress-plugin.js\";\nimport { resolveAndValidateExternalUrl, SsrfError } from \"#import/ssrf.js\";\nimport type { ImportConfig, ImportResult, NormalizedItem } from \"#import/types.js\";\nimport { resolveImportByline, sanitizeFieldSlug } from \"#import/utils.js\";\nimport {\n\tattachPostTaxonomies,\n\tloadTaxonomyPlanFromDb,\n\tpreImportWxrTaxonomies,\n\ttype TaxonomyImportPlan,\n} from \"#import/wxr-taxonomies.js\";\nimport type { FieldType } from \"#schema/types.js\";\nimport type { EmDashHandlers, EmDashManifest } from \"#types\";\nimport { slugify } from \"#utils/slugify.js\";\n\nimport { importMediaWithProgress } from \"../wordpress/media.js\";\n\nexport const prerender = false;\n\nexport interface WpPluginImportConfig extends ImportConfig {\n\t/** Author mappings (WP author login -> EmDash user ID) */\n\tauthorMappings?: Record<string, string | null>;\n\t/** Wizard toggles. Absent means enabled (older admins don't send them). */\n\timportMenus?: boolean;\n\timportSiteTitle?: boolean;\n\timportLogo?: boolean;\n\timportSeo?: boolean;\n}\n\nexport interface WpPluginImportResponse {\n\tsuccess: boolean;\n\tresult?: ImportResult;\n\terror?: { message: string };\n}\n\n// =============================================================================\n// Chunked mode (issue #475)\n//\n// A single-invocation import of a large site exceeds Cloudflare Worker\n// resource limits (CPU time, subrequests). In chunked mode the admin drives\n// the import as a loop of bounded requests: one WP content page per call,\n// then paginated comments, then a small finalize step (menus + site\n// identity). Cross-chunk state — the WP-ID -> EmDash-ID map, translation\n// groups, comment threading roots — is accumulated by the client and sent\n// back with each request, so the server stays stateless and an aborted\n// import simply re-runs (skipExisting rebuilds the map while skipping work).\n// =============================================================================\n\n/** Posts per content chunk. 50 posts ≈ a few hundred D1 ops per invocation. */\nconst CONTENT_CHUNK_SIZE = 50;\n\ninterface ChunkCursor {\n\tpostTypeIndex: number;\n\tpage: number;\n}\n\n/** Per-chunk response payload: partial result + state the client must carry. */\ninterface ChunkResponse {\n\tsuccess: boolean;\n\tresult: ImportResult;\n\tdone: boolean;\n\tcursor?: ChunkCursor;\n\tchunk?: {\n\t\tidMap?: Record<string, { id: string; collection: string }>;\n\t\ttranslationGroups?: Record<string, string>;\n\t\tcommentRoots?: Record<string, string>;\n\t};\n}\n\nfunction emptyImportResult(): ImportResult {\n\treturn { success: true, imported: 0, skipped: 0, errors: [], byCollection: {} };\n}\n\nfunction parseIdMap(idMap: Record<string, { id: string; collection: string }> | undefined): {\n\tcontentIdMap: Map<number, string>;\n\tcollectionByWpId: Map<number, string>;\n} {\n\tconst contentIdMap = new Map<number, string>();\n\tconst collectionByWpId = new Map<number, string>();\n\tfor (const [key, value] of Object.entries(idMap ?? {})) {\n\t\tconst wpId = Number(key);\n\t\tif (!Number.isFinite(wpId)) continue;\n\t\tcontentIdMap.set(wpId, value.id);\n\t\tcollectionByWpId.set(wpId, value.collection);\n\t}\n\treturn { contentIdMap, collectionByWpId };\n}\n\nfunction serializeIdMap(\n\tcontentIdMap: Map<number, string>,\n\tcollectionByWpId: Map<number, string>,\n): Record<string, { id: string; collection: string }> {\n\tconst out: Record<string, { id: string; collection: string }> = {};\n\tfor (const [wpId, id] of contentIdMap) {\n\t\tconst collection = collectionByWpId.get(wpId);\n\t\tif (collection) out[String(wpId)] = { id, collection };\n\t}\n\treturn out;\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 body = await parseBody(request, wpPluginExecuteBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// SSRF: reject internal/private network targets. Uses DNS resolution\n\t\t// to catch hostnames that resolve to private addresses.\n\t\ttry {\n\t\t\tawait resolveAndValidateExternalUrl(body.url);\n\t\t} catch (e) {\n\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\treturn apiError(\"SSRF_BLOCKED\", msg, 400);\n\t\t}\n\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- Zod schema output narrowed to WpPluginImportConfig\n\t\tconst config = body.config as unknown as WpPluginImportConfig;\n\n\t\t// Get the WordPress plugin source\n\t\tconst source = getSource(\"wordpress-plugin\");\n\t\tif (!source) {\n\t\t\treturn apiError(\"NOT_CONFIGURED\", \"WordPress plugin source not available\", 500);\n\t\t}\n\n\t\t// Build the list of post types to fetch\n\t\tconst postTypes = Object.entries(config.postTypeMappings)\n\t\t\t.filter(([_, mapping]) => mapping.enabled)\n\t\t\t.map(([postType]) => postType);\n\n\t\tif (postTypes.length === 0) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No post types selected for import\", 400);\n\t\t}\n\n\t\tconsole.log(\"[WP Plugin Import] Starting import for:\", body.url);\n\t\tconsole.log(\"[WP Plugin Import] Post types:\", postTypes);\n\n\t\t// Chunked mode: one bounded unit of work per invocation (issue #475).\n\t\tif (body.phase) {\n\t\t\tconst chunk = await runImportPhase(emdash, body, config, postTypes, emdashManifest);\n\t\t\treturn apiSuccess(chunk);\n\t\t}\n\n\t\t// Pre-create taxonomy defs (for custom CPT taxonomies) and terms so\n\t\t// per-post assignments can attach.\n\t\t// Non-fatal: a site whose /taxonomies call fails still gets content.\n\t\tlet taxonomyPlan: TaxonomyImportPlan | undefined;\n\t\tlet taxonomyDefsCreated: string[] = [];\n\t\ttry {\n\t\t\tconst built = await buildTaxonomyPlan(emdash, body.url, body.token, config);\n\t\t\ttaxonomyPlan = built.plan;\n\t\t\ttaxonomyDefsCreated = built.defsCreated;\n\t\t} catch (e) {\n\t\t\tconsole.warn(\"[WP Plugin Import] Taxonomy pre-import failed:\", e);\n\t\t}\n\n\t\t// Import content (including drafts since we have auth)\n\t\tconst { result, contentIdMap, collectionByWpId } = await importContent(\n\t\t\tsource.fetchContent(\n\t\t\t\t{ type: \"url\", url: body.url, token: body.token },\n\t\t\t\t{ postTypes, includeDrafts: true },\n\t\t\t),\n\t\t\tconfig,\n\t\t\temdash,\n\t\t\temdashManifest,\n\t\t\ttaxonomyPlan,\n\t\t);\n\n\t\t// Import navigation menus, resolving item references through the\n\t\t// WP-post-ID -> EmDash-ID map collected during the content pass.\n\t\tif (config.importMenus !== false) {\n\t\t\tawait importMenusInto(result, emdash, body.url, body.token, contentIdMap);\n\t\t}\n\n\t\t// Import comments into EmDash's native comments table, preserving\n\t\t// authors, dates, threading, and approval status.\n\t\t// Non-fatal: older plugin versions have no /comments endpoint.\n\t\ttry {\n\t\t\tconst comments = await fetchPluginComments(body.url, body.token);\n\t\t\tif (comments.length > 0) {\n\t\t\t\tconst commentsResult = await importCommentsFromPlugin(\n\t\t\t\t\tcomments,\n\t\t\t\t\temdash.db,\n\t\t\t\t\tcontentIdMap,\n\t\t\t\t\tcollectionByWpId,\n\t\t\t\t);\n\t\t\t\tresult.comments = {\n\t\t\t\t\timported: commentsResult.imported,\n\t\t\t\t\tskipped: commentsResult.skipped,\n\t\t\t\t};\n\t\t\t\tfor (const commentError of commentsResult.errors) {\n\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\ttitle: `Comment: ${commentError.comment}`,\n\t\t\t\t\t\terror: commentError.error,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.warn(\"[WP Plugin Import] Comment import failed:\", e);\n\t\t}\n\n\t\t// Apply site identity (title, tagline, logo, favicon) from the source\n\t\t// site's options, replacing the starter template's seed placeholders.\n\t\t// Non-fatal: content is already imported at this point.\n\t\ttry {\n\t\t\tresult.siteSettings = await applySiteSettings(emdash, body.url, body.token, config);\n\t\t} catch (e) {\n\t\t\tconsole.warn(\"[WP Plugin Import] Site settings import failed:\", e);\n\t\t}\n\n\t\tif (taxonomyDefsCreated.length > 0) {\n\t\t\tresult.taxonomiesCreated = taxonomyDefsCreated;\n\t\t}\n\n\t\tconsole.log(\"[WP Plugin Import] Import result:\", JSON.stringify(result, null, 2));\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\tresult,\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import from WordPress\", \"WP_PLUGIN_IMPORT_ERROR\");\n\t}\n};\n\n/**\n * Import navigation menus into `result`, resolving item references through\n * the WP-post-ID -> EmDash-ID map collected during the content pass.\n * Non-fatal: older plugin versions have no /menus endpoint.\n */\nasync function importMenusInto(\n\tresult: ImportResult,\n\temdash: EmDashHandlers,\n\turl: string,\n\ttoken: string,\n\tcontentIdMap: Map<number, string>,\n): Promise<void> {\n\ttry {\n\t\tconst menus = await fetchPluginMenus(url, token);\n\t\tif (menus.length > 0) {\n\t\t\tconst menuResult = await importMenusFromPlugin(menus, emdash.db, contentIdMap);\n\t\t\tresult.menus = {\n\t\t\t\tcreated: menuResult.menusCreated,\n\t\t\t\titems: menuResult.itemsCreated,\n\t\t\t};\n\t\t\tfor (const menuError of menuResult.errors) {\n\t\t\t\tresult.errors.push({ title: `Menu: ${menuError.menu}`, error: menuError.error });\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(\"[WP Plugin Import] Menu import failed:\", e);\n\t}\n}\n\ntype ExecuteBody = z.infer<typeof wpPluginExecuteBody>;\n\n/** Dispatch one chunk of work for the requested phase. */\nasync function runImportPhase(\n\temdash: EmDashHandlers,\n\tbody: ExecuteBody,\n\tconfig: WpPluginImportConfig,\n\tpostTypes: string[],\n\tmanifest: EmDashManifest,\n): Promise<ChunkResponse> {\n\tswitch (body.phase) {\n\t\tcase \"content\":\n\t\t\treturn runContentChunk(emdash, body, config, postTypes, manifest);\n\t\tcase \"comments\":\n\t\t\treturn runCommentsChunk(emdash, body);\n\t\tcase \"finalize\":\n\t\t\treturn runFinalizePhase(emdash, body, config);\n\t\tcase undefined:\n\t\t\tthrow new Error(\"runImportPhase called without a phase\");\n\t\tdefault:\n\t\t\tbody.phase satisfies never;\n\t\t\tthrow new Error(\"Unknown import phase\");\n\t}\n}\n\n/**\n * Import one page of one post type. The first chunk additionally runs the\n * taxonomy setup (def + term creation); later chunks only reload the\n * lookup maps from the database.\n */\nasync function runContentChunk(\n\temdash: EmDashHandlers,\n\tbody: ExecuteBody,\n\tconfig: WpPluginImportConfig,\n\tpostTypes: string[],\n\tmanifest: EmDashManifest,\n): Promise<ChunkResponse> {\n\tconst cursor = body.cursor ?? { postTypeIndex: 0, page: 1 };\n\tconst postType = postTypes[cursor.postTypeIndex];\n\tif (!postType) {\n\t\treturn { success: true, result: emptyImportResult(), done: true };\n\t}\n\n\tconst isFirstChunk = cursor.postTypeIndex === 0 && cursor.page === 1;\n\tlet taxonomyPlan: TaxonomyImportPlan | undefined;\n\tlet taxonomyDefsCreated: string[] = [];\n\ttry {\n\t\tif (isFirstChunk) {\n\t\t\tconst built = await buildTaxonomyPlan(emdash, body.url, body.token, config);\n\t\t\ttaxonomyPlan = built.plan;\n\t\t\ttaxonomyDefsCreated = built.defsCreated;\n\t\t} else {\n\t\t\ttaxonomyPlan = await loadTaxonomyPlanFromDb(emdash.db);\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(\"[WP Plugin Import] Taxonomy pre-import failed:\", e);\n\t}\n\n\tconst page = await fetchPluginContentPage({\n\t\tsiteUrl: body.url,\n\t\ttoken: body.token,\n\t\tpostType,\n\t\tpage: cursor.page,\n\t\tperPage: CONTENT_CHUNK_SIZE,\n\t\tincludeDrafts: true,\n\t});\n\n\t// Seed translation-group state from earlier chunks so a translation in\n\t// this page links to its sibling imported three chunks ago.\n\tconst translationGroupMap = new Map(Object.entries(body.translationGroups ?? {}));\n\n\tconst { result, contentIdMap, collectionByWpId } = await importContent(\n\t\tpage.items,\n\t\tconfig,\n\t\temdash,\n\t\tmanifest,\n\t\ttaxonomyPlan,\n\t\ttranslationGroupMap,\n\t);\n\n\tif (taxonomyDefsCreated.length > 0) {\n\t\tresult.taxonomiesCreated = taxonomyDefsCreated;\n\t}\n\n\t// Advance: next page of this post type, first page of the next one,\n\t// or done. An empty last page (totalPages can shrink while paginating\n\t// a live site) still terminates because page >= totalPages.\n\tlet next: ChunkCursor | undefined;\n\tif (cursor.page < page.totalPages) {\n\t\tnext = { postTypeIndex: cursor.postTypeIndex, page: cursor.page + 1 };\n\t} else if (cursor.postTypeIndex + 1 < postTypes.length) {\n\t\tnext = { postTypeIndex: cursor.postTypeIndex + 1, page: 1 };\n\t}\n\n\treturn {\n\t\tsuccess: true,\n\t\tresult,\n\t\tdone: next === undefined,\n\t\tcursor: next,\n\t\tchunk: {\n\t\t\tidMap: serializeIdMap(contentIdMap, collectionByWpId),\n\t\t\ttranslationGroups: Object.fromEntries(translationGroupMap),\n\t\t},\n\t};\n}\n\n/**\n * Import one page of comments (500 per page, ordered by WP comment ID so\n * parents precede children across pages). Requires the accumulated idMap\n * from the content phase; threading roots accumulate in `commentRoots`.\n */\nasync function runCommentsChunk(emdash: EmDashHandlers, body: ExecuteBody): Promise<ChunkResponse> {\n\tconst page = body.cursor?.page ?? 1;\n\tconst result = emptyImportResult();\n\n\tconst { contentIdMap, collectionByWpId } = parseIdMap(body.idMap);\n\tconst rootIds = new Map<number, string>();\n\tfor (const [key, value] of Object.entries(body.commentRoots ?? {})) {\n\t\tconst wpId = Number(key);\n\t\tif (Number.isFinite(wpId)) rootIds.set(wpId, value);\n\t}\n\n\tconst { items, totalPages } = await fetchPluginCommentsPage(body.url, body.token, page);\n\n\tif (items.length > 0) {\n\t\tconst commentsResult = await importCommentsFromPlugin(\n\t\t\titems,\n\t\t\temdash.db,\n\t\t\tcontentIdMap,\n\t\t\tcollectionByWpId,\n\t\t\trootIds,\n\t\t);\n\t\tresult.comments = {\n\t\t\timported: commentsResult.imported,\n\t\t\tskipped: commentsResult.skipped,\n\t\t};\n\t\tfor (const commentError of commentsResult.errors) {\n\t\t\tresult.errors.push({ title: `Comment: ${commentError.comment}`, error: commentError.error });\n\t\t}\n\t\tresult.success = result.errors.length === 0;\n\t}\n\n\tconst done = page >= totalPages;\n\tconst commentRoots: Record<string, string> = {};\n\tfor (const [wpId, id] of rootIds) commentRoots[String(wpId)] = id;\n\n\treturn {\n\t\tsuccess: true,\n\t\tresult,\n\t\tdone,\n\t\tcursor: done ? undefined : { postTypeIndex: 0, page: page + 1 },\n\t\tchunk: { commentRoots },\n\t};\n}\n\n/** Menus + site identity — small, runs as a single closing chunk. */\nasync function runFinalizePhase(\n\temdash: EmDashHandlers,\n\tbody: ExecuteBody,\n\tconfig: WpPluginImportConfig,\n): Promise<ChunkResponse> {\n\tconst result = emptyImportResult();\n\tconst { contentIdMap } = parseIdMap(body.idMap);\n\n\tif (config.importMenus !== false) {\n\t\tawait importMenusInto(result, emdash, body.url, body.token, contentIdMap);\n\t}\n\n\ttry {\n\t\tresult.siteSettings = await applySiteSettings(emdash, body.url, body.token, config);\n\t} catch (e) {\n\t\tconsole.warn(\"[WP Plugin Import] Site settings import failed:\", e);\n\t}\n\n\tresult.success = result.errors.length === 0;\n\treturn { success: true, result, done: true };\n}\n\n/** Fields that should be auto-created if they don't exist */\nconst IMPORT_FIELDS: Array<{\n\tslug: string;\n\tlabel: string;\n\ttype: FieldType;\n\tcheck: (item: NormalizedItem) => boolean;\n}> = [\n\t{\n\t\tslug: \"title\",\n\t\tlabel: \"Title\",\n\t\ttype: \"string\",\n\t\tcheck: () => true,\n\t},\n\t{\n\t\tslug: \"content\",\n\t\tlabel: \"Content\",\n\t\ttype: \"portableText\",\n\t\tcheck: () => true,\n\t},\n\t{\n\t\tslug: \"excerpt\",\n\t\tlabel: \"Excerpt\",\n\t\ttype: \"text\",\n\t\tcheck: (item) => !!item.excerpt,\n\t},\n\t{\n\t\tslug: \"featured_image\",\n\t\tlabel: \"Featured Image\",\n\t\ttype: \"image\",\n\t\tcheck: (item) => !!item.featuredImage,\n\t},\n\t{\n\t\tslug: \"seo_title\",\n\t\tlabel: \"SEO Title\",\n\t\ttype: \"string\",\n\t\tcheck: (item) => !!extractSeo(item).title,\n\t},\n\t{\n\t\tslug: \"seo_description\",\n\t\tlabel: \"SEO Description\",\n\t\ttype: \"text\",\n\t\tcheck: (item) => !!extractSeo(item).description,\n\t},\n];\n\nconst SEO_FIELD_SLUGS = new Set([\"seo_title\", \"seo_description\"]);\n\n/**\n * Coerce a WordPress meta value to an EmDash field type. WP postmeta is\n * stringly typed and inconsistent across posts (the same key can hold\n * \"5\", 5, \"\", or false). Returns `undefined` when the value can't\n * reasonably represent the target type — the caller drops it.\n */\nexport function coerceToFieldType(value: unknown, fieldType: string): unknown {\n\tswitch (fieldType) {\n\t\tcase \"integer\": {\n\t\t\tconst n = typeof value === \"number\" ? value : Number(value);\n\t\t\treturn Number.isInteger(n) ? n : undefined;\n\t\t}\n\t\tcase \"number\": {\n\t\t\tconst n = typeof value === \"number\" ? value : Number(value);\n\t\t\treturn Number.isFinite(n) ? n : undefined;\n\t\t}\n\t\tcase \"boolean\": {\n\t\t\tif (typeof value === \"boolean\") return value;\n\t\t\tif (value === 1 || value === \"1\" || value === \"true\" || value === \"yes\") return true;\n\t\t\tif (value === 0 || value === \"0\" || value === \"false\" || value === \"no\") return false;\n\t\t\treturn undefined;\n\t\t}\n\t\tcase \"datetime\": {\n\t\t\tif (typeof value !== \"string\" && typeof value !== \"number\") return undefined;\n\t\t\tconst d = new Date(value);\n\t\t\treturn Number.isNaN(d.getTime()) ? undefined : d.toISOString();\n\t\t}\n\t\tcase \"json\":\n\t\t\t// Anything serializes; objects/arrays pass through as-is\n\t\t\treturn value;\n\t\tcase \"string\":\n\t\tcase \"text\":\n\t\tcase \"url\":\n\t\tcase \"select\":\n\t\tcase \"slug\":\n\t\tcase \"reference\":\n\t\t\tif (typeof value === \"string\") return value;\n\t\t\tif (typeof value === \"number\") return String(value);\n\t\t\treturn undefined;\n\t\tdefault:\n\t\t\t// Complex types (image, portableText, repeater, multiSelect, file):\n\t\t\t// raw meta can't be coerced reliably -- pass through only if it\n\t\t\t// already has a non-primitive shape.\n\t\t\treturn typeof value === \"object\" ? value : undefined;\n\t}\n}\n\n/**\n * Pull the per-post SEO title/description out of the Yoast / Rank Math\n * blobs the plugin source stashes in `item.meta`. Empty strings mean \"not\n * overridden for this post\" (the plugin exports the raw meta values) and\n * are treated as absent.\n */\nfunction pickSeoValue(blob: unknown, key: string): string | undefined {\n\tif (typeof blob !== \"object\" || blob === null) return undefined;\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- narrowed to non-null object above\n\tconst value = (blob as Record<string, unknown>)[key];\n\treturn typeof value === \"string\" && value.trim() !== \"\" ? value : undefined;\n}\n\nfunction extractSeo(item: NormalizedItem): { title?: string; description?: string } {\n\tconst yoast = item.meta?._yoast;\n\tconst rankmath = item.meta?._rankmath;\n\treturn {\n\t\ttitle: pickSeoValue(yoast, \"title\") ?? pickSeoValue(rankmath, \"title\"),\n\t\tdescription: pickSeoValue(yoast, \"description\") ?? pickSeoValue(rankmath, \"description\"),\n\t};\n}\n\n/**\n * Fetch the site's taxonomies from the plugin API and pre-create all terms,\n * reusing the WXR taxonomy machinery (same def-lookup, idempotency, and\n * collection-filter semantics).\n */\n/** WP built-in taxonomies that either map to seeded defs or are not content taxonomies. */\nconst BUILTIN_TAXONOMIES = new Set([\"category\", \"post_tag\", \"nav_menu\", \"post_format\"]);\n\n/** Mirrors NAME_PATTERN in the taxonomy handler -- names that fail stay in missingTaxonomies. */\nconst TAXONOMY_NAME_PATTERN = /^[a-z][a-z0-9_]*$/;\n\n/**\n * Create EmDash taxonomy defs for custom WP taxonomies (e.g. CPT taxonomies\n * like `company` or `plattform`) that don't exist yet, scoped to the\n * collections the enabled post-type mappings target. Returns the names of\n * the defs created. Runs before term pre-import so the terms and per-post\n * assignments flow through the existing machinery instead of being dropped\n * as `missingTaxonomies`.\n */\nexport async function ensureCustomTaxonomyDefs(\n\tdb: EmDashHandlers[\"db\"],\n\ttaxonomies: Awaited<ReturnType<typeof fetchPluginTaxonomies>>,\n\tconfig: WpPluginImportConfig,\n): Promise<string[]> {\n\tconst created: string[] = [];\n\tfor (const taxonomy of taxonomies) {\n\t\tif (BUILTIN_TAXONOMIES.has(taxonomy.name)) continue;\n\t\tif (taxonomy.terms.length === 0) continue;\n\t\tif (!TAXONOMY_NAME_PATTERN.test(taxonomy.name)) continue;\n\n\t\t// handleTaxonomyCreate's duplicate guard is locale-scoped; check\n\t\t// name-wide existence ourselves to stay idempotent on re-runs.\n\t\tconst existing = await db\n\t\t\t.selectFrom(\"_emdash_taxonomy_defs\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", taxonomy.name)\n\t\t\t.executeTakeFirst();\n\t\tif (existing) continue;\n\n\t\t// Scope the def to the collections the WP post types map onto.\n\t\t// Older plugin versions don't send post_types -> empty list = no\n\t\t// collection filter, which the term machinery treats as \"any\".\n\t\tconst collections = (taxonomy.post_types ?? [])\n\t\t\t.map((postType) => config.postTypeMappings[postType])\n\t\t\t.filter((mapping) => mapping?.enabled)\n\t\t\t.map((mapping) => mapping.collection);\n\n\t\tconst result = await handleTaxonomyCreate(db, {\n\t\t\tname: taxonomy.name,\n\t\t\tlabel: taxonomy.label,\n\t\t\tlabelSingular: taxonomy.label_singular,\n\t\t\thierarchical: taxonomy.hierarchical,\n\t\t\tcollections: [...new Set(collections)],\n\t\t});\n\t\tif (result.success) {\n\t\t\tcreated.push(taxonomy.name);\n\t\t} else {\n\t\t\tconsole.warn(\n\t\t\t\t`[WP Plugin Import] Could not create taxonomy '${taxonomy.name}':`,\n\t\t\t\tresult.error.message,\n\t\t\t);\n\t\t}\n\t}\n\treturn created;\n}\n\nasync function buildTaxonomyPlan(\n\temdash: EmDashHandlers,\n\turl: string,\n\ttoken: string,\n\tconfig: WpPluginImportConfig,\n): Promise<{ plan: TaxonomyImportPlan; defsCreated: string[] }> {\n\tconst taxonomies = await fetchPluginTaxonomies(url, token);\n\n\tconst defsCreated = await ensureCustomTaxonomyDefs(emdash.db, taxonomies, config);\n\n\tconst categories: WxrCategory[] = [];\n\tconst tags: WxrTag[] = [];\n\tconst terms: WxrTerm[] = [];\n\n\tfor (const taxonomy of taxonomies) {\n\t\tfor (const term of taxonomy.terms) {\n\t\t\tif (taxonomy.name === \"category\") {\n\t\t\t\tcategories.push({ nicename: term.slug, name: term.name, description: term.description });\n\t\t\t} else if (taxonomy.name === \"post_tag\") {\n\t\t\t\ttags.push({ slug: term.slug, name: term.name, description: term.description });\n\t\t\t} else if (taxonomy.name !== \"nav_menu\" && taxonomy.name !== \"post_format\") {\n\t\t\t\tterms.push({\n\t\t\t\t\tid: term.id,\n\t\t\t\t\ttaxonomy: taxonomy.name,\n\t\t\t\t\tslug: term.slug,\n\t\t\t\t\tname: term.name,\n\t\t\t\t\tdescription: term.description,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst plan = await preImportWxrTaxonomies(emdash.db, [], categories, tags, terms, undefined);\n\treturn { plan, defsCreated };\n}\n\n/**\n * Fetch the source site's options and apply its identity (title, tagline,\n * logo, favicon) as EmDash site settings, overwriting seed placeholders.\n * Logo/favicon files are side-loaded into media storage first; the later\n * full media pass dedupes them by content hash.\n *\n * Returns the list of applied setting keys.\n */\nasync function applySiteSettings(\n\temdash: EmDashHandlers,\n\turl: string,\n\ttoken: string,\n\tconfig: WpPluginImportConfig,\n): Promise<string[]> {\n\tconst wantTitle = config.importSiteTitle !== false;\n\tconst wantLogo = config.importLogo !== false;\n\tif (!wantTitle && !wantLogo) return [];\n\n\tconst options = await fetchPluginOptions(url, token);\n\tconst parsed = parseSiteSettingsFromPlugin(options);\n\tif (!wantTitle) {\n\t\tdelete parsed.title;\n\t\tdelete parsed.tagline;\n\t}\n\tif (!wantLogo) {\n\t\tdelete parsed.logo;\n\t\tdelete parsed.favicon;\n\t}\n\n\tconst media: { logoMediaId?: string; faviconMediaId?: string } = {};\n\tif (emdash.storage && (parsed.logo?.url || parsed.favicon?.url)) {\n\t\tconst attachments = [];\n\t\tif (parsed.logo?.url) {\n\t\t\tattachments.push({ id: parsed.logo.id, url: parsed.logo.url });\n\t\t}\n\t\tif (parsed.favicon?.url && parsed.favicon.url !== parsed.logo?.url) {\n\t\t\tattachments.push({ id: parsed.favicon.id, url: parsed.favicon.url });\n\t\t}\n\t\tconst mediaResult = await importMediaWithProgress(\n\t\t\tattachments,\n\t\t\temdash.db,\n\t\t\temdash.storage,\n\t\t\t() => {},\n\t\t);\n\t\tfor (const item of mediaResult.imported) {\n\t\t\tif (item.originalUrl === parsed.logo?.url) {\n\t\t\t\tmedia.logoMediaId = item.mediaId;\n\t\t\t}\n\t\t\tif (item.originalUrl === parsed.favicon?.url) {\n\t\t\t\tmedia.faviconMediaId = item.mediaId;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst settingsResult = await importSiteSettings(parsed, emdash.db, true, media);\n\tfor (const settingError of settingsResult.errors) {\n\t\tconsole.warn(\n\t\t\t`[WP Plugin Import] Site setting \"${settingError.setting}\" failed:`,\n\t\t\tsettingError.error,\n\t\t);\n\t}\n\treturn settingsResult.applied;\n}\n\n/**\n * Adapt a NormalizedItem's taxonomy assignments to the WxrPost shape the\n * shared attach helper consumes.\n */\nfunction toWxrAssignments(item: NormalizedItem): WxrPost {\n\treturn {\n\t\tcategories: item.categories ?? [],\n\t\ttags: item.tags ?? [],\n\t\tcustomTaxonomies: item.customTaxonomies\n\t\t\t? new Map(Object.entries(item.customTaxonomies))\n\t\t\t: undefined,\n\t\tmeta: new Map(),\n\t};\n}\n\n/** Exported for tests (field auto-creation regression coverage). */\nexport async function importContent(\n\titems: AsyncIterable<NormalizedItem> | Iterable<NormalizedItem>,\n\tconfig: WpPluginImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\ttaxonomyPlan: TaxonomyImportPlan | undefined,\n\tseedTranslationGroups?: Map<string, string>,\n): Promise<{\n\tresult: ImportResult;\n\tcontentIdMap: Map<number, string>;\n\tcollectionByWpId: Map<number, string>;\n}> {\n\tconst result: ImportResult = {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t};\n\n\t// WP post ID -> EmDash content ID, used to resolve menu item references\n\tconst contentIdMap = new Map<number, string>();\n\n\t// WP post ID -> EmDash collection slug, used by the comment import\n\tconst collectionByWpId = new Map<number, string>();\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\tconst schemaRegistry = new SchemaRegistry(emdash.db);\n\n\t// Track which (collection, field) pairs have been ensured. Keyed per\n\t// field, not per collection: a field like seo_title may first be\n\t// needed by the 30th item, and gating on the first item would skip it.\n\tconst ensuredFields = new Set<string>();\n\n\t// Field slug -> type per collection, for mapping custom meta/ACF onto\n\t// real fields (and coercing values to the field's type)\n\tconst fieldTypesByCollection = new Map<string, Map<string, string>>();\n\n\t// Track source translationGroup -> EmDash item ID for translation linking.\n\t// Maps source-side translation group ID to the EmDash ID of the first item\n\t// imported for that group (the default-locale item). The chunked import\n\t// seeds this from earlier chunks so groups can span page boundaries.\n\tconst translationGroupMap = seedTranslationGroups ?? new Map<string, string>();\n\n\tfor await (const item of items) {\n\t\tconsole.log(\"[WP Plugin Import] Processing item:\", {\n\t\t\tsourceId: item.sourceId,\n\t\t\ttitle: item.title,\n\t\t\tpostType: item.postType,\n\t\t\tstatus: item.status,\n\t\t\tcontentBlocks: Array.isArray(item.content) ? item.content.length : 0,\n\t\t\tfeaturedImage: item.featuredImage,\n\t\t\tlocale: item.locale,\n\t\t\ttranslationGroup: item.translationGroup,\n\t\t});\n\n\t\tconst mapping = config.postTypeMappings[item.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\tconst collection = 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: item.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// Ensure required fields exist in the collection schema. Checked\n\t\t\t// per field and item (not once per collection): whether a field\n\t\t\t// is needed depends on the item — the first post may have no SEO\n\t\t\t// override while a later one does.\n\t\t\tfor (const field of IMPORT_FIELDS) {\n\t\t\t\tif (config.importSeo === false && SEO_FIELD_SLUGS.has(field.slug)) continue;\n\t\t\t\tconst ensureKey = `${collection}:${field.slug}`;\n\t\t\t\tif (ensuredFields.has(ensureKey) || !field.check(item)) continue;\n\t\t\t\tensuredFields.add(ensureKey);\n\t\t\t\tconst existingField = await schemaRegistry.getField(collection, field.slug);\n\t\t\t\tif (!existingField) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`[WP Plugin Import] Creating missing field \"${field.slug}\" in collection \"${collection}\"`,\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait schemaRegistry.createField(collection, {\n\t\t\t\t\t\t\tslug: field.slug,\n\t\t\t\t\t\t\tlabel: field.label,\n\t\t\t\t\t\t\ttype: field.type,\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfieldTypesByCollection.get(collection)?.set(field.slug, field.type);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Field might already exist from concurrent creation\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[WP Plugin Import] Field \"${field.slug}\" creation skipped:`,\n\t\t\t\t\t\t\te instanceof Error ? e.message : e,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Load the collection's field types once, so custom meta / ACF\n\t\t\t// values can land in matching schema fields (created by the\n\t\t\t// prepare step or already present).\n\t\t\tlet fieldTypes = fieldTypesByCollection.get(collection);\n\t\t\tif (!fieldTypes) {\n\t\t\t\tfieldTypes = new Map<string, string>();\n\t\t\t\tconst collectionDef = await schemaRegistry.getCollection(collection);\n\t\t\t\tif (collectionDef) {\n\t\t\t\t\tfor (const field of await schemaRegistry.listFields(collectionDef.id)) {\n\t\t\t\t\t\tfieldTypes.set(field.slug, field.type);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfieldTypesByCollection.set(collection, fieldTypes);\n\t\t\t}\n\n\t\t\t// Generate slug from item slug or title\n\t\t\tconst slug = item.slug || slugify(item.title || `post-${item.sourceId}`);\n\n\t\t\t// Check if already exists (idempotency) — locale-aware lookup\n\t\t\tif (config.skipExisting) {\n\t\t\t\tconst existing = await contentRepo.findBySlug(collection, slug, item.locale);\n\t\t\t\tif (existing) {\n\t\t\t\t\t// Still track the translation group mapping for later items\n\t\t\t\t\tif (item.translationGroup) {\n\t\t\t\t\t\ttranslationGroupMap.set(item.translationGroup, existing.id);\n\t\t\t\t\t}\n\t\t\t\t\t// Menus and comments may reference this post even when we skip it\n\t\t\t\t\tconst wpId = Number(item.sourceId);\n\t\t\t\t\tif (Number.isFinite(wpId)) {\n\t\t\t\t\t\tcontentIdMap.set(wpId, existing.id);\n\t\t\t\t\t\tcollectionByWpId.set(wpId, collection);\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// Map WordPress status to EmDash status\n\t\t\tconst status = mapStatus(item.status);\n\n\t\t\t// Build data object - add all applicable fields\n\t\t\tconst data: Record<string, unknown> = {};\n\n\t\t\t// Add standard fields\n\t\t\tdata.title = item.title || \"Untitled\";\n\t\t\tdata.content = item.content;\n\n\t\t\tif (item.excerpt) {\n\t\t\t\tdata.excerpt = item.excerpt;\n\t\t\t}\n\t\t\tif (item.featuredImage) {\n\t\t\t\tdata.featured_image = item.featuredImage;\n\t\t\t\tconsole.log(\"[WP Plugin Import] Adding featured_image:\", item.featuredImage);\n\t\t\t}\n\n\t\t\t// Per-post SEO overrides from Yoast / Rank Math\n\t\t\tif (config.importSeo !== false) {\n\t\t\t\tconst seo = extractSeo(item);\n\t\t\t\tif (seo.title) {\n\t\t\t\t\tdata.seo_title = seo.title;\n\t\t\t\t}\n\t\t\t\tif (seo.description) {\n\t\t\t\t\tdata.seo_description = seo.description;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Map ACF values and custom meta onto schema fields with the same\n\t\t\t// (sanitized) slug — the same sanitization the analysis applied\n\t\t\t// when suggesting the fields, so keys like `event-date` land in\n\t\t\t// the `event_date` field the prepare step created. Values without\n\t\t\t// a matching field are dropped -- the user controls the schema,\n\t\t\t// we don't invent fields per meta key. Values are coerced to the\n\t\t\t// field's type (the analysis inferred it from ONE sample; real\n\t\t\t// values vary) and dropped when incoercible, so one odd meta\n\t\t\t// value can't fail the whole item.\n\t\t\tconst assignMetaValue = (key: string, value: unknown) => {\n\t\t\t\tif (value === null || value === \"\") return;\n\t\t\t\tconst fieldSlug = sanitizeFieldSlug(key);\n\t\t\t\tconst fieldType = fieldTypes.get(fieldSlug);\n\t\t\t\tif (!fieldType || fieldSlug in data) return;\n\t\t\t\tconst coerced = coerceToFieldType(value, fieldType);\n\t\t\t\tif (coerced !== undefined) {\n\t\t\t\t\tdata[fieldSlug] = coerced;\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst acf = item.meta?._acf;\n\t\t\tif (typeof acf === \"object\" && acf !== null) {\n\t\t\t\tfor (const [key, value] of Object.entries(acf)) {\n\t\t\t\t\tassignMetaValue(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (item.meta) {\n\t\t\t\tfor (const [key, value] of Object.entries(item.meta)) {\n\t\t\t\t\t// Underscore keys are WP-internal or handled above (_acf/_yoast/_rankmath)\n\t\t\t\t\tif (key.startsWith(\"_\")) continue;\n\t\t\t\t\tassignMetaValue(key, value);\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 && item.author) {\n\t\t\t\tconst mappedUserId = config.authorMappings[item.author];\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\titem.author,\n\t\t\t\titem.author, // display name fallback is the login\n\t\t\t\tauthorId,\n\t\t\t\tbylineRepo,\n\t\t\t\tbylineCache,\n\t\t\t);\n\n\t\t\t// Resolve translation link: if this item has a translationGroup and\n\t\t\t// we've already imported another item in the same group, link them.\n\t\t\tlet translationOf: string | undefined;\n\t\t\tif (item.translationGroup) {\n\t\t\t\tconst existingGroupItem = translationGroupMap.get(item.translationGroup);\n\t\t\t\tif (existingGroupItem) {\n\t\t\t\t\ttranslationOf = existingGroupItem;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Preserve original dates from the source\n\t\t\tconst itemDateTime = item.date?.getTime();\n\t\t\tconst createdAt =\n\t\t\t\titemDateTime !== undefined && !Number.isNaN(itemDateTime)\n\t\t\t\t\t? item.date.toISOString()\n\t\t\t\t\t: 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: item.locale,\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// eslint-disable-next-line typescript/no-unsafe-type-assertion -- create handler returns { item, _rev }\n\t\t\t\tconst createdData = createResult.data as { item?: { id?: string } } | undefined;\n\t\t\t\tconst createdId = createdData?.item?.id;\n\n\t\t\t\tif (createdId) {\n\t\t\t\t\tconst wpId = Number(item.sourceId);\n\t\t\t\t\tif (Number.isFinite(wpId)) {\n\t\t\t\t\t\tcontentIdMap.set(wpId, createdId);\n\t\t\t\t\t\tcollectionByWpId.set(wpId, collection);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Attach category/tag/custom-taxonomy assignments\n\t\t\t\t\tif (taxonomyPlan) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst attached = await attachPostTaxonomies(\n\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\tcreatedId,\n\t\t\t\t\t\t\t\ttoWxrAssignments(item),\n\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (attached > 0) {\n\t\t\t\t\t\t\t\tresult.taxonomyAssignments = (result.taxonomyAssignments ?? 0) + attached;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.warn(`[WP Plugin Import] Taxonomy attach failed for \"${slug}\":`, e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track translation group: first item in a group establishes the mapping\n\t\t\t\tif (item.translationGroup && !translationGroupMap.has(item.translationGroup) && createdId) {\n\t\t\t\t\ttranslationGroupMap.set(item.translationGroup, createdId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.errors.push({\n\t\t\t\t\ttitle: item.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 \"${item.title || \"Untitled\"}\":`, error);\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: item.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\tif (taxonomyPlan && taxonomyPlan.missingTaxonomies.length > 0) {\n\t\tresult.missingTaxonomies = taxonomyPlan.missingTaxonomies;\n\t}\n\n\tresult.success = result.errors.length === 0;\n\treturn { result, contentIdMap, collectionByWpId };\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.mts","names":[],"sources":["../../../../src/astro/routes/api/manifest.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"manifest.d.mts","names":[],"sources":["../../../../src/astro/routes/api/manifest.ts"],"mappings":";;;cAkBa,SAAA;AAAA,cAEA,GAAA,EAAK,QAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import "../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../types-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { t as
|
|
2
|
+
import "../../../types-CuW0zWDA.mjs";
|
|
3
|
+
import { t as OptionsRepository } from "../../../options-DTTML-Tx.mjs";
|
|
4
|
+
import { r as handleError } from "../../../error-CkAseSqZ.mjs";
|
|
5
|
+
import { n as VERSION, t as COMMIT } from "../../../version-CaccU7DM.mjs";
|
|
6
|
+
import { t as getAuthMode } from "../../../mode-BM9QgEmt.mjs";
|
|
6
7
|
|
|
7
8
|
//#region src/astro/routes/api/manifest.ts
|
|
8
9
|
const prerender = false;
|
|
@@ -11,7 +12,15 @@ const GET = async ({ locals }) => {
|
|
|
11
12
|
try {
|
|
12
13
|
const emdashManifest = emdash ? await emdash.getManifest() : null;
|
|
13
14
|
const authMode = getAuthMode(emdash?.config);
|
|
14
|
-
|
|
15
|
+
let adminBranding = emdash?.config?.admin;
|
|
16
|
+
if (!adminBranding?.siteName && emdash?.db) try {
|
|
17
|
+
const titles = await new OptionsRepository(emdash.db).getMany(["site:title", "emdash:site_title"]);
|
|
18
|
+
const siteTitle = titles.get("site:title") || titles.get("emdash:site_title");
|
|
19
|
+
if (siteTitle) adminBranding = {
|
|
20
|
+
...adminBranding,
|
|
21
|
+
siteName: siteTitle
|
|
22
|
+
};
|
|
23
|
+
} catch {}
|
|
15
24
|
let signupEnabled = false;
|
|
16
25
|
if (emdash?.db && authMode.type === "passkey") try {
|
|
17
26
|
const { sql } = await import("kysely");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.mjs","names":[],"sources":["../../../../src/astro/routes/api/manifest.ts"],"sourcesContent":["/**\n * Admin manifest endpoint - injected by EmDash integration\n *\n * GET /_emdash/api/manifest\n *\n * Returns the admin manifest with collection definitions and plugin info.\n * The manifest is generated from the user's live.config.ts at runtime.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { handleError } from \"#api/error.js\";\nimport { getAuthMode } from \"#auth/mode.js\";\n\nimport { COMMIT, VERSION } from \"../../../version.js\";\nimport type { EmDashManifest } from \"../../types.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ locals }) => {\n\tconst { emdash } = locals;\n\n\ttry {\n\t\t// Manifest is built fresh from the live database per admin request.\n\t\t// `requestCached` inside `getManifest` dedupes if multiple consumers\n\t\t// share the request. Wrapped in try/catch so any future DB-touching\n\t\t// additions to `getManifest()` (plugin manifest loading, marketplace\n\t\t// lookup, etc.) return the standard error envelope rather than an\n\t\t// unstructured 500 — matches the pattern used by the WP execute\n\t\t// routes.\n\t\tconst emdashManifest = emdash ? await emdash.getManifest() : null;\n\n\t\t// Determine auth mode from config\n\t\tconst authMode = getAuthMode(emdash?.config);\n\n\t\t// Read admin branding from the per-request config plumbed through middleware\n\t\t// (same source admin.astro reads from). Reading from a build-time global\n\t\t// here was unreliable -- the virtual config module exports the config but\n\t\t// doesn't assign it to globalThis, so getStoredConfig() always returned\n\t\t// null and the React SPA never received custom logo/siteName/favicon.\n\t\t// See issue #835.\n\t\
|
|
1
|
+
{"version":3,"file":"manifest.mjs","names":[],"sources":["../../../../src/astro/routes/api/manifest.ts"],"sourcesContent":["/**\n * Admin manifest endpoint - injected by EmDash integration\n *\n * GET /_emdash/api/manifest\n *\n * Returns the admin manifest with collection definitions and plugin info.\n * The manifest is generated from the user's live.config.ts at runtime.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { handleError } from \"#api/error.js\";\nimport { getAuthMode } from \"#auth/mode.js\";\nimport { OptionsRepository } from \"#db/repositories/options.js\";\n\nimport { COMMIT, VERSION } from \"../../../version.js\";\nimport type { EmDashManifest } from \"../../types.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ locals }) => {\n\tconst { emdash } = locals;\n\n\ttry {\n\t\t// Manifest is built fresh from the live database per admin request.\n\t\t// `requestCached` inside `getManifest` dedupes if multiple consumers\n\t\t// share the request. Wrapped in try/catch so any future DB-touching\n\t\t// additions to `getManifest()` (plugin manifest loading, marketplace\n\t\t// lookup, etc.) return the standard error envelope rather than an\n\t\t// unstructured 500 — matches the pattern used by the WP execute\n\t\t// routes.\n\t\tconst emdashManifest = emdash ? await emdash.getManifest() : null;\n\n\t\t// Determine auth mode from config\n\t\tconst authMode = getAuthMode(emdash?.config);\n\n\t\t// Read admin branding from the per-request config plumbed through middleware\n\t\t// (same source admin.astro reads from). Reading from a build-time global\n\t\t// here was unreliable -- the virtual config module exports the config but\n\t\t// doesn't assign it to globalThis, so getStoredConfig() always returned\n\t\t// null and the React SPA never received custom logo/siteName/favicon.\n\t\t// See issue #835.\n\t\tlet adminBranding = emdash?.config?.admin;\n\n\t\t// When no build-time `admin.siteName` is configured, brand the admin with\n\t\t// the site's own title so multi-site operators can tell backends apart\n\t\t// (WordPress-style: wp-admin always shows the site name). Precedence:\n\t\t// explicit `admin.siteName` → Site Title (Settings → General) → the title\n\t\t// captured by the setup wizard → the bundled \"EmDash\" default in the SPA.\n\t\tif (!adminBranding?.siteName && emdash?.db) {\n\t\t\ttry {\n\t\t\t\tconst options = new OptionsRepository(emdash.db);\n\t\t\t\tconst titles = await options.getMany<string>([\"site:title\", \"emdash:site_title\"]);\n\t\t\t\tconst siteTitle = titles.get(\"site:title\") || titles.get(\"emdash:site_title\");\n\t\t\t\tif (siteTitle) {\n\t\t\t\t\tadminBranding = { ...adminBranding, siteName: siteTitle };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// options table may not exist yet (pre-setup) — keep the default.\n\t\t\t}\n\t\t}\n\n\t\t// Check if self-signup is enabled (any allowed domain with enabled = 1)\n\t\t// Only relevant for passkey auth — external auth providers handle their own signup\n\t\tlet signupEnabled = false;\n\t\tif (emdash?.db && authMode.type === \"passkey\") {\n\t\t\ttry {\n\t\t\t\tconst { sql } = await import(\"kysely\");\n\t\t\t\tconst result = await sql<{ cnt: unknown }>`\n\t\t\t\t\tSELECT COUNT(*) as cnt FROM allowed_domains WHERE enabled = 1\n\t\t\t\t`.execute(emdash.db);\n\t\t\t\tsignupEnabled = Number(result.rows[0]?.cnt ?? 0) > 0;\n\t\t\t} catch {\n\t\t\t\t// Table may not exist yet, that's fine\n\t\t\t}\n\t\t}\n\n\t\tconst manifest: EmDashManifest = emdashManifest\n\t\t\t? {\n\t\t\t\t\t...emdashManifest,\n\t\t\t\t\tauthMode: authMode.type === \"external\" ? authMode.providerType : \"passkey\",\n\t\t\t\t\tsignupEnabled,\n\t\t\t\t\tadmin: adminBranding,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tversion: VERSION,\n\t\t\t\t\tcommit: COMMIT,\n\t\t\t\t\thash: \"default\",\n\t\t\t\t\tcollections: {},\n\t\t\t\t\tplugins: {},\n\t\t\t\t\ttaxonomies: [],\n\t\t\t\t\tauthMode: \"passkey\",\n\t\t\t\t\tsignupEnabled,\n\t\t\t\t\tadmin: adminBranding,\n\t\t\t\t};\n\n\t\treturn Response.json(\n\t\t\t{ data: manifest },\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Cache-Control\": \"private, no-store\",\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to build manifest\", \"MANIFEST_BUILD_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;AAkBA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,aAAa;CAClD,MAAM,EAAE,WAAW;AAEnB,KAAI;EAQH,MAAM,iBAAiB,SAAS,MAAM,OAAO,aAAa,GAAG;EAG7D,MAAM,WAAW,YAAY,QAAQ,OAAO;EAQ5C,IAAI,gBAAgB,QAAQ,QAAQ;AAOpC,MAAI,CAAC,eAAe,YAAY,QAAQ,GACvC,KAAI;GAEH,MAAM,SAAS,MADC,IAAI,kBAAkB,OAAO,GAAG,CACnB,QAAgB,CAAC,cAAc,oBAAoB,CAAC;GACjF,MAAM,YAAY,OAAO,IAAI,aAAa,IAAI,OAAO,IAAI,oBAAoB;AAC7E,OAAI,UACH,iBAAgB;IAAE,GAAG;IAAe,UAAU;IAAW;UAEnD;EAOT,IAAI,gBAAgB;AACpB,MAAI,QAAQ,MAAM,SAAS,SAAS,UACnC,KAAI;GACH,MAAM,EAAE,QAAQ,MAAM,OAAO;GAC7B,MAAM,SAAS,MAAM,GAAqB;;MAExC,QAAQ,OAAO,GAAG;AACpB,mBAAgB,OAAO,OAAO,KAAK,IAAI,OAAO,EAAE,GAAG;UAC5C;EAKT,MAAM,WAA2B,iBAC9B;GACA,GAAG;GACH,UAAU,SAAS,SAAS,aAAa,SAAS,eAAe;GACjE;GACA,OAAO;GACP,GACA;GACA,SAAS;GACT,QAAQ;GACR,MAAM;GACN,aAAa,EAAE;GACf,SAAS,EAAE;GACX,YAAY,EAAE;GACd,UAAU;GACV;GACA,OAAO;GACP;AAEH,SAAO,SAAS,KACf,EAAE,MAAM,UAAU,EAClB,EACC,SAAS,EACR,iBAAiB,qBACjB,EACD,CACD;UACO,OAAO;AACf,SAAO,YAAY,OAAO,4BAA4B,uBAAuB"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../types-
|
|
3
|
-
import { t as apiError } from "../../../error-
|
|
4
|
-
import { Dn as contentBylineInputSchema, Tn as bylineUpdateBody, un as contentSeoInput, yn as bylineCreateBody } from "../../../redirects-
|
|
5
|
-
import "../../../byline-fields-
|
|
6
|
-
import "../../../status-
|
|
2
|
+
import "../../../types-CuW0zWDA.mjs";
|
|
3
|
+
import { t as apiError } from "../../../error-CkAseSqZ.mjs";
|
|
4
|
+
import { Dn as contentBylineInputSchema, Tn as bylineUpdateBody, un as contentSeoInput, yn as bylineCreateBody } from "../../../redirects-DXEXBAII.mjs";
|
|
5
|
+
import "../../../byline-fields-2Lp5Hbgf.mjs";
|
|
6
|
+
import "../../../status-CqJQX1QN.mjs";
|
|
7
7
|
import "../../../api/schemas/index.mjs";
|
|
8
|
-
import { i as hasScope } from "../../../api-tokens-
|
|
9
|
-
import { n as convertDataForWrite, t as convertDataForRead } from "../../../portable-text-
|
|
8
|
+
import { i as hasScope } from "../../../api-tokens-DsvvCtdh.mjs";
|
|
9
|
+
import { n as convertDataForWrite, t as convertDataForRead } from "../../../portable-text-cCa0cGV6.mjs";
|
|
10
10
|
import { z } from "zod";
|
|
11
11
|
import { Role, canActOnOwn, hasPermission } from "@emdash-cms/auth";
|
|
12
12
|
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
@@ -157,7 +157,7 @@ function getEmDash(extra) {
|
|
|
157
157
|
}
|
|
158
158
|
async function getCollectionFields(ec, collection) {
|
|
159
159
|
try {
|
|
160
|
-
const { SchemaRegistry } = await import("../../../schema-
|
|
160
|
+
const { SchemaRegistry } = await import("../../../schema-Blhoxp3P.mjs").then((n) => n.t);
|
|
161
161
|
const col = await new SchemaRegistry(ec.db).getCollectionWithFields(collection);
|
|
162
162
|
return col ? col.fields : null;
|
|
163
163
|
} catch {
|
|
@@ -186,7 +186,7 @@ async function applyReadMarkdown(ec, collection, items) {
|
|
|
186
186
|
for (const item of items) if (item.data && typeof item.data === "object") item.data = convertDataForRead(item.data, fields, false);
|
|
187
187
|
}
|
|
188
188
|
async function invalidateBylines() {
|
|
189
|
-
const { invalidateBylineCache } = await import("../../../bylines-
|
|
189
|
+
const { invalidateBylineCache } = await import("../../../bylines-Woq87129.mjs").then((n) => n.t);
|
|
190
190
|
invalidateBylineCache();
|
|
191
191
|
}
|
|
192
192
|
/**
|
|
@@ -701,7 +701,7 @@ function createMcpServer() {
|
|
|
701
701
|
requireScope(extra, "content:read");
|
|
702
702
|
const ec = getEmDash(extra);
|
|
703
703
|
try {
|
|
704
|
-
const { BylineRepository } = await import("../../../byline-
|
|
704
|
+
const { BylineRepository } = await import("../../../byline-Bm8ZgUP9.mjs").then((n) => n.n);
|
|
705
705
|
return jsonResult(await new BylineRepository(ec.db).findMany({
|
|
706
706
|
search: args.search,
|
|
707
707
|
isGuest: args.isGuest,
|
|
@@ -723,7 +723,7 @@ function createMcpServer() {
|
|
|
723
723
|
requireScope(extra, "content:read");
|
|
724
724
|
const ec = getEmDash(extra);
|
|
725
725
|
try {
|
|
726
|
-
const { BylineRepository } = await import("../../../byline-
|
|
726
|
+
const { BylineRepository } = await import("../../../byline-Bm8ZgUP9.mjs").then((n) => n.n);
|
|
727
727
|
const byline = await new BylineRepository(ec.db).findById(args.id);
|
|
728
728
|
if (!byline) return respondError("NOT_FOUND", `Byline '${args.id}' not found`);
|
|
729
729
|
return jsonResult(byline);
|
|
@@ -741,7 +741,7 @@ function createMcpServer() {
|
|
|
741
741
|
requireRole(extra, Role.EDITOR);
|
|
742
742
|
const ec = getEmDash(extra);
|
|
743
743
|
try {
|
|
744
|
-
const { handleBylineCreate } = await import("../../../bylines-
|
|
744
|
+
const { handleBylineCreate } = await import("../../../bylines-6tm9mgQb.mjs").then((n) => n.t);
|
|
745
745
|
const result = await handleBylineCreate(ec.db, args);
|
|
746
746
|
if (result.success) await invalidateBylines();
|
|
747
747
|
return unwrap(result);
|
|
@@ -761,7 +761,7 @@ function createMcpServer() {
|
|
|
761
761
|
requireRole(extra, Role.EDITOR);
|
|
762
762
|
const ec = getEmDash(extra);
|
|
763
763
|
try {
|
|
764
|
-
const { handleBylineUpdate } = await import("../../../bylines-
|
|
764
|
+
const { handleBylineUpdate } = await import("../../../bylines-6tm9mgQb.mjs").then((n) => n.t);
|
|
765
765
|
const { id, ...input } = args;
|
|
766
766
|
const result = await handleBylineUpdate(ec.db, id, input);
|
|
767
767
|
if (result.success) await invalidateBylines();
|
|
@@ -780,7 +780,7 @@ function createMcpServer() {
|
|
|
780
780
|
requireRole(extra, Role.EDITOR);
|
|
781
781
|
const ec = getEmDash(extra);
|
|
782
782
|
try {
|
|
783
|
-
const { BylineRepository } = await import("../../../byline-
|
|
783
|
+
const { BylineRepository } = await import("../../../byline-Bm8ZgUP9.mjs").then((n) => n.n);
|
|
784
784
|
if (!await new BylineRepository(ec.db).delete(args.id)) return respondError("NOT_FOUND", `Byline '${args.id}' not found`);
|
|
785
785
|
await invalidateBylines();
|
|
786
786
|
return jsonResult({ deleted: args.id });
|
|
@@ -797,7 +797,7 @@ function createMcpServer() {
|
|
|
797
797
|
requireScope(extra, "content:read");
|
|
798
798
|
const ec = getEmDash(extra);
|
|
799
799
|
try {
|
|
800
|
-
const { handleBylineTranslations } = await import("../../../bylines-
|
|
800
|
+
const { handleBylineTranslations } = await import("../../../bylines-6tm9mgQb.mjs").then((n) => n.t);
|
|
801
801
|
return unwrap(await handleBylineTranslations(ec.db, args.id));
|
|
802
802
|
} catch (error) {
|
|
803
803
|
return respondHandlerError(error, "BYLINE_TRANSLATIONS_ERROR");
|
|
@@ -813,7 +813,7 @@ function createMcpServer() {
|
|
|
813
813
|
requireRole(extra, Role.EDITOR);
|
|
814
814
|
const ec = getEmDash(extra);
|
|
815
815
|
try {
|
|
816
|
-
const { SchemaRegistry } = await import("../../../schema-
|
|
816
|
+
const { SchemaRegistry } = await import("../../../schema-Blhoxp3P.mjs").then((n) => n.t);
|
|
817
817
|
return jsonResult({ items: await new SchemaRegistry(ec.db).listCollections() });
|
|
818
818
|
} catch (error) {
|
|
819
819
|
return respondHandlerError(error, "SCHEMA_LIST_ERROR");
|
|
@@ -829,7 +829,7 @@ function createMcpServer() {
|
|
|
829
829
|
requireRole(extra, Role.EDITOR);
|
|
830
830
|
const ec = getEmDash(extra);
|
|
831
831
|
try {
|
|
832
|
-
const { SchemaRegistry } = await import("../../../schema-
|
|
832
|
+
const { SchemaRegistry } = await import("../../../schema-Blhoxp3P.mjs").then((n) => n.t);
|
|
833
833
|
const collection = await new SchemaRegistry(ec.db).getCollectionWithFields(args.slug);
|
|
834
834
|
if (!collection) return respondError("NOT_FOUND", `Collection '${args.slug}' not found`);
|
|
835
835
|
return jsonResult(collection);
|
|
@@ -859,7 +859,7 @@ function createMcpServer() {
|
|
|
859
859
|
requireRole(extra, Role.ADMIN);
|
|
860
860
|
const ec = getEmDash(extra);
|
|
861
861
|
try {
|
|
862
|
-
const { SchemaRegistry } = await import("../../../schema-
|
|
862
|
+
const { SchemaRegistry } = await import("../../../schema-Blhoxp3P.mjs").then((n) => n.t);
|
|
863
863
|
const collection = await new SchemaRegistry(ec.db).createCollection({
|
|
864
864
|
slug: args.slug,
|
|
865
865
|
label: args.label,
|
|
@@ -887,7 +887,7 @@ function createMcpServer() {
|
|
|
887
887
|
requireRole(extra, Role.ADMIN);
|
|
888
888
|
const ec = getEmDash(extra);
|
|
889
889
|
try {
|
|
890
|
-
const { SchemaRegistry } = await import("../../../schema-
|
|
890
|
+
const { SchemaRegistry } = await import("../../../schema-Blhoxp3P.mjs").then((n) => n.t);
|
|
891
891
|
await new SchemaRegistry(ec.db).deleteCollection(args.slug, { force: args.force });
|
|
892
892
|
ec.invalidateUrlPatternCache();
|
|
893
893
|
return jsonResult({ deleted: args.slug });
|
|
@@ -941,7 +941,7 @@ function createMcpServer() {
|
|
|
941
941
|
requireRole(extra, Role.ADMIN);
|
|
942
942
|
const ec = getEmDash(extra);
|
|
943
943
|
try {
|
|
944
|
-
const { SchemaRegistry } = await import("../../../schema-
|
|
944
|
+
const { SchemaRegistry } = await import("../../../schema-Blhoxp3P.mjs").then((n) => n.t);
|
|
945
945
|
return jsonResult(await new SchemaRegistry(ec.db).createField(args.collection, {
|
|
946
946
|
slug: args.slug,
|
|
947
947
|
label: args.label,
|
|
@@ -971,7 +971,7 @@ function createMcpServer() {
|
|
|
971
971
|
requireRole(extra, Role.ADMIN);
|
|
972
972
|
const ec = getEmDash(extra);
|
|
973
973
|
try {
|
|
974
|
-
const { SchemaRegistry } = await import("../../../schema-
|
|
974
|
+
const { SchemaRegistry } = await import("../../../schema-Blhoxp3P.mjs").then((n) => n.t);
|
|
975
975
|
await new SchemaRegistry(ec.db).deleteField(args.collection, args.fieldSlug);
|
|
976
976
|
return jsonResult({
|
|
977
977
|
deleted: args.fieldSlug,
|
|
@@ -1092,7 +1092,7 @@ function createMcpServer() {
|
|
|
1092
1092
|
requireScope(extra, "content:read");
|
|
1093
1093
|
const ec = getEmDash(extra);
|
|
1094
1094
|
try {
|
|
1095
|
-
const { searchWithDb } = await import("../../../search-
|
|
1095
|
+
const { searchWithDb } = await import("../../../search-DZN2HZ-V.mjs").then((n) => n.t);
|
|
1096
1096
|
return jsonResult(await searchWithDb(ec.db, args.query, {
|
|
1097
1097
|
collections: args.collections,
|
|
1098
1098
|
locale: args.locale,
|
|
@@ -1111,7 +1111,7 @@ function createMcpServer() {
|
|
|
1111
1111
|
requireScope(extra, "content:read");
|
|
1112
1112
|
const ec = getEmDash(extra);
|
|
1113
1113
|
try {
|
|
1114
|
-
const { handleTaxonomyList } = await import("../../../taxonomies-
|
|
1114
|
+
const { handleTaxonomyList } = await import("../../../taxonomies-BGBd16Eu.mjs").then((n) => n.l);
|
|
1115
1115
|
return unwrap(await handleTaxonomyList(ec.db, { locale: args.locale }));
|
|
1116
1116
|
} catch (error) {
|
|
1117
1117
|
return respondHandlerError(error, "TAXONOMY_LIST_ERROR");
|
|
@@ -1131,12 +1131,12 @@ function createMcpServer() {
|
|
|
1131
1131
|
requireScope(extra, "content:read");
|
|
1132
1132
|
const ec = getEmDash(extra);
|
|
1133
1133
|
try {
|
|
1134
|
-
const { handleTaxonomyList } = await import("../../../taxonomies-
|
|
1134
|
+
const { handleTaxonomyList } = await import("../../../taxonomies-BGBd16Eu.mjs").then((n) => n.l);
|
|
1135
1135
|
const listResult = await handleTaxonomyList(ec.db, { locale: args.locale });
|
|
1136
1136
|
if (!listResult.success) return unwrap(listResult);
|
|
1137
1137
|
if (!listResult.data.taxonomies.find((t) => t.name === args.taxonomy)) return respondError("NOT_FOUND", `Taxonomy '${args.taxonomy}' not found`);
|
|
1138
|
-
const { TaxonomyRepository } = await import("../../../taxonomy-
|
|
1139
|
-
const { decodeCursor, encodeCursor, InvalidCursorError } = await import("../../../types-
|
|
1138
|
+
const { TaxonomyRepository } = await import("../../../taxonomy-BxGxZZdu.mjs").then((n) => n.n);
|
|
1139
|
+
const { decodeCursor, encodeCursor, InvalidCursorError } = await import("../../../types-CuW0zWDA.mjs").then((n) => n.o);
|
|
1140
1140
|
const repo = new TaxonomyRepository(ec.db);
|
|
1141
1141
|
const limit = Math.min(args.limit ?? 50, 100);
|
|
1142
1142
|
const terms = await repo.findByName(args.taxonomy, { locale: args.locale });
|
|
@@ -1190,7 +1190,7 @@ function createMcpServer() {
|
|
|
1190
1190
|
requireRole(extra, Role.EDITOR);
|
|
1191
1191
|
const ec = getEmDash(extra);
|
|
1192
1192
|
try {
|
|
1193
|
-
const { handleTermCreate } = await import("../../../taxonomies-
|
|
1193
|
+
const { handleTermCreate } = await import("../../../taxonomies-BGBd16Eu.mjs").then((n) => n.l);
|
|
1194
1194
|
return unwrap(await handleTermCreate(ec.db, args.taxonomy, {
|
|
1195
1195
|
slug: args.slug,
|
|
1196
1196
|
label: args.label,
|
|
@@ -1219,7 +1219,7 @@ function createMcpServer() {
|
|
|
1219
1219
|
requireRole(extra, Role.EDITOR);
|
|
1220
1220
|
const ec = getEmDash(extra);
|
|
1221
1221
|
try {
|
|
1222
|
-
const { handleTermUpdate } = await import("../../../taxonomies-
|
|
1222
|
+
const { handleTermUpdate } = await import("../../../taxonomies-BGBd16Eu.mjs").then((n) => n.l);
|
|
1223
1223
|
return unwrap(await handleTermUpdate(ec.db, args.taxonomy, args.termSlug, {
|
|
1224
1224
|
slug: args.slug,
|
|
1225
1225
|
label: args.label,
|
|
@@ -1243,7 +1243,7 @@ function createMcpServer() {
|
|
|
1243
1243
|
requireRole(extra, Role.EDITOR);
|
|
1244
1244
|
const ec = getEmDash(extra);
|
|
1245
1245
|
try {
|
|
1246
|
-
const { handleTermDelete } = await import("../../../taxonomies-
|
|
1246
|
+
const { handleTermDelete } = await import("../../../taxonomies-BGBd16Eu.mjs").then((n) => n.l);
|
|
1247
1247
|
return unwrap(await handleTermDelete(ec.db, args.taxonomy, args.termSlug));
|
|
1248
1248
|
} catch (error) {
|
|
1249
1249
|
return respondHandlerError(error, "TAXONOMY_TERM_DELETE_ERROR");
|
|
@@ -1258,7 +1258,7 @@ function createMcpServer() {
|
|
|
1258
1258
|
requireScope(extra, "content:read");
|
|
1259
1259
|
const ec = getEmDash(extra);
|
|
1260
1260
|
try {
|
|
1261
|
-
const { handleTermTranslations } = await import("../../../taxonomies-
|
|
1261
|
+
const { handleTermTranslations } = await import("../../../taxonomies-BGBd16Eu.mjs").then((n) => n.l);
|
|
1262
1262
|
return unwrap(await handleTermTranslations(ec.db, args.id));
|
|
1263
1263
|
} catch (error) {
|
|
1264
1264
|
return respondHandlerError(error, "TERM_TRANSLATIONS_ERROR");
|
|
@@ -1273,7 +1273,7 @@ function createMcpServer() {
|
|
|
1273
1273
|
requireScope(extra, "content:read");
|
|
1274
1274
|
const ec = getEmDash(extra);
|
|
1275
1275
|
try {
|
|
1276
|
-
const { handleMenuList } = await import("../../../menus-
|
|
1276
|
+
const { handleMenuList } = await import("../../../menus-Cfivc2Ad.mjs").then((n) => n.d);
|
|
1277
1277
|
return unwrap(await handleMenuList(ec.db, { locale: args.locale }));
|
|
1278
1278
|
} catch (error) {
|
|
1279
1279
|
return respondHandlerError(error, "MENU_LIST_ERROR");
|
|
@@ -1291,7 +1291,7 @@ function createMcpServer() {
|
|
|
1291
1291
|
requireScope(extra, "content:read");
|
|
1292
1292
|
const ec = getEmDash(extra);
|
|
1293
1293
|
try {
|
|
1294
|
-
const { handleMenuGet } = await import("../../../menus-
|
|
1294
|
+
const { handleMenuGet } = await import("../../../menus-Cfivc2Ad.mjs").then((n) => n.d);
|
|
1295
1295
|
return unwrap(await handleMenuGet(ec.db, args.name, { locale: args.locale }));
|
|
1296
1296
|
} catch (error) {
|
|
1297
1297
|
return respondHandlerError(error, "MENU_GET_ERROR");
|
|
@@ -1306,7 +1306,7 @@ function createMcpServer() {
|
|
|
1306
1306
|
requireScope(extra, "content:read");
|
|
1307
1307
|
const ec = getEmDash(extra);
|
|
1308
1308
|
try {
|
|
1309
|
-
const { handleMenuTranslations } = await import("../../../menus-
|
|
1309
|
+
const { handleMenuTranslations } = await import("../../../menus-Cfivc2Ad.mjs").then((n) => n.d);
|
|
1310
1310
|
return unwrap(await handleMenuTranslations(ec.db, args.id));
|
|
1311
1311
|
} catch (error) {
|
|
1312
1312
|
return respondHandlerError(error, "MENU_TRANSLATIONS_ERROR");
|
|
@@ -1326,7 +1326,7 @@ function createMcpServer() {
|
|
|
1326
1326
|
requireRole(extra, Role.EDITOR);
|
|
1327
1327
|
const ec = getEmDash(extra);
|
|
1328
1328
|
try {
|
|
1329
|
-
const { handleMenuCreate } = await import("../../../menus-
|
|
1329
|
+
const { handleMenuCreate } = await import("../../../menus-Cfivc2Ad.mjs").then((n) => n.d);
|
|
1330
1330
|
return unwrap(await handleMenuCreate(ec.db, {
|
|
1331
1331
|
name: args.name,
|
|
1332
1332
|
label: args.label,
|
|
@@ -1350,7 +1350,7 @@ function createMcpServer() {
|
|
|
1350
1350
|
requireRole(extra, Role.EDITOR);
|
|
1351
1351
|
const ec = getEmDash(extra);
|
|
1352
1352
|
try {
|
|
1353
|
-
const { handleMenuUpdate } = await import("../../../menus-
|
|
1353
|
+
const { handleMenuUpdate } = await import("../../../menus-Cfivc2Ad.mjs").then((n) => n.d);
|
|
1354
1354
|
return unwrap(await handleMenuUpdate(ec.db, args.name, {
|
|
1355
1355
|
label: args.label,
|
|
1356
1356
|
locale: args.locale
|
|
@@ -1372,7 +1372,7 @@ function createMcpServer() {
|
|
|
1372
1372
|
requireRole(extra, Role.EDITOR);
|
|
1373
1373
|
const ec = getEmDash(extra);
|
|
1374
1374
|
try {
|
|
1375
|
-
const { handleMenuDelete } = await import("../../../menus-
|
|
1375
|
+
const { handleMenuDelete } = await import("../../../menus-Cfivc2Ad.mjs").then((n) => n.d);
|
|
1376
1376
|
return unwrap(await handleMenuDelete(ec.db, args.name, { locale: args.locale }));
|
|
1377
1377
|
} catch (error) {
|
|
1378
1378
|
return respondHandlerError(error, "MENU_DELETE_ERROR");
|
|
@@ -1407,7 +1407,7 @@ function createMcpServer() {
|
|
|
1407
1407
|
requireRole(extra, Role.EDITOR);
|
|
1408
1408
|
const ec = getEmDash(extra);
|
|
1409
1409
|
try {
|
|
1410
|
-
const { handleMenuSetItems } = await import("../../../menus-
|
|
1410
|
+
const { handleMenuSetItems } = await import("../../../menus-Cfivc2Ad.mjs").then((n) => n.d);
|
|
1411
1411
|
return unwrap(await handleMenuSetItems(ec.db, args.name, args.items, { locale: args.locale }));
|
|
1412
1412
|
} catch (error) {
|
|
1413
1413
|
return respondHandlerError(error, "MENU_SET_ITEMS_ERROR");
|
|
@@ -1454,7 +1454,7 @@ function createMcpServer() {
|
|
|
1454
1454
|
requireRole(extra, Role.EDITOR);
|
|
1455
1455
|
const ec = getEmDash(extra);
|
|
1456
1456
|
try {
|
|
1457
|
-
const { handleSettingsGet } = await import("../../../settings-
|
|
1457
|
+
const { handleSettingsGet } = await import("../../../settings-rZyHEcNT.mjs").then((n) => n.r);
|
|
1458
1458
|
return unwrap(await handleSettingsGet(ec.db, ec.storage));
|
|
1459
1459
|
} catch (error) {
|
|
1460
1460
|
return respondHandlerError(error, "SETTINGS_READ_ERROR");
|
|
@@ -1480,7 +1480,7 @@ function createMcpServer() {
|
|
|
1480
1480
|
requireRole(extra, Role.ADMIN);
|
|
1481
1481
|
const ec = getEmDash(extra);
|
|
1482
1482
|
try {
|
|
1483
|
-
const { handleSettingsUpdate } = await import("../../../settings-
|
|
1483
|
+
const { handleSettingsUpdate } = await import("../../../settings-rZyHEcNT.mjs").then((n) => n.r);
|
|
1484
1484
|
return unwrap(await handleSettingsUpdate(ec.db, ec.storage, args));
|
|
1485
1485
|
} catch (error) {
|
|
1486
1486
|
return respondHandlerError(error, "SETTINGS_UPDATE_ERROR");
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import "../../../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../../../types-
|
|
2
|
+
import "../../../../../types-CuW0zWDA.mjs";
|
|
3
3
|
import { t as enrichImageMetadata } from "../../../../../enrich-BQ0mxJRs.mjs";
|
|
4
|
-
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-
|
|
5
|
-
import { r as parseOptionalBody, t as isParseError } from "../../../../../parse-
|
|
6
|
-
import { Ht as mediaConfirmBody } from "../../../../../redirects-
|
|
7
|
-
import "../../../../../byline-fields-
|
|
8
|
-
import "../../../../../status-
|
|
4
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CkAseSqZ.mjs";
|
|
5
|
+
import { r as parseOptionalBody, t as isParseError } from "../../../../../parse-GmjecGct.mjs";
|
|
6
|
+
import { Ht as mediaConfirmBody } from "../../../../../redirects-DXEXBAII.mjs";
|
|
7
|
+
import "../../../../../byline-fields-2Lp5Hbgf.mjs";
|
|
8
|
+
import "../../../../../status-CqJQX1QN.mjs";
|
|
9
9
|
import "../../../../../api/schemas/index.mjs";
|
|
10
|
-
import { n as requirePerm, t as requireOwnerPerm } from "../../../../../authorize-
|
|
10
|
+
import { n as requirePerm, t as requireOwnerPerm } from "../../../../../authorize-Dz88F_Fw.mjs";
|
|
11
11
|
import { MediaRepository } from "emdash";
|
|
12
12
|
|
|
13
13
|
//#region src/astro/routes/api/media/[id]/confirm.ts
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "../../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../../types-
|
|
3
|
-
import { a as unwrapResult, r as handleError, t as apiError } from "../../../../error-
|
|
4
|
-
import { n as parseBody, t as isParseError } from "../../../../parse-
|
|
5
|
-
import { Xt as mediaUpdateBody } from "../../../../redirects-
|
|
6
|
-
import "../../../../byline-fields-
|
|
7
|
-
import "../../../../status-
|
|
2
|
+
import "../../../../types-CuW0zWDA.mjs";
|
|
3
|
+
import { a as unwrapResult, r as handleError, t as apiError } from "../../../../error-CkAseSqZ.mjs";
|
|
4
|
+
import { n as parseBody, t as isParseError } from "../../../../parse-GmjecGct.mjs";
|
|
5
|
+
import { Xt as mediaUpdateBody } from "../../../../redirects-DXEXBAII.mjs";
|
|
6
|
+
import "../../../../byline-fields-2Lp5Hbgf.mjs";
|
|
7
|
+
import "../../../../status-CqJQX1QN.mjs";
|
|
8
8
|
import "../../../../api/schemas/index.mjs";
|
|
9
|
-
import { n as requirePerm, t as requireOwnerPerm } from "../../../../authorize-
|
|
9
|
+
import { n as requirePerm, t as requireOwnerPerm } from "../../../../authorize-Dz88F_Fw.mjs";
|
|
10
10
|
|
|
11
11
|
//#region src/astro/routes/api/media/[id].ts
|
|
12
12
|
const prerender = false;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "../../../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../../../types-
|
|
3
|
-
import { r as handleError, t as apiError } from "../../../../../error-
|
|
2
|
+
import "../../../../../types-CuW0zWDA.mjs";
|
|
3
|
+
import { r as handleError, t as apiError } from "../../../../../error-CkAseSqZ.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/astro/routes/api/media/file/[...key].ts
|
|
6
6
|
const prerender = false;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../../../../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../../../../types-
|
|
3
|
-
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-
|
|
4
|
-
import { n as requirePerm } from "../../../../../../authorize-
|
|
2
|
+
import "../../../../../../types-CuW0zWDA.mjs";
|
|
3
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-CkAseSqZ.mjs";
|
|
4
|
+
import { n as requirePerm } from "../../../../../../authorize-Dz88F_Fw.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/astro/routes/api/media/providers/[providerId]/[itemId].ts
|
|
7
7
|
const prerender = false;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../../../../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../../../../types-
|
|
3
|
-
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-
|
|
4
|
-
import { n as requirePerm } from "../../../../../../authorize-
|
|
2
|
+
import "../../../../../../types-CuW0zWDA.mjs";
|
|
3
|
+
import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-CkAseSqZ.mjs";
|
|
4
|
+
import { n as requirePerm } from "../../../../../../authorize-Dz88F_Fw.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/astro/routes/api/media/providers/[providerId]/index.ts
|
|
7
7
|
const prerender = false;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../../../../../base64-CmWvODNW.mjs";
|
|
2
|
-
import "../../../../../types-
|
|
3
|
-
import { n as apiSuccess, t as apiError } from "../../../../../error-
|
|
4
|
-
import { n as requirePerm } from "../../../../../authorize-
|
|
2
|
+
import "../../../../../types-CuW0zWDA.mjs";
|
|
3
|
+
import { n as apiSuccess, t as apiError } from "../../../../../error-CkAseSqZ.mjs";
|
|
4
|
+
import { n as requirePerm } from "../../../../../authorize-Dz88F_Fw.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/astro/routes/api/media/providers/index.ts
|
|
7
7
|
const prerender = false;
|