emdash 0.27.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.
Files changed (534) hide show
  1. package/dist/{adapters-u037EnTR.d.mts → adapters-hUy8vOB-.d.mts} +1 -1
  2. package/dist/{adapters-u037EnTR.d.mts.map → adapters-hUy8vOB-.d.mts.map} +1 -1
  3. package/dist/{allowed-origins-D5FxMUo8.mjs → allowed-origins-CRsJ6BPM.mjs} +2 -2
  4. package/dist/{allowed-origins-D5FxMUo8.mjs.map → allowed-origins-CRsJ6BPM.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.mjs +17 -16
  7. package/dist/api/route-utils.mjs.map +1 -1
  8. package/dist/api/schemas/index.d.mts +1 -1
  9. package/dist/api/schemas/index.mjs +3 -3
  10. package/dist/{api-80kycR9o.mjs → api-BFURZn1i.mjs} +33 -23
  11. package/dist/api-BFURZn1i.mjs.map +1 -0
  12. package/dist/{api-tokens-D6ppjIVi.mjs → api-tokens-DvqeZmVq.mjs} +2 -2
  13. package/dist/{api-tokens-D6ppjIVi.mjs.map → api-tokens-DvqeZmVq.mjs.map} +1 -1
  14. package/dist/{apply-DSypk6Iu.mjs → apply-Bu-8nYHL.mjs} +111 -74
  15. package/dist/apply-Bu-8nYHL.mjs.map +1 -0
  16. package/dist/astro/index.d.mts +12 -12
  17. package/dist/astro/index.mjs +3 -3
  18. package/dist/astro/index.mjs.map +1 -1
  19. package/dist/astro/middleware/auth.d.mts +10 -10
  20. package/dist/astro/middleware/auth.d.mts.map +1 -1
  21. package/dist/astro/middleware/auth.mjs +50 -11
  22. package/dist/astro/middleware/auth.mjs.map +1 -1
  23. package/dist/astro/middleware/redirect.mjs +5 -5
  24. package/dist/astro/middleware/request-context.mjs +2 -2
  25. package/dist/astro/middleware/setup.mjs +1 -1
  26. package/dist/astro/middleware.d.mts +2 -2
  27. package/dist/astro/middleware.mjs +124 -71
  28. package/dist/astro/middleware.mjs.map +1 -1
  29. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
  30. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
  31. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  32. package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  34. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -8
  35. package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -8
  36. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -8
  37. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -14
  38. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -14
  39. package/dist/astro/routes/api/admin/bylines/index.mjs +14 -14
  40. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
  41. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
  42. package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
  43. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
  44. package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
  45. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
  46. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  47. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  48. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  49. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +37 -36
  50. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  51. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +37 -36
  52. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  53. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +36 -35
  54. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +36 -35
  56. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  57. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +36 -35
  58. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/plugins/index.mjs +36 -35
  60. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  61. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  62. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +36 -35
  63. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +36 -35
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  66. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +36 -35
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  68. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +36 -35
  69. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +37 -36
  71. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  72. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +36 -35
  73. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  74. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +37 -36
  75. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  76. package/dist/astro/routes/api/admin/plugins/updates.mjs +36 -35
  77. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  78. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +36 -35
  79. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  81. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +36 -35
  82. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  83. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
  84. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  85. package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
  86. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  87. package/dist/astro/routes/api/admin/users/index.mjs +6 -6
  88. package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
  89. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  90. package/dist/astro/routes/api/auth/invite/complete.mjs +10 -10
  91. package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
  92. package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
  93. package/dist/astro/routes/api/auth/logout.mjs +3 -3
  94. package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
  95. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  96. package/dist/astro/routes/api/auth/me.mjs +7 -7
  97. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  98. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  99. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  100. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
  101. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  102. package/dist/astro/routes/api/auth/passkey/options.mjs +11 -11
  103. package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
  104. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
  105. package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
  106. package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
  107. package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
  108. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  109. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
  110. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +12 -12
  111. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  112. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
  113. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
  114. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  115. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -10
  116. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +7 -7
  117. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
  118. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  119. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +7 -7
  120. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +13 -13
  121. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  122. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
  123. package/dist/astro/routes/api/content/_collection_/_id_.mjs +7 -7
  124. package/dist/astro/routes/api/content/_collection_/authors.mjs +3 -3
  125. package/dist/astro/routes/api/content/_collection_/index.mjs +7 -7
  126. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
  127. package/dist/astro/routes/api/dashboard.mjs +8 -8
  128. package/dist/astro/routes/api/dev/emails.mjs +3 -3
  129. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  130. package/dist/astro/routes/api/import/probe.mjs +19 -11
  131. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  132. package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
  133. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -41
  134. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  135. package/dist/astro/routes/api/import/wordpress/execute.mjs +12 -407
  136. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  137. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
  138. package/dist/astro/routes/api/import/wordpress/media.mjs +9 -9
  139. package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
  140. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +19 -1
  141. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
  142. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +97 -79
  143. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  144. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  145. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +19 -11
  146. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  147. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +40 -2
  148. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  149. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +519 -39
  150. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  151. package/dist/astro/routes/api/manifest.mjs +4 -4
  152. package/dist/astro/routes/api/mcp.mjs +39 -39
  153. package/dist/astro/routes/api/media/_id_/confirm.mjs +7 -7
  154. package/dist/astro/routes/api/media/_id_.mjs +7 -7
  155. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  156. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  157. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  158. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  159. package/dist/astro/routes/api/media/upload-url.mjs +8 -8
  160. package/dist/astro/routes/api/media.mjs +9 -9
  161. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +9 -9
  162. package/dist/astro/routes/api/menus/_name_/items.mjs +9 -9
  163. package/dist/astro/routes/api/menus/_name_/reorder.mjs +9 -9
  164. package/dist/astro/routes/api/menus/_name_/translations.mjs +9 -9
  165. package/dist/astro/routes/api/menus/_name_.mjs +9 -9
  166. package/dist/astro/routes/api/menus/index.mjs +9 -9
  167. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  168. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  169. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  170. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  171. package/dist/astro/routes/api/oauth/register.mjs +3 -3
  172. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  173. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  174. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  175. package/dist/astro/routes/api/openapi.json.mjs +4 -4
  176. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  177. package/dist/astro/routes/api/redirects/404s/index.mjs +9 -9
  178. package/dist/astro/routes/api/redirects/404s/summary.mjs +9 -9
  179. package/dist/astro/routes/api/redirects/_id_.mjs +10 -10
  180. package/dist/astro/routes/api/redirects/index.mjs +10 -10
  181. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  182. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
  183. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +36 -35
  184. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  185. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +36 -35
  186. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  187. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +36 -35
  188. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  189. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +36 -35
  190. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  191. package/dist/astro/routes/api/schema/collections/index.mjs +36 -35
  192. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  193. package/dist/astro/routes/api/schema/index.mjs +7 -6
  194. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  195. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +36 -35
  196. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  197. package/dist/astro/routes/api/schema/orphans/index.mjs +36 -35
  198. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  199. package/dist/astro/routes/api/search/enable.mjs +10 -10
  200. package/dist/astro/routes/api/search/index.mjs +9 -9
  201. package/dist/astro/routes/api/search/rebuild.mjs +10 -10
  202. package/dist/astro/routes/api/search/stats.mjs +6 -6
  203. package/dist/astro/routes/api/search/suggest.mjs +9 -9
  204. package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
  205. package/dist/astro/routes/api/sections/index.mjs +9 -9
  206. package/dist/astro/routes/api/settings/email.mjs +4 -4
  207. package/dist/astro/routes/api/settings.mjs +12 -12
  208. package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
  209. package/dist/astro/routes/api/setup/admin.mjs +10 -10
  210. package/dist/astro/routes/api/setup/dev-bypass.mjs +25 -24
  211. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  212. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  213. package/dist/astro/routes/api/setup/index.mjs +26 -25
  214. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  215. package/dist/astro/routes/api/setup/status.mjs +4 -4
  216. package/dist/astro/routes/api/snapshot.mjs +6 -6
  217. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +13 -13
  218. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +13 -13
  219. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +13 -13
  220. package/dist/astro/routes/api/taxonomies/index.mjs +13 -13
  221. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  222. package/dist/astro/routes/api/typegen.mjs +5 -5
  223. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  224. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  225. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  226. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +7 -7
  227. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +9 -9
  228. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +9 -9
  229. package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
  230. package/dist/astro/routes/api/widget-areas/index.mjs +9 -9
  231. package/dist/astro/routes/api/widget-components.mjs +3 -3
  232. package/dist/astro/routes/robots.txt.mjs +6 -6
  233. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  234. package/dist/astro/routes/sitemap.xml.mjs +7 -7
  235. package/dist/astro/types.d.mts +13 -13
  236. package/dist/auth/providers/github.d.mts +1 -1
  237. package/dist/auth/providers/google.d.mts +1 -1
  238. package/dist/{authorize-C3a_zGsM.mjs → authorize-Dz88F_Fw.mjs} +2 -2
  239. package/dist/{authorize-C3a_zGsM.mjs.map → authorize-Dz88F_Fw.mjs.map} +1 -1
  240. package/dist/{byline-DEKSVPTy.mjs → byline-Bm8ZgUP9.mjs} +6 -6
  241. package/dist/{byline-DEKSVPTy.mjs.map → byline-Bm8ZgUP9.mjs.map} +1 -1
  242. package/dist/{byline-fields-eyJMblSr.mjs → byline-fields-2Lp5Hbgf.mjs} +18 -3
  243. package/dist/byline-fields-2Lp5Hbgf.mjs.map +1 -0
  244. package/dist/{byline-fields-DaMKzkhO.mjs → byline-fields-CIx_GuN4.mjs} +1 -1
  245. package/dist/{byline-fields-DaMKzkhO.mjs.map → byline-fields-CIx_GuN4.mjs.map} +1 -1
  246. package/dist/{byline-fields-CtQ6blXd.d.mts → byline-fields-Cgrt9-aL.d.mts} +49 -34
  247. package/dist/{byline-fields-CtQ6blXd.d.mts.map → byline-fields-Cgrt9-aL.d.mts.map} +1 -1
  248. package/dist/{bylines-Ds4-otXl.mjs → bylines-6tm9mgQb.mjs} +4 -4
  249. package/dist/{bylines-Ds4-otXl.mjs.map → bylines-6tm9mgQb.mjs.map} +1 -1
  250. package/dist/{bylines-CiqgTHWF.mjs → bylines-Woq87129.mjs} +6 -6
  251. package/dist/{bylines-CiqgTHWF.mjs.map → bylines-Woq87129.mjs.map} +1 -1
  252. package/dist/{cache-Ciu3e3AF.mjs → cache-CEBAZjir.mjs} +2 -2
  253. package/dist/{cache-Ciu3e3AF.mjs.map → cache-CEBAZjir.mjs.map} +1 -1
  254. package/dist/{challenge-store-LhiqMccz.mjs → challenge-store-anhwVER0.mjs} +1 -1
  255. package/dist/{challenge-store-LhiqMccz.mjs.map → challenge-store-anhwVER0.mjs.map} +1 -1
  256. package/dist/{chunks-CZFiauig.mjs → chunks-B2isWQhr.mjs} +2 -2
  257. package/dist/{chunks-CZFiauig.mjs.map → chunks-B2isWQhr.mjs.map} +1 -1
  258. package/dist/cli/index.mjs +22 -21
  259. package/dist/cli/index.mjs.map +1 -1
  260. package/dist/client/cf-access.d.mts +1 -1
  261. package/dist/client/index.d.mts +1 -1
  262. package/dist/client/index.mjs +2 -2
  263. package/dist/{comment-CH1IrFFs.mjs → comment-CzeatwBV.mjs} +3 -3
  264. package/dist/{comment-CH1IrFFs.mjs.map → comment-CzeatwBV.mjs.map} +1 -1
  265. package/dist/{comment-reaction-kruNY-kP.mjs → comment-reaction-Cj9QJY7I.mjs} +2 -2
  266. package/dist/{comment-reaction-kruNY-kP.mjs.map → comment-reaction-Cj9QJY7I.mjs.map} +1 -1
  267. package/dist/{comments-BUJyXbgq.mjs → comments-BLE-jv5k.mjs} +3 -3
  268. package/dist/{comments-BUJyXbgq.mjs.map → comments-BLE-jv5k.mjs.map} +1 -1
  269. package/dist/{components-CYt4uVK9.mjs → components-B_sATNUc.mjs} +1 -1
  270. package/dist/{components-CYt4uVK9.mjs.map → components-B_sATNUc.mjs.map} +1 -1
  271. package/dist/{content-RmfHoWqK.mjs → content-DhgEth4k.mjs} +4 -4
  272. package/dist/{content-RmfHoWqK.mjs.map → content-DhgEth4k.mjs.map} +1 -1
  273. package/dist/content-refresh-CA4uKwzH.mjs +1531 -0
  274. package/dist/content-refresh-CA4uKwzH.mjs.map +1 -0
  275. package/dist/{context-CzUU_WzL.mjs → context-CUsR9dXL.mjs} +76 -54
  276. package/dist/context-CUsR9dXL.mjs.map +1 -0
  277. package/dist/{cron-C5LVoNmP.mjs → cron-v4FTEFR_.mjs} +1 -1
  278. package/dist/{cron-C5LVoNmP.mjs.map → cron-v4FTEFR_.mjs.map} +1 -1
  279. package/dist/{dashboard-CVyGhift.mjs → dashboard-EvEKF5en.mjs} +4 -4
  280. package/dist/{dashboard-CVyGhift.mjs.map → dashboard-EvEKF5en.mjs.map} +1 -1
  281. package/dist/db/index.d.mts +3 -3
  282. package/dist/db/index.mjs +1 -1
  283. package/dist/db/libsql.d.mts +1 -1
  284. package/dist/db/postgres.d.mts +1 -1
  285. package/dist/db/sqlite.d.mts +1 -1
  286. package/dist/{default-CeRG-Ot4.mjs → default-CM_D83Mg.mjs} +1 -1
  287. package/dist/{default-CeRG-Ot4.mjs.map → default-CM_D83Mg.mjs.map} +1 -1
  288. package/dist/{device-flow-DENDCQ9F.mjs → device-flow-CfGP18Uw.mjs} +4 -4
  289. package/dist/{device-flow-DENDCQ9F.mjs.map → device-flow-CfGP18Uw.mjs.map} +1 -1
  290. package/dist/{email-console-DJP32ucW.mjs → email-console-CIf4Lfvv.mjs} +1 -1
  291. package/dist/{email-console-DJP32ucW.mjs.map → email-console-CIf4Lfvv.mjs.map} +1 -1
  292. package/dist/{error-BHkLZk-w.mjs → error-CkAseSqZ.mjs} +2 -2
  293. package/dist/{error-BHkLZk-w.mjs.map → error-CkAseSqZ.mjs.map} +1 -1
  294. package/dist/{escape-Bjio4ZsM.mjs → escape-DqD0aCKu.mjs} +1 -1
  295. package/dist/{escape-Bjio4ZsM.mjs.map → escape-DqD0aCKu.mjs.map} +1 -1
  296. package/dist/{field-defs-cache-BA-8ZPiT.mjs → field-defs-cache-WUI88LX5.mjs} +2 -2
  297. package/dist/{field-defs-cache-BA-8ZPiT.mjs.map → field-defs-cache-WUI88LX5.mjs.map} +1 -1
  298. package/dist/{fts-manager-Db9jGavf.mjs → fts-manager-BbFaF_V8.mjs} +2 -2
  299. package/dist/{fts-manager-Db9jGavf.mjs.map → fts-manager-BbFaF_V8.mjs.map} +1 -1
  300. package/dist/{import-Bb1T9WJS.mjs → import-fYLf14Co.mjs} +514 -25
  301. package/dist/import-fYLf14Co.mjs.map +1 -0
  302. package/dist/{index-CDZZjrLT.d.mts → index-B9sIxwe4.d.mts} +21 -22
  303. package/dist/{index-CDZZjrLT.d.mts.map → index-B9sIxwe4.d.mts.map} +1 -1
  304. package/dist/{index-DGIjmUXQ.d.mts → index-Bm-Gy8Mh.d.mts} +25 -4
  305. package/dist/index-Bm-Gy8Mh.d.mts.map +1 -0
  306. package/dist/index.d.mts +18 -18
  307. package/dist/index.mjs +54 -53
  308. package/dist/{load-DpHICVPh.mjs → load-Djn3HWQS.mjs} +2 -2
  309. package/dist/{load-DpHICVPh.mjs.map → load-Djn3HWQS.mjs.map} +1 -1
  310. package/dist/{loader-4K37qA-y.mjs → loader-CB6YHeul.mjs} +6 -5
  311. package/dist/loader-CB6YHeul.mjs.map +1 -0
  312. package/dist/{manifest-schema-kPGX7VS-.mjs → manifest-schema-BHlgZM1W.mjs} +1 -1
  313. package/dist/{manifest-schema-kPGX7VS-.mjs.map → manifest-schema-BHlgZM1W.mjs.map} +1 -1
  314. package/dist/media/index.d.mts +1 -1
  315. package/dist/media/local-runtime.d.mts +12 -12
  316. package/dist/media/local-runtime.mjs +5 -5
  317. package/dist/{media-C0nRRfs1.mjs → media-BrXIaMFN.mjs} +2 -2
  318. package/dist/{media-C0nRRfs1.mjs.map → media-BrXIaMFN.mjs.map} +1 -1
  319. package/dist/{media-allowlist-Du8t1u6a.mjs → media-allowlist-CRHEeJ_i.mjs} +1 -1
  320. package/dist/{media-allowlist-Du8t1u6a.mjs.map → media-allowlist-CRHEeJ_i.mjs.map} +1 -1
  321. package/dist/{media-url-O4rm9-SQ.mjs → media-url-CKi5XSw4.mjs} +1 -1
  322. package/dist/{media-url-O4rm9-SQ.mjs.map → media-url-CKi5XSw4.mjs.map} +1 -1
  323. package/dist/{menus-SL2K0xq2.mjs → menus-Cfivc2Ad.mjs} +3 -3
  324. package/dist/{menus-SL2K0xq2.mjs.map → menus-Cfivc2Ad.mjs.map} +1 -1
  325. package/dist/{menus-DzRyC1ID.mjs → menus-CsZ2ZEK2.mjs} +16 -12
  326. package/dist/{menus-DzRyC1ID.mjs.map → menus-CsZ2ZEK2.mjs.map} +1 -1
  327. package/dist/{mode-BB0F8xTC.mjs → mode-BM9QgEmt.mjs} +1 -1
  328. package/dist/{mode-BB0F8xTC.mjs.map → mode-BM9QgEmt.mjs.map} +1 -1
  329. package/dist/{oauth-authorization-CsvzIp_F.mjs → oauth-authorization-CXWkIGT4.mjs} +4 -4
  330. package/dist/{oauth-authorization-CsvzIp_F.mjs.map → oauth-authorization-CXWkIGT4.mjs.map} +1 -1
  331. package/dist/{oauth-clients-C9SYwEbZ.mjs → oauth-clients-BmTI5rsl.mjs} +1 -1
  332. package/dist/{oauth-clients-C9SYwEbZ.mjs.map → oauth-clients-BmTI5rsl.mjs.map} +1 -1
  333. package/dist/{oauth-state-store---zrApfB.mjs → oauth-state-store-YLFLcH5F.mjs} +1 -1
  334. package/dist/{oauth-state-store---zrApfB.mjs.map → oauth-state-store-YLFLcH5F.mjs.map} +1 -1
  335. package/dist/{oauth-user-lookup-SHsWRlG9.mjs → oauth-user-lookup-Bsc_GsX-.mjs} +1 -1
  336. package/dist/{oauth-user-lookup-SHsWRlG9.mjs.map → oauth-user-lookup-Bsc_GsX-.mjs.map} +1 -1
  337. package/dist/object-cache/memory.d.mts +1 -1
  338. package/dist/{object-cache-CHbHv83-.mjs → object-cache-Bok5j2ae.mjs} +43 -3
  339. package/dist/object-cache-Bok5j2ae.mjs.map +1 -0
  340. package/dist/{options-41nCWqi9.d.mts → options-iMpRRxIe.d.mts} +3 -3
  341. package/dist/{options-41nCWqi9.d.mts.map → options-iMpRRxIe.d.mts.map} +1 -1
  342. package/dist/page/index.d.mts +2 -2
  343. package/dist/{parse-CqyZj3Hp.mjs → parse-GmjecGct.mjs} +2 -2
  344. package/dist/{parse-CqyZj3Hp.mjs.map → parse-GmjecGct.mjs.map} +1 -1
  345. package/dist/{passkey-config-C0YfSBko.mjs → passkey-config-De0ahnRg.mjs} +1 -1
  346. package/dist/{passkey-config-C0YfSBko.mjs.map → passkey-config-De0ahnRg.mjs.map} +1 -1
  347. package/dist/{placeholder-Cuce9U-m.d.mts → placeholder-BSKwzRe4.d.mts} +1 -1
  348. package/dist/{placeholder-Cuce9U-m.d.mts.map → placeholder-BSKwzRe4.d.mts.map} +1 -1
  349. package/dist/plugin-types.d.mts +1 -1
  350. package/dist/plugin-utils.d.mts +10 -10
  351. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
  352. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  353. package/dist/{portable-text-BICg8bTk.mjs → portable-text-cCa0cGV6.mjs} +1 -1
  354. package/dist/{portable-text-BICg8bTk.mjs.map → portable-text-cCa0cGV6.mjs.map} +1 -1
  355. package/dist/{preview-DKGCt2_p.mjs → preview-SSXNVPAC.mjs} +2 -2
  356. package/dist/{preview-DKGCt2_p.mjs.map → preview-SSXNVPAC.mjs.map} +1 -1
  357. package/dist/{public-url-CTVqgMmg.mjs → public-url-Danv47cS.mjs} +1 -1
  358. package/dist/{public-url-CTVqgMmg.mjs.map → public-url-Danv47cS.mjs.map} +1 -1
  359. package/dist/{query-B0M-9LYR.mjs → query-ByGq6ver.mjs} +14 -14
  360. package/dist/{query-B0M-9LYR.mjs.map → query-ByGq6ver.mjs.map} +1 -1
  361. package/dist/{rate-limit-BwoUdIpC.mjs → rate-limit-C_Lf63Dd.mjs} +2 -2
  362. package/dist/{rate-limit-BwoUdIpC.mjs.map → rate-limit-C_Lf63Dd.mjs.map} +1 -1
  363. package/dist/{redirect-CS-PHtNh.mjs → redirect-CoW3G-0U.mjs} +1 -1
  364. package/dist/{redirect-CS-PHtNh.mjs.map → redirect-CoW3G-0U.mjs.map} +1 -1
  365. package/dist/{redirect-lMOzG04S.mjs → redirect-IyfNirgS.mjs} +2 -2
  366. package/dist/{redirect-lMOzG04S.mjs.map → redirect-IyfNirgS.mjs.map} +1 -1
  367. package/dist/{redirects-9218MmYl.mjs → redirects-Bs1g42Ri.mjs} +4 -4
  368. package/dist/{redirects-9218MmYl.mjs.map → redirects-Bs1g42Ri.mjs.map} +1 -1
  369. package/dist/{redirects-Dcbuisoj.mjs → redirects-DXEXBAII.mjs} +2 -2
  370. package/dist/{redirects-Dcbuisoj.mjs.map → redirects-DXEXBAII.mjs.map} +1 -1
  371. package/dist/{registry-DP-iEtdR.mjs → registry-B65mUtPa.mjs} +122 -79
  372. package/dist/registry-B65mUtPa.mjs.map +1 -0
  373. package/dist/{request-meta-CmS1tDFf.mjs → request-meta-DbvXaAvU.mjs} +2 -2
  374. package/dist/{request-meta-CmS1tDFf.mjs.map → request-meta-DbvXaAvU.mjs.map} +1 -1
  375. package/dist/{resolve-C7I0qiR0.mjs → resolve-DR3wqMTy.mjs} +1 -1
  376. package/dist/{resolve-C7I0qiR0.mjs.map → resolve-DR3wqMTy.mjs.map} +1 -1
  377. package/dist/{runner-BbR3DfrL.d.mts → runner-DvFWoz8-.d.mts} +2 -2
  378. package/dist/{runner-BbR3DfrL.d.mts.map → runner-DvFWoz8-.d.mts.map} +1 -1
  379. package/dist/{runner-CFngB4WZ.mjs → runner-K8XK101B.mjs} +309 -190
  380. package/dist/runner-K8XK101B.mjs.map +1 -0
  381. package/dist/runtime.d.mts +11 -11
  382. package/dist/runtime.mjs +2 -2
  383. package/dist/{scheduled-publish-BMljtY5G.d.mts → scheduled-publish-Drffrf2a.d.mts} +1 -1
  384. package/dist/scheduled-publish-Drffrf2a.d.mts.map +1 -0
  385. package/dist/{schema-BfJ7bIXH.mjs → schema-Blhoxp3P.mjs} +5 -5
  386. package/dist/{schema-BfJ7bIXH.mjs.map → schema-Blhoxp3P.mjs.map} +1 -1
  387. package/dist/{search-C7t3PH1J.mjs → search-DZN2HZ-V.mjs} +4 -4
  388. package/dist/{search-C7t3PH1J.mjs.map → search-DZN2HZ-V.mjs.map} +1 -1
  389. package/dist/{secrets-BSf9pRRY.mjs → secrets-kp760LlD.mjs} +2 -2
  390. package/dist/{secrets-BSf9pRRY.mjs.map → secrets-kp760LlD.mjs.map} +1 -1
  391. package/dist/{sections-Dm0CVX23.mjs → sections-CpF5SaGr.mjs} +3 -3
  392. package/dist/{sections-Dm0CVX23.mjs.map → sections-CpF5SaGr.mjs.map} +1 -1
  393. package/dist/seed/index.d.mts +2 -2
  394. package/dist/seed/index.mjs +19 -18
  395. package/dist/seo/index.d.mts +1 -1
  396. package/dist/seo/index.mjs +1 -1
  397. package/dist/{seo-BkhuuaaE.mjs → seo-89-53DDs.mjs} +1 -1
  398. package/dist/{seo-BkhuuaaE.mjs.map → seo-89-53DDs.mjs.map} +1 -1
  399. package/dist/{seo-Dd3tbY_k.mjs → seo-DXu2UQnC.mjs} +3 -3
  400. package/dist/{seo-Dd3tbY_k.mjs.map → seo-DXu2UQnC.mjs.map} +1 -1
  401. package/dist/{service-CTrqp_Jy.mjs → service-DQmiBMzt.mjs} +3 -3
  402. package/dist/{service-CTrqp_Jy.mjs.map → service-DQmiBMzt.mjs.map} +1 -1
  403. package/dist/{session-user-B8aLtKAH.mjs → session-user-Cascbax7.mjs} +1 -1
  404. package/dist/{session-user-B8aLtKAH.mjs.map → session-user-Cascbax7.mjs.map} +1 -1
  405. package/dist/{settings-CZ7ZP9cW.mjs → settings-rZyHEcNT.mjs} +3 -3
  406. package/dist/{settings-CZ7ZP9cW.mjs.map → settings-rZyHEcNT.mjs.map} +1 -1
  407. package/dist/{settings-BX8cWBus.mjs → settings-zhmdKyJQ.mjs} +5 -5
  408. package/dist/{settings-BX8cWBus.mjs.map → settings-zhmdKyJQ.mjs.map} +1 -1
  409. package/dist/{setup-complete-gEiySUc-.mjs → setup-complete-Cb3LRyzy.mjs} +1 -1
  410. package/dist/{setup-complete-gEiySUc-.mjs.map → setup-complete-Cb3LRyzy.mjs.map} +1 -1
  411. package/dist/{setup-nonce-DzS50zme.mjs → setup-nonce-Z8x0tHf8.mjs} +1 -1
  412. package/dist/{setup-nonce-DzS50zme.mjs.map → setup-nonce-Z8x0tHf8.mjs.map} +1 -1
  413. package/dist/{single-flight-cache-Cdfkic3t.mjs → single-flight-cache-BG3B_GhN.mjs} +1 -1
  414. package/dist/{single-flight-cache-Cdfkic3t.mjs.map → single-flight-cache-BG3B_GhN.mjs.map} +1 -1
  415. package/dist/{site-url-BLebyON8.mjs → site-url-BBfDTgZB.mjs} +1 -1
  416. package/dist/{site-url-BLebyON8.mjs.map → site-url-BBfDTgZB.mjs.map} +1 -1
  417. package/dist/{ssrf-BRKb343l.mjs → ssrf-1g7usGBg.mjs} +1 -1
  418. package/dist/{ssrf-BRKb343l.mjs.map → ssrf-1g7usGBg.mjs.map} +1 -1
  419. package/dist/{status-vUK0SA17.mjs → status-CqJQX1QN.mjs} +1 -1
  420. package/dist/{status-vUK0SA17.mjs.map → status-CqJQX1QN.mjs.map} +1 -1
  421. package/dist/storage/local.d.mts +1 -1
  422. package/dist/storage/local.mjs +1 -1
  423. package/dist/storage/s3.d.mts +1 -1
  424. package/dist/storage/s3.mjs +1 -1
  425. package/dist/{taxonomies-DChKcVxf.mjs → taxonomies-BGBd16Eu.mjs} +4 -4
  426. package/dist/{taxonomies-DChKcVxf.mjs.map → taxonomies-BGBd16Eu.mjs.map} +1 -1
  427. package/dist/{taxonomies-ckPjz-6d.mjs → taxonomies-Cnb4F-Pb.mjs} +7 -7
  428. package/dist/{taxonomies-ckPjz-6d.mjs.map → taxonomies-Cnb4F-Pb.mjs.map} +1 -1
  429. package/dist/{taxonomy-Cru-he6s.mjs → taxonomy-BxGxZZdu.mjs} +4 -4
  430. package/dist/{taxonomy-Cru-he6s.mjs.map → taxonomy-BxGxZZdu.mjs.map} +1 -1
  431. package/dist/{tokens-LeuXF9gG.mjs → tokens-BGT0TUUo.mjs} +1 -1
  432. package/dist/{tokens-LeuXF9gG.mjs.map → tokens-BGT0TUUo.mjs.map} +1 -1
  433. package/dist/{transport-Blrl2k_o.d.mts → transport-BMDWHSgZ.d.mts} +1 -1
  434. package/dist/{transport-Blrl2k_o.d.mts.map → transport-BMDWHSgZ.d.mts.map} +1 -1
  435. package/dist/{transport-_2nBz7e9.mjs → transport-DPefPMcz.mjs} +1 -1
  436. package/dist/{transport-_2nBz7e9.mjs.map → transport-DPefPMcz.mjs.map} +1 -1
  437. package/dist/{trusted-proxy-DZY5WCn2.mjs → trusted-proxy-VTPRiX2s.mjs} +1 -1
  438. package/dist/{trusted-proxy-DZY5WCn2.mjs.map → trusted-proxy-VTPRiX2s.mjs.map} +1 -1
  439. package/dist/{types-ETmO_jQr.d.mts → types-BcLUUbbR.d.mts} +2 -2
  440. package/dist/{types-ETmO_jQr.d.mts.map → types-BcLUUbbR.d.mts.map} +1 -1
  441. package/dist/{types-BYnDBVwe.d.mts → types-CGbYowGQ.d.mts} +2 -2
  442. package/dist/{types-BYnDBVwe.d.mts.map → types-CGbYowGQ.d.mts.map} +1 -1
  443. package/dist/{types-CvuKO5Pn.d.mts → types-CgvhU-hF.d.mts} +1 -1
  444. package/dist/{types-CvuKO5Pn.d.mts.map → types-CgvhU-hF.d.mts.map} +1 -1
  445. package/dist/{types-Y09-wtyU.d.mts → types-ClUkdbWb.d.mts} +1 -1
  446. package/dist/{types-Y09-wtyU.d.mts.map → types-ClUkdbWb.d.mts.map} +1 -1
  447. package/dist/{types-DU4TSFS5.mjs → types-CuW0zWDA.mjs} +2 -2
  448. package/dist/{types-DU4TSFS5.mjs.map → types-CuW0zWDA.mjs.map} +1 -1
  449. package/dist/{types-BkZ8DUEI.d.mts → types-DmHk7vAt.d.mts} +1 -1
  450. package/dist/{types-BkZ8DUEI.d.mts.map → types-DmHk7vAt.d.mts.map} +1 -1
  451. package/dist/{types-CQAugunJ.mjs → types-Jo3UYd6b.mjs} +1 -1
  452. package/dist/{types-CQAugunJ.mjs.map → types-Jo3UYd6b.mjs.map} +1 -1
  453. package/dist/{types-xIfVRNLp.d.mts → types-_HFLRzTn.d.mts} +22 -1
  454. package/dist/types-_HFLRzTn.d.mts.map +1 -0
  455. package/dist/{types-ByChcBgE.d.mts → types-ea9sAPck.d.mts} +1 -1
  456. package/dist/{types-ByChcBgE.d.mts.map → types-ea9sAPck.d.mts.map} +1 -1
  457. package/dist/{types-CNlaBFzx.d.mts → types-g_aFIdW0.d.mts} +1 -1
  458. package/dist/{types-CNlaBFzx.d.mts.map → types-g_aFIdW0.d.mts.map} +1 -1
  459. package/dist/{types-Dbqff978.d.mts → types-vgEWF18A.d.mts} +19 -1
  460. package/dist/{types-Dbqff978.d.mts.map → types-vgEWF18A.d.mts.map} +1 -1
  461. package/dist/{user-DgGbKL9s.mjs → user-BjAOvU3Z.mjs} +3 -3
  462. package/dist/{user-DgGbKL9s.mjs.map → user-BjAOvU3Z.mjs.map} +1 -1
  463. package/dist/{utils-B7A57fm9.mjs → utils-BJXElxdw.mjs} +156 -7
  464. package/dist/utils-BJXElxdw.mjs.map +1 -0
  465. package/dist/{validate-CRkcYZAR.mjs → validate-CWSnKVIJ.mjs} +2 -2
  466. package/dist/{validate-CRkcYZAR.mjs.map → validate-CWSnKVIJ.mjs.map} +1 -1
  467. package/dist/{validate-9ECmtEpJ.d.mts → validate-Z1b86_3B.d.mts} +5 -5
  468. package/dist/{validate-9ECmtEpJ.d.mts.map → validate-Z1b86_3B.d.mts.map} +1 -1
  469. package/dist/{validation-sR26SOwD.mjs → validation-c8WjhH8z.mjs} +8 -5
  470. package/dist/{validation-sR26SOwD.mjs.map → validation-c8WjhH8z.mjs.map} +1 -1
  471. package/dist/version-CaccU7DM.mjs +7 -0
  472. package/dist/{version-CrqhKGWn.mjs.map → version-CaccU7DM.mjs.map} +1 -1
  473. package/dist/{widgets-DRgtn7Cl.mjs → widgets-hWcIicX8.mjs} +3 -3
  474. package/dist/{widgets-DRgtn7Cl.mjs.map → widgets-hWcIicX8.mjs.map} +1 -1
  475. package/dist/wxr-taxonomies-0_uxSrmf.d.mts +34 -0
  476. package/dist/wxr-taxonomies-0_uxSrmf.d.mts.map +1 -0
  477. package/dist/wxr-taxonomies-BC3OYpvx.mjs +425 -0
  478. package/dist/wxr-taxonomies-BC3OYpvx.mjs.map +1 -0
  479. package/dist/{zod-generator-C5JaV--i.mjs → zod-generator-CacrR-i8.mjs} +2 -2
  480. package/dist/{zod-generator-C5JaV--i.mjs.map → zod-generator-CacrR-i8.mjs.map} +1 -1
  481. package/package.json +7 -7
  482. package/src/api/handlers/content.ts +10 -7
  483. package/src/api/schemas/import.ts +19 -0
  484. package/src/astro/integration/runtime.ts +3 -6
  485. package/src/astro/middleware/auth.ts +9 -3
  486. package/src/astro/middleware/csp.ts +54 -3
  487. package/src/astro/routes/admin.astro +9 -0
  488. package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +122 -98
  489. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +794 -44
  490. package/src/components/EmDashImage.astro +59 -23
  491. package/src/components/Image.astro +36 -35
  492. package/src/database/migrations/049_taxonomies_name_locale_index.ts +42 -0
  493. package/src/database/migrations/050_media_usage_index_status.ts +142 -0
  494. package/src/database/migrations/runner.ts +4 -0
  495. package/src/database/repositories/media-usage.ts +932 -58
  496. package/src/database/types.ts +22 -0
  497. package/src/emdash-runtime.ts +123 -3
  498. package/src/import/comments.ts +159 -0
  499. package/src/import/index.ts +8 -1
  500. package/src/import/settings.ts +65 -189
  501. package/src/import/sources/wordpress-plugin.ts +338 -42
  502. package/src/import/sources/wxr.ts +4 -1
  503. package/src/import/types.ts +12 -0
  504. package/src/import/utils.ts +207 -0
  505. package/src/import/wxr-taxonomies.ts +39 -0
  506. package/src/loader.ts +13 -2
  507. package/src/media/usage/content-fields.ts +119 -0
  508. package/src/media/usage/content-refresh.ts +524 -0
  509. package/src/media/usage/content-repair.ts +491 -0
  510. package/src/media/usage/content-snapshots.ts +435 -0
  511. package/src/media/usage/extractor.ts +4 -4
  512. package/src/media/usage/source-key.ts +22 -0
  513. package/src/menus/index.ts +17 -1
  514. package/src/object-cache/index.ts +82 -7
  515. package/src/plugins/context.ts +100 -71
  516. package/src/schema/registry.ts +240 -154
  517. package/src/seed/apply.ts +156 -99
  518. package/dist/api-80kycR9o.mjs.map +0 -1
  519. package/dist/apply-DSypk6Iu.mjs.map +0 -1
  520. package/dist/byline-fields-eyJMblSr.mjs.map +0 -1
  521. package/dist/context-CzUU_WzL.mjs.map +0 -1
  522. package/dist/import-Bb1T9WJS.mjs.map +0 -1
  523. package/dist/index-DGIjmUXQ.d.mts.map +0 -1
  524. package/dist/loader-4K37qA-y.mjs.map +0 -1
  525. package/dist/object-cache-CHbHv83-.mjs.map +0 -1
  526. package/dist/registry-DP-iEtdR.mjs.map +0 -1
  527. package/dist/runner-CFngB4WZ.mjs.map +0 -1
  528. package/dist/scheduled-publish-BMljtY5G.d.mts.map +0 -1
  529. package/dist/types-xIfVRNLp.d.mts.map +0 -1
  530. package/dist/utils-B7A57fm9.mjs.map +0 -1
  531. package/dist/version-CrqhKGWn.mjs +0 -7
  532. /package/dist/{api-tokens-B4BQybOp.mjs → api-tokens-DsvvCtdh.mjs} +0 -0
  533. /package/dist/{ssrf-CcX9zvMK.mjs → ssrf-CmuGgCq3.mjs} +0 -0
  534. /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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,MAAa,YAAY;;AAgCzB,MAAM,qBAAqB;AAoB3B,SAAS,oBAAkC;AAC1C,QAAO;EAAE,SAAS;EAAM,UAAU;EAAG,SAAS;EAAG,QAAQ,EAAE;EAAE,cAAc,EAAE;EAAE;;AAGhF,SAAS,WAAW,OAGlB;CACD,MAAM,+BAAe,IAAI,KAAqB;CAC9C,MAAM,mCAAmB,IAAI,KAAqB;AAClD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,EAAE;EACvD,MAAM,OAAO,OAAO,IAAI;AACxB,MAAI,CAAC,OAAO,SAAS,KAAK,CAAE;AAC5B,eAAa,IAAI,MAAM,MAAM,GAAG;AAChC,mBAAiB,IAAI,MAAM,MAAM,WAAW;;AAE7C,QAAO;EAAE;EAAc;EAAkB;;AAG1C,SAAS,eACR,cACA,kBACqD;CACrD,MAAM,MAA0D,EAAE;AAClE,MAAK,MAAM,CAAC,MAAM,OAAO,cAAc;EACtC,MAAM,aAAa,iBAAiB,IAAI,KAAK;AAC7C,MAAI,WAAY,KAAI,OAAO,KAAK,IAAI;GAAE;GAAI;GAAY;;AAEvD,QAAO;;AAGR,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,QAAQ,oBACZ,QAAO,SAAS,kBAAkB,yBAAyB,IAAI;AAGhE,KAAI;EACH,MAAM,iBAAiB,MAAM,OAAO,aAAa;EAEjD,MAAM,OAAO,MAAM,UAAU,SAAS,oBAAoB;AAC1D,MAAI,aAAa,KAAK,CAAE,QAAO;AAI/B,MAAI;AACH,SAAM,8BAA8B,KAAK,IAAI;WACrC,GAAG;AAEX,UAAO,SAAS,gBADJ,aAAa,YAAY,EAAE,UAAU,eACZ,IAAI;;EAI1C,MAAM,SAAS,KAAK;EAGpB,MAAM,SAAS,UAAU,mBAAmB;AAC5C,MAAI,CAAC,OACJ,QAAO,SAAS,kBAAkB,yCAAyC,IAAI;EAIhF,MAAM,YAAY,OAAO,QAAQ,OAAO,iBAAiB,CACvD,QAAQ,CAAC,GAAG,aAAa,QAAQ,QAAQ,CACzC,KAAK,CAAC,cAAc,SAAS;AAE/B,MAAI,UAAU,WAAW,EACxB,QAAO,SAAS,oBAAoB,qCAAqC,IAAI;AAG9E,UAAQ,IAAI,2CAA2C,KAAK,IAAI;AAChE,UAAQ,IAAI,kCAAkC,UAAU;AAGxD,MAAI,KAAK,MAER,QAAO,WADO,MAAM,eAAe,QAAQ,MAAM,QAAQ,WAAW,eAAe,CAC3D;EAMzB,IAAI;EACJ,IAAI,sBAAgC,EAAE;AACtC,MAAI;GACH,MAAM,QAAQ,MAAM,kBAAkB,QAAQ,KAAK,KAAK,KAAK,OAAO,OAAO;AAC3E,kBAAe,MAAM;AACrB,yBAAsB,MAAM;WACpB,GAAG;AACX,WAAQ,KAAK,kDAAkD,EAAE;;EAIlE,MAAM,EAAE,QAAQ,cAAc,qBAAqB,MAAM,cACxD,OAAO,aACN;GAAE,MAAM;GAAO,KAAK,KAAK;GAAK,OAAO,KAAK;GAAO,EACjD;GAAE;GAAW,eAAe;GAAM,CAClC,EACD,QACA,QACA,gBACA,aACA;AAID,MAAI,OAAO,gBAAgB,MAC1B,OAAM,gBAAgB,QAAQ,QAAQ,KAAK,KAAK,KAAK,OAAO,aAAa;AAM1E,MAAI;GACH,MAAM,WAAW,MAAM,oBAAoB,KAAK,KAAK,KAAK,MAAM;AAChE,OAAI,SAAS,SAAS,GAAG;IACxB,MAAM,iBAAiB,MAAM,yBAC5B,UACA,OAAO,IACP,cACA,iBACA;AACD,WAAO,WAAW;KACjB,UAAU,eAAe;KACzB,SAAS,eAAe;KACxB;AACD,SAAK,MAAM,gBAAgB,eAAe,OACzC,QAAO,OAAO,KAAK;KAClB,OAAO,YAAY,aAAa;KAChC,OAAO,aAAa;KACpB,CAAC;;WAGI,GAAG;AACX,WAAQ,KAAK,6CAA6C,EAAE;;AAM7D,MAAI;AACH,UAAO,eAAe,MAAM,kBAAkB,QAAQ,KAAK,KAAK,KAAK,OAAO,OAAO;WAC3E,GAAG;AACX,WAAQ,KAAK,mDAAmD,EAAE;;AAGnE,MAAI,oBAAoB,SAAS,EAChC,QAAO,oBAAoB;AAG5B,UAAQ,IAAI,qCAAqC,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAEjF,SAAO,WAAW;GACjB,SAAS;GACT;GACA,CAAC;UACM,OAAO;AACf,SAAO,YAAY,OAAO,mCAAmC,yBAAyB;;;;;;;;AASxF,eAAe,gBACd,QACA,QACA,KACA,OACA,cACgB;AAChB,KAAI;EACH,MAAM,QAAQ,MAAM,iBAAiB,KAAK,MAAM;AAChD,MAAI,MAAM,SAAS,GAAG;GACrB,MAAM,aAAa,MAAM,sBAAsB,OAAO,OAAO,IAAI,aAAa;AAC9E,UAAO,QAAQ;IACd,SAAS,WAAW;IACpB,OAAO,WAAW;IAClB;AACD,QAAK,MAAM,aAAa,WAAW,OAClC,QAAO,OAAO,KAAK;IAAE,OAAO,SAAS,UAAU;IAAQ,OAAO,UAAU;IAAO,CAAC;;UAG1E,GAAG;AACX,UAAQ,KAAK,0CAA0C,EAAE;;;;AAO3D,eAAe,eACd,QACA,MACA,QACA,WACA,UACyB;AACzB,SAAQ,KAAK,OAAb;EACC,KAAK,UACJ,QAAO,gBAAgB,QAAQ,MAAM,QAAQ,WAAW,SAAS;EAClE,KAAK,WACJ,QAAO,iBAAiB,QAAQ,KAAK;EACtC,KAAK,WACJ,QAAO,iBAAiB,QAAQ,MAAM,OAAO;EAC9C,KAAK,OACJ,OAAM,IAAI,MAAM,wCAAwC;EACzD;AACC,QAAK;AACL,SAAM,IAAI,MAAM,uBAAuB;;;;;;;;AAS1C,eAAe,gBACd,QACA,MACA,QACA,WACA,UACyB;CACzB,MAAM,SAAS,KAAK,UAAU;EAAE,eAAe;EAAG,MAAM;EAAG;CAC3D,MAAM,WAAW,UAAU,OAAO;AAClC,KAAI,CAAC,SACJ,QAAO;EAAE,SAAS;EAAM,QAAQ,mBAAmB;EAAE,MAAM;EAAM;CAGlE,MAAM,eAAe,OAAO,kBAAkB,KAAK,OAAO,SAAS;CACnE,IAAI;CACJ,IAAI,sBAAgC,EAAE;AACtC,KAAI;AACH,MAAI,cAAc;GACjB,MAAM,QAAQ,MAAM,kBAAkB,QAAQ,KAAK,KAAK,KAAK,OAAO,OAAO;AAC3E,kBAAe,MAAM;AACrB,yBAAsB,MAAM;QAE5B,gBAAe,MAAM,uBAAuB,OAAO,GAAG;UAE/C,GAAG;AACX,UAAQ,KAAK,kDAAkD,EAAE;;CAGlE,MAAM,OAAO,MAAM,uBAAuB;EACzC,SAAS,KAAK;EACd,OAAO,KAAK;EACZ;EACA,MAAM,OAAO;EACb,SAAS;EACT,eAAe;EACf,CAAC;CAIF,MAAM,sBAAsB,IAAI,IAAI,OAAO,QAAQ,KAAK,qBAAqB,EAAE,CAAC,CAAC;CAEjF,MAAM,EAAE,QAAQ,cAAc,qBAAqB,MAAM,cACxD,KAAK,OACL,QACA,QACA,UACA,cACA,oBACA;AAED,KAAI,oBAAoB,SAAS,EAChC,QAAO,oBAAoB;CAM5B,IAAI;AACJ,KAAI,OAAO,OAAO,KAAK,WACtB,QAAO;EAAE,eAAe,OAAO;EAAe,MAAM,OAAO,OAAO;EAAG;UAC3D,OAAO,gBAAgB,IAAI,UAAU,OAC/C,QAAO;EAAE,eAAe,OAAO,gBAAgB;EAAG,MAAM;EAAG;AAG5D,QAAO;EACN,SAAS;EACT;EACA,MAAM,SAAS;EACf,QAAQ;EACR,OAAO;GACN,OAAO,eAAe,cAAc,iBAAiB;GACrD,mBAAmB,OAAO,YAAY,oBAAoB;GAC1D;EACD;;;;;;;AAQF,eAAe,iBAAiB,QAAwB,MAA2C;CAClG,MAAM,OAAO,KAAK,QAAQ,QAAQ;CAClC,MAAM,SAAS,mBAAmB;CAElC,MAAM,EAAE,cAAc,qBAAqB,WAAW,KAAK,MAAM;CACjE,MAAM,0BAAU,IAAI,KAAqB;AACzC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,gBAAgB,EAAE,CAAC,EAAE;EACnE,MAAM,OAAO,OAAO,IAAI;AACxB,MAAI,OAAO,SAAS,KAAK,CAAE,SAAQ,IAAI,MAAM,MAAM;;CAGpD,MAAM,EAAE,OAAO,eAAe,MAAM,wBAAwB,KAAK,KAAK,KAAK,OAAO,KAAK;AAEvF,KAAI,MAAM,SAAS,GAAG;EACrB,MAAM,iBAAiB,MAAM,yBAC5B,OACA,OAAO,IACP,cACA,kBACA,QACA;AACD,SAAO,WAAW;GACjB,UAAU,eAAe;GACzB,SAAS,eAAe;GACxB;AACD,OAAK,MAAM,gBAAgB,eAAe,OACzC,QAAO,OAAO,KAAK;GAAE,OAAO,YAAY,aAAa;GAAW,OAAO,aAAa;GAAO,CAAC;AAE7F,SAAO,UAAU,OAAO,OAAO,WAAW;;CAG3C,MAAM,OAAO,QAAQ;CACrB,MAAM,eAAuC,EAAE;AAC/C,MAAK,MAAM,CAAC,MAAM,OAAO,QAAS,cAAa,OAAO,KAAK,IAAI;AAE/D,QAAO;EACN,SAAS;EACT;EACA;EACA,QAAQ,OAAO,SAAY;GAAE,eAAe;GAAG,MAAM,OAAO;GAAG;EAC/D,OAAO,EAAE,cAAc;EACvB;;;AAIF,eAAe,iBACd,QACA,MACA,QACyB;CACzB,MAAM,SAAS,mBAAmB;CAClC,MAAM,EAAE,iBAAiB,WAAW,KAAK,MAAM;AAE/C,KAAI,OAAO,gBAAgB,MAC1B,OAAM,gBAAgB,QAAQ,QAAQ,KAAK,KAAK,KAAK,OAAO,aAAa;AAG1E,KAAI;AACH,SAAO,eAAe,MAAM,kBAAkB,QAAQ,KAAK,KAAK,KAAK,OAAO,OAAO;UAC3E,GAAG;AACX,UAAQ,KAAK,mDAAmD,EAAE;;AAGnE,QAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,QAAO;EAAE,SAAS;EAAM;EAAQ,MAAM;EAAM;;;AAI7C,MAAM,gBAKD;CACJ;EACC,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb;CACD;EACC,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb;CACD;EACC,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ,SAAS,CAAC,CAAC,KAAK;EACxB;CACD;EACC,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ,SAAS,CAAC,CAAC,KAAK;EACxB;CACD;EACC,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ,SAAS,CAAC,CAAC,WAAW,KAAK,CAAC;EACpC;CACD;EACC,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ,SAAS,CAAC,CAAC,WAAW,KAAK,CAAC;EACpC;CACD;AAED,MAAM,kBAAkB,IAAI,IAAI,CAAC,aAAa,kBAAkB,CAAC;;;;;;;AAQjE,SAAgB,kBAAkB,OAAgB,WAA4B;AAC7E,SAAQ,WAAR;EACC,KAAK,WAAW;GACf,MAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,MAAM;AAC3D,UAAO,OAAO,UAAU,EAAE,GAAG,IAAI;;EAElC,KAAK,UAAU;GACd,MAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,MAAM;AAC3D,UAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;EAEjC,KAAK;AACJ,OAAI,OAAO,UAAU,UAAW,QAAO;AACvC,OAAI,UAAU,KAAK,UAAU,OAAO,UAAU,UAAU,UAAU,MAAO,QAAO;AAChF,OAAI,UAAU,KAAK,UAAU,OAAO,UAAU,WAAW,UAAU,KAAM,QAAO;AAChF;EAED,KAAK,YAAY;AAChB,OAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,QAAO;GACnE,MAAM,IAAI,IAAI,KAAK,MAAM;AACzB,UAAO,OAAO,MAAM,EAAE,SAAS,CAAC,GAAG,SAAY,EAAE,aAAa;;EAE/D,KAAK,OAEJ,QAAO;EACR,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;AACJ,OAAI,OAAO,UAAU,SAAU,QAAO;AACtC,OAAI,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM;AACnD;EACD,QAIC,QAAO,OAAO,UAAU,WAAW,QAAQ;;;;;;;;;AAU9C,SAAS,aAAa,MAAe,KAAiC;AACrE,KAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;CAEtD,MAAM,QAAS,KAAiC;AAChD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,KAAK,KAAK,QAAQ;;AAGnE,SAAS,WAAW,MAAgE;CACnF,MAAM,QAAQ,KAAK,MAAM;CACzB,MAAM,WAAW,KAAK,MAAM;AAC5B,QAAO;EACN,OAAO,aAAa,OAAO,QAAQ,IAAI,aAAa,UAAU,QAAQ;EACtE,aAAa,aAAa,OAAO,cAAc,IAAI,aAAa,UAAU,cAAc;EACxF;;;;;;;;AASF,MAAM,qBAAqB,IAAI,IAAI;CAAC;CAAY;CAAY;CAAY;CAAc,CAAC;;AAGvF,MAAM,wBAAwB;;;;;;;;;AAU9B,eAAsB,yBACrB,IACA,YACA,QACoB;CACpB,MAAM,UAAoB,EAAE;AAC5B,MAAK,MAAM,YAAY,YAAY;AAClC,MAAI,mBAAmB,IAAI,SAAS,KAAK,CAAE;AAC3C,MAAI,SAAS,MAAM,WAAW,EAAG;AACjC,MAAI,CAAC,sBAAsB,KAAK,SAAS,KAAK,CAAE;AAShD,MALiB,MAAM,GACrB,WAAW,wBAAwB,CACnC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,SAAS,KAAK,CACjC,kBAAkB,CACN;EAKd,MAAM,eAAe,SAAS,cAAc,EAAE,EAC5C,KAAK,aAAa,OAAO,iBAAiB,UAAU,CACpD,QAAQ,YAAY,SAAS,QAAQ,CACrC,KAAK,YAAY,QAAQ,WAAW;EAEtC,MAAM,SAAS,MAAM,qBAAqB,IAAI;GAC7C,MAAM,SAAS;GACf,OAAO,SAAS;GAChB,eAAe,SAAS;GACxB,cAAc,SAAS;GACvB,aAAa,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC;GACtC,CAAC;AACF,MAAI,OAAO,QACV,SAAQ,KAAK,SAAS,KAAK;MAE3B,SAAQ,KACP,iDAAiD,SAAS,KAAK,KAC/D,OAAO,MAAM,QACb;;AAGH,QAAO;;AAGR,eAAe,kBACd,QACA,KACA,OACA,QAC+D;CAC/D,MAAM,aAAa,MAAM,sBAAsB,KAAK,MAAM;CAE1D,MAAM,cAAc,MAAM,yBAAyB,OAAO,IAAI,YAAY,OAAO;CAEjF,MAAM,aAA4B,EAAE;CACpC,MAAM,OAAiB,EAAE;CACzB,MAAM,QAAmB,EAAE;AAE3B,MAAK,MAAM,YAAY,WACtB,MAAK,MAAM,QAAQ,SAAS,MAC3B,KAAI,SAAS,SAAS,WACrB,YAAW,KAAK;EAAE,UAAU,KAAK;EAAM,MAAM,KAAK;EAAM,aAAa,KAAK;EAAa,CAAC;UAC9E,SAAS,SAAS,WAC5B,MAAK,KAAK;EAAE,MAAM,KAAK;EAAM,MAAM,KAAK;EAAM,aAAa,KAAK;EAAa,CAAC;UACpE,SAAS,SAAS,cAAc,SAAS,SAAS,cAC5D,OAAM,KAAK;EACV,IAAI,KAAK;EACT,UAAU,SAAS;EACnB,MAAM,KAAK;EACX,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,CAAC;AAML,QAAO;EAAE,MADI,MAAM,uBAAuB,OAAO,IAAI,EAAE,EAAE,YAAY,MAAM,OAAO,OAAU;EAC7E;EAAa;;;;;;;;;;AAW7B,eAAe,kBACd,QACA,KACA,OACA,QACoB;CACpB,MAAM,YAAY,OAAO,oBAAoB;CAC7C,MAAM,WAAW,OAAO,eAAe;AACvC,KAAI,CAAC,aAAa,CAAC,SAAU,QAAO,EAAE;CAGtC,MAAM,SAAS,4BADC,MAAM,mBAAmB,KAAK,MAAM,CACD;AACnD,KAAI,CAAC,WAAW;AACf,SAAO,OAAO;AACd,SAAO,OAAO;;AAEf,KAAI,CAAC,UAAU;AACd,SAAO,OAAO;AACd,SAAO,OAAO;;CAGf,MAAM,QAA2D,EAAE;AACnE,KAAI,OAAO,YAAY,OAAO,MAAM,OAAO,OAAO,SAAS,MAAM;EAChE,MAAM,cAAc,EAAE;AACtB,MAAI,OAAO,MAAM,IAChB,aAAY,KAAK;GAAE,IAAI,OAAO,KAAK;GAAI,KAAK,OAAO,KAAK;GAAK,CAAC;AAE/D,MAAI,OAAO,SAAS,OAAO,OAAO,QAAQ,QAAQ,OAAO,MAAM,IAC9D,aAAY,KAAK;GAAE,IAAI,OAAO,QAAQ;GAAI,KAAK,OAAO,QAAQ;GAAK,CAAC;EAErE,MAAM,cAAc,MAAM,wBACzB,aACA,OAAO,IACP,OAAO,eACD,GACN;AACD,OAAK,MAAM,QAAQ,YAAY,UAAU;AACxC,OAAI,KAAK,gBAAgB,OAAO,MAAM,IACrC,OAAM,cAAc,KAAK;AAE1B,OAAI,KAAK,gBAAgB,OAAO,SAAS,IACxC,OAAM,iBAAiB,KAAK;;;CAK/B,MAAM,iBAAiB,MAAM,mBAAmB,QAAQ,OAAO,IAAI,MAAM,MAAM;AAC/E,MAAK,MAAM,gBAAgB,eAAe,OACzC,SAAQ,KACP,oCAAoC,aAAa,QAAQ,YACzD,aAAa,MACb;AAEF,QAAO,eAAe;;;;;;AAOvB,SAAS,iBAAiB,MAA+B;AACxD,QAAO;EACN,YAAY,KAAK,cAAc,EAAE;EACjC,MAAM,KAAK,QAAQ,EAAE;EACrB,kBAAkB,KAAK,mBACpB,IAAI,IAAI,OAAO,QAAQ,KAAK,iBAAiB,CAAC,GAC9C;EACH,sBAAM,IAAI,KAAK;EACf;;;AAIF,eAAsB,cACrB,OACA,QACA,QACA,UACA,cACA,uBAKE;CACF,MAAM,SAAuB;EAC5B,SAAS;EACT,UAAU;EACV,SAAS;EACT,QAAQ,EAAE;EACV,cAAc,EAAE;EAChB;CAGD,MAAM,+BAAe,IAAI,KAAqB;CAG9C,MAAM,mCAAmB,IAAI,KAAqB;CAGlD,MAAM,cAAc,IAAI,kBAAkB,OAAO,GAAG;CACpD,MAAM,aAAa,IAAI,iBAAiB,OAAO,GAAG;CAClD,MAAM,8BAAc,IAAI,KAAqB;CAC7C,MAAM,iBAAiB,IAAI,eAAe,OAAO,GAAG;CAKpD,MAAM,gCAAgB,IAAI,KAAa;CAIvC,MAAM,yCAAyB,IAAI,KAAkC;CAMrE,MAAM,sBAAsB,yCAAyB,IAAI,KAAqB;AAE9E,YAAW,MAAM,QAAQ,OAAO;AAC/B,UAAQ,IAAI,uCAAuC;GAClD,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,UAAU,KAAK;GACf,QAAQ,KAAK;GACb,eAAe,MAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,QAAQ,SAAS;GACnE,eAAe,KAAK;GACpB,QAAQ,KAAK;GACb,kBAAkB,KAAK;GACvB,CAAC;EAEF,MAAM,UAAU,OAAO,iBAAiB,KAAK;AAG7C,MAAI,CAAC,WAAW,CAAC,QAAQ,SAAS;AACjC,UAAO;AACP;;EAGD,MAAM,aAAa,QAAQ;AAG3B,MAAI,CAAC,UAAU,YAAY,aAAa;AACvC,UAAO,OAAO,KAAK;IAClB,OAAO,KAAK,SAAS;IACrB,OAAO,eAAe,WAAW;IACjC,CAAC;AACF;;AAGD,MAAI;AAKH,QAAK,MAAM,SAAS,eAAe;AAClC,QAAI,OAAO,cAAc,SAAS,gBAAgB,IAAI,MAAM,KAAK,CAAE;IACnE,MAAM,YAAY,GAAG,WAAW,GAAG,MAAM;AACzC,QAAI,cAAc,IAAI,UAAU,IAAI,CAAC,MAAM,MAAM,KAAK,CAAE;AACxD,kBAAc,IAAI,UAAU;AAE5B,QAAI,CADkB,MAAM,eAAe,SAAS,YAAY,MAAM,KAAK,EACvD;AACnB,aAAQ,IACP,8CAA8C,MAAM,KAAK,mBAAmB,WAAW,GACvF;AACD,SAAI;AACH,YAAM,eAAe,YAAY,YAAY;OAC5C,MAAM,MAAM;OACZ,OAAO,MAAM;OACb,MAAM,MAAM;OACZ,UAAU;OACV,CAAC;AACF,6BAAuB,IAAI,WAAW,EAAE,IAAI,MAAM,MAAM,MAAM,KAAK;cAC3D,GAAG;AAEX,cAAQ,IACP,6BAA6B,MAAM,KAAK,sBACxC,aAAa,QAAQ,EAAE,UAAU,EACjC;;;;GAQJ,IAAI,aAAa,uBAAuB,IAAI,WAAW;AACvD,OAAI,CAAC,YAAY;AAChB,iCAAa,IAAI,KAAqB;IACtC,MAAM,gBAAgB,MAAM,eAAe,cAAc,WAAW;AACpE,QAAI,cACH,MAAK,MAAM,SAAS,MAAM,eAAe,WAAW,cAAc,GAAG,CACpE,YAAW,IAAI,MAAM,MAAM,MAAM,KAAK;AAGxC,2BAAuB,IAAI,YAAY,WAAW;;GAInD,MAAM,OAAO,KAAK,QAAQ,QAAQ,KAAK,SAAS,QAAQ,KAAK,WAAW;AAGxE,OAAI,OAAO,cAAc;IACxB,MAAM,WAAW,MAAM,YAAY,WAAW,YAAY,MAAM,KAAK,OAAO;AAC5E,QAAI,UAAU;AAEb,SAAI,KAAK,iBACR,qBAAoB,IAAI,KAAK,kBAAkB,SAAS,GAAG;KAG5D,MAAM,OAAO,OAAO,KAAK,SAAS;AAClC,SAAI,OAAO,SAAS,KAAK,EAAE;AAC1B,mBAAa,IAAI,MAAM,SAAS,GAAG;AACnC,uBAAiB,IAAI,MAAM,WAAW;;AAEvC,YAAO;AACP;;;GAKF,MAAM,SAAS,UAAU,KAAK,OAAO;GAGrC,MAAM,OAAgC,EAAE;AAGxC,QAAK,QAAQ,KAAK,SAAS;AAC3B,QAAK,UAAU,KAAK;AAEpB,OAAI,KAAK,QACR,MAAK,UAAU,KAAK;AAErB,OAAI,KAAK,eAAe;AACvB,SAAK,iBAAiB,KAAK;AAC3B,YAAQ,IAAI,6CAA6C,KAAK,cAAc;;AAI7E,OAAI,OAAO,cAAc,OAAO;IAC/B,MAAM,MAAM,WAAW,KAAK;AAC5B,QAAI,IAAI,MACP,MAAK,YAAY,IAAI;AAEtB,QAAI,IAAI,YACP,MAAK,kBAAkB,IAAI;;GAa7B,MAAM,mBAAmB,KAAa,UAAmB;AACxD,QAAI,UAAU,QAAQ,UAAU,GAAI;IACpC,MAAM,YAAY,kBAAkB,IAAI;IACxC,MAAM,YAAY,WAAW,IAAI,UAAU;AAC3C,QAAI,CAAC,aAAa,aAAa,KAAM;IACrC,MAAM,UAAU,kBAAkB,OAAO,UAAU;AACnD,QAAI,YAAY,OACf,MAAK,aAAa;;GAGpB,MAAM,MAAM,KAAK,MAAM;AACvB,OAAI,OAAO,QAAQ,YAAY,QAAQ,KACtC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,CAC7C,iBAAgB,KAAK,MAAM;AAG7B,OAAI,KAAK,KACR,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,KAAK,EAAE;AAErD,QAAI,IAAI,WAAW,IAAI,CAAE;AACzB,oBAAgB,KAAK,MAAM;;GAK7B,IAAI;AACJ,OAAI,OAAO,kBAAkB,KAAK,QAAQ;IACzC,MAAM,eAAe,OAAO,eAAe,KAAK;AAChD,QAAI,iBAAiB,UAAa,iBAAiB,KAClD,YAAW;;GAIb,MAAM,WAAW,MAAM,oBACtB,KAAK,QACL,KAAK,QACL,UACA,YACA,YACA;GAID,IAAI;AACJ,OAAI,KAAK,kBAAkB;IAC1B,MAAM,oBAAoB,oBAAoB,IAAI,KAAK,iBAAiB;AACxE,QAAI,kBACH,iBAAgB;;GAKlB,MAAM,eAAe,KAAK,MAAM,SAAS;GACzC,MAAM,YACL,iBAAiB,UAAa,CAAC,OAAO,MAAM,aAAa,GACtD,KAAK,KAAK,aAAa,GACvB;GACJ,MAAM,cAAc,WAAW,eAAe,YAAY,YAAY;GAGtE,MAAM,eAAe,MAAM,OAAO,oBAAoB,YAAY;IACjE;IACA;IACA;IACA;IACA,SAAS,WAAW,CAAC,EAAE,UAAU,CAAC,GAAG;IACrC,QAAQ,KAAK;IACb;IACA;IACA;IACA,CAAC;AAEF,OAAI,aAAa,SAAS;AACzB,WAAO;AACP,WAAO,aAAa,eAAe,OAAO,aAAa,eAAe,KAAK;IAI3E,MAAM,YADc,aAAa,MACF,MAAM;AAErC,QAAI,WAAW;KACd,MAAM,OAAO,OAAO,KAAK,SAAS;AAClC,SAAI,OAAO,SAAS,KAAK,EAAE;AAC1B,mBAAa,IAAI,MAAM,UAAU;AACjC,uBAAiB,IAAI,MAAM,WAAW;;AAIvC,SAAI,aACH,KAAI;MACH,MAAM,WAAW,MAAM,qBACtB,OAAO,IACP,YACA,WACA,iBAAiB,KAAK,EACtB,aACA;AACD,UAAI,WAAW,EACd,QAAO,uBAAuB,OAAO,uBAAuB,KAAK;cAE1D,GAAG;AACX,cAAQ,KAAK,kDAAkD,KAAK,KAAK,EAAE;;;AAM9E,QAAI,KAAK,oBAAoB,CAAC,oBAAoB,IAAI,KAAK,iBAAiB,IAAI,UAC/E,qBAAoB,IAAI,KAAK,kBAAkB,UAAU;SAG1D,QAAO,OAAO,KAAK;IAClB,OAAO,KAAK,SAAS;IACrB,OACC,OAAO,aAAa,UAAU,YAAY,aAAa,UAAU,OAC7D,aAAa,MAA+B,WAAW,kBACxD,OAAO,aAAa,MAAM;IAC9B,CAAC;WAEK,OAAO;AACf,WAAQ,MAAM,qBAAqB,KAAK,SAAS,WAAW,KAAK,MAAM;AACvE,UAAO,OAAO,KAAK;IAClB,OAAO,KAAK,SAAS;IACrB,OAAO,iBAAiB,SAAS,MAAM,UAAU,MAAM,UAAU;IACjE,CAAC;;;AAIJ,KAAI,gBAAgB,aAAa,kBAAkB,SAAS,EAC3D,QAAO,oBAAoB,aAAa;AAGzC,QAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,QAAO;EAAE;EAAQ;EAAc;EAAkB;;AAGlD,SAAS,UAAU,UAAsC;AACxD,SAAQ,UAAR;EACC,KAAK,UACJ,QAAO;EACR,KAAK,QACJ,QAAO;EACR,KAAK,UACJ,QAAO;EACR,KAAK,UACJ,QAAO;EACR,QACC,QAAO"}
@@ -1,9 +1,9 @@
1
1
  import "../../../base64-CmWvODNW.mjs";
2
- import "../../../types-DU4TSFS5.mjs";
2
+ import "../../../types-CuW0zWDA.mjs";
3
3
  import { t as OptionsRepository } from "../../../options-DTTML-Tx.mjs";
4
- import { r as handleError } from "../../../error-BHkLZk-w.mjs";
5
- import { n as VERSION, t as COMMIT } from "../../../version-CrqhKGWn.mjs";
6
- import { t as getAuthMode } from "../../../mode-BB0F8xTC.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";
7
7
 
8
8
  //#region src/astro/routes/api/manifest.ts
9
9
  const prerender = false;
@@ -1,12 +1,12 @@
1
1
  import "../../../base64-CmWvODNW.mjs";
2
- import "../../../types-DU4TSFS5.mjs";
3
- import { t as apiError } from "../../../error-BHkLZk-w.mjs";
4
- import { Dn as contentBylineInputSchema, Tn as bylineUpdateBody, un as contentSeoInput, yn as bylineCreateBody } from "../../../redirects-Dcbuisoj.mjs";
5
- import "../../../byline-fields-eyJMblSr.mjs";
6
- import "../../../status-vUK0SA17.mjs";
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-B4BQybOp.mjs";
9
- import { n as convertDataForWrite, t as convertDataForRead } from "../../../portable-text-BICg8bTk.mjs";
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-BfJ7bIXH.mjs").then((n) => n.t);
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-CiqgTHWF.mjs").then((n) => n.t);
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-DEKSVPTy.mjs").then((n) => n.n);
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-DEKSVPTy.mjs").then((n) => n.n);
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-Ds4-otXl.mjs").then((n) => n.t);
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-Ds4-otXl.mjs").then((n) => n.t);
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-DEKSVPTy.mjs").then((n) => n.n);
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-Ds4-otXl.mjs").then((n) => n.t);
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-BfJ7bIXH.mjs").then((n) => n.t);
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-BfJ7bIXH.mjs").then((n) => n.t);
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-BfJ7bIXH.mjs").then((n) => n.t);
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-BfJ7bIXH.mjs").then((n) => n.t);
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-BfJ7bIXH.mjs").then((n) => n.t);
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-BfJ7bIXH.mjs").then((n) => n.t);
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-C7t3PH1J.mjs").then((n) => n.t);
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-DChKcVxf.mjs").then((n) => n.l);
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-DChKcVxf.mjs").then((n) => n.l);
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-Cru-he6s.mjs").then((n) => n.n);
1139
- const { decodeCursor, encodeCursor, InvalidCursorError } = await import("../../../types-DU4TSFS5.mjs").then((n) => n.o);
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-DChKcVxf.mjs").then((n) => n.l);
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-DChKcVxf.mjs").then((n) => n.l);
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-DChKcVxf.mjs").then((n) => n.l);
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-DChKcVxf.mjs").then((n) => n.l);
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-SL2K0xq2.mjs").then((n) => n.d);
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-SL2K0xq2.mjs").then((n) => n.d);
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-SL2K0xq2.mjs").then((n) => n.d);
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-SL2K0xq2.mjs").then((n) => n.d);
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-SL2K0xq2.mjs").then((n) => n.d);
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-SL2K0xq2.mjs").then((n) => n.d);
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-SL2K0xq2.mjs").then((n) => n.d);
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-CZ7ZP9cW.mjs").then((n) => n.r);
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-CZ7ZP9cW.mjs").then((n) => n.r);
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-DU4TSFS5.mjs";
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-BHkLZk-w.mjs";
5
- import { r as parseOptionalBody, t as isParseError } from "../../../../../parse-CqyZj3Hp.mjs";
6
- import { Ht as mediaConfirmBody } from "../../../../../redirects-Dcbuisoj.mjs";
7
- import "../../../../../byline-fields-eyJMblSr.mjs";
8
- import "../../../../../status-vUK0SA17.mjs";
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-C3a_zGsM.mjs";
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-DU4TSFS5.mjs";
3
- import { a as unwrapResult, r as handleError, t as apiError } from "../../../../error-BHkLZk-w.mjs";
4
- import { n as parseBody, t as isParseError } from "../../../../parse-CqyZj3Hp.mjs";
5
- import { Xt as mediaUpdateBody } from "../../../../redirects-Dcbuisoj.mjs";
6
- import "../../../../byline-fields-eyJMblSr.mjs";
7
- import "../../../../status-vUK0SA17.mjs";
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-C3a_zGsM.mjs";
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-DU4TSFS5.mjs";
3
- import { r as handleError, t as apiError } from "../../../../../error-BHkLZk-w.mjs";
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-DU4TSFS5.mjs";
3
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-BHkLZk-w.mjs";
4
- import { n as requirePerm } from "../../../../../../authorize-C3a_zGsM.mjs";
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-DU4TSFS5.mjs";
3
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../../error-BHkLZk-w.mjs";
4
- import { n as requirePerm } from "../../../../../../authorize-C3a_zGsM.mjs";
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-DU4TSFS5.mjs";
3
- import { n as apiSuccess, t as apiError } from "../../../../../error-BHkLZk-w.mjs";
4
- import { n as requirePerm } from "../../../../../authorize-C3a_zGsM.mjs";
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;
@@ -1,14 +1,14 @@
1
1
  import "../../../../base64-CmWvODNW.mjs";
2
- import "../../../../types-DU4TSFS5.mjs";
2
+ import "../../../../types-CuW0zWDA.mjs";
3
3
  import { n as normalizeMime, t as matchesMimeAllowlist } from "../../../../mime-CCEzze7W.mjs";
4
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-BHkLZk-w.mjs";
5
- import { n as parseBody, t as isParseError } from "../../../../parse-CqyZj3Hp.mjs";
6
- import { Bt as DEFAULT_MAX_UPLOAD_SIZE, Zt as mediaUploadUrlBody } from "../../../../redirects-Dcbuisoj.mjs";
7
- import "../../../../byline-fields-eyJMblSr.mjs";
8
- import "../../../../status-vUK0SA17.mjs";
4
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../error-CkAseSqZ.mjs";
5
+ import { n as parseBody, t as isParseError } from "../../../../parse-GmjecGct.mjs";
6
+ import { Bt as DEFAULT_MAX_UPLOAD_SIZE, Zt as mediaUploadUrlBody } 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 } from "../../../../authorize-C3a_zGsM.mjs";
11
- import { n as resolveFieldAllowlist, t as GLOBAL_UPLOAD_ALLOWLIST } from "../../../../media-allowlist-Du8t1u6a.mjs";
10
+ import { n as requirePerm } from "../../../../authorize-Dz88F_Fw.mjs";
11
+ import { n as resolveFieldAllowlist, t as GLOBAL_UPLOAD_ALLOWLIST } from "../../../../media-allowlist-CRHEeJ_i.mjs";
12
12
  import { ulid } from "ulidx";
13
13
  import * as path from "node:path";
14
14
  import { MediaRepository } from "emdash";