emdash 0.17.1 → 0.17.2

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 (284) hide show
  1. package/dist/api/route-utils.mjs +11 -11
  2. package/dist/api/schemas/index.d.mts +1 -1
  3. package/dist/{api-Dmz40c2V.mjs → api-B7GATEYo.mjs} +12 -12
  4. package/dist/{api-Dmz40c2V.mjs.map → api-B7GATEYo.mjs.map} +1 -1
  5. package/dist/{apply-CuuZG6op.mjs → apply-BrVqULFe.mjs} +16 -16
  6. package/dist/{apply-CuuZG6op.mjs.map → apply-BrVqULFe.mjs.map} +1 -1
  7. package/dist/astro/index.d.mts +2 -2
  8. package/dist/astro/index.mjs +1 -1
  9. package/dist/astro/middleware/auth.d.mts +2 -2
  10. package/dist/astro/middleware/auth.mjs +2 -2
  11. package/dist/astro/middleware/redirect.mjs +5 -5
  12. package/dist/astro/middleware.d.mts.map +1 -1
  13. package/dist/astro/middleware.mjs +65 -49
  14. package/dist/astro/middleware.mjs.map +1 -1
  15. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +3 -3
  16. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +3 -3
  17. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +2 -2
  18. package/dist/astro/routes/api/admin/api-tokens/index.mjs +3 -3
  19. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +3 -3
  20. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +4 -4
  21. package/dist/astro/routes/api/admin/byline-fields/index.mjs +4 -4
  22. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +4 -4
  23. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +9 -9
  24. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +9 -9
  25. package/dist/astro/routes/api/admin/bylines/index.mjs +9 -9
  26. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +7 -7
  27. package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
  28. package/dist/astro/routes/api/admin/comments/bulk.mjs +6 -6
  29. package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
  30. package/dist/astro/routes/api/admin/comments/index.mjs +6 -6
  31. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
  32. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  33. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +3 -3
  34. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
  35. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +26 -26
  36. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +26 -26
  37. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +26 -26
  38. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +26 -26
  39. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +26 -26
  40. package/dist/astro/routes/api/admin/plugins/index.mjs +26 -26
  41. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  42. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +26 -26
  43. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +26 -26
  44. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +26 -26
  45. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +26 -26
  46. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +27 -27
  47. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +26 -26
  48. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +27 -27
  49. package/dist/astro/routes/api/admin/plugins/updates.mjs +26 -26
  50. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +26 -26
  51. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  52. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +26 -26
  53. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
  54. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  55. package/dist/astro/routes/api/admin/users/_id_/index.mjs +3 -3
  56. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
  57. package/dist/astro/routes/api/admin/users/index.mjs +3 -3
  58. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  59. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  60. package/dist/astro/routes/api/auth/invite/complete.mjs +3 -3
  61. package/dist/astro/routes/api/auth/invite/index.mjs +3 -3
  62. package/dist/astro/routes/api/auth/invite/register-options.mjs +3 -3
  63. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  64. package/dist/astro/routes/api/auth/magic-link/send.mjs +4 -4
  65. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  66. package/dist/astro/routes/api/auth/me.mjs +4 -4
  67. package/dist/astro/routes/api/auth/passkey/_id_.mjs +3 -3
  68. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  69. package/dist/astro/routes/api/auth/passkey/options.mjs +4 -4
  70. package/dist/astro/routes/api/auth/passkey/register/options.mjs +3 -3
  71. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +3 -3
  72. package/dist/astro/routes/api/auth/passkey/verify.mjs +3 -3
  73. package/dist/astro/routes/api/auth/signup/complete.mjs +3 -3
  74. package/dist/astro/routes/api/auth/signup/request.mjs +4 -4
  75. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  76. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +6 -6
  77. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  78. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
  79. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
  80. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  81. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +4 -4
  82. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +4 -4
  83. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
  84. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  85. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +4 -4
  86. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +9 -9
  87. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  88. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
  89. package/dist/astro/routes/api/content/_collection_/_id_.mjs +4 -4
  90. package/dist/astro/routes/api/content/_collection_/index.mjs +4 -4
  91. package/dist/astro/routes/api/content/_collection_/trash.mjs +4 -4
  92. package/dist/astro/routes/api/dashboard.mjs +7 -7
  93. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  94. package/dist/astro/routes/api/import/probe.mjs +4 -4
  95. package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
  96. package/dist/astro/routes/api/import/wordpress/execute.d.mts +2 -2
  97. package/dist/astro/routes/api/import/wordpress/execute.mjs +8 -8
  98. package/dist/astro/routes/api/import/wordpress/media.mjs +4 -4
  99. package/dist/astro/routes/api/import/wordpress/prepare.mjs +6 -6
  100. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +5 -5
  101. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +4 -4
  102. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +6 -6
  103. package/dist/astro/routes/api/manifest.mjs +3 -3
  104. package/dist/astro/routes/api/mcp.mjs +26 -26
  105. package/dist/astro/routes/api/media/_id_/confirm.mjs +4 -4
  106. package/dist/astro/routes/api/media/_id_.mjs +4 -4
  107. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  108. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  109. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  110. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  111. package/dist/astro/routes/api/media/upload-url.mjs +4 -4
  112. package/dist/astro/routes/api/media.mjs +5 -5
  113. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +5 -5
  114. package/dist/astro/routes/api/menus/_name_/items.mjs +5 -5
  115. package/dist/astro/routes/api/menus/_name_/reorder.mjs +5 -5
  116. package/dist/astro/routes/api/menus/_name_/translations.mjs +5 -5
  117. package/dist/astro/routes/api/menus/_name_.mjs +5 -5
  118. package/dist/astro/routes/api/menus/index.mjs +5 -5
  119. package/dist/astro/routes/api/oauth/device/authorize.mjs +3 -3
  120. package/dist/astro/routes/api/oauth/device/code.mjs +4 -4
  121. package/dist/astro/routes/api/oauth/device/token.mjs +4 -4
  122. package/dist/astro/routes/api/oauth/register.mjs +2 -2
  123. package/dist/astro/routes/api/oauth/token/refresh.mjs +3 -3
  124. package/dist/astro/routes/api/oauth/token/revoke.mjs +3 -3
  125. package/dist/astro/routes/api/oauth/token.mjs +2 -2
  126. package/dist/astro/routes/api/openapi.json.mjs +2 -2
  127. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +3 -3
  128. package/dist/astro/routes/api/redirects/404s/index.mjs +7 -7
  129. package/dist/astro/routes/api/redirects/404s/summary.mjs +7 -7
  130. package/dist/astro/routes/api/redirects/_id_.mjs +8 -8
  131. package/dist/astro/routes/api/redirects/index.mjs +8 -8
  132. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  133. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
  134. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +26 -26
  135. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +26 -26
  136. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +26 -26
  137. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +26 -26
  138. package/dist/astro/routes/api/schema/collections/index.mjs +26 -26
  139. package/dist/astro/routes/api/schema/index.mjs +7 -7
  140. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +26 -26
  141. package/dist/astro/routes/api/schema/orphans/index.mjs +26 -26
  142. package/dist/astro/routes/api/search/enable.mjs +8 -8
  143. package/dist/astro/routes/api/search/index.mjs +7 -7
  144. package/dist/astro/routes/api/search/rebuild.mjs +8 -8
  145. package/dist/astro/routes/api/search/stats.mjs +7 -7
  146. package/dist/astro/routes/api/search/suggest.mjs +7 -7
  147. package/dist/astro/routes/api/sections/_slug_.mjs +7 -7
  148. package/dist/astro/routes/api/sections/index.mjs +7 -7
  149. package/dist/astro/routes/api/settings/email.mjs +4 -4
  150. package/dist/astro/routes/api/settings.mjs +9 -9
  151. package/dist/astro/routes/api/setup/admin-verify.mjs +3 -3
  152. package/dist/astro/routes/api/setup/admin.mjs +3 -3
  153. package/dist/astro/routes/api/setup/dev-bypass.mjs +16 -16
  154. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  155. package/dist/astro/routes/api/setup/index.mjs +17 -17
  156. package/dist/astro/routes/api/setup/status.mjs +3 -3
  157. package/dist/astro/routes/api/snapshot.mjs +3 -3
  158. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +9 -9
  159. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +9 -9
  160. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +9 -9
  161. package/dist/astro/routes/api/taxonomies/index.mjs +9 -9
  162. package/dist/astro/routes/api/themes/preview.mjs +3 -3
  163. package/dist/astro/routes/api/typegen.mjs +5 -5
  164. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +4 -4
  165. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +7 -7
  166. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +7 -7
  167. package/dist/astro/routes/api/widget-areas/_name_.mjs +6 -6
  168. package/dist/astro/routes/api/widget-areas/index.mjs +7 -7
  169. package/dist/astro/routes/api/widget-components.mjs +2 -2
  170. package/dist/astro/routes/robots.txt.mjs +5 -5
  171. package/dist/astro/routes/sitemap-_collection_.xml.mjs +5 -5
  172. package/dist/astro/routes/sitemap.xml.mjs +5 -5
  173. package/dist/astro/types.d.mts +2 -2
  174. package/dist/{authorize-_wWM_44T.mjs → authorize-CLTmOUyx.mjs} +2 -2
  175. package/dist/{authorize-_wWM_44T.mjs.map → authorize-CLTmOUyx.mjs.map} +1 -1
  176. package/dist/{byline-BrIVWLm-.mjs → byline-CAhk4FrG.mjs} +4 -4
  177. package/dist/{byline-BrIVWLm-.mjs.map → byline-CAhk4FrG.mjs.map} +1 -1
  178. package/dist/{byline-fields-BNy7Ng1U.d.mts → byline-fields-CR5hGLMw.d.mts} +28 -28
  179. package/dist/{byline-fields-BNy7Ng1U.d.mts.map → byline-fields-CR5hGLMw.d.mts.map} +1 -1
  180. package/dist/{bylines-sqExMElV.mjs → bylines-CbrD7STW.mjs} +3 -3
  181. package/dist/{bylines-sqExMElV.mjs.map → bylines-CbrD7STW.mjs.map} +1 -1
  182. package/dist/{bylines-C_POWmGT.mjs → bylines-DCczH3AV.mjs} +4 -4
  183. package/dist/{bylines-C_POWmGT.mjs.map → bylines-DCczH3AV.mjs.map} +1 -1
  184. package/dist/{cache-wsDkA8ru.mjs → cache-DIHHyPkt.mjs} +2 -2
  185. package/dist/{cache-wsDkA8ru.mjs.map → cache-DIHHyPkt.mjs.map} +1 -1
  186. package/dist/{chunks-BAYkM-CF.mjs → chunks-DnnHlRG3.mjs} +2 -2
  187. package/dist/{chunks-BAYkM-CF.mjs.map → chunks-DnnHlRG3.mjs.map} +1 -1
  188. package/dist/cli/index.mjs +14 -14
  189. package/dist/{comment-Cd29aktf.mjs → comment-DkAfGX9E.mjs} +2 -2
  190. package/dist/{comment-Cd29aktf.mjs.map → comment-DkAfGX9E.mjs.map} +1 -1
  191. package/dist/{comments-B7ufhkxN.mjs → comments-DLFnXs7J.mjs} +3 -3
  192. package/dist/{comments-B7ufhkxN.mjs.map → comments-DLFnXs7J.mjs.map} +1 -1
  193. package/dist/{content-BbqKo3Kc.mjs → content-C7aJ7keg.mjs} +3 -3
  194. package/dist/{content-BbqKo3Kc.mjs.map → content-C7aJ7keg.mjs.map} +1 -1
  195. package/dist/{context-BsF1rhoI.mjs → context-Ca0HkaIh.mjs} +8 -8
  196. package/dist/{context-BsF1rhoI.mjs.map → context-Ca0HkaIh.mjs.map} +1 -1
  197. package/dist/{dashboard-BwIX9r-X.mjs → dashboard-BrfLIsX1.mjs} +4 -4
  198. package/dist/{dashboard-BwIX9r-X.mjs.map → dashboard-BrfLIsX1.mjs.map} +1 -1
  199. package/dist/db/index.mjs +2 -2
  200. package/dist/{dialect-helpers-BKCvISIQ.mjs → dialect-helpers-DRI5pyY3.mjs} +3 -3
  201. package/dist/dialect-helpers-DRI5pyY3.mjs.map +1 -0
  202. package/dist/{error-npZWBSb7.mjs → error-Bk9s3Ism.mjs} +2 -2
  203. package/dist/{error-npZWBSb7.mjs.map → error-Bk9s3Ism.mjs.map} +1 -1
  204. package/dist/{fts-manager-DmUAk-kQ.mjs → fts-manager-XpDfbIKo.mjs} +3 -3
  205. package/dist/{fts-manager-DmUAk-kQ.mjs.map → fts-manager-XpDfbIKo.mjs.map} +1 -1
  206. package/dist/{index-CjKdMZ3U.d.mts → index-C8ciqSMJ.d.mts} +4 -4
  207. package/dist/{index-CjKdMZ3U.d.mts.map → index-C8ciqSMJ.d.mts.map} +1 -1
  208. package/dist/index.d.mts +2 -2
  209. package/dist/index.mjs +35 -35
  210. package/dist/{load-DsoLq7ex.mjs → load-CF5oETkh.mjs} +2 -2
  211. package/dist/{load-DsoLq7ex.mjs.map → load-CF5oETkh.mjs.map} +1 -1
  212. package/dist/{loader-CJ6lWO0d.mjs → loader-BxyvbrZP.mjs} +4 -4
  213. package/dist/{loader-CJ6lWO0d.mjs.map → loader-BxyvbrZP.mjs.map} +1 -1
  214. package/dist/media/local-runtime.d.mts +2 -2
  215. package/dist/media/local-runtime.mjs +5 -5
  216. package/dist/{media-jk_HzzOl.mjs → media-Cyz5BhSN.mjs} +2 -2
  217. package/dist/{media-jk_HzzOl.mjs.map → media-Cyz5BhSN.mjs.map} +1 -1
  218. package/dist/{menus-CyMO6GBx.mjs → menus-CIdZ_Q6U.mjs} +4 -4
  219. package/dist/{menus-CyMO6GBx.mjs.map → menus-CIdZ_Q6U.mjs.map} +1 -1
  220. package/dist/{menus-B-5-3aon.mjs → menus-PFp8FDuO.mjs} +2 -2
  221. package/dist/{menus-B-5-3aon.mjs.map → menus-PFp8FDuO.mjs.map} +1 -1
  222. package/dist/{parse-4zO5Y2DL.mjs → parse-B-K21lvm.mjs} +2 -2
  223. package/dist/{parse-4zO5Y2DL.mjs.map → parse-B-K21lvm.mjs.map} +1 -1
  224. package/dist/plugin-utils.d.mts +2 -2
  225. package/dist/plugins/adapt-sandbox-entry.d.mts +2 -2
  226. package/dist/{query-Bt52mHXp.mjs → query-Cc649nDl.mjs} +10 -10
  227. package/dist/{query-Bt52mHXp.mjs.map → query-Cc649nDl.mjs.map} +1 -1
  228. package/dist/{rate-limit-D6VQqBk_.mjs → rate-limit-BI1OdpQH.mjs} +2 -2
  229. package/dist/{rate-limit-D6VQqBk_.mjs.map → rate-limit-BI1OdpQH.mjs.map} +1 -1
  230. package/dist/{redirect-BZUJltlj.mjs → redirect-C-FeA4j9.mjs} +3 -3
  231. package/dist/{redirect-BZUJltlj.mjs.map → redirect-C-FeA4j9.mjs.map} +1 -1
  232. package/dist/{redirects-DnYuqsEf.mjs → redirects-C1UgU9E0.mjs} +3 -3
  233. package/dist/{redirects-DnYuqsEf.mjs.map → redirects-C1UgU9E0.mjs.map} +1 -1
  234. package/dist/{registry-Dn6gsx3L.mjs → registry-C-T_PWgp.mjs} +5 -5
  235. package/dist/{registry-Dn6gsx3L.mjs.map → registry-C-T_PWgp.mjs.map} +1 -1
  236. package/dist/{runner-eAgyIkeg.mjs → runner-BiuUfx-V.mjs} +4 -4
  237. package/dist/runner-BiuUfx-V.mjs.map +1 -0
  238. package/dist/runtime.d.mts +2 -2
  239. package/dist/runtime.mjs +3 -3
  240. package/dist/{schema--mYZX4D7.mjs → schema-BpCJh2lU.mjs} +4 -4
  241. package/dist/{schema--mYZX4D7.mjs.map → schema-BpCJh2lU.mjs.map} +1 -1
  242. package/dist/{search-C6U_NvZI.mjs → search-BrF7k0Ho.mjs} +4 -4
  243. package/dist/{search-C6U_NvZI.mjs.map → search-BrF7k0Ho.mjs.map} +1 -1
  244. package/dist/{sections-Ba-rJLKb.mjs → sections-8DEa-dWt.mjs} +3 -3
  245. package/dist/{sections-Ba-rJLKb.mjs.map → sections-8DEa-dWt.mjs.map} +1 -1
  246. package/dist/seed/index.mjs +14 -14
  247. package/dist/seo/index.mjs +1 -0
  248. package/dist/seo/index.mjs.map +1 -1
  249. package/dist/{seo-BTzb5ksq.mjs → seo-CKr7pLfA.mjs} +2 -2
  250. package/dist/{seo-BTzb5ksq.mjs.map → seo-CKr7pLfA.mjs.map} +1 -1
  251. package/dist/{service-Cn-kIfZn.mjs → service-9P2cdyR_.mjs} +2 -2
  252. package/dist/{service-Cn-kIfZn.mjs.map → service-9P2cdyR_.mjs.map} +1 -1
  253. package/dist/{settings-C65OSm41.mjs → settings-DYVzINdn.mjs} +3 -3
  254. package/dist/{settings-C65OSm41.mjs.map → settings-DYVzINdn.mjs.map} +1 -1
  255. package/dist/{settings-ChlQbwU0.mjs → settings-Jro4YcUb.mjs} +3 -3
  256. package/dist/{settings-ChlQbwU0.mjs.map → settings-Jro4YcUb.mjs.map} +1 -1
  257. package/dist/{taxonomies-CbO6v7EE.mjs → taxonomies-C0bVme_m.mjs} +4 -4
  258. package/dist/{taxonomies-CbO6v7EE.mjs.map → taxonomies-C0bVme_m.mjs.map} +1 -1
  259. package/dist/{taxonomies-ByLlXrv5.mjs → taxonomies-CGD6y79Q.mjs} +5 -5
  260. package/dist/{taxonomies-ByLlXrv5.mjs.map → taxonomies-CGD6y79Q.mjs.map} +1 -1
  261. package/dist/{taxonomy-BBK-UAEo.mjs → taxonomy-Db5xwphL.mjs} +3 -3
  262. package/dist/{taxonomy-BBK-UAEo.mjs.map → taxonomy-Db5xwphL.mjs.map} +1 -1
  263. package/dist/{types-SF1DwGf2.mjs → types-CfyYQ7eY.mjs} +2 -2
  264. package/dist/{types-SF1DwGf2.mjs.map → types-CfyYQ7eY.mjs.map} +1 -1
  265. package/dist/{user-X4rtyO4Y.mjs → user-tLdHUEXV.mjs} +2 -2
  266. package/dist/{user-X4rtyO4Y.mjs.map → user-tLdHUEXV.mjs.map} +1 -1
  267. package/dist/{validate-DactmcJG.mjs → validate-DWmnRg6E.mjs} +2 -2
  268. package/dist/{validate-DactmcJG.mjs.map → validate-DWmnRg6E.mjs.map} +1 -1
  269. package/dist/{validation-BYA4i85b.mjs → validation-BQ_TP-On.mjs} +6 -6
  270. package/dist/{validation-BYA4i85b.mjs.map → validation-BQ_TP-On.mjs.map} +1 -1
  271. package/dist/version-CgcnMvqS.mjs +7 -0
  272. package/dist/{version-CWbvq9LG.mjs.map → version-CgcnMvqS.mjs.map} +1 -1
  273. package/dist/{widgets-DG-1jxnz.mjs → widgets-DzlINGI6.mjs} +2 -2
  274. package/dist/{widgets-DG-1jxnz.mjs.map → widgets-DzlINGI6.mjs.map} +1 -1
  275. package/dist/{zod-generator-BNAObjSt.mjs → zod-generator-MMm56Prt.mjs} +2 -2
  276. package/dist/{zod-generator-BNAObjSt.mjs.map → zod-generator-MMm56Prt.mjs.map} +1 -1
  277. package/package.json +5 -5
  278. package/src/astro/middleware.ts +34 -8
  279. package/src/database/dialect-helpers.ts +8 -2
  280. package/src/database/migrations/019_i18n.ts +2 -2
  281. package/src/seo/index.ts +10 -1
  282. package/dist/dialect-helpers-BKCvISIQ.mjs.map +0 -1
  283. package/dist/runner-eAgyIkeg.mjs.map +0 -1
  284. package/dist/version-CWbvq9LG.mjs +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emdash",
3
- "version": "0.17.1",
3
+ "version": "0.17.2",
4
4
  "description": "Astro-native CMS with WordPress migration support",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -218,9 +218,9 @@
218
218
  "upng-js": "^2.1.0",
219
219
  "zod": "^4.4.1",
220
220
  "@atcute/client": "^4.2.1",
221
- "@emdash-cms/admin": "0.17.1",
222
- "@emdash-cms/auth": "0.17.1",
223
- "@emdash-cms/gutenberg-to-portable-text": "0.17.1",
221
+ "@emdash-cms/admin": "0.17.2",
222
+ "@emdash-cms/auth": "0.17.2",
223
+ "@emdash-cms/gutenberg-to-portable-text": "0.17.2",
224
224
  "@emdash-cms/plugin-types": "0.0.1",
225
225
  "@emdash-cms/registry-client": "0.3.1"
226
226
  },
@@ -255,7 +255,7 @@
255
255
  "vite": "^6.0.0",
256
256
  "vitest": "^4.1.5",
257
257
  "zod-openapi": "^5.4.6",
258
- "@emdash-cms/blocks": "0.17.1"
258
+ "@emdash-cms/blocks": "0.17.2"
259
259
  },
260
260
  "repository": {
261
261
  "type": "git",
@@ -50,6 +50,7 @@ import {
50
50
  type RequestMetrics,
51
51
  runWithContext,
52
52
  } from "../request-context.js";
53
+ import { isMissingTableError } from "../utils/db-errors.js";
53
54
  import type { EmDashConfig } from "./integration/runtime.js";
54
55
  import { createPublicPluginApiRouteHandler } from "./public-plugin-api-routes.js";
55
56
  import type { EmDashHandlers } from "./types.js";
@@ -69,8 +70,24 @@ let i18nInitialized = false;
69
70
  * would query an empty database and crash. Once verified (or once the runtime
70
71
  * has initialized via an admin/API request), this stays true for the worker's
71
72
  * lifetime.
73
+ *
74
+ * Stored on globalThis behind a Symbol key so the flag is a true singleton
75
+ * even when the bundler duplicates this module across SSR chunks (same
76
+ * pattern as request-cache.ts). A plain module-scoped `let` becomes multiple
77
+ * independent variables, which would make the setup probe re-run far more
78
+ * often than intended — and every re-run is another chance for a transient
79
+ * DB error to be misread as "fresh install" and bounce visitors to setup.
72
80
  */
73
- let setupVerified = false;
81
+ const SETUP_VERIFIED_KEY = Symbol.for("emdash:setup-verified");
82
+ const setupFlagStore = globalThis as Record<symbol, unknown>;
83
+
84
+ function isSetupVerified(): boolean {
85
+ return setupFlagStore[SETUP_VERIFIED_KEY] === true;
86
+ }
87
+
88
+ function markSetupVerified(): void {
89
+ setupFlagStore[SETUP_VERIFIED_KEY] = true;
90
+ }
74
91
 
75
92
  /**
76
93
  * Get EmDash configuration from virtual module
@@ -338,7 +355,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
338
355
  // Do a one-time lightweight probe using the same getDb() instance the
339
356
  // page will use: if the migrations table doesn't exist, no migrations
340
357
  // have ever run -- redirect to the setup wizard.
341
- if (!setupVerified) {
358
+ if (!isSetupVerified()) {
342
359
  const t0 = performance.now();
343
360
  try {
344
361
  const { getDb } = await import("../loader.js");
@@ -348,10 +365,19 @@ export const onRequest = defineMiddleware(async (context, next) => {
348
365
  .selectAll()
349
366
  .limit(1)
350
367
  .execute();
351
- setupVerified = true;
352
- } catch {
353
- // Table doesn't exist -> fresh database, redirect to setup
354
- return context.redirect("/_emdash/admin/setup");
368
+ markSetupVerified();
369
+ } catch (error) {
370
+ // Only a genuinely-missing migrations table means a fresh,
371
+ // un-set-up database — redirect to the setup wizard.
372
+ if (isMissingTableError(error)) {
373
+ return context.redirect("/_emdash/admin/setup");
374
+ }
375
+ // Any other failure (transient D1/replica error, timeout, cold-start
376
+ // race, locked SQLite) must NOT be read as "fresh install" — doing so
377
+ // bounces real visitors on a set-up site to /_emdash/admin/setup.
378
+ // Leave the flag unset so a later request can re-verify, and fall
379
+ // through to render the page normally.
380
+ console.error("Setup probe failed (non-fatal):", error);
355
381
  }
356
382
  timings.push({ name: "setup", dur: performance.now() - t0, desc: "Setup probe" });
357
383
  }
@@ -368,7 +394,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
368
394
  const t0 = performance.now();
369
395
  try {
370
396
  const runtime = await getRuntime(config, initSubTimings);
371
- setupVerified = true;
397
+ markSetupVerified();
372
398
  const handlePublicPluginApiRoute = createPublicPluginApiRouteHandler(runtime);
373
399
  // eslint-disable-next-line typescript/no-unsafe-type-assertion -- partial object; getPageRuntime() only checks for the page-contribution methods
374
400
  locals.emdash = {
@@ -448,7 +474,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
448
474
  for (const sub of initSubTimings) timings.push(sub);
449
475
 
450
476
  // Runtime init runs migrations, so the DB is guaranteed set up
451
- setupVerified = true;
477
+ markSetupVerified();
452
478
 
453
479
  // The manifest is no longer pre-loaded here. It's admin-only
454
480
  // content that public/anonymous requests never read, and
@@ -74,10 +74,12 @@ export function currentTimestampValue(db: Kysely<any>): RawBuilder<string> {
74
74
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance
75
75
  export async function tableExists(db: Kysely<any>, tableName: string): Promise<boolean> {
76
76
  if (isPostgres(db)) {
77
+ // Scope to the active schema (matches indexExists/columnExists below).
78
+ // Hardcoding 'public' breaks non-public-schema Postgres deployments.
77
79
  const result = await sql<{ exists: boolean }>`
78
80
  SELECT EXISTS(
79
81
  SELECT 1 FROM information_schema.tables
80
- WHERE table_schema = 'public' AND table_name = ${tableName}
82
+ WHERE table_schema = current_schema() AND table_name = ${tableName}
81
83
  ) as exists
82
84
  `.execute(db);
83
85
  return result.rows[0]?.exists === true;
@@ -146,9 +148,13 @@ export async function columnExists(
146
148
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance
147
149
  export async function listTablesLike(db: Kysely<any>, pattern: string): Promise<string[]> {
148
150
  if (isPostgres(db)) {
151
+ // Scope to the connection's active schema rather than hardcoding
152
+ // 'public'. A Postgres deployment using a non-public schema (per-tenant
153
+ // or shared-cluster setups), or per-test schemas, otherwise sees tables
154
+ // from the wrong schema — or none at all. Mirrors migration 038.
149
155
  const result = await sql<{ table_name: string }>`
150
156
  SELECT table_name FROM information_schema.tables
151
- WHERE table_schema = 'public' AND table_name LIKE ${pattern}
157
+ WHERE table_schema = current_schema() AND table_name LIKE ${pattern}
152
158
  `.execute(db);
153
159
  return result.rows.map((r) => r.table_name);
154
160
  }
@@ -142,7 +142,7 @@ async function upPostgres(db: Kysely<unknown>): Promise<void> {
142
142
  const hasLocale = await sql<{ exists: boolean }>`
143
143
  SELECT EXISTS(
144
144
  SELECT 1 FROM information_schema.columns
145
- WHERE table_schema = 'public' AND table_name = ${t} AND column_name = 'locale'
145
+ WHERE table_schema = current_schema() AND table_name = ${t} AND column_name = 'locale'
146
146
  ) as exists
147
147
  `.execute(db);
148
148
  if (hasLocale.rows[0]?.exists === true) continue;
@@ -189,7 +189,7 @@ async function upPostgres(db: Kysely<unknown>): Promise<void> {
189
189
  const hasTranslatable = await sql<{ exists: boolean }>`
190
190
  SELECT EXISTS(
191
191
  SELECT 1 FROM information_schema.columns
192
- WHERE table_schema = 'public' AND table_name = '_emdash_fields' AND column_name = 'translatable'
192
+ WHERE table_schema = current_schema() AND table_name = '_emdash_fields' AND column_name = 'translatable'
193
193
  ) as exists
194
194
  `.execute(db);
195
195
  if (hasTranslatable.rows[0]?.exists !== true) {
package/src/seo/index.ts CHANGED
@@ -170,7 +170,16 @@ function buildMediaUrl(imageRef: string, siteUrl?: string): string {
170
170
  return imageRef;
171
171
  }
172
172
 
173
- // Build from media API path
173
+ // Root-relative path the CMS SEO panel stores seo_image as
174
+ // "/_emdash/api/media/file/01KS....svg" (already includes the API
175
+ // prefix). Without this branch we'd re-prefix and produce
176
+ // "${siteUrl}/_emdash/api/media/file//_emdash/api/media/file/<id>"
177
+ // which 404s and breaks <meta property="og:image">.
178
+ if (imageRef.startsWith("/")) {
179
+ return siteUrl ? `${siteUrl.replace(TRAILING_SLASH_RE, "")}${imageRef}` : imageRef;
180
+ }
181
+
182
+ // Bare media_id — build the full media API path
174
183
  const mediaPath = `/_emdash/api/media/file/${imageRef}`;
175
184
  if (siteUrl) {
176
185
  return `${siteUrl.replace(TRAILING_SLASH_RE, "")}${mediaPath}`;
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialect-helpers-BKCvISIQ.mjs","names":[],"sources":["../src/database/dialect-helpers.ts"],"sourcesContent":["/**\n * Dialect-specific SQL helpers\n *\n * Every function takes a Kysely `db` instance and detects the dialect from\n * the adapter class. No module-level state, no globals, no heuristics —\n * the adapter is the source of truth.\n *\n * This is NOT an ORM abstraction — just targeted helpers for the ~15 places\n * that use raw dialect-specific SQL. Most Kysely schema builder code already\n * works cross-dialect.\n */\n\nimport type { ColumnDataType, Kysely, RawBuilder } from \"kysely\";\nimport { sql } from \"kysely\";\n\nimport type { DatabaseDialectType } from \"../db/adapters.js\";\nimport { validateIdentifier, validateJsonFieldName } from \"./validate.js\";\n\nexport type { DatabaseDialectType };\n\n/**\n * Detect dialect type from a Kysely instance via the adapter class name.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport function detectDialect(db: Kysely<any>): DatabaseDialectType {\n\tconst name = db.getExecutor().adapter.constructor.name;\n\tif (name === \"PostgresAdapter\") return \"postgres\";\n\treturn \"sqlite\";\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport function isSqlite(db: Kysely<any>): boolean {\n\treturn detectDialect(db) === \"sqlite\";\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport function isPostgres(db: Kysely<any>): boolean {\n\treturn detectDialect(db) === \"postgres\";\n}\n\n/**\n * Default timestamp expression for column defaults.\n * Wrapped in parens for use in CREATE TABLE ... DEFAULT (...).\n *\n * sqlite: (datetime('now'))\n * postgres: CURRENT_TIMESTAMP\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport function currentTimestamp(db: Kysely<any>): RawBuilder<string> {\n\tif (isPostgres(db)) {\n\t\treturn sql`CURRENT_TIMESTAMP`;\n\t}\n\treturn sql`(datetime('now'))`;\n}\n\n/**\n * Timestamp expression for use in WHERE clauses and SET expressions.\n * No wrapping parens.\n *\n * sqlite: datetime('now')\n * postgres: CURRENT_TIMESTAMP\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport function currentTimestampValue(db: Kysely<any>): RawBuilder<string> {\n\tif (isPostgres(db)) {\n\t\treturn sql`CURRENT_TIMESTAMP`;\n\t}\n\treturn sql`datetime('now')`;\n}\n\n/**\n * Check if a table exists in the database.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport async function tableExists(db: Kysely<any>, tableName: string): Promise<boolean> {\n\tif (isPostgres(db)) {\n\t\tconst result = await sql<{ exists: boolean }>`\n\t\t\tSELECT EXISTS(\n\t\t\t\tSELECT 1 FROM information_schema.tables\n\t\t\t\tWHERE table_schema = 'public' AND table_name = ${tableName}\n\t\t\t) as exists\n\t\t`.execute(db);\n\t\treturn result.rows[0]?.exists === true;\n\t}\n\n\tconst result = await sql<{ name: string }>`\n\t\tSELECT name FROM sqlite_master\n\t\tWHERE type = 'table' AND name = ${tableName}\n\t`.execute(db);\n\treturn result.rows.length > 0;\n}\n\n/**\n * Check if an index exists in the database.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport async function indexExists(db: Kysely<any>, indexName: string): Promise<boolean> {\n\tif (isPostgres(db)) {\n\t\tconst result = await sql<{ exists: boolean }>`\n\t\t\tSELECT EXISTS(\n\t\t\t\tSELECT 1 FROM pg_indexes\n\t\t\t\tWHERE schemaname = current_schema() AND indexname = ${indexName}\n\t\t\t) as exists\n\t\t`.execute(db);\n\t\treturn result.rows[0]?.exists === true;\n\t}\n\n\tconst result = await sql<{ name: string }>`\n\t\tSELECT name FROM sqlite_master\n\t\tWHERE type = 'index' AND name = ${indexName}\n\t`.execute(db);\n\treturn result.rows.length > 0;\n}\n\n/**\n * Check if a column exists in the database.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport async function columnExists(\n\tdb: Kysely<any>,\n\ttableName: string,\n\tcolumnName: string,\n): Promise<boolean> {\n\tif (isPostgres(db)) {\n\t\tconst result = await sql<{ exists: boolean }>`\n\t\t\tSELECT EXISTS(\n\t\t\t\tSELECT 1 FROM information_schema.columns\n\t\t\t\tWHERE table_schema = current_schema()\n\t\t\t\t\tAND table_name = ${tableName}\n\t\t\t\t\tAND column_name = ${columnName}\n\t\t\t) as exists\n\t\t`.execute(db);\n\t\treturn result.rows[0]?.exists === true;\n\t}\n\n\tconst result = await sql<{ name: string }>`\n\t\tSELECT name FROM pragma_table_info(${tableName})\n\t\tWHERE name = ${columnName}\n\t`.execute(db);\n\treturn result.rows.length > 0;\n}\n\n/**\n * List tables matching a LIKE pattern.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport async function listTablesLike(db: Kysely<any>, pattern: string): Promise<string[]> {\n\tif (isPostgres(db)) {\n\t\tconst result = await sql<{ table_name: string }>`\n\t\t\tSELECT table_name FROM information_schema.tables\n\t\t\tWHERE table_schema = 'public' AND table_name LIKE ${pattern}\n\t\t`.execute(db);\n\t\treturn result.rows.map((r) => r.table_name);\n\t}\n\n\tconst result = await sql<{ name: string }>`\n\t\tSELECT name FROM sqlite_master\n\t\tWHERE type = 'table' AND name LIKE ${pattern}\n\t`.execute(db);\n\treturn result.rows.map((r) => r.name);\n}\n\n/**\n * Column type for binary data.\n *\n * sqlite: blob\n * postgres: bytea\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport function binaryType(db: Kysely<any>): ColumnDataType {\n\tif (isPostgres(db)) {\n\t\treturn \"bytea\";\n\t}\n\treturn \"blob\";\n}\n\n/**\n * SQL expression for extracting a field from a JSON/JSONB column.\n *\n * sqlite: json_extract(column, '$.path')\n * postgres: column->>'path'\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Kysely instance\nexport function jsonExtractExpr(db: Kysely<any>, column: string, path: string): string {\n\tvalidateIdentifier(column, \"JSON column name\");\n\tvalidateJsonFieldName(path, \"JSON path\");\n\tif (isPostgres(db)) {\n\t\treturn `${column}->>'${path}'`;\n\t}\n\treturn `json_extract(${column}, '$.${path}')`;\n}\n"],"mappings":";;;;;;;AAwBA,SAAgB,cAAc,IAAsC;AAEnE,KADa,GAAG,aAAa,CAAC,QAAQ,YAAY,SACrC,kBAAmB,QAAO;AACvC,QAAO;;AAIR,SAAgB,SAAS,IAA0B;AAClD,QAAO,cAAc,GAAG,KAAK;;AAI9B,SAAgB,WAAW,IAA0B;AACpD,QAAO,cAAc,GAAG,KAAK;;;;;;;;;AAW9B,SAAgB,iBAAiB,IAAqC;AACrE,KAAI,WAAW,GAAG,CACjB,QAAO,GAAG;AAEX,QAAO,GAAG;;;;;;;;;AAWX,SAAgB,sBAAsB,IAAqC;AAC1E,KAAI,WAAW,GAAG,CACjB,QAAO,GAAG;AAEX,QAAO,GAAG;;;;;AAOX,eAAsB,YAAY,IAAiB,WAAqC;AACvF,KAAI,WAAW,GAAG,CAOjB,SANe,MAAM,GAAwB;;;qDAGM,UAAU;;IAE3D,QAAQ,GAAG,EACC,KAAK,IAAI,WAAW;AAOnC,SAJe,MAAM,GAAqB;;oCAEP,UAAU;GAC3C,QAAQ,GAAG,EACC,KAAK,SAAS;;;;;AA6B7B,eAAsB,aACrB,IACA,WACA,YACmB;AACnB,KAAI,WAAW,GAAG,CASjB,SARe,MAAM,GAAwB;;;;wBAIvB,UAAU;yBACT,WAAW;;IAEhC,QAAQ,GAAG,EACC,KAAK,IAAI,WAAW;AAOnC,SAJe,MAAM,GAAqB;uCACJ,UAAU;iBAChC,WAAW;GACzB,QAAQ,GAAG,EACC,KAAK,SAAS;;;;;AAO7B,eAAsB,eAAe,IAAiB,SAAoC;AACzF,KAAI,WAAW,GAAG,CAKjB,SAJe,MAAM,GAA2B;;uDAEK,QAAQ;IAC3D,QAAQ,GAAG,EACC,KAAK,KAAK,MAAM,EAAE,WAAW;AAO5C,SAJe,MAAM,GAAqB;;uCAEJ,QAAQ;GAC5C,QAAQ,GAAG,EACC,KAAK,KAAK,MAAM,EAAE,KAAK;;;;;;;;AAUtC,SAAgB,WAAW,IAAiC;AAC3D,KAAI,WAAW,GAAG,CACjB,QAAO;AAER,QAAO;;;;;;;;AAUR,SAAgB,gBAAgB,IAAiB,QAAgB,MAAsB;AACtF,oBAAmB,QAAQ,mBAAmB;AAC9C,uBAAsB,MAAM,YAAY;AACxC,KAAI,WAAW,GAAG,CACjB,QAAO,GAAG,OAAO,MAAM,KAAK;AAE7B,QAAO,gBAAgB,OAAO,OAAO,KAAK"}