emdash 1.2.0 → 1.3.1

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 (1592) hide show
  1. package/dist/action-token-B1ds4laA.mjs +26 -0
  2. package/dist/action-token-B1ds4laA.mjs.map +1 -0
  3. package/dist/activation-sGF9br3X.mjs +387 -0
  4. package/dist/activation-sGF9br3X.mjs.map +1 -0
  5. package/dist/adapters-BOMSX9PU.d.mts +173 -0
  6. package/dist/adapters-BOMSX9PU.d.mts.map +1 -0
  7. package/dist/allowed-origins-CovsTkm3.mjs +116 -0
  8. package/dist/allowed-origins-CovsTkm3.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +4 -4
  10. package/dist/api/route-utils.mjs +59 -55
  11. package/dist/api/route-utils.mjs.map +1 -1
  12. package/dist/api/schemas/index.d.mts +1 -1
  13. package/dist/api/schemas/index.mjs +11 -11
  14. package/dist/api-C_LxFnOm.mjs +5077 -0
  15. package/dist/api-C_LxFnOm.mjs.map +1 -0
  16. package/dist/api-tokens-DQ9Ee-vP.mjs +173 -0
  17. package/dist/api-tokens-DQ9Ee-vP.mjs.map +1 -0
  18. package/dist/apply-CLjfxvyH.mjs +1758 -0
  19. package/dist/apply-CLjfxvyH.mjs.map +1 -0
  20. package/dist/approvals-ocK89i4H.mjs +460 -0
  21. package/dist/approvals-ocK89i4H.mjs.map +1 -0
  22. package/dist/artifact-fetch-CgvvpoWQ.mjs +659 -0
  23. package/dist/artifact-fetch-CgvvpoWQ.mjs.map +1 -0
  24. package/dist/artifacts-DwOYYBQm.mjs +323 -0
  25. package/dist/artifacts-DwOYYBQm.mjs.map +1 -0
  26. package/dist/astro/image-endpoint.mjs +12 -2
  27. package/dist/astro/image-endpoint.mjs.map +1 -1
  28. package/dist/astro/index.d.mts +14 -14
  29. package/dist/astro/index.d.mts.map +1 -1
  30. package/dist/astro/index.mjs +122 -20
  31. package/dist/astro/index.mjs.map +1 -1
  32. package/dist/astro/middleware/auth.d.mts +12 -12
  33. package/dist/astro/middleware/auth.d.mts.map +1 -1
  34. package/dist/astro/middleware/auth.mjs +12 -11
  35. package/dist/astro/middleware/auth.mjs.map +1 -1
  36. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  37. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  38. package/dist/astro/middleware/redirect.mjs +161 -61
  39. package/dist/astro/middleware/redirect.mjs.map +1 -1
  40. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  41. package/dist/astro/middleware/request-context.mjs +58 -20
  42. package/dist/astro/middleware/request-context.mjs.map +1 -1
  43. package/dist/astro/middleware/setup.mjs +1 -1
  44. package/dist/astro/middleware.d.mts +12 -12
  45. package/dist/astro/middleware.d.mts.map +1 -1
  46. package/dist/astro/middleware.mjs +137 -419
  47. package/dist/astro/middleware.mjs.map +1 -1
  48. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +16 -16
  49. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +16 -16
  50. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  51. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  52. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
  53. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +19 -19
  54. package/dist/astro/routes/api/admin/byline-fields/index.mjs +19 -19
  55. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +19 -19
  56. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +29 -27
  57. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  58. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +29 -27
  59. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  60. package/dist/astro/routes/api/admin/bylines/index.mjs +29 -27
  61. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +21 -21
  63. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
  64. package/dist/astro/routes/api/admin/comments/bulk.mjs +20 -20
  65. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
  66. package/dist/astro/routes/api/admin/comments/index.mjs +20 -20
  67. package/dist/astro/routes/api/admin/core-update.mjs +7 -7
  68. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  69. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  70. package/dist/astro/routes/api/admin/media-usage/activation.mjs +22 -22
  71. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +23 -23
  72. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +23 -23
  73. package/dist/astro/routes/api/admin/media-usage/progress.mjs +27 -25
  74. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  75. package/dist/astro/routes/api/admin/media-usage/repair.mjs +33 -31
  76. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  77. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +23 -23
  78. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +23 -23
  79. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  80. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  81. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  82. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  83. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +81 -77
  84. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  85. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  86. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +80 -76
  87. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +80 -77
  89. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +91 -88
  91. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/plugins/index.mjs +81 -77
  93. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +7 -7
  95. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +80 -76
  96. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  97. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +90 -87
  98. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  99. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +80 -76
  100. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  101. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +80 -77
  102. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  103. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +92 -89
  104. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +10 -10
  106. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  107. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +82 -79
  108. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  109. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  110. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +81 -77
  111. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  112. package/dist/astro/routes/api/admin/plugins/updates.mjs +80 -76
  113. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  114. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
  115. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +80 -76
  116. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  117. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +7 -7
  118. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +80 -76
  119. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  120. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  121. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +45 -42
  122. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
  123. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +45 -42
  124. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
  125. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +47 -44
  126. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
  127. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +47 -44
  128. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
  129. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +47 -44
  130. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
  131. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +48 -45
  132. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
  133. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +48 -45
  134. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
  135. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +47 -44
  136. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
  137. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +48 -45
  138. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
  139. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +49 -46
  140. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
  141. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +47 -44
  142. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
  143. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +47 -44
  144. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
  145. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +49 -46
  146. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
  147. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +47 -44
  148. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
  149. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +49 -46
  150. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
  151. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +47 -44
  152. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
  153. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +47 -44
  154. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
  155. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +49 -46
  156. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
  157. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +47 -44
  158. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
  159. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +47 -44
  160. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
  161. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +49 -46
  162. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
  163. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  164. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  165. package/dist/astro/routes/api/admin/users/_id_/index.mjs +17 -17
  166. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  167. package/dist/astro/routes/api/admin/users/index.mjs +16 -16
  168. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  169. package/dist/astro/routes/api/auth/handover.mjs +6 -6
  170. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  171. package/dist/astro/routes/api/auth/invite/complete.mjs +21 -21
  172. package/dist/astro/routes/api/auth/invite/index.mjs +18 -18
  173. package/dist/astro/routes/api/auth/invite/register-options.mjs +19 -19
  174. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  175. package/dist/astro/routes/api/auth/magic-link/send.mjs +20 -20
  176. package/dist/astro/routes/api/auth/magic-link/verify.mjs +17 -17
  177. package/dist/astro/routes/api/auth/me.mjs +17 -17
  178. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  179. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +8 -8
  180. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  181. package/dist/astro/routes/api/auth/passkey/_id_.mjs +16 -16
  182. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  183. package/dist/astro/routes/api/auth/passkey/options.mjs +21 -21
  184. package/dist/astro/routes/api/auth/passkey/register/options.mjs +19 -19
  185. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +20 -20
  186. package/dist/astro/routes/api/auth/passkey/verify.mjs +21 -21
  187. package/dist/astro/routes/api/auth/signup/complete.mjs +21 -21
  188. package/dist/astro/routes/api/auth/signup/request.mjs +19 -19
  189. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  190. package/dist/astro/routes/api/calendar.mjs +17 -17
  191. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
  192. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +21 -21
  193. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  194. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
  195. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +21 -20
  196. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  197. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +7 -10
  198. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  199. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +23 -20
  200. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
  201. package/dist/astro/routes/api/content/_collection_/_id_/permanent.d.mts.map +1 -1
  202. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +7 -6
  203. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
  204. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +12 -12
  205. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +36 -34
  206. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  207. package/dist/astro/routes/api/content/_collection_/_id_/publish.d.mts.map +1 -1
  208. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +21 -20
  209. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  210. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +40 -38
  211. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  212. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +40 -38
  213. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  214. package/dist/astro/routes/api/content/_collection_/_id_/restore.d.mts.map +1 -1
  215. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +7 -6
  216. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  217. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  218. package/dist/astro/routes/api/content/_collection_/_id_/schedule.d.mts.map +1 -1
  219. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +22 -21
  220. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  221. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  222. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +46 -33
  223. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  224. package/dist/astro/routes/api/content/_collection_/_id_/translations.d.mts.map +1 -1
  225. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +9 -5
  226. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  227. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
  228. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +21 -20
  229. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  230. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  231. package/dist/astro/routes/api/content/_collection_/_id_.mjs +30 -23
  232. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  233. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  234. package/dist/astro/routes/api/content/_collection_/index.mjs +20 -23
  235. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  236. package/dist/astro/routes/api/content/_collection_/trash.mjs +17 -17
  237. package/dist/astro/routes/api/dashboard.d.mts.map +1 -1
  238. package/dist/astro/routes/api/dashboard.mjs +27 -15
  239. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  240. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  241. package/dist/astro/routes/api/dev/scheduled-tasks.d.mts +12 -0
  242. package/dist/astro/routes/api/dev/scheduled-tasks.d.mts.map +1 -0
  243. package/dist/astro/routes/api/dev/scheduled-tasks.mjs +142 -0
  244. package/dist/astro/routes/api/dev/scheduled-tasks.mjs.map +1 -0
  245. package/dist/astro/routes/api/health.mjs +6 -6
  246. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  247. package/dist/astro/routes/api/import/probe.mjs +31 -27
  248. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  249. package/dist/astro/routes/api/import/wordpress/analyze.d.mts.map +1 -1
  250. package/dist/astro/routes/api/import/wordpress/analyze.mjs +8 -21
  251. package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -1
  252. package/dist/astro/routes/api/import/wordpress/execute.d.mts +15 -14
  253. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  254. package/dist/astro/routes/api/import/wordpress/execute.mjs +36 -36
  255. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  256. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  257. package/dist/astro/routes/api/import/wordpress/media.mjs +21 -21
  258. package/dist/astro/routes/api/import/wordpress/prepare.mjs +22 -20
  259. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  260. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  261. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +32 -30
  262. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  263. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  264. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +32 -27
  265. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  266. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  267. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  268. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +66 -43
  269. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  270. package/dist/astro/routes/api/manifest.mjs +6 -6
  271. package/dist/astro/routes/api/mcp.mjs +160 -109
  272. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  273. package/dist/astro/routes/api/media/_id_/confirm.mjs +21 -21
  274. package/dist/astro/routes/api/media/_id_/replace.mjs +18 -18
  275. package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
  276. package/dist/astro/routes/api/media/_id_/usage.mjs +35 -33
  277. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  278. package/dist/astro/routes/api/media/_id_.mjs +33 -31
  279. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  280. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  281. package/dist/astro/routes/api/media/file/_...key_.mjs +21 -13
  282. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  283. package/dist/astro/routes/api/media/folders/_id_.mjs +18 -18
  284. package/dist/astro/routes/api/media/folders/index.mjs +18 -18
  285. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  286. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  287. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  288. package/dist/astro/routes/api/media/upload-url.mjs +20 -20
  289. package/dist/astro/routes/api/media.mjs +37 -35
  290. package/dist/astro/routes/api/media.mjs.map +1 -1
  291. package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
  292. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +24 -22
  293. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  294. package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
  295. package/dist/astro/routes/api/menus/_name_/items.mjs +23 -21
  296. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  297. package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
  298. package/dist/astro/routes/api/menus/_name_/reorder.mjs +23 -21
  299. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  300. package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
  301. package/dist/astro/routes/api/menus/_name_/translations.mjs +23 -21
  302. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  303. package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
  304. package/dist/astro/routes/api/menus/_name_.mjs +24 -22
  305. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  306. package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
  307. package/dist/astro/routes/api/menus/index.mjs +23 -21
  308. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  309. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  310. package/dist/astro/routes/api/oauth/device/authorize.mjs +8 -8
  311. package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
  312. package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
  313. package/dist/astro/routes/api/oauth/register.mjs +7 -7
  314. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  315. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  316. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  317. package/dist/astro/routes/api/openapi.json.mjs +22 -22
  318. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +12 -12
  319. package/dist/astro/routes/api/redirects/404s/index.mjs +23 -22
  320. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  321. package/dist/astro/routes/api/redirects/404s/summary.mjs +23 -22
  322. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  323. package/dist/astro/routes/api/redirects/_id_.d.mts.map +1 -1
  324. package/dist/astro/routes/api/redirects/_id_.mjs +36 -26
  325. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  326. package/dist/astro/routes/api/redirects/index.d.mts.map +1 -1
  327. package/dist/astro/routes/api/redirects/index.mjs +28 -24
  328. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  329. package/dist/astro/routes/api/relations/_id_/index.mjs +40 -38
  330. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  331. package/dist/astro/routes/api/relations/index.mjs +40 -38
  332. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  333. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  334. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +19 -19
  335. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +80 -76
  336. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  337. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +80 -76
  338. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  339. package/dist/astro/routes/api/schema/block-types/index.mjs +80 -76
  340. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  341. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +80 -76
  342. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  343. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +80 -76
  344. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  345. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +80 -76
  346. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  347. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +80 -76
  348. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  349. package/dist/astro/routes/api/schema/collections/index.mjs +80 -76
  350. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  351. package/dist/astro/routes/api/schema/collections/reorder.mjs +80 -76
  352. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  353. package/dist/astro/routes/api/schema/index.mjs +20 -18
  354. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  355. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +80 -76
  356. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  357. package/dist/astro/routes/api/schema/orphans/index.mjs +80 -76
  358. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  359. package/dist/astro/routes/api/search/enable.mjs +23 -21
  360. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  361. package/dist/astro/routes/api/search/index.mjs +22 -20
  362. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  363. package/dist/astro/routes/api/search/rebuild.mjs +23 -21
  364. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  365. package/dist/astro/routes/api/search/stats.mjs +12 -10
  366. package/dist/astro/routes/api/search/stats.mjs.map +1 -1
  367. package/dist/astro/routes/api/search/suggest.mjs +22 -20
  368. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  369. package/dist/astro/routes/api/sections/_slug_.mjs +22 -20
  370. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  371. package/dist/astro/routes/api/sections/index.mjs +22 -20
  372. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  373. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  374. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  375. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  376. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  377. package/dist/astro/routes/api/settings/domain-notify.mjs +9 -9
  378. package/dist/astro/routes/api/settings/domain.d.mts.map +1 -1
  379. package/dist/astro/routes/api/settings/domain.mjs +23 -18
  380. package/dist/astro/routes/api/settings/domain.mjs.map +1 -1
  381. package/dist/astro/routes/api/settings/email.mjs +6 -6
  382. package/dist/astro/routes/api/settings.d.mts.map +1 -1
  383. package/dist/astro/routes/api/settings.mjs +30 -25
  384. package/dist/astro/routes/api/settings.mjs.map +1 -1
  385. package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -1
  386. package/dist/astro/routes/api/setup/admin-verify.mjs +27 -23
  387. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  388. package/dist/astro/routes/api/setup/admin.mjs +20 -20
  389. package/dist/astro/routes/api/setup/dev-bypass.mjs +52 -48
  390. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  391. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  392. package/dist/astro/routes/api/setup/index.mjs +58 -54
  393. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  394. package/dist/astro/routes/api/setup/status.mjs +6 -6
  395. package/dist/astro/routes/api/site/domain-proof.mjs +16 -12
  396. package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -1
  397. package/dist/astro/routes/api/snapshot.mjs +8 -8
  398. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
  399. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +31 -28
  400. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  401. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
  402. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +31 -28
  403. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  404. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
  405. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +32 -29
  406. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  407. package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
  408. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +31 -28
  409. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  410. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +28 -26
  411. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  412. package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
  413. package/dist/astro/routes/api/taxonomies/_name_.mjs +32 -29
  414. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  415. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +44 -42
  416. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  417. package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
  418. package/dist/astro/routes/api/taxonomies/index.mjs +31 -28
  419. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  420. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  421. package/dist/astro/routes/api/typegen.mjs +6 -6
  422. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  423. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +21 -21
  424. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  425. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  426. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  427. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  428. package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
  429. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +20 -19
  430. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  431. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
  432. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +26 -23
  433. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  434. package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
  435. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +25 -22
  436. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  437. package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
  438. package/dist/astro/routes/api/widget-areas/_name_.mjs +14 -11
  439. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
  440. package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
  441. package/dist/astro/routes/api/widget-areas/index.mjs +25 -22
  442. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  443. package/dist/astro/routes/api/widget-components.mjs +5 -5
  444. package/dist/astro/routes/robots.txt.d.mts.map +1 -1
  445. package/dist/astro/routes/robots.txt.mjs +43 -8
  446. package/dist/astro/routes/robots.txt.mjs.map +1 -1
  447. package/dist/astro/routes/sitemap-_collection_.xml.mjs +19 -12
  448. package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
  449. package/dist/astro/routes/sitemap.xml.mjs +16 -9
  450. package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
  451. package/dist/astro/types.d.mts +19 -17
  452. package/dist/astro/types.d.mts.map +1 -1
  453. package/dist/audit-B8XE-0UV.mjs +127 -0
  454. package/dist/audit-B8XE-0UV.mjs.map +1 -0
  455. package/dist/auth/providers/github.d.mts +1 -1
  456. package/dist/auth/providers/google.d.mts +1 -1
  457. package/dist/auth/providers/microsoft.d.mts +1 -1
  458. package/dist/authoritative-records-LPtrIGOY.mjs +5183 -0
  459. package/dist/authoritative-records-LPtrIGOY.mjs.map +1 -0
  460. package/dist/authorize-CoDsRRp5.mjs +74 -0
  461. package/dist/authorize-CoDsRRp5.mjs.map +1 -0
  462. package/dist/backup-2Wj-hTCN.mjs +246 -0
  463. package/dist/backup-2Wj-hTCN.mjs.map +1 -0
  464. package/dist/block-types-C3gJEe7l.mjs +132 -0
  465. package/dist/block-types-C3gJEe7l.mjs.map +1 -0
  466. package/dist/block-values-CgbMtSGU.mjs +215 -0
  467. package/dist/block-values-CgbMtSGU.mjs.map +1 -0
  468. package/dist/byline-CzGZC2Zs.mjs +922 -0
  469. package/dist/byline-CzGZC2Zs.mjs.map +1 -0
  470. package/dist/byline-fields-B1qHvRps.mjs +280 -0
  471. package/dist/byline-fields-B1qHvRps.mjs.map +1 -0
  472. package/dist/byline-fields-vYd_4Q1e.mjs +123 -0
  473. package/dist/byline-fields-vYd_4Q1e.mjs.map +1 -0
  474. package/dist/byline-registry-BhzpO41z.mjs +406 -0
  475. package/dist/byline-registry-BhzpO41z.mjs.map +1 -0
  476. package/dist/bylines-BF555iIz.mjs +150 -0
  477. package/dist/bylines-BF555iIz.mjs.map +1 -0
  478. package/dist/bylines-DJx6IWWi.mjs +234 -0
  479. package/dist/bylines-DJx6IWWi.mjs.map +1 -0
  480. package/dist/cache-BWzswWB-.mjs +151 -0
  481. package/dist/cache-BWzswWB-.mjs.map +1 -0
  482. package/dist/canonical-DjF_z6GI.mjs +174 -0
  483. package/dist/canonical-DjF_z6GI.mjs.map +1 -0
  484. package/dist/capture-triggers-D7g3fOZj.mjs +362 -0
  485. package/dist/capture-triggers-D7g3fOZj.mjs.map +1 -0
  486. package/dist/challenge-store-Cfjdvw86.mjs +51 -0
  487. package/dist/challenge-store-Cfjdvw86.mjs.map +1 -0
  488. package/dist/checksum-BF4acJwn.mjs +162 -0
  489. package/dist/checksum-BF4acJwn.mjs.map +1 -0
  490. package/dist/chrome-tags-BDs29G3g.mjs +24 -0
  491. package/dist/chrome-tags-BDs29G3g.mjs.map +1 -0
  492. package/dist/chunks-CYBOL-zn.mjs +25 -0
  493. package/dist/chunks-CYBOL-zn.mjs.map +1 -0
  494. package/dist/cli/index.mjs +146 -130
  495. package/dist/cli/index.mjs.map +1 -1
  496. package/dist/client/cf-access.d.mts +1 -1
  497. package/dist/client/index.d.mts +47 -47
  498. package/dist/client/index.d.mts.map +1 -1
  499. package/dist/client/index.mjs +14 -11
  500. package/dist/client/index.mjs.map +1 -1
  501. package/dist/collection-slugs-cache-B2J5aESO.mjs +91 -0
  502. package/dist/collection-slugs-cache-B2J5aESO.mjs.map +1 -0
  503. package/dist/comment-DV7dybcs.mjs +335 -0
  504. package/dist/comment-DV7dybcs.mjs.map +1 -0
  505. package/dist/comment-reaction-CWwqiT6x.mjs +85 -0
  506. package/dist/comment-reaction-CWwqiT6x.mjs.map +1 -0
  507. package/dist/comments-DVjWJm8X.mjs +99 -0
  508. package/dist/comments-DVjWJm8X.mjs.map +1 -0
  509. package/dist/comments-Q-ILHCEI.mjs +195 -0
  510. package/dist/comments-Q-ILHCEI.mjs.map +1 -0
  511. package/dist/components-DnOmvvgg.mjs +112 -0
  512. package/dist/components-DnOmvvgg.mjs.map +1 -0
  513. package/dist/config-9IzA83_U.d.mts +6811 -0
  514. package/dist/config-9IzA83_U.d.mts.map +1 -0
  515. package/dist/config-BdQzFtmR.mjs +228 -0
  516. package/dist/config-BdQzFtmR.mjs.map +1 -0
  517. package/dist/config-Cs2RBkJ6.d.mts +41 -0
  518. package/dist/config-Cs2RBkJ6.d.mts.map +1 -0
  519. package/dist/config-Cs_AwWXI.mjs +106 -0
  520. package/dist/config-Cs_AwWXI.mjs.map +1 -0
  521. package/dist/connection-CiXgZyCY.mjs +36 -0
  522. package/dist/connection-CiXgZyCY.mjs.map +1 -0
  523. package/dist/content-Dt0Os_WQ.mjs +2109 -0
  524. package/dist/content-Dt0Os_WQ.mjs.map +1 -0
  525. package/dist/content-list-query-BK26u9Ly.d.mts +26 -0
  526. package/dist/content-list-query-BK26u9Ly.d.mts.map +1 -0
  527. package/dist/content-policy-BLDbNJOb.mjs +46 -0
  528. package/dist/content-policy-BLDbNJOb.mjs.map +1 -0
  529. package/dist/content-repair-CjwbLy4m.mjs +442 -0
  530. package/dist/content-repair-CjwbLy4m.mjs.map +1 -0
  531. package/dist/context-ErV7UdQY.mjs +2089 -0
  532. package/dist/context-ErV7UdQY.mjs.map +1 -0
  533. package/dist/credits-BRyjafiF.mjs +110 -0
  534. package/dist/credits-BRyjafiF.mjs.map +1 -0
  535. package/dist/cron-Bm5xa7tv.mjs +306 -0
  536. package/dist/cron-Bm5xa7tv.mjs.map +1 -0
  537. package/dist/dashboard-DVxQ5XiI.mjs +168 -0
  538. package/dist/dashboard-DVxQ5XiI.mjs.map +1 -0
  539. package/dist/database/migration-lock.d.mts +17 -4
  540. package/dist/database/migration-lock.d.mts.map +1 -1
  541. package/dist/database/migration-lock.mjs +33 -6
  542. package/dist/database/migration-lock.mjs.map +1 -1
  543. package/dist/db/index.d.mts +3 -3
  544. package/dist/db/index.mjs +2 -2
  545. package/dist/db/libsql-migrations.d.mts +1 -1
  546. package/dist/db/libsql-migrations.mjs +5 -5
  547. package/dist/db/libsql.d.mts +1 -1
  548. package/dist/db/postgres-migrations.d.mts +1 -1
  549. package/dist/db/postgres-migrations.mjs +5 -5
  550. package/dist/db/postgres.d.mts +1 -1
  551. package/dist/db/sqlite-migrations.d.mts +1 -1
  552. package/dist/db/sqlite-migrations.mjs +5 -5
  553. package/dist/db/sqlite.d.mts +1 -1
  554. package/dist/db/sqlite.mjs +1 -1
  555. package/dist/db-errors-unnO6yiZ.mjs +65 -0
  556. package/dist/db-errors-unnO6yiZ.mjs.map +1 -0
  557. package/dist/default-B9Tf2n94.mjs +81 -0
  558. package/dist/default-B9Tf2n94.mjs.map +1 -0
  559. package/dist/deferred-tasks-CpPEqsga.d.mts +9 -0
  560. package/dist/deferred-tasks-CpPEqsga.d.mts.map +1 -0
  561. package/dist/destination-DR3IHjmy.mjs +18 -0
  562. package/dist/destination-DR3IHjmy.mjs.map +1 -0
  563. package/dist/dev-typegen-ZeWYV8Jp.mjs +29 -0
  564. package/dist/dev-typegen-ZeWYV8Jp.mjs.map +1 -0
  565. package/dist/device-flow-BbYNZ9Xi.mjs +521 -0
  566. package/dist/device-flow-BbYNZ9Xi.mjs.map +1 -0
  567. package/dist/digest-DlBa7kJl.mjs +194 -0
  568. package/dist/digest-DlBa7kJl.mjs.map +1 -0
  569. package/dist/direct-executor-5T8gkhvA.mjs +117 -0
  570. package/dist/direct-executor-5T8gkhvA.mjs.map +1 -0
  571. package/dist/dist-DY0aOmAP.mjs +810 -0
  572. package/dist/dist-DY0aOmAP.mjs.map +1 -0
  573. package/dist/email-console-v3OM8It-.mjs +50 -0
  574. package/dist/email-console-v3OM8It-.mjs.map +1 -0
  575. package/dist/email-locale-CoZo-oZx.mjs +25 -0
  576. package/dist/email-locale-CoZo-oZx.mjs.map +1 -0
  577. package/dist/emdash-runtime-DwezbIqQ.mjs +4392 -0
  578. package/dist/emdash-runtime-DwezbIqQ.mjs.map +1 -0
  579. package/dist/enrich-C3XIJi0O.mjs +194 -0
  580. package/dist/enrich-C3XIJi0O.mjs.map +1 -0
  581. package/dist/entry-lock-CY7XpdSw.d.mts +4568 -0
  582. package/dist/entry-lock-CY7XpdSw.d.mts.map +1 -0
  583. package/dist/entry-lock-DDuWaAiP.mjs +1211 -0
  584. package/dist/entry-lock-DDuWaAiP.mjs.map +1 -0
  585. package/dist/entry-lock-D_Og9Gy3.mjs +163 -0
  586. package/dist/entry-lock-D_Og9Gy3.mjs.map +1 -0
  587. package/dist/entry-locks-Cp8_BcQQ.mjs +167 -0
  588. package/dist/entry-locks-Cp8_BcQQ.mjs.map +1 -0
  589. package/dist/env-types-Br8uywYA.mjs +38 -0
  590. package/dist/env-types-Br8uywYA.mjs.map +1 -0
  591. package/dist/error-CT2SsX5S.mjs +90 -0
  592. package/dist/error-CT2SsX5S.mjs.map +1 -0
  593. package/dist/errors-BMaCpLeS.mjs +479 -0
  594. package/dist/errors-BMaCpLeS.mjs.map +1 -0
  595. package/dist/errors-DlJwot7q.mjs +120 -0
  596. package/dist/errors-DlJwot7q.mjs.map +1 -0
  597. package/dist/escape-BfbDyuQ-.mjs +9 -0
  598. package/dist/escape-BfbDyuQ-.mjs.map +1 -0
  599. package/dist/fence-BOD3SxZG.mjs +162 -0
  600. package/dist/fence-BOD3SxZG.mjs.map +1 -0
  601. package/dist/field-defs-cache-C7sR7ZeU.mjs +77 -0
  602. package/dist/field-defs-cache-C7sR7ZeU.mjs.map +1 -0
  603. package/dist/field-map-C_rDXfdJ.mjs +84 -0
  604. package/dist/field-map-C_rDXfdJ.mjs.map +1 -0
  605. package/dist/focal-point-CgCcr1Ca.mjs +23 -0
  606. package/dist/focal-point-CgCcr1Ca.mjs.map +1 -0
  607. package/dist/fts-manager-BzFo0xx6.mjs +483 -0
  608. package/dist/fts-manager-BzFo0xx6.mjs.map +1 -0
  609. package/dist/gc-B_c3DPpi.mjs +75 -0
  610. package/dist/gc-B_c3DPpi.mjs.map +1 -0
  611. package/dist/hash-A-o2ZX8O.mjs +37 -0
  612. package/dist/hash-A-o2ZX8O.mjs.map +1 -0
  613. package/dist/hook-result-f8t7hIuu.d.mts +31 -0
  614. package/dist/hook-result-f8t7hIuu.d.mts.map +1 -0
  615. package/dist/hreflang-BpUK9Lcu.mjs +105 -0
  616. package/dist/hreflang-BpUK9Lcu.mjs.map +1 -0
  617. package/dist/hreflang-D07R-RbI.d.mts +50 -0
  618. package/dist/hreflang-D07R-RbI.d.mts.map +1 -0
  619. package/dist/http-route-dispatch-C2Ep2Uf6.mjs +342 -0
  620. package/dist/http-route-dispatch-C2Ep2Uf6.mjs.map +1 -0
  621. package/dist/identity-BivQ8wkV.mjs +35 -0
  622. package/dist/identity-BivQ8wkV.mjs.map +1 -0
  623. package/dist/import-B4UvHNJz.mjs +2126 -0
  624. package/dist/import-B4UvHNJz.mjs.map +1 -0
  625. package/dist/index-C37Ty40w.d.mts +623 -0
  626. package/dist/index-C37Ty40w.d.mts.map +1 -0
  627. package/dist/index.d.mts +23 -23
  628. package/dist/index.mjs +112 -108
  629. package/dist/install-finalization-BbYaB4wj.mjs +58 -0
  630. package/dist/install-finalization-BbYaB4wj.mjs.map +1 -0
  631. package/dist/json-recordset-BjYIWFkV.mjs +12 -0
  632. package/dist/json-recordset-BjYIWFkV.mjs.map +1 -0
  633. package/dist/json-schema-Cde7le0s.mjs +15 -0
  634. package/dist/json-schema-Cde7le0s.mjs.map +1 -0
  635. package/dist/keys-CusTXpw-.mjs +61 -0
  636. package/dist/keys-CusTXpw-.mjs.map +1 -0
  637. package/dist/kinds-DogmNB6n.mjs +974 -0
  638. package/dist/kinds-DogmNB6n.mjs.map +1 -0
  639. package/dist/lifecycle-BLCoCz4T.mjs +25 -0
  640. package/dist/lifecycle-BLCoCz4T.mjs.map +1 -0
  641. package/dist/load-Dds3KhXr.mjs +28 -0
  642. package/dist/load-Dds3KhXr.mjs.map +1 -0
  643. package/dist/loader-D4w4XE7q.mjs +1420 -0
  644. package/dist/loader-D4w4XE7q.mjs.map +1 -0
  645. package/dist/loops-IYgzQdQu.mjs +205 -0
  646. package/dist/loops-IYgzQdQu.mjs.map +1 -0
  647. package/dist/manifest-builder-CGF5kujD.mjs +196 -0
  648. package/dist/manifest-builder-CGF5kujD.mjs.map +1 -0
  649. package/dist/manifest-schema-B0BxPSjB.mjs +497 -0
  650. package/dist/manifest-schema-B0BxPSjB.mjs.map +1 -0
  651. package/dist/marketplace-DNvEGLqU.mjs +257 -0
  652. package/dist/marketplace-DNvEGLqU.mjs.map +1 -0
  653. package/dist/media/image-endpoint.d.mts +3 -2
  654. package/dist/media/image-endpoint.d.mts.map +1 -1
  655. package/dist/media/image-endpoint.mjs +17 -8
  656. package/dist/media/image-endpoint.mjs.map +1 -1
  657. package/dist/media/index.d.mts +1 -1
  658. package/dist/media/index.mjs +7 -6
  659. package/dist/media/index.mjs.map +1 -1
  660. package/dist/media/local-runtime.d.mts +14 -14
  661. package/dist/media/local-runtime.d.mts.map +1 -1
  662. package/dist/media/local-runtime.mjs +18 -8
  663. package/dist/media/local-runtime.mjs.map +1 -1
  664. package/dist/media-BL9MRrSG.mjs +294 -0
  665. package/dist/media-BL9MRrSG.mjs.map +1 -0
  666. package/dist/media-B_x5B9EA.mjs +373 -0
  667. package/dist/media-B_x5B9EA.mjs.map +1 -0
  668. package/dist/media-allowlist-CpmqBbIQ.mjs +45 -0
  669. package/dist/media-allowlist-CpmqBbIQ.mjs.map +1 -0
  670. package/dist/media-folders-CNs_A_B-.mjs +210 -0
  671. package/dist/media-folders-CNs_A_B-.mjs.map +1 -0
  672. package/dist/media-qTTHVkls.mjs +416 -0
  673. package/dist/media-qTTHVkls.mjs.map +1 -0
  674. package/dist/media-url-GJboA1fl.mjs +43 -0
  675. package/dist/media-url-GJboA1fl.mjs.map +1 -0
  676. package/dist/media-usage-ClWgrX0d.mjs +282 -0
  677. package/dist/media-usage-ClWgrX0d.mjs.map +1 -0
  678. package/dist/media-usage-activation-B8Fjtq0h.mjs +78 -0
  679. package/dist/media-usage-activation-B8Fjtq0h.mjs.map +1 -0
  680. package/dist/media-usage-work-L8-Au4j-.mjs +1036 -0
  681. package/dist/media-usage-work-L8-Au4j-.mjs.map +1 -0
  682. package/dist/media-usage-work-LXgze5j9.mjs +151 -0
  683. package/dist/media-usage-work-LXgze5j9.mjs.map +1 -0
  684. package/dist/menus-BAxcbsbv.mjs +818 -0
  685. package/dist/menus-BAxcbsbv.mjs.map +1 -0
  686. package/dist/menus-BI6oBXco.mjs +92 -0
  687. package/dist/menus-BI6oBXco.mjs.map +1 -0
  688. package/dist/menus-fvGFd4m6.mjs +3725 -0
  689. package/dist/menus-fvGFd4m6.mjs.map +1 -0
  690. package/dist/migrations/index.d.mts +1 -1
  691. package/dist/migrations/index.d.mts.map +1 -1
  692. package/dist/migrations/index.mjs +4 -4
  693. package/dist/mime-DwhtRyUt.mjs +81 -0
  694. package/dist/mime-DwhtRyUt.mjs.map +1 -0
  695. package/dist/mode-DIDSUwuN.mjs +23 -0
  696. package/dist/mode-DIDSUwuN.mjs.map +1 -0
  697. package/dist/node-sqlite-compat-Ddr_mlR9.mjs +63 -0
  698. package/dist/node-sqlite-compat-Ddr_mlR9.mjs.map +1 -0
  699. package/dist/normalize-Ip_hFAm8.mjs +216 -0
  700. package/dist/normalize-Ip_hFAm8.mjs.map +1 -0
  701. package/dist/oauth-authorization-CcMgeT8R.mjs +274 -0
  702. package/dist/oauth-authorization-CcMgeT8R.mjs.map +1 -0
  703. package/dist/oauth-clients-C_osi0PU.mjs +266 -0
  704. package/dist/oauth-clients-C_osi0PU.mjs.map +1 -0
  705. package/dist/oauth-state-store-DGLP-6CK.mjs +50 -0
  706. package/dist/oauth-state-store-DGLP-6CK.mjs.map +1 -0
  707. package/dist/oauth-user-lookup-z77Ee0Hm.mjs +26 -0
  708. package/dist/oauth-user-lookup-z77Ee0Hm.mjs.map +1 -0
  709. package/dist/object-cache/memory.d.mts +1 -1
  710. package/dist/object-cache-EjasjtoQ.mjs +586 -0
  711. package/dist/object-cache-EjasjtoQ.mjs.map +1 -0
  712. package/dist/options-CmUpkyKW.d.mts +81 -0
  713. package/dist/options-CmUpkyKW.d.mts.map +1 -0
  714. package/dist/ownership-DCk5NutQ.mjs +12 -0
  715. package/dist/ownership-DCk5NutQ.mjs.map +1 -0
  716. package/dist/page/index.d.mts +2 -2
  717. package/dist/page/index.mjs +14 -7
  718. package/dist/page/index.mjs.map +1 -1
  719. package/dist/parse-2W-E2f7w.mjs +81 -0
  720. package/dist/parse-2W-E2f7w.mjs.map +1 -0
  721. package/dist/parse-6pN8Xqg5.d.mts +176 -0
  722. package/dist/parse-6pN8Xqg5.d.mts.map +1 -0
  723. package/dist/passkey-config-DTTZB6EI.mjs +46 -0
  724. package/dist/passkey-config-DTTZB6EI.mjs.map +1 -0
  725. package/dist/paths-CQA62503.mjs +77 -0
  726. package/dist/paths-CQA62503.mjs.map +1 -0
  727. package/dist/patterns-CryGz_EV.mjs +159 -0
  728. package/dist/patterns-CryGz_EV.mjs.map +1 -0
  729. package/dist/placeholder-BlfXkucE.d.mts +313 -0
  730. package/dist/placeholder-BlfXkucE.d.mts.map +1 -0
  731. package/dist/plan-B95eiwnF.mjs +135 -0
  732. package/dist/plan-B95eiwnF.mjs.map +1 -0
  733. package/dist/plugin-test-runtime.d.mts +14 -14
  734. package/dist/plugin-test-runtime.d.mts.map +1 -1
  735. package/dist/plugin-test-runtime.mjs +121 -117
  736. package/dist/plugin-tool-name-BDA7m4Xa.mjs +27 -0
  737. package/dist/plugin-tool-name-BDA7m4Xa.mjs.map +1 -0
  738. package/dist/plugin-types.d.mts +2 -2
  739. package/dist/plugin-utils.d.mts +12 -12
  740. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  741. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  742. package/dist/plugins/adapt-sandbox-entry.mjs +9 -8
  743. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  744. package/dist/plugins/host.d.mts +5 -5
  745. package/dist/plugins/host.mjs +57 -51
  746. package/dist/plugins-BhxLJ008.mjs +261 -0
  747. package/dist/plugins-BhxLJ008.mjs.map +1 -0
  748. package/dist/policy-DOJ2sPqB.mjs +53 -0
  749. package/dist/policy-DOJ2sPqB.mjs.map +1 -0
  750. package/dist/portable-text-RCMpCj47.mjs +311 -0
  751. package/dist/portable-text-RCMpCj47.mjs.map +1 -0
  752. package/dist/preview-DFwL5APO.mjs +107 -0
  753. package/dist/preview-DFwL5APO.mjs.map +1 -0
  754. package/dist/protocol-B-ztxp_y.d.mts +65 -0
  755. package/dist/protocol-B-ztxp_y.d.mts.map +1 -0
  756. package/dist/public-plugin-api-routes-ik4fPZMv.mjs +316 -0
  757. package/dist/public-plugin-api-routes-ik4fPZMv.mjs.map +1 -0
  758. package/dist/public-submission-C5JZIykp.mjs +251 -0
  759. package/dist/public-submission-C5JZIykp.mjs.map +1 -0
  760. package/dist/public-url-CQwzRljH.mjs +101 -0
  761. package/dist/public-url-CQwzRljH.mjs.map +1 -0
  762. package/dist/query-BFHjCzSh.mjs +37 -0
  763. package/dist/query-BFHjCzSh.mjs.map +1 -0
  764. package/dist/query-DuwyFr5Z.mjs +41 -0
  765. package/dist/query-DuwyFr5Z.mjs.map +1 -0
  766. package/dist/query-eR_Nz70M.mjs +1157 -0
  767. package/dist/query-eR_Nz70M.mjs.map +1 -0
  768. package/dist/range-BQWPjWgQ.mjs +51 -0
  769. package/dist/range-BQWPjWgQ.mjs.map +1 -0
  770. package/dist/rate-limit-mPKeQ3sm.mjs +127 -0
  771. package/dist/rate-limit-mPKeQ3sm.mjs.map +1 -0
  772. package/dist/receipt-CmUpyuW5.mjs +43 -0
  773. package/dist/receipt-CmUpyuW5.mjs.map +1 -0
  774. package/dist/redirect-BtiMkehU.mjs +19 -0
  775. package/dist/redirect-BtiMkehU.mjs.map +1 -0
  776. package/dist/redirect-DcmNMvOs.mjs +423 -0
  777. package/dist/redirect-DcmNMvOs.mjs.map +1 -0
  778. package/dist/redirect-paths-K5i3xYfR.mjs +36 -0
  779. package/dist/redirect-paths-K5i3xYfR.mjs.map +1 -0
  780. package/dist/redirects-BA_TvtuH.mjs +148 -0
  781. package/dist/redirects-BA_TvtuH.mjs.map +1 -0
  782. package/dist/redirects-BIrRvgn4.mjs +446 -0
  783. package/dist/redirects-BIrRvgn4.mjs.map +1 -0
  784. package/dist/registry/testing.mjs +3 -3
  785. package/dist/registry-DymfZkAN.mjs +8374 -0
  786. package/dist/registry-DymfZkAN.mjs.map +1 -0
  787. package/dist/relations-DrEs3Sc1.mjs +789 -0
  788. package/dist/relations-DrEs3Sc1.mjs.map +1 -0
  789. package/dist/request-cache-5z2WzWmh.mjs +104 -0
  790. package/dist/request-cache-5z2WzWmh.mjs.map +1 -0
  791. package/dist/request-context.d.mts +12 -1
  792. package/dist/request-context.d.mts.map +1 -1
  793. package/dist/request-context.mjs.map +1 -1
  794. package/dist/request-meta-o8RIf9pa.mjs +141 -0
  795. package/dist/request-meta-o8RIf9pa.mjs.map +1 -0
  796. package/dist/resolve-CVy9xgy_.mjs +102 -0
  797. package/dist/resolve-CVy9xgy_.mjs.map +1 -0
  798. package/dist/resolve-DdNXBJSr.mjs +199 -0
  799. package/dist/resolve-DdNXBJSr.mjs.map +1 -0
  800. package/dist/revision-Dx7Uth1X.mjs +374 -0
  801. package/dist/revision-Dx7Uth1X.mjs.map +1 -0
  802. package/dist/route-cache-DAG5dPhh.mjs +20 -0
  803. package/dist/route-cache-DAG5dPhh.mjs.map +1 -0
  804. package/dist/route-wire-Xbsu8Vih.mjs +197 -0
  805. package/dist/route-wire-Xbsu8Vih.mjs.map +1 -0
  806. package/dist/routes-YQkSOsws.mjs +272 -0
  807. package/dist/routes-YQkSOsws.mjs.map +1 -0
  808. package/dist/runner-CLorw5vo.mjs +6669 -0
  809. package/dist/runner-CLorw5vo.mjs.map +1 -0
  810. package/dist/runner-g1A9P-wD.d.mts +73 -0
  811. package/dist/runner-g1A9P-wD.d.mts.map +1 -0
  812. package/dist/runtime.d.mts +13 -13
  813. package/dist/runtime.mjs +6 -4
  814. package/dist/runtime.mjs.map +1 -1
  815. package/dist/schema/project-env-types.mjs +49 -43
  816. package/dist/schema/project-env-types.mjs.map +1 -1
  817. package/dist/schema-Bss8qImF.mjs +13 -0
  818. package/dist/schema-Bss8qImF.mjs.map +1 -0
  819. package/dist/schema-C036pqEw.mjs +815 -0
  820. package/dist/schema-C036pqEw.mjs.map +1 -0
  821. package/dist/scopes-C_SoYl9x.mjs +34 -0
  822. package/dist/scopes-C_SoYl9x.mjs.map +1 -0
  823. package/dist/search-uNqCgePJ.mjs +450 -0
  824. package/dist/search-uNqCgePJ.mjs.map +1 -0
  825. package/dist/sections-BLusMa96.mjs +346 -0
  826. package/dist/sections-BLusMa96.mjs.map +1 -0
  827. package/dist/seed/index.d.mts +2 -2
  828. package/dist/seed/index.mjs +47 -41
  829. package/dist/seo/index.d.mts +3 -3
  830. package/dist/seo/index.mjs +32 -26
  831. package/dist/seo/index.mjs.map +1 -1
  832. package/dist/seo-BodxIpws.mjs +188 -0
  833. package/dist/seo-BodxIpws.mjs.map +1 -0
  834. package/dist/seo-DaMYIQY8.mjs +133 -0
  835. package/dist/seo-DaMYIQY8.mjs.map +1 -0
  836. package/dist/service-BuM1BRsA.mjs +150 -0
  837. package/dist/service-BuM1BRsA.mjs.map +1 -0
  838. package/dist/session-user-2DpQDMKw.mjs +61 -0
  839. package/dist/session-user-2DpQDMKw.mjs.map +1 -0
  840. package/dist/settings-B3ZmPF_8.mjs +73 -0
  841. package/dist/settings-B3ZmPF_8.mjs.map +1 -0
  842. package/dist/settings-P5hwPX6_.mjs +66 -0
  843. package/dist/settings-P5hwPX6_.mjs.map +1 -0
  844. package/dist/settings-yIqoN-Ok.mjs +519 -0
  845. package/dist/settings-yIqoN-Ok.mjs.map +1 -0
  846. package/dist/setup-complete-eu6MUQnt.mjs +65 -0
  847. package/dist/setup-complete-eu6MUQnt.mjs.map +1 -0
  848. package/dist/setup-nonce-CyPOapqY.mjs +25 -0
  849. package/dist/setup-nonce-CyPOapqY.mjs.map +1 -0
  850. package/dist/site-domain-8lEJl_0U.mjs +131 -0
  851. package/dist/site-domain-8lEJl_0U.mjs.map +1 -0
  852. package/dist/site-settings-uPkW0e6o.mjs +50 -0
  853. package/dist/site-settings-uPkW0e6o.mjs.map +1 -0
  854. package/dist/site-url-25SGVXwL.mjs +45 -0
  855. package/dist/site-url-25SGVXwL.mjs.map +1 -0
  856. package/dist/sitemap-name-DTK7CYnY.mjs +26 -0
  857. package/dist/sitemap-name-DTK7CYnY.mjs.map +1 -0
  858. package/dist/slug-BEDl2IJY.mjs +16 -0
  859. package/dist/slug-BEDl2IJY.mjs.map +1 -0
  860. package/dist/slugify-BDEG9pLk.mjs +22 -0
  861. package/dist/slugify-BDEG9pLk.mjs.map +1 -0
  862. package/dist/snapshot-CvkIBRLY.mjs +414 -0
  863. package/dist/snapshot-CvkIBRLY.mjs.map +1 -0
  864. package/dist/ssrf-mcCKMH6B.mjs +406 -0
  865. package/dist/ssrf-mcCKMH6B.mjs.map +1 -0
  866. package/dist/stage-BQfGzGOy.mjs +662 -0
  867. package/dist/stage-BQfGzGOy.mjs.map +1 -0
  868. package/dist/staged-B5vQGeSf.mjs +686 -0
  869. package/dist/staged-B5vQGeSf.mjs.map +1 -0
  870. package/dist/state-dO6t6OxV.mjs +178 -0
  871. package/dist/state-dO6t6OxV.mjs.map +1 -0
  872. package/dist/status-DSURZwKS.mjs +30 -0
  873. package/dist/status-DSURZwKS.mjs.map +1 -0
  874. package/dist/storage/local.d.mts +1 -1
  875. package/dist/storage/local.mjs +3 -3
  876. package/dist/storage/s3.d.mts +1 -1
  877. package/dist/storage/s3.mjs +1 -1
  878. package/dist/storage-query-Cy0SZ8iG.d.mts +1619 -0
  879. package/dist/storage-query-Cy0SZ8iG.d.mts.map +1 -0
  880. package/dist/tar-DWzcUZ_Q.mjs +449 -0
  881. package/dist/tar-DWzcUZ_Q.mjs.map +1 -0
  882. package/dist/target-C9htUbrT.mjs +27 -0
  883. package/dist/target-C9htUbrT.mjs.map +1 -0
  884. package/dist/taxonomies-By2aGvq2.mjs +729 -0
  885. package/dist/taxonomies-By2aGvq2.mjs.map +1 -0
  886. package/dist/taxonomies-CVRd_jz0.mjs +937 -0
  887. package/dist/taxonomies-CVRd_jz0.mjs.map +1 -0
  888. package/dist/taxonomy-BG_xu2Qf.mjs +563 -0
  889. package/dist/taxonomy-BG_xu2Qf.mjs.map +1 -0
  890. package/dist/tokens-U5vzgSrM.mjs +171 -0
  891. package/dist/tokens-U5vzgSrM.mjs.map +1 -0
  892. package/dist/transaction-CkoQ5wqQ.mjs +29 -0
  893. package/dist/transaction-CkoQ5wqQ.mjs.map +1 -0
  894. package/dist/transfer-DA0OSfaT.mjs +8873 -0
  895. package/dist/transfer-DA0OSfaT.mjs.map +1 -0
  896. package/dist/transfer-Pyf3d7ka.mjs +166 -0
  897. package/dist/transfer-Pyf3d7ka.mjs.map +1 -0
  898. package/dist/transfer-download-cX7SuWEy.mjs +33 -0
  899. package/dist/transfer-download-cX7SuWEy.mjs.map +1 -0
  900. package/dist/transformations-DczubD4j.mjs +196 -0
  901. package/dist/transformations-DczubD4j.mjs.map +1 -0
  902. package/dist/transport-Dm5QzpT_.d.mts +42 -0
  903. package/dist/transport-Dm5QzpT_.d.mts.map +1 -0
  904. package/dist/transport-DtIrjEFO.mjs +137 -0
  905. package/dist/transport-DtIrjEFO.mjs.map +1 -0
  906. package/dist/trusted-proxy-CDRd5Kmw.mjs +51 -0
  907. package/dist/trusted-proxy-CDRd5Kmw.mjs.map +1 -0
  908. package/dist/turnstile-Ct5YuFNY.mjs +58 -0
  909. package/dist/turnstile-Ct5YuFNY.mjs.map +1 -0
  910. package/dist/types-Bgujop4S.d.mts +374 -0
  911. package/dist/types-Bgujop4S.d.mts.map +1 -0
  912. package/dist/types-BirHUEXt.mjs +18 -0
  913. package/dist/types-BirHUEXt.mjs.map +1 -0
  914. package/dist/types-BqJgTL_y.d.mts +293 -0
  915. package/dist/types-BqJgTL_y.d.mts.map +1 -0
  916. package/dist/types-C-lrOt9T.d.mts +87 -0
  917. package/dist/types-C-lrOt9T.d.mts.map +1 -0
  918. package/dist/types-CCEHAhOv.d.mts +916 -0
  919. package/dist/types-CCEHAhOv.d.mts.map +1 -0
  920. package/dist/types-CLVwYRBr.d.mts +227 -0
  921. package/dist/types-CLVwYRBr.d.mts.map +1 -0
  922. package/dist/types-C_asjp1J.mjs +201 -0
  923. package/dist/types-C_asjp1J.mjs.map +1 -0
  924. package/dist/types-CadaL_k8.d.mts +366 -0
  925. package/dist/types-CadaL_k8.d.mts.map +1 -0
  926. package/dist/types-DVbTb4Hk.mjs +77 -0
  927. package/dist/types-DVbTb4Hk.mjs.map +1 -0
  928. package/dist/types-Ddku19Zw.d.mts +209 -0
  929. package/dist/types-Ddku19Zw.d.mts.map +1 -0
  930. package/dist/types-DwhEvIVb.mjs +133 -0
  931. package/dist/types-DwhEvIVb.mjs.map +1 -0
  932. package/dist/types-FIiGQ3PE.mjs +16 -0
  933. package/dist/types-FIiGQ3PE.mjs.map +1 -0
  934. package/dist/types-OauzCOY0.mjs +37 -0
  935. package/dist/types-OauzCOY0.mjs.map +1 -0
  936. package/dist/types-mQGTpP-4.d.mts +1741 -0
  937. package/dist/types-mQGTpP-4.d.mts.map +1 -0
  938. package/dist/types-nbjz3Mgm.d.mts +125 -0
  939. package/dist/types-nbjz3Mgm.d.mts.map +1 -0
  940. package/dist/update-check-hW32-0pf.mjs +161 -0
  941. package/dist/update-check-hW32-0pf.mjs.map +1 -0
  942. package/dist/upload-attempts-Bpik1TLF.mjs +32 -0
  943. package/dist/upload-attempts-Bpik1TLF.mjs.map +1 -0
  944. package/dist/url-DTfGDJhI.mjs +104 -0
  945. package/dist/url-DTfGDJhI.mjs.map +1 -0
  946. package/dist/url-pattern-CJeCyNij.mjs +41 -0
  947. package/dist/url-pattern-CJeCyNij.mjs.map +1 -0
  948. package/dist/user-nQInBZbE.mjs +171 -0
  949. package/dist/user-nQInBZbE.mjs.map +1 -0
  950. package/dist/utils-govudc_U.mjs +442 -0
  951. package/dist/utils-govudc_U.mjs.map +1 -0
  952. package/dist/validate-BxLvcDYh.mjs +524 -0
  953. package/dist/validate-BxLvcDYh.mjs.map +1 -0
  954. package/dist/validate-mnoVfASU.d.mts +468 -0
  955. package/dist/validate-mnoVfASU.d.mts.map +1 -0
  956. package/dist/validation-DQDEvh87.mjs +221 -0
  957. package/dist/validation-DQDEvh87.mjs.map +1 -0
  958. package/dist/version-BOFfLiVT.mjs +49 -0
  959. package/dist/version-BOFfLiVT.mjs.map +1 -0
  960. package/dist/version-Dcvx_C9g.mjs +7 -0
  961. package/dist/version-Dcvx_C9g.mjs.map +1 -0
  962. package/dist/version-DzTJ3gD7.mjs +9 -0
  963. package/dist/version-DzTJ3gD7.mjs.map +1 -0
  964. package/dist/video-BX7AI5nJ.mjs +54 -0
  965. package/dist/video-BX7AI5nJ.mjs.map +1 -0
  966. package/dist/virtual-modules-CU29aip9.mjs +515 -0
  967. package/dist/virtual-modules-CU29aip9.mjs.map +1 -0
  968. package/dist/widgets-HIeFmZxt.mjs +121 -0
  969. package/dist/widgets-HIeFmZxt.mjs.map +1 -0
  970. package/dist/wxr-taxonomies-Dy2i2ON3.d.mts +34 -0
  971. package/dist/wxr-taxonomies-Dy2i2ON3.d.mts.map +1 -0
  972. package/dist/wxr-taxonomies-DyOGhl8W.mjs +454 -0
  973. package/dist/wxr-taxonomies-DyOGhl8W.mjs.map +1 -0
  974. package/dist/zod-generator-VxCPVDpo.mjs +425 -0
  975. package/dist/zod-generator-VxCPVDpo.mjs.map +1 -0
  976. package/package.json +7 -6
  977. package/src/api/authorize.ts +42 -0
  978. package/src/api/handlers/bulk-tag.ts +11 -3
  979. package/src/api/handlers/bylines.ts +6 -2
  980. package/src/api/handlers/content.ts +107 -7
  981. package/src/api/handlers/dashboard.ts +44 -14
  982. package/src/api/handlers/manifest.ts +1 -0
  983. package/src/api/handlers/menus.ts +24 -10
  984. package/src/api/handlers/plugins.ts +1 -0
  985. package/src/api/handlers/relations.ts +15 -1
  986. package/src/api/handlers/revision.ts +6 -2
  987. package/src/api/handlers/site-domain.ts +26 -10
  988. package/src/api/handlers/taxonomies.ts +27 -17
  989. package/src/api/schemas/settings.ts +2 -0
  990. package/src/api/types.ts +2 -0
  991. package/src/astro/image-endpoint.ts +23 -2
  992. package/src/astro/integration/dev-scheduler-bridge.ts +91 -0
  993. package/src/astro/integration/index.ts +48 -1
  994. package/src/astro/integration/routes.ts +8 -0
  995. package/src/astro/integration/runtime.ts +2 -1
  996. package/src/astro/integration/virtual-modules.ts +9 -16
  997. package/src/astro/integration/vite-config.ts +20 -23
  998. package/src/astro/middleware/auth.ts +3 -1
  999. package/src/astro/middleware/redirect.ts +202 -78
  1000. package/src/astro/middleware/request-context.ts +1 -0
  1001. package/src/astro/middleware.ts +35 -7
  1002. package/src/astro/prefetch.ts +7 -5
  1003. package/src/astro/public-plugin-api-routes.ts +10 -2
  1004. package/src/astro/routes/api/admin/plugins/registry/artifact.ts +1 -1
  1005. package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -1
  1006. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +1 -5
  1007. package/src/astro/routes/api/content/[collection]/[id]/lock.ts +2 -2
  1008. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -1
  1009. package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
  1010. package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -1
  1011. package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +3 -2
  1012. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +9 -5
  1013. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +14 -1
  1014. package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -1
  1015. package/src/astro/routes/api/content/[collection]/[id].ts +18 -6
  1016. package/src/astro/routes/api/content/[collection]/index.ts +1 -5
  1017. package/src/astro/routes/api/dashboard.ts +6 -1
  1018. package/src/astro/routes/api/dev/scheduled-tasks.ts +20 -0
  1019. package/src/astro/routes/api/import/wordpress/analyze.ts +1 -16
  1020. package/src/astro/routes/api/import/wordpress/execute.ts +8 -3
  1021. package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +4 -1
  1022. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +34 -5
  1023. package/src/astro/routes/api/media/file/[...key].ts +13 -3
  1024. package/src/astro/routes/api/menus/[name]/items/[id].ts +3 -2
  1025. package/src/astro/routes/api/menus/[name]/items.ts +2 -1
  1026. package/src/astro/routes/api/menus/[name]/reorder.ts +2 -1
  1027. package/src/astro/routes/api/menus/[name]/translations.ts +2 -1
  1028. package/src/astro/routes/api/menus/[name].ts +3 -2
  1029. package/src/astro/routes/api/menus/index.ts +2 -1
  1030. package/src/astro/routes/api/redirects/[id].ts +15 -2
  1031. package/src/astro/routes/api/redirects/index.ts +5 -1
  1032. package/src/astro/routes/api/settings/domain.ts +2 -1
  1033. package/src/astro/routes/api/settings.ts +2 -1
  1034. package/src/astro/routes/api/setup/admin-verify.ts +7 -1
  1035. package/src/astro/routes/api/taxonomies/[name]/reorder.ts +2 -1
  1036. package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +2 -1
  1037. package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +3 -2
  1038. package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +2 -1
  1039. package/src/astro/routes/api/taxonomies/[name].ts +3 -2
  1040. package/src/astro/routes/api/taxonomies/index.ts +2 -1
  1041. package/src/astro/routes/api/widget-areas/[name]/reorder.ts +2 -1
  1042. package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +3 -2
  1043. package/src/astro/routes/api/widget-areas/[name]/widgets.ts +2 -1
  1044. package/src/astro/routes/api/widget-areas/[name].ts +2 -1
  1045. package/src/astro/routes/api/widget-areas/index.ts +2 -1
  1046. package/src/astro/routes/robots.txt.ts +33 -2
  1047. package/src/astro/types.ts +10 -1
  1048. package/src/auth/types.ts +10 -4
  1049. package/src/cache/redirect-paths.ts +56 -0
  1050. package/src/cache/route-cache.ts +22 -0
  1051. package/src/cli/commands/export-seed.ts +6 -4
  1052. package/src/cli/commands/import/wordpress.ts +3 -27
  1053. package/src/cli/commands/login.ts +37 -47
  1054. package/src/cli/commands/migrate.ts +36 -4
  1055. package/src/cli/commands/seed.ts +18 -8
  1056. package/src/cli/wxr/parser.ts +2 -2
  1057. package/src/client/index.ts +13 -2
  1058. package/src/client/portable-text.ts +21 -7
  1059. package/src/client/transport.ts +11 -7
  1060. package/src/comments/query.ts +8 -2
  1061. package/src/components/CommentForm.astro +2 -2
  1062. package/src/components/Comments.astro +1 -1
  1063. package/src/components/EmDashImage.astro +14 -2
  1064. package/src/components/InlinePortableTextEditor.tsx +156 -1326
  1065. package/src/components/inline-block-types.ts +278 -0
  1066. package/src/components/inline-bubble-menu.tsx +696 -0
  1067. package/src/components/inline-editor-ui.tsx +1192 -0
  1068. package/src/components/inline-image.tsx +722 -0
  1069. package/src/components/inline-media-picker.tsx +1221 -0
  1070. package/src/components/inline-slash-menu.tsx +556 -0
  1071. package/src/database/collection-cleanup.ts +30 -0
  1072. package/src/database/datetime-storage.ts +337 -60
  1073. package/src/database/migration-lock.ts +43 -7
  1074. package/src/database/migrations/content-sized.ts +82 -0
  1075. package/src/database/migrations/policy.ts +28 -2
  1076. package/src/database/migrations/runner.ts +48 -0
  1077. package/src/database/repositories/byline.ts +73 -17
  1078. package/src/database/repositories/comment.ts +17 -7
  1079. package/src/database/repositories/content.ts +82 -20
  1080. package/src/database/repositories/menu.ts +77 -11
  1081. package/src/database/repositories/plugin-storage.ts +109 -8
  1082. package/src/database/repositories/revision.ts +24 -6
  1083. package/src/database/repositories/taxonomy-def.ts +9 -2
  1084. package/src/database/repositories/taxonomy.ts +47 -14
  1085. package/src/database/repositories/types.ts +76 -7
  1086. package/src/emdash-runtime.ts +213 -170
  1087. package/src/fields/image.ts +1 -0
  1088. package/src/i18n/config.ts +58 -10
  1089. package/src/i18n/normalize.ts +16 -2
  1090. package/src/i18n/query.ts +47 -0
  1091. package/src/i18n/resolve.ts +8 -3
  1092. package/src/import/index.ts +1 -0
  1093. package/src/import/registry.ts +17 -0
  1094. package/src/import/sources/wordpress-plugin.ts +151 -9
  1095. package/src/import/types.ts +3 -0
  1096. package/src/import/utils.ts +5 -0
  1097. package/src/import/wxr-taxonomies.ts +3 -2
  1098. package/src/loader.ts +116 -24
  1099. package/src/mcp/json-schema.ts +14 -0
  1100. package/src/mcp/plugin-tool-name.ts +36 -0
  1101. package/src/mcp/server.ts +102 -16
  1102. package/src/media/caption.ts +30 -0
  1103. package/src/media/image-endpoint.ts +13 -6
  1104. package/src/media/local-runtime.ts +3 -0
  1105. package/src/media/normalize.ts +15 -8
  1106. package/src/media/responsive.ts +12 -2
  1107. package/src/media/types.ts +16 -3
  1108. package/src/media/usage/collection-deletion.ts +4 -0
  1109. package/src/menus/index.ts +21 -11
  1110. package/src/migrations/direct-executor.ts +42 -12
  1111. package/src/migrations/manifest.ts +1 -0
  1112. package/src/migrations/protocol.ts +6 -2
  1113. package/src/plugins/adapt-sandbox-entry.ts +16 -6
  1114. package/src/plugins/byline-access.ts +3 -1
  1115. package/src/plugins/context.ts +1 -2
  1116. package/src/plugins/state.ts +5 -8
  1117. package/src/plugins/storage-indexes.ts +7 -3
  1118. package/src/query.ts +74 -23
  1119. package/src/redirects/artifacts.ts +39 -5
  1120. package/src/redirects/cache.ts +34 -2
  1121. package/src/references/field-map.ts +6 -4
  1122. package/src/request-context.ts +8 -0
  1123. package/src/schema/block-values.ts +80 -17
  1124. package/src/schema/collection-slugs-cache.ts +31 -17
  1125. package/src/schema/registry.ts +18 -1
  1126. package/src/schema/zod-generator.ts +2 -1
  1127. package/src/search/fts-manager.ts +98 -28
  1128. package/src/search/query.ts +34 -65
  1129. package/src/seed/apply.ts +222 -94
  1130. package/src/seed/types.ts +3 -1
  1131. package/src/settings/index.ts +155 -35
  1132. package/src/settings/types.ts +2 -0
  1133. package/src/settings/version.ts +54 -0
  1134. package/src/taxonomies/index.ts +95 -52
  1135. package/src/taxonomies/term-counts.ts +2 -1
  1136. package/src/utils/db-errors.ts +15 -0
  1137. package/src/virtual-modules.d.ts +1 -0
  1138. package/src/visual-editing/toolbar.ts +46 -12
  1139. package/dist/action-token-BdWad2YG.mjs +0 -26
  1140. package/dist/action-token-BdWad2YG.mjs.map +0 -1
  1141. package/dist/activation-xomsCMJg.mjs +0 -387
  1142. package/dist/activation-xomsCMJg.mjs.map +0 -1
  1143. package/dist/adapters-B4-nbElt.d.mts +0 -173
  1144. package/dist/adapters-B4-nbElt.d.mts.map +0 -1
  1145. package/dist/allowed-origins-CLpHGGlc.mjs +0 -116
  1146. package/dist/allowed-origins-CLpHGGlc.mjs.map +0 -1
  1147. package/dist/api-DBw_IWoi.mjs +0 -5024
  1148. package/dist/api-DBw_IWoi.mjs.map +0 -1
  1149. package/dist/api-tokens-B0ZipcZ-.mjs +0 -173
  1150. package/dist/api-tokens-B0ZipcZ-.mjs.map +0 -1
  1151. package/dist/apply-Cx48saFC.mjs +0 -1680
  1152. package/dist/apply-Cx48saFC.mjs.map +0 -1
  1153. package/dist/approvals-BXgtXA2s.mjs +0 -460
  1154. package/dist/approvals-BXgtXA2s.mjs.map +0 -1
  1155. package/dist/artifact-fetch-DsRczRGG.mjs +0 -659
  1156. package/dist/artifact-fetch-DsRczRGG.mjs.map +0 -1
  1157. package/dist/artifacts-D-O-qj9C.mjs +0 -307
  1158. package/dist/artifacts-D-O-qj9C.mjs.map +0 -1
  1159. package/dist/audit-CCH3MA4Y.mjs +0 -127
  1160. package/dist/audit-CCH3MA4Y.mjs.map +0 -1
  1161. package/dist/authoritative-records-Dcs7l2H5.mjs +0 -5183
  1162. package/dist/authoritative-records-Dcs7l2H5.mjs.map +0 -1
  1163. package/dist/authorize-TdIGpRSE.mjs +0 -49
  1164. package/dist/authorize-TdIGpRSE.mjs.map +0 -1
  1165. package/dist/backup-CZt5Mzwx.mjs +0 -246
  1166. package/dist/backup-CZt5Mzwx.mjs.map +0 -1
  1167. package/dist/block-types-DHnkzE6u.mjs +0 -132
  1168. package/dist/block-types-DHnkzE6u.mjs.map +0 -1
  1169. package/dist/block-values-C4N_F2-G.mjs +0 -175
  1170. package/dist/block-values-C4N_F2-G.mjs.map +0 -1
  1171. package/dist/byline-BmVKOQ8l.mjs +0 -909
  1172. package/dist/byline-BmVKOQ8l.mjs.map +0 -1
  1173. package/dist/byline-fields-B8SDs3M_.mjs +0 -123
  1174. package/dist/byline-fields-B8SDs3M_.mjs.map +0 -1
  1175. package/dist/byline-fields-Bze3ZdAw.mjs +0 -280
  1176. package/dist/byline-fields-Bze3ZdAw.mjs.map +0 -1
  1177. package/dist/byline-registry-dvt4N3xV.mjs +0 -406
  1178. package/dist/byline-registry-dvt4N3xV.mjs.map +0 -1
  1179. package/dist/bylines-CHhR28r9.mjs +0 -150
  1180. package/dist/bylines-CHhR28r9.mjs.map +0 -1
  1181. package/dist/bylines-DZS4OflA.mjs +0 -234
  1182. package/dist/bylines-DZS4OflA.mjs.map +0 -1
  1183. package/dist/cache-x0z8t_m9.mjs +0 -133
  1184. package/dist/cache-x0z8t_m9.mjs.map +0 -1
  1185. package/dist/canonical-BUcKRYpG.mjs +0 -174
  1186. package/dist/canonical-BUcKRYpG.mjs.map +0 -1
  1187. package/dist/capture-triggers-C9JKoIdT.mjs +0 -362
  1188. package/dist/capture-triggers-C9JKoIdT.mjs.map +0 -1
  1189. package/dist/challenge-store-BHgdPVze.mjs +0 -51
  1190. package/dist/challenge-store-BHgdPVze.mjs.map +0 -1
  1191. package/dist/checksum-BYR5i7qe.mjs +0 -162
  1192. package/dist/checksum-BYR5i7qe.mjs.map +0 -1
  1193. package/dist/chrome-tags-BIKBMZYO.mjs +0 -24
  1194. package/dist/chrome-tags-BIKBMZYO.mjs.map +0 -1
  1195. package/dist/chunks-Dr5Vr0zA.mjs +0 -25
  1196. package/dist/chunks-Dr5Vr0zA.mjs.map +0 -1
  1197. package/dist/collection-slugs-cache-B2Gs9Jwx.mjs +0 -85
  1198. package/dist/collection-slugs-cache-B2Gs9Jwx.mjs.map +0 -1
  1199. package/dist/comment-CWla6OHV.mjs +0 -325
  1200. package/dist/comment-CWla6OHV.mjs.map +0 -1
  1201. package/dist/comment-reaction-RZrcs5cW.mjs +0 -85
  1202. package/dist/comment-reaction-RZrcs5cW.mjs.map +0 -1
  1203. package/dist/comments-BzmIKVb2.mjs +0 -99
  1204. package/dist/comments-BzmIKVb2.mjs.map +0 -1
  1205. package/dist/comments-Da_dI2O1.mjs +0 -195
  1206. package/dist/comments-Da_dI2O1.mjs.map +0 -1
  1207. package/dist/components-oFXumpf5.mjs +0 -112
  1208. package/dist/components-oFXumpf5.mjs.map +0 -1
  1209. package/dist/config--wamYxBW.d.mts +0 -39
  1210. package/dist/config--wamYxBW.d.mts.map +0 -1
  1211. package/dist/config-Bo4eOOdV.mjs +0 -228
  1212. package/dist/config-Bo4eOOdV.mjs.map +0 -1
  1213. package/dist/config-C4-UxIk7.d.mts +0 -6790
  1214. package/dist/config-C4-UxIk7.d.mts.map +0 -1
  1215. package/dist/config-CvmjJcVw.mjs +0 -73
  1216. package/dist/config-CvmjJcVw.mjs.map +0 -1
  1217. package/dist/connection-UpzYxtE2.mjs +0 -36
  1218. package/dist/connection-UpzYxtE2.mjs.map +0 -1
  1219. package/dist/content-CcHrqkgp.mjs +0 -2072
  1220. package/dist/content-CcHrqkgp.mjs.map +0 -1
  1221. package/dist/content-list-query-Bxxdd9fv.d.mts +0 -26
  1222. package/dist/content-list-query-Bxxdd9fv.d.mts.map +0 -1
  1223. package/dist/content-policy-Dm32n9C6.mjs +0 -46
  1224. package/dist/content-policy-Dm32n9C6.mjs.map +0 -1
  1225. package/dist/content-repair-havk1F0-.mjs +0 -442
  1226. package/dist/content-repair-havk1F0-.mjs.map +0 -1
  1227. package/dist/context-CvhgHgSH.mjs +0 -2043
  1228. package/dist/context-CvhgHgSH.mjs.map +0 -1
  1229. package/dist/credits-CygUrPOi.mjs +0 -110
  1230. package/dist/credits-CygUrPOi.mjs.map +0 -1
  1231. package/dist/cron-C6ytTOLw.mjs +0 -306
  1232. package/dist/cron-C6ytTOLw.mjs.map +0 -1
  1233. package/dist/dashboard-7_FYfafc.mjs +0 -151
  1234. package/dist/dashboard-7_FYfafc.mjs.map +0 -1
  1235. package/dist/db-errors-CBD5yMro.mjs +0 -55
  1236. package/dist/db-errors-CBD5yMro.mjs.map +0 -1
  1237. package/dist/default-CHCUkV4Z.mjs +0 -81
  1238. package/dist/default-CHCUkV4Z.mjs.map +0 -1
  1239. package/dist/deferred-tasks-G0xhcJTl.d.mts +0 -9
  1240. package/dist/deferred-tasks-G0xhcJTl.d.mts.map +0 -1
  1241. package/dist/destination-r2zIAZ2S.mjs +0 -18
  1242. package/dist/destination-r2zIAZ2S.mjs.map +0 -1
  1243. package/dist/dev-typegen-Dtl8AfS6.mjs +0 -29
  1244. package/dist/dev-typegen-Dtl8AfS6.mjs.map +0 -1
  1245. package/dist/device-flow-CzDJmQ1q.mjs +0 -521
  1246. package/dist/device-flow-CzDJmQ1q.mjs.map +0 -1
  1247. package/dist/digest-xJmyPv2r.mjs +0 -194
  1248. package/dist/digest-xJmyPv2r.mjs.map +0 -1
  1249. package/dist/direct-executor-BXiYIVJ9.mjs +0 -104
  1250. package/dist/direct-executor-BXiYIVJ9.mjs.map +0 -1
  1251. package/dist/dist-Cfu8mMBs.mjs +0 -810
  1252. package/dist/dist-Cfu8mMBs.mjs.map +0 -1
  1253. package/dist/email-console-7ZPApLlm.mjs +0 -50
  1254. package/dist/email-console-7ZPApLlm.mjs.map +0 -1
  1255. package/dist/email-locale-DFdUA6UF.mjs +0 -25
  1256. package/dist/email-locale-DFdUA6UF.mjs.map +0 -1
  1257. package/dist/emdash-runtime-C4oFeVpN.mjs +0 -4363
  1258. package/dist/emdash-runtime-C4oFeVpN.mjs.map +0 -1
  1259. package/dist/enrich-Duu4sV3a.mjs +0 -194
  1260. package/dist/enrich-Duu4sV3a.mjs.map +0 -1
  1261. package/dist/entry-lock-B4n0HdQ_.mjs +0 -163
  1262. package/dist/entry-lock-B4n0HdQ_.mjs.map +0 -1
  1263. package/dist/entry-lock-BAAlKYrz.d.mts +0 -4566
  1264. package/dist/entry-lock-BAAlKYrz.d.mts.map +0 -1
  1265. package/dist/entry-lock-Cjz0h45X.mjs +0 -1209
  1266. package/dist/entry-lock-Cjz0h45X.mjs.map +0 -1
  1267. package/dist/entry-locks-DJAqVweV.mjs +0 -167
  1268. package/dist/entry-locks-DJAqVweV.mjs.map +0 -1
  1269. package/dist/env-types-4bkF6Bqg.mjs +0 -38
  1270. package/dist/env-types-4bkF6Bqg.mjs.map +0 -1
  1271. package/dist/error-DxgQdaZ_.mjs +0 -90
  1272. package/dist/error-DxgQdaZ_.mjs.map +0 -1
  1273. package/dist/errors-CjtE5aWF.mjs +0 -120
  1274. package/dist/errors-CjtE5aWF.mjs.map +0 -1
  1275. package/dist/errors-hskQ0C8G.mjs +0 -479
  1276. package/dist/errors-hskQ0C8G.mjs.map +0 -1
  1277. package/dist/escape-ESFhYzwG.mjs +0 -9
  1278. package/dist/escape-ESFhYzwG.mjs.map +0 -1
  1279. package/dist/fence-vc3aHgRA.mjs +0 -162
  1280. package/dist/fence-vc3aHgRA.mjs.map +0 -1
  1281. package/dist/field-defs-cache-zoow36nz.mjs +0 -77
  1282. package/dist/field-defs-cache-zoow36nz.mjs.map +0 -1
  1283. package/dist/field-map-JD1wG0Tq.mjs +0 -83
  1284. package/dist/field-map-JD1wG0Tq.mjs.map +0 -1
  1285. package/dist/focal-point-JX8kcOTQ.mjs +0 -23
  1286. package/dist/focal-point-JX8kcOTQ.mjs.map +0 -1
  1287. package/dist/fts-manager-WJCN8uU6.mjs +0 -443
  1288. package/dist/fts-manager-WJCN8uU6.mjs.map +0 -1
  1289. package/dist/gc-CsGZiKdH.mjs +0 -75
  1290. package/dist/gc-CsGZiKdH.mjs.map +0 -1
  1291. package/dist/hash-C4DFoJ7Z.mjs +0 -37
  1292. package/dist/hash-C4DFoJ7Z.mjs.map +0 -1
  1293. package/dist/hook-result-CXjtMk7Q.d.mts +0 -31
  1294. package/dist/hook-result-CXjtMk7Q.d.mts.map +0 -1
  1295. package/dist/hreflang-BAma7iRr.mjs +0 -105
  1296. package/dist/hreflang-BAma7iRr.mjs.map +0 -1
  1297. package/dist/hreflang-BsYo4x_M.d.mts +0 -50
  1298. package/dist/hreflang-BsYo4x_M.d.mts.map +0 -1
  1299. package/dist/http-route-dispatch-C8G7hAK6.mjs +0 -342
  1300. package/dist/http-route-dispatch-C8G7hAK6.mjs.map +0 -1
  1301. package/dist/identity-BwBKM1fH.mjs +0 -35
  1302. package/dist/identity-BwBKM1fH.mjs.map +0 -1
  1303. package/dist/import-DJ3Z2wxE.mjs +0 -2021
  1304. package/dist/import-DJ3Z2wxE.mjs.map +0 -1
  1305. package/dist/index-DYsn97dY.d.mts +0 -623
  1306. package/dist/index-DYsn97dY.d.mts.map +0 -1
  1307. package/dist/install-finalization-DCFnFSHv.mjs +0 -58
  1308. package/dist/install-finalization-DCFnFSHv.mjs.map +0 -1
  1309. package/dist/keys-CGvAndSp.mjs +0 -61
  1310. package/dist/keys-CGvAndSp.mjs.map +0 -1
  1311. package/dist/kinds-DT1W4T4Y.mjs +0 -974
  1312. package/dist/kinds-DT1W4T4Y.mjs.map +0 -1
  1313. package/dist/lifecycle-BzglCSY0.mjs +0 -25
  1314. package/dist/lifecycle-BzglCSY0.mjs.map +0 -1
  1315. package/dist/load-DjUqmf3s.mjs +0 -28
  1316. package/dist/load-DjUqmf3s.mjs.map +0 -1
  1317. package/dist/loader-CetY659y.mjs +0 -1355
  1318. package/dist/loader-CetY659y.mjs.map +0 -1
  1319. package/dist/loops-DkT1zkPH.mjs +0 -205
  1320. package/dist/loops-DkT1zkPH.mjs.map +0 -1
  1321. package/dist/manifest-builder-BOFCd9rX.mjs +0 -189
  1322. package/dist/manifest-builder-BOFCd9rX.mjs.map +0 -1
  1323. package/dist/manifest-schema-BiFBPEsp.mjs +0 -497
  1324. package/dist/manifest-schema-BiFBPEsp.mjs.map +0 -1
  1325. package/dist/marketplace-CUlenvZm.mjs +0 -257
  1326. package/dist/marketplace-CUlenvZm.mjs.map +0 -1
  1327. package/dist/media-CRKsKlfK.mjs +0 -416
  1328. package/dist/media-CRKsKlfK.mjs.map +0 -1
  1329. package/dist/media-C_z7sRuC.mjs +0 -294
  1330. package/dist/media-C_z7sRuC.mjs.map +0 -1
  1331. package/dist/media-IT8hQleU.mjs +0 -373
  1332. package/dist/media-IT8hQleU.mjs.map +0 -1
  1333. package/dist/media-allowlist-Ct6wvnT2.mjs +0 -45
  1334. package/dist/media-allowlist-Ct6wvnT2.mjs.map +0 -1
  1335. package/dist/media-folders-DtMt-vAA.mjs +0 -210
  1336. package/dist/media-folders-DtMt-vAA.mjs.map +0 -1
  1337. package/dist/media-url-BpXLqCmf.mjs +0 -43
  1338. package/dist/media-url-BpXLqCmf.mjs.map +0 -1
  1339. package/dist/media-usage-DEPHZZ9X.mjs +0 -282
  1340. package/dist/media-usage-DEPHZZ9X.mjs.map +0 -1
  1341. package/dist/media-usage-activation-V2Siabtw.mjs +0 -78
  1342. package/dist/media-usage-activation-V2Siabtw.mjs.map +0 -1
  1343. package/dist/media-usage-work-Cv1OE59F.mjs +0 -151
  1344. package/dist/media-usage-work-Cv1OE59F.mjs.map +0 -1
  1345. package/dist/media-usage-work-cgDYGvrt.mjs +0 -1015
  1346. package/dist/media-usage-work-cgDYGvrt.mjs.map +0 -1
  1347. package/dist/menus-CvVYfsuk.mjs +0 -753
  1348. package/dist/menus-CvVYfsuk.mjs.map +0 -1
  1349. package/dist/menus-D1HC8npj.mjs +0 -92
  1350. package/dist/menus-D1HC8npj.mjs.map +0 -1
  1351. package/dist/menus-DL8IPIcm.mjs +0 -3721
  1352. package/dist/menus-DL8IPIcm.mjs.map +0 -1
  1353. package/dist/mime-B5M9R53H.mjs +0 -81
  1354. package/dist/mime-B5M9R53H.mjs.map +0 -1
  1355. package/dist/mode-eieqAWLe.mjs +0 -23
  1356. package/dist/mode-eieqAWLe.mjs.map +0 -1
  1357. package/dist/node-sqlite-compat-VuyzJw1b.mjs +0 -63
  1358. package/dist/node-sqlite-compat-VuyzJw1b.mjs.map +0 -1
  1359. package/dist/normalize-BuWa0lvd.mjs +0 -191
  1360. package/dist/normalize-BuWa0lvd.mjs.map +0 -1
  1361. package/dist/oauth-authorization-B6ZJbMd2.mjs +0 -274
  1362. package/dist/oauth-authorization-B6ZJbMd2.mjs.map +0 -1
  1363. package/dist/oauth-clients-DVjRc9v3.mjs +0 -266
  1364. package/dist/oauth-clients-DVjRc9v3.mjs.map +0 -1
  1365. package/dist/oauth-state-store-CnmYYsVQ.mjs +0 -50
  1366. package/dist/oauth-state-store-CnmYYsVQ.mjs.map +0 -1
  1367. package/dist/oauth-user-lookup-Dz1_R5vT.mjs +0 -26
  1368. package/dist/oauth-user-lookup-Dz1_R5vT.mjs.map +0 -1
  1369. package/dist/object-cache-Bo6DGaC9.mjs +0 -586
  1370. package/dist/object-cache-Bo6DGaC9.mjs.map +0 -1
  1371. package/dist/options-BR9XZl7h.d.mts +0 -81
  1372. package/dist/options-BR9XZl7h.d.mts.map +0 -1
  1373. package/dist/ownership-COPyVysP.mjs +0 -12
  1374. package/dist/ownership-COPyVysP.mjs.map +0 -1
  1375. package/dist/parse-BOGhrwSq.d.mts +0 -174
  1376. package/dist/parse-BOGhrwSq.d.mts.map +0 -1
  1377. package/dist/parse-Cn5aSk1N.mjs +0 -81
  1378. package/dist/parse-Cn5aSk1N.mjs.map +0 -1
  1379. package/dist/passkey-config-mMFRQUCj.mjs +0 -46
  1380. package/dist/passkey-config-mMFRQUCj.mjs.map +0 -1
  1381. package/dist/paths-BmcAdBo9.mjs +0 -77
  1382. package/dist/paths-BmcAdBo9.mjs.map +0 -1
  1383. package/dist/patterns-CMNnYCgf.mjs +0 -159
  1384. package/dist/patterns-CMNnYCgf.mjs.map +0 -1
  1385. package/dist/placeholder-nOep3_Gn.d.mts +0 -306
  1386. package/dist/placeholder-nOep3_Gn.d.mts.map +0 -1
  1387. package/dist/plan-CDY4K8CH.mjs +0 -135
  1388. package/dist/plan-CDY4K8CH.mjs.map +0 -1
  1389. package/dist/plugins-DFBpfbO3.mjs +0 -261
  1390. package/dist/plugins-DFBpfbO3.mjs.map +0 -1
  1391. package/dist/policy-B_2qnHSy.mjs +0 -45
  1392. package/dist/policy-B_2qnHSy.mjs.map +0 -1
  1393. package/dist/portable-text-Dc2YAusw.mjs +0 -307
  1394. package/dist/portable-text-Dc2YAusw.mjs.map +0 -1
  1395. package/dist/preview-BtzikJ9O.mjs +0 -107
  1396. package/dist/preview-BtzikJ9O.mjs.map +0 -1
  1397. package/dist/protocol-M268ox8L.d.mts +0 -61
  1398. package/dist/protocol-M268ox8L.d.mts.map +0 -1
  1399. package/dist/public-submission-BQZavgZU.mjs +0 -251
  1400. package/dist/public-submission-BQZavgZU.mjs.map +0 -1
  1401. package/dist/public-url-uT1Ok2Tu.mjs +0 -101
  1402. package/dist/public-url-uT1Ok2Tu.mjs.map +0 -1
  1403. package/dist/query-BGG3sDEd.mjs +0 -1127
  1404. package/dist/query-BGG3sDEd.mjs.map +0 -1
  1405. package/dist/query-C_CWlifp.mjs +0 -41
  1406. package/dist/query-C_CWlifp.mjs.map +0 -1
  1407. package/dist/range-CXK_kDbI.mjs +0 -51
  1408. package/dist/range-CXK_kDbI.mjs.map +0 -1
  1409. package/dist/rate-limit-Dvamvay-.mjs +0 -127
  1410. package/dist/rate-limit-Dvamvay-.mjs.map +0 -1
  1411. package/dist/receipt-BmQGzquP.mjs +0 -43
  1412. package/dist/receipt-BmQGzquP.mjs.map +0 -1
  1413. package/dist/redirect-B39kTQ_0.mjs +0 -423
  1414. package/dist/redirect-B39kTQ_0.mjs.map +0 -1
  1415. package/dist/redirect-BguJ00Pv.mjs +0 -19
  1416. package/dist/redirect-BguJ00Pv.mjs.map +0 -1
  1417. package/dist/redirects-C8G4BsfP.mjs +0 -446
  1418. package/dist/redirects-C8G4BsfP.mjs.map +0 -1
  1419. package/dist/redirects-DFT7Wr-e.mjs +0 -148
  1420. package/dist/redirects-DFT7Wr-e.mjs.map +0 -1
  1421. package/dist/registry-DeZ27gVi.mjs +0 -8374
  1422. package/dist/registry-DeZ27gVi.mjs.map +0 -1
  1423. package/dist/relations-DBB1bRJW.mjs +0 -776
  1424. package/dist/relations-DBB1bRJW.mjs.map +0 -1
  1425. package/dist/request-cache-C4CIo5ad.mjs +0 -104
  1426. package/dist/request-cache-C4CIo5ad.mjs.map +0 -1
  1427. package/dist/request-meta-BSvkhIBX.mjs +0 -141
  1428. package/dist/request-meta-BSvkhIBX.mjs.map +0 -1
  1429. package/dist/resolve-BxH64HN9.mjs +0 -100
  1430. package/dist/resolve-BxH64HN9.mjs.map +0 -1
  1431. package/dist/resolve-D-kqyKns.mjs +0 -199
  1432. package/dist/resolve-D-kqyKns.mjs.map +0 -1
  1433. package/dist/revision-BWEH2qQB.mjs +0 -368
  1434. package/dist/revision-BWEH2qQB.mjs.map +0 -1
  1435. package/dist/route-wire-CwbWB_6O.mjs +0 -197
  1436. package/dist/route-wire-CwbWB_6O.mjs.map +0 -1
  1437. package/dist/routes-BfIxc7ft.mjs +0 -272
  1438. package/dist/routes-BfIxc7ft.mjs.map +0 -1
  1439. package/dist/runner-DkeafPBA.d.mts +0 -68
  1440. package/dist/runner-DkeafPBA.d.mts.map +0 -1
  1441. package/dist/runner-wqt4BrIW.mjs +0 -6383
  1442. package/dist/runner-wqt4BrIW.mjs.map +0 -1
  1443. package/dist/schema-BXIW-JHi.mjs +0 -815
  1444. package/dist/schema-BXIW-JHi.mjs.map +0 -1
  1445. package/dist/schema-I74JwYte.mjs +0 -13
  1446. package/dist/schema-I74JwYte.mjs.map +0 -1
  1447. package/dist/scopes-RWZ5ft_Z.mjs +0 -34
  1448. package/dist/scopes-RWZ5ft_Z.mjs.map +0 -1
  1449. package/dist/search-DxwagyWS.mjs +0 -450
  1450. package/dist/search-DxwagyWS.mjs.map +0 -1
  1451. package/dist/sections-Ccq9ZgyD.mjs +0 -346
  1452. package/dist/sections-Ccq9ZgyD.mjs.map +0 -1
  1453. package/dist/seo-CCnfPWAQ.mjs +0 -133
  1454. package/dist/seo-CCnfPWAQ.mjs.map +0 -1
  1455. package/dist/seo-QCtJ1jjV.mjs +0 -188
  1456. package/dist/seo-QCtJ1jjV.mjs.map +0 -1
  1457. package/dist/service-DX84s2rw.mjs +0 -150
  1458. package/dist/service-DX84s2rw.mjs.map +0 -1
  1459. package/dist/session-user-1dtJc2zv.mjs +0 -61
  1460. package/dist/session-user-1dtJc2zv.mjs.map +0 -1
  1461. package/dist/settings-B1jOxAIl.mjs +0 -443
  1462. package/dist/settings-B1jOxAIl.mjs.map +0 -1
  1463. package/dist/settings-Bc1IBl1t.mjs +0 -66
  1464. package/dist/settings-Bc1IBl1t.mjs.map +0 -1
  1465. package/dist/settings-GaZ5sVgg.mjs +0 -73
  1466. package/dist/settings-GaZ5sVgg.mjs.map +0 -1
  1467. package/dist/setup-complete-DidMAWJS.mjs +0 -65
  1468. package/dist/setup-complete-DidMAWJS.mjs.map +0 -1
  1469. package/dist/setup-nonce-DKl4S4c6.mjs +0 -25
  1470. package/dist/setup-nonce-DKl4S4c6.mjs.map +0 -1
  1471. package/dist/site-domain-CbI51Pc2.mjs +0 -113
  1472. package/dist/site-domain-CbI51Pc2.mjs.map +0 -1
  1473. package/dist/site-settings-CDdT4mVm.mjs +0 -50
  1474. package/dist/site-settings-CDdT4mVm.mjs.map +0 -1
  1475. package/dist/site-url-CrDZaAvo.mjs +0 -45
  1476. package/dist/site-url-CrDZaAvo.mjs.map +0 -1
  1477. package/dist/sitemap-name-W3BTor6X.mjs +0 -26
  1478. package/dist/sitemap-name-W3BTor6X.mjs.map +0 -1
  1479. package/dist/slug-BJhHKoOH.mjs +0 -16
  1480. package/dist/slug-BJhHKoOH.mjs.map +0 -1
  1481. package/dist/slugify-bu2-jKia.mjs +0 -22
  1482. package/dist/slugify-bu2-jKia.mjs.map +0 -1
  1483. package/dist/snapshot-BuI_2uDe.mjs +0 -414
  1484. package/dist/snapshot-BuI_2uDe.mjs.map +0 -1
  1485. package/dist/ssrf-LM_0wpGA.mjs +0 -406
  1486. package/dist/ssrf-LM_0wpGA.mjs.map +0 -1
  1487. package/dist/stage-DhzZuYaT.mjs +0 -662
  1488. package/dist/stage-DhzZuYaT.mjs.map +0 -1
  1489. package/dist/staged-DboEaWsV.mjs +0 -686
  1490. package/dist/staged-DboEaWsV.mjs.map +0 -1
  1491. package/dist/state-DCXDzjHq.mjs +0 -178
  1492. package/dist/state-DCXDzjHq.mjs.map +0 -1
  1493. package/dist/status-Dl85BK39.mjs +0 -30
  1494. package/dist/status-Dl85BK39.mjs.map +0 -1
  1495. package/dist/storage-query-BOBmeDMD.d.mts +0 -1615
  1496. package/dist/storage-query-BOBmeDMD.d.mts.map +0 -1
  1497. package/dist/tar-K40edFMt.mjs +0 -449
  1498. package/dist/tar-K40edFMt.mjs.map +0 -1
  1499. package/dist/target-BOighEY1.mjs +0 -27
  1500. package/dist/target-BOighEY1.mjs.map +0 -1
  1501. package/dist/taxonomies-DQSywBvX.mjs +0 -697
  1502. package/dist/taxonomies-DQSywBvX.mjs.map +0 -1
  1503. package/dist/taxonomies-Dj5eaobC.mjs +0 -939
  1504. package/dist/taxonomies-Dj5eaobC.mjs.map +0 -1
  1505. package/dist/taxonomy-QrNmTfIZ.mjs +0 -550
  1506. package/dist/taxonomy-QrNmTfIZ.mjs.map +0 -1
  1507. package/dist/tokens-j5L0as2H.mjs +0 -171
  1508. package/dist/tokens-j5L0as2H.mjs.map +0 -1
  1509. package/dist/transaction-BVYIo_yu.mjs +0 -29
  1510. package/dist/transaction-BVYIo_yu.mjs.map +0 -1
  1511. package/dist/transfer-CYEw8Tu4.mjs +0 -8873
  1512. package/dist/transfer-CYEw8Tu4.mjs.map +0 -1
  1513. package/dist/transfer-DDX10hkD.mjs +0 -166
  1514. package/dist/transfer-DDX10hkD.mjs.map +0 -1
  1515. package/dist/transfer-download-BAqq6GJv.mjs +0 -33
  1516. package/dist/transfer-download-BAqq6GJv.mjs.map +0 -1
  1517. package/dist/transformations-De44wqV_.mjs +0 -196
  1518. package/dist/transformations-De44wqV_.mjs.map +0 -1
  1519. package/dist/transport-1QjUhCRO.d.mts +0 -42
  1520. package/dist/transport-1QjUhCRO.d.mts.map +0 -1
  1521. package/dist/transport-Ds5pVX7p.mjs +0 -136
  1522. package/dist/transport-Ds5pVX7p.mjs.map +0 -1
  1523. package/dist/trusted-proxy-d4Tk6biT.mjs +0 -51
  1524. package/dist/trusted-proxy-d4Tk6biT.mjs.map +0 -1
  1525. package/dist/turnstile-DaFLtyrs.mjs +0 -58
  1526. package/dist/turnstile-DaFLtyrs.mjs.map +0 -1
  1527. package/dist/types-B4-1P2DK.d.mts +0 -227
  1528. package/dist/types-B4-1P2DK.d.mts.map +0 -1
  1529. package/dist/types-BGmQ0uXs.mjs +0 -201
  1530. package/dist/types-BGmQ0uXs.mjs.map +0 -1
  1531. package/dist/types-BKXA0f-c.mjs +0 -16
  1532. package/dist/types-BKXA0f-c.mjs.map +0 -1
  1533. package/dist/types-BiHcpUoO.d.mts +0 -374
  1534. package/dist/types-BiHcpUoO.d.mts.map +0 -1
  1535. package/dist/types-BihhvkyN.d.mts +0 -85
  1536. package/dist/types-BihhvkyN.d.mts.map +0 -1
  1537. package/dist/types-Bq9Wohd7.d.mts +0 -363
  1538. package/dist/types-Bq9Wohd7.d.mts.map +0 -1
  1539. package/dist/types-C-Xp0CcN.mjs +0 -103
  1540. package/dist/types-C-Xp0CcN.mjs.map +0 -1
  1541. package/dist/types-C4P7F1Vq.d.mts +0 -1741
  1542. package/dist/types-C4P7F1Vq.d.mts.map +0 -1
  1543. package/dist/types-CGaqwHw4.mjs +0 -37
  1544. package/dist/types-CGaqwHw4.mjs.map +0 -1
  1545. package/dist/types-Cj0_yZkn.mjs +0 -18
  1546. package/dist/types-Cj0_yZkn.mjs.map +0 -1
  1547. package/dist/types-D4ECCE4X.mjs +0 -77
  1548. package/dist/types-D4ECCE4X.mjs.map +0 -1
  1549. package/dist/types-DcRJp0vS.d.mts +0 -125
  1550. package/dist/types-DcRJp0vS.d.mts.map +0 -1
  1551. package/dist/types-Ff85fTzU.d.mts +0 -289
  1552. package/dist/types-Ff85fTzU.d.mts.map +0 -1
  1553. package/dist/types-UKr5Sf4y.d.mts +0 -916
  1554. package/dist/types-UKr5Sf4y.d.mts.map +0 -1
  1555. package/dist/types-YpN8hZW7.d.mts +0 -204
  1556. package/dist/types-YpN8hZW7.d.mts.map +0 -1
  1557. package/dist/update-check-DrlsK-tt.mjs +0 -161
  1558. package/dist/update-check-DrlsK-tt.mjs.map +0 -1
  1559. package/dist/upload-attempts-D8CPPvRU.mjs +0 -32
  1560. package/dist/upload-attempts-D8CPPvRU.mjs.map +0 -1
  1561. package/dist/url-Dn3IStq8.mjs +0 -104
  1562. package/dist/url-Dn3IStq8.mjs.map +0 -1
  1563. package/dist/url-pattern-Di4Nn3vP.mjs +0 -41
  1564. package/dist/url-pattern-Di4Nn3vP.mjs.map +0 -1
  1565. package/dist/user-B-ZdGjhI.mjs +0 -171
  1566. package/dist/user-B-ZdGjhI.mjs.map +0 -1
  1567. package/dist/utils-D7wL3r6-.mjs +0 -437
  1568. package/dist/utils-D7wL3r6-.mjs.map +0 -1
  1569. package/dist/validate-BSZbSUDk.mjs +0 -524
  1570. package/dist/validate-BSZbSUDk.mjs.map +0 -1
  1571. package/dist/validate-Dfv0DpZi.d.mts +0 -468
  1572. package/dist/validate-Dfv0DpZi.d.mts.map +0 -1
  1573. package/dist/validation-DRyC_Vm5.mjs +0 -219
  1574. package/dist/validation-DRyC_Vm5.mjs.map +0 -1
  1575. package/dist/version-C4kz0PcO.mjs +0 -7
  1576. package/dist/version-C4kz0PcO.mjs.map +0 -1
  1577. package/dist/version-jhs2BRtl.mjs +0 -9
  1578. package/dist/version-jhs2BRtl.mjs.map +0 -1
  1579. package/dist/video-DReZ48Un.mjs +0 -54
  1580. package/dist/video-DReZ48Un.mjs.map +0 -1
  1581. package/dist/virtual-modules-D0e6VbEv.mjs +0 -516
  1582. package/dist/virtual-modules-D0e6VbEv.mjs.map +0 -1
  1583. package/dist/widgets-BkcMzKct.mjs +0 -121
  1584. package/dist/widgets-BkcMzKct.mjs.map +0 -1
  1585. package/dist/wxr-taxonomies-BxI0CbTg.mjs +0 -453
  1586. package/dist/wxr-taxonomies-BxI0CbTg.mjs.map +0 -1
  1587. package/dist/wxr-taxonomies-Dad33GJi.d.mts +0 -34
  1588. package/dist/wxr-taxonomies-Dad33GJi.d.mts.map +0 -1
  1589. package/dist/zod-generator-BQilAboC.mjs +0 -424
  1590. package/dist/zod-generator-BQilAboC.mjs.map +0 -1
  1591. /package/dist/{api-tokens-D2zgAIEt.mjs → api-tokens-C7l0GUAF.mjs} +0 -0
  1592. /package/dist/{ssrf-BvNItdxk.mjs → ssrf-BBXcxG-f.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-Dx7Uth1X.mjs","names":[],"sources":["../src/database/content-datetime.ts","../src/database/repositories/revision.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\n\nimport {\n\tDatetimeNormalizationError,\n\tnormalizeContentDatetimes,\n\tnormalizeDatetime,\n\ttype DatetimeFieldDescriptor,\n} from \"../datetime-normalization.js\";\nimport { requestCached } from \"../request-cache.js\";\nimport { isStoragelessFieldRow, type FieldType, type RepeaterSubField } from \"../schema/types.js\";\nimport { isSafeUrlFieldWriteValue } from \"../utils/url.js\";\nimport { EmDashValidationError } from \"./repositories/types.js\";\nimport type { Database } from \"./types.js\";\n\ninterface UrlFieldDescriptor {\n\tslug: string;\n\turlSubFields?: readonly string[];\n}\n\ninterface DatetimeContext {\n\ttimezone: string;\n\tfields: DatetimeFieldDescriptor[];\n\turlFields: UrlFieldDescriptor[];\n\twritableFieldSlugs: ReadonlySet<string>;\n}\n\nfunction repeaterSubFieldsOfType(validation: string | null, type: FieldType): string[] {\n\tif (!validation) return [];\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(validation);\n\t} catch {\n\t\treturn [];\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || !(\"subFields\" in parsed)) return [];\n\tconst subFields = (parsed as { subFields?: unknown }).subFields;\n\tif (!Array.isArray(subFields)) return [];\n\treturn subFields\n\t\t.filter(\n\t\t\t(field): field is RepeaterSubField =>\n\t\t\t\ttypeof field === \"object\" &&\n\t\t\t\tfield !== null &&\n\t\t\t\t\"type\" in field &&\n\t\t\t\tfield.type === type &&\n\t\t\t\t\"slug\" in field &&\n\t\t\t\ttypeof field.slug === \"string\",\n\t\t)\n\t\t.map((field) => field.slug);\n}\n\n/**\n * Datetime contexts by collection slug, shared so that a bulk write reads each\n * collection's context once. A cached context doesn't see later writes to the\n * `site:timezone` setting or to field definitions, so share one only across\n * work that makes neither.\n */\nexport type DatetimeContextCache = Map<string, Promise<DatetimeContext>>;\n\nexport class ContentDatetimeNormalizer {\n\tconstructor(\n\t\tprivate readonly db: Kysely<Database>,\n\t\tprivate readonly contexts?: DatetimeContextCache,\n\t) {}\n\n\tprivate context(collection: string): Promise<DatetimeContext> {\n\t\tif (this.contexts) {\n\t\t\tlet context = this.contexts.get(collection);\n\t\t\tif (!context) {\n\t\t\t\tcontext = this.loadContext(collection);\n\t\t\t\tthis.contexts.set(collection, context);\n\t\t\t}\n\t\t\treturn context;\n\t\t}\n\t\t// Fall back to the per-request cache so repeated writes in the same\n\t\t// invocation (e.g. bulk imports) do not re-query field/timezone metadata\n\t\t// for every item.\n\t\treturn requestCached(`datetimeContext:${collection}`, () => this.loadContext(collection));\n\t}\n\n\tprivate async loadContext(collection: string): Promise<DatetimeContext> {\n\t\tconst [rows, timezoneRow] = await Promise.all([\n\t\t\tthis.db\n\t\t\t\t.selectFrom(\"_emdash_fields as field\")\n\t\t\t\t.innerJoin(\"_emdash_collections as collection\", \"collection.id\", \"field.collection_id\")\n\t\t\t\t.select([\"field.slug\", \"field.type\", \"field.validation\"])\n\t\t\t\t.where(\"collection.slug\", \"=\", collection)\n\t\t\t\t.execute(),\n\t\t\tthis.db\n\t\t\t\t.selectFrom(\"options\")\n\t\t\t\t.select(\"value\")\n\t\t\t\t.where(\"name\", \"=\", \"site:timezone\")\n\t\t\t\t.executeTakeFirst(),\n\t\t]);\n\t\tlet timezone = \"UTC\";\n\t\tif (timezoneRow) {\n\t\t\ttry {\n\t\t\t\tconst configured: unknown = JSON.parse(timezoneRow.value);\n\t\t\t\tif (typeof configured === \"string\" && configured) timezone = configured;\n\t\t\t} catch {\n\t\t\t\t// The datetime normalizer reports an invalid timezone when it encounters a value.\n\t\t\t}\n\t\t}\n\t\tconst fields: DatetimeFieldDescriptor[] = [];\n\t\tconst urlFields: UrlFieldDescriptor[] = [];\n\t\tfor (const row of rows) {\n\t\t\tif (row.type === \"datetime\") {\n\t\t\t\tfields.push({ slug: row.slug, type: \"datetime\" });\n\t\t\t} else if (row.type === \"url\") {\n\t\t\t\turlFields.push({ slug: row.slug });\n\t\t\t} else if (row.type === \"repeater\") {\n\t\t\t\tfields.push({\n\t\t\t\t\tslug: row.slug,\n\t\t\t\t\ttype: \"repeater\",\n\t\t\t\t\tdatetimeSubFields: repeaterSubFieldsOfType(row.validation, \"datetime\"),\n\t\t\t\t});\n\t\t\t\tconst urlSubFields = repeaterSubFieldsOfType(row.validation, \"url\");\n\t\t\t\tif (urlSubFields.length > 0) urlFields.push({ slug: row.slug, urlSubFields });\n\t\t\t}\n\t\t}\n\t\tconst writableFieldSlugs = new Set(\n\t\t\trows.filter((field) => !isStoragelessFieldRow(field)).map((field) => field.slug),\n\t\t);\n\t\treturn { timezone, fields, urlFields, writableFieldSlugs };\n\t}\n\n\tasync writableFieldSlugs(collection: string): Promise<ReadonlySet<string>> {\n\t\treturn (await this.context(collection)).writableFieldSlugs;\n\t}\n\n\t/**\n\t * Normalizes datetimes in incoming field values and rejects `url` values\n\t * with unsafe schemes, control characters, or off-site path forms. Values\n\t * already stored are not checked, so restoring or syncing existing data\n\t * goes through {@link normalizeData} instead.\n\t */\n\tasync normalizeInput(\n\t\tcollection: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<Record<string, unknown>> {\n\t\tconst context = await this.context(collection);\n\t\tassertSafeUrlFields(data, context.urlFields);\n\t\treturn this.normalizeWithContext(context, [data])[0] ?? data;\n\t}\n\n\tasync normalizeData(\n\t\tcollection: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<Record<string, unknown>> {\n\t\tconst [normalized] = await this.normalizeDataMany(collection, [data]);\n\t\treturn normalized ?? data;\n\t}\n\n\tasync normalizeDataMany(\n\t\tcollection: string,\n\t\titems: readonly Record<string, unknown>[],\n\t): Promise<Record<string, unknown>[]> {\n\t\treturn this.normalizeWithContext(await this.context(collection), items);\n\t}\n\n\tprivate normalizeWithContext(\n\t\tcontext: DatetimeContext,\n\t\titems: readonly Record<string, unknown>[],\n\t): Record<string, unknown>[] {\n\t\ttry {\n\t\t\treturn items.map(\n\t\t\t\t(data) => normalizeContentDatetimes(data, context.fields, context.timezone).value,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (error instanceof DatetimeNormalizationError) {\n\t\t\t\tthrow new EmDashValidationError(error.message);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync normalizeValue(collection: string, value: string | Date): Promise<string> {\n\t\tconst context = await this.context(collection);\n\t\ttry {\n\t\t\treturn normalizeDatetime(value, context.timezone).value;\n\t\t} catch (error) {\n\t\t\tif (error instanceof DatetimeNormalizationError) {\n\t\t\t\tthrow new EmDashValidationError(error.message);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n// Reads parse a stored string that looks like JSON, so a repeater written as a JSON string\n// comes back as rows and must be checked as rows.\nfunction repeaterRows(value: unknown): unknown[] | undefined {\n\tlet rows = value;\n\tif (typeof rows === \"string\" && rows.startsWith(\"[\")) {\n\t\ttry {\n\t\t\trows = JSON.parse(rows);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn Array.isArray(rows) ? rows : undefined;\n}\n\nfunction assertSafeUrl(path: string, value: unknown): void {\n\tif (typeof value === \"string\" && !isSafeUrlFieldWriteValue(value)) {\n\t\tthrow new EmDashValidationError(\n\t\t\t`Field \"${path}\" must use http, https, mailto, or tel, or be a safe relative path or fragment`,\n\t\t\t{ path },\n\t\t);\n\t}\n}\n\nfunction assertSafeUrlFields(\n\tdata: Record<string, unknown>,\n\turlFields: readonly UrlFieldDescriptor[],\n): void {\n\tfor (const field of urlFields) {\n\t\tconst value = data[field.slug];\n\t\tif (!field.urlSubFields) {\n\t\t\tassertSafeUrl(field.slug, value);\n\t\t\tcontinue;\n\t\t}\n\t\tconst rows = repeaterRows(value);\n\t\tif (!rows) continue;\n\t\tfor (const [index, row] of rows.entries()) {\n\t\t\tif (!isRecord(row)) continue;\n\t\t\tfor (const subField of field.urlSubFields) {\n\t\t\t\tassertSafeUrl(`${field.slug}.${index}.${subField}`, row[subField]);\n\t\t\t}\n\t\t}\n\t}\n}\n","import { sql, type Kysely, type Selectable } from \"kysely\";\nimport { monotonicFactory } from \"ulidx\";\n\nimport { ContentDatetimeNormalizer, type DatetimeContextCache } from \"../content-datetime.js\";\nimport type { Database, RevisionTable } from \"../types.js\";\nimport { validateIdentifier } from \"../validate.js\";\n\nconst monotonic = monotonicFactory();\n\nexport function createRevisionId(): string {\n\treturn monotonic();\n}\n\nexport interface Revision {\n\tid: string;\n\tcollection: string;\n\tentryId: string;\n\tdata: Record<string, unknown>;\n\tauthorId: string | null;\n\tcreatedAt: string;\n}\n\nexport interface RevisionAuthor {\n\tid: string;\n\t/** `null` when the account has no display name. */\n\tname: string | null;\n}\n\nexport interface RevisionWithAuthor extends Revision {\n\t/** `null` when no author was recorded or the account no longer exists. */\n\tauthor: RevisionAuthor | null;\n}\n\nexport interface CreateRevisionInput {\n\tcollection: string;\n\tentryId: string;\n\tdata: Record<string, unknown>;\n\tauthorId?: string;\n}\n\nexport function normalizeRevisionLimit(value: unknown): number {\n\tconst numeric = Number(value);\n\tif (!Number.isFinite(numeric)) return 50;\n\treturn Math.max(1, Math.min(Math.trunc(numeric), 100));\n}\n\n/**\n * Revision repository for version history\n *\n * Each revision stores a JSON snapshot of the content at a point in time.\n * Used when collection has `supports: [\"revisions\"]` enabled.\n */\nexport class RevisionRepository {\n\tprivate readonly datetimes: ContentDatetimeNormalizer;\n\n\tconstructor(\n\t\tprivate db: Kysely<Database>,\n\t\tdatetimeContexts?: DatetimeContextCache,\n\t) {\n\t\tthis.datetimes = new ContentDatetimeNormalizer(db, datetimeContexts);\n\t}\n\n\t/**\n\t * Create a new revision\n\t */\n\tasync create(input: CreateRevisionInput): Promise<Revision> {\n\t\tconst id = createRevisionId();\n\t\tconst data = await this.datetimes.normalizeData(input.collection, input.data);\n\n\t\tconst row: Omit<RevisionTable, \"created_at\"> = {\n\t\t\tid,\n\t\t\tcollection: input.collection,\n\t\t\tentry_id: input.entryId,\n\t\t\tdata: JSON.stringify(data),\n\t\t\tauthor_id: input.authorId ?? null,\n\t\t};\n\n\t\tawait this.db.insertInto(\"revisions\").values(row).execute();\n\n\t\tconst revision = await this.findById(id);\n\t\tif (!revision) {\n\t\t\tthrow new Error(\"Failed to create revision\");\n\t\t}\n\n\t\tawait this.queuePruning(input.collection, input.entryId, id);\n\n\t\treturn revision;\n\t}\n\n\tasync queuePruning(collection: string, entryId: string, revisionId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.db\n\t\t\t\t.insertInto(\"_emdash_revision_prune_queue\")\n\t\t\t\t.values({\n\t\t\t\t\tcollection,\n\t\t\t\t\tentry_id: entryId,\n\t\t\t\t\trevision_id: revisionId,\n\t\t\t\t})\n\t\t\t\t.onConflict((conflict) =>\n\t\t\t\t\tconflict.columns([\"collection\", \"entry_id\"]).doUpdateSet({ revision_id: revisionId }),\n\t\t\t\t)\n\t\t\t\t.execute();\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`[revisions] Failed to queue revision pruning for ${collection}/${entryId}:`,\n\t\t\t\terror,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Find revision by ID\n\t */\n\tasync findById(id: string): Promise<Revision | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"revisions\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\n\t\treturn row ? this.normalizeRow(row) : null;\n\t}\n\n\t/** Shallow-merge `patch` into a stored revision's data. */\n\tasync mergeData(id: string, patch: Record<string, unknown>): Promise<void> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"revisions\")\n\t\t\t.select(\"data\")\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.executeTakeFirst();\n\t\tif (!row) return;\n\t\tconst data: Record<string, unknown> = { ...JSON.parse(row.data), ...patch };\n\t\tawait this.db\n\t\t\t.updateTable(\"revisions\")\n\t\t\t.set({ data: JSON.stringify(data) })\n\t\t\t.where(\"id\", \"=\", id)\n\t\t\t.execute();\n\t}\n\n\t/**\n\t * Get all revisions for an entry (newest first)\n\t *\n\t * Orders by monotonic ULID (descending). The monotonic factory\n\t * guarantees strictly increasing IDs even within the same millisecond.\n\t */\n\tasync findByEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\toptions: { limit?: number } = {},\n\t): Promise<RevisionWithAuthor[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"revisions\")\n\t\t\t.leftJoin(\"users\", \"users.id\", \"revisions.author_id\")\n\t\t\t.selectAll(\"revisions\")\n\t\t\t.select([\"users.id as author_user_id\", \"users.name as author_name\"])\n\t\t\t.where(\"revisions.collection\", \"=\", collection)\n\t\t\t.where(\"revisions.entry_id\", \"=\", entryId)\n\t\t\t.orderBy(\"revisions.id\", \"desc\");\n\n\t\tif (options.limit) {\n\t\t\tquery = query.limit(options.limit);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\tconst data = await this.datetimes.normalizeDataMany(\n\t\t\tcollection,\n\t\t\trows.map((row) => JSON.parse(row.data)),\n\t\t);\n\t\treturn rows.map((row, index) => {\n\t\t\tconst normalized = data[index];\n\t\t\tif (!normalized) throw new Error(\"Failed to normalize revision data\");\n\t\t\treturn {\n\t\t\t\t...this.rowToRevision(row, normalized),\n\t\t\t\tauthor: row.author_user_id\n\t\t\t\t\t? { id: row.author_user_id, name: row.author_name?.trim() || null }\n\t\t\t\t\t: null,\n\t\t\t};\n\t\t});\n\t}\n\n\t/** Read revisions only when the owning content row is visible in the same statement snapshot. */\n\tasync findVisibleByEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\toptions: { limit?: number } = {},\n\t): Promise<Revision[]> {\n\t\tvalidateIdentifier(collection, \"collection\");\n\t\tconst tableName = `ec_${collection}`;\n\t\tconst limit = normalizeRevisionLimit(options.limit);\n\t\tconst result = await sql<Selectable<RevisionTable>>`\n\t\t\tSELECT revisions.* FROM revisions\n\t\t\tWHERE revisions.collection = ${collection}\n\t\t\tAND revisions.entry_id = ${entryId}\n\t\t\tAND EXISTS (\n\t\t\t\tSELECT 1 FROM ${sql.ref(tableName)} AS content\n\t\t\t\tWHERE content.id = ${entryId}\n\t\t\t\tAND content.deleted_at IS NULL\n\t\t\t)\n\t\t\tORDER BY revisions.id DESC\n\t\t\tLIMIT ${limit}\n\t\t`.execute(this.db);\n\t\tconst data = await this.datetimes.normalizeDataMany(\n\t\t\tcollection,\n\t\t\tresult.rows.map((row) => JSON.parse(row.data)),\n\t\t);\n\t\treturn result.rows.map((row, index) => {\n\t\t\tconst normalized = data[index];\n\t\t\tif (!normalized) throw new Error(\"Failed to normalize revision data\");\n\t\t\treturn this.rowToRevision(row, normalized);\n\t\t});\n\t}\n\n\t/** Read one revision only when its owning content row is visible in the same statement snapshot. */\n\tasync findVisibleById(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\trevisionId: string,\n\t): Promise<Revision | null> {\n\t\tvalidateIdentifier(collection, \"collection\");\n\t\tconst tableName = `ec_${collection}`;\n\t\tconst result = await sql<Selectable<RevisionTable>>`\n\t\t\tSELECT revisions.* FROM revisions\n\t\t\tWHERE revisions.id = ${revisionId}\n\t\t\tAND revisions.collection = ${collection}\n\t\t\tAND revisions.entry_id = ${entryId}\n\t\t\tAND EXISTS (\n\t\t\t\tSELECT 1 FROM ${sql.ref(tableName)} AS content\n\t\t\t\tWHERE content.id = ${entryId}\n\t\t\t\tAND content.deleted_at IS NULL\n\t\t\t)\n\t\t\tLIMIT 1\n\t\t`.execute(this.db);\n\t\tconst row = result.rows[0];\n\t\treturn row ? this.normalizeRow(row) : null;\n\t}\n\n\t/**\n\t * Get the most recent revision for an entry\n\t */\n\tasync findLatest(collection: string, entryId: string): Promise<Revision | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"revisions\")\n\t\t\t.selectAll()\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryId)\n\t\t\t.orderBy(\"id\", \"desc\")\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\n\t\treturn row ? this.normalizeRow(row) : null;\n\t}\n\n\t/**\n\t * Count revisions for an entry\n\t */\n\tasync countByEntry(collection: string, entryId: string): Promise<number> {\n\t\tconst result = await this.db\n\t\t\t.selectFrom(\"revisions\")\n\t\t\t.select((eb) => eb.fn.count(\"id\").as(\"count\"))\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryId)\n\t\t\t.executeTakeFirst();\n\n\t\treturn Number(result?.count || 0);\n\t}\n\n\t/**\n\t * Delete all revisions for an entry (use when entry is deleted)\n\t */\n\tasync deleteByEntry(collection: string, entryId: string): Promise<number> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"revisions\")\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryId)\n\t\t\t.executeTakeFirst();\n\n\t\ttry {\n\t\t\tawait this.db\n\t\t\t\t.deleteFrom(\"_emdash_revision_prune_queue\")\n\t\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t\t.where(\"entry_id\", \"=\", entryId)\n\t\t\t\t.execute();\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`[revisions] Failed to clear queued revision pruning for ${collection}/${entryId}:`,\n\t\t\t\terror,\n\t\t\t);\n\t\t}\n\n\t\treturn Number(result.numDeletedRows ?? 0);\n\t}\n\n\t/**\n\t * Delete old revisions, keeping the most recent N\n\t */\n\tasync pruneOldRevisions(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\tkeepCount: number,\n\t\tthroughRevisionId?: string,\n\t): Promise<number> {\n\t\tvalidateIdentifier(collection, \"collection\");\n\t\tconst tableName = `ec_${collection}`;\n\t\tlet keepQuery = this.db\n\t\t\t.selectFrom(\"revisions\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryId)\n\t\t\t.orderBy(\"created_at\", \"desc\")\n\t\t\t.orderBy(\"id\", \"desc\") // ULID tiebreaker\n\t\t\t.limit(keepCount);\n\n\t\tif (throughRevisionId) {\n\t\t\tkeepQuery = keepQuery.where(\"id\", \"<=\", throughRevisionId);\n\t\t}\n\n\t\tconst keep = await keepQuery.execute();\n\n\t\tconst keepIds = keep.map((r) => r.id);\n\n\t\tif (keepIds.length === 0) return 0;\n\t\tconst revisionBoundary = throughRevisionId ? sql`AND id <= ${throughRevisionId}` : sql``;\n\n\t\tconst result = await sql`\n\t\t\tDELETE FROM revisions\n\t\t\tWHERE collection = ${collection}\n\t\t\tAND entry_id = ${entryId}\n\t\t\t${revisionBoundary}\n\t\t\tAND id NOT IN (${sql.join(keepIds.map((id) => sql`${id}`))})\n\t\t\tAND NOT EXISTS (\n\t\t\t\tSELECT 1 FROM ${sql.ref(tableName)} AS content\n\t\t\t\tWHERE content.live_revision_id = revisions.id\n\t\t\t\tOR content.draft_revision_id = revisions.id\n\t\t\t)\n\t\t`.execute(this.db);\n\n\t\treturn Number(result.numAffectedRows ?? 0);\n\t}\n\n\tasync pruneQueuedEntry(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\tqueuedRevisionId: string,\n\t\tkeepCount: number,\n\t): Promise<number> {\n\t\tconst pruned = await this.pruneOldRevisions(collection, entryId, keepCount, queuedRevisionId);\n\t\tawait this.db\n\t\t\t.deleteFrom(\"_emdash_revision_prune_queue\")\n\t\t\t.where(\"collection\", \"=\", collection)\n\t\t\t.where(\"entry_id\", \"=\", entryId)\n\t\t\t.where(\"revision_id\", \"=\", queuedRevisionId)\n\t\t\t.execute();\n\t\treturn pruned;\n\t}\n\n\tasync deleteIfUnreferenced(\n\t\tcollection: string,\n\t\tentryId: string,\n\t\trevisionId: string,\n\t): Promise<boolean> {\n\t\tvalidateIdentifier(collection, \"collection\");\n\t\tconst tableName = `ec_${collection}`;\n\t\tconst result = await sql`\n\t\t\tDELETE FROM revisions\n\t\t\tWHERE id = ${revisionId}\n\t\t\tAND collection = ${collection}\n\t\t\tAND entry_id = ${entryId}\n\t\t\tAND NOT EXISTS (\n\t\t\t\tSELECT 1 FROM ${sql.ref(tableName)} AS content\n\t\t\t\tWHERE content.live_revision_id = revisions.id\n\t\t\t\tOR content.draft_revision_id = revisions.id\n\t\t\t)\n\t\t`.execute(this.db);\n\t\treturn (result.numAffectedRows ?? 0n) > 0n;\n\t}\n\n\t/**\n\t * Convert database row to Revision object\n\t */\n\tprivate async normalizeRow(row: {\n\t\tid: string;\n\t\tcollection: string;\n\t\tentry_id: string;\n\t\tdata: string;\n\t\tauthor_id: string | null;\n\t\tcreated_at: string;\n\t}): Promise<Revision> {\n\t\tconst data = await this.datetimes.normalizeData(row.collection, JSON.parse(row.data));\n\t\treturn this.rowToRevision(row, data);\n\t}\n\n\tprivate rowToRevision(\n\t\trow: {\n\t\t\tid: string;\n\t\t\tcollection: string;\n\t\t\tentry_id: string;\n\t\t\tdata: string;\n\t\t\tauthor_id: string | null;\n\t\t\tcreated_at: string;\n\t\t},\n\t\tdata: Record<string, unknown>,\n\t): Revision {\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\tcollection: row.collection,\n\t\t\tentryId: row.entry_id,\n\t\t\tdata,\n\t\t\tauthorId: row.author_id,\n\t\t\tcreatedAt: row.created_at,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ //#region src/cache/route-cache.ts
2
+ /**
3
+ * Purge `tags` from Astro's route cache when a cache provider is configured.
4
+ *
5
+ * Never throws: callers run it after a committed write, and a rejected purge
6
+ * must not fail that write. The pages stay cached until a later purge or their
7
+ * `maxAge`.
8
+ */
9
+ async function invalidateRouteCache(cache, tags) {
10
+ if (!cache?.enabled) return;
11
+ try {
12
+ await cache.invalidate({ tags });
13
+ } catch (error) {
14
+ console.error(`[cache] Failed to invalidate route cache tags ${tags.join(", ")}:`, error);
15
+ }
16
+ }
17
+
18
+ //#endregion
19
+ export { invalidateRouteCache as t };
20
+ //# sourceMappingURL=route-cache-DAG5dPhh.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-cache-DAG5dPhh.mjs","names":[],"sources":["../src/cache/route-cache.ts"],"sourcesContent":["import type { APIContext } from \"astro\";\n\ntype RouteCache = Pick<APIContext[\"cache\"], \"enabled\" | \"invalidate\">;\n\n/**\n * Purge `tags` from Astro's route cache when a cache provider is configured.\n *\n * Never throws: callers run it after a committed write, and a rejected purge\n * must not fail that write. The pages stay cached until a later purge or their\n * `maxAge`.\n */\nexport async function invalidateRouteCache(\n\tcache: RouteCache | undefined,\n\ttags: string[],\n): Promise<void> {\n\tif (!cache?.enabled) return;\n\ttry {\n\t\tawait cache.invalidate({ tags });\n\t} catch (error) {\n\t\tconsole.error(`[cache] Failed to invalidate route cache tags ${tags.join(\", \")}:`, error);\n\t}\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,qBACrB,OACA,MACgB;AAChB,KAAI,CAAC,OAAO,QAAS;AACrB,KAAI;AACH,QAAM,MAAM,WAAW,EAAE,MAAM,CAAC;UACxB,OAAO;AACf,UAAQ,MAAM,iDAAiD,KAAK,KAAK,KAAK,CAAC,IAAI,MAAM"}
@@ -0,0 +1,197 @@
1
+ import { readPluginHttpBytes } from "./plugins/http-wire.mjs";
2
+ import { PLUGIN_ROUTE_DEFAULT_BODY_BYTES, PLUGIN_ROUTE_MAX_BODY_BYTES, PLUGIN_ROUTE_MAX_FILENAME_BYTES, PLUGIN_ROUTE_MAX_MULTIPART_PARTS, PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES } from "@emdash-cms/plugin-types";
3
+
4
+ //#region src/plugins/route-wire.ts
5
+ const UTF8 = new TextEncoder();
6
+ const FILENAME_PATH_SEPARATOR_PATTERN = /[/\\]/;
7
+ const SCRIPT_MEDIA_TYPE_PATTERN = /(?:java|ecma)script/;
8
+ const ALLOWED_RESPONSE_HEADERS = new Set([
9
+ "accept-ranges",
10
+ "content-disposition",
11
+ "content-encoding",
12
+ "content-language",
13
+ "content-range",
14
+ "content-type",
15
+ "etag",
16
+ "last-modified",
17
+ "retry-after"
18
+ ]);
19
+ const ACTIVE_RESPONSE_TYPES = new Set([
20
+ "application/ecmascript",
21
+ "application/javascript",
22
+ "application/wasm",
23
+ "application/xhtml+xml",
24
+ "application/xml",
25
+ "image/svg+xml",
26
+ "multipart/related",
27
+ "multipart/x-mixed-replace",
28
+ "text/css",
29
+ "text/ecmascript",
30
+ "text/html",
31
+ "text/javascript",
32
+ "text/jscript",
33
+ "text/livescript",
34
+ "text/xml"
35
+ ]);
36
+ var PluginRouteRequestError = class extends Error {
37
+ constructor(message, status) {
38
+ super(message);
39
+ this.status = status;
40
+ this.name = "PluginRouteRequestError";
41
+ }
42
+ };
43
+ function parseQuery(request) {
44
+ const input = {};
45
+ const params = new URL(request.url).searchParams;
46
+ for (const key of new Set(params.keys())) {
47
+ const values = params.getAll(key);
48
+ input[key] = values.length > 1 ? values : values[0];
49
+ }
50
+ return input;
51
+ }
52
+ async function readRouteBody(request, limit) {
53
+ const declaredLength = request.headers.get("content-length");
54
+ if (declaredLength !== null) {
55
+ const parsed = Number(declaredLength);
56
+ if (Number.isFinite(parsed) && parsed > limit) throw new PluginRouteRequestError(`Plugin route request body exceeds ${limit} bytes`, 413);
57
+ }
58
+ try {
59
+ return await readPluginHttpBytes(request.body, limit, "request");
60
+ } catch (error) {
61
+ if (!(error instanceof Error) || !error.message.includes("exceeds")) throw new PluginRouteRequestError("Plugin route request body could not be read", 400);
62
+ throw new PluginRouteRequestError(`Plugin route request body exceeds ${limit} bytes`, 413);
63
+ }
64
+ }
65
+ function decodeText(bytes) {
66
+ try {
67
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
68
+ } catch {
69
+ throw new PluginRouteRequestError("Plugin route request body is not valid UTF-8", 400);
70
+ }
71
+ }
72
+ async function parseFormData(request, bytes) {
73
+ const contentType = request.headers.get("content-type") ?? "";
74
+ if (!contentType.toLowerCase().startsWith("multipart/form-data;") && !contentType.toLowerCase().startsWith("application/x-www-form-urlencoded")) throw new PluginRouteRequestError("Plugin route form-data requests require multipart/form-data or application/x-www-form-urlencoded", 415);
75
+ let parsed;
76
+ try {
77
+ parsed = await new Request(request.url, {
78
+ method: "POST",
79
+ headers: { "content-type": contentType },
80
+ body: new Uint8Array(bytes).buffer
81
+ }).formData();
82
+ } catch {
83
+ throw new PluginRouteRequestError("Plugin route form-data body is malformed", 400);
84
+ }
85
+ const entries = [];
86
+ for (const [name, value] of parsed.entries()) {
87
+ if (entries.length >= PLUGIN_ROUTE_MAX_MULTIPART_PARTS) throw new PluginRouteRequestError(`Plugin route form-data exceeds ${PLUGIN_ROUTE_MAX_MULTIPART_PARTS} parts`, 413);
88
+ if (typeof value === "string") {
89
+ if (UTF8.encode(value).byteLength > PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES) throw new PluginRouteRequestError(`Plugin route form-data part exceeds ${PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES} bytes`, 413);
90
+ entries.push({
91
+ name,
92
+ kind: "text",
93
+ value
94
+ });
95
+ continue;
96
+ }
97
+ const filename = value.name;
98
+ let hasControlCharacter = false;
99
+ for (const character of filename) {
100
+ const codePoint = character.codePointAt(0);
101
+ if (codePoint !== void 0 && (codePoint < 32 || codePoint === 127)) {
102
+ hasControlCharacter = true;
103
+ break;
104
+ }
105
+ }
106
+ if (UTF8.encode(filename).byteLength > PLUGIN_ROUTE_MAX_FILENAME_BYTES || hasControlCharacter || FILENAME_PATH_SEPARATOR_PATTERN.test(filename)) throw new PluginRouteRequestError("Plugin route form-data filename is invalid", 400);
107
+ if (value.size > PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES) throw new PluginRouteRequestError(`Plugin route form-data part exceeds ${PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES} bytes`, 413);
108
+ entries.push({
109
+ name,
110
+ kind: "file",
111
+ filename,
112
+ contentType: value.type || "application/octet-stream",
113
+ bytes: new Uint8Array(await value.arrayBuffer())
114
+ });
115
+ }
116
+ return { entries };
117
+ }
118
+ async function parseDeclaredPluginRouteInput(request, declaration) {
119
+ if (declaration.body === "none") {
120
+ await readRouteBody(request, 0);
121
+ return parseQuery(request);
122
+ }
123
+ const limit = declaration.maxBytes ?? PLUGIN_ROUTE_DEFAULT_BODY_BYTES;
124
+ const bytes = await readRouteBody(request, Math.min(limit, PLUGIN_ROUTE_MAX_BODY_BYTES));
125
+ switch (declaration.body) {
126
+ case "bytes": return bytes;
127
+ case "text": return decodeText(bytes);
128
+ case "json": try {
129
+ return JSON.parse(decodeText(bytes));
130
+ } catch (error) {
131
+ if (error instanceof PluginRouteRequestError) throw error;
132
+ throw new PluginRouteRequestError("Plugin route request body is not valid JSON", 400);
133
+ }
134
+ case "form-data": return parseFormData(request, bytes);
135
+ }
136
+ }
137
+ function isPluginResponse(value) {
138
+ return typeof value === "object" && value !== null && value.__emdashPluginResponse === true;
139
+ }
140
+ async function pluginRouteResponseToWire(value, options = {}) {
141
+ if (!isPluginResponse(value)) throw new TypeError("Raw plugin routes must return pluginResponse()");
142
+ if (!Number.isInteger(value.status) || value.status < 200 || value.status > 599) throw new TypeError("Raw plugin route status must be an integer from 200 to 599");
143
+ if (!Array.isArray(value.headers)) throw new TypeError("Raw plugin route headers are invalid");
144
+ const sourceHeaders = new Headers();
145
+ for (const entry of value.headers) {
146
+ if (!Array.isArray(entry) || entry.length !== 2 || typeof entry[0] !== "string" || typeof entry[1] !== "string") throw new TypeError("Raw plugin route headers are invalid");
147
+ sourceHeaders.append(entry[0], entry[1]);
148
+ }
149
+ const headers = new Headers();
150
+ sourceHeaders.forEach((headerValue, name) => {
151
+ if (ALLOWED_RESPONSE_HEADERS.has(name)) {
152
+ headers.set(name, headerValue);
153
+ return;
154
+ }
155
+ if (name !== "location") return;
156
+ if (options.allowExternalLocation) {
157
+ headers.set(name, headerValue);
158
+ return;
159
+ }
160
+ if (options.publicRequestUrl) try {
161
+ const requestUrl = new URL(options.publicRequestUrl);
162
+ if (new URL(headerValue, requestUrl).origin === requestUrl.origin) {
163
+ headers.set(name, headerValue);
164
+ return;
165
+ }
166
+ } catch {}
167
+ throw new TypeError("Public raw plugin route redirects must stay on the site origin");
168
+ });
169
+ if (!headers.has("content-type")) headers.set("content-type", "application/octet-stream");
170
+ const mediaType = (headers.get("content-type") ?? "application/octet-stream").split(";", 1)[0].trim().toLowerCase();
171
+ if (ACTIVE_RESPONSE_TYPES.has(mediaType) || SCRIPT_MEDIA_TYPE_PATTERN.test(mediaType)) throw new TypeError(`Raw plugin route content type "${mediaType}" is not allowed`);
172
+ headers.set("x-content-type-options", "nosniff");
173
+ headers.set("content-security-policy", "sandbox; default-src 'none'");
174
+ headers.set("referrer-policy", "no-referrer");
175
+ let body = new Uint8Array();
176
+ if (value.body !== null) if (value.body.kind === "text" && typeof value.body.value === "string") body = UTF8.encode(value.body.value);
177
+ else if (value.body.kind === "bytes" && value.body.value instanceof Uint8Array) body = new Uint8Array(value.body.value);
178
+ else throw new TypeError("Raw plugin route body is invalid");
179
+ if (body.byteLength > PLUGIN_ROUTE_MAX_BODY_BYTES) throw new TypeError(`Raw plugin route response body exceeds ${PLUGIN_ROUTE_MAX_BODY_BYTES} bytes`);
180
+ return {
181
+ status: value.status,
182
+ headers: [...headers.entries()],
183
+ body
184
+ };
185
+ }
186
+ function pluginRouteResponseFromWire(wire, method) {
187
+ const nullBodyStatus = wire.status === 204 || wire.status === 205 || wire.status === 304;
188
+ const body = method === "HEAD" || nullBodyStatus ? null : new Uint8Array(wire.body).buffer;
189
+ return new Response(body, {
190
+ status: wire.status,
191
+ headers: wire.headers
192
+ });
193
+ }
194
+
195
+ //#endregion
196
+ export { pluginRouteResponseToWire as i, parseDeclaredPluginRouteInput as n, pluginRouteResponseFromWire as r, PluginRouteRequestError as t };
197
+ //# sourceMappingURL=route-wire-Xbsu8Vih.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-wire-Xbsu8Vih.mjs","names":[],"sources":["../src/plugins/route-wire.ts"],"sourcesContent":["import {\n\tPLUGIN_ROUTE_DEFAULT_BODY_BYTES,\n\tPLUGIN_ROUTE_MAX_BODY_BYTES,\n\tPLUGIN_ROUTE_MAX_FILENAME_BYTES,\n\tPLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES,\n\tPLUGIN_ROUTE_MAX_MULTIPART_PARTS,\n\ttype PluginRouteRequest,\n} from \"@emdash-cms/plugin-types\";\n\nimport type { PluginFormData, PluginResponse } from \"../plugin-types.js\";\nimport { readPluginHttpBytes } from \"./http-wire.js\";\n\nconst UTF8 = new TextEncoder();\nconst FILENAME_PATH_SEPARATOR_PATTERN = /[/\\\\]/;\nconst SCRIPT_MEDIA_TYPE_PATTERN = /(?:java|ecma)script/;\nconst ALLOWED_RESPONSE_HEADERS = new Set([\n\t\"accept-ranges\",\n\t\"content-disposition\",\n\t\"content-encoding\",\n\t\"content-language\",\n\t\"content-range\",\n\t\"content-type\",\n\t\"etag\",\n\t\"last-modified\",\n\t\"retry-after\",\n]);\nconst ACTIVE_RESPONSE_TYPES = new Set([\n\t\"application/ecmascript\",\n\t\"application/javascript\",\n\t\"application/wasm\",\n\t\"application/xhtml+xml\",\n\t\"application/xml\",\n\t\"image/svg+xml\",\n\t\"multipart/related\",\n\t\"multipart/x-mixed-replace\",\n\t\"text/css\",\n\t\"text/ecmascript\",\n\t\"text/html\",\n\t\"text/javascript\",\n\t\"text/jscript\",\n\t\"text/livescript\",\n\t\"text/xml\",\n]);\n\nexport interface PluginRouteResponseWire {\n\tstatus: number;\n\theaders: Array<[string, string]>;\n\tbody: Uint8Array;\n}\n\nexport interface PluginRouteResponseWireOptions {\n\tallowExternalLocation?: boolean;\n\tpublicRequestUrl?: string;\n}\n\nexport class PluginRouteRequestError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly status: 400 | 413 | 415,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"PluginRouteRequestError\";\n\t}\n}\n\nfunction parseQuery(request: Request): Record<string, string | string[]> {\n\tconst input: Record<string, string | string[]> = {};\n\tconst params = new URL(request.url).searchParams;\n\tfor (const key of new Set(params.keys())) {\n\t\tconst values = params.getAll(key);\n\t\tinput[key] = values.length > 1 ? values : values[0];\n\t}\n\treturn input;\n}\n\nasync function readRouteBody(request: Request, limit: number): Promise<Uint8Array> {\n\tconst declaredLength = request.headers.get(\"content-length\");\n\tif (declaredLength !== null) {\n\t\tconst parsed = Number(declaredLength);\n\t\tif (Number.isFinite(parsed) && parsed > limit) {\n\t\t\tthrow new PluginRouteRequestError(`Plugin route request body exceeds ${limit} bytes`, 413);\n\t\t}\n\t}\n\ttry {\n\t\treturn await readPluginHttpBytes(request.body, limit, \"request\");\n\t} catch (error) {\n\t\tif (!(error instanceof Error) || !error.message.includes(\"exceeds\")) {\n\t\t\tthrow new PluginRouteRequestError(\"Plugin route request body could not be read\", 400);\n\t\t}\n\t\tthrow new PluginRouteRequestError(`Plugin route request body exceeds ${limit} bytes`, 413);\n\t}\n}\n\nfunction decodeText(bytes: Uint8Array): string {\n\ttry {\n\t\treturn new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n\t} catch {\n\t\tthrow new PluginRouteRequestError(\"Plugin route request body is not valid UTF-8\", 400);\n\t}\n}\n\nasync function parseFormData(request: Request, bytes: Uint8Array): Promise<PluginFormData> {\n\tconst contentType = request.headers.get(\"content-type\") ?? \"\";\n\tif (\n\t\t!contentType.toLowerCase().startsWith(\"multipart/form-data;\") &&\n\t\t!contentType.toLowerCase().startsWith(\"application/x-www-form-urlencoded\")\n\t) {\n\t\tthrow new PluginRouteRequestError(\n\t\t\t\"Plugin route form-data requests require multipart/form-data or application/x-www-form-urlencoded\",\n\t\t\t415,\n\t\t);\n\t}\n\n\tlet parsed: FormData;\n\ttry {\n\t\tparsed = await new Request(request.url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"content-type\": contentType },\n\t\t\tbody: new Uint8Array(bytes).buffer,\n\t\t}).formData();\n\t} catch {\n\t\tthrow new PluginRouteRequestError(\"Plugin route form-data body is malformed\", 400);\n\t}\n\n\tconst entries: PluginFormData[\"entries\"] = [];\n\tfor (const [name, value] of parsed.entries()) {\n\t\tif (entries.length >= PLUGIN_ROUTE_MAX_MULTIPART_PARTS) {\n\t\t\tthrow new PluginRouteRequestError(\n\t\t\t\t`Plugin route form-data exceeds ${PLUGIN_ROUTE_MAX_MULTIPART_PARTS} parts`,\n\t\t\t\t413,\n\t\t\t);\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\tif (UTF8.encode(value).byteLength > PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES) {\n\t\t\t\tthrow new PluginRouteRequestError(\n\t\t\t\t\t`Plugin route form-data part exceeds ${PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES} bytes`,\n\t\t\t\t\t413,\n\t\t\t\t);\n\t\t\t}\n\t\t\tentries.push({ name, kind: \"text\", value });\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst filename = value.name;\n\t\tlet hasControlCharacter = false;\n\t\tfor (const character of filename) {\n\t\t\tconst codePoint = character.codePointAt(0);\n\t\t\tif (codePoint !== undefined && (codePoint < 32 || codePoint === 127)) {\n\t\t\t\thasControlCharacter = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\tUTF8.encode(filename).byteLength > PLUGIN_ROUTE_MAX_FILENAME_BYTES ||\n\t\t\thasControlCharacter ||\n\t\t\tFILENAME_PATH_SEPARATOR_PATTERN.test(filename)\n\t\t) {\n\t\t\tthrow new PluginRouteRequestError(\"Plugin route form-data filename is invalid\", 400);\n\t\t}\n\t\tif (value.size > PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES) {\n\t\t\tthrow new PluginRouteRequestError(\n\t\t\t\t`Plugin route form-data part exceeds ${PLUGIN_ROUTE_MAX_MULTIPART_PART_BYTES} bytes`,\n\t\t\t\t413,\n\t\t\t);\n\t\t}\n\t\tentries.push({\n\t\t\tname,\n\t\t\tkind: \"file\",\n\t\t\tfilename,\n\t\t\tcontentType: value.type || \"application/octet-stream\",\n\t\t\tbytes: new Uint8Array(await value.arrayBuffer()),\n\t\t});\n\t}\n\treturn { entries };\n}\n\nexport async function parseDeclaredPluginRouteInput(\n\trequest: Request,\n\tdeclaration: PluginRouteRequest,\n): Promise<unknown> {\n\tif (declaration.body === \"none\") {\n\t\tawait readRouteBody(request, 0);\n\t\treturn parseQuery(request);\n\t}\n\tconst limit = declaration.maxBytes ?? PLUGIN_ROUTE_DEFAULT_BODY_BYTES;\n\tconst bytes = await readRouteBody(request, Math.min(limit, PLUGIN_ROUTE_MAX_BODY_BYTES));\n\n\tswitch (declaration.body) {\n\t\tcase \"bytes\":\n\t\t\treturn bytes;\n\t\tcase \"text\":\n\t\t\treturn decodeText(bytes);\n\t\tcase \"json\":\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(decodeText(bytes));\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof PluginRouteRequestError) throw error;\n\t\t\t\tthrow new PluginRouteRequestError(\"Plugin route request body is not valid JSON\", 400);\n\t\t\t}\n\t\tcase \"form-data\":\n\t\t\treturn parseFormData(request, bytes);\n\t}\n}\n\nexport function isPluginResponse(value: unknown): value is PluginResponse {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t(value as { __emdashPluginResponse?: unknown }).__emdashPluginResponse === true\n\t);\n}\n\nexport async function pluginRouteResponseToWire(\n\tvalue: unknown,\n\toptions: PluginRouteResponseWireOptions = {},\n): Promise<PluginRouteResponseWire> {\n\tif (!isPluginResponse(value)) {\n\t\tthrow new TypeError(\"Raw plugin routes must return pluginResponse()\");\n\t}\n\tif (!Number.isInteger(value.status) || value.status < 200 || value.status > 599) {\n\t\tthrow new TypeError(\"Raw plugin route status must be an integer from 200 to 599\");\n\t}\n\tif (!Array.isArray(value.headers)) {\n\t\tthrow new TypeError(\"Raw plugin route headers are invalid\");\n\t}\n\n\tconst sourceHeaders = new Headers();\n\tfor (const entry of value.headers) {\n\t\tif (\n\t\t\t!Array.isArray(entry) ||\n\t\t\tentry.length !== 2 ||\n\t\t\ttypeof entry[0] !== \"string\" ||\n\t\t\ttypeof entry[1] !== \"string\"\n\t\t) {\n\t\t\tthrow new TypeError(\"Raw plugin route headers are invalid\");\n\t\t}\n\t\tsourceHeaders.append(entry[0], entry[1]);\n\t}\n\n\tconst headers = new Headers();\n\tsourceHeaders.forEach((headerValue, name) => {\n\t\tif (ALLOWED_RESPONSE_HEADERS.has(name)) {\n\t\t\theaders.set(name, headerValue);\n\t\t\treturn;\n\t\t}\n\t\tif (name !== \"location\") return;\n\t\tif (options.allowExternalLocation) {\n\t\t\theaders.set(name, headerValue);\n\t\t\treturn;\n\t\t}\n\t\tif (options.publicRequestUrl) {\n\t\t\ttry {\n\t\t\t\tconst requestUrl = new URL(options.publicRequestUrl);\n\t\t\t\tif (new URL(headerValue, requestUrl).origin === requestUrl.origin) {\n\t\t\t\t\theaders.set(name, headerValue);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t\tthrow new TypeError(\"Public raw plugin route redirects must stay on the site origin\");\n\t});\n\tif (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/octet-stream\");\n\tconst mediaType = (headers.get(\"content-type\") ?? \"application/octet-stream\")\n\t\t.split(\";\", 1)[0]\n\t\t.trim()\n\t\t.toLowerCase();\n\tif (ACTIVE_RESPONSE_TYPES.has(mediaType) || SCRIPT_MEDIA_TYPE_PATTERN.test(mediaType)) {\n\t\tthrow new TypeError(`Raw plugin route content type \"${mediaType}\" is not allowed`);\n\t}\n\theaders.set(\"x-content-type-options\", \"nosniff\");\n\theaders.set(\"content-security-policy\", \"sandbox; default-src 'none'\");\n\theaders.set(\"referrer-policy\", \"no-referrer\");\n\n\tlet body = new Uint8Array();\n\tif (value.body !== null) {\n\t\tif (value.body.kind === \"text\" && typeof value.body.value === \"string\") {\n\t\t\tbody = UTF8.encode(value.body.value);\n\t\t} else if (value.body.kind === \"bytes\" && value.body.value instanceof Uint8Array) {\n\t\t\tbody = new Uint8Array(value.body.value);\n\t\t} else {\n\t\t\tthrow new TypeError(\"Raw plugin route body is invalid\");\n\t\t}\n\t}\n\tif (body.byteLength > PLUGIN_ROUTE_MAX_BODY_BYTES) {\n\t\tthrow new TypeError(\n\t\t\t`Raw plugin route response body exceeds ${PLUGIN_ROUTE_MAX_BODY_BYTES} bytes`,\n\t\t);\n\t}\n\n\treturn {\n\t\tstatus: value.status,\n\t\theaders: [...headers.entries()],\n\t\tbody,\n\t};\n}\n\nexport function pluginRouteResponseFromWire(\n\twire: PluginRouteResponseWire,\n\tmethod: string,\n): Response {\n\tconst nullBodyStatus = wire.status === 204 || wire.status === 205 || wire.status === 304;\n\tconst body = method === \"HEAD\" || nullBodyStatus ? null : new Uint8Array(wire.body).buffer;\n\treturn new Response(body, { status: wire.status, headers: wire.headers });\n}\n"],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ import { m as isPluginRouteError, t as PluginContextFactory } from "./context-ErV7UdQY.mjs";
2
+ import { t as SiteWriteBlockedError } from "./fence-BOD3SxZG.mjs";
3
+ import { t as extractRequestMeta } from "./request-meta-o8RIf9pa.mjs";
4
+ import { n as parseDeclaredPluginRouteInput } from "./route-wire-Xbsu8Vih.mjs";
5
+ import { z } from "zod";
6
+ import { routeNameSchema } from "@emdash-cms/plugin-types";
7
+
8
+ //#region src/plugins/routes.ts
9
+ /**
10
+ * Body-reading methods on `Request`. EmDash parses the request body once before
11
+ * the handler runs and exposes the result as `ctx.input`, leaving the underlying
12
+ * stream consumed. Calling any of these on `ctx.request` would re-read a spent
13
+ * stream and throw an opaque platform error ("Body is unusable: Body has already
14
+ * been read") with no hint about `ctx.input` — so the guard replaces them with an
15
+ * actionable message instead.
16
+ */
17
+ const CONSUMED_BODY_METHODS = new Set([
18
+ "json",
19
+ "text",
20
+ "arrayBuffer",
21
+ "blob",
22
+ "formData",
23
+ "bytes"
24
+ ]);
25
+ /**
26
+ * Wrap the request handed to a plugin route handler so an accidental
27
+ * `ctx.request.json()` (or `.text()`, `.formData()`, …) fails with a message
28
+ * pointing at `ctx.input` rather than the runtime's cryptic "body already read"
29
+ * error. Every non-body member passes through unchanged; function members are
30
+ * bound to the underlying request so methods like `clone()` don't throw an
31
+ * "Illegal invocation" when called on the proxy.
32
+ */
33
+ function guardConsumedRequestBody(request) {
34
+ return new Proxy(request, { get(target, prop) {
35
+ if (typeof prop === "string" && CONSUMED_BODY_METHODS.has(prop)) return () => {
36
+ throw new Error(`[emdash] ctx.request.${prop}() is not available inside a plugin route handler: EmDash has already parsed the request body and exposes it as ctx.input. Read ctx.input instead of ctx.request.${prop}().`);
37
+ };
38
+ const value = Reflect.get(target, prop, target);
39
+ return typeof value === "function" ? value.bind(target) : value;
40
+ } });
41
+ }
42
+ const pluginPublicRouteAcknowledgementSchema = z.array(routeNameSchema);
43
+ /**
44
+ * Build RouteMeta from a route's `public`/`cacheControl` flags. Single source
45
+ * of truth for the "cacheControl is only ever exposed on public routes"
46
+ * invariant — used for trusted routes and manifest-declared sandboxed routes.
47
+ */
48
+ function buildRouteMeta(route) {
49
+ const meta = { public: route.public === true };
50
+ if (route.permission !== void 0) meta.permission = route.permission;
51
+ if (route.methods !== void 0) meta.methods = [...route.methods];
52
+ if (route.request !== void 0) meta.request = {
53
+ ...route.request,
54
+ ...route.request.headers ? { headers: [...route.request.headers] } : {}
55
+ };
56
+ if (route.response !== void 0) meta.response = route.response;
57
+ if (meta.public && typeof route.cacheControl === "string" && route.cacheControl.length > 0) meta.cacheControl = route.cacheControl;
58
+ return meta;
59
+ }
60
+ /**
61
+ * HTTP methods that carry a request body. Everything else (GET, HEAD, DELETE)
62
+ * takes its route input from the URL query string.
63
+ */
64
+ const BODY_METHODS = new Set([
65
+ "POST",
66
+ "PUT",
67
+ "PATCH"
68
+ ]);
69
+ /**
70
+ * Parse a plugin route's input from the request, by method.
71
+ *
72
+ * Body methods (POST/PUT/PATCH) parse the JSON body as before. Bodyless
73
+ * methods (GET/HEAD/DELETE) have no body, so `request.json()` resolves to
74
+ * undefined and fails schema validation, so parse the query string into
75
+ * an object instead. Repeated keys (`?tag=a&tag=b`) become an array so array
76
+ * schemas work; a single key stays a scalar.
77
+ */
78
+ async function parseRouteInput(request, declaration) {
79
+ if (declaration) return parseDeclaredPluginRouteInput(request, declaration);
80
+ if (BODY_METHODS.has(request.method.toUpperCase())) try {
81
+ return await request.json();
82
+ } catch {
83
+ return;
84
+ }
85
+ const params = new URL(request.url).searchParams;
86
+ const input = {};
87
+ for (const key of new Set(params.keys())) {
88
+ const values = params.getAll(key);
89
+ input[key] = values.length > 1 ? values : values[0];
90
+ }
91
+ return input;
92
+ }
93
+ /**
94
+ * Convert the host's authenticated user into the read-only `UserInfo` shape
95
+ * exposed to plugins as `ctx.user`. Strips sensitive/irrelevant fields and
96
+ * keeps the value structured-clone-safe for sandboxed plugins.
97
+ */
98
+ function toRouteCallerInfo(user) {
99
+ return {
100
+ id: user.id,
101
+ email: user.email,
102
+ name: user.name,
103
+ role: user.role,
104
+ createdAt: typeof user.createdAt === "string" ? user.createdAt : user.createdAt.toISOString()
105
+ };
106
+ }
107
+ /**
108
+ * Route handler for a plugin
109
+ */
110
+ var PluginRouteHandler = class {
111
+ contextFactory;
112
+ plugin;
113
+ trustedProxyHeaders;
114
+ constructor(plugin, factoryOptions) {
115
+ this.plugin = plugin;
116
+ this.contextFactory = new PluginContextFactory(factoryOptions);
117
+ this.trustedProxyHeaders = factoryOptions.trustedProxyHeaders ?? [];
118
+ }
119
+ /**
120
+ * Invoke a route by name
121
+ */
122
+ async invoke(routeName, options) {
123
+ const route = this.plugin.routes[routeName];
124
+ if (!route) return {
125
+ success: false,
126
+ error: {
127
+ code: "ROUTE_NOT_FOUND",
128
+ message: `Route "${routeName}" not found in plugin "${this.plugin.id}"`
129
+ },
130
+ status: 404
131
+ };
132
+ let validatedInput;
133
+ if (route.input) {
134
+ const parseResult = route.input.safeParse(options.body);
135
+ if (!parseResult.success) return {
136
+ success: false,
137
+ error: {
138
+ code: "VALIDATION_ERROR",
139
+ message: "Invalid request body",
140
+ details: z.formatError(parseResult.error)
141
+ },
142
+ status: 400
143
+ };
144
+ validatedInput = parseResult.data;
145
+ } else validatedInput = options.body;
146
+ const routeContext = {
147
+ ...this.contextFactory.createContext(this.plugin),
148
+ input: validatedInput,
149
+ request: guardConsumedRequestBody(options.request),
150
+ requestMeta: extractRequestMeta(options.request, this.trustedProxyHeaders),
151
+ user: options.user,
152
+ ui: options.ui
153
+ };
154
+ try {
155
+ return {
156
+ success: true,
157
+ data: await route.handler(routeContext),
158
+ status: 200
159
+ };
160
+ } catch (error) {
161
+ if (error instanceof SiteWriteBlockedError) return {
162
+ success: false,
163
+ error: {
164
+ code: error.code,
165
+ message: error.message
166
+ },
167
+ status: error.status
168
+ };
169
+ if (isPluginRouteError(error)) return {
170
+ success: false,
171
+ error: {
172
+ code: error.code,
173
+ message: error.message,
174
+ details: error.details
175
+ },
176
+ status: error.status
177
+ };
178
+ console.error(`[plugin:${this.plugin.id}] Route handler failed:`, error);
179
+ return {
180
+ success: false,
181
+ error: {
182
+ code: "INTERNAL_ERROR",
183
+ message: "An internal error occurred"
184
+ },
185
+ status: 500
186
+ };
187
+ }
188
+ }
189
+ /**
190
+ * Get all route names
191
+ */
192
+ getRouteNames() {
193
+ return Object.keys(this.plugin.routes);
194
+ }
195
+ /**
196
+ * Check if a route exists
197
+ */
198
+ hasRoute(name) {
199
+ return name in this.plugin.routes;
200
+ }
201
+ /**
202
+ * Get route metadata without invoking the handler.
203
+ * Returns null if the route doesn't exist.
204
+ */
205
+ getRouteMeta(name) {
206
+ const route = this.plugin.routes[name];
207
+ if (!route) return null;
208
+ return buildRouteMeta(route);
209
+ }
210
+ };
211
+ /**
212
+ * Registry for all plugin route handlers
213
+ */
214
+ var PluginRouteRegistry = class {
215
+ handlers = /* @__PURE__ */ new Map();
216
+ constructor(factoryOptions) {
217
+ this.factoryOptions = factoryOptions;
218
+ }
219
+ /**
220
+ * Register a plugin's routes
221
+ */
222
+ register(plugin) {
223
+ const handler = new PluginRouteHandler(plugin, this.factoryOptions);
224
+ this.handlers.set(plugin.id, handler);
225
+ }
226
+ /**
227
+ * Unregister a plugin's routes
228
+ */
229
+ unregister(pluginId) {
230
+ this.handlers.delete(pluginId);
231
+ }
232
+ /**
233
+ * Invoke a plugin route
234
+ */
235
+ async invoke(pluginId, routeName, options) {
236
+ const handler = this.handlers.get(pluginId);
237
+ if (!handler) return {
238
+ success: false,
239
+ error: {
240
+ code: "PLUGIN_NOT_FOUND",
241
+ message: `Plugin "${pluginId}" not found`
242
+ },
243
+ status: 404
244
+ };
245
+ return handler.invoke(routeName, options);
246
+ }
247
+ /**
248
+ * Get all registered plugin IDs
249
+ */
250
+ getPluginIds() {
251
+ return [...this.handlers.keys()];
252
+ }
253
+ /**
254
+ * Get routes for a plugin
255
+ */
256
+ getRoutes(pluginId) {
257
+ return this.handlers.get(pluginId)?.getRouteNames() ?? [];
258
+ }
259
+ /**
260
+ * Get route metadata for a specific plugin route.
261
+ * Returns null if the plugin or route doesn't exist.
262
+ */
263
+ getRouteMeta(pluginId, routeName) {
264
+ const handler = this.handlers.get(pluginId);
265
+ if (!handler) return null;
266
+ return handler.getRouteMeta(routeName);
267
+ }
268
+ };
269
+
270
+ //#endregion
271
+ export { toRouteCallerInfo as a, pluginPublicRouteAcknowledgementSchema as i, buildRouteMeta as n, parseRouteInput as r, PluginRouteRegistry as t };
272
+ //# sourceMappingURL=routes-YQkSOsws.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-YQkSOsws.mjs","names":[],"sources":["../src/plugins/routes.ts"],"sourcesContent":["/**\n * Plugin Routes v2\n *\n * Handles plugin API route invocation with:\n * - Input validation via Zod schemas\n * - Route context creation\n * - Error handling\n *\n */\n\nimport type { PluginUiContext } from \"@emdash-cms/blocks/server\";\nimport type {\n\tPluginRouteMethod,\n\tPluginRouteRequest,\n\tPluginRouteResponseMode,\n} from \"@emdash-cms/plugin-types\";\nimport { routeNameSchema } from \"@emdash-cms/plugin-types\";\nimport { z } from \"zod\";\n\nimport { SiteWriteBlockedError } from \"../transfer/fence.js\";\nimport { PluginContextFactory, type PluginContextFactoryOptions } from \"./context.js\";\nimport { extractRequestMeta } from \"./request-meta.js\";\nimport { isPluginRouteError, PluginRouteError } from \"./route-error.js\";\nimport { parseDeclaredPluginRouteInput } from \"./route-wire.js\";\nimport type { ResolvedPlugin, RouteContext, PluginRoute, UserInfo } from \"./types.js\";\n\nexport { PluginRouteError };\n\n/**\n * Body-reading methods on `Request`. EmDash parses the request body once before\n * the handler runs and exposes the result as `ctx.input`, leaving the underlying\n * stream consumed. Calling any of these on `ctx.request` would re-read a spent\n * stream and throw an opaque platform error (\"Body is unusable: Body has already\n * been read\") with no hint about `ctx.input` — so the guard replaces them with an\n * actionable message instead.\n */\nconst CONSUMED_BODY_METHODS = new Set([\"json\", \"text\", \"arrayBuffer\", \"blob\", \"formData\", \"bytes\"]);\n\n/**\n * Wrap the request handed to a plugin route handler so an accidental\n * `ctx.request.json()` (or `.text()`, `.formData()`, …) fails with a message\n * pointing at `ctx.input` rather than the runtime's cryptic \"body already read\"\n * error. Every non-body member passes through unchanged; function members are\n * bound to the underlying request so methods like `clone()` don't throw an\n * \"Illegal invocation\" when called on the proxy.\n */\nfunction guardConsumedRequestBody(request: Request): Request {\n\treturn new Proxy(request, {\n\t\tget(target, prop) {\n\t\t\tif (typeof prop === \"string\" && CONSUMED_BODY_METHODS.has(prop)) {\n\t\t\t\treturn () => {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[emdash] ctx.request.${prop}() is not available inside a plugin route handler: ` +\n\t\t\t\t\t\t\t`EmDash has already parsed the request body and exposes it as ctx.input. ` +\n\t\t\t\t\t\t\t`Read ctx.input instead of ctx.request.${prop}().`,\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst value = Reflect.get(target, prop, target);\n\t\t\treturn typeof value === \"function\" ? value.bind(target) : value;\n\t\t},\n\t});\n}\n\n/**\n * Route metadata (public flag) without the handler.\n * Used by the catch-all route to decide auth before dispatch.\n */\nexport interface RouteMeta {\n\tpublic: boolean;\n\tpermission?: string;\n\t/**\n\t * Cache-Control value for successful GET responses. Only ever set for\n\t * public routes — authenticated responses must stay `private, no-store`.\n\t */\n\tcacheControl?: string;\n\tmethods?: PluginRouteMethod[];\n\trequest?: PluginRouteRequest;\n\tresponse?: PluginRouteResponseMode;\n}\n\nexport const pluginPublicRouteAcknowledgementSchema = z.array(routeNameSchema);\n\nexport type PluginContentCacheInvalidator = (tags: string[]) => Promise<void>;\n\n/**\n * Build RouteMeta from a route's `public`/`cacheControl` flags. Single source\n * of truth for the \"cacheControl is only ever exposed on public routes\"\n * invariant — used for trusted routes and manifest-declared sandboxed routes.\n */\nexport function buildRouteMeta(route: {\n\tpublic?: boolean;\n\tpermission?: string;\n\tcacheControl?: string;\n\tmethods?: PluginRouteMethod[];\n\trequest?: PluginRouteRequest;\n\tresponse?: PluginRouteResponseMode;\n}): RouteMeta {\n\tconst meta: RouteMeta = { public: route.public === true };\n\tif (route.permission !== undefined) meta.permission = route.permission;\n\tif (route.methods !== undefined) meta.methods = [...route.methods];\n\tif (route.request !== undefined) {\n\t\tmeta.request = {\n\t\t\t...route.request,\n\t\t\t...(route.request.headers ? { headers: [...route.request.headers] } : {}),\n\t\t};\n\t}\n\tif (route.response !== undefined) meta.response = route.response;\n\t// Private responses are per-user and must never become cacheable, even if\n\t// a route sets both flags.\n\tif (meta.public && typeof route.cacheControl === \"string\" && route.cacheControl.length > 0) {\n\t\tmeta.cacheControl = route.cacheControl;\n\t}\n\treturn meta;\n}\n\n/**\n * HTTP methods that carry a request body. Everything else (GET, HEAD, DELETE)\n * takes its route input from the URL query string.\n */\nconst BODY_METHODS = new Set([\"POST\", \"PUT\", \"PATCH\"]);\n\n/**\n * Parse a plugin route's input from the request, by method.\n *\n * Body methods (POST/PUT/PATCH) parse the JSON body as before. Bodyless\n * methods (GET/HEAD/DELETE) have no body, so `request.json()` resolves to\n * undefined and fails schema validation, so parse the query string into\n * an object instead. Repeated keys (`?tag=a&tag=b`) become an array so array\n * schemas work; a single key stays a scalar.\n */\nexport async function parseRouteInput(\n\trequest: Request,\n\tdeclaration?: PluginRouteRequest,\n): Promise<unknown> {\n\tif (declaration) return parseDeclaredPluginRouteInput(request, declaration);\n\tif (BODY_METHODS.has(request.method.toUpperCase())) {\n\t\ttry {\n\t\t\treturn await request.json();\n\t\t} catch {\n\t\t\t// No body or not JSON\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tconst params = new URL(request.url).searchParams;\n\tconst input: Record<string, string | string[]> = {};\n\tfor (const key of new Set(params.keys())) {\n\t\tconst values = params.getAll(key);\n\t\tinput[key] = values.length > 1 ? values : values[0];\n\t}\n\treturn input;\n}\n\n/**\n * Result from a route invocation\n */\nexport interface RouteResult<T = unknown> {\n\tsuccess: boolean;\n\tdata?: T;\n\terror?: {\n\t\tcode: string;\n\t\tmessage: string;\n\t\tdetails?: unknown;\n\t};\n\tstatus: number;\n}\n\n/**\n * Host-side user shape accepted when dispatching a plugin route. Structurally\n * matches `User` from `@emdash-cms/auth` so hosts can pass `locals.user`\n * directly without the plugin layer depending on the auth package.\n */\nexport interface RouteCallerInput {\n\tid: string;\n\temail: string;\n\tname: string | null;\n\trole: number;\n\tcreatedAt: Date | string;\n}\n\n/**\n * Convert the host's authenticated user into the read-only `UserInfo` shape\n * exposed to plugins as `ctx.user`. Strips sensitive/irrelevant fields and\n * keeps the value structured-clone-safe for sandboxed plugins.\n */\nexport function toRouteCallerInfo(user: RouteCallerInput): UserInfo {\n\treturn {\n\t\tid: user.id,\n\t\temail: user.email,\n\t\tname: user.name,\n\t\trole: user.role,\n\t\tcreatedAt: typeof user.createdAt === \"string\" ? user.createdAt : user.createdAt.toISOString(),\n\t};\n}\n\n/**\n * Route invocation options\n */\nexport interface InvokeRouteOptions {\n\t/** The original request */\n\trequest: Request;\n\t/** Request body (already parsed) */\n\tbody?: unknown;\n\t/**\n\t * Authenticated caller resolved by the host, exposed to the handler as\n\t * `ctx.user`. Undefined for public routes and unbound machine tokens.\n\t */\n\tuser?: UserInfo;\n\t/** Host-attested context for a validated Block Kit request. */\n\tui?: PluginUiContext;\n}\n\n/**\n * Route handler for a plugin\n */\nexport class PluginRouteHandler {\n\tprivate contextFactory: PluginContextFactory;\n\tprivate plugin: ResolvedPlugin;\n\tprivate trustedProxyHeaders: string[];\n\n\tconstructor(plugin: ResolvedPlugin, factoryOptions: PluginContextFactoryOptions) {\n\t\tthis.plugin = plugin;\n\t\tthis.contextFactory = new PluginContextFactory(factoryOptions);\n\t\tthis.trustedProxyHeaders = factoryOptions.trustedProxyHeaders ?? [];\n\t}\n\n\t/**\n\t * Invoke a route by name\n\t */\n\tasync invoke(routeName: string, options: InvokeRouteOptions): Promise<RouteResult> {\n\t\tconst route = this.plugin.routes[routeName];\n\n\t\tif (!route) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"ROUTE_NOT_FOUND\",\n\t\t\t\t\tmessage: `Route \"${routeName}\" not found in plugin \"${this.plugin.id}\"`,\n\t\t\t\t},\n\t\t\t\tstatus: 404,\n\t\t\t};\n\t\t}\n\n\t\t// Validate input if schema is provided\n\t\tlet validatedInput: unknown;\n\t\tif (route.input) {\n\t\t\tconst parseResult = route.input.safeParse(options.body);\n\t\t\tif (!parseResult.success) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\t\t\tmessage: \"Invalid request body\",\n\t\t\t\t\t\tdetails: z.formatError(parseResult.error),\n\t\t\t\t\t},\n\t\t\t\t\tstatus: 400,\n\t\t\t\t};\n\t\t\t}\n\t\t\tvalidatedInput = parseResult.data;\n\t\t} else {\n\t\t\tvalidatedInput = options.body;\n\t\t}\n\n\t\t// Create route context\n\t\tconst baseContext = this.contextFactory.createContext(this.plugin);\n\t\tconst routeContext: RouteContext = {\n\t\t\t...baseContext,\n\t\t\tinput: validatedInput,\n\t\t\t// The body is already parsed into `input`; guard `ctx.request`'s\n\t\t\t// body-reading methods so a re-read fails with an actionable message.\n\t\t\t// Metadata extraction uses the original request (headers only).\n\t\t\trequest: guardConsumedRequestBody(options.request),\n\t\t\trequestMeta: extractRequestMeta(options.request, this.trustedProxyHeaders),\n\t\t\tuser: options.user,\n\t\t\tui: options.ui,\n\t\t};\n\n\t\t// Execute handler\n\t\ttry {\n\t\t\tconst result = await route.handler(routeContext);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: result,\n\t\t\t\tstatus: 200,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (error instanceof SiteWriteBlockedError) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: { code: error.code, message: error.message },\n\t\t\t\t\tstatus: error.status,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Handle known error types\n\t\t\tif (isPluginRouteError(error)) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: error.code,\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tdetails: error.details,\n\t\t\t\t\t},\n\t\t\t\t\tstatus: error.status,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Unknown error -- log internally, return generic message\n\t\t\tconsole.error(`[plugin:${this.plugin.id}] Route handler failed:`, error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"INTERNAL_ERROR\",\n\t\t\t\t\tmessage: \"An internal error occurred\",\n\t\t\t\t},\n\t\t\t\tstatus: 500,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Get all route names\n\t */\n\tgetRouteNames(): string[] {\n\t\treturn Object.keys(this.plugin.routes);\n\t}\n\n\t/**\n\t * Check if a route exists\n\t */\n\thasRoute(name: string): boolean {\n\t\treturn name in this.plugin.routes;\n\t}\n\n\t/**\n\t * Get route metadata without invoking the handler.\n\t * Returns null if the route doesn't exist.\n\t */\n\tgetRouteMeta(name: string): RouteMeta | null {\n\t\tconst route: PluginRoute | undefined = this.plugin.routes[name];\n\t\tif (!route) return null;\n\t\treturn buildRouteMeta(route);\n\t}\n}\n\n/**\n * Registry for all plugin route handlers\n */\nexport class PluginRouteRegistry {\n\tprivate handlers: Map<string, PluginRouteHandler> = new Map();\n\n\tconstructor(private factoryOptions: PluginContextFactoryOptions) {}\n\n\t/**\n\t * Register a plugin's routes\n\t */\n\tregister(plugin: ResolvedPlugin): void {\n\t\tconst handler = new PluginRouteHandler(plugin, this.factoryOptions);\n\t\tthis.handlers.set(plugin.id, handler);\n\t}\n\n\t/**\n\t * Unregister a plugin's routes\n\t */\n\tunregister(pluginId: string): void {\n\t\tthis.handlers.delete(pluginId);\n\t}\n\n\t/**\n\t * Invoke a plugin route\n\t */\n\tasync invoke(\n\t\tpluginId: string,\n\t\trouteName: string,\n\t\toptions: InvokeRouteOptions,\n\t): Promise<RouteResult> {\n\t\tconst handler = this.handlers.get(pluginId);\n\n\t\tif (!handler) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"PLUGIN_NOT_FOUND\",\n\t\t\t\t\tmessage: `Plugin \"${pluginId}\" not found`,\n\t\t\t\t},\n\t\t\t\tstatus: 404,\n\t\t\t};\n\t\t}\n\n\t\treturn handler.invoke(routeName, options);\n\t}\n\n\t/**\n\t * Get all registered plugin IDs\n\t */\n\tgetPluginIds(): string[] {\n\t\treturn [...this.handlers.keys()];\n\t}\n\n\t/**\n\t * Get routes for a plugin\n\t */\n\tgetRoutes(pluginId: string): string[] {\n\t\treturn this.handlers.get(pluginId)?.getRouteNames() ?? [];\n\t}\n\n\t/**\n\t * Get route metadata for a specific plugin route.\n\t * Returns null if the plugin or route doesn't exist.\n\t */\n\tgetRouteMeta(pluginId: string, routeName: string): RouteMeta | null {\n\t\tconst handler = this.handlers.get(pluginId);\n\t\tif (!handler) return null;\n\t\treturn handler.getRouteMeta(routeName);\n\t}\n}\n\n/**\n * Create a route registry\n */\nexport function createRouteRegistry(\n\tfactoryOptions: PluginContextFactoryOptions,\n): PluginRouteRegistry {\n\treturn new PluginRouteRegistry(factoryOptions);\n}\n"],"mappings":"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"}