emdash 0.40.1 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1515) hide show
  1. package/dist/action-token-DBki7IT4.mjs +26 -0
  2. package/dist/action-token-DBki7IT4.mjs.map +1 -0
  3. package/dist/activation-DDuqAat2.mjs +387 -0
  4. package/dist/activation-DDuqAat2.mjs.map +1 -0
  5. package/dist/adapters-BrZxU6vM.d.mts +171 -0
  6. package/dist/adapters-BrZxU6vM.d.mts.map +1 -0
  7. package/dist/allowed-origins-CFtudhyw.mjs +116 -0
  8. package/dist/allowed-origins-CFtudhyw.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +5 -4
  10. package/dist/api/route-utils.d.mts.map +1 -1
  11. package/dist/api/route-utils.mjs +52 -46
  12. package/dist/api/route-utils.mjs.map +1 -1
  13. package/dist/api/schemas/index.d.mts +2 -2
  14. package/dist/api/schemas/index.mjs +11 -10
  15. package/dist/api-CFQn8VLR.mjs +4973 -0
  16. package/dist/api-CFQn8VLR.mjs.map +1 -0
  17. package/dist/api-tokens-P3mAaQgr.mjs +166 -0
  18. package/dist/api-tokens-P3mAaQgr.mjs.map +1 -0
  19. package/dist/apply-C1kq5l7p.mjs +1672 -0
  20. package/dist/apply-C1kq5l7p.mjs.map +1 -0
  21. package/dist/approvals-l9sGqPmL.mjs +460 -0
  22. package/dist/approvals-l9sGqPmL.mjs.map +1 -0
  23. package/dist/artifact-fetch-CWxyELVI.mjs +659 -0
  24. package/dist/artifact-fetch-CWxyELVI.mjs.map +1 -0
  25. package/dist/astro/index.d.mts +14 -14
  26. package/dist/astro/index.d.mts.map +1 -1
  27. package/dist/astro/index.mjs +106 -560
  28. package/dist/astro/index.mjs.map +1 -1
  29. package/dist/astro/middleware/auth.d.mts +12 -12
  30. package/dist/astro/middleware/auth.mjs +10 -10
  31. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  32. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  33. package/dist/astro/middleware/redirect.mjs +19 -9
  34. package/dist/astro/middleware/redirect.mjs.map +1 -1
  35. package/dist/astro/middleware/request-context.d.mts +2 -1
  36. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  37. package/dist/astro/middleware/request-context.mjs +15 -6
  38. package/dist/astro/middleware/request-context.mjs.map +1 -1
  39. package/dist/astro/middleware/setup.mjs +1 -1
  40. package/dist/astro/middleware.d.mts +12 -12
  41. package/dist/astro/middleware.mjs +114 -107
  42. package/dist/astro/middleware.mjs.map +1 -1
  43. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +15 -14
  44. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
  45. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +15 -14
  46. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
  47. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  48. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  49. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
  50. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +18 -17
  51. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
  52. package/dist/astro/routes/api/admin/byline-fields/index.mjs +18 -17
  53. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
  54. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +18 -17
  55. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
  56. package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
  57. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +36 -27
  58. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -1
  60. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +32 -26
  61. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
  63. package/dist/astro/routes/api/admin/bylines/index.mjs +32 -26
  64. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +20 -19
  66. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
  68. package/dist/astro/routes/api/admin/comments/bulk.mjs +19 -18
  69. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
  71. package/dist/astro/routes/api/admin/comments/index.mjs +19 -18
  72. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/core-update.d.mts +8 -0
  74. package/dist/astro/routes/api/admin/core-update.d.mts.map +1 -0
  75. package/dist/astro/routes/api/admin/core-update.mjs +28 -0
  76. package/dist/astro/routes/api/admin/core-update.mjs.map +1 -0
  77. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  78. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  79. package/dist/astro/routes/api/admin/media-usage/activation.mjs +21 -20
  80. package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -1
  81. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +23 -22
  82. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
  83. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +23 -22
  84. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
  85. package/dist/astro/routes/api/admin/media-usage/progress.mjs +26 -25
  86. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/media-usage/repair.mjs +32 -31
  88. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  89. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +23 -22
  90. package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +23 -22
  92. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
  93. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  94. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  95. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  96. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  97. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +75 -69
  98. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  99. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  100. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +74 -68
  101. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +75 -69
  103. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  104. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +86 -79
  105. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  106. package/dist/astro/routes/api/admin/plugins/index.mjs +75 -69
  107. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  108. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.d.mts.map +1 -1
  109. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +10 -7
  110. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs.map +1 -1
  111. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +74 -68
  112. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  113. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +85 -78
  114. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  115. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +74 -68
  116. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  117. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +75 -69
  118. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  119. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +87 -80
  120. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
  122. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +77 -71
  123. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  124. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  125. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +75 -69
  126. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  127. package/dist/astro/routes/api/admin/plugins/updates.mjs +74 -68
  128. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  129. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
  130. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +74 -68
  131. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  132. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.d.mts.map +1 -1
  133. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +10 -7
  134. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs.map +1 -1
  135. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +74 -68
  136. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  137. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  138. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +42 -41
  139. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
  140. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +42 -41
  141. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
  142. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +44 -43
  143. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
  144. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +44 -43
  145. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
  146. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +44 -43
  147. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
  148. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +45 -44
  149. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
  150. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +45 -44
  151. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
  152. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +44 -43
  153. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
  154. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +45 -44
  155. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
  156. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +46 -45
  157. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
  158. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +44 -43
  159. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
  160. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +44 -43
  161. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
  162. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +46 -45
  163. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
  164. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +44 -43
  165. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
  166. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +46 -45
  167. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
  168. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +44 -43
  169. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
  170. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +44 -43
  171. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
  172. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +46 -45
  173. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
  174. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +44 -43
  175. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
  176. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +44 -43
  177. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
  178. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +46 -45
  179. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
  180. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  181. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  182. package/dist/astro/routes/api/admin/users/_id_/index.mjs +16 -15
  183. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
  184. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  185. package/dist/astro/routes/api/admin/users/index.mjs +15 -14
  186. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
  187. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  188. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  189. package/dist/astro/routes/api/auth/invite/complete.d.mts.map +1 -1
  190. package/dist/astro/routes/api/auth/invite/complete.mjs +23 -19
  191. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
  192. package/dist/astro/routes/api/auth/invite/index.mjs +17 -16
  193. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  194. package/dist/astro/routes/api/auth/invite/register-options.mjs +18 -17
  195. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
  196. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  197. package/dist/astro/routes/api/auth/magic-link/send.mjs +19 -18
  198. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  199. package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -1
  200. package/dist/astro/routes/api/auth/magic-link/verify.mjs +19 -15
  201. package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
  202. package/dist/astro/routes/api/auth/me.mjs +16 -15
  203. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  204. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  205. package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts.map +1 -1
  206. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +13 -4
  207. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
  208. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  209. package/dist/astro/routes/api/auth/passkey/_id_.mjs +15 -14
  210. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
  211. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  212. package/dist/astro/routes/api/auth/passkey/options.mjs +20 -19
  213. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  214. package/dist/astro/routes/api/auth/passkey/register/options.mjs +18 -17
  215. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
  216. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +19 -18
  217. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
  218. package/dist/astro/routes/api/auth/passkey/verify.d.mts.map +1 -1
  219. package/dist/astro/routes/api/auth/passkey/verify.mjs +23 -19
  220. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
  221. package/dist/astro/routes/api/auth/signup/complete.d.mts.map +1 -1
  222. package/dist/astro/routes/api/auth/signup/complete.mjs +23 -19
  223. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
  224. package/dist/astro/routes/api/auth/signup/request.mjs +18 -17
  225. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  226. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  227. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
  228. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +20 -19
  229. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
  230. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  231. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +18 -17
  232. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  233. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  234. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +18 -17
  235. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
  236. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  237. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +12 -11
  238. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs.map +1 -1
  239. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +33 -32
  240. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  241. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -17
  242. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  243. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
  244. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
  245. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +44 -54
  246. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  247. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +36 -30
  248. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  249. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
  250. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  251. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +18 -17
  252. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  253. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +27 -25
  254. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  255. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  256. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +18 -17
  257. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  258. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  259. package/dist/astro/routes/api/content/_collection_/_id_.mjs +19 -18
  260. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  261. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  262. package/dist/astro/routes/api/content/_collection_/index.mjs +16 -15
  263. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  264. package/dist/astro/routes/api/content/_collection_/trash.mjs +16 -15
  265. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
  266. package/dist/astro/routes/api/dashboard.mjs +13 -10
  267. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  268. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  269. package/dist/astro/routes/api/health.mjs +6 -6
  270. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  271. package/dist/astro/routes/api/import/probe.mjs +25 -24
  272. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  273. package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
  274. package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -14
  275. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  276. package/dist/astro/routes/api/import/wordpress/execute.mjs +167 -21
  277. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  278. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  279. package/dist/astro/routes/api/import/wordpress/media.mjs +20 -19
  280. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
  281. package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -18
  282. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  283. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  284. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +29 -28
  285. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  286. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  287. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +25 -24
  288. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  289. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  290. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +36 -35
  291. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  292. package/dist/astro/routes/api/manifest.mjs +6 -6
  293. package/dist/astro/routes/api/mcp.mjs +167 -110
  294. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  295. package/dist/astro/routes/api/media/_id_/confirm.mjs +20 -19
  296. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  297. package/dist/astro/routes/api/media/_id_/replace.mjs +17 -16
  298. package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -1
  299. package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
  300. package/dist/astro/routes/api/media/_id_/usage.mjs +34 -33
  301. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  302. package/dist/astro/routes/api/media/_id_.mjs +32 -31
  303. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  304. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  305. package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
  306. package/dist/astro/routes/api/media/folders/_id_.mjs +17 -16
  307. package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -1
  308. package/dist/astro/routes/api/media/folders/index.mjs +17 -16
  309. package/dist/astro/routes/api/media/folders/index.mjs.map +1 -1
  310. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  311. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  312. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  313. package/dist/astro/routes/api/media/upload-url.mjs +19 -18
  314. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  315. package/dist/astro/routes/api/media.mjs +36 -35
  316. package/dist/astro/routes/api/media.mjs.map +1 -1
  317. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +19 -18
  318. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  319. package/dist/astro/routes/api/menus/_name_/items.mjs +19 -18
  320. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  321. package/dist/astro/routes/api/menus/_name_/reorder.mjs +19 -18
  322. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  323. package/dist/astro/routes/api/menus/_name_/translations.mjs +19 -18
  324. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  325. package/dist/astro/routes/api/menus/_name_.mjs +19 -18
  326. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  327. package/dist/astro/routes/api/menus/index.mjs +19 -18
  328. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  329. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  330. package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
  331. package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
  332. package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
  333. package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
  334. package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
  335. package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
  336. package/dist/astro/routes/api/oauth/register.d.mts.map +1 -1
  337. package/dist/astro/routes/api/oauth/register.mjs +15 -7
  338. package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
  339. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  340. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  341. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  342. package/dist/astro/routes/api/openapi.json.mjs +21 -20
  343. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  344. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +12 -11
  345. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
  346. package/dist/astro/routes/api/redirects/404s/index.mjs +20 -19
  347. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  348. package/dist/astro/routes/api/redirects/404s/summary.mjs +20 -19
  349. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  350. package/dist/astro/routes/api/redirects/_id_.mjs +20 -19
  351. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  352. package/dist/astro/routes/api/redirects/index.mjs +20 -19
  353. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  354. package/dist/astro/routes/api/relations/_id_/index.mjs +36 -30
  355. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  356. package/dist/astro/routes/api/relations/index.mjs +38 -32
  357. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  358. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  359. package/dist/astro/routes/api/revisions/_revisionId_/restore.d.mts.map +1 -1
  360. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +26 -6
  361. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
  362. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +74 -68
  363. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  364. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +74 -68
  365. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  366. package/dist/astro/routes/api/schema/block-types/index.mjs +74 -68
  367. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  368. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +76 -70
  369. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  370. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +74 -68
  371. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  372. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +74 -68
  373. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  374. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +74 -68
  375. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  376. package/dist/astro/routes/api/schema/collections/index.mjs +74 -68
  377. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  378. package/dist/astro/routes/api/schema/collections/reorder.mjs +74 -68
  379. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  380. package/dist/astro/routes/api/schema/index.mjs +17 -16
  381. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  382. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +74 -68
  383. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  384. package/dist/astro/routes/api/schema/orphans/index.mjs +74 -68
  385. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  386. package/dist/astro/routes/api/search/enable.mjs +20 -19
  387. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  388. package/dist/astro/routes/api/search/index.mjs +19 -18
  389. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  390. package/dist/astro/routes/api/search/rebuild.mjs +20 -19
  391. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  392. package/dist/astro/routes/api/search/stats.mjs +9 -9
  393. package/dist/astro/routes/api/search/suggest.mjs +19 -18
  394. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  395. package/dist/astro/routes/api/sections/_slug_.mjs +19 -18
  396. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  397. package/dist/astro/routes/api/sections/index.mjs +19 -18
  398. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  399. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  400. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  401. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  402. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  403. package/dist/astro/routes/api/settings/email.mjs +6 -6
  404. package/dist/astro/routes/api/settings.mjs +23 -22
  405. package/dist/astro/routes/api/settings.mjs.map +1 -1
  406. package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -1
  407. package/dist/astro/routes/api/setup/admin-verify.mjs +26 -24
  408. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  409. package/dist/astro/routes/api/setup/admin.mjs +19 -18
  410. package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
  411. package/dist/astro/routes/api/setup/dev-bypass.mjs +47 -40
  412. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  413. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  414. package/dist/astro/routes/api/setup/index.mjs +52 -45
  415. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  416. package/dist/astro/routes/api/setup/status.mjs +6 -6
  417. package/dist/astro/routes/api/snapshot.mjs +8 -8
  418. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +25 -24
  419. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  420. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +25 -24
  421. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  422. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -24
  423. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  424. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +25 -24
  425. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  426. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +24 -23
  427. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  428. package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -24
  429. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  430. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +42 -40
  431. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  432. package/dist/astro/routes/api/taxonomies/index.mjs +25 -24
  433. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  434. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  435. package/dist/astro/routes/api/typegen.d.mts.map +1 -1
  436. package/dist/astro/routes/api/typegen.mjs +8 -39
  437. package/dist/astro/routes/api/typegen.mjs.map +1 -1
  438. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  439. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +20 -19
  440. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs.map +1 -1
  441. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  442. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  443. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  444. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  445. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +17 -16
  446. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  447. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +20 -19
  448. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  449. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -19
  450. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  451. package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
  452. package/dist/astro/routes/api/widget-areas/index.mjs +20 -19
  453. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  454. package/dist/astro/routes/api/widget-components.mjs +5 -5
  455. package/dist/astro/routes/robots.txt.mjs +7 -7
  456. package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
  457. package/dist/astro/routes/sitemap.xml.mjs +8 -8
  458. package/dist/astro/types.d.mts +30 -18
  459. package/dist/astro/types.d.mts.map +1 -1
  460. package/dist/audit-BszbE_BP.mjs +127 -0
  461. package/dist/audit-BszbE_BP.mjs.map +1 -0
  462. package/dist/auth/providers/github.d.mts +1 -1
  463. package/dist/auth/providers/google.d.mts +1 -1
  464. package/dist/authoritative-records-dSvXCfzb.mjs +5172 -0
  465. package/dist/authoritative-records-dSvXCfzb.mjs.map +1 -0
  466. package/dist/authorize-soZXK7U0.mjs +49 -0
  467. package/dist/authorize-soZXK7U0.mjs.map +1 -0
  468. package/dist/backup-DQ3CABsO.mjs +246 -0
  469. package/dist/backup-DQ3CABsO.mjs.map +1 -0
  470. package/dist/block-types-DIG_KZwi.mjs +132 -0
  471. package/dist/block-types-DIG_KZwi.mjs.map +1 -0
  472. package/dist/block-values-BrTrtA-v.mjs +175 -0
  473. package/dist/block-values-BrTrtA-v.mjs.map +1 -0
  474. package/dist/byline-02tu_Uc-.mjs +909 -0
  475. package/dist/byline-02tu_Uc-.mjs.map +1 -0
  476. package/dist/byline-fields-B01Txzyx.mjs +123 -0
  477. package/dist/byline-fields-B01Txzyx.mjs.map +1 -0
  478. package/dist/byline-fields-DHJs0Mja.mjs +280 -0
  479. package/dist/byline-fields-DHJs0Mja.mjs.map +1 -0
  480. package/dist/byline-registry-dvt4N3xV.mjs +406 -0
  481. package/dist/byline-registry-dvt4N3xV.mjs.map +1 -0
  482. package/dist/bylines-COTwmMBF.mjs +150 -0
  483. package/dist/bylines-COTwmMBF.mjs.map +1 -0
  484. package/dist/bylines-D_S8UKRX.mjs +214 -0
  485. package/dist/bylines-D_S8UKRX.mjs.map +1 -0
  486. package/dist/cache-CPanL9IO.mjs +114 -0
  487. package/dist/cache-CPanL9IO.mjs.map +1 -0
  488. package/dist/canonical-CAecl1UQ.mjs +174 -0
  489. package/dist/canonical-CAecl1UQ.mjs.map +1 -0
  490. package/dist/capture-triggers-CdZfvHtF.mjs +362 -0
  491. package/dist/capture-triggers-CdZfvHtF.mjs.map +1 -0
  492. package/dist/challenge-store-CxZxPqaw.mjs +51 -0
  493. package/dist/challenge-store-CxZxPqaw.mjs.map +1 -0
  494. package/dist/checksum-DtH6m5uk.mjs +162 -0
  495. package/dist/checksum-DtH6m5uk.mjs.map +1 -0
  496. package/dist/chrome-tags-CKELm-bo.mjs +24 -0
  497. package/dist/chrome-tags-CKELm-bo.mjs.map +1 -0
  498. package/dist/chunks-DBmkKmBH.mjs +25 -0
  499. package/dist/chunks-DBmkKmBH.mjs.map +1 -0
  500. package/dist/cli/index.mjs +380 -1620
  501. package/dist/cli/index.mjs.map +1 -1
  502. package/dist/client/cf-access.d.mts +1 -1
  503. package/dist/client/index.d.mts +39 -34
  504. package/dist/client/index.d.mts.map +1 -1
  505. package/dist/client/index.mjs +8 -3
  506. package/dist/client/index.mjs.map +1 -1
  507. package/dist/collection-deletion-JecE26cS.mjs +436 -0
  508. package/dist/collection-deletion-JecE26cS.mjs.map +1 -0
  509. package/dist/collection-deletion-processor-DgCfF3a1.mjs +217 -0
  510. package/dist/collection-deletion-processor-DgCfF3a1.mjs.map +1 -0
  511. package/dist/collection-slugs-cache-BNRAPNiu.mjs +85 -0
  512. package/dist/collection-slugs-cache-BNRAPNiu.mjs.map +1 -0
  513. package/dist/comment-Cq1UYN8_.mjs +313 -0
  514. package/dist/comment-Cq1UYN8_.mjs.map +1 -0
  515. package/dist/comment-reaction-DPeGAfjd.mjs +85 -0
  516. package/dist/comment-reaction-DPeGAfjd.mjs.map +1 -0
  517. package/dist/comments-BRtp992B.mjs +99 -0
  518. package/dist/comments-BRtp992B.mjs.map +1 -0
  519. package/dist/comments-Bi2j9IoX.mjs +195 -0
  520. package/dist/comments-Bi2j9IoX.mjs.map +1 -0
  521. package/dist/components-CQY-Sgm-.mjs +108 -0
  522. package/dist/components-CQY-Sgm-.mjs.map +1 -0
  523. package/dist/config-BnuORwSP.mjs +242 -0
  524. package/dist/config-BnuORwSP.mjs.map +1 -0
  525. package/dist/config-CDmPF4p7.d.mts +39 -0
  526. package/dist/config-CDmPF4p7.d.mts.map +1 -0
  527. package/dist/config-DHsDMpXc.d.mts +6707 -0
  528. package/dist/config-DHsDMpXc.d.mts.map +1 -0
  529. package/dist/connection-B9pIasFd.mjs +36 -0
  530. package/dist/connection-B9pIasFd.mjs.map +1 -0
  531. package/dist/content-RzEXY3QX.mjs +2020 -0
  532. package/dist/content-RzEXY3QX.mjs.map +1 -0
  533. package/dist/content-list-query-CnXfe1Nu.d.mts +26 -0
  534. package/dist/content-list-query-CnXfe1Nu.d.mts.map +1 -0
  535. package/dist/content-policy-Dm32n9C6.mjs +46 -0
  536. package/dist/content-policy-Dm32n9C6.mjs.map +1 -0
  537. package/dist/content-repair-B-k5JrVN.mjs +442 -0
  538. package/dist/content-repair-B-k5JrVN.mjs.map +1 -0
  539. package/dist/context-CtRvoSAj.mjs +2026 -0
  540. package/dist/context-CtRvoSAj.mjs.map +1 -0
  541. package/dist/credits-CAFPFhuk.mjs +110 -0
  542. package/dist/credits-CAFPFhuk.mjs.map +1 -0
  543. package/dist/cron-xe5XKqA-.mjs +306 -0
  544. package/dist/cron-xe5XKqA-.mjs.map +1 -0
  545. package/dist/dashboard-BoV4pwPP.mjs +151 -0
  546. package/dist/dashboard-BoV4pwPP.mjs.map +1 -0
  547. package/dist/db/index.d.mts +3 -3
  548. package/dist/db/index.mjs +1 -1
  549. package/dist/db/libsql-migrations.d.mts +1 -1
  550. package/dist/db/libsql-migrations.mjs +4 -4
  551. package/dist/db/libsql.d.mts +1 -1
  552. package/dist/db/postgres-migrations.d.mts +1 -1
  553. package/dist/db/postgres-migrations.mjs +4 -4
  554. package/dist/db/postgres.d.mts +1 -1
  555. package/dist/db/sqlite-migrations.d.mts +1 -1
  556. package/dist/db/sqlite-migrations.mjs +4 -4
  557. package/dist/db/sqlite.d.mts +1 -1
  558. package/dist/db/sqlite.mjs +1 -1
  559. package/dist/default-DaoYyFRS.mjs +81 -0
  560. package/dist/default-DaoYyFRS.mjs.map +1 -0
  561. package/dist/deferred-tasks-OBADxoFf.d.mts +9 -0
  562. package/dist/deferred-tasks-OBADxoFf.d.mts.map +1 -0
  563. package/dist/destination-r2zIAZ2S.mjs +18 -0
  564. package/dist/destination-r2zIAZ2S.mjs.map +1 -0
  565. package/dist/dev-typegen-8JlYYFno.mjs +29 -0
  566. package/dist/dev-typegen-8JlYYFno.mjs.map +1 -0
  567. package/dist/device-flow-CzKi6tID.mjs +521 -0
  568. package/dist/device-flow-CzKi6tID.mjs.map +1 -0
  569. package/dist/digest-DiYAoZpf.mjs +194 -0
  570. package/dist/digest-DiYAoZpf.mjs.map +1 -0
  571. package/dist/direct-executor-CsEmH_2m.mjs +104 -0
  572. package/dist/direct-executor-CsEmH_2m.mjs.map +1 -0
  573. package/dist/dist-Cfu8mMBs.mjs +810 -0
  574. package/dist/dist-Cfu8mMBs.mjs.map +1 -0
  575. package/dist/email-console-DmqVF5J_.mjs +50 -0
  576. package/dist/email-console-DmqVF5J_.mjs.map +1 -0
  577. package/dist/email-locale-B5OjmAj_.mjs +25 -0
  578. package/dist/email-locale-B5OjmAj_.mjs.map +1 -0
  579. package/dist/emdash-runtime-CMdYH2Of.mjs +4229 -0
  580. package/dist/emdash-runtime-CMdYH2Of.mjs.map +1 -0
  581. package/dist/enrich-BDdVNeDK.mjs +194 -0
  582. package/dist/enrich-BDdVNeDK.mjs.map +1 -0
  583. package/dist/entry-lock-B-1bUDxX.d.mts +4544 -0
  584. package/dist/entry-lock-B-1bUDxX.d.mts.map +1 -0
  585. package/dist/entry-lock-B5eaZEZP.mjs +163 -0
  586. package/dist/entry-lock-B5eaZEZP.mjs.map +1 -0
  587. package/dist/entry-lock-PP1JCXBB.mjs +1180 -0
  588. package/dist/entry-lock-PP1JCXBB.mjs.map +1 -0
  589. package/dist/entry-locks-DJAqVweV.mjs +167 -0
  590. package/dist/entry-locks-DJAqVweV.mjs.map +1 -0
  591. package/dist/env-types-BaTCgn-y.mjs +38 -0
  592. package/dist/env-types-BaTCgn-y.mjs.map +1 -0
  593. package/dist/error-CEdm_AWU.mjs +90 -0
  594. package/dist/error-CEdm_AWU.mjs.map +1 -0
  595. package/dist/errors-CNvATh_7.mjs +469 -0
  596. package/dist/errors-CNvATh_7.mjs.map +1 -0
  597. package/dist/errors-CjXd1LgH.mjs +120 -0
  598. package/dist/errors-CjXd1LgH.mjs.map +1 -0
  599. package/dist/escape-nJW7dR0s.mjs +9 -0
  600. package/dist/escape-nJW7dR0s.mjs.map +1 -0
  601. package/dist/fence-BrnQffdY.mjs +162 -0
  602. package/dist/fence-BrnQffdY.mjs.map +1 -0
  603. package/dist/field-defs-cache-DEkFYCDE.mjs +77 -0
  604. package/dist/field-defs-cache-DEkFYCDE.mjs.map +1 -0
  605. package/dist/field-map-Cp5hDSRU.mjs +83 -0
  606. package/dist/field-map-Cp5hDSRU.mjs.map +1 -0
  607. package/dist/focal-point-JX8kcOTQ.mjs +23 -0
  608. package/dist/focal-point-JX8kcOTQ.mjs.map +1 -0
  609. package/dist/fts-manager-DU03MxWu.mjs +443 -0
  610. package/dist/fts-manager-DU03MxWu.mjs.map +1 -0
  611. package/dist/gc-Gf9LOF42.mjs +75 -0
  612. package/dist/gc-Gf9LOF42.mjs.map +1 -0
  613. package/dist/hash-CY4QdeMJ.mjs +37 -0
  614. package/dist/hash-CY4QdeMJ.mjs.map +1 -0
  615. package/dist/hook-result-DjdVwWpw.d.mts +31 -0
  616. package/dist/hook-result-DjdVwWpw.d.mts.map +1 -0
  617. package/dist/hreflang-Bq0ahAd4.mjs +105 -0
  618. package/dist/hreflang-Bq0ahAd4.mjs.map +1 -0
  619. package/dist/hreflang-C7ETs0Tv.d.mts +50 -0
  620. package/dist/hreflang-C7ETs0Tv.d.mts.map +1 -0
  621. package/dist/http-route-dispatch-B2G7_OOm.mjs +339 -0
  622. package/dist/http-route-dispatch-B2G7_OOm.mjs.map +1 -0
  623. package/dist/identity-u3KgtUC9.mjs +35 -0
  624. package/dist/identity-u3KgtUC9.mjs.map +1 -0
  625. package/dist/import-CzP9ffo0.mjs +2020 -0
  626. package/dist/import-CzP9ffo0.mjs.map +1 -0
  627. package/dist/index-D1_ykO2u.d.mts +623 -0
  628. package/dist/index-D1_ykO2u.d.mts.map +1 -0
  629. package/dist/index.d.mts +24 -24
  630. package/dist/index.mjs +108 -102
  631. package/dist/install-finalization-TbcQozrV.mjs +58 -0
  632. package/dist/install-finalization-TbcQozrV.mjs.map +1 -0
  633. package/dist/keys-r08WvAng.mjs +61 -0
  634. package/dist/keys-r08WvAng.mjs.map +1 -0
  635. package/dist/kinds-CXY-fwQ6.mjs +974 -0
  636. package/dist/kinds-CXY-fwQ6.mjs.map +1 -0
  637. package/dist/lifecycle-CpebZNAA.mjs +25 -0
  638. package/dist/lifecycle-CpebZNAA.mjs.map +1 -0
  639. package/dist/load-dHcR5yh9.mjs +28 -0
  640. package/dist/load-dHcR5yh9.mjs.map +1 -0
  641. package/dist/loader-B_bcoE1h.mjs +1197 -0
  642. package/dist/loader-B_bcoE1h.mjs.map +1 -0
  643. package/dist/loops-Dn1i16FP.mjs +205 -0
  644. package/dist/loops-Dn1i16FP.mjs.map +1 -0
  645. package/dist/manifest-builder-D7Y8iirE.mjs +189 -0
  646. package/dist/manifest-builder-D7Y8iirE.mjs.map +1 -0
  647. package/dist/manifest-schema-gy37bD_D.mjs +496 -0
  648. package/dist/manifest-schema-gy37bD_D.mjs.map +1 -0
  649. package/dist/marketplace-tHWSsCUo.mjs +257 -0
  650. package/dist/marketplace-tHWSsCUo.mjs.map +1 -0
  651. package/dist/media/image-endpoint.mjs +1 -1
  652. package/dist/media/index.d.mts +1 -1
  653. package/dist/media/index.mjs +4 -4
  654. package/dist/media/local-runtime.d.mts +14 -14
  655. package/dist/media/local-runtime.mjs +7 -7
  656. package/dist/media-3v7mqAVX.mjs +294 -0
  657. package/dist/media-3v7mqAVX.mjs.map +1 -0
  658. package/dist/media-CputjGE1.mjs +373 -0
  659. package/dist/media-CputjGE1.mjs.map +1 -0
  660. package/dist/media-D1z_jisb.mjs +408 -0
  661. package/dist/media-D1z_jisb.mjs.map +1 -0
  662. package/dist/media-allowlist-D5a4d-RA.mjs +44 -0
  663. package/dist/media-allowlist-D5a4d-RA.mjs.map +1 -0
  664. package/dist/media-folders-D2VdVBf6.mjs +210 -0
  665. package/dist/media-folders-D2VdVBf6.mjs.map +1 -0
  666. package/dist/media-url-DloW2xrP.mjs +43 -0
  667. package/dist/media-url-DloW2xrP.mjs.map +1 -0
  668. package/dist/media-usage-B8q0owWQ.mjs +1629 -0
  669. package/dist/media-usage-B8q0owWQ.mjs.map +1 -0
  670. package/dist/media-usage-activation-CQWOOTJi.mjs +78 -0
  671. package/dist/media-usage-activation-CQWOOTJi.mjs.map +1 -0
  672. package/dist/media-usage-work-BC0qpkMD.mjs +152 -0
  673. package/dist/media-usage-work-BC0qpkMD.mjs.map +1 -0
  674. package/dist/media-usage-work-BlMjwPg8.mjs +586 -0
  675. package/dist/media-usage-work-BlMjwPg8.mjs.map +1 -0
  676. package/dist/menus-BQKqf0Up.mjs +92 -0
  677. package/dist/menus-BQKqf0Up.mjs.map +1 -0
  678. package/dist/menus-DiuhXKWf.mjs +3646 -0
  679. package/dist/menus-DiuhXKWf.mjs.map +1 -0
  680. package/dist/menus-trvc6_fW.mjs +753 -0
  681. package/dist/menus-trvc6_fW.mjs.map +1 -0
  682. package/dist/migrations/index.d.mts +1 -1
  683. package/dist/migrations/index.mjs +3 -3
  684. package/dist/mime-IZf-LHIS.mjs +36 -0
  685. package/dist/mime-IZf-LHIS.mjs.map +1 -0
  686. package/dist/mode-nh0ppSX5.mjs +23 -0
  687. package/dist/mode-nh0ppSX5.mjs.map +1 -0
  688. package/dist/node-sqlite-compat-CDOEcc97.mjs +63 -0
  689. package/dist/node-sqlite-compat-CDOEcc97.mjs.map +1 -0
  690. package/dist/normalize-BuWa0lvd.mjs +191 -0
  691. package/dist/normalize-BuWa0lvd.mjs.map +1 -0
  692. package/dist/oauth-authorization-BcRdGojQ.mjs +274 -0
  693. package/dist/oauth-authorization-BcRdGojQ.mjs.map +1 -0
  694. package/dist/oauth-clients-C-8WDTqj.mjs +266 -0
  695. package/dist/oauth-clients-C-8WDTqj.mjs.map +1 -0
  696. package/dist/oauth-state-store-CM5ZEYQS.mjs +50 -0
  697. package/dist/oauth-state-store-CM5ZEYQS.mjs.map +1 -0
  698. package/dist/oauth-user-lookup-DrrqvTZC.mjs +26 -0
  699. package/dist/oauth-user-lookup-DrrqvTZC.mjs.map +1 -0
  700. package/dist/object-cache/memory.d.mts +1 -1
  701. package/dist/object-cache-Bo6DGaC9.mjs +586 -0
  702. package/dist/object-cache-Bo6DGaC9.mjs.map +1 -0
  703. package/dist/options-C2IDQnD2.d.mts +81 -0
  704. package/dist/options-C2IDQnD2.d.mts.map +1 -0
  705. package/dist/ownership-DoeAIuTg.mjs +12 -0
  706. package/dist/ownership-DoeAIuTg.mjs.map +1 -0
  707. package/dist/page/index.d.mts +2 -2
  708. package/dist/page/index.mjs +6 -6
  709. package/dist/parse-D5Sw9wAI.d.mts +172 -0
  710. package/dist/parse-D5Sw9wAI.d.mts.map +1 -0
  711. package/dist/parse-Gt2l4Sld.mjs +81 -0
  712. package/dist/parse-Gt2l4Sld.mjs.map +1 -0
  713. package/dist/passkey-config-CkQsrcU-.mjs +46 -0
  714. package/dist/passkey-config-CkQsrcU-.mjs.map +1 -0
  715. package/dist/paths-DiENGBx5.mjs +77 -0
  716. package/dist/paths-DiENGBx5.mjs.map +1 -0
  717. package/dist/patterns-DyZJ67I7.mjs +140 -0
  718. package/dist/patterns-DyZJ67I7.mjs.map +1 -0
  719. package/dist/placeholder-Cq5wLDCX.d.mts +306 -0
  720. package/dist/placeholder-Cq5wLDCX.d.mts.map +1 -0
  721. package/dist/plan-BxCS1tl5.mjs +135 -0
  722. package/dist/plan-BxCS1tl5.mjs.map +1 -0
  723. package/dist/plugin-test-runtime.d.mts +14 -14
  724. package/dist/plugin-test-runtime.mjs +115 -108
  725. package/dist/plugin-types.d.mts +5 -3
  726. package/dist/plugin-types.d.mts.map +1 -1
  727. package/dist/plugin-types.mjs.map +1 -1
  728. package/dist/plugin-utils.d.mts +12 -12
  729. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  730. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  731. package/dist/plugins/adapt-sandbox-entry.mjs +48 -10
  732. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  733. package/dist/plugins/host.d.mts +6 -6
  734. package/dist/plugins/host.mjs +49 -43
  735. package/dist/plugins-BpLkXA1S.mjs +277 -0
  736. package/dist/plugins-BpLkXA1S.mjs.map +1 -0
  737. package/dist/policy-C1qpNxrr.mjs +45 -0
  738. package/dist/policy-C1qpNxrr.mjs.map +1 -0
  739. package/dist/portable-text-BnRuiR1-.mjs +307 -0
  740. package/dist/portable-text-BnRuiR1-.mjs.map +1 -0
  741. package/dist/preview-DU5rwz_m.mjs +107 -0
  742. package/dist/preview-DU5rwz_m.mjs.map +1 -0
  743. package/dist/protocol-B9GEhEyi.d.mts +61 -0
  744. package/dist/protocol-B9GEhEyi.d.mts.map +1 -0
  745. package/dist/public-submission-yZaTTfsC.mjs +250 -0
  746. package/dist/public-submission-yZaTTfsC.mjs.map +1 -0
  747. package/dist/public-url-B5a0QAh6.mjs +101 -0
  748. package/dist/public-url-B5a0QAh6.mjs.map +1 -0
  749. package/dist/query-6e2CQxUv.mjs +1161 -0
  750. package/dist/query-6e2CQxUv.mjs.map +1 -0
  751. package/dist/query-DC3bv__4.mjs +41 -0
  752. package/dist/query-DC3bv__4.mjs.map +1 -0
  753. package/dist/rate-limit-BXx3Ecp9.mjs +120 -0
  754. package/dist/rate-limit-BXx3Ecp9.mjs.map +1 -0
  755. package/dist/receipt-q1VK9jhj.mjs +43 -0
  756. package/dist/receipt-q1VK9jhj.mjs.map +1 -0
  757. package/dist/redirect-BvFKh8Sz.mjs +416 -0
  758. package/dist/redirect-BvFKh8Sz.mjs.map +1 -0
  759. package/dist/redirect-D1AmADlk.mjs +19 -0
  760. package/dist/redirect-D1AmADlk.mjs.map +1 -0
  761. package/dist/redirects-CWQMKYOS.mjs +446 -0
  762. package/dist/redirects-CWQMKYOS.mjs.map +1 -0
  763. package/dist/redirects-D4EWeXAo.mjs +148 -0
  764. package/dist/redirects-D4EWeXAo.mjs.map +1 -0
  765. package/dist/registry/testing.d.mts +16 -4
  766. package/dist/registry/testing.d.mts.map +1 -1
  767. package/dist/registry/testing.mjs +20 -10
  768. package/dist/registry/testing.mjs.map +1 -1
  769. package/dist/registry-CtHRqVe-.mjs +6771 -0
  770. package/dist/registry-CtHRqVe-.mjs.map +1 -0
  771. package/dist/relations-CVI2nbrn.mjs +776 -0
  772. package/dist/relations-CVI2nbrn.mjs.map +1 -0
  773. package/dist/request-cache-C4CIo5ad.mjs +104 -0
  774. package/dist/request-cache-C4CIo5ad.mjs.map +1 -0
  775. package/dist/request-context.d.mts +9 -1
  776. package/dist/request-context.d.mts.map +1 -1
  777. package/dist/request-context.mjs.map +1 -1
  778. package/dist/request-meta-B6blULFY.mjs +141 -0
  779. package/dist/request-meta-B6blULFY.mjs.map +1 -0
  780. package/dist/resolve-Cx0Pwz0-.mjs +100 -0
  781. package/dist/resolve-Cx0Pwz0-.mjs.map +1 -0
  782. package/dist/resolve-D-kqyKns.mjs +199 -0
  783. package/dist/resolve-D-kqyKns.mjs.map +1 -0
  784. package/dist/revision-CGkQA0e5.mjs +366 -0
  785. package/dist/revision-CGkQA0e5.mjs.map +1 -0
  786. package/dist/route-wire-DK600v4u.mjs +197 -0
  787. package/dist/route-wire-DK600v4u.mjs.map +1 -0
  788. package/dist/routes-DTduBPzX.mjs +272 -0
  789. package/dist/routes-DTduBPzX.mjs.map +1 -0
  790. package/dist/runner-CLpxmhl8.mjs +6197 -0
  791. package/dist/runner-CLpxmhl8.mjs.map +1 -0
  792. package/dist/runner-Ji7qyH2A.d.mts +68 -0
  793. package/dist/runner-Ji7qyH2A.d.mts.map +1 -0
  794. package/dist/runtime.d.mts +13 -13
  795. package/dist/runtime.mjs +3 -3
  796. package/dist/schema/project-env-types.d.mts +12 -0
  797. package/dist/schema/project-env-types.d.mts.map +1 -0
  798. package/dist/schema/project-env-types.mjs +86 -0
  799. package/dist/schema/project-env-types.mjs.map +1 -0
  800. package/dist/schema-BZPj3kwZ.mjs +13 -0
  801. package/dist/schema-BZPj3kwZ.mjs.map +1 -0
  802. package/dist/schema-Berj5VQx.mjs +815 -0
  803. package/dist/schema-Berj5VQx.mjs.map +1 -0
  804. package/dist/scopes-C1HJaIyf.mjs +34 -0
  805. package/dist/scopes-C1HJaIyf.mjs.map +1 -0
  806. package/dist/search-thYf8j9F.mjs +448 -0
  807. package/dist/search-thYf8j9F.mjs.map +1 -0
  808. package/dist/sections-2k1uIgJ0.mjs +346 -0
  809. package/dist/sections-2k1uIgJ0.mjs.map +1 -0
  810. package/dist/seed/index.d.mts +2 -2
  811. package/dist/seed/index.mjs +39 -32
  812. package/dist/seo/index.d.mts +3 -3
  813. package/dist/seo/index.mjs +24 -22
  814. package/dist/seo/index.mjs.map +1 -1
  815. package/dist/seo-C61bnPuV.mjs +114 -0
  816. package/dist/seo-C61bnPuV.mjs.map +1 -0
  817. package/dist/seo-DpYxmGaL.mjs +133 -0
  818. package/dist/seo-DpYxmGaL.mjs.map +1 -0
  819. package/dist/service-BFUImckH.mjs +150 -0
  820. package/dist/service-BFUImckH.mjs.map +1 -0
  821. package/dist/session-user-DVcHsFD5.mjs +61 -0
  822. package/dist/session-user-DVcHsFD5.mjs.map +1 -0
  823. package/dist/settings-B0zQj_Tj.mjs +61 -0
  824. package/dist/settings-B0zQj_Tj.mjs.map +1 -0
  825. package/dist/settings-BJjK_X7x.mjs +51 -0
  826. package/dist/settings-BJjK_X7x.mjs.map +1 -0
  827. package/dist/settings-BbVRRGDp.mjs +439 -0
  828. package/dist/settings-BbVRRGDp.mjs.map +1 -0
  829. package/dist/setup-complete-CuLcTDTU.mjs +65 -0
  830. package/dist/setup-complete-CuLcTDTU.mjs.map +1 -0
  831. package/dist/setup-nonce-CAQoY5PC.mjs +25 -0
  832. package/dist/setup-nonce-CAQoY5PC.mjs.map +1 -0
  833. package/dist/site-settings-AYFvhwQn.mjs +50 -0
  834. package/dist/site-settings-AYFvhwQn.mjs.map +1 -0
  835. package/dist/site-url-Ceq_AUK0.mjs +16 -0
  836. package/dist/site-url-Ceq_AUK0.mjs.map +1 -0
  837. package/dist/snapshot-Dzsn3NZa.mjs +414 -0
  838. package/dist/snapshot-Dzsn3NZa.mjs.map +1 -0
  839. package/dist/ssrf-DsmvZB80.mjs +406 -0
  840. package/dist/ssrf-DsmvZB80.mjs.map +1 -0
  841. package/dist/stage-Cf9PqdUB.mjs +662 -0
  842. package/dist/stage-Cf9PqdUB.mjs.map +1 -0
  843. package/dist/staged-Bw5eHbKS.mjs +686 -0
  844. package/dist/staged-Bw5eHbKS.mjs.map +1 -0
  845. package/dist/state-kGdOMQRY.mjs +153 -0
  846. package/dist/state-kGdOMQRY.mjs.map +1 -0
  847. package/dist/status-D39Fpy8R.mjs +30 -0
  848. package/dist/status-D39Fpy8R.mjs.map +1 -0
  849. package/dist/storage/local.d.mts +1 -1
  850. package/dist/storage/local.mjs +1 -1
  851. package/dist/storage/s3.d.mts +1 -1
  852. package/dist/storage/s3.mjs +1 -1
  853. package/dist/storage-query-C9bK0Dg6.d.mts +1614 -0
  854. package/dist/storage-query-C9bK0Dg6.d.mts.map +1 -0
  855. package/dist/tar-lDI_fzLD.mjs +449 -0
  856. package/dist/tar-lDI_fzLD.mjs.map +1 -0
  857. package/dist/target-DOFs5oUC.mjs +27 -0
  858. package/dist/target-DOFs5oUC.mjs.map +1 -0
  859. package/dist/taxonomies-DQGomz9p.mjs +939 -0
  860. package/dist/taxonomies-DQGomz9p.mjs.map +1 -0
  861. package/dist/taxonomies-DWv-OYT0.mjs +697 -0
  862. package/dist/taxonomies-DWv-OYT0.mjs.map +1 -0
  863. package/dist/taxonomy-BesdHIwi.mjs +525 -0
  864. package/dist/taxonomy-BesdHIwi.mjs.map +1 -0
  865. package/dist/tokens-BIGxi8sP.mjs +171 -0
  866. package/dist/tokens-BIGxi8sP.mjs.map +1 -0
  867. package/dist/transaction-BVYIo_yu.mjs +29 -0
  868. package/dist/transaction-BVYIo_yu.mjs.map +1 -0
  869. package/dist/transfer-BtzoaXLk.mjs +166 -0
  870. package/dist/transfer-BtzoaXLk.mjs.map +1 -0
  871. package/dist/transfer-DLu_6AXL.mjs +8856 -0
  872. package/dist/transfer-DLu_6AXL.mjs.map +1 -0
  873. package/dist/transfer-download-b_PCrqJJ.mjs +33 -0
  874. package/dist/transfer-download-b_PCrqJJ.mjs.map +1 -0
  875. package/dist/transformations-DdnpSdeC.mjs +196 -0
  876. package/dist/transformations-DdnpSdeC.mjs.map +1 -0
  877. package/dist/transport-flR-Zmds.d.mts +42 -0
  878. package/dist/transport-flR-Zmds.d.mts.map +1 -0
  879. package/dist/transport-umzEbgYO.mjs +136 -0
  880. package/dist/transport-umzEbgYO.mjs.map +1 -0
  881. package/dist/trusted-proxy-BqfQFs6a.mjs +51 -0
  882. package/dist/trusted-proxy-BqfQFs6a.mjs.map +1 -0
  883. package/dist/turnstile-IvQp2uyD.mjs +53 -0
  884. package/dist/turnstile-IvQp2uyD.mjs.map +1 -0
  885. package/dist/types-2V_MVPYy.d.mts +125 -0
  886. package/dist/types-2V_MVPYy.d.mts.map +1 -0
  887. package/dist/types-B-WCvzdi.d.mts +198 -0
  888. package/dist/types-B-WCvzdi.d.mts.map +1 -0
  889. package/dist/types-BGmQ0uXs.mjs +201 -0
  890. package/dist/types-BGmQ0uXs.mjs.map +1 -0
  891. package/dist/types-CVsmpTcU.mjs +18 -0
  892. package/dist/types-CVsmpTcU.mjs.map +1 -0
  893. package/dist/types-C_V-_vMS.d.mts +198 -0
  894. package/dist/types-C_V-_vMS.d.mts.map +1 -0
  895. package/dist/types-CdEMurNh.mjs +77 -0
  896. package/dist/types-CdEMurNh.mjs.map +1 -0
  897. package/dist/types-CsmwbOwa.mjs +22 -0
  898. package/dist/types-CsmwbOwa.mjs.map +1 -0
  899. package/dist/types-Cw-1it3n.d.mts +287 -0
  900. package/dist/types-Cw-1it3n.d.mts.map +1 -0
  901. package/dist/types-D7B20WFC.d.mts +374 -0
  902. package/dist/types-D7B20WFC.d.mts.map +1 -0
  903. package/dist/types-DGw8KMX_.mjs +16 -0
  904. package/dist/types-DGw8KMX_.mjs.map +1 -0
  905. package/dist/types-DZeDpzMc.d.mts +896 -0
  906. package/dist/types-DZeDpzMc.d.mts.map +1 -0
  907. package/dist/types-DuQAIPA-.d.mts +363 -0
  908. package/dist/types-DuQAIPA-.d.mts.map +1 -0
  909. package/dist/types-edRPQchz.d.mts +85 -0
  910. package/dist/types-edRPQchz.d.mts.map +1 -0
  911. package/dist/types-j6MBDjlZ.mjs +103 -0
  912. package/dist/types-j6MBDjlZ.mjs.map +1 -0
  913. package/dist/types-pOLeFKGq.d.mts +1720 -0
  914. package/dist/types-pOLeFKGq.d.mts.map +1 -0
  915. package/dist/update-check-CaZyFHZC.mjs +161 -0
  916. package/dist/update-check-CaZyFHZC.mjs.map +1 -0
  917. package/dist/upload-attempts-BodUoFBu.mjs +32 -0
  918. package/dist/upload-attempts-BodUoFBu.mjs.map +1 -0
  919. package/dist/url-Dn3IStq8.mjs +104 -0
  920. package/dist/url-Dn3IStq8.mjs.map +1 -0
  921. package/dist/url-pattern-DGAG6ZP2.mjs +41 -0
  922. package/dist/url-pattern-DGAG6ZP2.mjs.map +1 -0
  923. package/dist/user-BOvuF1sQ.mjs +171 -0
  924. package/dist/user-BOvuF1sQ.mjs.map +1 -0
  925. package/dist/utils-CoV-PYhg.mjs +439 -0
  926. package/dist/utils-CoV-PYhg.mjs.map +1 -0
  927. package/dist/validate-WkjGwBSO.mjs +516 -0
  928. package/dist/validate-WkjGwBSO.mjs.map +1 -0
  929. package/dist/validate-dK97qe7F.d.mts +468 -0
  930. package/dist/validate-dK97qe7F.d.mts.map +1 -0
  931. package/dist/validation-D-ICq_tY.mjs +219 -0
  932. package/dist/validation-D-ICq_tY.mjs.map +1 -0
  933. package/dist/version-DbT04wbH.mjs +9 -0
  934. package/dist/version-DbT04wbH.mjs.map +1 -0
  935. package/dist/version-IneBU54o.mjs +7 -0
  936. package/dist/version-IneBU54o.mjs.map +1 -0
  937. package/dist/virtual-modules-Brh6mRVe.mjs +516 -0
  938. package/dist/virtual-modules-Brh6mRVe.mjs.map +1 -0
  939. package/dist/widgets-D8T0xBYs.mjs +126 -0
  940. package/dist/widgets-D8T0xBYs.mjs.map +1 -0
  941. package/dist/wxr-taxonomies-B6iE8m9I.d.mts +34 -0
  942. package/dist/wxr-taxonomies-B6iE8m9I.d.mts.map +1 -0
  943. package/dist/wxr-taxonomies-DEzR9N7e.mjs +453 -0
  944. package/dist/wxr-taxonomies-DEzR9N7e.mjs.map +1 -0
  945. package/dist/zod-generator-DnfG5sGQ.mjs +424 -0
  946. package/dist/zod-generator-DnfG5sGQ.mjs.map +1 -0
  947. package/package.json +15 -15
  948. package/src/api/errors.ts +11 -0
  949. package/src/api/handlers/bulk-tag.ts +4 -4
  950. package/src/api/handlers/content.ts +631 -32
  951. package/src/api/handlers/device-flow.ts +74 -21
  952. package/src/api/handlers/index.ts +3 -0
  953. package/src/api/handlers/manifest.ts +81 -5
  954. package/src/api/handlers/media-upload.ts +3 -0
  955. package/src/api/handlers/media.ts +2 -2
  956. package/src/api/handlers/registry.ts +123 -70
  957. package/src/api/handlers/relations.ts +638 -157
  958. package/src/api/handlers/revision.ts +40 -2
  959. package/src/api/handlers/schema.ts +403 -1
  960. package/src/api/handlers/staged-references.ts +208 -0
  961. package/src/api/handlers/update-check.ts +236 -0
  962. package/src/api/handlers/validate-references.ts +146 -0
  963. package/src/api/redirect.ts +9 -1
  964. package/src/api/schemas/content.ts +17 -0
  965. package/src/api/schemas/import.ts +50 -14
  966. package/src/api/schemas/relations.ts +54 -44
  967. package/src/api/schemas/schema.ts +26 -6
  968. package/src/api/setup-complete.ts +49 -1
  969. package/src/api/types.ts +4 -0
  970. package/src/astro/dev-typegen.ts +15 -22
  971. package/src/astro/integration/dev-typegen.ts +32 -3
  972. package/src/astro/integration/index.ts +88 -22
  973. package/src/astro/integration/routes.ts +21 -19
  974. package/src/astro/integration/runtime.ts +33 -7
  975. package/src/astro/integration/virtual-modules.ts +1 -0
  976. package/src/astro/integration/vite-config.ts +16 -8
  977. package/src/astro/middleware/redirect.ts +15 -2
  978. package/src/astro/middleware/request-context.ts +13 -6
  979. package/src/astro/routes/api/admin/bylines/[id]/index.ts +11 -1
  980. package/src/astro/routes/api/admin/bylines/[id]/translations.ts +7 -1
  981. package/src/astro/routes/api/admin/bylines/index.ts +6 -1
  982. package/src/astro/routes/api/admin/core-update.ts +34 -0
  983. package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +6 -2
  984. package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +6 -2
  985. package/src/astro/routes/api/auth/invite/complete.ts +4 -4
  986. package/src/astro/routes/api/auth/magic-link/verify.ts +4 -1
  987. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +9 -4
  988. package/src/astro/routes/api/auth/passkey/verify.ts +4 -4
  989. package/src/astro/routes/api/auth/signup/complete.ts +4 -4
  990. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
  991. package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
  992. package/src/astro/routes/api/import/wordpress/execute.ts +252 -6
  993. package/src/astro/routes/api/import/wordpress/prepare.ts +1 -2
  994. package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
  995. package/src/astro/routes/api/oauth/register.ts +22 -2
  996. package/src/astro/routes/api/relations/index.ts +4 -4
  997. package/src/astro/routes/api/revisions/[revisionId]/restore.ts +17 -1
  998. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
  999. package/src/astro/routes/api/setup/admin-verify.ts +6 -5
  1000. package/src/astro/routes/api/typegen.ts +4 -46
  1001. package/src/astro/session-user.ts +14 -0
  1002. package/src/astro/types.ts +11 -0
  1003. package/src/bylines/credits.ts +149 -0
  1004. package/src/bylines/index.ts +4 -142
  1005. package/src/cli/commands/export-seed.ts +510 -89
  1006. package/src/cli/commands/seed.ts +2 -0
  1007. package/src/cli/credentials.ts +1 -60
  1008. package/src/cli/index.ts +0 -2
  1009. package/src/client/index.ts +8 -2
  1010. package/src/components/Image.astro +24 -13
  1011. package/src/components/InlinePortableTextEditor.tsx +25 -8
  1012. package/src/components/WidgetArea.astro +3 -2
  1013. package/src/content/converters/portable-text-to-prosemirror.ts +23 -17
  1014. package/src/content/converters/prosemirror-to-portable-text.ts +16 -5
  1015. package/src/content/converters/types.ts +1 -0
  1016. package/src/database/content-datetime.ts +111 -23
  1017. package/src/database/migrations/036_i18n_menus_and_taxonomies.ts +132 -92
  1018. package/src/database/migrations/086_relations_structural.ts +197 -0
  1019. package/src/database/migrations/087_reference_field_relations.ts +407 -0
  1020. package/src/database/migrations/088_cron_oneshot_utc.ts +39 -0
  1021. package/src/database/migrations/089_auto_seed_completion.ts +13 -0
  1022. package/src/database/migrations/runner.ts +8 -0
  1023. package/src/database/reference-backfill.ts +141 -0
  1024. package/src/database/repositories/comment.ts +2 -2
  1025. package/src/database/repositories/content.ts +58 -16
  1026. package/src/database/repositories/plugin-storage.ts +1 -1
  1027. package/src/database/repositories/redirect.ts +7 -2
  1028. package/src/database/repositories/relation.ts +622 -210
  1029. package/src/database/repositories/revision.ts +16 -0
  1030. package/src/database/repositories/types.ts +38 -0
  1031. package/src/database/transaction.ts +12 -1
  1032. package/src/database/types.ts +15 -6
  1033. package/src/db/node-sqlite-compat.ts +63 -37
  1034. package/src/emdash-runtime.ts +149 -46
  1035. package/src/import/wxr-taxonomies.ts +163 -88
  1036. package/src/index.ts +20 -0
  1037. package/src/loader.ts +177 -23
  1038. package/src/mcp/server.ts +90 -8
  1039. package/src/media/usage/activation.ts +18 -9
  1040. package/src/migrations/config-loader.ts +5 -0
  1041. package/src/object-cache/index.ts +19 -7
  1042. package/src/object-cache/types.ts +3 -2
  1043. package/src/plugin-types.ts +7 -0
  1044. package/src/plugins/adapt-sandbox-entry.ts +47 -12
  1045. package/src/plugins/byline-access.ts +158 -0
  1046. package/src/plugins/context.ts +7 -1
  1047. package/src/plugins/cron.ts +27 -4
  1048. package/src/plugins/hooks.ts +47 -0
  1049. package/src/plugins/host.ts +1 -0
  1050. package/src/plugins/index.ts +10 -1
  1051. package/src/plugins/manifest-schema.ts +5 -1
  1052. package/src/plugins/marketplace.ts +48 -36
  1053. package/src/plugins/sandbox/proxy.ts +1 -0
  1054. package/src/plugins/types.ts +95 -0
  1055. package/src/query.ts +464 -27
  1056. package/src/redirects/cache.ts +11 -1
  1057. package/src/redirects/destination.ts +20 -0
  1058. package/src/redirects/loops.ts +10 -6
  1059. package/src/redirects/patterns.ts +12 -30
  1060. package/src/references/field-map.ts +115 -0
  1061. package/src/references/resolve.ts +160 -0
  1062. package/src/references/staged.ts +157 -0
  1063. package/src/references/types.ts +16 -0
  1064. package/src/registry/artifact-fetch.ts +45 -271
  1065. package/src/registry/testing.ts +59 -14
  1066. package/src/request-context.ts +8 -0
  1067. package/src/schema/block-type-registry.ts +1 -1
  1068. package/src/schema/env-types.ts +37 -0
  1069. package/src/schema/project-env-types.ts +41 -0
  1070. package/src/schema/registry.ts +132 -26
  1071. package/src/schema/types.ts +63 -0
  1072. package/src/schema/url-pattern.ts +10 -0
  1073. package/src/schema/zod-generator.ts +78 -2
  1074. package/src/seed/apply.ts +553 -63
  1075. package/src/seed/ownership.ts +15 -0
  1076. package/src/seed/types.ts +36 -2
  1077. package/src/seed/validate.ts +123 -4
  1078. package/src/transfer/analyze/unique-keys.ts +3 -12
  1079. package/src/transfer/analyze/validate.ts +178 -40
  1080. package/src/transfer/analyze/values.ts +116 -2
  1081. package/src/transfer/analyze/write-rules.ts +8 -0
  1082. package/src/transfer/export/readers.ts +12 -8
  1083. package/src/transfer/format/columns.ts +26 -6
  1084. package/src/transfer/format/kinds.ts +21 -5
  1085. package/src/transfer/import/context.ts +8 -1
  1086. package/src/transfer/ops/package-index.ts +1 -1
  1087. package/src/utils/url.ts +58 -3
  1088. package/src/virtual-modules.d.ts +3 -0
  1089. package/dist/action-token-DYwe4Pk0.mjs +0 -26
  1090. package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
  1091. package/dist/activation-LOkDM5WT.mjs +0 -382
  1092. package/dist/activation-LOkDM5WT.mjs.map +0 -1
  1093. package/dist/adapters-B64LbYcB.d.mts +0 -171
  1094. package/dist/adapters-B64LbYcB.d.mts.map +0 -1
  1095. package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
  1096. package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
  1097. package/dist/api-CuyNEHZG.mjs +0 -4718
  1098. package/dist/api-CuyNEHZG.mjs.map +0 -1
  1099. package/dist/api-tokens-s4i4aUp_.mjs +0 -166
  1100. package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
  1101. package/dist/apply-npY1TAhG.mjs +0 -1366
  1102. package/dist/apply-npY1TAhG.mjs.map +0 -1
  1103. package/dist/approvals-CqMfNxak.mjs +0 -460
  1104. package/dist/approvals-CqMfNxak.mjs.map +0 -1
  1105. package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
  1106. package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
  1107. package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
  1108. package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
  1109. package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
  1110. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
  1111. package/dist/audit-RfCugiSB.mjs +0 -127
  1112. package/dist/audit-RfCugiSB.mjs.map +0 -1
  1113. package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
  1114. package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
  1115. package/dist/authorize-seCifOMJ.mjs +0 -49
  1116. package/dist/authorize-seCifOMJ.mjs.map +0 -1
  1117. package/dist/backup-BQRj3afm.mjs +0 -246
  1118. package/dist/backup-BQRj3afm.mjs.map +0 -1
  1119. package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
  1120. package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
  1121. package/dist/block-types-BmZmLmAD.mjs +0 -132
  1122. package/dist/block-types-BmZmLmAD.mjs.map +0 -1
  1123. package/dist/block-values-C_VIPr5t.mjs +0 -175
  1124. package/dist/block-values-C_VIPr5t.mjs.map +0 -1
  1125. package/dist/byline-DYmkXqvo.mjs +0 -909
  1126. package/dist/byline-DYmkXqvo.mjs.map +0 -1
  1127. package/dist/byline-fields-D28AT-Fh.mjs +0 -123
  1128. package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
  1129. package/dist/byline-registry-gnKscbQX.mjs +0 -406
  1130. package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
  1131. package/dist/bylines-BPwJqoYH.mjs +0 -232
  1132. package/dist/bylines-BPwJqoYH.mjs.map +0 -1
  1133. package/dist/bylines-ukLaYpVZ.mjs +0 -214
  1134. package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
  1135. package/dist/cache-m7UEkRFV.mjs +0 -108
  1136. package/dist/cache-m7UEkRFV.mjs.map +0 -1
  1137. package/dist/canonical-YhEQezjg.mjs +0 -174
  1138. package/dist/canonical-YhEQezjg.mjs.map +0 -1
  1139. package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
  1140. package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
  1141. package/dist/challenge-store-ppU6Uv13.mjs +0 -51
  1142. package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
  1143. package/dist/checksum-B2IINIlN.mjs +0 -162
  1144. package/dist/checksum-B2IINIlN.mjs.map +0 -1
  1145. package/dist/chrome-tags-DApCQSIk.mjs +0 -24
  1146. package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
  1147. package/dist/chunks-Dms7Uxbt.mjs +0 -25
  1148. package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
  1149. package/dist/collection-deletion-BIm28mo3.mjs +0 -436
  1150. package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
  1151. package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
  1152. package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
  1153. package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
  1154. package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
  1155. package/dist/comment-CrBl22OF.mjs +0 -313
  1156. package/dist/comment-CrBl22OF.mjs.map +0 -1
  1157. package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
  1158. package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
  1159. package/dist/comments-2ah9du9y.mjs +0 -195
  1160. package/dist/comments-2ah9du9y.mjs.map +0 -1
  1161. package/dist/comments-fHZ8ON9O.mjs +0 -99
  1162. package/dist/comments-fHZ8ON9O.mjs.map +0 -1
  1163. package/dist/components-CXbq7CSM.mjs +0 -108
  1164. package/dist/components-CXbq7CSM.mjs.map +0 -1
  1165. package/dist/config-BjEm_3xL.d.mts +0 -6537
  1166. package/dist/config-BjEm_3xL.d.mts.map +0 -1
  1167. package/dist/config-IhybvkIQ.mjs +0 -242
  1168. package/dist/config-IhybvkIQ.mjs.map +0 -1
  1169. package/dist/config-Py43JK9r.d.mts +0 -39
  1170. package/dist/config-Py43JK9r.d.mts.map +0 -1
  1171. package/dist/content-DFaIEDj9.mjs +0 -2281
  1172. package/dist/content-DFaIEDj9.mjs.map +0 -1
  1173. package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
  1174. package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
  1175. package/dist/content-policy-DFNw91-d.mjs +0 -46
  1176. package/dist/content-policy-DFNw91-d.mjs.map +0 -1
  1177. package/dist/content-repair-Q8IUrpLL.mjs +0 -442
  1178. package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
  1179. package/dist/context-BV_7t-Ua.mjs +0 -1921
  1180. package/dist/context-BV_7t-Ua.mjs.map +0 -1
  1181. package/dist/cron-7DCJwPXq.mjs +0 -284
  1182. package/dist/cron-7DCJwPXq.mjs.map +0 -1
  1183. package/dist/dashboard-BP-iJqpd.mjs +0 -151
  1184. package/dist/dashboard-BP-iJqpd.mjs.map +0 -1
  1185. package/dist/default-DQ6vsviu.mjs +0 -81
  1186. package/dist/default-DQ6vsviu.mjs.map +0 -1
  1187. package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
  1188. package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
  1189. package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
  1190. package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
  1191. package/dist/device-flow-CRd6DXmW.mjs +0 -466
  1192. package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
  1193. package/dist/digest-BarSh-pN.mjs +0 -194
  1194. package/dist/digest-BarSh-pN.mjs.map +0 -1
  1195. package/dist/direct-executor-D2lNadwo.mjs +0 -104
  1196. package/dist/direct-executor-D2lNadwo.mjs.map +0 -1
  1197. package/dist/dist-BNwANFJR.mjs +0 -810
  1198. package/dist/dist-BNwANFJR.mjs.map +0 -1
  1199. package/dist/email-console-bJn3ctqA.mjs +0 -50
  1200. package/dist/email-console-bJn3ctqA.mjs.map +0 -1
  1201. package/dist/email-locale-CN6WAMx0.mjs +0 -25
  1202. package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
  1203. package/dist/emdash-runtime-CtfnZmPi.mjs +0 -4186
  1204. package/dist/emdash-runtime-CtfnZmPi.mjs.map +0 -1
  1205. package/dist/enrich-Dl3kZ-lP.mjs +0 -194
  1206. package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
  1207. package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
  1208. package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
  1209. package/dist/entry-lock-Cf5OoIgN.d.mts +0 -4368
  1210. package/dist/entry-lock-Cf5OoIgN.d.mts.map +0 -1
  1211. package/dist/entry-lock-DHQOxN7R.mjs +0 -163
  1212. package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
  1213. package/dist/entry-locks-D0foLdjQ.mjs +0 -167
  1214. package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
  1215. package/dist/error-CfvOHP0M.mjs +0 -90
  1216. package/dist/error-CfvOHP0M.mjs.map +0 -1
  1217. package/dist/errors-BF0_LFhW.mjs +0 -460
  1218. package/dist/errors-BF0_LFhW.mjs.map +0 -1
  1219. package/dist/errors-DgE1zJGG.mjs +0 -120
  1220. package/dist/errors-DgE1zJGG.mjs.map +0 -1
  1221. package/dist/escape-CuaZhZvL.mjs +0 -9
  1222. package/dist/escape-CuaZhZvL.mjs.map +0 -1
  1223. package/dist/fence-CMDXJYc_.mjs +0 -162
  1224. package/dist/fence-CMDXJYc_.mjs.map +0 -1
  1225. package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
  1226. package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
  1227. package/dist/focal-point-Gr34o-4o.mjs +0 -23
  1228. package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
  1229. package/dist/fts-manager-S-K0laoS.mjs +0 -443
  1230. package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
  1231. package/dist/gc-DjKY0Ay1.mjs +0 -75
  1232. package/dist/gc-DjKY0Ay1.mjs.map +0 -1
  1233. package/dist/hash-SDAW6zC-.mjs +0 -37
  1234. package/dist/hash-SDAW6zC-.mjs.map +0 -1
  1235. package/dist/hook-result-B5bXDgS2.d.mts +0 -31
  1236. package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
  1237. package/dist/hreflang-CbVI4paR.mjs +0 -105
  1238. package/dist/hreflang-CbVI4paR.mjs.map +0 -1
  1239. package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
  1240. package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
  1241. package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
  1242. package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
  1243. package/dist/identity-Be5kzutJ.mjs +0 -35
  1244. package/dist/identity-Be5kzutJ.mjs.map +0 -1
  1245. package/dist/import-YzfKCaco.mjs +0 -2020
  1246. package/dist/import-YzfKCaco.mjs.map +0 -1
  1247. package/dist/index-D-hdtLe8.d.mts +0 -623
  1248. package/dist/index-D-hdtLe8.d.mts.map +0 -1
  1249. package/dist/install-finalization-DfM1fj5x.mjs +0 -58
  1250. package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
  1251. package/dist/keys-yxLm5l35.mjs +0 -61
  1252. package/dist/keys-yxLm5l35.mjs.map +0 -1
  1253. package/dist/kinds-CRu_T5T5.mjs +0 -961
  1254. package/dist/kinds-CRu_T5T5.mjs.map +0 -1
  1255. package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
  1256. package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
  1257. package/dist/load-XgJiE6_3.mjs +0 -28
  1258. package/dist/load-XgJiE6_3.mjs.map +0 -1
  1259. package/dist/loader-BzqeR1ZN.mjs +0 -1086
  1260. package/dist/loader-BzqeR1ZN.mjs.map +0 -1
  1261. package/dist/loops-BQSzv5Zn.mjs +0 -203
  1262. package/dist/loops-BQSzv5Zn.mjs.map +0 -1
  1263. package/dist/manifest-builder-BmSAOOEF.mjs +0 -189
  1264. package/dist/manifest-builder-BmSAOOEF.mjs.map +0 -1
  1265. package/dist/manifest-schema-CY3zng_M.mjs +0 -492
  1266. package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
  1267. package/dist/media-CPXTbb1R.mjs +0 -373
  1268. package/dist/media-CPXTbb1R.mjs.map +0 -1
  1269. package/dist/media-JXRWDhw3.mjs +0 -294
  1270. package/dist/media-JXRWDhw3.mjs.map +0 -1
  1271. package/dist/media-Pu1L6xir.mjs +0 -408
  1272. package/dist/media-Pu1L6xir.mjs.map +0 -1
  1273. package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
  1274. package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
  1275. package/dist/media-folders-BE0oo2eX.mjs +0 -210
  1276. package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
  1277. package/dist/media-url-jArBpzIG.mjs +0 -43
  1278. package/dist/media-url-jArBpzIG.mjs.map +0 -1
  1279. package/dist/media-usage-De-zeR9E.mjs +0 -1629
  1280. package/dist/media-usage-De-zeR9E.mjs.map +0 -1
  1281. package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
  1282. package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
  1283. package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
  1284. package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
  1285. package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
  1286. package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
  1287. package/dist/menus-BM7BPLOb.mjs +0 -139
  1288. package/dist/menus-BM7BPLOb.mjs.map +0 -1
  1289. package/dist/menus-Cm68rsAq.mjs +0 -3608
  1290. package/dist/menus-Cm68rsAq.mjs.map +0 -1
  1291. package/dist/menus-ITeAbcIF.mjs +0 -753
  1292. package/dist/menus-ITeAbcIF.mjs.map +0 -1
  1293. package/dist/mime-ChLqYwDk.mjs +0 -36
  1294. package/dist/mime-ChLqYwDk.mjs.map +0 -1
  1295. package/dist/mode-CCuKXUci.mjs +0 -23
  1296. package/dist/mode-CCuKXUci.mjs.map +0 -1
  1297. package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
  1298. package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
  1299. package/dist/normalize-CO2P8-iE.mjs +0 -191
  1300. package/dist/normalize-CO2P8-iE.mjs.map +0 -1
  1301. package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
  1302. package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
  1303. package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
  1304. package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
  1305. package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
  1306. package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
  1307. package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
  1308. package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
  1309. package/dist/object-cache-CqWNY5uP.mjs +0 -582
  1310. package/dist/object-cache-CqWNY5uP.mjs.map +0 -1
  1311. package/dist/options-SQCHQCPH.d.mts +0 -81
  1312. package/dist/options-SQCHQCPH.d.mts.map +0 -1
  1313. package/dist/parse-CVgO-Qai.d.mts +0 -168
  1314. package/dist/parse-CVgO-Qai.d.mts.map +0 -1
  1315. package/dist/parse-DY6OD1j_.mjs +0 -81
  1316. package/dist/parse-DY6OD1j_.mjs.map +0 -1
  1317. package/dist/passkey-config-X_H8128a.mjs +0 -46
  1318. package/dist/passkey-config-X_H8128a.mjs.map +0 -1
  1319. package/dist/paths-JxokKIbr.mjs +0 -77
  1320. package/dist/paths-JxokKIbr.mjs.map +0 -1
  1321. package/dist/patterns-BhAvqO0S.mjs +0 -145
  1322. package/dist/patterns-BhAvqO0S.mjs.map +0 -1
  1323. package/dist/placeholder-MSEd8gty.d.mts +0 -306
  1324. package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
  1325. package/dist/plan-xjcWrAah.mjs +0 -135
  1326. package/dist/plan-xjcWrAah.mjs.map +0 -1
  1327. package/dist/plugins-DUXUt8B9.mjs +0 -277
  1328. package/dist/plugins-DUXUt8B9.mjs.map +0 -1
  1329. package/dist/policy-CUvwAARc.mjs +0 -45
  1330. package/dist/policy-CUvwAARc.mjs.map +0 -1
  1331. package/dist/portable-text-5O_ZGUjB.mjs +0 -307
  1332. package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
  1333. package/dist/preview-CIUcPYr6.mjs +0 -107
  1334. package/dist/preview-CIUcPYr6.mjs.map +0 -1
  1335. package/dist/protocol-B97DZaFr.d.mts +0 -61
  1336. package/dist/protocol-B97DZaFr.d.mts.map +0 -1
  1337. package/dist/public-submission-BFBUrqst.mjs +0 -250
  1338. package/dist/public-submission-BFBUrqst.mjs.map +0 -1
  1339. package/dist/public-url-Bn7U0D7-.mjs +0 -101
  1340. package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
  1341. package/dist/query-B48peoRT.mjs +0 -890
  1342. package/dist/query-B48peoRT.mjs.map +0 -1
  1343. package/dist/query-C4IH0uhR.mjs +0 -41
  1344. package/dist/query-C4IH0uhR.mjs.map +0 -1
  1345. package/dist/rate-limit-BZ6nybgc.mjs +0 -120
  1346. package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
  1347. package/dist/receipt-B4wJj5Jq.mjs +0 -43
  1348. package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
  1349. package/dist/redirect-B29UjdUn.mjs +0 -411
  1350. package/dist/redirect-B29UjdUn.mjs.map +0 -1
  1351. package/dist/redirect-Cd1E7VUt.mjs +0 -17
  1352. package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
  1353. package/dist/redirects-Ca2MPfEG.mjs +0 -446
  1354. package/dist/redirects-Ca2MPfEG.mjs.map +0 -1
  1355. package/dist/redirects-Cv9apQKj.mjs +0 -148
  1356. package/dist/redirects-Cv9apQKj.mjs.map +0 -1
  1357. package/dist/relation-M4NUCb0b.mjs +0 -334
  1358. package/dist/relation-M4NUCb0b.mjs.map +0 -1
  1359. package/dist/relations-CCif47Oq.mjs +0 -403
  1360. package/dist/relations-CCif47Oq.mjs.map +0 -1
  1361. package/dist/relations-CK9CYUyr.mjs +0 -310
  1362. package/dist/relations-CK9CYUyr.mjs.map +0 -1
  1363. package/dist/request-cache-DzLYKm_x.mjs +0 -104
  1364. package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
  1365. package/dist/request-meta-sZXt3sRo.mjs +0 -141
  1366. package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
  1367. package/dist/resolve-2WbQsCvT.mjs +0 -199
  1368. package/dist/resolve-2WbQsCvT.mjs.map +0 -1
  1369. package/dist/route-wire--1hLuACz.mjs +0 -197
  1370. package/dist/route-wire--1hLuACz.mjs.map +0 -1
  1371. package/dist/routes-vrR95WR6.mjs +0 -272
  1372. package/dist/routes-vrR95WR6.mjs.map +0 -1
  1373. package/dist/runner-1y4J9fJB.mjs +0 -5742
  1374. package/dist/runner-1y4J9fJB.mjs.map +0 -1
  1375. package/dist/runner-D5_LzKXI.d.mts +0 -68
  1376. package/dist/runner-D5_LzKXI.d.mts.map +0 -1
  1377. package/dist/schema-BABiRdsH.mjs +0 -13
  1378. package/dist/schema-BABiRdsH.mjs.map +0 -1
  1379. package/dist/schema-Du3MzCG0.mjs +0 -446
  1380. package/dist/schema-Du3MzCG0.mjs.map +0 -1
  1381. package/dist/scopes-Dbk-ElhT.mjs +0 -34
  1382. package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
  1383. package/dist/search-Bt1PL1jf.mjs +0 -448
  1384. package/dist/search-Bt1PL1jf.mjs.map +0 -1
  1385. package/dist/sections-Ddptx_o9.mjs +0 -346
  1386. package/dist/sections-Ddptx_o9.mjs.map +0 -1
  1387. package/dist/seo-CZT2oLtT.mjs +0 -114
  1388. package/dist/seo-CZT2oLtT.mjs.map +0 -1
  1389. package/dist/seo-D5w3-Azy.mjs +0 -133
  1390. package/dist/seo-D5w3-Azy.mjs.map +0 -1
  1391. package/dist/service-DuykXPyW.mjs +0 -150
  1392. package/dist/service-DuykXPyW.mjs.map +0 -1
  1393. package/dist/session-user-BhaVp8w0.mjs +0 -51
  1394. package/dist/session-user-BhaVp8w0.mjs.map +0 -1
  1395. package/dist/settings-B4vDl1fK.mjs +0 -439
  1396. package/dist/settings-B4vDl1fK.mjs.map +0 -1
  1397. package/dist/settings-DYidIB26.mjs +0 -61
  1398. package/dist/settings-DYidIB26.mjs.map +0 -1
  1399. package/dist/settings-Dyj6v8C4.mjs +0 -51
  1400. package/dist/settings-Dyj6v8C4.mjs.map +0 -1
  1401. package/dist/setup-complete-bOogcHWG.mjs +0 -26
  1402. package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
  1403. package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
  1404. package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
  1405. package/dist/site-settings-DOgRUoFX.mjs +0 -50
  1406. package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
  1407. package/dist/site-url-BU_bbxwj.mjs +0 -16
  1408. package/dist/site-url-BU_bbxwj.mjs.map +0 -1
  1409. package/dist/snapshot-PawoX-WG.mjs +0 -414
  1410. package/dist/snapshot-PawoX-WG.mjs.map +0 -1
  1411. package/dist/ssrf-CJUnJymJ.mjs +0 -406
  1412. package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
  1413. package/dist/stage-DgrBz_du.mjs +0 -662
  1414. package/dist/stage-DgrBz_du.mjs.map +0 -1
  1415. package/dist/state-DDiPySSG.mjs +0 -153
  1416. package/dist/state-DDiPySSG.mjs.map +0 -1
  1417. package/dist/status-DZKIG4a9.mjs +0 -30
  1418. package/dist/status-DZKIG4a9.mjs.map +0 -1
  1419. package/dist/storage-query-FXJH5pI8.d.mts +0 -1581
  1420. package/dist/storage-query-FXJH5pI8.d.mts.map +0 -1
  1421. package/dist/tar-_1AgTYFu.mjs +0 -449
  1422. package/dist/tar-_1AgTYFu.mjs.map +0 -1
  1423. package/dist/target-_7pn2Gbg.mjs +0 -27
  1424. package/dist/target-_7pn2Gbg.mjs.map +0 -1
  1425. package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
  1426. package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
  1427. package/dist/taxonomies-C_XMoRcX.mjs +0 -939
  1428. package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
  1429. package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
  1430. package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
  1431. package/dist/tokens-u78jETkX.mjs +0 -171
  1432. package/dist/tokens-u78jETkX.mjs.map +0 -1
  1433. package/dist/transaction-BcJO4Tmc.mjs +0 -29
  1434. package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
  1435. package/dist/transfer-DIGvR9Af.mjs +0 -166
  1436. package/dist/transfer-DIGvR9Af.mjs.map +0 -1
  1437. package/dist/transfer-DgeCvHnj.mjs +0 -8675
  1438. package/dist/transfer-DgeCvHnj.mjs.map +0 -1
  1439. package/dist/transfer-download-Pml7RMio.mjs +0 -33
  1440. package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
  1441. package/dist/transformations-9gfpwY65.mjs +0 -196
  1442. package/dist/transformations-9gfpwY65.mjs.map +0 -1
  1443. package/dist/transport-BIfH7_hx.d.mts +0 -42
  1444. package/dist/transport-BIfH7_hx.d.mts.map +0 -1
  1445. package/dist/transport-DKWIq53q.mjs +0 -136
  1446. package/dist/transport-DKWIq53q.mjs.map +0 -1
  1447. package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
  1448. package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
  1449. package/dist/turnstile-DpsoyOfg.mjs +0 -53
  1450. package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
  1451. package/dist/types-B4sUC2p1.d.mts +0 -198
  1452. package/dist/types-B4sUC2p1.d.mts.map +0 -1
  1453. package/dist/types-B7Lmsh1E.d.mts +0 -887
  1454. package/dist/types-B7Lmsh1E.d.mts.map +0 -1
  1455. package/dist/types-BZakh7Ym.mjs +0 -22
  1456. package/dist/types-BZakh7Ym.mjs.map +0 -1
  1457. package/dist/types-B_CppEmv.d.mts +0 -264
  1458. package/dist/types-B_CppEmv.d.mts.map +0 -1
  1459. package/dist/types-BcrBrE6-.mjs +0 -159
  1460. package/dist/types-BcrBrE6-.mjs.map +0 -1
  1461. package/dist/types-BkUg2yHx.mjs +0 -92
  1462. package/dist/types-BkUg2yHx.mjs.map +0 -1
  1463. package/dist/types-CAZgq9fO.d.mts +0 -124
  1464. package/dist/types-CAZgq9fO.d.mts.map +0 -1
  1465. package/dist/types-Cd-O03VG.d.mts +0 -363
  1466. package/dist/types-Cd-O03VG.d.mts.map +0 -1
  1467. package/dist/types-Cr-Kg-3D.d.mts +0 -1641
  1468. package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
  1469. package/dist/types-D2fvWd1i.d.mts +0 -359
  1470. package/dist/types-D2fvWd1i.d.mts.map +0 -1
  1471. package/dist/types-D7HUsguf.mjs +0 -77
  1472. package/dist/types-D7HUsguf.mjs.map +0 -1
  1473. package/dist/types-DA1Te3Oy.d.mts +0 -198
  1474. package/dist/types-DA1Te3Oy.d.mts.map +0 -1
  1475. package/dist/types-DhV6Q5bP.mjs +0 -18
  1476. package/dist/types-DhV6Q5bP.mjs.map +0 -1
  1477. package/dist/types-DnnVSl6Y.d.mts +0 -85
  1478. package/dist/types-DnnVSl6Y.d.mts.map +0 -1
  1479. package/dist/types-VT4-BugW.mjs +0 -16
  1480. package/dist/types-VT4-BugW.mjs.map +0 -1
  1481. package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
  1482. package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
  1483. package/dist/url-pattern-CCeZMGOh.mjs +0 -33
  1484. package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
  1485. package/dist/user-DDSL-sGw.mjs +0 -171
  1486. package/dist/user-DDSL-sGw.mjs.map +0 -1
  1487. package/dist/utils-DdhmO9w9.mjs +0 -439
  1488. package/dist/utils-DdhmO9w9.mjs.map +0 -1
  1489. package/dist/validate-CHosPEhs.mjs +0 -453
  1490. package/dist/validate-CHosPEhs.mjs.map +0 -1
  1491. package/dist/validate-CM79QXYE.d.mts +0 -432
  1492. package/dist/validate-CM79QXYE.d.mts.map +0 -1
  1493. package/dist/validation-BFecQczG.mjs +0 -218
  1494. package/dist/validation-BFecQczG.mjs.map +0 -1
  1495. package/dist/version-BRZXVifl.mjs +0 -9
  1496. package/dist/version-BRZXVifl.mjs.map +0 -1
  1497. package/dist/version-DXsxRrob.mjs +0 -7
  1498. package/dist/version-DXsxRrob.mjs.map +0 -1
  1499. package/dist/widgets-WdV72brA.mjs +0 -126
  1500. package/dist/widgets-WdV72brA.mjs.map +0 -1
  1501. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
  1502. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
  1503. package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
  1504. package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
  1505. package/dist/zod-generator-D6uE4WiS.mjs +0 -389
  1506. package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
  1507. package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
  1508. package/src/cli/commands/bundle-utils.ts +0 -408
  1509. package/src/cli/commands/bundle.ts +0 -659
  1510. package/src/cli/commands/plugin-init.ts +0 -417
  1511. package/src/cli/commands/plugin-validate.ts +0 -31
  1512. package/src/cli/commands/plugin.ts +0 -33
  1513. package/src/cli/commands/publish.ts +0 -721
  1514. /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-BLz2MtQs.mjs} +0 -0
  1515. /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-tA45vIPX.mjs} +0 -0
@@ -2,25 +2,36 @@ import "../../../../../dialect-helpers-7_IqPdh9.mjs";
2
2
  import "../../../../../config-CvmjJcVw.mjs";
3
3
  import "../../../../../after-PcEvMY_6.mjs";
4
4
  import "../../../../../base64-DvnNgP7e.mjs";
5
- import "../../../../../object-cache-CqWNY5uP.mjs";
5
+ import "../../../../../object-cache-Bo6DGaC9.mjs";
6
6
  import { n as slugify } from "../../../../../slugify-T5GHH42D.mjs";
7
- import "../../../../../types-BkUg2yHx.mjs";
8
- import "../../../../../taxonomy-C3Fu1YeH.mjs";
9
- import "../../../../../resolve-2WbQsCvT.mjs";
10
- import "../../../../../request-cache-DzLYKm_x.mjs";
11
- import "../../../../../byline-registry-gnKscbQX.mjs";
12
- import "../../../../../field-defs-cache-HIgBbqZZ.mjs";
13
- import { t as BylineRepository } from "../../../../../byline-DYmkXqvo.mjs";
14
- import "../../../../../loader-BzqeR1ZN.mjs";
15
- import "../../../../../collection-slugs-cache-CjGk__zp.mjs";
16
- import "../../../../../taxonomies-C1IwNe8Q.mjs";
17
- import "../../../../../errors-DgE1zJGG.mjs";
18
- import "../../../../../errors-BF0_LFhW.mjs";
19
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CfvOHP0M.mjs";
20
- import { g as resolveImportByline } from "../../../../../utils-DdhmO9w9.mjs";
21
- import { i as requirePerm } from "../../../../../authorize-seCifOMJ.mjs";
7
+ import "../../../../../request-cache-C4CIo5ad.mjs";
8
+ import "../../../../../url-Dn3IStq8.mjs";
9
+ import "../../../../../types-j6MBDjlZ.mjs";
10
+ import "../../../../../taxonomy-BesdHIwi.mjs";
11
+ import "../../../../../resolve-D-kqyKns.mjs";
12
+ import "../../../../../byline-registry-dvt4N3xV.mjs";
13
+ import "../../../../../field-defs-cache-DEkFYCDE.mjs";
14
+ import { t as BylineRepository } from "../../../../../byline-02tu_Uc-.mjs";
15
+ import "../../../../../loader-B_bcoE1h.mjs";
16
+ import "../../../../../collection-slugs-cache-BNRAPNiu.mjs";
17
+ import "../../../../../taxonomies-DWv-OYT0.mjs";
18
+ import "../../../../../errors-CjXd1LgH.mjs";
19
+ import "../../../../../errors-CNvATh_7.mjs";
20
+ import "../../../../../settings-B0zQj_Tj.mjs";
21
+ import "../../../../../site-settings-AYFvhwQn.mjs";
22
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CEdm_AWU.mjs";
23
+ import "../../../../../redirects-D4EWeXAo.mjs";
24
+ import "../../../../../entry-lock-PP1JCXBB.mjs";
25
+ import "../../../../../media-D1z_jisb.mjs";
26
+ import "../../../../../comments-BRtp992B.mjs";
27
+ import { b as wxrImportConfig, v as wxrChunkCursor, y as wxrChunkState } from "../../../../../byline-fields-DHJs0Mja.mjs";
28
+ import "../../../../../menus-BQKqf0Up.mjs";
29
+ import "../../../../../status-D39Fpy8R.mjs";
30
+ import "../../../../../api/schemas/index.mjs";
31
+ import { g as resolveImportByline } from "../../../../../utils-CoV-PYhg.mjs";
32
+ import { i as requirePerm } from "../../../../../authorize-soZXK7U0.mjs";
22
33
  import { sanitizeSlug } from "./analyze.mjs";
23
- import { a as preImportWxrTaxonomies, i as mirrorTermsToLocales, n as isWxrTaxonomyConflictError, o as setPostTermAssignmentsReplacing, t as attachPostTaxonomies } from "../../../../../wxr-taxonomies-DP6ESgMN.mjs";
34
+ import { a as preImportWxrTaxonomies, i as mirrorTermsToLocales, n as isWxrTaxonomyConflictError, o as setPostTermAssignmentsReplacing, r as loadTaxonomyPlanFromDb, t as attachPostTaxonomies } from "../../../../../wxr-taxonomies-DEzR9N7e.mjs";
24
35
  import { gutenbergToPortableText } from "@emdash-cms/gutenberg-to-portable-text";
25
36
  import { ContentRepository, importReusableBlocksAsSections, parseWxrDate, parseWxrString } from "emdash";
26
37
 
@@ -33,6 +44,8 @@ import { ContentRepository, importReusableBlocksAsSections, parseWxrDate, parseW
33
44
  * Accepts WXR file and import configuration, imports content into the database.
34
45
  */
35
46
  const prerender = false;
47
+ /** Posts processed per Worker invocation in chunked WXR imports. */
48
+ const WXR_CONTENT_CHUNK_SIZE = 30;
36
49
  const POST = async ({ request, locals }) => {
37
50
  const { emdash, user } = locals;
38
51
  const denied = requirePerm(user, "import:execute");
@@ -47,8 +60,36 @@ const POST = async ({ request, locals }) => {
47
60
  const configJson = typeof configEntry === "string" ? configEntry : null;
48
61
  if (!file) return apiError("VALIDATION_ERROR", "No file provided", 400);
49
62
  if (!configJson) return apiError("VALIDATION_ERROR", "No config provided", 400);
50
- const config = JSON.parse(configJson);
51
- const wxr = await parseWxrString(await file.text());
63
+ const parsedConfig = parseJsonField(configJson, "config");
64
+ if ("response" in parsedConfig) return parsedConfig.response;
65
+ const configResult = wxrImportConfig.safeParse(parsedConfig.value);
66
+ if (!configResult.success) return apiError("VALIDATION_ERROR", "Invalid import config", 400);
67
+ const config = configResult.data;
68
+ const phaseEntry = formData.get("phase");
69
+ if (phaseEntry !== null && phaseEntry !== "taxonomy" && phaseEntry !== "content" && phaseEntry !== "finalize") return apiError("VALIDATION_ERROR", "Invalid import phase", 400);
70
+ const phase = phaseEntry;
71
+ const cursorEntry = formData.get("cursor");
72
+ let cursor;
73
+ if (typeof cursorEntry === "string" && cursorEntry.length > 0) {
74
+ const parsedCursor = parseJsonField(cursorEntry, "cursor");
75
+ if ("response" in parsedCursor) return parsedCursor.response;
76
+ const cursorResult = wxrChunkCursor.safeParse(parsedCursor.value);
77
+ if (!cursorResult.success) return apiError("VALIDATION_ERROR", "Invalid import cursor", 400);
78
+ cursor = cursorResult.data;
79
+ }
80
+ const chunkEntry = formData.get("chunk");
81
+ let incomingChunk;
82
+ if (typeof chunkEntry === "string" && chunkEntry.length > 0) {
83
+ const parsedChunk = parseJsonField(chunkEntry, "chunk");
84
+ if ("response" in parsedChunk) return parsedChunk.response;
85
+ const chunkResult = wxrChunkState.safeParse(parsedChunk.value);
86
+ if (!chunkResult.success) return apiError("VALIDATION_ERROR", "Invalid import chunk state", 400);
87
+ incomingChunk = chunkResult.data;
88
+ }
89
+ const text = await file.text();
90
+ const wxr = await parseWxrString(text);
91
+ const source = await importFingerprint(text, configJson);
92
+ if (cursor && cursor.source !== source) return apiError("WXR_IMPORT_SOURCE_CHANGED", "The WXR file or import configuration changed after this import started", 409);
52
93
  const attachmentMap = /* @__PURE__ */ new Map();
53
94
  for (const att of wxr.attachments) if (att.id && att.url) attachmentMap.set(String(att.id), att.url);
54
95
  const authorDisplayNames = /* @__PURE__ */ new Map();
@@ -56,6 +97,62 @@ const POST = async ({ request, locals }) => {
56
97
  if (!author.login) continue;
57
98
  authorDisplayNames.set(author.login, author.displayName || author.login);
58
99
  }
100
+ if (phase === "content") {
101
+ if (!cursor?.taxonomiesReady) return apiError("VALIDATION_ERROR", "Taxonomy preparation is not complete", 400);
102
+ const chunkResponse = await runContentChunk(wxr, config, emdash, emdashManifest, attachmentMap, authorDisplayNames, cursor, incomingChunk, source);
103
+ if (chunkResponse instanceof Response) return chunkResponse;
104
+ return apiSuccess(chunkResponse);
105
+ }
106
+ if (phase === "taxonomy") {
107
+ if (cursor || incomingChunk) return apiError("VALIDATION_ERROR", "Taxonomy preparation cannot be resumed", 400);
108
+ let taxonomyPlan;
109
+ try {
110
+ taxonomyPlan = await prepareTaxonomies(wxr, emdash, config.locale);
111
+ } catch (error) {
112
+ if (isWxrTaxonomyConflictError(error)) {
113
+ console.error("[WXR_IMPORT_TAXONOMY_CONFLICT]", error);
114
+ return apiError("WXR_IMPORT_TAXONOMY_CONFLICT", error.publicMessage, 409);
115
+ }
116
+ throw error;
117
+ }
118
+ const result = emptyImportResult();
119
+ result.taxonomies = {
120
+ termsCreated: taxonomyPlan.termsCreated,
121
+ termsReused: taxonomyPlan.termsReused,
122
+ assignments: 0,
123
+ missingTaxonomies: taxonomyPlan.missingTaxonomies
124
+ };
125
+ return apiSuccess({
126
+ success: true,
127
+ result,
128
+ done: true,
129
+ cursor: {
130
+ offset: 0,
131
+ source,
132
+ taxonomiesReady: true
133
+ },
134
+ chunk: { translationGroups: {} }
135
+ });
136
+ }
137
+ if (phase === "finalize") {
138
+ if (!cursor || cursor.offset !== wxr.posts.length) return apiError("VALIDATION_ERROR", "Content import is not complete", 400);
139
+ const result = emptyImportResult();
140
+ if (config.importSections !== false) {
141
+ const sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);
142
+ result.sections = {
143
+ created: sectionsResult.sectionsCreated,
144
+ skipped: sectionsResult.sectionsSkipped
145
+ };
146
+ result.errors.push(...sectionsResult.errors);
147
+ result.success = result.errors.length === 0;
148
+ }
149
+ return apiSuccess({
150
+ success: result.success,
151
+ result,
152
+ done: true
153
+ });
154
+ }
155
+ if (wxr.posts.length > WXR_CONTENT_CHUNK_SIZE) return apiError("WXR_IMPORT_TOO_LARGE", `This WXR contains ${wxr.posts.length} posts, which exceeds the ${WXR_CONTENT_CHUNK_SIZE}-post limit for a single import request. Run the import in chunked mode or split the file into smaller exports.`, 413);
59
156
  const taxonomyPlan = await preImportWxrTaxonomies(emdash.db, wxr.posts, wxr.categories, wxr.tags, wxr.terms, config.locale);
60
157
  const postLocales = /* @__PURE__ */ new Set();
61
158
  for (const post of wxr.posts) if (post.locale) postLocales.add(post.locale);
@@ -83,7 +180,57 @@ const POST = async ({ request, locals }) => {
83
180
  return handleError(error, "Failed to import content", "WXR_IMPORT_ERROR");
84
181
  }
85
182
  };
86
- async function importContent(posts, config, emdash, manifest, attachmentMap, locale, authorDisplayNames, taxonomyPlan) {
183
+ function parseJsonField(value, fieldName) {
184
+ try {
185
+ return { value: JSON.parse(value) };
186
+ } catch {
187
+ return { response: apiError("VALIDATION_ERROR", `Invalid JSON in ${fieldName}`, 400) };
188
+ }
189
+ }
190
+ async function importFingerprint(text, configJson) {
191
+ const bytes = new TextEncoder().encode(`${configJson}\u0000${text}`);
192
+ const digest = await crypto.subtle.digest("SHA-256", bytes);
193
+ return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
194
+ }
195
+ function emptyImportResult() {
196
+ return {
197
+ success: true,
198
+ imported: 0,
199
+ skipped: 0,
200
+ errors: [],
201
+ byCollection: {}
202
+ };
203
+ }
204
+ /** Import a bounded WXR post chunk using taxonomy rows prepared in the prior phase. */
205
+ async function runContentChunk(wxr, config, emdash, manifest, attachmentMap, authorDisplayNames, cursor, incomingChunk, source) {
206
+ const offset = cursor?.offset ?? 0;
207
+ if (offset > wxr.posts.length || offset > 0 && offset % WXR_CONTENT_CHUNK_SIZE !== 0) return apiError("VALIDATION_ERROR", "Invalid import cursor offset", 400);
208
+ const posts = wxr.posts.slice(offset, offset + WXR_CONTENT_CHUNK_SIZE);
209
+ const taxonomyPlan = await loadTaxonomyPlanFromDb(emdash.db);
210
+ const translationGroupMap = new Map(Object.entries(incomingChunk?.translationGroups ?? {}));
211
+ const result = await importContent(posts, config, emdash, manifest, attachmentMap, config.locale, authorDisplayNames, taxonomyPlan, translationGroupMap);
212
+ const nextOffset = offset + posts.length;
213
+ const done = nextOffset >= wxr.posts.length;
214
+ return {
215
+ success: result.errors.length === 0,
216
+ result,
217
+ done,
218
+ cursor: {
219
+ offset: nextOffset,
220
+ source,
221
+ taxonomiesReady: true
222
+ },
223
+ chunk: { translationGroups: Object.fromEntries(translationGroupMap) }
224
+ };
225
+ }
226
+ async function prepareTaxonomies(wxr, emdash, locale) {
227
+ const taxonomyPlan = await preImportWxrTaxonomies(emdash.db, wxr.posts, wxr.categories, wxr.tags, wxr.terms, locale);
228
+ const postLocales = /* @__PURE__ */ new Set();
229
+ for (const post of wxr.posts) if (post.locale) postLocales.add(post.locale);
230
+ if (postLocales.size > 0) await mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, locale);
231
+ return taxonomyPlan;
232
+ }
233
+ async function importContent(posts, config, emdash, manifest, attachmentMap, locale, authorDisplayNames, taxonomyPlan, translationGroupMap = /* @__PURE__ */ new Map()) {
87
234
  const result = {
88
235
  success: true,
89
236
  imported: 0,
@@ -100,7 +247,6 @@ async function importContent(posts, config, emdash, manifest, attachmentMap, loc
100
247
  const contentRepo = new ContentRepository(emdash.db);
101
248
  const bylineRepo = new BylineRepository(emdash.db);
102
249
  const bylineCache = /* @__PURE__ */ new Map();
103
- const translationGroupMap = /* @__PURE__ */ new Map();
104
250
  for (const post of posts) {
105
251
  const postType = post.postType || "post";
106
252
  const mapping = config.postTypeMappings[postType];
@@ -1 +1 @@
1
- {"version":3,"file":"execute.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/execute.ts"],"sourcesContent":["/**\n * WordPress WXR execute import endpoint\n *\n * POST /_emdash/api/import/wordpress/execute\n *\n * Accepts WXR file and import configuration, imports content into the database.\n */\n\nimport { gutenbergToPortableText } from \"@emdash-cms/gutenberg-to-portable-text\";\nimport type { APIRoute } from \"astro\";\nimport {\n\tparseWxrString,\n\tContentRepository,\n\timportReusableBlocksAsSections,\n\ttype WxrPost,\n\tparseWxrDate,\n} from \"emdash\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { BylineRepository } from \"#db/repositories/byline.js\";\nimport { resolveImportByline } from \"#import/utils.js\";\nimport {\n\tattachPostTaxonomies,\n\tisWxrTaxonomyConflictError,\n\tmirrorTermsToLocales,\n\tpreImportWxrTaxonomies,\n\tsetPostTermAssignmentsReplacing,\n\ttype TaxonomyImportPlan,\n} from \"#import/wxr-taxonomies.js\";\nimport type { EmDashHandlers, EmDashManifest } from \"#types\";\nimport { slugify } from \"#utils/slugify.js\";\n\nimport { sanitizeSlug } from \"./analyze.js\";\n\nexport const prerender = false;\n\nexport interface ImportConfig {\n\t/** Map WordPress post types to EmDash collections */\n\tpostTypeMappings: Record<\n\t\tstring,\n\t\t{\n\t\t\tcollection: string;\n\t\t\tenabled: boolean;\n\t\t}\n\t>;\n\t/** Whether to skip items that already exist (by slug) */\n\tskipExisting: boolean;\n\t/** Whether to import reusable blocks (wp_block) as sections */\n\timportSections?: boolean;\n\t/** Author mappings (WP author login -> EmDash user ID) */\n\tauthorMappings?: Record<string, string | null>;\n\t/** BCP 47 locale for all imported items. When omitted, defaults to defaultLocale. */\n\tlocale?: string;\n}\n\nexport interface ImportResult {\n\tsuccess: boolean;\n\timported: number;\n\tskipped: number;\n\terrors: Array<{ title: string; error: string }>;\n\tbyCollection: Record<string, number>;\n\t/** Sections import results (if enabled) */\n\tsections?: {\n\t\tcreated: number;\n\t\tskipped: number;\n\t};\n\t/** Taxonomy import results (categories, tags, custom taxonomies). */\n\ttaxonomies?: {\n\t\t/** Terms newly created during this import, keyed by taxonomy name. */\n\t\ttermsCreated: Record<string, number>;\n\t\t/** Existing terms that were re-used, keyed by taxonomy name. */\n\t\ttermsReused: Record<string, number>;\n\t\t/** Total pivot rows (post <-> term) written to `content_taxonomies`. */\n\t\tassignments: number;\n\t\t/**\n\t\t * Custom taxonomy names from the WXR file that had no matching EmDash\n\t\t * definition and were therefore skipped. Lets the admin UI surface a\n\t\t * \"create taxonomy X first\" hint without re-running the import.\n\t\t */\n\t\tmissingTaxonomies: string[];\n\t};\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\tif (!emdash?.handleContentCreate) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\ttry {\n\t\tconst emdashManifest = await emdash.getManifest();\n\n\t\tconst formData = await request.formData();\n\t\tconst fileEntry = formData.get(\"file\");\n\t\tconst file = fileEntry instanceof File ? fileEntry : null;\n\t\tconst configEntry = formData.get(\"config\");\n\t\tconst configJson = typeof configEntry === \"string\" ? configEntry : null;\n\n\t\tif (!file) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No file provided\", 400);\n\t\t}\n\n\t\tif (!configJson) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No config provided\", 400);\n\t\t}\n\n\t\tconst config: ImportConfig = JSON.parse(configJson);\n\n\t\t// Parse WXR\n\t\tconst text = await file.text();\n\t\tconst wxr = await parseWxrString(text);\n\n\t\t// Build attachment ID -> URL map for featured images\n\t\tconst attachmentMap = new Map<string, string>();\n\t\tfor (const att of wxr.attachments) {\n\t\t\tif (att.id && att.url) {\n\t\t\t\tattachmentMap.set(String(att.id), att.url);\n\t\t\t}\n\t\t}\n\n\t\t// Build author login -> display name map\n\t\tconst authorDisplayNames = new Map<string, string>();\n\t\tfor (const author of wxr.authors) {\n\t\t\tif (!author.login) continue;\n\t\t\tauthorDisplayNames.set(author.login, author.displayName || author.login);\n\t\t}\n\n\t\t// Pre-create taxonomy terms (categories, tags, custom taxonomies) so\n\t\t// per-post assignments can resolve to existing rows. Done before any\n\t\t// content insert because WXR exports list terms at the top of the\n\t\t// file but per-item assignments only reference them by slug.\n\t\tconst taxonomyPlan = await preImportWxrTaxonomies(\n\t\t\temdash.db,\n\t\t\twxr.posts,\n\t\t\twxr.categories,\n\t\t\twxr.tags,\n\t\t\twxr.terms,\n\t\t\tconfig.locale,\n\t\t);\n\n\t\t// Multilingual imports (WPML / Polylang -- see #1080) need a term\n\t\t// row at each per-post locale, all sharing the canonical term's\n\t\t// `translation_group`. Without this, `getTermsForEntry(..., locale)`\n\t\t// on non-canonical translations comes back empty.\n\t\t//\n\t\t// The mirror raises `WxrTaxonomyConflictError` with an operator-\n\t\t// actionable message when an existing locale row has an\n\t\t// incompatible group. Surface its `publicMessage` directly so the\n\t\t// admin UI can tell the user which (taxonomy, slug, locale) needs\n\t\t// reconciliation. Other errors (DB connectivity, unexpected\n\t\t// repository failures) re-throw to the outer catch where\n\t\t// `handleError` masks them with the generic \"Failed to import\n\t\t// content\" -- exposing raw DB errors to clients would leak schema\n\t\t// names and bypass the AGENTS.md \"never expose error.message\" rule.\n\t\tconst postLocales = new Set<string>();\n\t\tfor (const post of wxr.posts) {\n\t\t\tif (post.locale) postLocales.add(post.locale);\n\t\t}\n\t\tif (postLocales.size > 0) {\n\t\t\ttry {\n\t\t\t\tawait mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, config.locale);\n\t\t\t} catch (mirrorError) {\n\t\t\t\tif (isWxrTaxonomyConflictError(mirrorError)) {\n\t\t\t\t\tconsole.error(\"[WXR_IMPORT_TAXONOMY_CONFLICT]\", mirrorError);\n\t\t\t\t\treturn apiError(\"WXR_IMPORT_TAXONOMY_CONFLICT\", mirrorError.publicMessage, 409);\n\t\t\t\t}\n\t\t\t\tthrow mirrorError;\n\t\t\t}\n\t\t}\n\n\t\t// Import content (locale from config scopes all items)\n\t\tconst result = await importContent(\n\t\t\twxr.posts,\n\t\t\tconfig,\n\t\t\temdash,\n\t\t\temdashManifest,\n\t\t\tattachmentMap,\n\t\t\tconfig.locale,\n\t\t\tauthorDisplayNames,\n\t\t\ttaxonomyPlan,\n\t\t);\n\n\t\t// Import reusable blocks as sections (if enabled)\n\t\tif (config.importSections !== false) {\n\t\t\tconst sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);\n\t\t\tresult.sections = {\n\t\t\t\tcreated: sectionsResult.sectionsCreated,\n\t\t\t\tskipped: sectionsResult.sectionsSkipped,\n\t\t\t};\n\t\t\t// Add section errors to main errors array\n\t\t\tresult.errors.push(...sectionsResult.errors);\n\t\t\tif (sectionsResult.errors.length > 0) {\n\t\t\t\tresult.success = false;\n\t\t\t}\n\t\t}\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import content\", \"WXR_IMPORT_ERROR\");\n\t}\n};\n\nexport async function importContent(\n\tposts: WxrPost[],\n\tconfig: ImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\tattachmentMap: Map<string, string>,\n\tlocale: string | undefined,\n\tauthorDisplayNames: Map<string, string> | undefined,\n\ttaxonomyPlan: TaxonomyImportPlan,\n): Promise<ImportResult> {\n\tconst result: ImportResult = {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t\ttaxonomies: {\n\t\t\ttermsCreated: taxonomyPlan.termsCreated,\n\t\t\ttermsReused: taxonomyPlan.termsReused,\n\t\t\tassignments: 0,\n\t\t\tmissingTaxonomies: taxonomyPlan.missingTaxonomies,\n\t\t},\n\t};\n\n\t// Create content repository for checking existing items\n\tconst contentRepo = new ContentRepository(emdash.db);\n\tconst bylineRepo = new BylineRepository(emdash.db);\n\tconst bylineCache = new Map<string, string>();\n\n\t// Source-side translation group ID -> the EmDash ID of the first post we\n\t// imported for that group. Subsequent translations are linked via\n\t// `translationOf` so they share a `translation_group` on the EmDash side.\n\tconst translationGroupMap = new Map<string, string>();\n\n\tfor (const post of posts) {\n\t\tconst postType = post.postType || \"post\";\n\t\tconst mapping = config.postTypeMappings[postType];\n\n\t\t// Skip if not mapped or disabled\n\t\tif (!mapping || !mapping.enabled) {\n\t\t\tresult.skipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Defensive: mapping.collection is already sanitized by prepare, but the user\n\t\t// could manually edit the import config between prepare and execute.\n\t\tconst collection = sanitizeSlug(mapping.collection);\n\n\t\t// Check if collection exists in manifest\n\t\tif (!manifest?.collections[collection]) {\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: `Collection \"${collection}\" does not exist`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert content to Portable Text\n\t\t\tconst content = post.content ? gutenbergToPortableText(post.content) : [];\n\n\t\t\t// Generate slug from post name or title\n\t\t\tconst slug = post.postName || slugify(post.title || `post-${post.id || Date.now()}`);\n\n\t\t\t// Per-post locale: prefer the value extracted from WPML/Polylang\n\t\t\t// metadata; fall back to the upload-wide locale. Two translations\n\t\t\t// sharing `post_name` (e.g. /en/hello + /ar/hello) collide on the\n\t\t\t// `UNIQUE(slug, locale)` constraint when they share a locale, so\n\t\t\t// honouring the per-post value is what makes multilingual imports\n\t\t\t// land correctly. See issue #1080.\n\t\t\tconst postLocale = post.locale ?? locale;\n\n\t\t\t// Check if already exists (idempotency). Match against the\n\t\t\t// per-post locale so the same slug in different locales doesn't\n\t\t\t// false-positive as duplicate.\n\t\t\tif (config.skipExisting) {\n\t\t\t\tconst existing = await contentRepo.findBySlug(collection, slug, postLocale);\n\t\t\t\tif (existing) {\n\t\t\t\t\t// Record the translation group mapping so later\n\t\t\t\t\t// translations in this WXR can link to the existing\n\t\t\t\t\t// item. We deliberately trust the WXR's grouping over\n\t\t\t\t\t// the existing row's `translation_group`: a singleton\n\t\t\t\t\t// existing row gets folded into the WXR's group when\n\t\t\t\t\t// `handleContentCreate` resolves the new translation's\n\t\t\t\t\t// `translationOf`. Pre-existing translations that\n\t\t\t\t\t// already belong to a different group are left alone --\n\t\t\t\t\t// the user is responsible for reconciling those through\n\t\t\t\t\t// the admin if they don't match the WXR.\n\t\t\t\t\tif (post.translationGroup) {\n\t\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, existing.id);\n\t\t\t\t\t}\n\t\t\t\t\tresult.skipped++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve translation group: if this post belongs to a group and\n\t\t\t// we've already imported one of its translations, link to it.\n\t\t\tlet translationOf: string | undefined;\n\t\t\tif (post.translationGroup) {\n\t\t\t\ttranslationOf = translationGroupMap.get(post.translationGroup);\n\t\t\t}\n\n\t\t\t// Map WordPress status to EmDash status\n\t\t\tconst status = mapStatus(post.status);\n\n\t\t\t// Build data object with required fields\n\t\t\tconst data: Record<string, unknown> = {\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\tcontent,\n\t\t\t\texcerpt: post.excerpt || undefined,\n\t\t\t};\n\n\t\t\t// Only add featured_image if the collection has this field and we have a value\n\t\t\tconst collectionSchema = manifest.collections[collection];\n\t\t\tconst hasFeaturedImageField = collectionSchema?.fields\n\t\t\t\t? \"featured_image\" in collectionSchema.fields\n\t\t\t\t: false;\n\t\t\tif (hasFeaturedImageField) {\n\t\t\t\tconst thumbnailId = post.meta.get(\"_thumbnail_id\");\n\t\t\t\tconst featuredImage = thumbnailId ? attachmentMap.get(String(thumbnailId)) : undefined;\n\t\t\t\tif (featuredImage) {\n\t\t\t\t\tdata.featured_image = featuredImage;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve author ID from mappings\n\t\t\tlet authorId: string | undefined;\n\t\t\tif (config.authorMappings && post.creator) {\n\t\t\t\tconst mappedUserId = config.authorMappings[post.creator];\n\t\t\t\tif (mappedUserId !== undefined && mappedUserId !== null) {\n\t\t\t\t\tauthorId = mappedUserId;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst bylineId = await resolveImportByline(\n\t\t\t\tpost.creator,\n\t\t\t\tauthorDisplayNames?.get(post.creator ?? \"\") ?? post.creator,\n\t\t\t\tauthorId,\n\t\t\t\tbylineRepo,\n\t\t\t\tbylineCache,\n\t\t\t);\n\n\t\t\t// Preserve original WordPress dates using the shared WXR date parser.\n\t\t\t// Fallback chain: postDateGmt (UTC) → pubDate (RFC 2822) → postDate (site-local).\n\t\t\tconst parsedDate = parseWxrDate(post.postDateGmt, post.pubDate, post.postDate);\n\t\t\tconst createdAt = parsedDate ? parsedDate.toISOString() : undefined;\n\t\t\tconst publishedAt = status === \"published\" && createdAt ? createdAt : undefined;\n\n\t\t\t// Create the content item\n\t\t\tconst createResult = await emdash.handleContentCreate(collection, {\n\t\t\t\tdata,\n\t\t\t\tslug,\n\t\t\t\tstatus,\n\t\t\t\tauthorId,\n\t\t\t\tbylines: bylineId ? [{ bylineId }] : undefined,\n\t\t\t\tlocale: postLocale,\n\t\t\t\ttranslationOf,\n\t\t\t\tcreatedAt,\n\t\t\t\tpublishedAt,\n\t\t\t});\n\n\t\t\tif (createResult.success) {\n\t\t\t\tresult.imported++;\n\t\t\t\tresult.byCollection[collection] = (result.byCollection[collection] || 0) + 1;\n\n\t\t\t\t// `handleContentCreate` returns `data: { item, _rev? }` on\n\t\t\t\t// success (see `ApiResult<ContentResponse>` in\n\t\t\t\t// `api/handlers/content.ts`). `HandlerResponse.data` is\n\t\t\t\t// typed as `unknown` to avoid coupling the route surface to\n\t\t\t\t// internal handler types, so we narrow here.\n\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- handler contract documented at handleContentCreate\n\t\t\t\tconst createdItem = (createResult.data as { item: { id: string } } | undefined)?.item;\n\n\t\t\t\t// Track translation group: the first imported post in a group\n\t\t\t\t// becomes the anchor that later translations link to.\n\t\t\t\tif (\n\t\t\t\t\tcreatedItem &&\n\t\t\t\t\tpost.translationGroup &&\n\t\t\t\t\t!translationGroupMap.has(post.translationGroup)\n\t\t\t\t) {\n\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, createdItem.id);\n\t\t\t\t}\n\n\t\t\t\t// Attach taxonomy assignments parsed from the WXR's per-item\n\t\t\t\t// <category> elements.\n\t\t\t\t//\n\t\t\t\t// Anchors (no `translationOf`) get an additive attach -- the\n\t\t\t\t// row is fresh, no inherited pivots to consider.\n\t\t\t\t//\n\t\t\t\t// Translations replace only taxonomies they explicitly carry.\n\t\t\t\t// Since assignments belong to the content translation_group,\n\t\t\t\t// that replacement is reflected in every sibling locale.\n\t\t\t\tif (createdItem) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst written = translationOf\n\t\t\t\t\t\t\t? await setPostTermAssignmentsReplacing(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: await attachPostTaxonomies(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\tif (result.taxonomies) {\n\t\t\t\t\t\t\tresult.taxonomies.assignments += written;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (taxError) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t`Failed to attach taxonomies for \"${post.title || \"Untitled\"}\":`,\n\t\t\t\t\t\t\ttaxError,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\ttaxError instanceof Error && taxError.message\n\t\t\t\t\t\t\t\t\t? `Imported but failed to attach taxonomies: ${taxError.message}`\n\t\t\t\t\t\t\t\t\t: \"Imported but failed to attach taxonomies\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.errors.push({\n\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\terror:\n\t\t\t\t\t\ttypeof createResult.error === \"object\" && createResult.error !== null\n\t\t\t\t\t\t\t? (createResult.error as { message?: string }).message || \"Unknown error\"\n\t\t\t\t\t\t\t: String(createResult.error),\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Import error for \"${post.title || \"Untitled\"}\":`, error);\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: error instanceof Error && error.message ? error.message : \"Failed to import item\",\n\t\t\t});\n\t\t}\n\t}\n\n\tresult.success = result.errors.length === 0;\n\treturn result;\n}\n\nfunction mapStatus(wpStatus: string | undefined): string {\n\tswitch (wpStatus) {\n\t\tcase \"publish\":\n\t\t\treturn \"published\";\n\t\tcase \"draft\":\n\t\t\treturn \"draft\";\n\t\tcase \"pending\":\n\t\t\treturn \"draft\";\n\t\tcase \"private\":\n\t\t\treturn \"draft\";\n\t\tdefault:\n\t\t\treturn \"draft\";\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,MAAa,YAAY;AAiDzB,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,WAAW,MAAM,QAAQ,UAAU;EACzC,MAAM,YAAY,SAAS,IAAI,OAAO;EACtC,MAAM,OAAO,qBAAqB,OAAO,YAAY;EACrD,MAAM,cAAc,SAAS,IAAI,SAAS;EAC1C,MAAM,aAAa,OAAO,gBAAgB,WAAW,cAAc;AAEnE,MAAI,CAAC,KACJ,QAAO,SAAS,oBAAoB,oBAAoB,IAAI;AAG7D,MAAI,CAAC,WACJ,QAAO,SAAS,oBAAoB,sBAAsB,IAAI;EAG/D,MAAM,SAAuB,KAAK,MAAM,WAAW;EAInD,MAAM,MAAM,MAAM,eADL,MAAM,KAAK,MAAM,CACQ;EAGtC,MAAM,gCAAgB,IAAI,KAAqB;AAC/C,OAAK,MAAM,OAAO,IAAI,YACrB,KAAI,IAAI,MAAM,IAAI,IACjB,eAAc,IAAI,OAAO,IAAI,GAAG,EAAE,IAAI,IAAI;EAK5C,MAAM,qCAAqB,IAAI,KAAqB;AACpD,OAAK,MAAM,UAAU,IAAI,SAAS;AACjC,OAAI,CAAC,OAAO,MAAO;AACnB,sBAAmB,IAAI,OAAO,OAAO,OAAO,eAAe,OAAO,MAAM;;EAOzE,MAAM,eAAe,MAAM,uBAC1B,OAAO,IACP,IAAI,OACJ,IAAI,YACJ,IAAI,MACJ,IAAI,OACJ,OAAO,OACP;EAgBD,MAAM,8BAAc,IAAI,KAAa;AACrC,OAAK,MAAM,QAAQ,IAAI,MACtB,KAAI,KAAK,OAAQ,aAAY,IAAI,KAAK,OAAO;AAE9C,MAAI,YAAY,OAAO,EACtB,KAAI;AACH,SAAM,qBAAqB,OAAO,IAAI,cAAc,aAAa,OAAO,OAAO;WACvE,aAAa;AACrB,OAAI,2BAA2B,YAAY,EAAE;AAC5C,YAAQ,MAAM,kCAAkC,YAAY;AAC5D,WAAO,SAAS,gCAAgC,YAAY,eAAe,IAAI;;AAEhF,SAAM;;EAKR,MAAM,SAAS,MAAM,cACpB,IAAI,OACJ,QACA,QACA,gBACA,eACA,OAAO,QACP,oBACA,aACA;AAGD,MAAI,OAAO,mBAAmB,OAAO;GACpC,MAAM,iBAAiB,MAAM,+BAA+B,IAAI,OAAO,OAAO,GAAG;AACjF,UAAO,WAAW;IACjB,SAAS,eAAe;IACxB,SAAS,eAAe;IACxB;AAED,UAAO,OAAO,KAAK,GAAG,eAAe,OAAO;AAC5C,OAAI,eAAe,OAAO,SAAS,EAClC,QAAO,UAAU;;AAInB,SAAO,WAAW,OAAO;UACjB,OAAO;AACf,SAAO,YAAY,OAAO,4BAA4B,mBAAmB;;;AAI3E,eAAsB,cACrB,OACA,QACA,QACA,UACA,eACA,QACA,oBACA,cACwB;CACxB,MAAM,SAAuB;EAC5B,SAAS;EACT,UAAU;EACV,SAAS;EACT,QAAQ,EAAE;EACV,cAAc,EAAE;EAChB,YAAY;GACX,cAAc,aAAa;GAC3B,aAAa,aAAa;GAC1B,aAAa;GACb,mBAAmB,aAAa;GAChC;EACD;CAGD,MAAM,cAAc,IAAI,kBAAkB,OAAO,GAAG;CACpD,MAAM,aAAa,IAAI,iBAAiB,OAAO,GAAG;CAClD,MAAM,8BAAc,IAAI,KAAqB;CAK7C,MAAM,sCAAsB,IAAI,KAAqB;AAErD,MAAK,MAAM,QAAQ,OAAO;EACzB,MAAM,WAAW,KAAK,YAAY;EAClC,MAAM,UAAU,OAAO,iBAAiB;AAGxC,MAAI,CAAC,WAAW,CAAC,QAAQ,SAAS;AACjC,UAAO;AACP;;EAKD,MAAM,aAAa,aAAa,QAAQ,WAAW;AAGnD,MAAI,CAAC,UAAU,YAAY,aAAa;AACvC,UAAO,OAAO,KAAK;IAClB,OAAO,KAAK,SAAS;IACrB,OAAO,eAAe,WAAW;IACjC,CAAC;AACF;;AAGD,MAAI;GAEH,MAAM,UAAU,KAAK,UAAU,wBAAwB,KAAK,QAAQ,GAAG,EAAE;GAGzE,MAAM,OAAO,KAAK,YAAY,QAAQ,KAAK,SAAS,QAAQ,KAAK,MAAM,KAAK,KAAK,GAAG;GAQpF,MAAM,aAAa,KAAK,UAAU;AAKlC,OAAI,OAAO,cAAc;IACxB,MAAM,WAAW,MAAM,YAAY,WAAW,YAAY,MAAM,WAAW;AAC3E,QAAI,UAAU;AAWb,SAAI,KAAK,iBACR,qBAAoB,IAAI,KAAK,kBAAkB,SAAS,GAAG;AAE5D,YAAO;AACP;;;GAMF,IAAI;AACJ,OAAI,KAAK,iBACR,iBAAgB,oBAAoB,IAAI,KAAK,iBAAiB;GAI/D,MAAM,SAAS,UAAU,KAAK,OAAO;GAGrC,MAAM,OAAgC;IACrC,OAAO,KAAK,SAAS;IACrB;IACA,SAAS,KAAK,WAAW;IACzB;GAGD,MAAM,mBAAmB,SAAS,YAAY;AAI9C,OAH8B,kBAAkB,SAC7C,oBAAoB,iBAAiB,SACrC,OACwB;IAC1B,MAAM,cAAc,KAAK,KAAK,IAAI,gBAAgB;IAClD,MAAM,gBAAgB,cAAc,cAAc,IAAI,OAAO,YAAY,CAAC,GAAG;AAC7E,QAAI,cACH,MAAK,iBAAiB;;GAKxB,IAAI;AACJ,OAAI,OAAO,kBAAkB,KAAK,SAAS;IAC1C,MAAM,eAAe,OAAO,eAAe,KAAK;AAChD,QAAI,iBAAiB,UAAa,iBAAiB,KAClD,YAAW;;GAIb,MAAM,WAAW,MAAM,oBACtB,KAAK,SACL,oBAAoB,IAAI,KAAK,WAAW,GAAG,IAAI,KAAK,SACpD,UACA,YACA,YACA;GAID,MAAM,aAAa,aAAa,KAAK,aAAa,KAAK,SAAS,KAAK,SAAS;GAC9E,MAAM,YAAY,aAAa,WAAW,aAAa,GAAG;GAC1D,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;IACR;IACA;IACA;IACA,CAAC;AAEF,OAAI,aAAa,SAAS;AACzB,WAAO;AACP,WAAO,aAAa,eAAe,OAAO,aAAa,eAAe,KAAK;IAQ3E,MAAM,cAAe,aAAa,MAA+C;AAIjF,QACC,eACA,KAAK,oBACL,CAAC,oBAAoB,IAAI,KAAK,iBAAiB,CAE/C,qBAAoB,IAAI,KAAK,kBAAkB,YAAY,GAAG;AAY/D,QAAI,YACH,KAAI;KACH,MAAM,UAAU,gBACb,MAAM,gCACN,OAAO,IACP,YACA,YAAY,IACZ,MACA,aACA,GACA,MAAM,qBACN,OAAO,IACP,YACA,YAAY,IACZ,MACA,aACA;AACH,SAAI,OAAO,WACV,QAAO,WAAW,eAAe;aAE1B,UAAU;AAClB,aAAQ,MACP,oCAAoC,KAAK,SAAS,WAAW,KAC7D,SACA;AACD,YAAO,OAAO,KAAK;MAClB,OAAO,KAAK,SAAS;MACrB,OACC,oBAAoB,SAAS,SAAS,UACnC,6CAA6C,SAAS,YACtD;MACJ,CAAC;;SAIJ,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,QAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,QAAO;;AAGR,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
+ {"version":3,"file":"execute.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/execute.ts"],"sourcesContent":["/**\n * WordPress WXR execute import endpoint\n *\n * POST /_emdash/api/import/wordpress/execute\n *\n * Accepts WXR file and import configuration, imports content into the database.\n */\n\nimport { gutenbergToPortableText } from \"@emdash-cms/gutenberg-to-portable-text\";\nimport type { APIRoute } from \"astro\";\nimport {\n\tparseWxrString,\n\tContentRepository,\n\timportReusableBlocksAsSections,\n\ttype WxrPost,\n\tparseWxrDate,\n} from \"emdash\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { wxrChunkCursor, wxrChunkState, wxrImportConfig } from \"#api/schemas.js\";\nimport { BylineRepository } from \"#db/repositories/byline.js\";\nimport { resolveImportByline } from \"#import/utils.js\";\nimport {\n\tattachPostTaxonomies,\n\tisWxrTaxonomyConflictError,\n\tloadTaxonomyPlanFromDb,\n\tmirrorTermsToLocales,\n\tpreImportWxrTaxonomies,\n\tsetPostTermAssignmentsReplacing,\n\ttype TaxonomyImportPlan,\n} from \"#import/wxr-taxonomies.js\";\nimport type { EmDashHandlers, EmDashManifest } from \"#types\";\nimport { slugify } from \"#utils/slugify.js\";\n\nimport { sanitizeSlug } from \"./analyze.js\";\n\nexport const prerender = false;\n\n/** Posts processed per Worker invocation in chunked WXR imports. */\nconst WXR_CONTENT_CHUNK_SIZE = 30;\n\n/** Phase/cursor payload for chunked WXR imports. */\ninterface WxrChunkCursor {\n\toffset: number;\n\tsource: string;\n\ttaxonomiesReady: true;\n}\n\n/** Cross-chunk state carried by the client. */\ninterface WxrChunkState {\n\ttranslationGroups: Record<string, string>;\n}\n\n/** Chunked response shape mirrors the wordpress-plugin execute endpoint. */\ninterface WxrChunkResponse {\n\tsuccess: boolean;\n\tresult: ImportResult;\n\tdone: boolean;\n\tcursor?: WxrChunkCursor;\n\tchunk?: WxrChunkState;\n}\n\nexport interface ImportConfig {\n\t/** Map WordPress post types to EmDash collections */\n\tpostTypeMappings: Record<\n\t\tstring,\n\t\t{\n\t\t\tcollection: string;\n\t\t\tenabled: boolean;\n\t\t}\n\t>;\n\t/** Whether to skip items that already exist (by slug) */\n\tskipExisting: boolean;\n\t/** Whether to import reusable blocks (wp_block) as sections */\n\timportSections?: boolean;\n\t/** Author mappings (WP author login -> EmDash user ID) */\n\tauthorMappings?: Record<string, string | null>;\n\t/** BCP 47 locale for all imported items. When omitted, defaults to defaultLocale. */\n\tlocale?: string;\n}\n\nexport interface ImportResult {\n\tsuccess: boolean;\n\timported: number;\n\tskipped: number;\n\terrors: Array<{ title: string; error: string }>;\n\tbyCollection: Record<string, number>;\n\t/** Sections import results (if enabled) */\n\tsections?: {\n\t\tcreated: number;\n\t\tskipped: number;\n\t};\n\t/** Taxonomy import results (categories, tags, custom taxonomies). */\n\ttaxonomies?: {\n\t\t/** Terms newly created during this import, keyed by taxonomy name. */\n\t\ttermsCreated: Record<string, number>;\n\t\t/** Existing terms that were re-used, keyed by taxonomy name. */\n\t\ttermsReused: Record<string, number>;\n\t\t/** Total pivot rows (post <-> term) written to `content_taxonomies`. */\n\t\tassignments: number;\n\t\t/**\n\t\t * Custom taxonomy names from the WXR file that had no matching EmDash\n\t\t * definition and were therefore skipped. Lets the admin UI surface a\n\t\t * \"create taxonomy X first\" hint without re-running the import.\n\t\t */\n\t\tmissingTaxonomies: string[];\n\t};\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\tif (!emdash?.handleContentCreate) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\ttry {\n\t\tconst emdashManifest = await emdash.getManifest();\n\n\t\tconst formData = await request.formData();\n\t\tconst fileEntry = formData.get(\"file\");\n\t\tconst file = fileEntry instanceof File ? fileEntry : null;\n\t\tconst configEntry = formData.get(\"config\");\n\t\tconst configJson = typeof configEntry === \"string\" ? configEntry : null;\n\n\t\tif (!file) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No file provided\", 400);\n\t\t}\n\n\t\tif (!configJson) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"No config provided\", 400);\n\t\t}\n\n\t\tconst parsedConfig = parseJsonField(configJson, \"config\");\n\t\tif (\"response\" in parsedConfig) return parsedConfig.response;\n\t\tconst configResult = wxrImportConfig.safeParse(parsedConfig.value);\n\t\tif (!configResult.success) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import config\", 400);\n\t\t}\n\t\tconst config: ImportConfig = configResult.data;\n\n\t\tconst phaseEntry = formData.get(\"phase\");\n\t\tif (\n\t\t\tphaseEntry !== null &&\n\t\t\tphaseEntry !== \"taxonomy\" &&\n\t\t\tphaseEntry !== \"content\" &&\n\t\t\tphaseEntry !== \"finalize\"\n\t\t) {\n\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import phase\", 400);\n\t\t}\n\t\tconst phase = phaseEntry;\n\n\t\tconst cursorEntry = formData.get(\"cursor\");\n\t\tlet cursor: WxrChunkCursor | undefined;\n\t\tif (typeof cursorEntry === \"string\" && cursorEntry.length > 0) {\n\t\t\tconst parsedCursor = parseJsonField(cursorEntry, \"cursor\");\n\t\t\tif (\"response\" in parsedCursor) return parsedCursor.response;\n\t\t\tconst cursorResult = wxrChunkCursor.safeParse(parsedCursor.value);\n\t\t\tif (!cursorResult.success) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import cursor\", 400);\n\t\t\t}\n\t\t\tcursor = cursorResult.data;\n\t\t}\n\n\t\tconst chunkEntry = formData.get(\"chunk\");\n\t\tlet incomingChunk: WxrChunkState | undefined;\n\t\tif (typeof chunkEntry === \"string\" && chunkEntry.length > 0) {\n\t\t\tconst parsedChunk = parseJsonField(chunkEntry, \"chunk\");\n\t\t\tif (\"response\" in parsedChunk) return parsedChunk.response;\n\t\t\tconst chunkResult = wxrChunkState.safeParse(parsedChunk.value);\n\t\t\tif (!chunkResult.success) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import chunk state\", 400);\n\t\t\t}\n\t\t\tincomingChunk = chunkResult.data;\n\t\t}\n\n\t\t// Parse WXR\n\t\tconst text = await file.text();\n\t\tconst wxr = await parseWxrString(text);\n\t\tconst source = await importFingerprint(text, configJson);\n\n\t\tif (cursor && cursor.source !== source) {\n\t\t\treturn apiError(\n\t\t\t\t\"WXR_IMPORT_SOURCE_CHANGED\",\n\t\t\t\t\"The WXR file or import configuration changed after this import started\",\n\t\t\t\t409,\n\t\t\t);\n\t\t}\n\n\t\t// Build attachment ID -> URL map for featured images\n\t\tconst attachmentMap = new Map<string, string>();\n\t\tfor (const att of wxr.attachments) {\n\t\t\tif (att.id && att.url) {\n\t\t\t\tattachmentMap.set(String(att.id), att.url);\n\t\t\t}\n\t\t}\n\n\t\t// Build author login -> display name map\n\t\tconst authorDisplayNames = new Map<string, string>();\n\t\tfor (const author of wxr.authors) {\n\t\t\tif (!author.login) continue;\n\t\t\tauthorDisplayNames.set(author.login, author.displayName || author.login);\n\t\t}\n\n\t\tif (phase === \"content\") {\n\t\t\tif (!cursor?.taxonomiesReady) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Taxonomy preparation is not complete\", 400);\n\t\t\t}\n\t\t\tconst chunkResponse = await runContentChunk(\n\t\t\t\twxr,\n\t\t\t\tconfig,\n\t\t\t\temdash,\n\t\t\t\temdashManifest,\n\t\t\t\tattachmentMap,\n\t\t\t\tauthorDisplayNames,\n\t\t\t\tcursor,\n\t\t\t\tincomingChunk,\n\t\t\t\tsource,\n\t\t\t);\n\t\t\tif (chunkResponse instanceof Response) return chunkResponse;\n\t\t\treturn apiSuccess(chunkResponse);\n\t\t}\n\n\t\tif (phase === \"taxonomy\") {\n\t\t\tif (cursor || incomingChunk) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Taxonomy preparation cannot be resumed\", 400);\n\t\t\t}\n\t\t\tlet taxonomyPlan: TaxonomyImportPlan;\n\t\t\ttry {\n\t\t\t\ttaxonomyPlan = await prepareTaxonomies(wxr, emdash, config.locale);\n\t\t\t} catch (error) {\n\t\t\t\tif (isWxrTaxonomyConflictError(error)) {\n\t\t\t\t\tconsole.error(\"[WXR_IMPORT_TAXONOMY_CONFLICT]\", error);\n\t\t\t\t\treturn apiError(\"WXR_IMPORT_TAXONOMY_CONFLICT\", error.publicMessage, 409);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst result = emptyImportResult();\n\t\t\tresult.taxonomies = {\n\t\t\t\ttermsCreated: taxonomyPlan.termsCreated,\n\t\t\t\ttermsReused: taxonomyPlan.termsReused,\n\t\t\t\tassignments: 0,\n\t\t\t\tmissingTaxonomies: taxonomyPlan.missingTaxonomies,\n\t\t\t};\n\t\t\treturn apiSuccess({\n\t\t\t\tsuccess: true,\n\t\t\t\tresult,\n\t\t\t\tdone: true,\n\t\t\t\tcursor: { offset: 0, source, taxonomiesReady: true as const },\n\t\t\t\tchunk: { translationGroups: {} },\n\t\t\t});\n\t\t}\n\n\t\tif (phase === \"finalize\") {\n\t\t\tif (!cursor || cursor.offset !== wxr.posts.length) {\n\t\t\t\treturn apiError(\"VALIDATION_ERROR\", \"Content import is not complete\", 400);\n\t\t\t}\n\t\t\tconst result = emptyImportResult();\n\t\t\tif (config.importSections !== false) {\n\t\t\t\tconst sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);\n\t\t\t\tresult.sections = {\n\t\t\t\t\tcreated: sectionsResult.sectionsCreated,\n\t\t\t\t\tskipped: sectionsResult.sectionsSkipped,\n\t\t\t\t};\n\t\t\t\tresult.errors.push(...sectionsResult.errors);\n\t\t\t\tresult.success = result.errors.length === 0;\n\t\t\t}\n\t\t\treturn apiSuccess({ success: result.success, result, done: true });\n\t\t}\n\n\t\tif (wxr.posts.length > WXR_CONTENT_CHUNK_SIZE) {\n\t\t\treturn apiError(\n\t\t\t\t\"WXR_IMPORT_TOO_LARGE\",\n\t\t\t\t`This WXR contains ${wxr.posts.length} posts, which exceeds the ${WXR_CONTENT_CHUNK_SIZE}-post limit for a single import request. ` +\n\t\t\t\t\t`Run the import in chunked mode or split the file into smaller exports.`,\n\t\t\t\t413,\n\t\t\t);\n\t\t}\n\n\t\t// Pre-create taxonomy terms (categories, tags, custom taxonomies) so\n\t\t// per-post assignments can resolve to existing rows. Done before any\n\t\t// content insert because WXR exports list terms at the top of the\n\t\t// file but per-item assignments only reference them by slug.\n\t\tconst taxonomyPlan = await preImportWxrTaxonomies(\n\t\t\temdash.db,\n\t\t\twxr.posts,\n\t\t\twxr.categories,\n\t\t\twxr.tags,\n\t\t\twxr.terms,\n\t\t\tconfig.locale,\n\t\t);\n\n\t\t// Multilingual imports (WPML / Polylang -- see #1080) need a term\n\t\t// row at each per-post locale, all sharing the canonical term's\n\t\t// `translation_group`. Without this, `getTermsForEntry(..., locale)`\n\t\t// on non-canonical translations comes back empty.\n\t\t//\n\t\t// The mirror raises `WxrTaxonomyConflictError` with an operator-\n\t\t// actionable message when an existing locale row has an\n\t\t// incompatible group. Surface its `publicMessage` directly so the\n\t\t// admin UI can tell the user which (taxonomy, slug, locale) needs\n\t\t// reconciliation. Other errors (DB connectivity, unexpected\n\t\t// repository failures) re-throw to the outer catch where\n\t\t// `handleError` masks them with the generic \"Failed to import\n\t\t// content\" -- exposing raw DB errors to clients would leak schema\n\t\t// names and bypass the AGENTS.md \"never expose error.message\" rule.\n\t\tconst postLocales = new Set<string>();\n\t\tfor (const post of wxr.posts) {\n\t\t\tif (post.locale) postLocales.add(post.locale);\n\t\t}\n\t\tif (postLocales.size > 0) {\n\t\t\ttry {\n\t\t\t\tawait mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, config.locale);\n\t\t\t} catch (mirrorError) {\n\t\t\t\tif (isWxrTaxonomyConflictError(mirrorError)) {\n\t\t\t\t\tconsole.error(\"[WXR_IMPORT_TAXONOMY_CONFLICT]\", mirrorError);\n\t\t\t\t\treturn apiError(\"WXR_IMPORT_TAXONOMY_CONFLICT\", mirrorError.publicMessage, 409);\n\t\t\t\t}\n\t\t\t\tthrow mirrorError;\n\t\t\t}\n\t\t}\n\n\t\t// Import content (locale from config scopes all items)\n\t\tconst result = await importContent(\n\t\t\twxr.posts,\n\t\t\tconfig,\n\t\t\temdash,\n\t\t\temdashManifest,\n\t\t\tattachmentMap,\n\t\t\tconfig.locale,\n\t\t\tauthorDisplayNames,\n\t\t\ttaxonomyPlan,\n\t\t);\n\n\t\t// Import reusable blocks as sections (if enabled)\n\t\tif (config.importSections !== false) {\n\t\t\tconst sectionsResult = await importReusableBlocksAsSections(wxr.posts, emdash.db);\n\t\t\tresult.sections = {\n\t\t\t\tcreated: sectionsResult.sectionsCreated,\n\t\t\t\tskipped: sectionsResult.sectionsSkipped,\n\t\t\t};\n\t\t\t// Add section errors to main errors array\n\t\t\tresult.errors.push(...sectionsResult.errors);\n\t\t\tif (sectionsResult.errors.length > 0) {\n\t\t\t\tresult.success = false;\n\t\t\t}\n\t\t}\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import content\", \"WXR_IMPORT_ERROR\");\n\t}\n};\n\nfunction parseJsonField(\n\tvalue: string,\n\tfieldName: string,\n): { value: unknown } | { response: Response } {\n\ttry {\n\t\treturn { value: JSON.parse(value) };\n\t} catch {\n\t\treturn { response: apiError(\"VALIDATION_ERROR\", `Invalid JSON in ${fieldName}`, 400) };\n\t}\n}\n\nasync function importFingerprint(text: string, configJson: string): Promise<string> {\n\tconst bytes = new TextEncoder().encode(`${configJson}\\u0000${text}`);\n\tconst digest = await crypto.subtle.digest(\"SHA-256\", bytes);\n\treturn Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction emptyImportResult(): ImportResult {\n\treturn {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t};\n}\n\n/** Import a bounded WXR post chunk using taxonomy rows prepared in the prior phase. */\nasync function runContentChunk(\n\twxr: Awaited<ReturnType<typeof parseWxrString>>,\n\tconfig: ImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\tattachmentMap: Map<string, string>,\n\tauthorDisplayNames: Map<string, string>,\n\tcursor: WxrChunkCursor | undefined,\n\tincomingChunk: WxrChunkState | undefined,\n\tsource: string,\n): Promise<WxrChunkResponse | Response> {\n\tconst offset = cursor?.offset ?? 0;\n\tif (offset > wxr.posts.length || (offset > 0 && offset % WXR_CONTENT_CHUNK_SIZE !== 0)) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Invalid import cursor offset\", 400);\n\t}\n\tconst posts = wxr.posts.slice(offset, offset + WXR_CONTENT_CHUNK_SIZE);\n\tconst taxonomyPlan = await loadTaxonomyPlanFromDb(emdash.db);\n\n\t// Seed translation-group state from earlier chunks so a translation that\n\t// appears on chunk N can link to its sibling imported on chunk N-1.\n\tconst translationGroupMap = new Map<string, string>(\n\t\tObject.entries(incomingChunk?.translationGroups ?? {}),\n\t);\n\n\tconst result = await importContent(\n\t\tposts,\n\t\tconfig,\n\t\temdash,\n\t\tmanifest,\n\t\tattachmentMap,\n\t\tconfig.locale,\n\t\tauthorDisplayNames,\n\t\ttaxonomyPlan,\n\t\ttranslationGroupMap,\n\t);\n\n\tconst nextOffset = offset + posts.length;\n\tconst done = nextOffset >= wxr.posts.length;\n\n\treturn {\n\t\tsuccess: result.errors.length === 0,\n\t\tresult,\n\t\tdone,\n\t\tcursor: { offset: nextOffset, source, taxonomiesReady: true },\n\t\tchunk: { translationGroups: Object.fromEntries(translationGroupMap) },\n\t};\n}\n\nasync function prepareTaxonomies(\n\twxr: Awaited<ReturnType<typeof parseWxrString>>,\n\temdash: EmDashHandlers,\n\tlocale: string | undefined,\n): Promise<TaxonomyImportPlan> {\n\tconst taxonomyPlan = await preImportWxrTaxonomies(\n\t\temdash.db,\n\t\twxr.posts,\n\t\twxr.categories,\n\t\twxr.tags,\n\t\twxr.terms,\n\t\tlocale,\n\t);\n\tconst postLocales = new Set<string>();\n\tfor (const post of wxr.posts) {\n\t\tif (post.locale) postLocales.add(post.locale);\n\t}\n\tif (postLocales.size > 0) {\n\t\tawait mirrorTermsToLocales(emdash.db, taxonomyPlan, postLocales, locale);\n\t}\n\treturn taxonomyPlan;\n}\n\nexport async function importContent(\n\tposts: WxrPost[],\n\tconfig: ImportConfig,\n\temdash: EmDashHandlers,\n\tmanifest: EmDashManifest,\n\tattachmentMap: Map<string, string>,\n\tlocale: string | undefined,\n\tauthorDisplayNames: Map<string, string> | undefined,\n\ttaxonomyPlan: TaxonomyImportPlan,\n\ttranslationGroupMap = new Map<string, string>(),\n): Promise<ImportResult> {\n\tconst result: ImportResult = {\n\t\tsuccess: true,\n\t\timported: 0,\n\t\tskipped: 0,\n\t\terrors: [],\n\t\tbyCollection: {},\n\t\ttaxonomies: {\n\t\t\ttermsCreated: taxonomyPlan.termsCreated,\n\t\t\ttermsReused: taxonomyPlan.termsReused,\n\t\t\tassignments: 0,\n\t\t\tmissingTaxonomies: taxonomyPlan.missingTaxonomies,\n\t\t},\n\t};\n\n\t// Create content repository for checking existing items\n\tconst contentRepo = new ContentRepository(emdash.db);\n\tconst bylineRepo = new BylineRepository(emdash.db);\n\tconst bylineCache = new Map<string, string>();\n\n\tfor (const post of posts) {\n\t\tconst postType = post.postType || \"post\";\n\t\tconst mapping = config.postTypeMappings[postType];\n\n\t\t// Skip if not mapped or disabled\n\t\tif (!mapping || !mapping.enabled) {\n\t\t\tresult.skipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Defensive: mapping.collection is already sanitized by prepare, but the user\n\t\t// could manually edit the import config between prepare and execute.\n\t\tconst collection = sanitizeSlug(mapping.collection);\n\n\t\t// Check if collection exists in manifest\n\t\tif (!manifest?.collections[collection]) {\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: `Collection \"${collection}\" does not exist`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert content to Portable Text\n\t\t\tconst content = post.content ? gutenbergToPortableText(post.content) : [];\n\n\t\t\t// Generate slug from post name or title\n\t\t\tconst slug = post.postName || slugify(post.title || `post-${post.id || Date.now()}`);\n\n\t\t\t// Per-post locale: prefer the value extracted from WPML/Polylang\n\t\t\t// metadata; fall back to the upload-wide locale. Two translations\n\t\t\t// sharing `post_name` (e.g. /en/hello + /ar/hello) collide on the\n\t\t\t// `UNIQUE(slug, locale)` constraint when they share a locale, so\n\t\t\t// honouring the per-post value is what makes multilingual imports\n\t\t\t// land correctly. See issue #1080.\n\t\t\tconst postLocale = post.locale ?? locale;\n\n\t\t\t// Check if already exists (idempotency). Match against the\n\t\t\t// per-post locale so the same slug in different locales doesn't\n\t\t\t// false-positive as duplicate.\n\t\t\tif (config.skipExisting) {\n\t\t\t\tconst existing = await contentRepo.findBySlug(collection, slug, postLocale);\n\t\t\t\tif (existing) {\n\t\t\t\t\t// Record the translation group mapping so later\n\t\t\t\t\t// translations in this WXR can link to the existing\n\t\t\t\t\t// item. We deliberately trust the WXR's grouping over\n\t\t\t\t\t// the existing row's `translation_group`: a singleton\n\t\t\t\t\t// existing row gets folded into the WXR's group when\n\t\t\t\t\t// `handleContentCreate` resolves the new translation's\n\t\t\t\t\t// `translationOf`. Pre-existing translations that\n\t\t\t\t\t// already belong to a different group are left alone --\n\t\t\t\t\t// the user is responsible for reconciling those through\n\t\t\t\t\t// the admin if they don't match the WXR.\n\t\t\t\t\tif (post.translationGroup) {\n\t\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, existing.id);\n\t\t\t\t\t}\n\t\t\t\t\tresult.skipped++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve translation group: if this post belongs to a group and\n\t\t\t// we've already imported one of its translations, link to it.\n\t\t\tlet translationOf: string | undefined;\n\t\t\tif (post.translationGroup) {\n\t\t\t\ttranslationOf = translationGroupMap.get(post.translationGroup);\n\t\t\t}\n\n\t\t\t// Map WordPress status to EmDash status\n\t\t\tconst status = mapStatus(post.status);\n\n\t\t\t// Build data object with required fields\n\t\t\tconst data: Record<string, unknown> = {\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\tcontent,\n\t\t\t\texcerpt: post.excerpt || undefined,\n\t\t\t};\n\n\t\t\t// Only add featured_image if the collection has this field and we have a value\n\t\t\tconst collectionSchema = manifest.collections[collection];\n\t\t\tconst hasFeaturedImageField = collectionSchema?.fields\n\t\t\t\t? \"featured_image\" in collectionSchema.fields\n\t\t\t\t: false;\n\t\t\tif (hasFeaturedImageField) {\n\t\t\t\tconst thumbnailId = post.meta.get(\"_thumbnail_id\");\n\t\t\t\tconst featuredImage = thumbnailId ? attachmentMap.get(String(thumbnailId)) : undefined;\n\t\t\t\tif (featuredImage) {\n\t\t\t\t\tdata.featured_image = featuredImage;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve author ID from mappings\n\t\t\tlet authorId: string | undefined;\n\t\t\tif (config.authorMappings && post.creator) {\n\t\t\t\tconst mappedUserId = config.authorMappings[post.creator];\n\t\t\t\tif (mappedUserId !== undefined && mappedUserId !== null) {\n\t\t\t\t\tauthorId = mappedUserId;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst bylineId = await resolveImportByline(\n\t\t\t\tpost.creator,\n\t\t\t\tauthorDisplayNames?.get(post.creator ?? \"\") ?? post.creator,\n\t\t\t\tauthorId,\n\t\t\t\tbylineRepo,\n\t\t\t\tbylineCache,\n\t\t\t);\n\n\t\t\t// Preserve original WordPress dates using the shared WXR date parser.\n\t\t\t// Fallback chain: postDateGmt (UTC) → pubDate (RFC 2822) → postDate (site-local).\n\t\t\tconst parsedDate = parseWxrDate(post.postDateGmt, post.pubDate, post.postDate);\n\t\t\tconst createdAt = parsedDate ? parsedDate.toISOString() : undefined;\n\t\t\tconst publishedAt = status === \"published\" && createdAt ? createdAt : undefined;\n\n\t\t\t// Create the content item\n\t\t\tconst createResult = await emdash.handleContentCreate(collection, {\n\t\t\t\tdata,\n\t\t\t\tslug,\n\t\t\t\tstatus,\n\t\t\t\tauthorId,\n\t\t\t\tbylines: bylineId ? [{ bylineId }] : undefined,\n\t\t\t\tlocale: postLocale,\n\t\t\t\ttranslationOf,\n\t\t\t\tcreatedAt,\n\t\t\t\tpublishedAt,\n\t\t\t});\n\n\t\t\tif (createResult.success) {\n\t\t\t\tresult.imported++;\n\t\t\t\tresult.byCollection[collection] = (result.byCollection[collection] || 0) + 1;\n\n\t\t\t\t// `handleContentCreate` returns `data: { item, _rev? }` on\n\t\t\t\t// success (see `ApiResult<ContentResponse>` in\n\t\t\t\t// `api/handlers/content.ts`). `HandlerResponse.data` is\n\t\t\t\t// typed as `unknown` to avoid coupling the route surface to\n\t\t\t\t// internal handler types, so we narrow here.\n\t\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- handler contract documented at handleContentCreate\n\t\t\t\tconst createdItem = (createResult.data as { item: { id: string } } | undefined)?.item;\n\n\t\t\t\t// Track translation group: the first imported post in a group\n\t\t\t\t// becomes the anchor that later translations link to.\n\t\t\t\tif (\n\t\t\t\t\tcreatedItem &&\n\t\t\t\t\tpost.translationGroup &&\n\t\t\t\t\t!translationGroupMap.has(post.translationGroup)\n\t\t\t\t) {\n\t\t\t\t\ttranslationGroupMap.set(post.translationGroup, createdItem.id);\n\t\t\t\t}\n\n\t\t\t\t// Attach taxonomy assignments parsed from the WXR's per-item\n\t\t\t\t// <category> elements.\n\t\t\t\t//\n\t\t\t\t// Anchors (no `translationOf`) get an additive attach -- the\n\t\t\t\t// row is fresh, no inherited pivots to consider.\n\t\t\t\t//\n\t\t\t\t// Translations replace only taxonomies they explicitly carry.\n\t\t\t\t// Since assignments belong to the content translation_group,\n\t\t\t\t// that replacement is reflected in every sibling locale.\n\t\t\t\tif (createdItem) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst written = translationOf\n\t\t\t\t\t\t\t? await setPostTermAssignmentsReplacing(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: await attachPostTaxonomies(\n\t\t\t\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\t\t\tcreatedItem.id,\n\t\t\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t\t\ttaxonomyPlan,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\tif (result.taxonomies) {\n\t\t\t\t\t\t\tresult.taxonomies.assignments += written;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (taxError) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t`Failed to attach taxonomies for \"${post.title || \"Untitled\"}\":`,\n\t\t\t\t\t\t\ttaxError,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\ttaxError instanceof Error && taxError.message\n\t\t\t\t\t\t\t\t\t? `Imported but failed to attach taxonomies: ${taxError.message}`\n\t\t\t\t\t\t\t\t\t: \"Imported but failed to attach taxonomies\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.errors.push({\n\t\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\t\terror:\n\t\t\t\t\t\ttypeof createResult.error === \"object\" && createResult.error !== null\n\t\t\t\t\t\t\t? (createResult.error as { message?: string }).message || \"Unknown error\"\n\t\t\t\t\t\t\t: String(createResult.error),\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Import error for \"${post.title || \"Untitled\"}\":`, error);\n\t\t\tresult.errors.push({\n\t\t\t\ttitle: post.title || \"Untitled\",\n\t\t\t\terror: error instanceof Error && error.message ? error.message : \"Failed to import item\",\n\t\t\t});\n\t\t}\n\t}\n\n\tresult.success = result.errors.length === 0;\n\treturn result;\n}\n\nfunction mapStatus(wpStatus: string | undefined): string {\n\tswitch (wpStatus) {\n\t\tcase \"publish\":\n\t\t\treturn \"published\";\n\t\tcase \"draft\":\n\t\t\treturn \"draft\";\n\t\tcase \"pending\":\n\t\t\treturn \"draft\";\n\t\tcase \"private\":\n\t\t\treturn \"draft\";\n\t\tdefault:\n\t\t\treturn \"draft\";\n\t}\n}\n"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
- import "../../../../../parse-CVgO-Qai.mjs";
2
- import "../../../../../types-B7Lmsh1E.mjs";
3
- import "../../../../../types-Cr-Kg-3D.mjs";
4
- import "../../../../../options-SQCHQCPH.mjs";
5
- import "../../../../../entry-lock-Cf5OoIgN.mjs";
6
- import "../../../../../config-BjEm_3xL.mjs";
7
- import "../../../../../runner-D5_LzKXI.mjs";
8
- import "../../../../../storage-query-FXJH5pI8.mjs";
9
- import "../../../../../index-D-hdtLe8.mjs";
10
- import "../../../../../types-Cd-O03VG.mjs";
11
- import "../../../../../hreflang-D5uNnsGJ.mjs";
12
- import "../../../../../validate-CM79QXYE.mjs";
1
+ import "../../../../../parse-D5Sw9wAI.mjs";
2
+ import "../../../../../types-DZeDpzMc.mjs";
3
+ import "../../../../../types-pOLeFKGq.mjs";
4
+ import "../../../../../options-C2IDQnD2.mjs";
5
+ import "../../../../../entry-lock-B-1bUDxX.mjs";
6
+ import "../../../../../config-DHsDMpXc.mjs";
7
+ import "../../../../../runner-Ji7qyH2A.mjs";
8
+ import "../../../../../storage-query-C9bK0Dg6.mjs";
9
+ import "../../../../../index-D1_ykO2u.mjs";
10
+ import "../../../../../types-DuQAIPA-.mjs";
11
+ import "../../../../../hreflang-C7ETs0Tv.mjs";
12
+ import "../../../../../validate-dK97qe7F.mjs";
13
13
  import { EmDashHandlers } from "../../../../types.mjs";
14
14
  import { AttachmentInfo } from "./analyze.mjs";
15
15
  import { APIRoute } from "astro";
@@ -1,25 +1,26 @@
1
1
  import "../../../../../config-CvmjJcVw.mjs";
2
2
  import "../../../../../base64-DvnNgP7e.mjs";
3
- import "../../../../../types-BkUg2yHx.mjs";
4
- import "../../../../../dist-BNwANFJR.mjs";
5
- import { t as enrichImageMetadata } from "../../../../../enrich-Dl3kZ-lP.mjs";
6
- import "../../../../../errors-DgE1zJGG.mjs";
7
- import "../../../../../settings-DYidIB26.mjs";
8
- import "../../../../../site-settings-DOgRUoFX.mjs";
9
- import "../../../../../errors-BF0_LFhW.mjs";
10
- import { a as ssrfSafeFetch, s as validateExternalUrl, t as SsrfError } from "../../../../../ssrf-CJUnJymJ.mjs";
11
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CfvOHP0M.mjs";
12
- import { n as parseBody, t as isParseError } from "../../../../../parse-DY6OD1j_.mjs";
13
- import "../../../../../redirects-Cv9apQKj.mjs";
14
- import "../../../../../entry-lock-BJYdBfXb.mjs";
15
- import "../../../../../media-Pu1L6xir.mjs";
16
- import "../../../../../comments-fHZ8ON9O.mjs";
17
- import { C as wpMediaImportBody } from "../../../../../relations-CK9CYUyr.mjs";
18
- import "../../../../../menus-BM7BPLOb.mjs";
19
- import "../../../../../status-DZKIG4a9.mjs";
3
+ import "../../../../../url-Dn3IStq8.mjs";
4
+ import "../../../../../types-j6MBDjlZ.mjs";
5
+ import "../../../../../dist-Cfu8mMBs.mjs";
6
+ import { t as enrichImageMetadata } from "../../../../../enrich-BDdVNeDK.mjs";
7
+ import "../../../../../errors-CjXd1LgH.mjs";
8
+ import "../../../../../errors-CNvATh_7.mjs";
9
+ import "../../../../../settings-B0zQj_Tj.mjs";
10
+ import "../../../../../site-settings-AYFvhwQn.mjs";
11
+ import { a as ssrfSafeFetch, s as validateExternalUrl, t as SsrfError } from "../../../../../ssrf-DsmvZB80.mjs";
12
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CEdm_AWU.mjs";
13
+ import { n as parseBody, t as isParseError } from "../../../../../parse-Gt2l4Sld.mjs";
14
+ import "../../../../../redirects-D4EWeXAo.mjs";
15
+ import "../../../../../entry-lock-PP1JCXBB.mjs";
16
+ import "../../../../../media-D1z_jisb.mjs";
17
+ import "../../../../../comments-BRtp992B.mjs";
18
+ import { p as wpMediaImportBody } from "../../../../../byline-fields-DHJs0Mja.mjs";
19
+ import "../../../../../menus-BQKqf0Up.mjs";
20
+ import "../../../../../status-D39Fpy8R.mjs";
20
21
  import "../../../../../api/schemas/index.mjs";
21
- import "../../../../../ssrf-DpBH7aOt.mjs";
22
- import { i as requirePerm } from "../../../../../authorize-seCifOMJ.mjs";
22
+ import "../../../../../ssrf-tA45vIPX.mjs";
23
+ import { i as requirePerm } from "../../../../../authorize-soZXK7U0.mjs";
23
24
  import { ulid } from "ulidx";
24
25
  import mime from "mime/lite";
25
26
  import * as path from "node:path";
@@ -1 +1 @@
1
- {"version":3,"file":"media.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/media.ts"],"sourcesContent":["/**\n * WordPress media import endpoint\n *\n * POST /_emdash/api/import/wordpress/media\n *\n * Downloads media attachments from WordPress URLs and uploads to EmDash storage.\n * Streams progress updates as newline-delimited JSON (NDJSON).\n * Each line is either a progress update or the final result.\n */\n\nimport * as path from \"node:path\";\n\nimport type { APIRoute } from \"astro\";\nimport { MediaRepository, computeContentHash } from \"emdash\";\nimport mime from \"mime/lite\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpMediaImportBody } from \"#api/schemas.js\";\nimport { validateExternalUrl, ssrfSafeFetch, SsrfError } from \"#import/ssrf.js\";\nimport { enrichImageMetadata } from \"#media/enrich.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport type { AttachmentInfo } from \"./analyze.js\";\n\nexport const prerender = false;\n\n/** Progress update sent during streaming */\nexport interface MediaImportProgress {\n\ttype: \"progress\";\n\tcurrent: number;\n\ttotal: number;\n\tfilename?: string;\n\tstatus: \"downloading\" | \"uploading\" | \"done\" | \"skipped\" | \"failed\";\n\terror?: string;\n}\n\n/** Final result sent at end of stream */\nexport interface MediaImportResult {\n\ttype?: \"result\";\n\t/** Successfully imported items */\n\timported: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\tnewUrl: string;\n\t\tmediaId: string;\n\t}>;\n\t/** Failed items */\n\tfailed: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\terror: string;\n\t}>;\n\t/** Map of old URLs to new URLs (for content rewriting) */\n\turlMap: Record<string, string>;\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\tif (!emdash?.storage) {\n\t\treturn apiError(\"NO_STORAGE\", \"Storage not configured. Media import requires storage.\", 501);\n\t}\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NO_DB\", \"Database not initialized\", 500);\n\t}\n\n\ttry {\n\t\tconst body = await parseBody(request, wpMediaImportBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst attachments = body.attachments as AttachmentInfo[];\n\n\t\t// Check if streaming is requested (default: true)\n\t\tconst shouldStream = body.stream !== false;\n\n\t\tif (shouldStream) {\n\t\t\t// Stream progress updates as NDJSON\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tasync start(controller) {\n\t\t\t\t\tconst encoder = new TextEncoder();\n\t\t\t\t\tconst sendProgress = (progress: MediaImportProgress) => {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify(progress) + \"\\n\"));\n\t\t\t\t\t};\n\n\t\t\t\t\tconst result = await importMediaWithProgress(\n\t\t\t\t\t\tattachments,\n\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\temdash.storage,\n\t\t\t\t\t\tsendProgress,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Send final result\n\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify({ ...result, type: \"result\" }) + \"\\n\"));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn new Response(stream, {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-ndjson\",\n\t\t\t\t\t\"Cache-Control\": \"private, no-store\",\n\t\t\t\t\t\"Transfer-Encoding\": \"chunked\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Non-streaming mode\n\t\tconst result = await importMediaWithProgress(\n\t\t\tattachments,\n\t\t\temdash.db,\n\t\t\temdash.storage,\n\t\t\t() => {}, // No-op progress callback\n\t\t);\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import media\", \"IMPORT_ERROR\");\n\t}\n};\n\nexport async function importMediaWithProgress(\n\tattachments: AttachmentInfo[],\n\tdb: NonNullable<EmDashHandlers[\"db\"]>,\n\tstorage: NonNullable<EmDashHandlers[\"storage\"]>,\n\tonProgress: (progress: MediaImportProgress) => void,\n): Promise<MediaImportResult> {\n\tconst repo = new MediaRepository(db);\n\tconst total = attachments.length;\n\n\tconst result: MediaImportResult = {\n\t\timported: [],\n\t\tfailed: [],\n\t\turlMap: {},\n\t};\n\n\tfor (let i = 0; i < attachments.length; i++) {\n\t\tconst attachment = attachments[i];\n\t\tconst current = i + 1;\n\t\tconst filename = attachment.filename || `file-${attachment.id}`;\n\n\t\tif (!attachment.url) {\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: \"\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// SSRF: validate URL before fetching\n\t\t\ttry {\n\t\t\t\tvalidateExternalUrl(attachment.url);\n\t\t\t} catch (e) {\n\t\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report downloading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"downloading\",\n\t\t\t});\n\n\t\t\t// Download from WordPress (ssrfSafeFetch re-validates redirect targets)\n\t\t\tconst response = await ssrfSafeFetch(attachment.url, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": \"EmDash-Importer/1.0\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `HTTP ${response.status}: ${response.statusText}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `HTTP ${response.status}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get content type from response or guess from filename\n\t\t\tconst contentType =\n\t\t\t\tresponse.headers.get(\"content-type\") || attachment.mimeType || \"application/octet-stream\";\n\n\t\t\t// Get the file data\n\t\t\tconst buffer = await response.arrayBuffer();\n\t\t\tconst size = buffer.byteLength;\n\n\t\t\t// Compute content hash for deduplication\n\t\t\tconst contentHash = await computeContentHash(buffer);\n\n\t\t\t// Check if we already have this exact content\n\t\t\tconst existing = await repo.findByContentHash(contentHash);\n\t\t\tif (existing) {\n\t\t\t\t// Same content already exists - reuse it\n\t\t\t\tconst existingUrl = `/_emdash/api/media/file/${existing.storageKey}`;\n\t\t\t\tresult.urlMap[attachment.url] = existingUrl;\n\t\t\t\tresult.imported.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\tnewUrl: existingUrl,\n\t\t\t\t\tmediaId: existing.id,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"skipped\",\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report uploading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"uploading\",\n\t\t\t});\n\n\t\t\t// Generate storage key\n\t\t\tconst id = ulid();\n\t\t\tconst ext = attachment.filename\n\t\t\t\t? path.extname(attachment.filename)\n\t\t\t\t: getExtensionFromMimeType(contentType);\n\t\t\tconst storageKey = `${id}${ext}`;\n\n\t\t\t// Upload to storage\n\t\t\tawait storage.upload({\n\t\t\t\tkey: storageKey,\n\t\t\t\tbody: new Uint8Array(buffer),\n\t\t\t\tcontentType,\n\t\t\t});\n\n\t\t\t// Derive dimensions + LQIP placeholders (no-op for non-images).\n\t\t\tconst enriched = await enrichImageMetadata(new Uint8Array(buffer), contentType);\n\n\t\t\t// Create media record with content hash\n\t\t\tconst mediaItem = await repo.create({\n\t\t\t\tfilename: attachment.filename || `media-${attachment.id}${ext}`,\n\t\t\t\tmimeType: contentType,\n\t\t\t\tsize,\n\t\t\t\tstorageKey,\n\t\t\t\tcontentHash,\n\t\t\t\twidth: enriched.width,\n\t\t\t\theight: enriched.height,\n\t\t\t\tblurhash: enriched.blurhash,\n\t\t\t\tdominantColor: enriched.dominantColor,\n\t\t\t});\n\n\t\t\t// Build the new URL\n\t\t\tconst newUrl = `/_emdash/api/media/file/${storageKey}`;\n\n\t\t\tresult.imported.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\tnewUrl,\n\t\t\t\tmediaId: mediaItem.id,\n\t\t\t});\n\n\t\t\t// Add to URL map\n\t\t\tresult.urlMap[attachment.url] = newUrl;\n\n\t\t\t// Report done\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"done\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(`Media import error for \"${filename}\":`, error);\n\t\t\tconst errorMsg = \"Failed to import media\";\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction getExtensionFromMimeType(mimeType: string): string {\n\tconst ext = mime.getExtension(mimeType);\n\treturn ext ? `.${ext}` : \"\";\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"media.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/import/wordpress/media.ts"],"sourcesContent":["/**\n * WordPress media import endpoint\n *\n * POST /_emdash/api/import/wordpress/media\n *\n * Downloads media attachments from WordPress URLs and uploads to EmDash storage.\n * Streams progress updates as newline-delimited JSON (NDJSON).\n * Each line is either a progress update or the final result.\n */\n\nimport * as path from \"node:path\";\n\nimport type { APIRoute } from \"astro\";\nimport { MediaRepository, computeContentHash } from \"emdash\";\nimport mime from \"mime/lite\";\nimport { ulid } from \"ulidx\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { wpMediaImportBody } from \"#api/schemas.js\";\nimport { validateExternalUrl, ssrfSafeFetch, SsrfError } from \"#import/ssrf.js\";\nimport { enrichImageMetadata } from \"#media/enrich.js\";\nimport type { EmDashHandlers } from \"#types\";\n\nimport type { AttachmentInfo } from \"./analyze.js\";\n\nexport const prerender = false;\n\n/** Progress update sent during streaming */\nexport interface MediaImportProgress {\n\ttype: \"progress\";\n\tcurrent: number;\n\ttotal: number;\n\tfilename?: string;\n\tstatus: \"downloading\" | \"uploading\" | \"done\" | \"skipped\" | \"failed\";\n\terror?: string;\n}\n\n/** Final result sent at end of stream */\nexport interface MediaImportResult {\n\ttype?: \"result\";\n\t/** Successfully imported items */\n\timported: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\tnewUrl: string;\n\t\tmediaId: string;\n\t}>;\n\t/** Failed items */\n\tfailed: Array<{\n\t\twpId?: number;\n\t\toriginalUrl: string;\n\t\terror: string;\n\t}>;\n\t/** Map of old URLs to new URLs (for content rewriting) */\n\turlMap: Record<string, string>;\n}\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tconst denied = requirePerm(user, \"import:execute\");\n\tif (denied) return denied;\n\n\tif (!emdash?.storage) {\n\t\treturn apiError(\"NO_STORAGE\", \"Storage not configured. Media import requires storage.\", 501);\n\t}\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NO_DB\", \"Database not initialized\", 500);\n\t}\n\n\ttry {\n\t\tconst body = await parseBody(request, wpMediaImportBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst attachments = body.attachments as AttachmentInfo[];\n\n\t\t// Check if streaming is requested (default: true)\n\t\tconst shouldStream = body.stream !== false;\n\n\t\tif (shouldStream) {\n\t\t\t// Stream progress updates as NDJSON\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tasync start(controller) {\n\t\t\t\t\tconst encoder = new TextEncoder();\n\t\t\t\t\tconst sendProgress = (progress: MediaImportProgress) => {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify(progress) + \"\\n\"));\n\t\t\t\t\t};\n\n\t\t\t\t\tconst result = await importMediaWithProgress(\n\t\t\t\t\t\tattachments,\n\t\t\t\t\t\temdash.db,\n\t\t\t\t\t\temdash.storage,\n\t\t\t\t\t\tsendProgress,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Send final result\n\t\t\t\t\tcontroller.enqueue(encoder.encode(JSON.stringify({ ...result, type: \"result\" }) + \"\\n\"));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn new Response(stream, {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-ndjson\",\n\t\t\t\t\t\"Cache-Control\": \"private, no-store\",\n\t\t\t\t\t\"Transfer-Encoding\": \"chunked\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Non-streaming mode\n\t\tconst result = await importMediaWithProgress(\n\t\t\tattachments,\n\t\t\temdash.db,\n\t\t\temdash.storage,\n\t\t\t() => {}, // No-op progress callback\n\t\t);\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to import media\", \"IMPORT_ERROR\");\n\t}\n};\n\nexport async function importMediaWithProgress(\n\tattachments: AttachmentInfo[],\n\tdb: NonNullable<EmDashHandlers[\"db\"]>,\n\tstorage: NonNullable<EmDashHandlers[\"storage\"]>,\n\tonProgress: (progress: MediaImportProgress) => void,\n): Promise<MediaImportResult> {\n\tconst repo = new MediaRepository(db);\n\tconst total = attachments.length;\n\n\tconst result: MediaImportResult = {\n\t\timported: [],\n\t\tfailed: [],\n\t\turlMap: {},\n\t};\n\n\tfor (let i = 0; i < attachments.length; i++) {\n\t\tconst attachment = attachments[i];\n\t\tconst current = i + 1;\n\t\tconst filename = attachment.filename || `file-${attachment.id}`;\n\n\t\tif (!attachment.url) {\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: \"\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"No URL provided\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// SSRF: validate URL before fetching\n\t\t\ttry {\n\t\t\t\tvalidateExternalUrl(attachment.url);\n\t\t\t} catch (e) {\n\t\t\t\tconst msg = e instanceof SsrfError ? e.message : \"Invalid URL\";\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `Blocked: ${msg}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report downloading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"downloading\",\n\t\t\t});\n\n\t\t\t// Download from WordPress (ssrfSafeFetch re-validates redirect targets)\n\t\t\tconst response = await ssrfSafeFetch(attachment.url, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": \"EmDash-Importer/1.0\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tresult.failed.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\terror: `HTTP ${response.status}: ${response.statusText}`,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: `HTTP ${response.status}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get content type from response or guess from filename\n\t\t\tconst contentType =\n\t\t\t\tresponse.headers.get(\"content-type\") || attachment.mimeType || \"application/octet-stream\";\n\n\t\t\t// Get the file data\n\t\t\tconst buffer = await response.arrayBuffer();\n\t\t\tconst size = buffer.byteLength;\n\n\t\t\t// Compute content hash for deduplication\n\t\t\tconst contentHash = await computeContentHash(buffer);\n\n\t\t\t// Check if we already have this exact content\n\t\t\tconst existing = await repo.findByContentHash(contentHash);\n\t\t\tif (existing) {\n\t\t\t\t// Same content already exists - reuse it\n\t\t\t\tconst existingUrl = `/_emdash/api/media/file/${existing.storageKey}`;\n\t\t\t\tresult.urlMap[attachment.url] = existingUrl;\n\t\t\t\tresult.imported.push({\n\t\t\t\t\twpId: attachment.id,\n\t\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\t\tnewUrl: existingUrl,\n\t\t\t\t\tmediaId: existing.id,\n\t\t\t\t});\n\t\t\t\tonProgress({\n\t\t\t\t\ttype: \"progress\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\ttotal,\n\t\t\t\t\tfilename,\n\t\t\t\t\tstatus: \"skipped\",\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Report uploading\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"uploading\",\n\t\t\t});\n\n\t\t\t// Generate storage key\n\t\t\tconst id = ulid();\n\t\t\tconst ext = attachment.filename\n\t\t\t\t? path.extname(attachment.filename)\n\t\t\t\t: getExtensionFromMimeType(contentType);\n\t\t\tconst storageKey = `${id}${ext}`;\n\n\t\t\t// Upload to storage\n\t\t\tawait storage.upload({\n\t\t\t\tkey: storageKey,\n\t\t\t\tbody: new Uint8Array(buffer),\n\t\t\t\tcontentType,\n\t\t\t});\n\n\t\t\t// Derive dimensions + LQIP placeholders (no-op for non-images).\n\t\t\tconst enriched = await enrichImageMetadata(new Uint8Array(buffer), contentType);\n\n\t\t\t// Create media record with content hash\n\t\t\tconst mediaItem = await repo.create({\n\t\t\t\tfilename: attachment.filename || `media-${attachment.id}${ext}`,\n\t\t\t\tmimeType: contentType,\n\t\t\t\tsize,\n\t\t\t\tstorageKey,\n\t\t\t\tcontentHash,\n\t\t\t\twidth: enriched.width,\n\t\t\t\theight: enriched.height,\n\t\t\t\tblurhash: enriched.blurhash,\n\t\t\t\tdominantColor: enriched.dominantColor,\n\t\t\t});\n\n\t\t\t// Build the new URL\n\t\t\tconst newUrl = `/_emdash/api/media/file/${storageKey}`;\n\n\t\t\tresult.imported.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\tnewUrl,\n\t\t\t\tmediaId: mediaItem.id,\n\t\t\t});\n\n\t\t\t// Add to URL map\n\t\t\tresult.urlMap[attachment.url] = newUrl;\n\n\t\t\t// Report done\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"done\",\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(`Media import error for \"${filename}\":`, error);\n\t\t\tconst errorMsg = \"Failed to import media\";\n\t\t\tresult.failed.push({\n\t\t\t\twpId: attachment.id,\n\t\t\t\toriginalUrl: attachment.url,\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t\tonProgress({\n\t\t\t\ttype: \"progress\",\n\t\t\t\tcurrent,\n\t\t\t\ttotal,\n\t\t\t\tfilename,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: errorMsg,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction getExtensionFromMimeType(mimeType: string): string {\n\tconst ext = mime.getExtension(mimeType);\n\treturn ext ? `.${ext}` : \"\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,YAAY;AAgCzB,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,QACZ,QAAO,SAAS,cAAc,0DAA0D,IAAI;AAG7F,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,SAAS,4BAA4B,IAAI;AAG1D,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,kBAAkB;AACxD,MAAI,aAAa,KAAK,CAAE,QAAO;EAE/B,MAAM,cAAc,KAAK;AAKzB,MAFqB,KAAK,WAAW,OAEnB;GAEjB,MAAM,SAAS,IAAI,eAAe,EACjC,MAAM,MAAM,YAAY;IACvB,MAAM,UAAU,IAAI,aAAa;IACjC,MAAM,gBAAgB,aAAkC;AACvD,gBAAW,QAAQ,QAAQ,OAAO,KAAK,UAAU,SAAS,GAAG,KAAK,CAAC;;IAGpE,MAAM,SAAS,MAAM,wBACpB,aACA,OAAO,IACP,OAAO,SACP,aACA;AAGD,eAAW,QAAQ,QAAQ,OAAO,KAAK,UAAU;KAAE,GAAG;KAAQ,MAAM;KAAU,CAAC,GAAG,KAAK,CAAC;AACxF,eAAW,OAAO;MAEnB,CAAC;AAEF,UAAO,IAAI,SAAS,QAAQ;IAC3B,QAAQ;IACR,SAAS;KACR,gBAAgB;KAChB,iBAAiB;KACjB,qBAAqB;KACrB;IACD,CAAC;;AAWH,SAAO,WAPQ,MAAM,wBACpB,aACA,OAAO,IACP,OAAO,eACD,GACN,CAEwB;UACjB,OAAO;AACf,SAAO,YAAY,OAAO,0BAA0B,eAAe;;;AAIrE,eAAsB,wBACrB,aACA,IACA,SACA,YAC6B;CAC7B,MAAM,OAAO,IAAI,gBAAgB,GAAG;CACpC,MAAM,QAAQ,YAAY;CAE1B,MAAM,SAA4B;EACjC,UAAU,EAAE;EACZ,QAAQ,EAAE;EACV,QAAQ,EAAE;EACV;AAED,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC5C,MAAM,aAAa,YAAY;EAC/B,MAAM,UAAU,IAAI;EACpB,MAAM,WAAW,WAAW,YAAY,QAAQ,WAAW;AAE3D,MAAI,CAAC,WAAW,KAAK;AACpB,UAAO,OAAO,KAAK;IAClB,MAAM,WAAW;IACjB,aAAa;IACb,OAAO;IACP,CAAC;AACF,cAAW;IACV,MAAM;IACN;IACA;IACA;IACA,QAAQ;IACR,OAAO;IACP,CAAC;AACF;;AAGD,MAAI;AAEH,OAAI;AACH,wBAAoB,WAAW,IAAI;YAC3B,GAAG;IACX,MAAM,MAAM,aAAa,YAAY,EAAE,UAAU;AACjD,WAAO,OAAO,KAAK;KAClB,MAAM,WAAW;KACjB,aAAa,WAAW;KACxB,OAAO,YAAY;KACnB,CAAC;AACF,eAAW;KACV,MAAM;KACN;KACA;KACA;KACA,QAAQ;KACR,OAAO,YAAY;KACnB,CAAC;AACF;;AAID,cAAW;IACV,MAAM;IACN;IACA;IACA;IACA,QAAQ;IACR,CAAC;GAGF,MAAM,WAAW,MAAM,cAAc,WAAW,KAAK,EACpD,SAAS,EACR,cAAc,uBACd,EACD,CAAC;AAEF,OAAI,CAAC,SAAS,IAAI;AACjB,WAAO,OAAO,KAAK;KAClB,MAAM,WAAW;KACjB,aAAa,WAAW;KACxB,OAAO,QAAQ,SAAS,OAAO,IAAI,SAAS;KAC5C,CAAC;AACF,eAAW;KACV,MAAM;KACN;KACA;KACA;KACA,QAAQ;KACR,OAAO,QAAQ,SAAS;KACxB,CAAC;AACF;;GAID,MAAM,cACL,SAAS,QAAQ,IAAI,eAAe,IAAI,WAAW,YAAY;GAGhE,MAAM,SAAS,MAAM,SAAS,aAAa;GAC3C,MAAM,OAAO,OAAO;GAGpB,MAAM,cAAc,MAAM,mBAAmB,OAAO;GAGpD,MAAM,WAAW,MAAM,KAAK,kBAAkB,YAAY;AAC1D,OAAI,UAAU;IAEb,MAAM,cAAc,2BAA2B,SAAS;AACxD,WAAO,OAAO,WAAW,OAAO;AAChC,WAAO,SAAS,KAAK;KACpB,MAAM,WAAW;KACjB,aAAa,WAAW;KACxB,QAAQ;KACR,SAAS,SAAS;KAClB,CAAC;AACF,eAAW;KACV,MAAM;KACN;KACA;KACA;KACA,QAAQ;KACR,CAAC;AACF;;AAID,cAAW;IACV,MAAM;IACN;IACA;IACA;IACA,QAAQ;IACR,CAAC;GAGF,MAAM,KAAK,MAAM;GACjB,MAAM,MAAM,WAAW,WACpB,KAAK,QAAQ,WAAW,SAAS,GACjC,yBAAyB,YAAY;GACxC,MAAM,aAAa,GAAG,KAAK;AAG3B,SAAM,QAAQ,OAAO;IACpB,KAAK;IACL,MAAM,IAAI,WAAW,OAAO;IAC5B;IACA,CAAC;GAGF,MAAM,WAAW,MAAM,oBAAoB,IAAI,WAAW,OAAO,EAAE,YAAY;GAG/E,MAAM,YAAY,MAAM,KAAK,OAAO;IACnC,UAAU,WAAW,YAAY,SAAS,WAAW,KAAK;IAC1D,UAAU;IACV;IACA;IACA;IACA,OAAO,SAAS;IAChB,QAAQ,SAAS;IACjB,UAAU,SAAS;IACnB,eAAe,SAAS;IACxB,CAAC;GAGF,MAAM,SAAS,2BAA2B;AAE1C,UAAO,SAAS,KAAK;IACpB,MAAM,WAAW;IACjB,aAAa,WAAW;IACxB;IACA,SAAS,UAAU;IACnB,CAAC;AAGF,UAAO,OAAO,WAAW,OAAO;AAGhC,cAAW;IACV,MAAM;IACN;IACA;IACA;IACA,QAAQ;IACR,CAAC;WACM,OAAO;AACf,WAAQ,MAAM,2BAA2B,SAAS,KAAK,MAAM;GAC7D,MAAM,WAAW;AACjB,UAAO,OAAO,KAAK;IAClB,MAAM,WAAW;IACjB,aAAa,WAAW;IACxB,OAAO;IACP,CAAC;AACF,cAAW;IACV,MAAM;IACN;IACA;IACA;IACA,QAAQ;IACR,OAAO;IACP,CAAC;;;AAIJ,QAAO;;AAGR,SAAS,yBAAyB,UAA0B;CAC3D,MAAM,MAAM,KAAK,aAAa,SAAS;AACvC,QAAO,MAAM,IAAI,QAAQ"}
@@ -1,22 +1,23 @@
1
1
  import "../../../../../config-CvmjJcVw.mjs";
2
2
  import "../../../../../base64-DvnNgP7e.mjs";
3
- import { n as FIELD_TYPES } from "../../../../../types-BcrBrE6-.mjs";
4
- import "../../../../../types-BkUg2yHx.mjs";
5
- import "../../../../../errors-DgE1zJGG.mjs";
6
- import "../../../../../settings-DYidIB26.mjs";
7
- import "../../../../../site-settings-DOgRUoFX.mjs";
8
- import "../../../../../errors-BF0_LFhW.mjs";
9
- import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CfvOHP0M.mjs";
10
- import { n as parseBody, t as isParseError } from "../../../../../parse-DY6OD1j_.mjs";
11
- import "../../../../../redirects-Cv9apQKj.mjs";
12
- import "../../../../../entry-lock-BJYdBfXb.mjs";
13
- import "../../../../../media-Pu1L6xir.mjs";
14
- import "../../../../../comments-fHZ8ON9O.mjs";
15
- import { E as wpPrepareBody } from "../../../../../relations-CK9CYUyr.mjs";
16
- import "../../../../../menus-BM7BPLOb.mjs";
17
- import "../../../../../status-DZKIG4a9.mjs";
3
+ import { n as FIELD_TYPES } from "../../../../../types-BGmQ0uXs.mjs";
4
+ import "../../../../../url-Dn3IStq8.mjs";
5
+ import "../../../../../types-j6MBDjlZ.mjs";
6
+ import "../../../../../errors-CjXd1LgH.mjs";
7
+ import "../../../../../errors-CNvATh_7.mjs";
8
+ import "../../../../../settings-B0zQj_Tj.mjs";
9
+ import "../../../../../site-settings-AYFvhwQn.mjs";
10
+ import { n as apiSuccess, r as handleError, t as apiError } from "../../../../../error-CEdm_AWU.mjs";
11
+ import { n as parseBody, t as isParseError } from "../../../../../parse-Gt2l4Sld.mjs";
12
+ import "../../../../../redirects-D4EWeXAo.mjs";
13
+ import "../../../../../entry-lock-PP1JCXBB.mjs";
14
+ import "../../../../../media-D1z_jisb.mjs";
15
+ import "../../../../../comments-BRtp992B.mjs";
16
+ import { g as wpPrepareBody } from "../../../../../byline-fields-DHJs0Mja.mjs";
17
+ import "../../../../../menus-BQKqf0Up.mjs";
18
+ import "../../../../../status-D39Fpy8R.mjs";
18
19
  import "../../../../../api/schemas/index.mjs";
19
- import { i as requirePerm } from "../../../../../authorize-seCifOMJ.mjs";
20
+ import { i as requirePerm } from "../../../../../authorize-soZXK7U0.mjs";
20
21
  import { capitalize, sanitizeSlug, singularize } from "./analyze.mjs";
21
22
 
22
23
  //#region src/astro/routes/api/import/wordpress/prepare.ts
@@ -41,7 +42,7 @@ const POST = async ({ request, locals }) => {
41
42
  }
42
43
  };
43
44
  async function prepareImport(db, request) {
44
- const { SchemaRegistry } = await import("../../../../../block-type-registry-DUI_3KxT.mjs").then((n) => n.o);
45
+ const { SchemaRegistry } = await import("../../../../../registry-CtHRqVe-.mjs").then((n) => n.r);
45
46
  const registry = new SchemaRegistry(db);
46
47
  const result = {
47
48
  success: true,
@@ -107,7 +108,7 @@ async function prepareImport(db, request) {
107
108
  "post",
108
109
  "page"
109
110
  ].includes(collectionSlug)) {
110
- const { FTSManager } = await import("../../../../../fts-manager-S-K0laoS.mjs").then((n) => n.n);
111
+ const { FTSManager } = await import("../../../../../fts-manager-DU03MxWu.mjs").then((n) => n.n);
111
112
  const ftsManager = new FTSManager(db);
112
113
  if ((await ftsManager.getSearchableFields(collectionSlug)).length > 0) try {
113
114
  await ftsManager.enableSearch(collectionSlug);