emdash 1.3.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 (1451) 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 -57
  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.mjs +23 -12
  30. package/dist/astro/index.mjs.map +1 -1
  31. package/dist/astro/middleware/auth.d.mts +12 -12
  32. package/dist/astro/middleware/auth.mjs +10 -10
  33. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  34. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  35. package/dist/astro/middleware/redirect.mjs +128 -48
  36. package/dist/astro/middleware/redirect.mjs.map +1 -1
  37. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  38. package/dist/astro/middleware/request-context.mjs +12 -8
  39. package/dist/astro/middleware/request-context.mjs.map +1 -1
  40. package/dist/astro/middleware/setup.mjs +1 -1
  41. package/dist/astro/middleware.d.mts +12 -12
  42. package/dist/astro/middleware.d.mts.map +1 -1
  43. package/dist/astro/middleware.mjs +134 -124
  44. package/dist/astro/middleware.mjs.map +1 -1
  45. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +16 -16
  46. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +16 -16
  47. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  48. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  49. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
  50. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +19 -19
  51. package/dist/astro/routes/api/admin/byline-fields/index.mjs +19 -19
  52. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +19 -19
  53. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +29 -28
  54. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +29 -28
  56. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  57. package/dist/astro/routes/api/admin/bylines/index.mjs +29 -28
  58. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +21 -21
  60. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
  61. package/dist/astro/routes/api/admin/comments/bulk.mjs +20 -20
  62. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
  63. package/dist/astro/routes/api/admin/comments/index.mjs +20 -20
  64. package/dist/astro/routes/api/admin/core-update.mjs +7 -7
  65. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  66. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  67. package/dist/astro/routes/api/admin/media-usage/activation.mjs +22 -22
  68. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +23 -23
  69. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +23 -23
  70. package/dist/astro/routes/api/admin/media-usage/progress.mjs +27 -26
  71. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  72. package/dist/astro/routes/api/admin/media-usage/repair.mjs +33 -32
  73. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  74. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +23 -23
  75. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +23 -23
  76. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  77. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  78. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  79. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  80. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +81 -79
  81. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  83. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +80 -78
  84. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  85. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +80 -78
  86. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +91 -89
  88. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  89. package/dist/astro/routes/api/admin/plugins/index.mjs +81 -79
  90. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +7 -7
  92. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +80 -78
  93. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +90 -88
  95. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +80 -78
  97. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  98. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +80 -78
  99. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  100. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +92 -90
  101. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
  103. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +82 -80
  104. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  106. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +81 -79
  107. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  108. package/dist/astro/routes/api/admin/plugins/updates.mjs +80 -78
  109. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  110. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
  111. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +80 -78
  112. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  113. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +7 -7
  114. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +80 -78
  115. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  116. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  117. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +45 -43
  118. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
  119. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +45 -43
  120. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +47 -45
  122. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
  123. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +47 -45
  124. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
  125. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +47 -45
  126. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
  127. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +48 -46
  128. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
  129. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +48 -46
  130. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
  131. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +47 -45
  132. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
  133. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +48 -46
  134. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
  135. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +49 -47
  136. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
  137. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +47 -45
  138. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
  139. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +47 -45
  140. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
  141. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +49 -47
  142. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
  143. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +47 -45
  144. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
  145. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +49 -47
  146. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
  147. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +47 -45
  148. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
  149. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +47 -45
  150. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
  151. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +49 -47
  152. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
  153. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +47 -45
  154. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
  155. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +47 -45
  156. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
  157. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +49 -47
  158. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
  159. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  160. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  161. package/dist/astro/routes/api/admin/users/_id_/index.mjs +17 -17
  162. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  163. package/dist/astro/routes/api/admin/users/index.mjs +16 -16
  164. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  165. package/dist/astro/routes/api/auth/handover.mjs +6 -6
  166. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  167. package/dist/astro/routes/api/auth/invite/complete.mjs +21 -21
  168. package/dist/astro/routes/api/auth/invite/index.mjs +18 -18
  169. package/dist/astro/routes/api/auth/invite/register-options.mjs +19 -19
  170. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  171. package/dist/astro/routes/api/auth/magic-link/send.mjs +20 -20
  172. package/dist/astro/routes/api/auth/magic-link/verify.mjs +17 -17
  173. package/dist/astro/routes/api/auth/me.mjs +17 -17
  174. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  175. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +8 -8
  176. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  177. package/dist/astro/routes/api/auth/passkey/_id_.mjs +16 -16
  178. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  179. package/dist/astro/routes/api/auth/passkey/options.mjs +21 -21
  180. package/dist/astro/routes/api/auth/passkey/register/options.mjs +19 -19
  181. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +20 -20
  182. package/dist/astro/routes/api/auth/passkey/verify.mjs +21 -21
  183. package/dist/astro/routes/api/auth/signup/complete.mjs +21 -21
  184. package/dist/astro/routes/api/auth/signup/request.mjs +19 -19
  185. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  186. package/dist/astro/routes/api/calendar.mjs +17 -17
  187. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
  188. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +21 -21
  189. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  190. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +20 -20
  191. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  192. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +19 -19
  193. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -6
  194. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +12 -12
  195. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +36 -35
  196. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  197. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +20 -20
  198. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +40 -39
  199. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  200. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +40 -39
  201. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  202. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -6
  203. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  204. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +20 -20
  205. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  206. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +40 -32
  207. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  208. package/dist/astro/routes/api/content/_collection_/_id_/translations.d.mts.map +1 -1
  209. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +9 -5
  210. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  211. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +20 -20
  212. package/dist/astro/routes/api/content/_collection_/_id_.mjs +20 -20
  213. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  214. package/dist/astro/routes/api/content/_collection_/index.mjs +17 -17
  215. package/dist/astro/routes/api/content/_collection_/trash.mjs +17 -17
  216. package/dist/astro/routes/api/dashboard.mjs +21 -15
  217. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  218. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  219. package/dist/astro/routes/api/dev/scheduled-tasks.mjs +119 -117
  220. package/dist/astro/routes/api/dev/scheduled-tasks.mjs.map +1 -1
  221. package/dist/astro/routes/api/health.mjs +6 -6
  222. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  223. package/dist/astro/routes/api/import/probe.mjs +31 -29
  224. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  225. package/dist/astro/routes/api/import/wordpress/analyze.mjs +8 -8
  226. package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
  227. package/dist/astro/routes/api/import/wordpress/execute.mjs +31 -30
  228. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  229. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  230. package/dist/astro/routes/api/import/wordpress/media.mjs +21 -21
  231. package/dist/astro/routes/api/import/wordpress/prepare.mjs +22 -22
  232. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  233. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +32 -31
  234. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  235. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  236. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +31 -29
  237. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  238. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  239. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +42 -40
  240. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  241. package/dist/astro/routes/api/manifest.mjs +6 -6
  242. package/dist/astro/routes/api/mcp.mjs +117 -100
  243. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  244. package/dist/astro/routes/api/media/_id_/confirm.mjs +21 -21
  245. package/dist/astro/routes/api/media/_id_/replace.mjs +18 -18
  246. package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
  247. package/dist/astro/routes/api/media/_id_/usage.mjs +35 -34
  248. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  249. package/dist/astro/routes/api/media/_id_.mjs +33 -32
  250. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  251. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  252. package/dist/astro/routes/api/media/file/_...key_.mjs +21 -13
  253. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  254. package/dist/astro/routes/api/media/folders/_id_.mjs +18 -18
  255. package/dist/astro/routes/api/media/folders/index.mjs +18 -18
  256. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  257. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  258. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  259. package/dist/astro/routes/api/media/upload-url.mjs +20 -20
  260. package/dist/astro/routes/api/media.mjs +37 -36
  261. package/dist/astro/routes/api/media.mjs.map +1 -1
  262. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +22 -21
  263. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  264. package/dist/astro/routes/api/menus/_name_/items.mjs +22 -21
  265. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  266. package/dist/astro/routes/api/menus/_name_/reorder.mjs +22 -21
  267. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  268. package/dist/astro/routes/api/menus/_name_/translations.mjs +22 -21
  269. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  270. package/dist/astro/routes/api/menus/_name_.mjs +22 -21
  271. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  272. package/dist/astro/routes/api/menus/index.mjs +22 -21
  273. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  274. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  275. package/dist/astro/routes/api/oauth/device/authorize.mjs +8 -8
  276. package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
  277. package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
  278. package/dist/astro/routes/api/oauth/register.mjs +7 -7
  279. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  280. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  281. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  282. package/dist/astro/routes/api/openapi.json.mjs +22 -22
  283. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +12 -12
  284. package/dist/astro/routes/api/redirects/404s/index.mjs +23 -22
  285. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  286. package/dist/astro/routes/api/redirects/404s/summary.mjs +23 -22
  287. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  288. package/dist/astro/routes/api/redirects/_id_.mjs +24 -23
  289. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  290. package/dist/astro/routes/api/redirects/index.mjs +24 -23
  291. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  292. package/dist/astro/routes/api/relations/_id_/index.mjs +40 -39
  293. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  294. package/dist/astro/routes/api/relations/index.mjs +40 -39
  295. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  296. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  297. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +19 -19
  298. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +80 -78
  299. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  300. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +80 -78
  301. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  302. package/dist/astro/routes/api/schema/block-types/index.mjs +80 -78
  303. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  304. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +80 -78
  305. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  306. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +80 -78
  307. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  308. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +80 -78
  309. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  310. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +80 -78
  311. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  312. package/dist/astro/routes/api/schema/collections/index.mjs +80 -78
  313. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  314. package/dist/astro/routes/api/schema/collections/reorder.mjs +80 -78
  315. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  316. package/dist/astro/routes/api/schema/index.mjs +20 -19
  317. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  318. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +80 -78
  319. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  320. package/dist/astro/routes/api/schema/orphans/index.mjs +80 -78
  321. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  322. package/dist/astro/routes/api/search/enable.mjs +23 -22
  323. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  324. package/dist/astro/routes/api/search/index.mjs +22 -21
  325. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  326. package/dist/astro/routes/api/search/rebuild.mjs +23 -22
  327. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  328. package/dist/astro/routes/api/search/stats.mjs +12 -11
  329. package/dist/astro/routes/api/search/stats.mjs.map +1 -1
  330. package/dist/astro/routes/api/search/suggest.mjs +22 -21
  331. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  332. package/dist/astro/routes/api/sections/_slug_.mjs +22 -21
  333. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  334. package/dist/astro/routes/api/sections/index.mjs +22 -21
  335. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  336. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  337. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  338. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  339. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  340. package/dist/astro/routes/api/settings/domain-notify.mjs +9 -9
  341. package/dist/astro/routes/api/settings/domain.mjs +22 -20
  342. package/dist/astro/routes/api/settings/domain.mjs.map +1 -1
  343. package/dist/astro/routes/api/settings/email.mjs +6 -6
  344. package/dist/astro/routes/api/settings.mjs +29 -27
  345. package/dist/astro/routes/api/settings.mjs.map +1 -1
  346. package/dist/astro/routes/api/setup/admin-verify.mjs +23 -23
  347. package/dist/astro/routes/api/setup/admin.mjs +20 -20
  348. package/dist/astro/routes/api/setup/dev-bypass.mjs +52 -50
  349. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  350. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  351. package/dist/astro/routes/api/setup/index.mjs +58 -56
  352. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  353. package/dist/astro/routes/api/setup/status.mjs +6 -6
  354. package/dist/astro/routes/api/site/domain-proof.mjs +16 -14
  355. package/dist/astro/routes/api/site/domain-proof.mjs.map +1 -1
  356. package/dist/astro/routes/api/snapshot.mjs +8 -8
  357. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +30 -29
  358. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  359. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +30 -29
  360. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  361. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +30 -29
  362. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  363. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +30 -29
  364. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  365. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +28 -27
  366. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  367. package/dist/astro/routes/api/taxonomies/_name_.mjs +30 -29
  368. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  369. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +44 -43
  370. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  371. package/dist/astro/routes/api/taxonomies/index.mjs +30 -29
  372. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  373. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  374. package/dist/astro/routes/api/typegen.mjs +6 -6
  375. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  376. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +21 -21
  377. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  378. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  379. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  380. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  381. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +19 -19
  382. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +24 -23
  383. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  384. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +24 -23
  385. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  386. package/dist/astro/routes/api/widget-areas/_name_.mjs +13 -12
  387. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
  388. package/dist/astro/routes/api/widget-areas/index.mjs +24 -23
  389. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  390. package/dist/astro/routes/api/widget-components.mjs +5 -5
  391. package/dist/astro/routes/robots.txt.mjs +15 -13
  392. package/dist/astro/routes/robots.txt.mjs.map +1 -1
  393. package/dist/astro/routes/sitemap-_collection_.xml.mjs +19 -17
  394. package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
  395. package/dist/astro/routes/sitemap.xml.mjs +16 -14
  396. package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
  397. package/dist/astro/types.d.mts +17 -17
  398. package/dist/audit-B8XE-0UV.mjs +127 -0
  399. package/dist/audit-B8XE-0UV.mjs.map +1 -0
  400. package/dist/auth/providers/github.d.mts +1 -1
  401. package/dist/auth/providers/google.d.mts +1 -1
  402. package/dist/auth/providers/microsoft.d.mts +1 -1
  403. package/dist/authoritative-records-LPtrIGOY.mjs +5183 -0
  404. package/dist/authoritative-records-LPtrIGOY.mjs.map +1 -0
  405. package/dist/authorize-CoDsRRp5.mjs +74 -0
  406. package/dist/authorize-CoDsRRp5.mjs.map +1 -0
  407. package/dist/backup-2Wj-hTCN.mjs +246 -0
  408. package/dist/backup-2Wj-hTCN.mjs.map +1 -0
  409. package/dist/block-types-C3gJEe7l.mjs +132 -0
  410. package/dist/block-types-C3gJEe7l.mjs.map +1 -0
  411. package/dist/block-values-CgbMtSGU.mjs +215 -0
  412. package/dist/block-values-CgbMtSGU.mjs.map +1 -0
  413. package/dist/byline-CzGZC2Zs.mjs +922 -0
  414. package/dist/byline-CzGZC2Zs.mjs.map +1 -0
  415. package/dist/byline-fields-B1qHvRps.mjs +280 -0
  416. package/dist/byline-fields-B1qHvRps.mjs.map +1 -0
  417. package/dist/byline-fields-vYd_4Q1e.mjs +123 -0
  418. package/dist/byline-fields-vYd_4Q1e.mjs.map +1 -0
  419. package/dist/byline-registry-BhzpO41z.mjs +406 -0
  420. package/dist/byline-registry-BhzpO41z.mjs.map +1 -0
  421. package/dist/bylines-BF555iIz.mjs +150 -0
  422. package/dist/bylines-BF555iIz.mjs.map +1 -0
  423. package/dist/bylines-DJx6IWWi.mjs +234 -0
  424. package/dist/bylines-DJx6IWWi.mjs.map +1 -0
  425. package/dist/cache-BWzswWB-.mjs +151 -0
  426. package/dist/cache-BWzswWB-.mjs.map +1 -0
  427. package/dist/canonical-DjF_z6GI.mjs +174 -0
  428. package/dist/canonical-DjF_z6GI.mjs.map +1 -0
  429. package/dist/capture-triggers-D7g3fOZj.mjs +362 -0
  430. package/dist/capture-triggers-D7g3fOZj.mjs.map +1 -0
  431. package/dist/challenge-store-Cfjdvw86.mjs +51 -0
  432. package/dist/challenge-store-Cfjdvw86.mjs.map +1 -0
  433. package/dist/checksum-BF4acJwn.mjs +162 -0
  434. package/dist/checksum-BF4acJwn.mjs.map +1 -0
  435. package/dist/chrome-tags-BDs29G3g.mjs +24 -0
  436. package/dist/chrome-tags-BDs29G3g.mjs.map +1 -0
  437. package/dist/chunks-CYBOL-zn.mjs +25 -0
  438. package/dist/chunks-CYBOL-zn.mjs.map +1 -0
  439. package/dist/cli/index.mjs +67 -65
  440. package/dist/cli/index.mjs.map +1 -1
  441. package/dist/client/cf-access.d.mts +1 -1
  442. package/dist/client/index.d.mts +48 -48
  443. package/dist/client/index.d.mts.map +1 -1
  444. package/dist/client/index.mjs +4 -3
  445. package/dist/client/index.mjs.map +1 -1
  446. package/dist/collection-slugs-cache-B2J5aESO.mjs +91 -0
  447. package/dist/collection-slugs-cache-B2J5aESO.mjs.map +1 -0
  448. package/dist/comment-DV7dybcs.mjs +335 -0
  449. package/dist/comment-DV7dybcs.mjs.map +1 -0
  450. package/dist/comment-reaction-CWwqiT6x.mjs +85 -0
  451. package/dist/comment-reaction-CWwqiT6x.mjs.map +1 -0
  452. package/dist/comments-DVjWJm8X.mjs +99 -0
  453. package/dist/comments-DVjWJm8X.mjs.map +1 -0
  454. package/dist/comments-Q-ILHCEI.mjs +195 -0
  455. package/dist/comments-Q-ILHCEI.mjs.map +1 -0
  456. package/dist/components-DnOmvvgg.mjs +112 -0
  457. package/dist/components-DnOmvvgg.mjs.map +1 -0
  458. package/dist/config-9IzA83_U.d.mts +6811 -0
  459. package/dist/config-9IzA83_U.d.mts.map +1 -0
  460. package/dist/config-BdQzFtmR.mjs +228 -0
  461. package/dist/config-BdQzFtmR.mjs.map +1 -0
  462. package/dist/config-Cs2RBkJ6.d.mts +41 -0
  463. package/dist/config-Cs2RBkJ6.d.mts.map +1 -0
  464. package/dist/config-Cs_AwWXI.mjs +106 -0
  465. package/dist/config-Cs_AwWXI.mjs.map +1 -0
  466. package/dist/connection-CiXgZyCY.mjs +36 -0
  467. package/dist/connection-CiXgZyCY.mjs.map +1 -0
  468. package/dist/content-Dt0Os_WQ.mjs +2109 -0
  469. package/dist/content-Dt0Os_WQ.mjs.map +1 -0
  470. package/dist/content-list-query-BK26u9Ly.d.mts +26 -0
  471. package/dist/content-list-query-BK26u9Ly.d.mts.map +1 -0
  472. package/dist/content-policy-BLDbNJOb.mjs +46 -0
  473. package/dist/content-policy-BLDbNJOb.mjs.map +1 -0
  474. package/dist/content-repair-CjwbLy4m.mjs +442 -0
  475. package/dist/content-repair-CjwbLy4m.mjs.map +1 -0
  476. package/dist/context-ErV7UdQY.mjs +2089 -0
  477. package/dist/context-ErV7UdQY.mjs.map +1 -0
  478. package/dist/credits-BRyjafiF.mjs +110 -0
  479. package/dist/credits-BRyjafiF.mjs.map +1 -0
  480. package/dist/cron-Bm5xa7tv.mjs +306 -0
  481. package/dist/cron-Bm5xa7tv.mjs.map +1 -0
  482. package/dist/dashboard-DVxQ5XiI.mjs +168 -0
  483. package/dist/dashboard-DVxQ5XiI.mjs.map +1 -0
  484. package/dist/database/migration-lock.mjs +1 -1
  485. package/dist/db/index.d.mts +3 -3
  486. package/dist/db/index.mjs +2 -2
  487. package/dist/db/libsql-migrations.d.mts +1 -1
  488. package/dist/db/libsql-migrations.mjs +5 -5
  489. package/dist/db/libsql.d.mts +1 -1
  490. package/dist/db/postgres-migrations.d.mts +1 -1
  491. package/dist/db/postgres-migrations.mjs +5 -5
  492. package/dist/db/postgres.d.mts +1 -1
  493. package/dist/db/sqlite-migrations.d.mts +1 -1
  494. package/dist/db/sqlite-migrations.mjs +5 -5
  495. package/dist/db/sqlite.d.mts +1 -1
  496. package/dist/db/sqlite.mjs +1 -1
  497. package/dist/db-errors-unnO6yiZ.mjs +65 -0
  498. package/dist/db-errors-unnO6yiZ.mjs.map +1 -0
  499. package/dist/default-B9Tf2n94.mjs +81 -0
  500. package/dist/default-B9Tf2n94.mjs.map +1 -0
  501. package/dist/deferred-tasks-CpPEqsga.d.mts +9 -0
  502. package/dist/deferred-tasks-CpPEqsga.d.mts.map +1 -0
  503. package/dist/destination-DR3IHjmy.mjs +18 -0
  504. package/dist/destination-DR3IHjmy.mjs.map +1 -0
  505. package/dist/dev-typegen-ZeWYV8Jp.mjs +29 -0
  506. package/dist/dev-typegen-ZeWYV8Jp.mjs.map +1 -0
  507. package/dist/device-flow-BbYNZ9Xi.mjs +521 -0
  508. package/dist/device-flow-BbYNZ9Xi.mjs.map +1 -0
  509. package/dist/digest-DlBa7kJl.mjs +194 -0
  510. package/dist/digest-DlBa7kJl.mjs.map +1 -0
  511. package/dist/direct-executor-5T8gkhvA.mjs +117 -0
  512. package/dist/direct-executor-5T8gkhvA.mjs.map +1 -0
  513. package/dist/dist-DY0aOmAP.mjs +810 -0
  514. package/dist/dist-DY0aOmAP.mjs.map +1 -0
  515. package/dist/email-console-v3OM8It-.mjs +50 -0
  516. package/dist/email-console-v3OM8It-.mjs.map +1 -0
  517. package/dist/email-locale-CoZo-oZx.mjs +25 -0
  518. package/dist/email-locale-CoZo-oZx.mjs.map +1 -0
  519. package/dist/emdash-runtime-DwezbIqQ.mjs +4392 -0
  520. package/dist/emdash-runtime-DwezbIqQ.mjs.map +1 -0
  521. package/dist/enrich-C3XIJi0O.mjs +194 -0
  522. package/dist/enrich-C3XIJi0O.mjs.map +1 -0
  523. package/dist/entry-lock-CY7XpdSw.d.mts +4568 -0
  524. package/dist/entry-lock-CY7XpdSw.d.mts.map +1 -0
  525. package/dist/entry-lock-DDuWaAiP.mjs +1211 -0
  526. package/dist/entry-lock-DDuWaAiP.mjs.map +1 -0
  527. package/dist/entry-lock-D_Og9Gy3.mjs +163 -0
  528. package/dist/entry-lock-D_Og9Gy3.mjs.map +1 -0
  529. package/dist/entry-locks-Cp8_BcQQ.mjs +167 -0
  530. package/dist/entry-locks-Cp8_BcQQ.mjs.map +1 -0
  531. package/dist/env-types-Br8uywYA.mjs +38 -0
  532. package/dist/env-types-Br8uywYA.mjs.map +1 -0
  533. package/dist/error-CT2SsX5S.mjs +90 -0
  534. package/dist/error-CT2SsX5S.mjs.map +1 -0
  535. package/dist/errors-BMaCpLeS.mjs +479 -0
  536. package/dist/errors-BMaCpLeS.mjs.map +1 -0
  537. package/dist/errors-DlJwot7q.mjs +120 -0
  538. package/dist/errors-DlJwot7q.mjs.map +1 -0
  539. package/dist/escape-BfbDyuQ-.mjs +9 -0
  540. package/dist/escape-BfbDyuQ-.mjs.map +1 -0
  541. package/dist/fence-BOD3SxZG.mjs +162 -0
  542. package/dist/fence-BOD3SxZG.mjs.map +1 -0
  543. package/dist/field-defs-cache-C7sR7ZeU.mjs +77 -0
  544. package/dist/field-defs-cache-C7sR7ZeU.mjs.map +1 -0
  545. package/dist/field-map-C_rDXfdJ.mjs +84 -0
  546. package/dist/field-map-C_rDXfdJ.mjs.map +1 -0
  547. package/dist/focal-point-CgCcr1Ca.mjs +23 -0
  548. package/dist/focal-point-CgCcr1Ca.mjs.map +1 -0
  549. package/dist/fts-manager-BzFo0xx6.mjs +483 -0
  550. package/dist/fts-manager-BzFo0xx6.mjs.map +1 -0
  551. package/dist/gc-B_c3DPpi.mjs +75 -0
  552. package/dist/gc-B_c3DPpi.mjs.map +1 -0
  553. package/dist/hash-A-o2ZX8O.mjs +37 -0
  554. package/dist/hash-A-o2ZX8O.mjs.map +1 -0
  555. package/dist/hook-result-f8t7hIuu.d.mts +31 -0
  556. package/dist/hook-result-f8t7hIuu.d.mts.map +1 -0
  557. package/dist/hreflang-BpUK9Lcu.mjs +105 -0
  558. package/dist/hreflang-BpUK9Lcu.mjs.map +1 -0
  559. package/dist/hreflang-D07R-RbI.d.mts +50 -0
  560. package/dist/hreflang-D07R-RbI.d.mts.map +1 -0
  561. package/dist/http-route-dispatch-C2Ep2Uf6.mjs +342 -0
  562. package/dist/http-route-dispatch-C2Ep2Uf6.mjs.map +1 -0
  563. package/dist/identity-BivQ8wkV.mjs +35 -0
  564. package/dist/identity-BivQ8wkV.mjs.map +1 -0
  565. package/dist/import-B4UvHNJz.mjs +2126 -0
  566. package/dist/import-B4UvHNJz.mjs.map +1 -0
  567. package/dist/index-C37Ty40w.d.mts +623 -0
  568. package/dist/index-C37Ty40w.d.mts.map +1 -0
  569. package/dist/index.d.mts +23 -23
  570. package/dist/index.mjs +112 -110
  571. package/dist/install-finalization-BbYaB4wj.mjs +58 -0
  572. package/dist/install-finalization-BbYaB4wj.mjs.map +1 -0
  573. package/dist/json-recordset-BjYIWFkV.mjs +12 -0
  574. package/dist/json-recordset-BjYIWFkV.mjs.map +1 -0
  575. package/dist/json-schema-Cde7le0s.mjs +15 -0
  576. package/dist/json-schema-Cde7le0s.mjs.map +1 -0
  577. package/dist/keys-CusTXpw-.mjs +61 -0
  578. package/dist/keys-CusTXpw-.mjs.map +1 -0
  579. package/dist/kinds-DogmNB6n.mjs +974 -0
  580. package/dist/kinds-DogmNB6n.mjs.map +1 -0
  581. package/dist/lifecycle-BLCoCz4T.mjs +25 -0
  582. package/dist/lifecycle-BLCoCz4T.mjs.map +1 -0
  583. package/dist/load-Dds3KhXr.mjs +28 -0
  584. package/dist/load-Dds3KhXr.mjs.map +1 -0
  585. package/dist/loader-D4w4XE7q.mjs +1420 -0
  586. package/dist/loader-D4w4XE7q.mjs.map +1 -0
  587. package/dist/loops-IYgzQdQu.mjs +205 -0
  588. package/dist/loops-IYgzQdQu.mjs.map +1 -0
  589. package/dist/manifest-builder-CGF5kujD.mjs +196 -0
  590. package/dist/manifest-builder-CGF5kujD.mjs.map +1 -0
  591. package/dist/manifest-schema-B0BxPSjB.mjs +497 -0
  592. package/dist/manifest-schema-B0BxPSjB.mjs.map +1 -0
  593. package/dist/marketplace-DNvEGLqU.mjs +257 -0
  594. package/dist/marketplace-DNvEGLqU.mjs.map +1 -0
  595. package/dist/media/image-endpoint.d.mts +3 -2
  596. package/dist/media/image-endpoint.d.mts.map +1 -1
  597. package/dist/media/image-endpoint.mjs +17 -8
  598. package/dist/media/image-endpoint.mjs.map +1 -1
  599. package/dist/media/index.d.mts +1 -1
  600. package/dist/media/index.mjs +7 -6
  601. package/dist/media/index.mjs.map +1 -1
  602. package/dist/media/local-runtime.d.mts +14 -14
  603. package/dist/media/local-runtime.d.mts.map +1 -1
  604. package/dist/media/local-runtime.mjs +18 -13
  605. package/dist/media/local-runtime.mjs.map +1 -1
  606. package/dist/media-BL9MRrSG.mjs +294 -0
  607. package/dist/media-BL9MRrSG.mjs.map +1 -0
  608. package/dist/media-B_x5B9EA.mjs +373 -0
  609. package/dist/media-B_x5B9EA.mjs.map +1 -0
  610. package/dist/media-allowlist-CpmqBbIQ.mjs +45 -0
  611. package/dist/media-allowlist-CpmqBbIQ.mjs.map +1 -0
  612. package/dist/media-folders-CNs_A_B-.mjs +210 -0
  613. package/dist/media-folders-CNs_A_B-.mjs.map +1 -0
  614. package/dist/media-qTTHVkls.mjs +416 -0
  615. package/dist/media-qTTHVkls.mjs.map +1 -0
  616. package/dist/media-url-GJboA1fl.mjs +43 -0
  617. package/dist/media-url-GJboA1fl.mjs.map +1 -0
  618. package/dist/media-usage-ClWgrX0d.mjs +282 -0
  619. package/dist/media-usage-ClWgrX0d.mjs.map +1 -0
  620. package/dist/media-usage-activation-B8Fjtq0h.mjs +78 -0
  621. package/dist/media-usage-activation-B8Fjtq0h.mjs.map +1 -0
  622. package/dist/media-usage-work-L8-Au4j-.mjs +1036 -0
  623. package/dist/media-usage-work-L8-Au4j-.mjs.map +1 -0
  624. package/dist/media-usage-work-LXgze5j9.mjs +151 -0
  625. package/dist/media-usage-work-LXgze5j9.mjs.map +1 -0
  626. package/dist/menus-BAxcbsbv.mjs +818 -0
  627. package/dist/menus-BAxcbsbv.mjs.map +1 -0
  628. package/dist/menus-BI6oBXco.mjs +92 -0
  629. package/dist/menus-BI6oBXco.mjs.map +1 -0
  630. package/dist/menus-fvGFd4m6.mjs +3725 -0
  631. package/dist/menus-fvGFd4m6.mjs.map +1 -0
  632. package/dist/migrations/index.d.mts +1 -1
  633. package/dist/migrations/index.mjs +4 -4
  634. package/dist/mime-DwhtRyUt.mjs +81 -0
  635. package/dist/mime-DwhtRyUt.mjs.map +1 -0
  636. package/dist/mode-DIDSUwuN.mjs +23 -0
  637. package/dist/mode-DIDSUwuN.mjs.map +1 -0
  638. package/dist/node-sqlite-compat-Ddr_mlR9.mjs +63 -0
  639. package/dist/node-sqlite-compat-Ddr_mlR9.mjs.map +1 -0
  640. package/dist/normalize-Ip_hFAm8.mjs +216 -0
  641. package/dist/normalize-Ip_hFAm8.mjs.map +1 -0
  642. package/dist/oauth-authorization-CcMgeT8R.mjs +274 -0
  643. package/dist/oauth-authorization-CcMgeT8R.mjs.map +1 -0
  644. package/dist/oauth-clients-C_osi0PU.mjs +266 -0
  645. package/dist/oauth-clients-C_osi0PU.mjs.map +1 -0
  646. package/dist/oauth-state-store-DGLP-6CK.mjs +50 -0
  647. package/dist/oauth-state-store-DGLP-6CK.mjs.map +1 -0
  648. package/dist/oauth-user-lookup-z77Ee0Hm.mjs +26 -0
  649. package/dist/oauth-user-lookup-z77Ee0Hm.mjs.map +1 -0
  650. package/dist/object-cache/memory.d.mts +1 -1
  651. package/dist/object-cache-EjasjtoQ.mjs +586 -0
  652. package/dist/object-cache-EjasjtoQ.mjs.map +1 -0
  653. package/dist/options-CmUpkyKW.d.mts +81 -0
  654. package/dist/options-CmUpkyKW.d.mts.map +1 -0
  655. package/dist/ownership-DCk5NutQ.mjs +12 -0
  656. package/dist/ownership-DCk5NutQ.mjs.map +1 -0
  657. package/dist/page/index.d.mts +2 -2
  658. package/dist/page/index.mjs +14 -12
  659. package/dist/page/index.mjs.map +1 -1
  660. package/dist/parse-2W-E2f7w.mjs +81 -0
  661. package/dist/parse-2W-E2f7w.mjs.map +1 -0
  662. package/dist/parse-6pN8Xqg5.d.mts +176 -0
  663. package/dist/parse-6pN8Xqg5.d.mts.map +1 -0
  664. package/dist/passkey-config-DTTZB6EI.mjs +46 -0
  665. package/dist/passkey-config-DTTZB6EI.mjs.map +1 -0
  666. package/dist/paths-CQA62503.mjs +77 -0
  667. package/dist/paths-CQA62503.mjs.map +1 -0
  668. package/dist/patterns-CryGz_EV.mjs +159 -0
  669. package/dist/patterns-CryGz_EV.mjs.map +1 -0
  670. package/dist/placeholder-BlfXkucE.d.mts +313 -0
  671. package/dist/placeholder-BlfXkucE.d.mts.map +1 -0
  672. package/dist/plan-B95eiwnF.mjs +135 -0
  673. package/dist/plan-B95eiwnF.mjs.map +1 -0
  674. package/dist/plugin-test-runtime.d.mts +14 -14
  675. package/dist/plugin-test-runtime.d.mts.map +1 -1
  676. package/dist/plugin-test-runtime.mjs +121 -119
  677. package/dist/plugin-tool-name-BDA7m4Xa.mjs +27 -0
  678. package/dist/plugin-tool-name-BDA7m4Xa.mjs.map +1 -0
  679. package/dist/plugin-types.d.mts +2 -2
  680. package/dist/plugin-utils.d.mts +12 -12
  681. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  682. package/dist/plugins/adapt-sandbox-entry.mjs +4 -4
  683. package/dist/plugins/host.d.mts +5 -5
  684. package/dist/plugins/host.mjs +57 -55
  685. package/dist/plugins-BhxLJ008.mjs +261 -0
  686. package/dist/plugins-BhxLJ008.mjs.map +1 -0
  687. package/dist/policy-DOJ2sPqB.mjs +53 -0
  688. package/dist/policy-DOJ2sPqB.mjs.map +1 -0
  689. package/dist/portable-text-RCMpCj47.mjs +311 -0
  690. package/dist/portable-text-RCMpCj47.mjs.map +1 -0
  691. package/dist/preview-DFwL5APO.mjs +107 -0
  692. package/dist/preview-DFwL5APO.mjs.map +1 -0
  693. package/dist/protocol-B-ztxp_y.d.mts +65 -0
  694. package/dist/protocol-B-ztxp_y.d.mts.map +1 -0
  695. package/dist/public-plugin-api-routes-ik4fPZMv.mjs +316 -0
  696. package/dist/public-plugin-api-routes-ik4fPZMv.mjs.map +1 -0
  697. package/dist/public-submission-C5JZIykp.mjs +251 -0
  698. package/dist/public-submission-C5JZIykp.mjs.map +1 -0
  699. package/dist/public-url-CQwzRljH.mjs +101 -0
  700. package/dist/public-url-CQwzRljH.mjs.map +1 -0
  701. package/dist/query-BFHjCzSh.mjs +37 -0
  702. package/dist/query-BFHjCzSh.mjs.map +1 -0
  703. package/dist/query-DuwyFr5Z.mjs +41 -0
  704. package/dist/query-DuwyFr5Z.mjs.map +1 -0
  705. package/dist/query-eR_Nz70M.mjs +1157 -0
  706. package/dist/query-eR_Nz70M.mjs.map +1 -0
  707. package/dist/range-BQWPjWgQ.mjs +51 -0
  708. package/dist/range-BQWPjWgQ.mjs.map +1 -0
  709. package/dist/rate-limit-mPKeQ3sm.mjs +127 -0
  710. package/dist/rate-limit-mPKeQ3sm.mjs.map +1 -0
  711. package/dist/receipt-CmUpyuW5.mjs +43 -0
  712. package/dist/receipt-CmUpyuW5.mjs.map +1 -0
  713. package/dist/redirect-BtiMkehU.mjs +19 -0
  714. package/dist/redirect-BtiMkehU.mjs.map +1 -0
  715. package/dist/redirect-DcmNMvOs.mjs +423 -0
  716. package/dist/redirect-DcmNMvOs.mjs.map +1 -0
  717. package/dist/redirect-paths-K5i3xYfR.mjs +36 -0
  718. package/dist/redirect-paths-K5i3xYfR.mjs.map +1 -0
  719. package/dist/redirects-BA_TvtuH.mjs +148 -0
  720. package/dist/redirects-BA_TvtuH.mjs.map +1 -0
  721. package/dist/redirects-BIrRvgn4.mjs +446 -0
  722. package/dist/redirects-BIrRvgn4.mjs.map +1 -0
  723. package/dist/registry/testing.mjs +3 -3
  724. package/dist/registry-DymfZkAN.mjs +8374 -0
  725. package/dist/registry-DymfZkAN.mjs.map +1 -0
  726. package/dist/relations-DrEs3Sc1.mjs +789 -0
  727. package/dist/relations-DrEs3Sc1.mjs.map +1 -0
  728. package/dist/request-cache-5z2WzWmh.mjs +104 -0
  729. package/dist/request-cache-5z2WzWmh.mjs.map +1 -0
  730. package/dist/request-context.d.mts +12 -1
  731. package/dist/request-context.d.mts.map +1 -1
  732. package/dist/request-context.mjs.map +1 -1
  733. package/dist/request-meta-o8RIf9pa.mjs +141 -0
  734. package/dist/request-meta-o8RIf9pa.mjs.map +1 -0
  735. package/dist/resolve-CVy9xgy_.mjs +102 -0
  736. package/dist/resolve-CVy9xgy_.mjs.map +1 -0
  737. package/dist/resolve-DdNXBJSr.mjs +199 -0
  738. package/dist/resolve-DdNXBJSr.mjs.map +1 -0
  739. package/dist/revision-Dx7Uth1X.mjs +374 -0
  740. package/dist/revision-Dx7Uth1X.mjs.map +1 -0
  741. package/dist/route-cache-DAG5dPhh.mjs +20 -0
  742. package/dist/route-cache-DAG5dPhh.mjs.map +1 -0
  743. package/dist/route-wire-Xbsu8Vih.mjs +197 -0
  744. package/dist/route-wire-Xbsu8Vih.mjs.map +1 -0
  745. package/dist/routes-YQkSOsws.mjs +272 -0
  746. package/dist/routes-YQkSOsws.mjs.map +1 -0
  747. package/dist/runner-CLorw5vo.mjs +6669 -0
  748. package/dist/runner-CLorw5vo.mjs.map +1 -0
  749. package/dist/runner-g1A9P-wD.d.mts +73 -0
  750. package/dist/runner-g1A9P-wD.d.mts.map +1 -0
  751. package/dist/runtime.d.mts +13 -13
  752. package/dist/runtime.mjs +6 -5
  753. package/dist/runtime.mjs.map +1 -1
  754. package/dist/schema/project-env-types.mjs +49 -47
  755. package/dist/schema/project-env-types.mjs.map +1 -1
  756. package/dist/schema-Bss8qImF.mjs +13 -0
  757. package/dist/schema-Bss8qImF.mjs.map +1 -0
  758. package/dist/schema-C036pqEw.mjs +815 -0
  759. package/dist/schema-C036pqEw.mjs.map +1 -0
  760. package/dist/scopes-C_SoYl9x.mjs +34 -0
  761. package/dist/scopes-C_SoYl9x.mjs.map +1 -0
  762. package/dist/search-uNqCgePJ.mjs +450 -0
  763. package/dist/search-uNqCgePJ.mjs.map +1 -0
  764. package/dist/sections-BLusMa96.mjs +346 -0
  765. package/dist/sections-BLusMa96.mjs.map +1 -0
  766. package/dist/seed/index.d.mts +2 -2
  767. package/dist/seed/index.mjs +47 -45
  768. package/dist/seo/index.d.mts +3 -3
  769. package/dist/seo/index.mjs +32 -30
  770. package/dist/seo/index.mjs.map +1 -1
  771. package/dist/seo-BodxIpws.mjs +188 -0
  772. package/dist/seo-BodxIpws.mjs.map +1 -0
  773. package/dist/seo-DaMYIQY8.mjs +133 -0
  774. package/dist/seo-DaMYIQY8.mjs.map +1 -0
  775. package/dist/service-BuM1BRsA.mjs +150 -0
  776. package/dist/service-BuM1BRsA.mjs.map +1 -0
  777. package/dist/session-user-2DpQDMKw.mjs +61 -0
  778. package/dist/session-user-2DpQDMKw.mjs.map +1 -0
  779. package/dist/settings-B3ZmPF_8.mjs +73 -0
  780. package/dist/settings-B3ZmPF_8.mjs.map +1 -0
  781. package/dist/settings-P5hwPX6_.mjs +66 -0
  782. package/dist/settings-P5hwPX6_.mjs.map +1 -0
  783. package/dist/settings-yIqoN-Ok.mjs +519 -0
  784. package/dist/settings-yIqoN-Ok.mjs.map +1 -0
  785. package/dist/setup-complete-eu6MUQnt.mjs +65 -0
  786. package/dist/setup-complete-eu6MUQnt.mjs.map +1 -0
  787. package/dist/setup-nonce-CyPOapqY.mjs +25 -0
  788. package/dist/setup-nonce-CyPOapqY.mjs.map +1 -0
  789. package/dist/site-domain-8lEJl_0U.mjs +131 -0
  790. package/dist/site-domain-8lEJl_0U.mjs.map +1 -0
  791. package/dist/site-settings-uPkW0e6o.mjs +50 -0
  792. package/dist/site-settings-uPkW0e6o.mjs.map +1 -0
  793. package/dist/site-url-25SGVXwL.mjs +45 -0
  794. package/dist/site-url-25SGVXwL.mjs.map +1 -0
  795. package/dist/sitemap-name-DTK7CYnY.mjs +26 -0
  796. package/dist/sitemap-name-DTK7CYnY.mjs.map +1 -0
  797. package/dist/slug-BEDl2IJY.mjs +16 -0
  798. package/dist/slug-BEDl2IJY.mjs.map +1 -0
  799. package/dist/slugify-BDEG9pLk.mjs +22 -0
  800. package/dist/slugify-BDEG9pLk.mjs.map +1 -0
  801. package/dist/snapshot-CvkIBRLY.mjs +414 -0
  802. package/dist/snapshot-CvkIBRLY.mjs.map +1 -0
  803. package/dist/ssrf-mcCKMH6B.mjs +406 -0
  804. package/dist/ssrf-mcCKMH6B.mjs.map +1 -0
  805. package/dist/stage-BQfGzGOy.mjs +662 -0
  806. package/dist/stage-BQfGzGOy.mjs.map +1 -0
  807. package/dist/staged-B5vQGeSf.mjs +686 -0
  808. package/dist/staged-B5vQGeSf.mjs.map +1 -0
  809. package/dist/state-dO6t6OxV.mjs +178 -0
  810. package/dist/state-dO6t6OxV.mjs.map +1 -0
  811. package/dist/status-DSURZwKS.mjs +30 -0
  812. package/dist/status-DSURZwKS.mjs.map +1 -0
  813. package/dist/storage/local.d.mts +1 -1
  814. package/dist/storage/local.mjs +2 -2
  815. package/dist/storage/s3.d.mts +1 -1
  816. package/dist/storage/s3.mjs +1 -1
  817. package/dist/storage-query-Cy0SZ8iG.d.mts +1619 -0
  818. package/dist/storage-query-Cy0SZ8iG.d.mts.map +1 -0
  819. package/dist/tar-DWzcUZ_Q.mjs +449 -0
  820. package/dist/tar-DWzcUZ_Q.mjs.map +1 -0
  821. package/dist/target-C9htUbrT.mjs +27 -0
  822. package/dist/target-C9htUbrT.mjs.map +1 -0
  823. package/dist/taxonomies-By2aGvq2.mjs +729 -0
  824. package/dist/taxonomies-By2aGvq2.mjs.map +1 -0
  825. package/dist/taxonomies-CVRd_jz0.mjs +937 -0
  826. package/dist/taxonomies-CVRd_jz0.mjs.map +1 -0
  827. package/dist/taxonomy-BG_xu2Qf.mjs +563 -0
  828. package/dist/taxonomy-BG_xu2Qf.mjs.map +1 -0
  829. package/dist/tokens-U5vzgSrM.mjs +171 -0
  830. package/dist/tokens-U5vzgSrM.mjs.map +1 -0
  831. package/dist/transaction-CkoQ5wqQ.mjs +29 -0
  832. package/dist/transaction-CkoQ5wqQ.mjs.map +1 -0
  833. package/dist/transfer-DA0OSfaT.mjs +8873 -0
  834. package/dist/transfer-DA0OSfaT.mjs.map +1 -0
  835. package/dist/transfer-Pyf3d7ka.mjs +166 -0
  836. package/dist/transfer-Pyf3d7ka.mjs.map +1 -0
  837. package/dist/transfer-download-cX7SuWEy.mjs +33 -0
  838. package/dist/transfer-download-cX7SuWEy.mjs.map +1 -0
  839. package/dist/transformations-DczubD4j.mjs +196 -0
  840. package/dist/transformations-DczubD4j.mjs.map +1 -0
  841. package/dist/transport-Dm5QzpT_.d.mts +42 -0
  842. package/dist/transport-Dm5QzpT_.d.mts.map +1 -0
  843. package/dist/transport-DtIrjEFO.mjs +137 -0
  844. package/dist/transport-DtIrjEFO.mjs.map +1 -0
  845. package/dist/trusted-proxy-CDRd5Kmw.mjs +51 -0
  846. package/dist/trusted-proxy-CDRd5Kmw.mjs.map +1 -0
  847. package/dist/turnstile-Ct5YuFNY.mjs +58 -0
  848. package/dist/turnstile-Ct5YuFNY.mjs.map +1 -0
  849. package/dist/types-Bgujop4S.d.mts +374 -0
  850. package/dist/types-Bgujop4S.d.mts.map +1 -0
  851. package/dist/types-BirHUEXt.mjs +18 -0
  852. package/dist/types-BirHUEXt.mjs.map +1 -0
  853. package/dist/types-BqJgTL_y.d.mts +293 -0
  854. package/dist/types-BqJgTL_y.d.mts.map +1 -0
  855. package/dist/types-C-lrOt9T.d.mts +87 -0
  856. package/dist/types-C-lrOt9T.d.mts.map +1 -0
  857. package/dist/types-CCEHAhOv.d.mts +916 -0
  858. package/dist/types-CCEHAhOv.d.mts.map +1 -0
  859. package/dist/types-CLVwYRBr.d.mts +227 -0
  860. package/dist/types-CLVwYRBr.d.mts.map +1 -0
  861. package/dist/types-C_asjp1J.mjs +201 -0
  862. package/dist/types-C_asjp1J.mjs.map +1 -0
  863. package/dist/types-CadaL_k8.d.mts +366 -0
  864. package/dist/types-CadaL_k8.d.mts.map +1 -0
  865. package/dist/types-DVbTb4Hk.mjs +77 -0
  866. package/dist/types-DVbTb4Hk.mjs.map +1 -0
  867. package/dist/types-Ddku19Zw.d.mts +209 -0
  868. package/dist/types-Ddku19Zw.d.mts.map +1 -0
  869. package/dist/types-DwhEvIVb.mjs +133 -0
  870. package/dist/types-DwhEvIVb.mjs.map +1 -0
  871. package/dist/types-FIiGQ3PE.mjs +16 -0
  872. package/dist/types-FIiGQ3PE.mjs.map +1 -0
  873. package/dist/types-OauzCOY0.mjs +37 -0
  874. package/dist/types-OauzCOY0.mjs.map +1 -0
  875. package/dist/types-mQGTpP-4.d.mts +1741 -0
  876. package/dist/types-mQGTpP-4.d.mts.map +1 -0
  877. package/dist/types-nbjz3Mgm.d.mts +125 -0
  878. package/dist/types-nbjz3Mgm.d.mts.map +1 -0
  879. package/dist/update-check-hW32-0pf.mjs +161 -0
  880. package/dist/update-check-hW32-0pf.mjs.map +1 -0
  881. package/dist/upload-attempts-Bpik1TLF.mjs +32 -0
  882. package/dist/upload-attempts-Bpik1TLF.mjs.map +1 -0
  883. package/dist/url-DTfGDJhI.mjs +104 -0
  884. package/dist/url-DTfGDJhI.mjs.map +1 -0
  885. package/dist/url-pattern-CJeCyNij.mjs +41 -0
  886. package/dist/url-pattern-CJeCyNij.mjs.map +1 -0
  887. package/dist/user-nQInBZbE.mjs +171 -0
  888. package/dist/user-nQInBZbE.mjs.map +1 -0
  889. package/dist/utils-govudc_U.mjs +442 -0
  890. package/dist/utils-govudc_U.mjs.map +1 -0
  891. package/dist/validate-BxLvcDYh.mjs +524 -0
  892. package/dist/validate-BxLvcDYh.mjs.map +1 -0
  893. package/dist/validate-mnoVfASU.d.mts +468 -0
  894. package/dist/validate-mnoVfASU.d.mts.map +1 -0
  895. package/dist/validation-DQDEvh87.mjs +221 -0
  896. package/dist/validation-DQDEvh87.mjs.map +1 -0
  897. package/dist/version-BOFfLiVT.mjs +49 -0
  898. package/dist/version-BOFfLiVT.mjs.map +1 -0
  899. package/dist/version-Dcvx_C9g.mjs +7 -0
  900. package/dist/version-Dcvx_C9g.mjs.map +1 -0
  901. package/dist/version-DzTJ3gD7.mjs +9 -0
  902. package/dist/version-DzTJ3gD7.mjs.map +1 -0
  903. package/dist/video-BX7AI5nJ.mjs +54 -0
  904. package/dist/video-BX7AI5nJ.mjs.map +1 -0
  905. package/dist/virtual-modules-CU29aip9.mjs +515 -0
  906. package/dist/virtual-modules-CU29aip9.mjs.map +1 -0
  907. package/dist/widgets-HIeFmZxt.mjs +121 -0
  908. package/dist/widgets-HIeFmZxt.mjs.map +1 -0
  909. package/dist/wxr-taxonomies-Dy2i2ON3.d.mts +34 -0
  910. package/dist/wxr-taxonomies-Dy2i2ON3.d.mts.map +1 -0
  911. package/dist/wxr-taxonomies-DyOGhl8W.mjs +454 -0
  912. package/dist/wxr-taxonomies-DyOGhl8W.mjs.map +1 -0
  913. package/dist/zod-generator-VxCPVDpo.mjs +425 -0
  914. package/dist/zod-generator-VxCPVDpo.mjs.map +1 -0
  915. package/package.json +5 -5
  916. package/src/api/handlers/bulk-tag.ts +11 -3
  917. package/src/api/handlers/bylines.ts +6 -2
  918. package/src/api/handlers/content.ts +107 -7
  919. package/src/api/handlers/dashboard.ts +13 -6
  920. package/src/api/handlers/menus.ts +24 -10
  921. package/src/api/handlers/relations.ts +15 -1
  922. package/src/api/handlers/taxonomies.ts +27 -17
  923. package/src/astro/image-endpoint.ts +23 -2
  924. package/src/astro/integration/vite-config.ts +16 -8
  925. package/src/astro/middleware/redirect.ts +158 -63
  926. package/src/astro/middleware/request-context.ts +1 -0
  927. package/src/astro/middleware.ts +17 -4
  928. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -1
  929. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +14 -1
  930. package/src/astro/routes/api/dashboard.ts +2 -0
  931. package/src/astro/routes/api/media/file/[...key].ts +13 -3
  932. package/src/auth/types.ts +6 -0
  933. package/src/cli/commands/export-seed.ts +6 -4
  934. package/src/cli/commands/login.ts +2 -4
  935. package/src/client/index.ts +1 -0
  936. package/src/client/transport.ts +11 -7
  937. package/src/components/EmDashImage.astro +14 -2
  938. package/src/components/InlinePortableTextEditor.tsx +4 -1
  939. package/src/database/migrations/content-sized.ts +82 -0
  940. package/src/database/migrations/policy.ts +28 -2
  941. package/src/database/migrations/runner.ts +48 -0
  942. package/src/database/repositories/byline.ts +73 -17
  943. package/src/database/repositories/comment.ts +17 -7
  944. package/src/database/repositories/content.ts +79 -19
  945. package/src/database/repositories/menu.ts +77 -11
  946. package/src/database/repositories/taxonomy-def.ts +9 -2
  947. package/src/database/repositories/taxonomy.ts +47 -14
  948. package/src/database/repositories/types.ts +11 -0
  949. package/src/emdash-runtime.ts +37 -10
  950. package/src/fields/image.ts +1 -0
  951. package/src/i18n/config.ts +58 -10
  952. package/src/i18n/normalize.ts +16 -2
  953. package/src/i18n/query.ts +47 -0
  954. package/src/i18n/resolve.ts +8 -3
  955. package/src/import/wxr-taxonomies.ts +3 -2
  956. package/src/loader.ts +80 -22
  957. package/src/mcp/server.ts +28 -1
  958. package/src/media/caption.ts +30 -0
  959. package/src/media/image-endpoint.ts +13 -6
  960. package/src/media/local-runtime.ts +3 -0
  961. package/src/media/normalize.ts +15 -8
  962. package/src/media/responsive.ts +12 -2
  963. package/src/media/types.ts +16 -3
  964. package/src/menus/index.ts +21 -11
  965. package/src/migrations/manifest.ts +1 -0
  966. package/src/plugins/byline-access.ts +3 -1
  967. package/src/plugins/context.ts +1 -2
  968. package/src/plugins/storage-indexes.ts +7 -3
  969. package/src/query.ts +23 -13
  970. package/src/redirects/artifacts.ts +39 -5
  971. package/src/references/field-map.ts +6 -4
  972. package/src/request-context.ts +8 -0
  973. package/src/schema/collection-slugs-cache.ts +31 -17
  974. package/src/schema/registry.ts +9 -0
  975. package/src/schema/zod-generator.ts +2 -1
  976. package/src/search/fts-manager.ts +98 -28
  977. package/src/search/query.ts +31 -64
  978. package/src/seed/apply.ts +191 -87
  979. package/src/seed/types.ts +3 -1
  980. package/src/settings/index.ts +135 -35
  981. package/src/settings/version.ts +54 -0
  982. package/src/taxonomies/index.ts +95 -52
  983. package/src/taxonomies/term-counts.ts +2 -1
  984. package/src/utils/db-errors.ts +15 -0
  985. package/src/virtual-modules.d.ts +1 -0
  986. package/dist/action-token-SK8zyN7w.mjs +0 -26
  987. package/dist/action-token-SK8zyN7w.mjs.map +0 -1
  988. package/dist/activation-Dim4YMM7.mjs +0 -387
  989. package/dist/activation-Dim4YMM7.mjs.map +0 -1
  990. package/dist/adapters-F_xorvWv.d.mts +0 -173
  991. package/dist/adapters-F_xorvWv.d.mts.map +0 -1
  992. package/dist/allowed-origins-CEug-p0t.mjs +0 -116
  993. package/dist/allowed-origins-CEug-p0t.mjs.map +0 -1
  994. package/dist/api-D-7BNHoz.mjs +0 -5025
  995. package/dist/api-D-7BNHoz.mjs.map +0 -1
  996. package/dist/api-tokens-Bx38ZCQp.mjs +0 -173
  997. package/dist/api-tokens-Bx38ZCQp.mjs.map +0 -1
  998. package/dist/apply-T7ATgzCh.mjs +0 -1702
  999. package/dist/apply-T7ATgzCh.mjs.map +0 -1
  1000. package/dist/approvals-D-m6wvGl.mjs +0 -460
  1001. package/dist/approvals-D-m6wvGl.mjs.map +0 -1
  1002. package/dist/artifact-fetch-DIh7iyOV.mjs +0 -659
  1003. package/dist/artifact-fetch-DIh7iyOV.mjs.map +0 -1
  1004. package/dist/artifacts-htGyfCSt.mjs +0 -307
  1005. package/dist/artifacts-htGyfCSt.mjs.map +0 -1
  1006. package/dist/audit-_gieLVGU.mjs +0 -127
  1007. package/dist/audit-_gieLVGU.mjs.map +0 -1
  1008. package/dist/authoritative-records-CQlB3JzE.mjs +0 -5183
  1009. package/dist/authoritative-records-CQlB3JzE.mjs.map +0 -1
  1010. package/dist/authorize-DPFBGbE6.mjs +0 -74
  1011. package/dist/authorize-DPFBGbE6.mjs.map +0 -1
  1012. package/dist/backup-3FgVxiDJ.mjs +0 -246
  1013. package/dist/backup-3FgVxiDJ.mjs.map +0 -1
  1014. package/dist/block-types-CYcG56JB.mjs +0 -132
  1015. package/dist/block-types-CYcG56JB.mjs.map +0 -1
  1016. package/dist/block-values-gCX4HBSl.mjs +0 -215
  1017. package/dist/block-values-gCX4HBSl.mjs.map +0 -1
  1018. package/dist/byline-BR1qhyiw.mjs +0 -909
  1019. package/dist/byline-BR1qhyiw.mjs.map +0 -1
  1020. package/dist/byline-fields-4ClDC88c.mjs +0 -123
  1021. package/dist/byline-fields-4ClDC88c.mjs.map +0 -1
  1022. package/dist/byline-fields-BLXZnX7N.mjs +0 -280
  1023. package/dist/byline-fields-BLXZnX7N.mjs.map +0 -1
  1024. package/dist/byline-registry-dvt4N3xV.mjs +0 -406
  1025. package/dist/byline-registry-dvt4N3xV.mjs.map +0 -1
  1026. package/dist/bylines-CVOvRUL7.mjs +0 -234
  1027. package/dist/bylines-CVOvRUL7.mjs.map +0 -1
  1028. package/dist/bylines-DxOs9B7z.mjs +0 -150
  1029. package/dist/bylines-DxOs9B7z.mjs.map +0 -1
  1030. package/dist/cache-CEU9wo_h.mjs +0 -151
  1031. package/dist/cache-CEU9wo_h.mjs.map +0 -1
  1032. package/dist/canonical-BudtH-Fx.mjs +0 -174
  1033. package/dist/canonical-BudtH-Fx.mjs.map +0 -1
  1034. package/dist/capture-triggers-CT6dK9zd.mjs +0 -362
  1035. package/dist/capture-triggers-CT6dK9zd.mjs.map +0 -1
  1036. package/dist/challenge-store-C17BYx2-.mjs +0 -51
  1037. package/dist/challenge-store-C17BYx2-.mjs.map +0 -1
  1038. package/dist/checksum-CEqvfxGX.mjs +0 -162
  1039. package/dist/checksum-CEqvfxGX.mjs.map +0 -1
  1040. package/dist/chrome-tags-BIKBMZYO.mjs +0 -24
  1041. package/dist/chrome-tags-BIKBMZYO.mjs.map +0 -1
  1042. package/dist/chunks-xC4UD5-S.mjs +0 -25
  1043. package/dist/chunks-xC4UD5-S.mjs.map +0 -1
  1044. package/dist/collection-slugs-cache-e09QeJQt.mjs +0 -85
  1045. package/dist/collection-slugs-cache-e09QeJQt.mjs.map +0 -1
  1046. package/dist/comment-UvIWDKcW.mjs +0 -325
  1047. package/dist/comment-UvIWDKcW.mjs.map +0 -1
  1048. package/dist/comment-reaction-dGp6_FRo.mjs +0 -85
  1049. package/dist/comment-reaction-dGp6_FRo.mjs.map +0 -1
  1050. package/dist/comments-pej-_BUO.mjs +0 -195
  1051. package/dist/comments-pej-_BUO.mjs.map +0 -1
  1052. package/dist/comments-yiRFx3w5.mjs +0 -99
  1053. package/dist/comments-yiRFx3w5.mjs.map +0 -1
  1054. package/dist/components-Brp__9xo.mjs +0 -112
  1055. package/dist/components-Brp__9xo.mjs.map +0 -1
  1056. package/dist/config-Bsm_u_oE.d.mts +0 -6799
  1057. package/dist/config-Bsm_u_oE.d.mts.map +0 -1
  1058. package/dist/config-CFMojMFK.d.mts +0 -39
  1059. package/dist/config-CFMojMFK.d.mts.map +0 -1
  1060. package/dist/config-CvmjJcVw.mjs +0 -73
  1061. package/dist/config-CvmjJcVw.mjs.map +0 -1
  1062. package/dist/config-DBU6iUQB.mjs +0 -228
  1063. package/dist/config-DBU6iUQB.mjs.map +0 -1
  1064. package/dist/connection-BtEN_lP9.mjs +0 -36
  1065. package/dist/connection-BtEN_lP9.mjs.map +0 -1
  1066. package/dist/content-DQSRZTVw.mjs +0 -2075
  1067. package/dist/content-DQSRZTVw.mjs.map +0 -1
  1068. package/dist/content-list-query-CYKcY6Vi.d.mts +0 -26
  1069. package/dist/content-list-query-CYKcY6Vi.d.mts.map +0 -1
  1070. package/dist/content-policy-Dm32n9C6.mjs +0 -46
  1071. package/dist/content-policy-Dm32n9C6.mjs.map +0 -1
  1072. package/dist/content-repair-DNh5--x5.mjs +0 -442
  1073. package/dist/content-repair-DNh5--x5.mjs.map +0 -1
  1074. package/dist/context-BYptmCN0.mjs +0 -2090
  1075. package/dist/context-BYptmCN0.mjs.map +0 -1
  1076. package/dist/credits-B9iORdWB.mjs +0 -110
  1077. package/dist/credits-B9iORdWB.mjs.map +0 -1
  1078. package/dist/cron-D7obTIfk.mjs +0 -306
  1079. package/dist/cron-D7obTIfk.mjs.map +0 -1
  1080. package/dist/dashboard-D0jcgBD7.mjs +0 -167
  1081. package/dist/dashboard-D0jcgBD7.mjs.map +0 -1
  1082. package/dist/db-errors-CBD5yMro.mjs +0 -55
  1083. package/dist/db-errors-CBD5yMro.mjs.map +0 -1
  1084. package/dist/default-C0W-PhAp.mjs +0 -81
  1085. package/dist/default-C0W-PhAp.mjs.map +0 -1
  1086. package/dist/deferred-tasks-ZvUECSzI.d.mts +0 -9
  1087. package/dist/deferred-tasks-ZvUECSzI.d.mts.map +0 -1
  1088. package/dist/destination-r2zIAZ2S.mjs +0 -18
  1089. package/dist/destination-r2zIAZ2S.mjs.map +0 -1
  1090. package/dist/dev-typegen-EBni_pOQ.mjs +0 -29
  1091. package/dist/dev-typegen-EBni_pOQ.mjs.map +0 -1
  1092. package/dist/device-flow-BkFKBoAn.mjs +0 -521
  1093. package/dist/device-flow-BkFKBoAn.mjs.map +0 -1
  1094. package/dist/digest-DJ1tHCgy.mjs +0 -194
  1095. package/dist/digest-DJ1tHCgy.mjs.map +0 -1
  1096. package/dist/direct-executor-Cbxzg4qe.mjs +0 -117
  1097. package/dist/direct-executor-Cbxzg4qe.mjs.map +0 -1
  1098. package/dist/dist-Cfu8mMBs.mjs +0 -810
  1099. package/dist/dist-Cfu8mMBs.mjs.map +0 -1
  1100. package/dist/email-console-FFVJWb9N.mjs +0 -50
  1101. package/dist/email-console-FFVJWb9N.mjs.map +0 -1
  1102. package/dist/email-locale-BJ8DjTzZ.mjs +0 -25
  1103. package/dist/email-locale-BJ8DjTzZ.mjs.map +0 -1
  1104. package/dist/emdash-runtime-DVi7vtXC.mjs +0 -4379
  1105. package/dist/emdash-runtime-DVi7vtXC.mjs.map +0 -1
  1106. package/dist/enrich-Duu4sV3a.mjs +0 -194
  1107. package/dist/enrich-Duu4sV3a.mjs.map +0 -1
  1108. package/dist/entry-lock-C7VX0NGK.d.mts +0 -4568
  1109. package/dist/entry-lock-C7VX0NGK.d.mts.map +0 -1
  1110. package/dist/entry-lock-DLxCffFW.mjs +0 -163
  1111. package/dist/entry-lock-DLxCffFW.mjs.map +0 -1
  1112. package/dist/entry-lock-Df6-XhIu.mjs +0 -1211
  1113. package/dist/entry-lock-Df6-XhIu.mjs.map +0 -1
  1114. package/dist/entry-locks-DJAqVweV.mjs +0 -167
  1115. package/dist/entry-locks-DJAqVweV.mjs.map +0 -1
  1116. package/dist/env-types-C3FCVBWe.mjs +0 -38
  1117. package/dist/env-types-C3FCVBWe.mjs.map +0 -1
  1118. package/dist/error-CVWeIOku.mjs +0 -90
  1119. package/dist/error-CVWeIOku.mjs.map +0 -1
  1120. package/dist/errors-B4f4It-2.mjs +0 -120
  1121. package/dist/errors-B4f4It-2.mjs.map +0 -1
  1122. package/dist/errors-BOYNdIo3.mjs +0 -479
  1123. package/dist/errors-BOYNdIo3.mjs.map +0 -1
  1124. package/dist/escape-lsNq38PP.mjs +0 -9
  1125. package/dist/escape-lsNq38PP.mjs.map +0 -1
  1126. package/dist/fence-C3MUitUN.mjs +0 -162
  1127. package/dist/fence-C3MUitUN.mjs.map +0 -1
  1128. package/dist/field-defs-cache-Dez5iWJJ.mjs +0 -77
  1129. package/dist/field-defs-cache-Dez5iWJJ.mjs.map +0 -1
  1130. package/dist/field-map-Bft9LKak.mjs +0 -83
  1131. package/dist/field-map-Bft9LKak.mjs.map +0 -1
  1132. package/dist/focal-point-JX8kcOTQ.mjs +0 -23
  1133. package/dist/focal-point-JX8kcOTQ.mjs.map +0 -1
  1134. package/dist/fts-manager-Beg3e4bI.mjs +0 -443
  1135. package/dist/fts-manager-Beg3e4bI.mjs.map +0 -1
  1136. package/dist/gc-ByyAYiYE.mjs +0 -75
  1137. package/dist/gc-ByyAYiYE.mjs.map +0 -1
  1138. package/dist/hash-BJaeek87.mjs +0 -37
  1139. package/dist/hash-BJaeek87.mjs.map +0 -1
  1140. package/dist/hook-result-BrdLyOdI.d.mts +0 -31
  1141. package/dist/hook-result-BrdLyOdI.d.mts.map +0 -1
  1142. package/dist/hreflang-C8Jb-hrf.mjs +0 -105
  1143. package/dist/hreflang-C8Jb-hrf.mjs.map +0 -1
  1144. package/dist/hreflang-CY_F5OjF.d.mts +0 -50
  1145. package/dist/hreflang-CY_F5OjF.d.mts.map +0 -1
  1146. package/dist/http-route-dispatch-CyeW6iPv.mjs +0 -342
  1147. package/dist/http-route-dispatch-CyeW6iPv.mjs.map +0 -1
  1148. package/dist/identity-Cael5uTT.mjs +0 -35
  1149. package/dist/identity-Cael5uTT.mjs.map +0 -1
  1150. package/dist/import-BUXjdZUn.mjs +0 -2126
  1151. package/dist/import-BUXjdZUn.mjs.map +0 -1
  1152. package/dist/index-BB9sVisO.d.mts +0 -623
  1153. package/dist/index-BB9sVisO.d.mts.map +0 -1
  1154. package/dist/install-finalization-3JX5qQEA.mjs +0 -58
  1155. package/dist/install-finalization-3JX5qQEA.mjs.map +0 -1
  1156. package/dist/json-recordset-BUjxhr77.mjs +0 -12
  1157. package/dist/json-recordset-BUjxhr77.mjs.map +0 -1
  1158. package/dist/json-schema-v_D_pPNG.mjs +0 -15
  1159. package/dist/json-schema-v_D_pPNG.mjs.map +0 -1
  1160. package/dist/keys-CifIkT0N.mjs +0 -61
  1161. package/dist/keys-CifIkT0N.mjs.map +0 -1
  1162. package/dist/kinds-B_Qcl5pz.mjs +0 -974
  1163. package/dist/kinds-B_Qcl5pz.mjs.map +0 -1
  1164. package/dist/lifecycle-7vUJeFRe.mjs +0 -25
  1165. package/dist/lifecycle-7vUJeFRe.mjs.map +0 -1
  1166. package/dist/load-CdAG9wz-.mjs +0 -28
  1167. package/dist/load-CdAG9wz-.mjs.map +0 -1
  1168. package/dist/loader-CswroUbe.mjs +0 -1380
  1169. package/dist/loader-CswroUbe.mjs.map +0 -1
  1170. package/dist/loops-uA4iTOzd.mjs +0 -205
  1171. package/dist/loops-uA4iTOzd.mjs.map +0 -1
  1172. package/dist/manifest-builder-B8zjuH3f.mjs +0 -189
  1173. package/dist/manifest-builder-B8zjuH3f.mjs.map +0 -1
  1174. package/dist/manifest-schema-DNb4XmTS.mjs +0 -497
  1175. package/dist/manifest-schema-DNb4XmTS.mjs.map +0 -1
  1176. package/dist/marketplace-CqbgeIa7.mjs +0 -257
  1177. package/dist/marketplace-CqbgeIa7.mjs.map +0 -1
  1178. package/dist/media--dJRU6i2.mjs +0 -294
  1179. package/dist/media--dJRU6i2.mjs.map +0 -1
  1180. package/dist/media-1WC65OCB.mjs +0 -416
  1181. package/dist/media-1WC65OCB.mjs.map +0 -1
  1182. package/dist/media-Bws9f18T.mjs +0 -373
  1183. package/dist/media-Bws9f18T.mjs.map +0 -1
  1184. package/dist/media-allowlist-BJB7MFx6.mjs +0 -45
  1185. package/dist/media-allowlist-BJB7MFx6.mjs.map +0 -1
  1186. package/dist/media-folders-Dn3C16B8.mjs +0 -210
  1187. package/dist/media-folders-Dn3C16B8.mjs.map +0 -1
  1188. package/dist/media-url-BQgKvpQ5.mjs +0 -43
  1189. package/dist/media-url-BQgKvpQ5.mjs.map +0 -1
  1190. package/dist/media-usage-CF0WVcLO.mjs +0 -282
  1191. package/dist/media-usage-CF0WVcLO.mjs.map +0 -1
  1192. package/dist/media-usage-activation-C9HwVw5w.mjs +0 -78
  1193. package/dist/media-usage-activation-C9HwVw5w.mjs.map +0 -1
  1194. package/dist/media-usage-work-CkLa5-nc.mjs +0 -1036
  1195. package/dist/media-usage-work-CkLa5-nc.mjs.map +0 -1
  1196. package/dist/media-usage-work-m3AWTmmC.mjs +0 -151
  1197. package/dist/media-usage-work-m3AWTmmC.mjs.map +0 -1
  1198. package/dist/menus-BCVSSp1z.mjs +0 -753
  1199. package/dist/menus-BCVSSp1z.mjs.map +0 -1
  1200. package/dist/menus-BSzwObhV.mjs +0 -92
  1201. package/dist/menus-BSzwObhV.mjs.map +0 -1
  1202. package/dist/menus-Cl4kwdt7.mjs +0 -3721
  1203. package/dist/menus-Cl4kwdt7.mjs.map +0 -1
  1204. package/dist/mime-B5M9R53H.mjs +0 -81
  1205. package/dist/mime-B5M9R53H.mjs.map +0 -1
  1206. package/dist/mode-C-D3qICy.mjs +0 -23
  1207. package/dist/mode-C-D3qICy.mjs.map +0 -1
  1208. package/dist/node-sqlite-compat-CrKzRr0J.mjs +0 -63
  1209. package/dist/node-sqlite-compat-CrKzRr0J.mjs.map +0 -1
  1210. package/dist/normalize-BuWa0lvd.mjs +0 -191
  1211. package/dist/normalize-BuWa0lvd.mjs.map +0 -1
  1212. package/dist/oauth-authorization-TpEJrYB7.mjs +0 -274
  1213. package/dist/oauth-authorization-TpEJrYB7.mjs.map +0 -1
  1214. package/dist/oauth-clients-BT0Pg-MO.mjs +0 -266
  1215. package/dist/oauth-clients-BT0Pg-MO.mjs.map +0 -1
  1216. package/dist/oauth-state-store-CHMn_mwc.mjs +0 -50
  1217. package/dist/oauth-state-store-CHMn_mwc.mjs.map +0 -1
  1218. package/dist/oauth-user-lookup-BDgF6IVG.mjs +0 -26
  1219. package/dist/oauth-user-lookup-BDgF6IVG.mjs.map +0 -1
  1220. package/dist/object-cache-Bo6DGaC9.mjs +0 -586
  1221. package/dist/object-cache-Bo6DGaC9.mjs.map +0 -1
  1222. package/dist/options-DJWaq3Ie.d.mts +0 -81
  1223. package/dist/options-DJWaq3Ie.d.mts.map +0 -1
  1224. package/dist/ownership-MiyA7qKO.mjs +0 -12
  1225. package/dist/ownership-MiyA7qKO.mjs.map +0 -1
  1226. package/dist/parse-CWHOFc6z.d.mts +0 -176
  1227. package/dist/parse-CWHOFc6z.d.mts.map +0 -1
  1228. package/dist/parse-DgQ2NABT.mjs +0 -81
  1229. package/dist/parse-DgQ2NABT.mjs.map +0 -1
  1230. package/dist/passkey-config-D0kdzEao.mjs +0 -46
  1231. package/dist/passkey-config-D0kdzEao.mjs.map +0 -1
  1232. package/dist/paths-biDzFTY2.mjs +0 -77
  1233. package/dist/paths-biDzFTY2.mjs.map +0 -1
  1234. package/dist/patterns-CMNnYCgf.mjs +0 -159
  1235. package/dist/patterns-CMNnYCgf.mjs.map +0 -1
  1236. package/dist/placeholder-D41vk11_.d.mts +0 -306
  1237. package/dist/placeholder-D41vk11_.d.mts.map +0 -1
  1238. package/dist/plan-CCoqxNoU.mjs +0 -135
  1239. package/dist/plan-CCoqxNoU.mjs.map +0 -1
  1240. package/dist/plugin-tool-name-DDUgN_0p.mjs +0 -27
  1241. package/dist/plugin-tool-name-DDUgN_0p.mjs.map +0 -1
  1242. package/dist/plugins-COJ2L49n.mjs +0 -261
  1243. package/dist/plugins-COJ2L49n.mjs.map +0 -1
  1244. package/dist/policy-DLQ--Hnm.mjs +0 -45
  1245. package/dist/policy-DLQ--Hnm.mjs.map +0 -1
  1246. package/dist/portable-text-BH4zgkSm.mjs +0 -311
  1247. package/dist/portable-text-BH4zgkSm.mjs.map +0 -1
  1248. package/dist/preview-DLexxwp3.mjs +0 -107
  1249. package/dist/preview-DLexxwp3.mjs.map +0 -1
  1250. package/dist/protocol-79kUO7jP.d.mts +0 -65
  1251. package/dist/protocol-79kUO7jP.d.mts.map +0 -1
  1252. package/dist/public-plugin-api-routes-BuAMJ8nN.mjs +0 -316
  1253. package/dist/public-plugin-api-routes-BuAMJ8nN.mjs.map +0 -1
  1254. package/dist/public-submission-Di3TsgzX.mjs +0 -251
  1255. package/dist/public-submission-Di3TsgzX.mjs.map +0 -1
  1256. package/dist/public-url-Bt98vysr.mjs +0 -101
  1257. package/dist/public-url-Bt98vysr.mjs.map +0 -1
  1258. package/dist/query-CpnRlBh8.mjs +0 -1156
  1259. package/dist/query-CpnRlBh8.mjs.map +0 -1
  1260. package/dist/query-haKvLAWl.mjs +0 -41
  1261. package/dist/query-haKvLAWl.mjs.map +0 -1
  1262. package/dist/range-CYfeXgGK.mjs +0 -51
  1263. package/dist/range-CYfeXgGK.mjs.map +0 -1
  1264. package/dist/rate-limit-Xp4d0NBY.mjs +0 -127
  1265. package/dist/rate-limit-Xp4d0NBY.mjs.map +0 -1
  1266. package/dist/receipt-BUsQCOeM.mjs +0 -43
  1267. package/dist/receipt-BUsQCOeM.mjs.map +0 -1
  1268. package/dist/redirect-CQAV7mCo.mjs +0 -19
  1269. package/dist/redirect-CQAV7mCo.mjs.map +0 -1
  1270. package/dist/redirect-DiS_3mA4.mjs +0 -423
  1271. package/dist/redirect-DiS_3mA4.mjs.map +0 -1
  1272. package/dist/redirect-paths-CNYq7w80.mjs +0 -36
  1273. package/dist/redirect-paths-CNYq7w80.mjs.map +0 -1
  1274. package/dist/redirects-BEVSRMa2.mjs +0 -148
  1275. package/dist/redirects-BEVSRMa2.mjs.map +0 -1
  1276. package/dist/redirects-BHpy-VsZ.mjs +0 -446
  1277. package/dist/redirects-BHpy-VsZ.mjs.map +0 -1
  1278. package/dist/registry-TUVaid9Z.mjs +0 -8369
  1279. package/dist/registry-TUVaid9Z.mjs.map +0 -1
  1280. package/dist/relations-CA_QuMTU.mjs +0 -776
  1281. package/dist/relations-CA_QuMTU.mjs.map +0 -1
  1282. package/dist/request-cache-C4CIo5ad.mjs +0 -104
  1283. package/dist/request-cache-C4CIo5ad.mjs.map +0 -1
  1284. package/dist/request-meta-bwZ_NsvU.mjs +0 -141
  1285. package/dist/request-meta-bwZ_NsvU.mjs.map +0 -1
  1286. package/dist/resolve-D-kqyKns.mjs +0 -199
  1287. package/dist/resolve-D-kqyKns.mjs.map +0 -1
  1288. package/dist/resolve-DwNM-CXl.mjs +0 -101
  1289. package/dist/resolve-DwNM-CXl.mjs.map +0 -1
  1290. package/dist/revision-BVp8S0e_.mjs +0 -374
  1291. package/dist/revision-BVp8S0e_.mjs.map +0 -1
  1292. package/dist/route-cache-QSOyDEw0.mjs +0 -20
  1293. package/dist/route-cache-QSOyDEw0.mjs.map +0 -1
  1294. package/dist/route-wire-Ca_HWCZ5.mjs +0 -197
  1295. package/dist/route-wire-Ca_HWCZ5.mjs.map +0 -1
  1296. package/dist/routes-BerZFrvV.mjs +0 -272
  1297. package/dist/routes-BerZFrvV.mjs.map +0 -1
  1298. package/dist/runner-BObHz5FC.d.mts +0 -68
  1299. package/dist/runner-BObHz5FC.d.mts.map +0 -1
  1300. package/dist/runner-C5NeAkBQ.mjs +0 -6595
  1301. package/dist/runner-C5NeAkBQ.mjs.map +0 -1
  1302. package/dist/schema-C4OBuv6Z.mjs +0 -13
  1303. package/dist/schema-C4OBuv6Z.mjs.map +0 -1
  1304. package/dist/schema-DJRfvM_o.mjs +0 -815
  1305. package/dist/schema-DJRfvM_o.mjs.map +0 -1
  1306. package/dist/scopes-BU03K7Uo.mjs +0 -34
  1307. package/dist/scopes-BU03K7Uo.mjs.map +0 -1
  1308. package/dist/search-DfVzks89.mjs +0 -450
  1309. package/dist/search-DfVzks89.mjs.map +0 -1
  1310. package/dist/sections-BMy4JVUz.mjs +0 -346
  1311. package/dist/sections-BMy4JVUz.mjs.map +0 -1
  1312. package/dist/seo-ClB-dw9w.mjs +0 -188
  1313. package/dist/seo-ClB-dw9w.mjs.map +0 -1
  1314. package/dist/seo-VZYOEy8f.mjs +0 -133
  1315. package/dist/seo-VZYOEy8f.mjs.map +0 -1
  1316. package/dist/service-Bo_usgSk.mjs +0 -150
  1317. package/dist/service-Bo_usgSk.mjs.map +0 -1
  1318. package/dist/session-user-DlpPdf8L.mjs +0 -61
  1319. package/dist/session-user-DlpPdf8L.mjs.map +0 -1
  1320. package/dist/settings-CWb84sDm.mjs +0 -452
  1321. package/dist/settings-CWb84sDm.mjs.map +0 -1
  1322. package/dist/settings-DS914jjE.mjs +0 -66
  1323. package/dist/settings-DS914jjE.mjs.map +0 -1
  1324. package/dist/settings-Dd1uivmQ.mjs +0 -73
  1325. package/dist/settings-Dd1uivmQ.mjs.map +0 -1
  1326. package/dist/setup-complete-BuNxAUiN.mjs +0 -65
  1327. package/dist/setup-complete-BuNxAUiN.mjs.map +0 -1
  1328. package/dist/setup-nonce-BnEAX0iy.mjs +0 -25
  1329. package/dist/setup-nonce-BnEAX0iy.mjs.map +0 -1
  1330. package/dist/site-domain-Bq5j5bVg.mjs +0 -131
  1331. package/dist/site-domain-Bq5j5bVg.mjs.map +0 -1
  1332. package/dist/site-settings-DRHfX7bq.mjs +0 -50
  1333. package/dist/site-settings-DRHfX7bq.mjs.map +0 -1
  1334. package/dist/site-url-MB685I5X.mjs +0 -45
  1335. package/dist/site-url-MB685I5X.mjs.map +0 -1
  1336. package/dist/sitemap-name-BTg2NJJv.mjs +0 -26
  1337. package/dist/sitemap-name-BTg2NJJv.mjs.map +0 -1
  1338. package/dist/slug-aVnUV4SL.mjs +0 -16
  1339. package/dist/slug-aVnUV4SL.mjs.map +0 -1
  1340. package/dist/slugify-bu2-jKia.mjs +0 -22
  1341. package/dist/slugify-bu2-jKia.mjs.map +0 -1
  1342. package/dist/snapshot-DYsG4uOq.mjs +0 -414
  1343. package/dist/snapshot-DYsG4uOq.mjs.map +0 -1
  1344. package/dist/ssrf-BcYjyM4M.mjs +0 -406
  1345. package/dist/ssrf-BcYjyM4M.mjs.map +0 -1
  1346. package/dist/stage-D8DWgPcO.mjs +0 -662
  1347. package/dist/stage-D8DWgPcO.mjs.map +0 -1
  1348. package/dist/staged-CD_imitH.mjs +0 -686
  1349. package/dist/staged-CD_imitH.mjs.map +0 -1
  1350. package/dist/state-CFbGZziM.mjs +0 -178
  1351. package/dist/state-CFbGZziM.mjs.map +0 -1
  1352. package/dist/status-BFNdxzKc.mjs +0 -30
  1353. package/dist/status-BFNdxzKc.mjs.map +0 -1
  1354. package/dist/storage-query-DRyu3bSU.d.mts +0 -1615
  1355. package/dist/storage-query-DRyu3bSU.d.mts.map +0 -1
  1356. package/dist/tar-DFjExb9X.mjs +0 -449
  1357. package/dist/tar-DFjExb9X.mjs.map +0 -1
  1358. package/dist/target-CWZs2-o6.mjs +0 -27
  1359. package/dist/target-CWZs2-o6.mjs.map +0 -1
  1360. package/dist/taxonomies-ChnU7Mc8.mjs +0 -697
  1361. package/dist/taxonomies-ChnU7Mc8.mjs.map +0 -1
  1362. package/dist/taxonomies-Dd9JJv_a.mjs +0 -939
  1363. package/dist/taxonomies-Dd9JJv_a.mjs.map +0 -1
  1364. package/dist/taxonomy-C_C_LBAU.mjs +0 -550
  1365. package/dist/taxonomy-C_C_LBAU.mjs.map +0 -1
  1366. package/dist/tokens-BnhSnGwJ.mjs +0 -171
  1367. package/dist/tokens-BnhSnGwJ.mjs.map +0 -1
  1368. package/dist/transaction-BVYIo_yu.mjs +0 -29
  1369. package/dist/transaction-BVYIo_yu.mjs.map +0 -1
  1370. package/dist/transfer-ClH6w6BV.mjs +0 -8873
  1371. package/dist/transfer-ClH6w6BV.mjs.map +0 -1
  1372. package/dist/transfer-WmWiR3xf.mjs +0 -166
  1373. package/dist/transfer-WmWiR3xf.mjs.map +0 -1
  1374. package/dist/transfer-download--ofRj9Cw.mjs +0 -33
  1375. package/dist/transfer-download--ofRj9Cw.mjs.map +0 -1
  1376. package/dist/transformations-Bx4lYY0Y.mjs +0 -196
  1377. package/dist/transformations-Bx4lYY0Y.mjs.map +0 -1
  1378. package/dist/transport-BjbqNiPI.mjs +0 -136
  1379. package/dist/transport-BjbqNiPI.mjs.map +0 -1
  1380. package/dist/transport-DxiXnbXk.d.mts +0 -42
  1381. package/dist/transport-DxiXnbXk.d.mts.map +0 -1
  1382. package/dist/trusted-proxy-BU3Nx9g1.mjs +0 -51
  1383. package/dist/trusted-proxy-BU3Nx9g1.mjs.map +0 -1
  1384. package/dist/turnstile-CJwvsOqw.mjs +0 -58
  1385. package/dist/turnstile-CJwvsOqw.mjs.map +0 -1
  1386. package/dist/types-BA3ey2QH.d.mts +0 -87
  1387. package/dist/types-BA3ey2QH.d.mts.map +0 -1
  1388. package/dist/types-BGmQ0uXs.mjs +0 -201
  1389. package/dist/types-BGmQ0uXs.mjs.map +0 -1
  1390. package/dist/types-Bwpzb5o6.d.mts +0 -227
  1391. package/dist/types-Bwpzb5o6.d.mts.map +0 -1
  1392. package/dist/types-CNB-dj6F.d.mts +0 -289
  1393. package/dist/types-CNB-dj6F.d.mts.map +0 -1
  1394. package/dist/types-CgfFGfO5.mjs +0 -16
  1395. package/dist/types-CgfFGfO5.mjs.map +0 -1
  1396. package/dist/types-Cj0_yZkn.mjs +0 -18
  1397. package/dist/types-Cj0_yZkn.mjs.map +0 -1
  1398. package/dist/types-D2NEXtgB.mjs +0 -127
  1399. package/dist/types-D2NEXtgB.mjs.map +0 -1
  1400. package/dist/types-DCFavOii.d.mts +0 -916
  1401. package/dist/types-DCFavOii.d.mts.map +0 -1
  1402. package/dist/types-DHO7Pd25.d.mts +0 -366
  1403. package/dist/types-DHO7Pd25.d.mts.map +0 -1
  1404. package/dist/types-DvqVxZXa.d.mts +0 -125
  1405. package/dist/types-DvqVxZXa.d.mts.map +0 -1
  1406. package/dist/types-QoPHm-2w.d.mts +0 -1741
  1407. package/dist/types-QoPHm-2w.d.mts.map +0 -1
  1408. package/dist/types-RLgeIpnF.d.mts +0 -374
  1409. package/dist/types-RLgeIpnF.d.mts.map +0 -1
  1410. package/dist/types-qHVygneX.mjs +0 -77
  1411. package/dist/types-qHVygneX.mjs.map +0 -1
  1412. package/dist/types-sUHaH7lC.mjs +0 -37
  1413. package/dist/types-sUHaH7lC.mjs.map +0 -1
  1414. package/dist/types-slSqujQL.d.mts +0 -204
  1415. package/dist/types-slSqujQL.d.mts.map +0 -1
  1416. package/dist/update-check-BxNg9T6N.mjs +0 -161
  1417. package/dist/update-check-BxNg9T6N.mjs.map +0 -1
  1418. package/dist/upload-attempts-DPFC4COv.mjs +0 -32
  1419. package/dist/upload-attempts-DPFC4COv.mjs.map +0 -1
  1420. package/dist/url-Dn3IStq8.mjs +0 -104
  1421. package/dist/url-Dn3IStq8.mjs.map +0 -1
  1422. package/dist/url-pattern-QATUE_rv.mjs +0 -41
  1423. package/dist/url-pattern-QATUE_rv.mjs.map +0 -1
  1424. package/dist/user-BlCTKVAm.mjs +0 -171
  1425. package/dist/user-BlCTKVAm.mjs.map +0 -1
  1426. package/dist/utils-TPt7w2cS.mjs +0 -442
  1427. package/dist/utils-TPt7w2cS.mjs.map +0 -1
  1428. package/dist/validate-DxYhJQA-.mjs +0 -524
  1429. package/dist/validate-DxYhJQA-.mjs.map +0 -1
  1430. package/dist/validate-emKxGC5F.d.mts +0 -468
  1431. package/dist/validate-emKxGC5F.d.mts.map +0 -1
  1432. package/dist/validation-Ckq4vsVg.mjs +0 -220
  1433. package/dist/validation-Ckq4vsVg.mjs.map +0 -1
  1434. package/dist/version-BZj18Q7G.mjs +0 -9
  1435. package/dist/version-BZj18Q7G.mjs.map +0 -1
  1436. package/dist/version-DHmGpcch.mjs +0 -7
  1437. package/dist/version-DHmGpcch.mjs.map +0 -1
  1438. package/dist/video-DytCnw3L.mjs +0 -54
  1439. package/dist/video-DytCnw3L.mjs.map +0 -1
  1440. package/dist/virtual-modules-DO954n7P.mjs +0 -515
  1441. package/dist/virtual-modules-DO954n7P.mjs.map +0 -1
  1442. package/dist/widgets-DA5XmvVC.mjs +0 -121
  1443. package/dist/widgets-DA5XmvVC.mjs.map +0 -1
  1444. package/dist/wxr-taxonomies-CrMonejI.d.mts +0 -34
  1445. package/dist/wxr-taxonomies-CrMonejI.d.mts.map +0 -1
  1446. package/dist/wxr-taxonomies-RgRG0d5e.mjs +0 -453
  1447. package/dist/wxr-taxonomies-RgRG0d5e.mjs.map +0 -1
  1448. package/dist/zod-generator-D0JKy94C.mjs +0 -424
  1449. package/dist/zod-generator-D0JKy94C.mjs.map +0 -1
  1450. /package/dist/{api-tokens-CdP49zVF.mjs → api-tokens-C7l0GUAF.mjs} +0 -0
  1451. /package/dist/{ssrf-DM0E-D_8.mjs → ssrf-BBXcxG-f.mjs} +0 -0
@@ -0,0 +1,519 @@
1
+ import { r as isMissingTableError } from "./db-errors-unnO6yiZ.mjs";
2
+ import { t as after } from "./after-PcEvMY_6.mjs";
3
+ import { getRequestContext } from "./request-context.mjs";
4
+ import { n as assertStorageKey, t as OptionsRepository } from "./options-DhrI7eMv.mjs";
5
+ import { i as resolvePluginEncryptionKeys } from "./secrets-Cc_O3Kp-.mjs";
6
+ import { a as encodeBase64url, r as decodeBase64url } from "./base64-BQBZwXCx.mjs";
7
+ import { n as invalidateSingleFlightCache, r as singleFlightCached, t as createSingleFlightCache } from "./single-flight-cache-D0EaGbN1.mjs";
8
+ import { f as invalidateObjectCache, n as cachedQuery } from "./object-cache-EjasjtoQ.mjs";
9
+ import { n as peekRequestCache, r as requestCached } from "./request-cache-5z2WzWmh.mjs";
10
+ import { t as withTransaction } from "./transaction-CkoQ5wqQ.mjs";
11
+ import { t as MediaRepository } from "./media-B_x5B9EA.mjs";
12
+ import { t as normalizeSiteSettingsVersion } from "./version-BOFfLiVT.mjs";
13
+ import { n as siteSettingsTag } from "./chrome-tags-BDs29G3g.mjs";
14
+ import { c as getDb } from "./loader-D4w4XE7q.mjs";
15
+ import { isRecord } from "./plugin-utils.mjs";
16
+ import { r as bumpRunningExportWriteEpochs } from "./fence-BOD3SxZG.mjs";
17
+
18
+ //#region src/plugins/settings.ts
19
+ const ENVELOPE_VERSION = 1;
20
+ const ENVELOPE_MARKER = "plugin-setting";
21
+ const IV_BYTES = 12;
22
+ const KEY_ID_PATTERN = /^[0-9a-f]{8}$/;
23
+ const BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;
24
+ const textEncoder = new TextEncoder();
25
+ const textDecoder = new TextDecoder("utf-8", { fatal: true });
26
+ var PluginSettingEncryptionError = class extends Error {
27
+ name = "PluginSettingEncryptionError";
28
+ code;
29
+ constructor(code, message) {
30
+ super(message);
31
+ this.code = code;
32
+ }
33
+ };
34
+ function isEncryptedPluginSetting(value) {
35
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
36
+ return Object.keys(value).length === 5 && "$emdash" in value && value.$emdash === ENVELOPE_MARKER && "v" in value && value.v === ENVELOPE_VERSION && "kid" in value && typeof value.kid === "string" && KEY_ID_PATTERN.test(value.kid) && "iv" in value && typeof value.iv === "string" && BASE64URL_PATTERN.test(value.iv) && "ciphertext" in value && typeof value.ciphertext === "string" && BASE64URL_PATTERN.test(value.ciphertext);
37
+ }
38
+ function additionalData(pluginId, key) {
39
+ return textEncoder.encode(JSON.stringify([
40
+ "emdash-plugin-setting",
41
+ ENVELOPE_VERSION,
42
+ pluginId,
43
+ key
44
+ ]));
45
+ }
46
+ function exactBuffer(bytes) {
47
+ return bytes.slice().buffer;
48
+ }
49
+ async function importEncryptionKey(key, usage) {
50
+ return crypto.subtle.importKey("raw", exactBuffer(key.key), "AES-GCM", false, [usage]);
51
+ }
52
+ async function keysOrDefault(keys) {
53
+ return keys === void 0 ? resolvePluginEncryptionKeys() : keys;
54
+ }
55
+ async function encryptPluginSetting(pluginId, key, value, keys) {
56
+ const primary = (await keysOrDefault(keys))?.[0];
57
+ if (!primary) throw new PluginSettingEncryptionError("PLUGIN_SETTING_ENCRYPTION_KEY_MISSING", "Plugin secret settings require EMDASH_ENCRYPTION_KEY");
58
+ try {
59
+ const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES));
60
+ const cryptoKey = await importEncryptionKey(primary, "encrypt");
61
+ const ciphertext = await crypto.subtle.encrypt({
62
+ name: "AES-GCM",
63
+ iv: exactBuffer(iv),
64
+ additionalData: exactBuffer(additionalData(pluginId, key))
65
+ }, cryptoKey, exactBuffer(textEncoder.encode(value)));
66
+ return {
67
+ $emdash: ENVELOPE_MARKER,
68
+ v: ENVELOPE_VERSION,
69
+ kid: primary.kid,
70
+ iv: encodeBase64url(iv),
71
+ ciphertext: encodeBase64url(new Uint8Array(ciphertext))
72
+ };
73
+ } catch (error) {
74
+ if (error instanceof PluginSettingEncryptionError) throw error;
75
+ throw new PluginSettingEncryptionError("PLUGIN_SETTING_ENCRYPTION_FAILED", "Plugin secret setting could not be encrypted");
76
+ }
77
+ }
78
+ async function decryptPluginSetting(pluginId, key, envelope, keys) {
79
+ const resolved = await keysOrDefault(keys);
80
+ if (!resolved?.length) throw new PluginSettingEncryptionError("PLUGIN_SETTING_ENCRYPTION_KEY_MISSING", "Plugin secret setting cannot be decrypted because its encryption key is unavailable");
81
+ const matched = resolved.find((candidate) => candidate.kid === envelope.kid);
82
+ if (!matched) throw new PluginSettingEncryptionError("PLUGIN_SETTING_ENCRYPTION_KEY_UNKNOWN", "Plugin secret setting was encrypted with an unavailable key");
83
+ try {
84
+ const iv = decodeBase64url(envelope.iv);
85
+ const ciphertext = decodeBase64url(envelope.ciphertext);
86
+ if (iv.byteLength !== IV_BYTES || ciphertext.byteLength < 16) throw new Error("invalid envelope");
87
+ const cryptoKey = await importEncryptionKey(matched, "decrypt");
88
+ const plaintext = await crypto.subtle.decrypt({
89
+ name: "AES-GCM",
90
+ iv: exactBuffer(iv),
91
+ additionalData: exactBuffer(additionalData(pluginId, key))
92
+ }, cryptoKey, exactBuffer(ciphertext));
93
+ return textDecoder.decode(plaintext);
94
+ } catch {
95
+ throw new PluginSettingEncryptionError("PLUGIN_SETTING_DECRYPTION_FAILED", "Plugin secret setting could not be decrypted");
96
+ }
97
+ }
98
+ function isSecretField(schema, key) {
99
+ return schema[key]?.type === "secret";
100
+ }
101
+ async function encodePluginSettingValue(pluginId, key, value, schema, keys, onSecret) {
102
+ if (!isSecretField(schema, key)) return value;
103
+ if (typeof value !== "string") throw new PluginSettingEncryptionError("PLUGIN_SETTING_ENCRYPTION_FAILED", "Plugin secret settings must be strings");
104
+ onSecret?.(key, value);
105
+ return encryptPluginSetting(pluginId, key, value, keys);
106
+ }
107
+ async function decodePluginSettingValue(pluginId, key, value, schema, keys, onSecret) {
108
+ if (!isSecretField(schema, key)) {
109
+ if (isEncryptedPluginSetting(value)) throw new PluginSettingEncryptionError("PLUGIN_SETTING_DECRYPTION_FAILED", "Encrypted plugin setting is not declared as a secret");
110
+ return value;
111
+ }
112
+ if (typeof value === "string") {
113
+ onSecret?.(key, value);
114
+ return value;
115
+ }
116
+ if (!isEncryptedPluginSetting(value)) throw new PluginSettingEncryptionError("PLUGIN_SETTING_DECRYPTION_FAILED", "Plugin secret setting has an invalid encrypted envelope");
117
+ const decrypted = await decryptPluginSetting(pluginId, key, value, keys);
118
+ onSecret?.(key, decrypted);
119
+ return decrypted;
120
+ }
121
+ function createSettingsAccess(optionsRepo, pluginId, schema = {}, keys, onSecret) {
122
+ const prefix = `plugin:${pluginId}:settings:`;
123
+ const optionKey = (key) => {
124
+ assertStorageKey(key);
125
+ return `${prefix}${key}`;
126
+ };
127
+ return {
128
+ async get(key) {
129
+ const value = await optionsRepo.get(optionKey(key));
130
+ return value === null ? null : decodePluginSettingValue(pluginId, key, value, schema, keys, onSecret);
131
+ },
132
+ async getVersioned(key) {
133
+ const value = await optionsRepo.getVersioned(optionKey(key));
134
+ if (!value) return null;
135
+ return {
136
+ value: await decodePluginSettingValue(pluginId, key, value.value, schema, keys, onSecret),
137
+ revision: value.revision
138
+ };
139
+ },
140
+ async compareAndSet(key, expectedRevision, value) {
141
+ return optionsRepo.compareAndSet(optionKey(key), expectedRevision, await encodePluginSettingValue(pluginId, key, value, schema, keys, onSecret));
142
+ },
143
+ compareAndDelete(key, expectedRevision) {
144
+ return optionsRepo.compareAndDelete(optionKey(key), expectedRevision);
145
+ },
146
+ async set(key, value) {
147
+ await optionsRepo.set(optionKey(key), await encodePluginSettingValue(pluginId, key, value, schema, keys, onSecret));
148
+ },
149
+ delete(key) {
150
+ return optionsRepo.delete(optionKey(key));
151
+ },
152
+ async list(keyPrefix = "") {
153
+ assertStorageKey(keyPrefix || "_");
154
+ const values = await optionsRepo.getByPrefix(`${prefix}${keyPrefix}`);
155
+ const result = [];
156
+ for (const [fullKey, value] of values) {
157
+ const key = fullKey.slice(prefix.length);
158
+ result.push({
159
+ key,
160
+ value: await decodePluginSettingValue(pluginId, key, value, schema, keys, onSecret)
161
+ });
162
+ }
163
+ return result;
164
+ }
165
+ };
166
+ }
167
+
168
+ //#endregion
169
+ //#region src/settings/index.ts
170
+ /** Object-cache namespace for site settings. */
171
+ const SETTINGS_CACHE_NAMESPACE = "settings";
172
+ /** Prefix for site settings in the options table */
173
+ const SETTINGS_PREFIX = "site:";
174
+ /** Settings stored as one object whose fields are updated individually. */
175
+ const NESTED_SETTING_KEYS = new Set(["seo", "social"]);
176
+ function isPluginSettingEnvelopeRecord(value) {
177
+ return typeof value === "object" && value !== null && !Array.isArray(value) && "$emdash" in value && value.$emdash === "plugin-setting";
178
+ }
179
+ async function decodePersistedPluginSetting(pluginId, key, value, encryptionKeys) {
180
+ if (isEncryptedPluginSetting(value)) return decryptPluginSetting(pluginId, key, value, encryptionKeys);
181
+ if (isPluginSettingEnvelopeRecord(value)) throw new PluginSettingEncryptionError("PLUGIN_SETTING_DECRYPTION_FAILED", "Plugin secret setting has an invalid encrypted envelope");
182
+ return value;
183
+ }
184
+ const SITE_SETTINGS_CACHE_TTL_MS = 3e4;
185
+ const SITE_SETTINGS_CACHE_KEY = Symbol.for("emdash:site-settings:swr");
186
+ const g = globalThis;
187
+ const settingsCache = g[SITE_SETTINGS_CACHE_KEY] ?? (() => {
188
+ const c = {
189
+ snapshot: null,
190
+ expiresAt: 0,
191
+ generation: 0,
192
+ revalidatingUntil: 0,
193
+ refresh: createSingleFlightCache()
194
+ };
195
+ g[SITE_SETTINGS_CACHE_KEY] = c;
196
+ return c;
197
+ })();
198
+ /** Capture the resolved snapshot before route-cache headers are finalized. @internal */
199
+ function peekSiteSettingsSnapshot() {
200
+ return settingsCache.snapshot;
201
+ }
202
+ /** Discard a snapshot found stale by the route-cache freshness check. @internal */
203
+ function invalidateSiteSettingsSnapshot() {
204
+ settingsCache.generation++;
205
+ settingsCache.snapshot = null;
206
+ settingsCache.expiresAt = 0;
207
+ settingsCache.revalidatingUntil = 0;
208
+ invalidateSingleFlightCache(settingsCache.refresh);
209
+ }
210
+ /**
211
+ * Bump the isolate-wide site-settings cache version, forcing the next
212
+ * `getSiteSettings()` to re-query the database.
213
+ *
214
+ * Called from every `site:*` write path. Other isolates still serve their
215
+ * own cached copy while a background refresh picks up remote writes.
216
+ */
217
+ function invalidateSiteSettingsCache() {
218
+ invalidateSiteSettingsSnapshot();
219
+ invalidateObjectCache(SETTINGS_CACHE_NAMESPACE);
220
+ }
221
+ /**
222
+ * Type guard for MediaReference values
223
+ */
224
+ function isMediaReference(value) {
225
+ return typeof value === "object" && value !== null && "mediaId" in value;
226
+ }
227
+ /**
228
+ * Resolve a media reference to include the full URL plus content metadata.
229
+ *
230
+ * Pulls `mimeType` and intrinsic dimensions from the media row so callers
231
+ * can emit correct head tags (e.g. `<link rel="icon" type="image/svg+xml">`,
232
+ * which Chromium requires when the URL has no `.svg` extension) without
233
+ * a second round-trip to the media table.
234
+ */
235
+ async function resolveMediaReference(mediaRef, db, _storage) {
236
+ if (!mediaRef?.mediaId) return mediaRef;
237
+ try {
238
+ const media = await new MediaRepository(db).findById(mediaRef.mediaId);
239
+ if (media) return {
240
+ ...mediaRef,
241
+ url: `/_emdash/api/media/file/${media.storageKey}`,
242
+ contentType: media.mimeType,
243
+ ...media.width !== null ? { width: media.width } : {},
244
+ ...media.height !== null ? { height: media.height } : {}
245
+ };
246
+ } catch {}
247
+ return mediaRef;
248
+ }
249
+ /**
250
+ * Get a single site setting by key
251
+ *
252
+ * Returns `undefined` if the setting has not been configured.
253
+ * For media settings (logo, favicon), the URL is resolved automatically.
254
+ *
255
+ * @param key - The setting key (e.g., "title", "logo", "social")
256
+ * @returns The setting value, or undefined if not set
257
+ *
258
+ * @example
259
+ * ```ts
260
+ * import { getSiteSetting } from "emdash";
261
+ *
262
+ * const title = await getSiteSetting("title");
263
+ * const logo = await getSiteSetting("logo");
264
+ * console.log(logo?.url); // Resolved URL
265
+ * ```
266
+ */
267
+ async function getSiteSetting(key) {
268
+ const primed = peekRequestCache("siteSettings");
269
+ if (primed) return (await primed)[key];
270
+ return requestCached(`siteSetting:${key}`, async () => {
271
+ return getSiteSettingWithDb(key, await getDb());
272
+ });
273
+ }
274
+ /**
275
+ * Get a single site setting by key (with explicit db)
276
+ *
277
+ * @internal Use `getSiteSetting()` in templates. This variant is for admin routes
278
+ * that already have a database handle.
279
+ */
280
+ async function getSiteSettingWithDb(key, db, storage = null) {
281
+ const value = await new OptionsRepository(db).get(`${SETTINGS_PREFIX}${key}`);
282
+ if (!value) return;
283
+ if ((key === "logo" || key === "favicon") && isMediaReference(value)) return await resolveMediaReference(value, db, storage);
284
+ if (key === "seo" && value && typeof value === "object") {
285
+ const seo = value;
286
+ if (seo.defaultOgImage) return {
287
+ ...seo,
288
+ defaultOgImage: await resolveMediaReference(seo.defaultOgImage, db, storage)
289
+ };
290
+ }
291
+ return value;
292
+ }
293
+ function refreshSiteSettings() {
294
+ return singleFlightCached(settingsCache.refresh, () => cachedQuery({
295
+ namespace: SETTINGS_CACHE_NAMESPACE,
296
+ key: "snapshot-v1",
297
+ load: async () => loadSiteSettingsSnapshot(await getDb())
298
+ }), {
299
+ anchor: (promise) => after(() => promise),
300
+ ownerTimeoutMs: 3e4
301
+ });
302
+ }
303
+ function installSiteSettings(snapshot) {
304
+ settingsCache.snapshot = snapshot;
305
+ settingsCache.expiresAt = Date.now() + SITE_SETTINGS_CACHE_TTL_MS;
306
+ }
307
+ function revalidateSiteSettings() {
308
+ const now = Date.now();
309
+ if (settingsCache.revalidatingUntil > now) return;
310
+ settingsCache.revalidatingUntil = now + SITE_SETTINGS_CACHE_TTL_MS;
311
+ const generation = ++settingsCache.generation;
312
+ invalidateSingleFlightCache(settingsCache.refresh);
313
+ after(async () => {
314
+ try {
315
+ const snapshot = await refreshSiteSettings();
316
+ if (generation === settingsCache.generation) installSiteSettings(snapshot);
317
+ } catch (error) {
318
+ console.error("[emdash:settings] revalidating site settings failed:", error);
319
+ }
320
+ });
321
+ }
322
+ async function loadCachedSiteSettings() {
323
+ for (let attempt = 0; attempt < 3; attempt++) {
324
+ const snapshot = settingsCache.snapshot;
325
+ if (snapshot) {
326
+ if (Date.now() >= settingsCache.expiresAt) revalidateSiteSettings();
327
+ return snapshot;
328
+ }
329
+ const generation = settingsCache.generation;
330
+ const loaded = await refreshSiteSettings();
331
+ if (generation === settingsCache.generation) {
332
+ installSiteSettings(loaded);
333
+ return loaded;
334
+ }
335
+ if (attempt === 2) return loaded;
336
+ }
337
+ throw new Error("Site settings refresh exhausted without loading settings");
338
+ }
339
+ /**
340
+ * Get all site settings
341
+ *
342
+ * Returns all configured settings. Unset values are undefined.
343
+ * Media references (logo/favicon) are resolved to include URLs.
344
+ *
345
+ * @example
346
+ * ```ts
347
+ * import { getSiteSettings } from "emdash";
348
+ *
349
+ * const settings = await getSiteSettings();
350
+ * console.log(settings.title); // "My Site"
351
+ * console.log(settings.logo?.url); // "/_emdash/api/media/file/abc123"
352
+ * ```
353
+ */
354
+ function getSiteSettings() {
355
+ return requestCached("siteSettings", async () => {
356
+ return (await requestCached("siteSettingsSnapshot", async () => {
357
+ const ctx = getRequestContext();
358
+ const requestSettings = ctx?.siteSettings;
359
+ if (ctx?.routeCacheFill) return loadSiteSettingsSnapshot(await getDb());
360
+ let loaded = requestSettings?.snapshot ?? await loadCachedSiteSettings();
361
+ if (requestSettings?.version !== void 0 && loaded.version !== requestSettings.version) {
362
+ invalidateSiteSettingsSnapshot();
363
+ const generation = settingsCache.generation;
364
+ loaded = await loadSiteSettingsSnapshot(await getDb());
365
+ if (generation === settingsCache.generation) installSiteSettings(loaded);
366
+ }
367
+ return loaded;
368
+ })).data;
369
+ }).then(async (data) => {
370
+ const snapshot = await peekRequestCache("siteSettingsSnapshot");
371
+ if (snapshot) getRequestContext()?.siteSettings?.onRead(snapshot.version);
372
+ return data;
373
+ });
374
+ }
375
+ /**
376
+ * Get all site settings with a Workers edge-cache hint.
377
+ *
378
+ * Use the returned `cacheHint` with `Astro.cache.set()` so pages that render
379
+ * settings can be purged automatically when site settings change.
380
+ */
381
+ async function getSiteSettingsWithCacheHint() {
382
+ return {
383
+ data: await getSiteSettings(),
384
+ cacheHint: { tags: [siteSettingsTag()] }
385
+ };
386
+ }
387
+ /**
388
+ * Get all site settings (with explicit db)
389
+ *
390
+ * @internal Use `getSiteSettings()` in templates. This variant is for admin routes
391
+ * that already have a database handle.
392
+ */
393
+ async function getSiteSettingsWithDb(db, storage = null) {
394
+ return (await loadSiteSettingsSnapshot(db, storage)).data;
395
+ }
396
+ async function loadSiteSettingsSnapshot(db, storage = null) {
397
+ const allOptions = await new OptionsRepository(db).getVersionedByPrefix(SETTINGS_PREFIX);
398
+ const version = normalizeSiteSettingsVersion(JSON.stringify([...allOptions].filter(([key]) => key.startsWith(SETTINGS_PREFIX)).map(([key, value]) => [key, value.revision])));
399
+ const settings = {};
400
+ for (const [key, value] of allOptions) {
401
+ const settingKey = key.replace(SETTINGS_PREFIX, "");
402
+ settings[settingKey] = value.value;
403
+ }
404
+ const typedSettings = settings;
405
+ if (typedSettings.logo) typedSettings.logo = await resolveMediaReference(typedSettings.logo, db, storage);
406
+ if (typedSettings.favicon) typedSettings.favicon = await resolveMediaReference(typedSettings.favicon, db, storage);
407
+ if (typedSettings.seo?.defaultOgImage) typedSettings.seo = {
408
+ ...typedSettings.seo,
409
+ defaultOgImage: await resolveMediaReference(typedSettings.seo.defaultOgImage, db, storage)
410
+ };
411
+ return {
412
+ data: typedSettings,
413
+ version
414
+ };
415
+ }
416
+ /**
417
+ * Set site settings (internal function used by admin API)
418
+ *
419
+ * Merges provided settings with existing ones. Only provided fields are updated,
420
+ * including fields inside `seo` and `social`; `seo.defaultOgImage: null` removes the default image.
421
+ * Media references should include just the mediaId; URLs are resolved on read.
422
+ *
423
+ * @param settings - Partial settings object with values to update
424
+ * @param db - Kysely database instance
425
+ * @returns Promise that resolves when settings are saved
426
+ *
427
+ * @internal
428
+ *
429
+ * @example
430
+ * ```ts
431
+ * // Update multiple settings at once
432
+ * await setSiteSettings({
433
+ * title: "My Site",
434
+ * tagline: "Welcome",
435
+ * logo: { mediaId: "med_123", alt: "Logo" }
436
+ * }, db);
437
+ * ```
438
+ */
439
+ async function setSiteSettings(settings, db) {
440
+ const updates = {};
441
+ const deletions = [];
442
+ const nestedPatches = [];
443
+ for (const [key, value] of Object.entries(settings)) {
444
+ if (value === void 0) continue;
445
+ if (value === null) deletions.push(`${SETTINGS_PREFIX}${key}`);
446
+ else if (NESTED_SETTING_KEYS.has(key) && isRecord(value)) nestedPatches.push([key, value]);
447
+ else updates[`${SETTINGS_PREFIX}${key}`] = value;
448
+ }
449
+ if (Object.keys(updates).length === 0 && deletions.length === 0 && nestedPatches.length === 0) return;
450
+ try {
451
+ await withTransaction(db, async (trx) => {
452
+ const transactionOptions = new OptionsRepository(trx);
453
+ await transactionOptions.setMany(updates);
454
+ await transactionOptions.deleteMany(deletions);
455
+ for (const [key, patch] of nestedPatches) {
456
+ const optionName = `${SETTINGS_PREFIX}${key}`;
457
+ const next = { ...await transactionOptions.get(optionName) };
458
+ for (const [field, fieldValue] of Object.entries(patch)) if (fieldValue === null) delete next[field];
459
+ else if (fieldValue !== void 0) next[field] = fieldValue;
460
+ if (Object.keys(next).length === 0) await transactionOptions.delete(optionName);
461
+ else await transactionOptions.set(optionName, next);
462
+ }
463
+ try {
464
+ await bumpRunningExportWriteEpochs(trx);
465
+ } catch (error) {
466
+ if (isMissingTableError(error)) return;
467
+ throw error;
468
+ }
469
+ });
470
+ } finally {
471
+ invalidateSiteSettingsCache();
472
+ }
473
+ }
474
+ /**
475
+ * Get a single plugin setting by key.
476
+ *
477
+ * Plugin settings are stored in the options table under
478
+ * `plugin:<pluginId>:settings:<key>`.
479
+ */
480
+ async function getPluginSetting(pluginId, key) {
481
+ return getPluginSettingWithDb(pluginId, key, await getDb());
482
+ }
483
+ /**
484
+ * Get a single plugin setting by key (with explicit db).
485
+ *
486
+ * @internal Use `getPluginSetting()` in templates and plugin rendering code.
487
+ */
488
+ async function getPluginSettingWithDb(pluginId, key, db) {
489
+ const value = await new OptionsRepository(db).get(`plugin:${pluginId}:settings:${key}`);
490
+ if (value === null) return void 0;
491
+ return await decodePersistedPluginSetting(pluginId, key, value);
492
+ }
493
+ /**
494
+ * Get all persisted plugin settings for a plugin.
495
+ *
496
+ * Defaults declared in `admin.settingsSchema` are not materialized
497
+ * automatically; callers should apply their own fallback defaults.
498
+ */
499
+ async function getPluginSettings(pluginId) {
500
+ return getPluginSettingsWithDb(pluginId, await getDb());
501
+ }
502
+ /**
503
+ * Get all persisted plugin settings for a plugin (with explicit db).
504
+ *
505
+ * @internal Use `getPluginSettings()` in templates and plugin rendering code.
506
+ */
507
+ async function getPluginSettingsWithDb(pluginId, db) {
508
+ const prefix = `plugin:${pluginId}:settings:`;
509
+ const entries = [...await new OptionsRepository(db).getByPrefix(prefix)].filter(([key]) => key.startsWith(prefix));
510
+ const encryptionKeys = entries.some(([, value]) => isEncryptedPluginSetting(value)) ? await resolvePluginEncryptionKeys() : void 0;
511
+ return Object.fromEntries(await Promise.all(entries.map(async ([storedKey, value]) => {
512
+ const key = storedKey.slice(prefix.length);
513
+ return [key, await decodePersistedPluginSetting(pluginId, key, value, encryptionKeys)];
514
+ })));
515
+ }
516
+
517
+ //#endregion
518
+ export { isEncryptedPluginSetting as _, getSiteSettings as a, invalidateSiteSettingsCache as c, setSiteSettings as d, PluginSettingEncryptionError as f, encryptPluginSetting as g, encodePluginSettingValue as h, getSiteSettingWithDb as i, invalidateSiteSettingsSnapshot as l, decodePluginSettingValue as m, getPluginSettings as n, getSiteSettingsWithCacheHint as o, createSettingsAccess as p, getSiteSetting as r, getSiteSettingsWithDb as s, getPluginSetting as t, peekSiteSettingsSnapshot as u };
519
+ //# sourceMappingURL=settings-yIqoN-Ok.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-yIqoN-Ok.mjs","names":[],"sources":["../src/plugins/settings.ts","../src/settings/index.ts"],"sourcesContent":["import { resolvePluginEncryptionKeys, type ParsedEncryptionKey } from \"../config/secrets.js\";\nimport type { OptionsRepository } from \"../database/repositories/options.js\";\nimport { decodeBase64url, encodeBase64url } from \"../utils/base64.js\";\nimport { assertStorageKey } from \"./conditional-storage.js\";\nexport { createPluginSecretRedactor } from \"./secret-redactor.js\";\nexport type { PluginSecretRedactor } from \"./secret-redactor.js\";\nimport type {\n\tConditionalDeleteResult,\n\tConditionalWriteResult,\n\tSettingField,\n\tSettingsAccess,\n\tVersionedValue,\n} from \"./types.js\";\n\nconst ENVELOPE_VERSION = 1;\nconst ENVELOPE_MARKER = \"plugin-setting\";\nconst IV_BYTES = 12;\nconst KEY_ID_PATTERN = /^[0-9a-f]{8}$/;\nconst BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\nexport interface EncryptedPluginSetting {\n\t$emdash: \"plugin-setting\";\n\tv: 1;\n\tkid: string;\n\tiv: string;\n\tciphertext: string;\n}\n\nexport class PluginSettingEncryptionError extends Error {\n\toverride readonly name = \"PluginSettingEncryptionError\";\n\treadonly code:\n\t\t| \"PLUGIN_SETTING_ENCRYPTION_KEY_MISSING\"\n\t\t| \"PLUGIN_SETTING_ENCRYPTION_KEY_UNKNOWN\"\n\t\t| \"PLUGIN_SETTING_ENCRYPTION_FAILED\"\n\t\t| \"PLUGIN_SETTING_DECRYPTION_FAILED\";\n\n\tconstructor(code: PluginSettingEncryptionError[\"code\"], message: string) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n}\n\nexport function isEncryptedPluginSetting(value: unknown): value is EncryptedPluginSetting {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n\treturn (\n\t\tObject.keys(value).length === 5 &&\n\t\t\"$emdash\" in value &&\n\t\tvalue.$emdash === ENVELOPE_MARKER &&\n\t\t\"v\" in value &&\n\t\tvalue.v === ENVELOPE_VERSION &&\n\t\t\"kid\" in value &&\n\t\ttypeof value.kid === \"string\" &&\n\t\tKEY_ID_PATTERN.test(value.kid) &&\n\t\t\"iv\" in value &&\n\t\ttypeof value.iv === \"string\" &&\n\t\tBASE64URL_PATTERN.test(value.iv) &&\n\t\t\"ciphertext\" in value &&\n\t\ttypeof value.ciphertext === \"string\" &&\n\t\tBASE64URL_PATTERN.test(value.ciphertext)\n\t);\n}\n\nfunction additionalData(pluginId: string, key: string): Uint8Array {\n\treturn textEncoder.encode(\n\t\tJSON.stringify([\"emdash-plugin-setting\", ENVELOPE_VERSION, pluginId, key]),\n\t);\n}\n\nfunction exactBuffer(bytes: Uint8Array): ArrayBuffer {\n\treturn bytes.slice().buffer;\n}\n\nasync function importEncryptionKey(key: ParsedEncryptionKey, usage: KeyUsage): Promise<CryptoKey> {\n\treturn crypto.subtle.importKey(\"raw\", exactBuffer(key.key), \"AES-GCM\", false, [usage]);\n}\n\nasync function keysOrDefault(\n\tkeys: ParsedEncryptionKey[] | null | undefined,\n): Promise<ParsedEncryptionKey[] | null> {\n\treturn keys === undefined ? resolvePluginEncryptionKeys() : keys;\n}\n\nexport async function encryptPluginSetting(\n\tpluginId: string,\n\tkey: string,\n\tvalue: string,\n\tkeys?: ParsedEncryptionKey[] | null,\n): Promise<EncryptedPluginSetting> {\n\tconst resolved = await keysOrDefault(keys);\n\tconst primary = resolved?.[0];\n\tif (!primary) {\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_ENCRYPTION_KEY_MISSING\",\n\t\t\t\"Plugin secret settings require EMDASH_ENCRYPTION_KEY\",\n\t\t);\n\t}\n\n\ttry {\n\t\tconst iv = crypto.getRandomValues(new Uint8Array(IV_BYTES));\n\t\tconst cryptoKey = await importEncryptionKey(primary, \"encrypt\");\n\t\tconst ciphertext = await crypto.subtle.encrypt(\n\t\t\t{\n\t\t\t\tname: \"AES-GCM\",\n\t\t\t\tiv: exactBuffer(iv),\n\t\t\t\tadditionalData: exactBuffer(additionalData(pluginId, key)),\n\t\t\t},\n\t\t\tcryptoKey,\n\t\t\texactBuffer(textEncoder.encode(value)),\n\t\t);\n\t\treturn {\n\t\t\t$emdash: ENVELOPE_MARKER,\n\t\t\tv: ENVELOPE_VERSION,\n\t\t\tkid: primary.kid,\n\t\t\tiv: encodeBase64url(iv),\n\t\t\tciphertext: encodeBase64url(new Uint8Array(ciphertext)),\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof PluginSettingEncryptionError) throw error;\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_ENCRYPTION_FAILED\",\n\t\t\t\"Plugin secret setting could not be encrypted\",\n\t\t);\n\t}\n}\n\nexport async function decryptPluginSetting(\n\tpluginId: string,\n\tkey: string,\n\tenvelope: EncryptedPluginSetting,\n\tkeys?: ParsedEncryptionKey[] | null,\n): Promise<string> {\n\tconst resolved = await keysOrDefault(keys);\n\tif (!resolved?.length) {\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_ENCRYPTION_KEY_MISSING\",\n\t\t\t\"Plugin secret setting cannot be decrypted because its encryption key is unavailable\",\n\t\t);\n\t}\n\tconst matched = resolved.find((candidate) => candidate.kid === envelope.kid);\n\tif (!matched) {\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_ENCRYPTION_KEY_UNKNOWN\",\n\t\t\t\"Plugin secret setting was encrypted with an unavailable key\",\n\t\t);\n\t}\n\n\ttry {\n\t\tconst iv = decodeBase64url(envelope.iv);\n\t\tconst ciphertext = decodeBase64url(envelope.ciphertext);\n\t\tif (iv.byteLength !== IV_BYTES || ciphertext.byteLength < 16)\n\t\t\tthrow new Error(\"invalid envelope\");\n\t\tconst cryptoKey = await importEncryptionKey(matched, \"decrypt\");\n\t\tconst plaintext = await crypto.subtle.decrypt(\n\t\t\t{\n\t\t\t\tname: \"AES-GCM\",\n\t\t\t\tiv: exactBuffer(iv),\n\t\t\t\tadditionalData: exactBuffer(additionalData(pluginId, key)),\n\t\t\t},\n\t\t\tcryptoKey,\n\t\t\texactBuffer(ciphertext),\n\t\t);\n\t\treturn textDecoder.decode(plaintext);\n\t} catch {\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_DECRYPTION_FAILED\",\n\t\t\t\"Plugin secret setting could not be decrypted\",\n\t\t);\n\t}\n}\n\nfunction isSecretField(schema: Record<string, SettingField>, key: string): boolean {\n\treturn schema[key]?.type === \"secret\";\n}\n\nexport async function encodePluginSettingValue(\n\tpluginId: string,\n\tkey: string,\n\tvalue: unknown,\n\tschema: Record<string, SettingField>,\n\tkeys?: ParsedEncryptionKey[] | null,\n\tonSecret?: (key: string, value: string) => void,\n): Promise<unknown> {\n\tif (!isSecretField(schema, key)) return value;\n\tif (typeof value !== \"string\") {\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_ENCRYPTION_FAILED\",\n\t\t\t\"Plugin secret settings must be strings\",\n\t\t);\n\t}\n\tonSecret?.(key, value);\n\treturn encryptPluginSetting(pluginId, key, value, keys);\n}\n\nexport async function decodePluginSettingValue<T = unknown>(\n\tpluginId: string,\n\tkey: string,\n\tvalue: unknown,\n\tschema: Record<string, SettingField>,\n\tkeys?: ParsedEncryptionKey[] | null,\n\tonSecret?: (key: string, value: string) => void,\n): Promise<T> {\n\tif (!isSecretField(schema, key)) {\n\t\tif (isEncryptedPluginSetting(value)) {\n\t\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\t\"PLUGIN_SETTING_DECRYPTION_FAILED\",\n\t\t\t\t\"Encrypted plugin setting is not declared as a secret\",\n\t\t\t);\n\t\t}\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- caller supplies the expected non-secret setting type\n\t\treturn value as T;\n\t}\n\tif (typeof value === \"string\") {\n\t\tonSecret?.(key, value);\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- secret schema guarantees a string and caller supplies its compatible type\n\t\treturn value as T;\n\t}\n\tif (!isEncryptedPluginSetting(value)) {\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_DECRYPTION_FAILED\",\n\t\t\t\"Plugin secret setting has an invalid encrypted envelope\",\n\t\t);\n\t}\n\tconst decrypted = await decryptPluginSetting(pluginId, key, value, keys);\n\tonSecret?.(key, decrypted);\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- secret schema guarantees a string and caller supplies its compatible type\n\treturn decrypted as T;\n}\n\nexport function createSettingsAccess(\n\toptionsRepo: OptionsRepository,\n\tpluginId: string,\n\tschema: Record<string, SettingField> = {},\n\tkeys?: ParsedEncryptionKey[] | null,\n\tonSecret?: (key: string, value: string) => void,\n): SettingsAccess {\n\tconst prefix = `plugin:${pluginId}:settings:`;\n\tconst optionKey = (key: string) => {\n\t\tassertStorageKey(key);\n\t\treturn `${prefix}${key}`;\n\t};\n\n\treturn {\n\t\tasync get<T>(key: string): Promise<T | null> {\n\t\t\tconst value = await optionsRepo.get(optionKey(key));\n\t\t\treturn value === null\n\t\t\t\t? null\n\t\t\t\t: decodePluginSettingValue<T>(pluginId, key, value, schema, keys, onSecret);\n\t\t},\n\t\tasync getVersioned<T>(key: string): Promise<VersionedValue<T> | null> {\n\t\t\tconst value = await optionsRepo.getVersioned(optionKey(key));\n\t\t\tif (!value) return null;\n\t\t\treturn {\n\t\t\t\tvalue: await decodePluginSettingValue<T>(\n\t\t\t\t\tpluginId,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue.value,\n\t\t\t\t\tschema,\n\t\t\t\t\tkeys,\n\t\t\t\t\tonSecret,\n\t\t\t\t),\n\t\t\t\trevision: value.revision,\n\t\t\t};\n\t\t},\n\t\tasync compareAndSet(\n\t\t\tkey: string,\n\t\t\texpectedRevision: string | null,\n\t\t\tvalue: unknown,\n\t\t): Promise<ConditionalWriteResult> {\n\t\t\treturn optionsRepo.compareAndSet(\n\t\t\t\toptionKey(key),\n\t\t\t\texpectedRevision,\n\t\t\t\tawait encodePluginSettingValue(pluginId, key, value, schema, keys, onSecret),\n\t\t\t);\n\t\t},\n\t\tcompareAndDelete(key: string, expectedRevision: string): Promise<ConditionalDeleteResult> {\n\t\t\treturn optionsRepo.compareAndDelete(optionKey(key), expectedRevision);\n\t\t},\n\t\tasync set(key: string, value: unknown): Promise<void> {\n\t\t\tawait optionsRepo.set(\n\t\t\t\toptionKey(key),\n\t\t\t\tawait encodePluginSettingValue(pluginId, key, value, schema, keys, onSecret),\n\t\t\t);\n\t\t},\n\t\tdelete(key: string): Promise<boolean> {\n\t\t\treturn optionsRepo.delete(optionKey(key));\n\t\t},\n\t\tasync list(keyPrefix = \"\"): Promise<Array<{ key: string; value: unknown }>> {\n\t\t\tassertStorageKey(keyPrefix || \"_\");\n\t\t\tconst values = await optionsRepo.getByPrefix(`${prefix}${keyPrefix}`);\n\t\t\tconst result: Array<{ key: string; value: unknown }> = [];\n\t\t\tfor (const [fullKey, value] of values) {\n\t\t\t\tconst key = fullKey.slice(prefix.length);\n\t\t\t\tresult.push({\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: await decodePluginSettingValue(pluginId, key, value, schema, keys, onSecret),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t};\n}\n","/**\n * Site Settings API\n *\n * Functions for getting and setting global site configuration.\n * Settings are stored in the options table with 'site:' prefix.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport { after } from \"../after.js\";\nimport { siteSettingsTag } from \"../cache/chrome-tags.js\";\nimport { resolvePluginEncryptionKeys } from \"../config/secrets.js\";\nimport { MediaRepository } from \"../database/repositories/media.js\";\nimport { OptionsRepository } from \"../database/repositories/options.js\";\nimport { withTransaction } from \"../database/transaction.js\";\nimport type { Database } from \"../database/types.js\";\nimport { getDb } from \"../loader.js\";\nimport { cachedQuery, invalidateObjectCache } from \"../object-cache/index.js\";\nimport { isRecord } from \"../plugin-utils.js\";\nimport {\n\tPluginSettingEncryptionError,\n\tdecryptPluginSetting,\n\tisEncryptedPluginSetting,\n} from \"../plugins/settings.js\";\nimport type { CacheHint } from \"../query.js\";\nimport { peekRequestCache, requestCached } from \"../request-cache.js\";\nimport { getRequestContext } from \"../request-context.js\";\nimport { bumpRunningExportWriteEpochs } from \"../transfer/fence.js\";\nimport { isMissingTableError } from \"../utils/db-errors.js\";\n\n/** Object-cache namespace for site settings. */\nconst SETTINGS_CACHE_NAMESPACE = \"settings\";\nimport type { Storage } from \"../storage/types.js\";\nimport {\n\tcreateSingleFlightCache,\n\ttype SingleFlightCache,\n\tinvalidateSingleFlightCache,\n\tsingleFlightCached,\n} from \"../utils/single-flight-cache.js\";\nimport type {\n\tMediaReference,\n\tSeoSettings,\n\tSiteSettings,\n\tSiteSettingsUpdate,\n\tSiteSettingKey,\n} from \"./types.js\";\nimport { normalizeSiteSettingsVersion } from \"./version.js\";\n\n/** Prefix for site settings in the options table */\nconst SETTINGS_PREFIX = \"site:\";\n\n/** Settings stored as one object whose fields are updated individually. */\nconst NESTED_SETTING_KEYS = new Set([\"seo\", \"social\"]);\n\nfunction isPluginSettingEnvelopeRecord(value: unknown): value is Record<string, unknown> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t!Array.isArray(value) &&\n\t\t\"$emdash\" in value &&\n\t\tvalue.$emdash === \"plugin-setting\"\n\t);\n}\n\nasync function decodePersistedPluginSetting(\n\tpluginId: string,\n\tkey: string,\n\tvalue: unknown,\n\tencryptionKeys?: Awaited<ReturnType<typeof resolvePluginEncryptionKeys>>,\n): Promise<unknown> {\n\tif (isEncryptedPluginSetting(value)) {\n\t\treturn decryptPluginSetting(pluginId, key, value, encryptionKeys);\n\t}\n\tif (isPluginSettingEnvelopeRecord(value)) {\n\t\tthrow new PluginSettingEncryptionError(\n\t\t\t\"PLUGIN_SETTING_DECRYPTION_FAILED\",\n\t\t\t\"Plugin secret setting has an invalid encrypted envelope\",\n\t\t);\n\t}\n\treturn value;\n}\n\n/**\n * Worker-isolate cache for the resolved `site:*` settings.\n *\n * Site settings (title, logo, SEO defaults) change rarely but are read on\n * every public request. Revalidate warm snapshots after 30 seconds in the\n * background, retaining the last good value if the reload fails.\n *\n * Backed by single-flight-cache.ts: concurrent cold reads coalesce onto one\n * query via a reclaimable single-flight lock and the resolved *value* is\n * cached — never a shared in-flight promise, so a cancelled request can't\n * poison the isolate (see that file's header). Stored on globalThis with a\n * Symbol.for key so Vite SSR chunk duplication doesn't produce two\n * independent caches (same pattern as request-context.ts).\n */\ninterface CachedSiteSettings {\n\tdata: Partial<SiteSettings>;\n\tversion: string;\n}\n\ninterface SiteSettingsCache {\n\tsnapshot: CachedSiteSettings | null;\n\texpiresAt: number;\n\tgeneration: number;\n\trevalidatingUntil: number;\n\trefresh: SingleFlightCache<CachedSiteSettings>;\n}\n\nconst SITE_SETTINGS_CACHE_TTL_MS = 30_000;\nconst SITE_SETTINGS_CACHE_KEY = Symbol.for(\"emdash:site-settings:swr\");\nconst g = globalThis as Record<symbol, unknown>;\nconst settingsCache: SiteSettingsCache =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-context.ts)\n\t(g[SITE_SETTINGS_CACHE_KEY] as SiteSettingsCache | undefined) ??\n\t(() => {\n\t\tconst c: SiteSettingsCache = {\n\t\t\tsnapshot: null,\n\t\t\texpiresAt: 0,\n\t\t\tgeneration: 0,\n\t\t\trevalidatingUntil: 0,\n\t\t\trefresh: createSingleFlightCache<CachedSiteSettings>(),\n\t\t};\n\t\tg[SITE_SETTINGS_CACHE_KEY] = c;\n\t\treturn c;\n\t})();\n\n/** Capture the resolved snapshot before route-cache headers are finalized. @internal */\nexport function peekSiteSettingsSnapshot(): CachedSiteSettings | null {\n\treturn settingsCache.snapshot;\n}\n\n/** Discard a snapshot found stale by the route-cache freshness check. @internal */\nexport function invalidateSiteSettingsSnapshot(): void {\n\tsettingsCache.generation++;\n\tsettingsCache.snapshot = null;\n\tsettingsCache.expiresAt = 0;\n\tsettingsCache.revalidatingUntil = 0;\n\tinvalidateSingleFlightCache(settingsCache.refresh);\n}\n\n/**\n * Bump the isolate-wide site-settings cache version, forcing the next\n * `getSiteSettings()` to re-query the database.\n *\n * Called from every `site:*` write path. Other isolates still serve their\n * own cached copy while a background refresh picks up remote writes.\n */\nexport function invalidateSiteSettingsCache(): void {\n\tinvalidateSiteSettingsSnapshot();\n\t// Cross-isolate invalidation for the optional distributed object cache.\n\tinvalidateObjectCache(SETTINGS_CACHE_NAMESPACE);\n}\n\n/**\n * Type guard for MediaReference values\n */\nfunction isMediaReference(value: unknown): value is MediaReference {\n\treturn typeof value === \"object\" && value !== null && \"mediaId\" in value;\n}\n\n/**\n * Resolve a media reference to include the full URL plus content metadata.\n *\n * Pulls `mimeType` and intrinsic dimensions from the media row so callers\n * can emit correct head tags (e.g. `<link rel=\"icon\" type=\"image/svg+xml\">`,\n * which Chromium requires when the URL has no `.svg` extension) without\n * a second round-trip to the media table.\n */\nasync function resolveMediaReference(\n\tmediaRef: MediaReference | undefined,\n\tdb: Kysely<Database>,\n\t_storage: Storage | null,\n): Promise<MediaReference | undefined> {\n\tif (!mediaRef?.mediaId) {\n\t\treturn mediaRef;\n\t}\n\n\ttry {\n\t\tconst mediaRepo = new MediaRepository(db);\n\t\tconst media = await mediaRepo.findById(mediaRef.mediaId);\n\n\t\tif (media) {\n\t\t\t// Construct URL using the same pattern as API handlers\n\t\t\treturn {\n\t\t\t\t...mediaRef,\n\t\t\t\turl: `/_emdash/api/media/file/${media.storageKey}`,\n\t\t\t\tcontentType: media.mimeType,\n\t\t\t\t...(media.width !== null ? { width: media.width } : {}),\n\t\t\t\t...(media.height !== null ? { height: media.height } : {}),\n\t\t\t};\n\t\t}\n\t} catch {\n\t\t// If media not found or error, return the reference as-is\n\t}\n\n\treturn mediaRef;\n}\n\n/**\n * Get a single site setting by key\n *\n * Returns `undefined` if the setting has not been configured.\n * For media settings (logo, favicon), the URL is resolved automatically.\n *\n * @param key - The setting key (e.g., \"title\", \"logo\", \"social\")\n * @returns The setting value, or undefined if not set\n *\n * @example\n * ```ts\n * import { getSiteSetting } from \"emdash\";\n *\n * const title = await getSiteSetting(\"title\");\n * const logo = await getSiteSetting(\"logo\");\n * console.log(logo?.url); // Resolved URL\n * ```\n */\nexport async function getSiteSetting<K extends SiteSettingKey>(\n\tkey: K,\n): Promise<SiteSettings[K] | undefined> {\n\t// If `getSiteSettings()` has already been called in this request,\n\t// read from that (request-cached) batch rather than firing a second\n\t// options-table query. Common layout: a Base template pulls the\n\t// whole settings object up-front, then `EmDashHead` or a plugin\n\t// asks for one key — no reason the singular call should round-trip\n\t// again.\n\tconst primed = peekRequestCache<Partial<SiteSettings>>(\"siteSettings\");\n\tif (primed) {\n\t\tconst settings = await primed;\n\t\treturn settings[key];\n\t}\n\n\t// Otherwise cache per-key. Templates that pull several settings\n\t// independently still share the in-flight query for each one.\n\treturn requestCached(`siteSetting:${key}`, async () => {\n\t\tconst db = await getDb();\n\t\treturn getSiteSettingWithDb(key, db);\n\t});\n}\n\n/**\n * Get a single site setting by key (with explicit db)\n *\n * @internal Use `getSiteSetting()` in templates. This variant is for admin routes\n * that already have a database handle.\n */\nexport async function getSiteSettingWithDb<K extends SiteSettingKey>(\n\tkey: K,\n\tdb: Kysely<Database>,\n\tstorage: Storage | null = null,\n): Promise<SiteSettings[K] | undefined> {\n\tconst options = new OptionsRepository(db);\n\tconst value = await options.get<SiteSettings[K]>(`${SETTINGS_PREFIX}${key}`);\n\n\tif (!value) {\n\t\treturn undefined;\n\t}\n\n\t// Resolve media references if needed.\n\t// TS cannot narrow generic K from key equality checks — this is a known limitation.\n\t// We use the non-generic getSiteSettingsWithDb for media resolution instead.\n\tif ((key === \"logo\" || key === \"favicon\") && isMediaReference(value)) {\n\t\tconst resolved = await resolveMediaReference(value, db, storage);\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- TS can't narrow generic K from key equality; resolved type is correct\n\t\treturn resolved as SiteSettings[K] | undefined;\n\t}\n\n\tif (key === \"seo\" && value && typeof value === \"object\") {\n\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- TS can't narrow generic K from key equality\n\t\tconst seo = value as SeoSettings;\n\t\tif (seo.defaultOgImage) {\n\t\t\tconst resolved = {\n\t\t\t\t...seo,\n\t\t\t\tdefaultOgImage: await resolveMediaReference(seo.defaultOgImage, db, storage),\n\t\t\t};\n\t\t\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- TS can't narrow generic K from key equality\n\t\t\treturn resolved as SiteSettings[K] | undefined;\n\t\t}\n\t}\n\n\treturn value;\n}\n\nfunction refreshSiteSettings(): Promise<CachedSiteSettings> {\n\treturn singleFlightCached(\n\t\tsettingsCache.refresh,\n\t\t() =>\n\t\t\tcachedQuery({\n\t\t\t\tnamespace: SETTINGS_CACHE_NAMESPACE,\n\t\t\t\tkey: \"snapshot-v1\",\n\t\t\t\tload: async () => loadSiteSettingsSnapshot(await getDb()),\n\t\t\t}),\n\t\t{ anchor: (promise) => after(() => promise), ownerTimeoutMs: 30_000 },\n\t);\n}\n\nfunction installSiteSettings(snapshot: CachedSiteSettings): void {\n\tsettingsCache.snapshot = snapshot;\n\tsettingsCache.expiresAt = Date.now() + SITE_SETTINGS_CACHE_TTL_MS;\n}\n\nfunction revalidateSiteSettings(): void {\n\tconst now = Date.now();\n\tif (settingsCache.revalidatingUntil > now) return;\n\tsettingsCache.revalidatingUntil = now + SITE_SETTINGS_CACHE_TTL_MS;\n\tconst generation = ++settingsCache.generation;\n\tinvalidateSingleFlightCache(settingsCache.refresh);\n\tafter(async () => {\n\t\ttry {\n\t\t\tconst snapshot = await refreshSiteSettings();\n\t\t\tif (generation === settingsCache.generation) installSiteSettings(snapshot);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[emdash:settings] revalidating site settings failed:\", error);\n\t\t}\n\t});\n}\n\nasync function loadCachedSiteSettings(): Promise<CachedSiteSettings> {\n\tfor (let attempt = 0; attempt < 3; attempt++) {\n\t\tconst snapshot = settingsCache.snapshot;\n\t\tif (snapshot) {\n\t\t\tif (Date.now() >= settingsCache.expiresAt) revalidateSiteSettings();\n\t\t\treturn snapshot;\n\t\t}\n\t\tconst generation = settingsCache.generation;\n\t\tconst loaded = await refreshSiteSettings();\n\t\tif (generation === settingsCache.generation) {\n\t\t\tinstallSiteSettings(loaded);\n\t\t\treturn loaded;\n\t\t}\n\t\tif (attempt === 2) return loaded;\n\t}\n\tthrow new Error(\"Site settings refresh exhausted without loading settings\");\n}\n\n/**\n * Get all site settings\n *\n * Returns all configured settings. Unset values are undefined.\n * Media references (logo/favicon) are resolved to include URLs.\n *\n * @example\n * ```ts\n * import { getSiteSettings } from \"emdash\";\n *\n * const settings = await getSiteSettings();\n * console.log(settings.title); // \"My Site\"\n * console.log(settings.logo?.url); // \"/_emdash/api/media/file/abc123\"\n * ```\n */\nexport function getSiteSettings(): Promise<Partial<SiteSettings>> {\n\treturn requestCached(\"siteSettings\", async () => {\n\t\tconst snapshot = await requestCached(\"siteSettingsSnapshot\", async () => {\n\t\t\tconst ctx = getRequestContext();\n\t\t\tconst requestSettings = ctx?.siteSettings;\n\t\t\tif (ctx?.routeCacheFill) return loadSiteSettingsSnapshot(await getDb());\n\t\t\tlet loaded = requestSettings?.snapshot ?? (await loadCachedSiteSettings());\n\t\t\t// A cold streamed component may join a load started before verification.\n\t\t\t// Reload an older result instead of streaming that snapshot into a fill.\n\t\t\tif (requestSettings?.version !== undefined && loaded.version !== requestSettings.version) {\n\t\t\t\tinvalidateSiteSettingsSnapshot();\n\t\t\t\tconst generation = settingsCache.generation;\n\t\t\t\tloaded = await loadSiteSettingsSnapshot(await getDb());\n\t\t\t\tif (generation === settingsCache.generation) installSiteSettings(loaded);\n\t\t\t}\n\t\t\treturn loaded;\n\t\t});\n\t\treturn snapshot.data;\n\t}).then(async (data) => {\n\t\tconst snapshot = await peekRequestCache<CachedSiteSettings>(\"siteSettingsSnapshot\");\n\t\tif (snapshot) getRequestContext()?.siteSettings?.onRead(snapshot.version);\n\t\treturn data;\n\t});\n}\n\n/**\n * Get all site settings with a Workers edge-cache hint.\n *\n * Use the returned `cacheHint` with `Astro.cache.set()` so pages that render\n * settings can be purged automatically when site settings change.\n */\nexport async function getSiteSettingsWithCacheHint(): Promise<{\n\tdata: Partial<SiteSettings>;\n\tcacheHint: CacheHint;\n}> {\n\tconst data = await getSiteSettings();\n\treturn { data, cacheHint: { tags: [siteSettingsTag()] } };\n}\n\n/**\n * Get all site settings (with explicit db)\n *\n * @internal Use `getSiteSettings()` in templates. This variant is for admin routes\n * that already have a database handle.\n */\nexport async function getSiteSettingsWithDb(\n\tdb: Kysely<Database>,\n\tstorage: Storage | null = null,\n): Promise<Partial<SiteSettings>> {\n\treturn (await loadSiteSettingsSnapshot(db, storage)).data;\n}\n\nasync function loadSiteSettingsSnapshot(\n\tdb: Kysely<Database>,\n\tstorage: Storage | null = null,\n): Promise<CachedSiteSettings> {\n\tconst options = new OptionsRepository(db);\n\tconst allOptions = await options.getVersionedByPrefix(SETTINGS_PREFIX);\n\tconst version = normalizeSiteSettingsVersion(\n\t\tJSON.stringify(\n\t\t\t[...allOptions]\n\t\t\t\t.filter(([key]) => key.startsWith(SETTINGS_PREFIX))\n\t\t\t\t.map(([key, value]) => [key, value.revision]),\n\t\t),\n\t);\n\tconst settings: Record<string, unknown> = {};\n\n\tfor (const [key, value] of allOptions) {\n\t\tconst settingKey = key.replace(SETTINGS_PREFIX, \"\");\n\t\tsettings[settingKey] = value.value;\n\t}\n\n\tconst typedSettings = settings as Partial<SiteSettings>;\n\n\t// Resolve media references\n\tif (typedSettings.logo) {\n\t\ttypedSettings.logo = await resolveMediaReference(typedSettings.logo, db, storage);\n\t}\n\tif (typedSettings.favicon) {\n\t\ttypedSettings.favicon = await resolveMediaReference(typedSettings.favicon, db, storage);\n\t}\n\tif (typedSettings.seo?.defaultOgImage) {\n\t\ttypedSettings.seo = {\n\t\t\t...typedSettings.seo,\n\t\t\tdefaultOgImage: await resolveMediaReference(typedSettings.seo.defaultOgImage, db, storage),\n\t\t};\n\t}\n\n\treturn { data: typedSettings, version };\n}\n\n/**\n * Set site settings (internal function used by admin API)\n *\n * Merges provided settings with existing ones. Only provided fields are updated,\n * including fields inside `seo` and `social`; `seo.defaultOgImage: null` removes the default image.\n * Media references should include just the mediaId; URLs are resolved on read.\n *\n * @param settings - Partial settings object with values to update\n * @param db - Kysely database instance\n * @returns Promise that resolves when settings are saved\n *\n * @internal\n *\n * @example\n * ```ts\n * // Update multiple settings at once\n * await setSiteSettings({\n * title: \"My Site\",\n * tagline: \"Welcome\",\n * logo: { mediaId: \"med_123\", alt: \"Logo\" }\n * }, db);\n * ```\n */\nexport async function setSiteSettings(\n\tsettings: SiteSettingsUpdate,\n\tdb: Kysely<Database>,\n): Promise<void> {\n\tconst updates: Record<string, unknown> = {};\n\tconst deletions: string[] = [];\n\tconst nestedPatches: [key: string, patch: Record<string, unknown>][] = [];\n\n\tfor (const [key, value] of Object.entries(settings)) {\n\t\tif (value === undefined) continue;\n\t\tif (value === null) deletions.push(`${SETTINGS_PREFIX}${key}`);\n\t\telse if (NESTED_SETTING_KEYS.has(key) && isRecord(value)) nestedPatches.push([key, value]);\n\t\telse updates[`${SETTINGS_PREFIX}${key}`] = value;\n\t}\n\n\tif (Object.keys(updates).length === 0 && deletions.length === 0 && nestedPatches.length === 0) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait withTransaction(db, async (trx) => {\n\t\t\tconst transactionOptions = new OptionsRepository(trx);\n\t\t\tawait transactionOptions.setMany(updates);\n\t\t\tawait transactionOptions.deleteMany(deletions);\n\n\t\t\tfor (const [key, patch] of nestedPatches) {\n\t\t\t\tconst optionName = `${SETTINGS_PREFIX}${key}`;\n\t\t\t\tconst next = { ...(await transactionOptions.get<Record<string, unknown>>(optionName)) };\n\t\t\t\tfor (const [field, fieldValue] of Object.entries(patch)) {\n\t\t\t\t\tif (fieldValue === null) delete next[field];\n\t\t\t\t\telse if (fieldValue !== undefined) next[field] = fieldValue;\n\t\t\t\t}\n\t\t\t\tif (Object.keys(next).length === 0) await transactionOptions.delete(optionName);\n\t\t\t\telse await transactionOptions.set(optionName, next);\n\t\t\t}\n\n\t\t\t// A running export detects writes to tables without updated_at via\n\t\t\t// the operation's write_epoch. Record that bump in the same\n\t\t\t// transaction so the settings update is not accepted unless the\n\t\t\t// export fence can see it. When the transfer system has not been\n\t\t\t// installed yet (pre-migration, or a minimal seed fixture), there\n\t\t\t// is no running export to notify, so the absence of its table is\n\t\t\t// not a reason to reject the settings update.\n\t\t\ttry {\n\t\t\t\tawait bumpRunningExportWriteEpochs(trx);\n\t\t\t} catch (error) {\n\t\t\t\tif (isMissingTableError(error)) return;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t} finally {\n\t\tinvalidateSiteSettingsCache();\n\t}\n}\n\n/**\n * Get a single plugin setting by key.\n *\n * Plugin settings are stored in the options table under\n * `plugin:<pluginId>:settings:<key>`.\n */\nexport async function getPluginSetting<T = unknown>(\n\tpluginId: string,\n\tkey: string,\n): Promise<T | undefined> {\n\tconst db = await getDb();\n\treturn getPluginSettingWithDb<T>(pluginId, key, db);\n}\n\n/**\n * Get a single plugin setting by key (with explicit db).\n *\n * @internal Use `getPluginSetting()` in templates and plugin rendering code.\n */\nexport async function getPluginSettingWithDb<T = unknown>(\n\tpluginId: string,\n\tkey: string,\n\tdb: Kysely<Database>,\n): Promise<T | undefined> {\n\tconst options = new OptionsRepository(db);\n\tconst value = await options.get(`plugin:${pluginId}:settings:${key}`);\n\tif (value === null) return undefined;\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- caller supplies the expected plugin setting type\n\treturn (await decodePersistedPluginSetting(pluginId, key, value)) as T;\n}\n\n/**\n * Get all persisted plugin settings for a plugin.\n *\n * Defaults declared in `admin.settingsSchema` are not materialized\n * automatically; callers should apply their own fallback defaults.\n */\nexport async function getPluginSettings(pluginId: string): Promise<Record<string, unknown>> {\n\tconst db = await getDb();\n\treturn getPluginSettingsWithDb(pluginId, db);\n}\n\n/**\n * Get all persisted plugin settings for a plugin (with explicit db).\n *\n * @internal Use `getPluginSettings()` in templates and plugin rendering code.\n */\nexport async function getPluginSettingsWithDb(\n\tpluginId: string,\n\tdb: Kysely<Database>,\n): Promise<Record<string, unknown>> {\n\tconst prefix = `plugin:${pluginId}:settings:`;\n\tconst options = new OptionsRepository(db);\n\tconst allOptions = await options.getByPrefix(prefix);\n\n\tconst entries = [...allOptions].filter(([key]) => key.startsWith(prefix));\n\tconst encryptionKeys = entries.some(([, value]) => isEncryptedPluginSetting(value))\n\t\t? await resolvePluginEncryptionKeys()\n\t\t: undefined;\n\treturn Object.fromEntries(\n\t\tawait Promise.all(\n\t\t\tentries.map(async ([storedKey, value]) => {\n\t\t\t\tconst key = storedKey.slice(prefix.length);\n\t\t\t\treturn [\n\t\t\t\t\tkey,\n\t\t\t\t\tawait decodePersistedPluginSetting(pluginId, key, value, encryptionKeys),\n\t\t\t\t] as const;\n\t\t\t}),\n\t\t),\n\t);\n}\n"],"mappings":"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"}