emdash 0.27.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/dist/{adapters-u037EnTR.d.mts → adapters-hUy8vOB-.d.mts} +1 -1
  2. package/dist/{adapters-u037EnTR.d.mts.map → adapters-hUy8vOB-.d.mts.map} +1 -1
  3. package/dist/{allowed-origins-D5FxMUo8.mjs → allowed-origins-CRsJ6BPM.mjs} +2 -2
  4. package/dist/{allowed-origins-D5FxMUo8.mjs.map → allowed-origins-CRsJ6BPM.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.mjs +17 -16
  7. package/dist/api/route-utils.mjs.map +1 -1
  8. package/dist/api/schemas/index.d.mts +1 -1
  9. package/dist/api/schemas/index.mjs +3 -3
  10. package/dist/{api-80kycR9o.mjs → api-BFURZn1i.mjs} +33 -23
  11. package/dist/api-BFURZn1i.mjs.map +1 -0
  12. package/dist/{api-tokens-D6ppjIVi.mjs → api-tokens-DvqeZmVq.mjs} +2 -2
  13. package/dist/{api-tokens-D6ppjIVi.mjs.map → api-tokens-DvqeZmVq.mjs.map} +1 -1
  14. package/dist/{apply-DSypk6Iu.mjs → apply-Bu-8nYHL.mjs} +111 -74
  15. package/dist/apply-Bu-8nYHL.mjs.map +1 -0
  16. package/dist/astro/index.d.mts +12 -12
  17. package/dist/astro/index.mjs +3 -3
  18. package/dist/astro/index.mjs.map +1 -1
  19. package/dist/astro/middleware/auth.d.mts +10 -10
  20. package/dist/astro/middleware/auth.d.mts.map +1 -1
  21. package/dist/astro/middleware/auth.mjs +50 -11
  22. package/dist/astro/middleware/auth.mjs.map +1 -1
  23. package/dist/astro/middleware/redirect.mjs +5 -5
  24. package/dist/astro/middleware/request-context.mjs +2 -2
  25. package/dist/astro/middleware/setup.mjs +1 -1
  26. package/dist/astro/middleware.d.mts +2 -2
  27. package/dist/astro/middleware.mjs +124 -71
  28. package/dist/astro/middleware.mjs.map +1 -1
  29. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
  30. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
  31. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  32. package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  34. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -8
  35. package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -8
  36. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -8
  37. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -14
  38. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -14
  39. package/dist/astro/routes/api/admin/bylines/index.mjs +14 -14
  40. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
  41. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
  42. package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
  43. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
  44. package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
  45. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
  46. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  47. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  48. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  49. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +37 -36
  50. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  51. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +37 -36
  52. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  53. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +36 -35
  54. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +36 -35
  56. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  57. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +36 -35
  58. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/plugins/index.mjs +36 -35
  60. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  61. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  62. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +36 -35
  63. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +36 -35
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  66. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +36 -35
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  68. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +36 -35
  69. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +37 -36
  71. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  72. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +36 -35
  73. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  74. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +37 -36
  75. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  76. package/dist/astro/routes/api/admin/plugins/updates.mjs +36 -35
  77. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  78. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +36 -35
  79. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  81. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +36 -35
  82. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  83. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
  84. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  85. package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
  86. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  87. package/dist/astro/routes/api/admin/users/index.mjs +6 -6
  88. package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
  89. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  90. package/dist/astro/routes/api/auth/invite/complete.mjs +10 -10
  91. package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
  92. package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
  93. package/dist/astro/routes/api/auth/logout.mjs +3 -3
  94. package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
  95. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  96. package/dist/astro/routes/api/auth/me.mjs +7 -7
  97. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  98. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  99. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  100. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
  101. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  102. package/dist/astro/routes/api/auth/passkey/options.mjs +11 -11
  103. package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
  104. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
  105. package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
  106. package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
  107. package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
  108. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  109. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
  110. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +12 -12
  111. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  112. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
  113. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
  114. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  115. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -10
  116. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +7 -7
  117. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
  118. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  119. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +7 -7
  120. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +13 -13
  121. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  122. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
  123. package/dist/astro/routes/api/content/_collection_/_id_.mjs +7 -7
  124. package/dist/astro/routes/api/content/_collection_/authors.mjs +3 -3
  125. package/dist/astro/routes/api/content/_collection_/index.mjs +7 -7
  126. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
  127. package/dist/astro/routes/api/dashboard.mjs +8 -8
  128. package/dist/astro/routes/api/dev/emails.mjs +3 -3
  129. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  130. package/dist/astro/routes/api/import/probe.mjs +19 -11
  131. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  132. package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
  133. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -41
  134. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  135. package/dist/astro/routes/api/import/wordpress/execute.mjs +12 -407
  136. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  137. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
  138. package/dist/astro/routes/api/import/wordpress/media.mjs +9 -9
  139. package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
  140. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +19 -1
  141. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
  142. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +97 -79
  143. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  144. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  145. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +19 -11
  146. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  147. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +40 -2
  148. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  149. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +519 -39
  150. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  151. package/dist/astro/routes/api/manifest.mjs +4 -4
  152. package/dist/astro/routes/api/mcp.mjs +39 -39
  153. package/dist/astro/routes/api/media/_id_/confirm.mjs +7 -7
  154. package/dist/astro/routes/api/media/_id_.mjs +7 -7
  155. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  156. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  157. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  158. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  159. package/dist/astro/routes/api/media/upload-url.mjs +8 -8
  160. package/dist/astro/routes/api/media.mjs +9 -9
  161. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +9 -9
  162. package/dist/astro/routes/api/menus/_name_/items.mjs +9 -9
  163. package/dist/astro/routes/api/menus/_name_/reorder.mjs +9 -9
  164. package/dist/astro/routes/api/menus/_name_/translations.mjs +9 -9
  165. package/dist/astro/routes/api/menus/_name_.mjs +9 -9
  166. package/dist/astro/routes/api/menus/index.mjs +9 -9
  167. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  168. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  169. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  170. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  171. package/dist/astro/routes/api/oauth/register.mjs +3 -3
  172. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  173. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  174. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  175. package/dist/astro/routes/api/openapi.json.mjs +4 -4
  176. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  177. package/dist/astro/routes/api/redirects/404s/index.mjs +9 -9
  178. package/dist/astro/routes/api/redirects/404s/summary.mjs +9 -9
  179. package/dist/astro/routes/api/redirects/_id_.mjs +10 -10
  180. package/dist/astro/routes/api/redirects/index.mjs +10 -10
  181. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  182. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
  183. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +36 -35
  184. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  185. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +36 -35
  186. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  187. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +36 -35
  188. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  189. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +36 -35
  190. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  191. package/dist/astro/routes/api/schema/collections/index.mjs +36 -35
  192. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  193. package/dist/astro/routes/api/schema/index.mjs +7 -6
  194. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  195. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +36 -35
  196. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  197. package/dist/astro/routes/api/schema/orphans/index.mjs +36 -35
  198. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  199. package/dist/astro/routes/api/search/enable.mjs +10 -10
  200. package/dist/astro/routes/api/search/index.mjs +9 -9
  201. package/dist/astro/routes/api/search/rebuild.mjs +10 -10
  202. package/dist/astro/routes/api/search/stats.mjs +6 -6
  203. package/dist/astro/routes/api/search/suggest.mjs +9 -9
  204. package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
  205. package/dist/astro/routes/api/sections/index.mjs +9 -9
  206. package/dist/astro/routes/api/settings/email.mjs +4 -4
  207. package/dist/astro/routes/api/settings.mjs +12 -12
  208. package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
  209. package/dist/astro/routes/api/setup/admin.mjs +10 -10
  210. package/dist/astro/routes/api/setup/dev-bypass.mjs +25 -24
  211. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  212. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  213. package/dist/astro/routes/api/setup/index.mjs +26 -25
  214. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  215. package/dist/astro/routes/api/setup/status.mjs +4 -4
  216. package/dist/astro/routes/api/snapshot.mjs +6 -6
  217. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +13 -13
  218. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +13 -13
  219. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +13 -13
  220. package/dist/astro/routes/api/taxonomies/index.mjs +13 -13
  221. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  222. package/dist/astro/routes/api/typegen.mjs +5 -5
  223. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  224. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  225. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  226. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +7 -7
  227. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +9 -9
  228. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +9 -9
  229. package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
  230. package/dist/astro/routes/api/widget-areas/index.mjs +9 -9
  231. package/dist/astro/routes/api/widget-components.mjs +3 -3
  232. package/dist/astro/routes/robots.txt.mjs +6 -6
  233. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  234. package/dist/astro/routes/sitemap.xml.mjs +7 -7
  235. package/dist/astro/types.d.mts +13 -13
  236. package/dist/auth/providers/github.d.mts +1 -1
  237. package/dist/auth/providers/google.d.mts +1 -1
  238. package/dist/{authorize-C3a_zGsM.mjs → authorize-Dz88F_Fw.mjs} +2 -2
  239. package/dist/{authorize-C3a_zGsM.mjs.map → authorize-Dz88F_Fw.mjs.map} +1 -1
  240. package/dist/{byline-DEKSVPTy.mjs → byline-Bm8ZgUP9.mjs} +6 -6
  241. package/dist/{byline-DEKSVPTy.mjs.map → byline-Bm8ZgUP9.mjs.map} +1 -1
  242. package/dist/{byline-fields-eyJMblSr.mjs → byline-fields-2Lp5Hbgf.mjs} +18 -3
  243. package/dist/byline-fields-2Lp5Hbgf.mjs.map +1 -0
  244. package/dist/{byline-fields-DaMKzkhO.mjs → byline-fields-CIx_GuN4.mjs} +1 -1
  245. package/dist/{byline-fields-DaMKzkhO.mjs.map → byline-fields-CIx_GuN4.mjs.map} +1 -1
  246. package/dist/{byline-fields-CtQ6blXd.d.mts → byline-fields-Cgrt9-aL.d.mts} +49 -34
  247. package/dist/{byline-fields-CtQ6blXd.d.mts.map → byline-fields-Cgrt9-aL.d.mts.map} +1 -1
  248. package/dist/{bylines-Ds4-otXl.mjs → bylines-6tm9mgQb.mjs} +4 -4
  249. package/dist/{bylines-Ds4-otXl.mjs.map → bylines-6tm9mgQb.mjs.map} +1 -1
  250. package/dist/{bylines-CiqgTHWF.mjs → bylines-Woq87129.mjs} +6 -6
  251. package/dist/{bylines-CiqgTHWF.mjs.map → bylines-Woq87129.mjs.map} +1 -1
  252. package/dist/{cache-Ciu3e3AF.mjs → cache-CEBAZjir.mjs} +2 -2
  253. package/dist/{cache-Ciu3e3AF.mjs.map → cache-CEBAZjir.mjs.map} +1 -1
  254. package/dist/{challenge-store-LhiqMccz.mjs → challenge-store-anhwVER0.mjs} +1 -1
  255. package/dist/{challenge-store-LhiqMccz.mjs.map → challenge-store-anhwVER0.mjs.map} +1 -1
  256. package/dist/{chunks-CZFiauig.mjs → chunks-B2isWQhr.mjs} +2 -2
  257. package/dist/{chunks-CZFiauig.mjs.map → chunks-B2isWQhr.mjs.map} +1 -1
  258. package/dist/cli/index.mjs +22 -21
  259. package/dist/cli/index.mjs.map +1 -1
  260. package/dist/client/cf-access.d.mts +1 -1
  261. package/dist/client/index.d.mts +1 -1
  262. package/dist/client/index.mjs +2 -2
  263. package/dist/{comment-CH1IrFFs.mjs → comment-CzeatwBV.mjs} +3 -3
  264. package/dist/{comment-CH1IrFFs.mjs.map → comment-CzeatwBV.mjs.map} +1 -1
  265. package/dist/{comment-reaction-kruNY-kP.mjs → comment-reaction-Cj9QJY7I.mjs} +2 -2
  266. package/dist/{comment-reaction-kruNY-kP.mjs.map → comment-reaction-Cj9QJY7I.mjs.map} +1 -1
  267. package/dist/{comments-BUJyXbgq.mjs → comments-BLE-jv5k.mjs} +3 -3
  268. package/dist/{comments-BUJyXbgq.mjs.map → comments-BLE-jv5k.mjs.map} +1 -1
  269. package/dist/{components-CYt4uVK9.mjs → components-B_sATNUc.mjs} +1 -1
  270. package/dist/{components-CYt4uVK9.mjs.map → components-B_sATNUc.mjs.map} +1 -1
  271. package/dist/{content-RmfHoWqK.mjs → content-DhgEth4k.mjs} +4 -4
  272. package/dist/{content-RmfHoWqK.mjs.map → content-DhgEth4k.mjs.map} +1 -1
  273. package/dist/content-refresh-CA4uKwzH.mjs +1531 -0
  274. package/dist/content-refresh-CA4uKwzH.mjs.map +1 -0
  275. package/dist/{context-CzUU_WzL.mjs → context-CUsR9dXL.mjs} +76 -54
  276. package/dist/context-CUsR9dXL.mjs.map +1 -0
  277. package/dist/{cron-C5LVoNmP.mjs → cron-v4FTEFR_.mjs} +1 -1
  278. package/dist/{cron-C5LVoNmP.mjs.map → cron-v4FTEFR_.mjs.map} +1 -1
  279. package/dist/{dashboard-CVyGhift.mjs → dashboard-EvEKF5en.mjs} +4 -4
  280. package/dist/{dashboard-CVyGhift.mjs.map → dashboard-EvEKF5en.mjs.map} +1 -1
  281. package/dist/db/index.d.mts +3 -3
  282. package/dist/db/index.mjs +1 -1
  283. package/dist/db/libsql.d.mts +1 -1
  284. package/dist/db/postgres.d.mts +1 -1
  285. package/dist/db/sqlite.d.mts +1 -1
  286. package/dist/{default-CeRG-Ot4.mjs → default-CM_D83Mg.mjs} +1 -1
  287. package/dist/{default-CeRG-Ot4.mjs.map → default-CM_D83Mg.mjs.map} +1 -1
  288. package/dist/{device-flow-DENDCQ9F.mjs → device-flow-CfGP18Uw.mjs} +4 -4
  289. package/dist/{device-flow-DENDCQ9F.mjs.map → device-flow-CfGP18Uw.mjs.map} +1 -1
  290. package/dist/{email-console-DJP32ucW.mjs → email-console-CIf4Lfvv.mjs} +1 -1
  291. package/dist/{email-console-DJP32ucW.mjs.map → email-console-CIf4Lfvv.mjs.map} +1 -1
  292. package/dist/{error-BHkLZk-w.mjs → error-CkAseSqZ.mjs} +2 -2
  293. package/dist/{error-BHkLZk-w.mjs.map → error-CkAseSqZ.mjs.map} +1 -1
  294. package/dist/{escape-Bjio4ZsM.mjs → escape-DqD0aCKu.mjs} +1 -1
  295. package/dist/{escape-Bjio4ZsM.mjs.map → escape-DqD0aCKu.mjs.map} +1 -1
  296. package/dist/{field-defs-cache-BA-8ZPiT.mjs → field-defs-cache-WUI88LX5.mjs} +2 -2
  297. package/dist/{field-defs-cache-BA-8ZPiT.mjs.map → field-defs-cache-WUI88LX5.mjs.map} +1 -1
  298. package/dist/{fts-manager-Db9jGavf.mjs → fts-manager-BbFaF_V8.mjs} +2 -2
  299. package/dist/{fts-manager-Db9jGavf.mjs.map → fts-manager-BbFaF_V8.mjs.map} +1 -1
  300. package/dist/{import-Bb1T9WJS.mjs → import-fYLf14Co.mjs} +514 -25
  301. package/dist/import-fYLf14Co.mjs.map +1 -0
  302. package/dist/{index-CDZZjrLT.d.mts → index-B9sIxwe4.d.mts} +21 -22
  303. package/dist/{index-CDZZjrLT.d.mts.map → index-B9sIxwe4.d.mts.map} +1 -1
  304. package/dist/{index-DGIjmUXQ.d.mts → index-Bm-Gy8Mh.d.mts} +25 -4
  305. package/dist/index-Bm-Gy8Mh.d.mts.map +1 -0
  306. package/dist/index.d.mts +18 -18
  307. package/dist/index.mjs +54 -53
  308. package/dist/{load-DpHICVPh.mjs → load-Djn3HWQS.mjs} +2 -2
  309. package/dist/{load-DpHICVPh.mjs.map → load-Djn3HWQS.mjs.map} +1 -1
  310. package/dist/{loader-4K37qA-y.mjs → loader-CB6YHeul.mjs} +6 -5
  311. package/dist/loader-CB6YHeul.mjs.map +1 -0
  312. package/dist/{manifest-schema-kPGX7VS-.mjs → manifest-schema-BHlgZM1W.mjs} +1 -1
  313. package/dist/{manifest-schema-kPGX7VS-.mjs.map → manifest-schema-BHlgZM1W.mjs.map} +1 -1
  314. package/dist/media/index.d.mts +1 -1
  315. package/dist/media/local-runtime.d.mts +12 -12
  316. package/dist/media/local-runtime.mjs +5 -5
  317. package/dist/{media-C0nRRfs1.mjs → media-BrXIaMFN.mjs} +2 -2
  318. package/dist/{media-C0nRRfs1.mjs.map → media-BrXIaMFN.mjs.map} +1 -1
  319. package/dist/{media-allowlist-Du8t1u6a.mjs → media-allowlist-CRHEeJ_i.mjs} +1 -1
  320. package/dist/{media-allowlist-Du8t1u6a.mjs.map → media-allowlist-CRHEeJ_i.mjs.map} +1 -1
  321. package/dist/{media-url-O4rm9-SQ.mjs → media-url-CKi5XSw4.mjs} +1 -1
  322. package/dist/{media-url-O4rm9-SQ.mjs.map → media-url-CKi5XSw4.mjs.map} +1 -1
  323. package/dist/{menus-SL2K0xq2.mjs → menus-Cfivc2Ad.mjs} +3 -3
  324. package/dist/{menus-SL2K0xq2.mjs.map → menus-Cfivc2Ad.mjs.map} +1 -1
  325. package/dist/{menus-DzRyC1ID.mjs → menus-CsZ2ZEK2.mjs} +16 -12
  326. package/dist/{menus-DzRyC1ID.mjs.map → menus-CsZ2ZEK2.mjs.map} +1 -1
  327. package/dist/{mode-BB0F8xTC.mjs → mode-BM9QgEmt.mjs} +1 -1
  328. package/dist/{mode-BB0F8xTC.mjs.map → mode-BM9QgEmt.mjs.map} +1 -1
  329. package/dist/{oauth-authorization-CsvzIp_F.mjs → oauth-authorization-CXWkIGT4.mjs} +4 -4
  330. package/dist/{oauth-authorization-CsvzIp_F.mjs.map → oauth-authorization-CXWkIGT4.mjs.map} +1 -1
  331. package/dist/{oauth-clients-C9SYwEbZ.mjs → oauth-clients-BmTI5rsl.mjs} +1 -1
  332. package/dist/{oauth-clients-C9SYwEbZ.mjs.map → oauth-clients-BmTI5rsl.mjs.map} +1 -1
  333. package/dist/{oauth-state-store---zrApfB.mjs → oauth-state-store-YLFLcH5F.mjs} +1 -1
  334. package/dist/{oauth-state-store---zrApfB.mjs.map → oauth-state-store-YLFLcH5F.mjs.map} +1 -1
  335. package/dist/{oauth-user-lookup-SHsWRlG9.mjs → oauth-user-lookup-Bsc_GsX-.mjs} +1 -1
  336. package/dist/{oauth-user-lookup-SHsWRlG9.mjs.map → oauth-user-lookup-Bsc_GsX-.mjs.map} +1 -1
  337. package/dist/object-cache/memory.d.mts +1 -1
  338. package/dist/{object-cache-CHbHv83-.mjs → object-cache-Bok5j2ae.mjs} +43 -3
  339. package/dist/object-cache-Bok5j2ae.mjs.map +1 -0
  340. package/dist/{options-41nCWqi9.d.mts → options-iMpRRxIe.d.mts} +3 -3
  341. package/dist/{options-41nCWqi9.d.mts.map → options-iMpRRxIe.d.mts.map} +1 -1
  342. package/dist/page/index.d.mts +2 -2
  343. package/dist/{parse-CqyZj3Hp.mjs → parse-GmjecGct.mjs} +2 -2
  344. package/dist/{parse-CqyZj3Hp.mjs.map → parse-GmjecGct.mjs.map} +1 -1
  345. package/dist/{passkey-config-C0YfSBko.mjs → passkey-config-De0ahnRg.mjs} +1 -1
  346. package/dist/{passkey-config-C0YfSBko.mjs.map → passkey-config-De0ahnRg.mjs.map} +1 -1
  347. package/dist/{placeholder-Cuce9U-m.d.mts → placeholder-BSKwzRe4.d.mts} +1 -1
  348. package/dist/{placeholder-Cuce9U-m.d.mts.map → placeholder-BSKwzRe4.d.mts.map} +1 -1
  349. package/dist/plugin-types.d.mts +1 -1
  350. package/dist/plugin-utils.d.mts +10 -10
  351. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
  352. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  353. package/dist/{portable-text-BICg8bTk.mjs → portable-text-cCa0cGV6.mjs} +1 -1
  354. package/dist/{portable-text-BICg8bTk.mjs.map → portable-text-cCa0cGV6.mjs.map} +1 -1
  355. package/dist/{preview-DKGCt2_p.mjs → preview-SSXNVPAC.mjs} +2 -2
  356. package/dist/{preview-DKGCt2_p.mjs.map → preview-SSXNVPAC.mjs.map} +1 -1
  357. package/dist/{public-url-CTVqgMmg.mjs → public-url-Danv47cS.mjs} +1 -1
  358. package/dist/{public-url-CTVqgMmg.mjs.map → public-url-Danv47cS.mjs.map} +1 -1
  359. package/dist/{query-B0M-9LYR.mjs → query-ByGq6ver.mjs} +14 -14
  360. package/dist/{query-B0M-9LYR.mjs.map → query-ByGq6ver.mjs.map} +1 -1
  361. package/dist/{rate-limit-BwoUdIpC.mjs → rate-limit-C_Lf63Dd.mjs} +2 -2
  362. package/dist/{rate-limit-BwoUdIpC.mjs.map → rate-limit-C_Lf63Dd.mjs.map} +1 -1
  363. package/dist/{redirect-CS-PHtNh.mjs → redirect-CoW3G-0U.mjs} +1 -1
  364. package/dist/{redirect-CS-PHtNh.mjs.map → redirect-CoW3G-0U.mjs.map} +1 -1
  365. package/dist/{redirect-lMOzG04S.mjs → redirect-IyfNirgS.mjs} +2 -2
  366. package/dist/{redirect-lMOzG04S.mjs.map → redirect-IyfNirgS.mjs.map} +1 -1
  367. package/dist/{redirects-9218MmYl.mjs → redirects-Bs1g42Ri.mjs} +4 -4
  368. package/dist/{redirects-9218MmYl.mjs.map → redirects-Bs1g42Ri.mjs.map} +1 -1
  369. package/dist/{redirects-Dcbuisoj.mjs → redirects-DXEXBAII.mjs} +2 -2
  370. package/dist/{redirects-Dcbuisoj.mjs.map → redirects-DXEXBAII.mjs.map} +1 -1
  371. package/dist/{registry-DP-iEtdR.mjs → registry-B65mUtPa.mjs} +122 -79
  372. package/dist/registry-B65mUtPa.mjs.map +1 -0
  373. package/dist/{request-meta-CmS1tDFf.mjs → request-meta-DbvXaAvU.mjs} +2 -2
  374. package/dist/{request-meta-CmS1tDFf.mjs.map → request-meta-DbvXaAvU.mjs.map} +1 -1
  375. package/dist/{resolve-C7I0qiR0.mjs → resolve-DR3wqMTy.mjs} +1 -1
  376. package/dist/{resolve-C7I0qiR0.mjs.map → resolve-DR3wqMTy.mjs.map} +1 -1
  377. package/dist/{runner-BbR3DfrL.d.mts → runner-DvFWoz8-.d.mts} +2 -2
  378. package/dist/{runner-BbR3DfrL.d.mts.map → runner-DvFWoz8-.d.mts.map} +1 -1
  379. package/dist/{runner-CFngB4WZ.mjs → runner-K8XK101B.mjs} +309 -190
  380. package/dist/runner-K8XK101B.mjs.map +1 -0
  381. package/dist/runtime.d.mts +11 -11
  382. package/dist/runtime.mjs +2 -2
  383. package/dist/{scheduled-publish-BMljtY5G.d.mts → scheduled-publish-Drffrf2a.d.mts} +1 -1
  384. package/dist/scheduled-publish-Drffrf2a.d.mts.map +1 -0
  385. package/dist/{schema-BfJ7bIXH.mjs → schema-Blhoxp3P.mjs} +5 -5
  386. package/dist/{schema-BfJ7bIXH.mjs.map → schema-Blhoxp3P.mjs.map} +1 -1
  387. package/dist/{search-C7t3PH1J.mjs → search-DZN2HZ-V.mjs} +4 -4
  388. package/dist/{search-C7t3PH1J.mjs.map → search-DZN2HZ-V.mjs.map} +1 -1
  389. package/dist/{secrets-BSf9pRRY.mjs → secrets-kp760LlD.mjs} +2 -2
  390. package/dist/{secrets-BSf9pRRY.mjs.map → secrets-kp760LlD.mjs.map} +1 -1
  391. package/dist/{sections-Dm0CVX23.mjs → sections-CpF5SaGr.mjs} +3 -3
  392. package/dist/{sections-Dm0CVX23.mjs.map → sections-CpF5SaGr.mjs.map} +1 -1
  393. package/dist/seed/index.d.mts +2 -2
  394. package/dist/seed/index.mjs +19 -18
  395. package/dist/seo/index.d.mts +1 -1
  396. package/dist/seo/index.mjs +1 -1
  397. package/dist/{seo-BkhuuaaE.mjs → seo-89-53DDs.mjs} +1 -1
  398. package/dist/{seo-BkhuuaaE.mjs.map → seo-89-53DDs.mjs.map} +1 -1
  399. package/dist/{seo-Dd3tbY_k.mjs → seo-DXu2UQnC.mjs} +3 -3
  400. package/dist/{seo-Dd3tbY_k.mjs.map → seo-DXu2UQnC.mjs.map} +1 -1
  401. package/dist/{service-CTrqp_Jy.mjs → service-DQmiBMzt.mjs} +3 -3
  402. package/dist/{service-CTrqp_Jy.mjs.map → service-DQmiBMzt.mjs.map} +1 -1
  403. package/dist/{session-user-B8aLtKAH.mjs → session-user-Cascbax7.mjs} +1 -1
  404. package/dist/{session-user-B8aLtKAH.mjs.map → session-user-Cascbax7.mjs.map} +1 -1
  405. package/dist/{settings-CZ7ZP9cW.mjs → settings-rZyHEcNT.mjs} +3 -3
  406. package/dist/{settings-CZ7ZP9cW.mjs.map → settings-rZyHEcNT.mjs.map} +1 -1
  407. package/dist/{settings-BX8cWBus.mjs → settings-zhmdKyJQ.mjs} +5 -5
  408. package/dist/{settings-BX8cWBus.mjs.map → settings-zhmdKyJQ.mjs.map} +1 -1
  409. package/dist/{setup-complete-gEiySUc-.mjs → setup-complete-Cb3LRyzy.mjs} +1 -1
  410. package/dist/{setup-complete-gEiySUc-.mjs.map → setup-complete-Cb3LRyzy.mjs.map} +1 -1
  411. package/dist/{setup-nonce-DzS50zme.mjs → setup-nonce-Z8x0tHf8.mjs} +1 -1
  412. package/dist/{setup-nonce-DzS50zme.mjs.map → setup-nonce-Z8x0tHf8.mjs.map} +1 -1
  413. package/dist/{single-flight-cache-Cdfkic3t.mjs → single-flight-cache-BG3B_GhN.mjs} +1 -1
  414. package/dist/{single-flight-cache-Cdfkic3t.mjs.map → single-flight-cache-BG3B_GhN.mjs.map} +1 -1
  415. package/dist/{site-url-BLebyON8.mjs → site-url-BBfDTgZB.mjs} +1 -1
  416. package/dist/{site-url-BLebyON8.mjs.map → site-url-BBfDTgZB.mjs.map} +1 -1
  417. package/dist/{ssrf-BRKb343l.mjs → ssrf-1g7usGBg.mjs} +1 -1
  418. package/dist/{ssrf-BRKb343l.mjs.map → ssrf-1g7usGBg.mjs.map} +1 -1
  419. package/dist/{status-vUK0SA17.mjs → status-CqJQX1QN.mjs} +1 -1
  420. package/dist/{status-vUK0SA17.mjs.map → status-CqJQX1QN.mjs.map} +1 -1
  421. package/dist/storage/local.d.mts +1 -1
  422. package/dist/storage/local.mjs +1 -1
  423. package/dist/storage/s3.d.mts +1 -1
  424. package/dist/storage/s3.mjs +1 -1
  425. package/dist/{taxonomies-DChKcVxf.mjs → taxonomies-BGBd16Eu.mjs} +4 -4
  426. package/dist/{taxonomies-DChKcVxf.mjs.map → taxonomies-BGBd16Eu.mjs.map} +1 -1
  427. package/dist/{taxonomies-ckPjz-6d.mjs → taxonomies-Cnb4F-Pb.mjs} +7 -7
  428. package/dist/{taxonomies-ckPjz-6d.mjs.map → taxonomies-Cnb4F-Pb.mjs.map} +1 -1
  429. package/dist/{taxonomy-Cru-he6s.mjs → taxonomy-BxGxZZdu.mjs} +4 -4
  430. package/dist/{taxonomy-Cru-he6s.mjs.map → taxonomy-BxGxZZdu.mjs.map} +1 -1
  431. package/dist/{tokens-LeuXF9gG.mjs → tokens-BGT0TUUo.mjs} +1 -1
  432. package/dist/{tokens-LeuXF9gG.mjs.map → tokens-BGT0TUUo.mjs.map} +1 -1
  433. package/dist/{transport-Blrl2k_o.d.mts → transport-BMDWHSgZ.d.mts} +1 -1
  434. package/dist/{transport-Blrl2k_o.d.mts.map → transport-BMDWHSgZ.d.mts.map} +1 -1
  435. package/dist/{transport-_2nBz7e9.mjs → transport-DPefPMcz.mjs} +1 -1
  436. package/dist/{transport-_2nBz7e9.mjs.map → transport-DPefPMcz.mjs.map} +1 -1
  437. package/dist/{trusted-proxy-DZY5WCn2.mjs → trusted-proxy-VTPRiX2s.mjs} +1 -1
  438. package/dist/{trusted-proxy-DZY5WCn2.mjs.map → trusted-proxy-VTPRiX2s.mjs.map} +1 -1
  439. package/dist/{types-ETmO_jQr.d.mts → types-BcLUUbbR.d.mts} +2 -2
  440. package/dist/{types-ETmO_jQr.d.mts.map → types-BcLUUbbR.d.mts.map} +1 -1
  441. package/dist/{types-BYnDBVwe.d.mts → types-CGbYowGQ.d.mts} +2 -2
  442. package/dist/{types-BYnDBVwe.d.mts.map → types-CGbYowGQ.d.mts.map} +1 -1
  443. package/dist/{types-CvuKO5Pn.d.mts → types-CgvhU-hF.d.mts} +1 -1
  444. package/dist/{types-CvuKO5Pn.d.mts.map → types-CgvhU-hF.d.mts.map} +1 -1
  445. package/dist/{types-Y09-wtyU.d.mts → types-ClUkdbWb.d.mts} +1 -1
  446. package/dist/{types-Y09-wtyU.d.mts.map → types-ClUkdbWb.d.mts.map} +1 -1
  447. package/dist/{types-DU4TSFS5.mjs → types-CuW0zWDA.mjs} +2 -2
  448. package/dist/{types-DU4TSFS5.mjs.map → types-CuW0zWDA.mjs.map} +1 -1
  449. package/dist/{types-BkZ8DUEI.d.mts → types-DmHk7vAt.d.mts} +1 -1
  450. package/dist/{types-BkZ8DUEI.d.mts.map → types-DmHk7vAt.d.mts.map} +1 -1
  451. package/dist/{types-CQAugunJ.mjs → types-Jo3UYd6b.mjs} +1 -1
  452. package/dist/{types-CQAugunJ.mjs.map → types-Jo3UYd6b.mjs.map} +1 -1
  453. package/dist/{types-xIfVRNLp.d.mts → types-_HFLRzTn.d.mts} +22 -1
  454. package/dist/types-_HFLRzTn.d.mts.map +1 -0
  455. package/dist/{types-ByChcBgE.d.mts → types-ea9sAPck.d.mts} +1 -1
  456. package/dist/{types-ByChcBgE.d.mts.map → types-ea9sAPck.d.mts.map} +1 -1
  457. package/dist/{types-CNlaBFzx.d.mts → types-g_aFIdW0.d.mts} +1 -1
  458. package/dist/{types-CNlaBFzx.d.mts.map → types-g_aFIdW0.d.mts.map} +1 -1
  459. package/dist/{types-Dbqff978.d.mts → types-vgEWF18A.d.mts} +19 -1
  460. package/dist/{types-Dbqff978.d.mts.map → types-vgEWF18A.d.mts.map} +1 -1
  461. package/dist/{user-DgGbKL9s.mjs → user-BjAOvU3Z.mjs} +3 -3
  462. package/dist/{user-DgGbKL9s.mjs.map → user-BjAOvU3Z.mjs.map} +1 -1
  463. package/dist/{utils-B7A57fm9.mjs → utils-BJXElxdw.mjs} +156 -7
  464. package/dist/utils-BJXElxdw.mjs.map +1 -0
  465. package/dist/{validate-CRkcYZAR.mjs → validate-CWSnKVIJ.mjs} +2 -2
  466. package/dist/{validate-CRkcYZAR.mjs.map → validate-CWSnKVIJ.mjs.map} +1 -1
  467. package/dist/{validate-9ECmtEpJ.d.mts → validate-Z1b86_3B.d.mts} +5 -5
  468. package/dist/{validate-9ECmtEpJ.d.mts.map → validate-Z1b86_3B.d.mts.map} +1 -1
  469. package/dist/{validation-sR26SOwD.mjs → validation-c8WjhH8z.mjs} +8 -5
  470. package/dist/{validation-sR26SOwD.mjs.map → validation-c8WjhH8z.mjs.map} +1 -1
  471. package/dist/version-CaccU7DM.mjs +7 -0
  472. package/dist/{version-CrqhKGWn.mjs.map → version-CaccU7DM.mjs.map} +1 -1
  473. package/dist/{widgets-DRgtn7Cl.mjs → widgets-hWcIicX8.mjs} +3 -3
  474. package/dist/{widgets-DRgtn7Cl.mjs.map → widgets-hWcIicX8.mjs.map} +1 -1
  475. package/dist/wxr-taxonomies-0_uxSrmf.d.mts +34 -0
  476. package/dist/wxr-taxonomies-0_uxSrmf.d.mts.map +1 -0
  477. package/dist/wxr-taxonomies-BC3OYpvx.mjs +425 -0
  478. package/dist/wxr-taxonomies-BC3OYpvx.mjs.map +1 -0
  479. package/dist/{zod-generator-C5JaV--i.mjs → zod-generator-CacrR-i8.mjs} +2 -2
  480. package/dist/{zod-generator-C5JaV--i.mjs.map → zod-generator-CacrR-i8.mjs.map} +1 -1
  481. package/package.json +7 -7
  482. package/src/api/handlers/content.ts +10 -7
  483. package/src/api/schemas/import.ts +19 -0
  484. package/src/astro/integration/runtime.ts +3 -6
  485. package/src/astro/middleware/auth.ts +9 -3
  486. package/src/astro/middleware/csp.ts +54 -3
  487. package/src/astro/routes/admin.astro +9 -0
  488. package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +122 -98
  489. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +794 -44
  490. package/src/components/EmDashImage.astro +59 -23
  491. package/src/components/Image.astro +36 -35
  492. package/src/database/migrations/049_taxonomies_name_locale_index.ts +42 -0
  493. package/src/database/migrations/050_media_usage_index_status.ts +142 -0
  494. package/src/database/migrations/runner.ts +4 -0
  495. package/src/database/repositories/media-usage.ts +932 -58
  496. package/src/database/types.ts +22 -0
  497. package/src/emdash-runtime.ts +123 -3
  498. package/src/import/comments.ts +159 -0
  499. package/src/import/index.ts +8 -1
  500. package/src/import/settings.ts +65 -189
  501. package/src/import/sources/wordpress-plugin.ts +338 -42
  502. package/src/import/sources/wxr.ts +4 -1
  503. package/src/import/types.ts +12 -0
  504. package/src/import/utils.ts +207 -0
  505. package/src/import/wxr-taxonomies.ts +39 -0
  506. package/src/loader.ts +13 -2
  507. package/src/media/usage/content-fields.ts +119 -0
  508. package/src/media/usage/content-refresh.ts +524 -0
  509. package/src/media/usage/content-repair.ts +491 -0
  510. package/src/media/usage/content-snapshots.ts +435 -0
  511. package/src/media/usage/extractor.ts +4 -4
  512. package/src/media/usage/source-key.ts +22 -0
  513. package/src/menus/index.ts +17 -1
  514. package/src/object-cache/index.ts +82 -7
  515. package/src/plugins/context.ts +100 -71
  516. package/src/schema/registry.ts +240 -154
  517. package/src/seed/apply.ts +156 -99
  518. package/dist/api-80kycR9o.mjs.map +0 -1
  519. package/dist/apply-DSypk6Iu.mjs.map +0 -1
  520. package/dist/byline-fields-eyJMblSr.mjs.map +0 -1
  521. package/dist/context-CzUU_WzL.mjs.map +0 -1
  522. package/dist/import-Bb1T9WJS.mjs.map +0 -1
  523. package/dist/index-DGIjmUXQ.d.mts.map +0 -1
  524. package/dist/loader-4K37qA-y.mjs.map +0 -1
  525. package/dist/object-cache-CHbHv83-.mjs.map +0 -1
  526. package/dist/registry-DP-iEtdR.mjs.map +0 -1
  527. package/dist/runner-CFngB4WZ.mjs.map +0 -1
  528. package/dist/scheduled-publish-BMljtY5G.d.mts.map +0 -1
  529. package/dist/types-xIfVRNLp.d.mts.map +0 -1
  530. package/dist/utils-B7A57fm9.mjs.map +0 -1
  531. package/dist/version-CrqhKGWn.mjs +0 -7
  532. /package/dist/{api-tokens-B4BQybOp.mjs → api-tokens-DsvvCtdh.mjs} +0 -0
  533. /package/dist/{ssrf-CcX9zvMK.mjs → ssrf-CmuGgCq3.mjs} +0 -0
  534. /package/dist/{types-BvbeGEtr.mjs → types-DROWRxYV.mjs} +0 -0
@@ -22,6 +22,7 @@ import {
22
22
  stripCredentialHeaders,
23
23
  } from "../import/ssrf.js";
24
24
  import { enrichImageMetadata } from "../media/enrich.js";
25
+ import { markContentMediaUsageCollectionStaleSafely } from "../media/usage/content-refresh.js";
25
26
  import { invalidateSiteSettingsCache } from "../settings/index.js";
26
27
  import type { Storage } from "../storage/types.js";
27
28
  import { CronAccessImpl } from "./cron.js";
@@ -294,90 +295,118 @@ export function createContentAccessWithWrite(db: Kysely<Database>): ContentAcces
294
295
 
295
296
  async create(collection: string, data: ContentWriteInput): Promise<ContentItem> {
296
297
  const { fields, seo } = splitSeoFromInput(data);
298
+ let contentMutated = false;
297
299
 
298
- return withTransaction(db, async (trx) => {
299
- const trxContentRepo = new ContentRepository(trx);
300
- const trxSeoRepo = new SeoRepository(trx);
301
-
302
- const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
303
-
304
- const item = await trxContentRepo.create({
305
- type: collection,
306
- data: fields,
300
+ try {
301
+ const created = await withTransaction(db, async (trx) => {
302
+ const trxContentRepo = new ContentRepository(trx);
303
+ const trxSeoRepo = new SeoRepository(trx);
304
+
305
+ const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
306
+
307
+ const item = await trxContentRepo.create({
308
+ type: collection,
309
+ data: fields,
310
+ });
311
+ contentMutated = true;
312
+
313
+ const result: ContentItem = {
314
+ id: item.id,
315
+ type: item.type,
316
+ slug: item.slug,
317
+ status: item.status,
318
+ data: item.data,
319
+ createdAt: item.createdAt,
320
+ updatedAt: item.updatedAt,
321
+ locale: item.locale,
322
+ publishedAt: item.publishedAt,
323
+ };
324
+
325
+ if (hasSeo) {
326
+ result.seo =
327
+ seo !== undefined
328
+ ? await trxSeoRepo.upsert(collection, item.id, seo)
329
+ : await trxSeoRepo.get(collection, item.id);
330
+ }
331
+
332
+ return result;
307
333
  });
308
-
309
- const result: ContentItem = {
310
- id: item.id,
311
- type: item.type,
312
- slug: item.slug,
313
- status: item.status,
314
- data: item.data,
315
- createdAt: item.createdAt,
316
- updatedAt: item.updatedAt,
317
- locale: item.locale,
318
- publishedAt: item.publishedAt,
319
- };
320
-
321
- if (hasSeo) {
322
- result.seo =
323
- seo !== undefined
324
- ? await trxSeoRepo.upsert(collection, item.id, seo)
325
- : await trxSeoRepo.get(collection, item.id);
334
+ await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
335
+ return created;
336
+ } catch (error) {
337
+ if (contentMutated) {
338
+ await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
326
339
  }
327
-
328
- return result;
329
- });
340
+ throw error;
341
+ }
330
342
  },
331
343
 
332
344
  async update(collection: string, id: string, data: ContentWriteInput): Promise<ContentItem> {
333
345
  const { fields, seo } = splitSeoFromInput(data);
346
+ const hasFieldUpdates = Object.keys(fields).length > 0;
347
+ let contentMutated = false;
334
348
 
335
- return withTransaction(db, async (trx) => {
336
- const trxContentRepo = new ContentRepository(trx);
337
- const trxSeoRepo = new SeoRepository(trx);
338
-
339
- const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
340
-
341
- // Pass the `data` payload to ContentRepository.update only when
342
- // there are field updates passing an empty object would still
343
- // bump updated_at/version, but we want a seo-only call to touch
344
- // only the SEO table. ContentRepository.update handles the no-op
345
- // path by returning the current row.
346
- const hasFieldUpdates = Object.keys(fields).length > 0;
347
- const item = hasFieldUpdates
348
- ? await trxContentRepo.update(collection, id, { data: fields })
349
- : await (async () => {
350
- const existing = await trxContentRepo.findById(collection, id);
351
- if (!existing) throw new Error("Content not found");
352
- return existing;
353
- })();
354
-
355
- const result: ContentItem = {
356
- id: item.id,
357
- type: item.type,
358
- slug: item.slug,
359
- status: item.status,
360
- data: item.data,
361
- createdAt: item.createdAt,
362
- updatedAt: item.updatedAt,
363
- locale: item.locale,
364
- publishedAt: item.publishedAt,
365
- };
366
-
367
- if (hasSeo) {
368
- result.seo =
369
- seo !== undefined
370
- ? await trxSeoRepo.upsert(collection, item.id, seo)
371
- : await trxSeoRepo.get(collection, item.id);
349
+ try {
350
+ const updated = await withTransaction(db, async (trx) => {
351
+ const trxContentRepo = new ContentRepository(trx);
352
+ const trxSeoRepo = new SeoRepository(trx);
353
+
354
+ const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
355
+
356
+ // Pass the `data` payload to ContentRepository.update only when
357
+ // there are field updates passing an empty object would still
358
+ // bump updated_at/version, but we want a seo-only call to touch
359
+ // only the SEO table. ContentRepository.update handles the no-op
360
+ // path by returning the current row.
361
+ const item = hasFieldUpdates
362
+ ? await trxContentRepo.update(collection, id, { data: fields })
363
+ : await (async () => {
364
+ const existing = await trxContentRepo.findById(collection, id);
365
+ if (!existing) throw new Error("Content not found");
366
+ return existing;
367
+ })();
368
+ if (hasFieldUpdates) contentMutated = true;
369
+
370
+ const result: ContentItem = {
371
+ id: item.id,
372
+ type: item.type,
373
+ slug: item.slug,
374
+ status: item.status,
375
+ data: item.data,
376
+ createdAt: item.createdAt,
377
+ updatedAt: item.updatedAt,
378
+ locale: item.locale,
379
+ publishedAt: item.publishedAt,
380
+ };
381
+
382
+ if (hasSeo) {
383
+ result.seo =
384
+ seo !== undefined
385
+ ? await trxSeoRepo.upsert(collection, item.id, seo)
386
+ : await trxSeoRepo.get(collection, item.id);
387
+ }
388
+
389
+ return result;
390
+ });
391
+ if (hasFieldUpdates) {
392
+ await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
372
393
  }
373
-
374
- return result;
375
- });
394
+ return updated;
395
+ } catch (error) {
396
+ if (contentMutated) {
397
+ await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
398
+ }
399
+ throw error;
400
+ }
376
401
  },
377
402
 
378
403
  async delete(collection: string, id: string): Promise<boolean> {
379
404
  const contentRepo = new ContentRepository(db);
380
- return contentRepo.delete(collection, id);
405
+ const deleted = await contentRepo.delete(collection, id);
406
+ if (deleted) {
407
+ await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
408
+ }
409
+ return deleted;
381
410
  },
382
411
  };
383
412
  }
@@ -7,6 +7,10 @@ import { currentTimestamp, listTablesLike, tableExists } from "../database/diale
7
7
  import { withTransaction } from "../database/transaction.js";
8
8
  import type { CollectionTable, Database, FieldTable } from "../database/types.js";
9
9
  import { validateIdentifier } from "../database/validate.js";
10
+ import {
11
+ deleteContentMediaUsageCollection,
12
+ markContentMediaUsageCollectionStaleSafely,
13
+ } from "../media/usage/content-refresh.js";
10
14
  import { FTSManager } from "../search/fts-manager.js";
11
15
  import { chunks, SQL_BATCH_SIZE } from "../utils/chunks.js";
12
16
  import {
@@ -365,18 +369,28 @@ export class SchemaRegistry {
365
369
  }
366
370
  }
367
371
 
368
- await withTransaction(this.db, async (trx) => {
369
- // Drop FTS table and triggers before dropping the content table
370
- const ftsManager = new FTSManager(trx);
371
- await ftsManager.dropFtsTable(slug);
372
-
373
- // Drop the content table
374
- const tableName = this.getTableName(slug);
375
- await sql`DROP TABLE IF EXISTS ${sql.ref(tableName)}`.execute(trx);
376
-
377
- // Delete the collection record (fields will cascade)
378
- await trx.deleteFrom("_emdash_collections").where("id", "=", existing.id).execute();
379
- });
372
+ let contentTableDropped = false;
373
+ try {
374
+ await withTransaction(this.db, async (trx) => {
375
+ // Drop FTS table and triggers before dropping the content table
376
+ const ftsManager = new FTSManager(trx);
377
+ await ftsManager.dropFtsTable(slug);
378
+
379
+ // Drop the content table
380
+ const tableName = this.getTableName(slug);
381
+ await sql`DROP TABLE IF EXISTS ${sql.ref(tableName)}`.execute(trx);
382
+ contentTableDropped = true;
383
+
384
+ // Delete the collection record (fields will cascade)
385
+ await trx.deleteFrom("_emdash_collections").where("id", "=", existing.id).execute();
386
+ });
387
+ await deleteContentMediaUsageCollection(this.db, slug);
388
+ } catch (error) {
389
+ if (contentTableDropped && !(await tableExists(this.db, this.getTableName(slug)))) {
390
+ await deleteContentMediaUsageCollection(this.db, slug);
391
+ }
392
+ throw error;
393
+ }
380
394
  }
381
395
 
382
396
  // ============================================
@@ -451,63 +465,82 @@ export class SchemaRegistry {
451
465
 
452
466
  const sortOrder = input.sortOrder ?? (maxSort?.max ?? -1) + 1;
453
467
 
454
- return withTransaction(this.db, async (trx) => {
455
- // Insert field record
456
- await trx
457
- .insertInto("_emdash_fields")
458
- .values({
459
- id,
460
- collection_id: collection.id,
461
- slug: input.slug,
462
- label: input.label,
463
- type: input.type,
464
- column_type: columnType,
465
- required: input.required ? 1 : 0,
466
- unique: input.unique ? 1 : 0,
467
- default_value:
468
- input.defaultValue !== undefined ? JSON.stringify(input.defaultValue) : null,
469
- validation: input.validation ? JSON.stringify(input.validation) : null,
470
- widget: input.widget ?? null,
471
- options: input.options ? JSON.stringify(input.options) : null,
472
- sort_order: sortOrder,
473
- searchable: input.searchable ? 1 : 0,
474
- translatable: input.translatable === false ? 0 : 1,
475
- })
476
- .execute();
468
+ let schemaMutated = false;
469
+ try {
470
+ const created = await withTransaction(this.db, async (trx) => {
471
+ // Insert field record
472
+ await trx
473
+ .insertInto("_emdash_fields")
474
+ .values({
475
+ id,
476
+ collection_id: collection.id,
477
+ slug: input.slug,
478
+ label: input.label,
479
+ type: input.type,
480
+ column_type: columnType,
481
+ required: input.required ? 1 : 0,
482
+ unique: input.unique ? 1 : 0,
483
+ default_value:
484
+ input.defaultValue !== undefined ? JSON.stringify(input.defaultValue) : null,
485
+ validation: input.validation ? JSON.stringify(input.validation) : null,
486
+ widget: input.widget ?? null,
487
+ options: input.options ? JSON.stringify(input.options) : null,
488
+ sort_order: sortOrder,
489
+ searchable: input.searchable ? 1 : 0,
490
+ translatable: input.translatable === false ? 0 : 1,
491
+ })
492
+ .execute();
493
+ schemaMutated = true;
494
+
495
+ // Add column to content table — pass trx to stay on the same connection
496
+ await this.addColumn(
497
+ collectionSlug,
498
+ input.slug,
499
+ input.type,
500
+ {
501
+ required: input.required,
502
+ defaultValue: input.defaultValue,
503
+ },
504
+ trx,
505
+ );
477
506
 
478
- // Add column to content table pass trx to stay on the same connection
479
- await this.addColumn(
480
- collectionSlug,
481
- input.slug,
482
- input.type,
483
- {
484
- required: input.required,
485
- defaultValue: input.defaultValue,
486
- },
487
- trx,
488
- );
507
+ // Read the created field via trx (not this.db) to avoid connection mutex deadlock
508
+ const fieldRow = await trx
509
+ .selectFrom("_emdash_fields")
510
+ .where("collection_id", "=", collection.id)
511
+ .where("slug", "=", input.slug)
512
+ .selectAll()
513
+ .executeTakeFirst();
489
514
 
490
- // Read the created field via trx (not this.db) to avoid connection mutex deadlock
491
- const fieldRow = await trx
492
- .selectFrom("_emdash_fields")
493
- .where("collection_id", "=", collection.id)
494
- .where("slug", "=", input.slug)
495
- .selectAll()
496
- .executeTakeFirst();
515
+ if (!fieldRow) {
516
+ throw new SchemaError("Failed to create field", "CREATE_FAILED");
517
+ }
497
518
 
498
- if (!fieldRow) {
499
- throw new SchemaError("Failed to create field", "CREATE_FAILED");
500
- }
519
+ const field = this.mapFieldRow(fieldRow);
501
520
 
502
- const field = this.mapFieldRow(fieldRow);
521
+ // Sync search state if this field is searchable; support checks are handled by syncSearchState()
522
+ if (input.searchable) {
523
+ await this.syncSearchState(collectionSlug, trx);
524
+ }
503
525
 
504
- // Sync search state if this field is searchable; support checks are handled by syncSearchState()
505
- if (input.searchable) {
506
- await this.syncSearchState(collectionSlug, trx);
526
+ return field;
527
+ });
528
+ await markContentMediaUsageCollectionStaleSafely(
529
+ this.db,
530
+ collectionSlug,
531
+ "CONTENT_USAGE_STALE",
532
+ );
533
+ return created;
534
+ } catch (error) {
535
+ if (schemaMutated) {
536
+ await markContentMediaUsageCollectionStaleSafely(
537
+ this.db,
538
+ collectionSlug,
539
+ "CONTENT_USAGE_STALE",
540
+ );
507
541
  }
508
-
509
- return field;
510
- });
542
+ throw error;
543
+ }
511
544
  }
512
545
 
513
546
  /**
@@ -553,67 +586,92 @@ export class SchemaRegistry {
553
586
  nextColumnType = newColumnType;
554
587
  }
555
588
 
556
- return withTransaction(this.db, async (trx) => {
557
- await trx
558
- .updateTable("_emdash_fields")
559
- .set({
560
- type: nextType,
561
- column_type: nextColumnType,
562
- label: input.label ?? field.label,
563
- required:
564
- input.required !== undefined ? (input.required ? 1 : 0) : field.required ? 1 : 0,
565
- unique: input.unique !== undefined ? (input.unique ? 1 : 0) : field.unique ? 1 : 0,
566
- searchable:
567
- input.searchable !== undefined ? (input.searchable ? 1 : 0) : field.searchable ? 1 : 0,
568
- translatable:
569
- input.translatable !== undefined
570
- ? input.translatable
571
- ? 1
572
- : 0
573
- : field.translatable
574
- ? 1
575
- : 0,
576
- default_value:
577
- input.defaultValue !== undefined
578
- ? JSON.stringify(input.defaultValue)
579
- : field.defaultValue !== undefined
580
- ? JSON.stringify(field.defaultValue)
589
+ let schemaMutated = false;
590
+ try {
591
+ const updatedField = await withTransaction(this.db, async (trx) => {
592
+ await trx
593
+ .updateTable("_emdash_fields")
594
+ .set({
595
+ type: nextType,
596
+ column_type: nextColumnType,
597
+ label: input.label ?? field.label,
598
+ required:
599
+ input.required !== undefined ? (input.required ? 1 : 0) : field.required ? 1 : 0,
600
+ unique: input.unique !== undefined ? (input.unique ? 1 : 0) : field.unique ? 1 : 0,
601
+ searchable:
602
+ input.searchable !== undefined
603
+ ? input.searchable
604
+ ? 1
605
+ : 0
606
+ : field.searchable
607
+ ? 1
608
+ : 0,
609
+ translatable:
610
+ input.translatable !== undefined
611
+ ? input.translatable
612
+ ? 1
613
+ : 0
614
+ : field.translatable
615
+ ? 1
616
+ : 0,
617
+ default_value:
618
+ input.defaultValue !== undefined
619
+ ? JSON.stringify(input.defaultValue)
620
+ : field.defaultValue !== undefined
621
+ ? JSON.stringify(field.defaultValue)
622
+ : null,
623
+ validation: nextValidation ? JSON.stringify(nextValidation) : null,
624
+ widget: input.widget ?? field.widget ?? null,
625
+ options: input.options
626
+ ? JSON.stringify(input.options)
627
+ : field.options
628
+ ? JSON.stringify(field.options)
581
629
  : null,
582
- validation: nextValidation ? JSON.stringify(nextValidation) : null,
583
- widget: input.widget ?? field.widget ?? null,
584
- options: input.options
585
- ? JSON.stringify(input.options)
586
- : field.options
587
- ? JSON.stringify(field.options)
588
- : null,
589
- sort_order: input.sortOrder ?? field.sortOrder,
590
- })
591
- .where("id", "=", field.id)
592
- .execute();
593
-
594
- // Read the updated field via trx (not this.db) to avoid connection mutex deadlock
595
- const updatedRow = await trx
596
- .selectFrom("_emdash_fields")
597
- .where("collection_id", "=", field.collectionId)
598
- .where("slug", "=", fieldSlug)
599
- .selectAll()
600
- .executeTakeFirst();
630
+ sort_order: input.sortOrder ?? field.sortOrder,
631
+ })
632
+ .where("id", "=", field.id)
633
+ .execute();
634
+ schemaMutated = true;
635
+
636
+ // Read the updated field via trx (not this.db) to avoid connection mutex deadlock
637
+ const updatedRow = await trx
638
+ .selectFrom("_emdash_fields")
639
+ .where("collection_id", "=", field.collectionId)
640
+ .where("slug", "=", fieldSlug)
641
+ .selectAll()
642
+ .executeTakeFirst();
643
+
644
+ if (!updatedRow) {
645
+ throw new SchemaError("Failed to update field", "UPDATE_FAILED");
646
+ }
601
647
 
602
- if (!updatedRow) {
603
- throw new SchemaError("Failed to update field", "UPDATE_FAILED");
604
- }
648
+ const updated = this.mapFieldRow(updatedRow);
605
649
 
606
- const updated = this.mapFieldRow(updatedRow);
650
+ // If searchable changed, sync FTS state for this collection
651
+ const searchableChanged =
652
+ input.searchable !== undefined && input.searchable !== field.searchable;
653
+ if (searchableChanged) {
654
+ await this.syncSearchState(collectionSlug, trx);
655
+ }
607
656
 
608
- // If searchable changed, sync FTS state for this collection
609
- const searchableChanged =
610
- input.searchable !== undefined && input.searchable !== field.searchable;
611
- if (searchableChanged) {
612
- await this.syncSearchState(collectionSlug, trx);
657
+ return updated;
658
+ });
659
+ await markContentMediaUsageCollectionStaleSafely(
660
+ this.db,
661
+ collectionSlug,
662
+ "CONTENT_USAGE_STALE",
663
+ );
664
+ return updatedField;
665
+ } catch (error) {
666
+ if (schemaMutated) {
667
+ await markContentMediaUsageCollectionStaleSafely(
668
+ this.db,
669
+ collectionSlug,
670
+ "CONTENT_USAGE_STALE",
671
+ );
613
672
  }
614
-
615
- return updated;
616
- });
673
+ throw error;
674
+ }
617
675
  }
618
676
 
619
677
  /**
@@ -666,22 +724,40 @@ export class SchemaRegistry {
666
724
  );
667
725
  }
668
726
 
669
- await withTransaction(this.db, async (trx) => {
670
- // Delete the field record first so syncSearchState sees the updated field list.
671
- // This ordering matters for searchable fields: SQLite prevents dropping a column
672
- // that is still referenced by a trigger. syncSearchState drops and recreates the
673
- // FTS triggers based on the remaining searchable fields, clearing the dependency
674
- // before we attempt the ALTER TABLE DROP COLUMN below.
675
- await trx.deleteFrom("_emdash_fields").where("id", "=", field.id).execute();
676
-
677
- // If the deleted field was searchable, sync FTS state (removes old triggers)
678
- if (field.searchable) {
679
- await this.syncSearchState(collectionSlug, trx);
680
- }
727
+ let schemaMutated = false;
728
+ try {
729
+ await withTransaction(this.db, async (trx) => {
730
+ // Delete the field record first so syncSearchState sees the updated field list.
731
+ // This ordering matters for searchable fields: SQLite prevents dropping a column
732
+ // that is still referenced by a trigger. syncSearchState drops and recreates the
733
+ // FTS triggers based on the remaining searchable fields, clearing the dependency
734
+ // before we attempt the ALTER TABLE DROP COLUMN below.
735
+ await trx.deleteFrom("_emdash_fields").where("id", "=", field.id).execute();
736
+ schemaMutated = true;
737
+
738
+ // If the deleted field was searchable, sync FTS state (removes old triggers)
739
+ if (field.searchable) {
740
+ await this.syncSearchState(collectionSlug, trx);
741
+ }
681
742
 
682
- // Drop column from content table — safe now because FTS triggers are gone
683
- await this.dropColumn(collectionSlug, fieldSlug, trx);
684
- });
743
+ // Drop column from content table — safe now because FTS triggers are gone
744
+ await this.dropColumn(collectionSlug, fieldSlug, trx);
745
+ });
746
+ await markContentMediaUsageCollectionStaleSafely(
747
+ this.db,
748
+ collectionSlug,
749
+ "CONTENT_USAGE_STALE",
750
+ );
751
+ } catch (error) {
752
+ if (schemaMutated) {
753
+ await markContentMediaUsageCollectionStaleSafely(
754
+ this.db,
755
+ collectionSlug,
756
+ "CONTENT_USAGE_STALE",
757
+ );
758
+ }
759
+ throw error;
760
+ }
685
761
  }
686
762
 
687
763
  /**
@@ -1142,28 +1218,38 @@ export class SchemaRegistry {
1142
1218
  const id = ulid();
1143
1219
  const label = options?.label || this.slugToLabel(slug);
1144
1220
 
1145
- await this.db
1146
- .insertInto("_emdash_collections")
1147
- .values({
1148
- id,
1149
- slug,
1150
- label,
1151
- label_singular: options?.labelSingular ?? null,
1152
- description: options?.description ?? null,
1153
- icon: null,
1154
- supports: JSON.stringify([]),
1155
- source: "discovered",
1156
- has_seo: 0,
1157
- url_pattern: null,
1158
- })
1159
- .execute();
1221
+ let collectionRegistered = false;
1222
+ try {
1223
+ await this.db
1224
+ .insertInto("_emdash_collections")
1225
+ .values({
1226
+ id,
1227
+ slug,
1228
+ label,
1229
+ label_singular: options?.labelSingular ?? null,
1230
+ description: options?.description ?? null,
1231
+ icon: null,
1232
+ supports: JSON.stringify([]),
1233
+ source: "discovered",
1234
+ has_seo: 0,
1235
+ url_pattern: null,
1236
+ })
1237
+ .execute();
1238
+ collectionRegistered = true;
1160
1239
 
1161
- const collection = await this.getCollection(slug);
1162
- if (!collection) {
1163
- throw new SchemaError("Failed to register orphaned table", "REGISTER_FAILED");
1164
- }
1240
+ const collection = await this.getCollection(slug);
1241
+ if (!collection) {
1242
+ throw new SchemaError("Failed to register orphaned table", "REGISTER_FAILED");
1243
+ }
1244
+ await markContentMediaUsageCollectionStaleSafely(this.db, slug, "CONTENT_USAGE_STALE");
1165
1245
 
1166
- return collection;
1246
+ return collection;
1247
+ } catch (error) {
1248
+ if (collectionRegistered) {
1249
+ await markContentMediaUsageCollectionStaleSafely(this.db, slug, "CONTENT_USAGE_STALE");
1250
+ }
1251
+ throw error;
1252
+ }
1167
1253
  }
1168
1254
 
1169
1255
  /**