dineway 0.2.32 → 0.2.34

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 (457) hide show
  1. package/dist/{activity-CfryM8jO.mjs → activity-CZnq5YlZ.mjs} +2 -2
  2. package/dist/{activity-events-BVo9rMUz.mjs → activity-events-D-yGV7cW.mjs} +1 -1
  3. package/dist/{actor-DrJJsvy6.mjs → actor-DxUAJgQX.mjs} +20 -6
  4. package/dist/{adapters-DHt3f2lu.d.mts → adapters-BQ8CQbBm.d.mts} +5 -7
  5. package/dist/after-BVaUn7bK.mjs +24 -0
  6. package/dist/{allowed-origins-DtBQa4JR.mjs → allowed-origins-DV3LWuWW.mjs} +1 -1
  7. package/dist/api/route-utils.d.mts +10 -10
  8. package/dist/api/route-utils.mjs +23 -19
  9. package/dist/api/schemas/index.d.mts +1 -1
  10. package/dist/api/schemas/index.mjs +5 -5
  11. package/dist/{api-DF92r_un.mjs → api-CL4pG2zf.mjs} +55 -1215
  12. package/dist/api-tokens-D5K_Csub.mjs +3 -0
  13. package/dist/{api-tokens-CSomx-l3.mjs → api-tokens-_6tMD1W4.mjs} +1 -1
  14. package/dist/{apply-Bs2jXsms.mjs → apply-CYLUMiZg.mjs} +109 -93
  15. package/dist/astro/index.d.mts +16 -12
  16. package/dist/astro/index.mjs +50 -9
  17. package/dist/astro/middleware/auth.d.mts +9 -9
  18. package/dist/astro/middleware/auth.mjs +29 -8
  19. package/dist/astro/middleware/redirect.mjs +8 -7
  20. package/dist/astro/middleware/request-context.mjs +17 -10
  21. package/dist/astro/middleware/seed.d.mts +1 -1
  22. package/dist/astro/middleware/seed.mjs +93 -71
  23. package/dist/astro/middleware/setup.mjs +1 -1
  24. package/dist/astro/middleware/workers.d.mts +6 -0
  25. package/dist/astro/middleware/workers.mjs +8 -0
  26. package/dist/astro/middleware.mjs +288 -159
  27. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -7
  28. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -7
  29. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  30. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  31. package/dist/astro/routes/api/admin/briefing.mjs +25 -23
  32. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -4
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +11 -10
  34. package/dist/astro/routes/api/admin/byline-fields/index.mjs +11 -10
  35. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +11 -10
  36. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -20
  37. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -20
  38. package/dist/astro/routes/api/admin/bylines/index.mjs +22 -20
  39. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +17 -16
  40. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -7
  41. package/dist/astro/routes/api/admin/comments/bulk.mjs +14 -13
  42. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -7
  43. package/dist/astro/routes/api/admin/comments/index.mjs +14 -13
  44. package/dist/astro/routes/api/admin/context/_id_/history.mjs +43 -31
  45. package/dist/astro/routes/api/admin/context/_id_/index.mjs +43 -31
  46. package/dist/astro/routes/api/admin/context/_id_/review.mjs +48 -36
  47. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +48 -36
  48. package/dist/astro/routes/api/admin/context/diff.mjs +47 -35
  49. package/dist/astro/routes/api/admin/context/index.mjs +48 -36
  50. package/dist/astro/routes/api/admin/context/stale.mjs +47 -35
  51. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +43 -31
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +47 -35
  53. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +47 -35
  54. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +44 -32
  55. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  56. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +7 -7
  57. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +7 -7
  58. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +72 -66
  59. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +72 -66
  60. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +64 -58
  61. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +71 -65
  62. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +71 -65
  63. package/dist/astro/routes/api/admin/plugins/index.mjs +64 -58
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +64 -58
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +71 -65
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +64 -58
  68. package/dist/astro/routes/api/admin/plugins/updates.mjs +64 -58
  69. package/dist/astro/routes/api/admin/review-requests/_id_/image.mjs +26 -23
  70. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +33 -25
  71. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +56 -43
  72. package/dist/astro/routes/api/admin/review-requests/_id_/revoke.mjs +10 -9
  73. package/dist/astro/routes/api/admin/review-requests/index.mjs +54 -41
  74. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +64 -58
  75. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  76. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +64 -58
  77. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +20 -12
  78. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
  79. package/dist/astro/routes/api/admin/users/_id_/index.mjs +40 -32
  80. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  81. package/dist/astro/routes/api/admin/users/index.mjs +7 -7
  82. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -5
  83. package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
  84. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
  85. package/dist/astro/routes/api/auth/invite/index.mjs +9 -9
  86. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
  87. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  88. package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -11
  89. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  90. package/dist/astro/routes/api/auth/me.mjs +11 -11
  91. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  92. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +5 -4
  93. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +5 -4
  94. package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -7
  95. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  96. package/dist/astro/routes/api/auth/passkey/options.mjs +14 -13
  97. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -11
  98. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -12
  99. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -12
  100. package/dist/astro/routes/api/auth/setup-token/index.mjs +32 -23
  101. package/dist/astro/routes/api/auth/setup-token/verify.mjs +32 -26
  102. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -12
  103. package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
  104. package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +21 -18
  106. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +19 -16
  107. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  108. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +8 -7
  109. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +8 -7
  110. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +8 -7
  111. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +24 -21
  112. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +35 -22
  113. package/dist/astro/routes/api/content/_collection_/_id_/release-readiness.mjs +9 -9
  114. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +8 -7
  115. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  116. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +35 -22
  117. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +23 -19
  118. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  119. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +8 -7
  120. package/dist/astro/routes/api/content/_collection_/_id_.mjs +14 -13
  121. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  122. package/dist/astro/routes/api/content/_collection_/index.mjs +14 -13
  123. package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
  124. package/dist/astro/routes/api/dashboard.mjs +16 -11
  125. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  126. package/dist/astro/routes/api/health.mjs +1 -1
  127. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  128. package/dist/astro/routes/api/import/probe.mjs +25 -24
  129. package/dist/astro/routes/api/import/wordpress/analyze.mjs +12 -11
  130. package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
  131. package/dist/astro/routes/api/import/wordpress/execute.mjs +51 -42
  132. package/dist/astro/routes/api/import/wordpress/media.d.mts +9 -9
  133. package/dist/astro/routes/api/import/wordpress/media.mjs +14 -14
  134. package/dist/astro/routes/api/import/wordpress/prepare.mjs +52 -40
  135. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +10 -10
  136. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +50 -38
  137. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  138. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +29 -27
  139. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  140. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +9 -9
  141. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +56 -47
  142. package/dist/astro/routes/api/integration/artifact.mjs +11 -8
  143. package/dist/astro/routes/api/integration/dispatch.mjs +17 -14
  144. package/dist/astro/routes/api/integrations/_provider_.mjs +11 -8
  145. package/dist/astro/routes/api/integrations/index.mjs +10 -7
  146. package/dist/astro/routes/api/manifest.mjs +5 -5
  147. package/dist/astro/routes/api/mcp.mjs +98 -88
  148. package/dist/astro/routes/api/media/_id_/confirm.mjs +12 -12
  149. package/dist/astro/routes/api/media/_id_.mjs +9 -9
  150. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  151. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  152. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  153. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  154. package/dist/astro/routes/api/media/upload-url.mjs +13 -13
  155. package/dist/astro/routes/api/media.mjs +16 -16
  156. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +48 -36
  157. package/dist/astro/routes/api/menus/_name_/items.mjs +48 -36
  158. package/dist/astro/routes/api/menus/_name_/reorder.mjs +48 -36
  159. package/dist/astro/routes/api/menus/_name_/translations.mjs +48 -36
  160. package/dist/astro/routes/api/menus/_name_.mjs +48 -36
  161. package/dist/astro/routes/api/menus/index.mjs +48 -36
  162. package/dist/astro/routes/api/oauth/authorize.mjs +9 -7
  163. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -6
  164. package/dist/astro/routes/api/oauth/device/code.mjs +11 -9
  165. package/dist/astro/routes/api/oauth/device/token.mjs +10 -8
  166. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  167. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -6
  168. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -6
  169. package/dist/astro/routes/api/oauth/token.mjs +8 -6
  170. package/dist/astro/routes/api/openapi.json.mjs +5 -5
  171. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  172. package/dist/astro/routes/api/redirects/404s/index.mjs +15 -14
  173. package/dist/astro/routes/api/redirects/404s/summary.mjs +15 -14
  174. package/dist/astro/routes/api/redirects/_id_.mjs +48 -37
  175. package/dist/astro/routes/api/redirects/index.mjs +48 -37
  176. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  177. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  178. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +66 -60
  179. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +66 -60
  180. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +66 -60
  181. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +66 -60
  182. package/dist/astro/routes/api/schema/collections/index.mjs +66 -60
  183. package/dist/astro/routes/api/schema/index.mjs +12 -11
  184. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +64 -58
  185. package/dist/astro/routes/api/schema/orphans/index.mjs +64 -58
  186. package/dist/astro/routes/api/search/enable.mjs +15 -14
  187. package/dist/astro/routes/api/search/index.mjs +14 -13
  188. package/dist/astro/routes/api/search/rebuild.mjs +15 -14
  189. package/dist/astro/routes/api/search/stats.mjs +9 -8
  190. package/dist/astro/routes/api/search/suggest.mjs +14 -13
  191. package/dist/astro/routes/api/sections/_slug_.mjs +48 -36
  192. package/dist/astro/routes/api/sections/index.mjs +48 -36
  193. package/dist/astro/routes/api/settings/email.mjs +5 -5
  194. package/dist/astro/routes/api/settings/reviews.mjs +11 -10
  195. package/dist/astro/routes/api/settings.mjs +48 -36
  196. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -14
  197. package/dist/astro/routes/api/setup/admin.mjs +12 -12
  198. package/dist/astro/routes/api/setup/dev-bypass.mjs +35 -31
  199. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  200. package/dist/astro/routes/api/setup/index.mjs +37 -33
  201. package/dist/astro/routes/api/setup/status.mjs +3 -3
  202. package/dist/astro/routes/api/snapshot.mjs +11 -9
  203. package/dist/astro/routes/api/system/heartbeat.mjs +2 -2
  204. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +51 -39
  205. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +51 -39
  206. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +51 -39
  207. package/dist/astro/routes/api/taxonomies/index.mjs +51 -39
  208. package/dist/astro/routes/api/themes/preview.mjs +8 -6
  209. package/dist/astro/routes/api/typegen.mjs +4 -4
  210. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  211. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  212. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  213. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +47 -35
  214. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +48 -36
  215. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +48 -36
  216. package/dist/astro/routes/api/widget-areas/_name_.mjs +45 -33
  217. package/dist/astro/routes/api/widget-areas/index.mjs +48 -36
  218. package/dist/astro/routes/api/widget-components.mjs +2 -2
  219. package/dist/astro/routes/robots.txt.mjs +11 -10
  220. package/dist/astro/routes/sitemap-_collection_.xml.mjs +20 -18
  221. package/dist/astro/routes/sitemap.xml.mjs +19 -17
  222. package/dist/astro/session-driver.d.mts +1 -1
  223. package/dist/astro/session-driver.mjs +4 -4
  224. package/dist/astro/types.d.mts +13 -13
  225. package/dist/atomic-authority-CnBQJ14T.mjs +33 -0
  226. package/dist/{audit-CYjfxG9i.mjs → audit-F5iWkbcJ.mjs} +11 -4
  227. package/dist/auth/providers/github.d.mts +1 -1
  228. package/dist/auth/providers/google.d.mts +1 -1
  229. package/dist/{auth-control-guard-CITT8ZA_.mjs → auth-control-guard-D4WW-wFF.mjs} +1 -1
  230. package/dist/{authorize-KcI0pAfN.mjs → authorize-EnP57AQl.mjs} +1 -1
  231. package/dist/{briefing-r3hXCDQC.mjs → briefing-BXsVwd4P.mjs} +1 -1
  232. package/dist/{briefing-BgQTljQt.mjs → briefing-CkCi6S-W.mjs} +445 -447
  233. package/dist/{bundle-S6zx-V4D.mjs → bundle-Cgak1zGE.mjs} +3 -3
  234. package/dist/{byline-Ctil4rij.mjs → byline-DEZKlzD9.mjs} +107 -113
  235. package/dist/{byline-fields-QpmruT5r.mjs → byline-fields-BGEIA9dZ.mjs} +3 -3
  236. package/dist/{byline-fields-DNXKWUW9.d.mts → byline-fields-BmkhEDFF.d.mts} +2 -2
  237. package/dist/{byline-fields-DiCyW6eQ.mjs → byline-fields-Qg8TesxL.mjs} +1 -1
  238. package/dist/{byline-registry-rkr73qSE.mjs → byline-registry-CkuVVeJJ.mjs} +46 -76
  239. package/dist/{bylines-BcuBpzVi.mjs → bylines-7BQxRGyG.mjs} +4 -4
  240. package/dist/{bylines-v_ZUQnR-.mjs → bylines-LqNRjma2.mjs} +6 -6
  241. package/dist/{cache-V2BCplaY.mjs → cache-CSTy-R-K.mjs} +2 -2
  242. package/dist/{chunks-CnuL55JE.mjs → chunks-BnG3LPMN.mjs} +1 -1
  243. package/dist/cli/index.mjs +452 -263
  244. package/dist/cli/plugin-kit.d.mts +9 -9
  245. package/dist/cli/plugin-kit.mjs +2 -2
  246. package/dist/client/external-auth-headers.d.mts +1 -1
  247. package/dist/client/index.d.mts +11 -11
  248. package/dist/client/index.mjs +2 -2
  249. package/dist/{client-factory-C-y9VZDX.mjs → client-factory-BLSkgsTg.mjs} +1 -1
  250. package/dist/{comment-_nvJSS-A.mjs → comment-Bi7cJ9SS.mjs} +2 -2
  251. package/dist/{comment-reaction-DhVgJ17S.mjs → comment-reaction-BLqIj5mx.mjs} +1 -1
  252. package/dist/{comments-D4mIDjvA.mjs → comments-Dg_gWBEB.mjs} +1 -1
  253. package/dist/content-De_XeXy_.mjs +1230 -0
  254. package/dist/{content-CVCrcuvD.mjs → content-NobcQti0.mjs} +240 -161
  255. package/dist/{content-refresh-QvBIyb_g.mjs → content-refresh-l4mPoGeX.mjs} +170 -193
  256. package/dist/{context-MftkHbWx.mjs → context-6uqzU-M9.mjs} +95 -77
  257. package/dist/{context-JjKucxBm.mjs → context-B0SG9Xkc.mjs} +2 -2
  258. package/dist/{context-route-helpers-e1APrqSm.mjs → context-route-helpers-C8s26uDT.mjs} +2 -2
  259. package/dist/{cron-mGVPQ5e6.mjs → cron-D7zB6m8i.mjs} +36 -32
  260. package/dist/d1-binding-D6HZa3ks.mjs +8 -0
  261. package/dist/d1-dialect-B1b8cmxX.mjs +48 -0
  262. package/dist/{dashboard-ZJ7sMcBI.mjs → dashboard-B-OybCMw.mjs} +5 -5
  263. package/dist/database/batch.d.mts +20 -0
  264. package/dist/database/batch.mjs +69 -0
  265. package/dist/database/d1/index.d.mts +18 -0
  266. package/dist/database/d1/index.mjs +8 -0
  267. package/dist/db/d1.d.mts +7 -0
  268. package/dist/db/d1.mjs +13 -0
  269. package/dist/db/index.d.mts +4 -4
  270. package/dist/db/index.mjs +10 -7
  271. package/dist/db/libsql.d.mts +1 -1
  272. package/dist/db/libsql.mjs +46 -3
  273. package/dist/db/postgres.d.mts +1 -1
  274. package/dist/db/sqlite.d.mts +1 -1
  275. package/dist/{device-flow-eOcL5m0Q.mjs → device-flow-DhpCzMo0.mjs} +130 -94
  276. package/dist/{dialect-helpers-fk43GbDb.mjs → dialect-helpers-C6xtO-Ui.mjs} +1 -1
  277. package/dist/{discovery-CJkuHGhZ.mjs → discovery-CqXbN0WZ.mjs} +5 -5
  278. package/dist/{enrich-KErvJOuI.mjs → enrich-BjF-J4sF.mjs} +1 -1
  279. package/dist/{evidence-6IUv9ML3.mjs → evidence-xJf8hQgH.mjs} +7 -7
  280. package/dist/{field-defs-cache-CwrIyZFT.mjs → field-defs-cache-BKKFFf_V.mjs} +5 -5
  281. package/dist/{forgeway-account-lYJ8iX3G.mjs → forgeway-account-BeKJlKh1.mjs} +1 -1
  282. package/dist/{fts-manager-DX7ZkrCa.mjs → fts-manager-BeWtB7ZD.mjs} +72 -57
  283. package/dist/{hitl-requests-CmYVunm-.mjs → hitl-requests-evSsel48.mjs} +2 -2
  284. package/dist/{hitl-route-helpers-CRm537zS.mjs → hitl-route-helpers-D2kJSOFX.mjs} +5 -5
  285. package/dist/{import-DqRAgsKr.mjs → import-Jpta-CYE.mjs} +9 -9
  286. package/dist/{index-Co7xtjkd.d.mts → index-CSUSBfdD.d.mts} +7 -4
  287. package/dist/index.d.mts +16 -16
  288. package/dist/index.mjs +104 -96
  289. package/dist/{integration-credentials-qudN6yRr.mjs → integration-credentials-BrQr0fb_.mjs} +2 -2
  290. package/dist/{jsonld-DTd-AVWg.d.mts → jsonld-CqIVIeZK.d.mts} +2 -2
  291. package/dist/{load-fCOciq0Q.mjs → load-Dc5ttyg4.mjs} +1 -1
  292. package/dist/{loader-BDje8ME2.mjs → loader-Cgsx23wU.mjs} +4 -4
  293. package/dist/{manifest-schema-CfKD0thC.mjs → manifest-schema-DG29meRy.mjs} +1 -1
  294. package/dist/{mcp-reviewed-executor-DmhM3Cy6.mjs → mcp-reviewed-executor-DAZL3Ckt.mjs} +7 -7
  295. package/dist/media/image-endpoint.mjs +1 -1
  296. package/dist/media/index.d.mts +1 -1
  297. package/dist/media/index.mjs +2 -2
  298. package/dist/media/local-runtime.d.mts +11 -11
  299. package/dist/media/local-runtime.mjs +3 -3
  300. package/dist/{media-dvRjj4po.mjs → media-3fK0u-bo.mjs} +1 -1
  301. package/dist/{media-allowlist-DaG6lNoy.mjs → media-allowlist-rN4qIF6W.mjs} +1 -1
  302. package/dist/{menus-CpuR4Qkm.mjs → menus-5liJusbp.mjs} +138 -90
  303. package/dist/{menus-CZbz5L_V.mjs → menus-CbR_J8cJ.mjs} +8 -8
  304. package/dist/migrations-CMdxWKx-.mjs +76 -0
  305. package/dist/oauth-authority-CCqo4eBm.mjs +43 -0
  306. package/dist/{oauth-authorization-Jf5e3azH.mjs → oauth-authorization--0UtTZpv.mjs} +89 -98
  307. package/dist/{oauth-clients-tovQ4D4h.mjs → oauth-clients-D4WBYaYW.mjs} +2 -2
  308. package/dist/object-cache/memory.d.mts +1 -1
  309. package/dist/{object-cache-D51qOseS.mjs → object-cache-BGjIlY9s.mjs} +1 -1
  310. package/dist/page/index.d.mts +10 -10
  311. package/dist/page/index.mjs +1 -1
  312. package/dist/{parse-IsGn-5lt.mjs → parse--7nG62_h.mjs} +1 -1
  313. package/dist/plugin-utils.d.mts +9 -9
  314. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  315. package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
  316. package/dist/{plugins-DXyLI3Hb.mjs → plugins-DK1wLuao.mjs} +35 -84
  317. package/dist/{policy-950odoX_.mjs → policy-Dej7NJFD.mjs} +2 -2
  318. package/dist/{preview-BXmS1SXL.mjs → preview-q0pkibNO.mjs} +2 -2
  319. package/dist/{provider-loader-DDq7R_RN.d.mts → provider-loader-C0GaLwKB.d.mts} +1 -1
  320. package/dist/{public-url-CT-T1D_w.d.mts → public-url-B9zEdO8p.d.mts} +1 -1
  321. package/dist/{public-url-BQ9vf0AS.d.mts → public-url-BV-YQ_LF.d.mts} +2 -2
  322. package/dist/{publication-authorization-C-vYPGD8.mjs → publication-authorization-BrEZ2TsE.mjs} +459 -33
  323. package/dist/{query-CrW2yI6G.mjs → query-CEn9HXnf.mjs} +15 -15
  324. package/dist/{query-DcB9uGTW.mjs → query-DAS6VbMS.mjs} +4 -4
  325. package/dist/{rate-limit-DEkoxTsP.mjs → rate-limit-Dd1TnzZP.mjs} +2 -2
  326. package/dist/{redirect-DG-o0CKV.mjs → redirect-HLI3wT5Y.mjs} +26 -14
  327. package/dist/{redirects-Bjp4iKJU.mjs → redirects-DmOdfRjI.mjs} +5 -5
  328. package/dist/{redirects-N8gmWhVM.mjs → redirects-UCXyL0lP.mjs} +3 -3
  329. package/dist/{registry-D-IV_h50.mjs → registry-RD9qTnYL.mjs} +183 -186
  330. package/dist/release-BR08Slqf.mjs +5148 -0
  331. package/dist/request-context.d.mts +8 -0
  332. package/dist/{request-meta-BW0the1R.mjs → request-meta-BOcuHAXD.mjs} +1 -1
  333. package/dist/{resolve-pZ4NQM-X.mjs → resolve-C80Pm2DW.mjs} +1 -1
  334. package/dist/{review-payload-f1L4lzQg.mjs → review-payload-DEylbssM.mjs} +52 -4
  335. package/dist/{review-requests-DICrYH2-.mjs → review-requests-BF2eEKr8.mjs} +93 -37
  336. package/dist/{review-requests-BTKfeWlS.mjs → review-requests-CyfWbJ6W.mjs} +2 -2
  337. package/dist/{review-route-helpers-DaZBBps8.mjs → review-route-helpers-lKA-CXms.mjs} +2 -2
  338. package/dist/{revision-De7OmYVD.mjs → revision-090sZyGc.mjs} +28 -22
  339. package/dist/revocation-B7GL5fMl.mjs +53 -0
  340. package/dist/{runner-DJiRFyLI.mjs → runner-CVeq0266.mjs} +594 -491
  341. package/dist/{runner-Dye73myO.d.mts → runner-JnJSGXEB.d.mts} +1 -1
  342. package/dist/{runs-DEujUDOj.mjs → runs-B5BExdKO.mjs} +5 -5
  343. package/dist/runtime-env-CQVAWHzH.mjs +19 -0
  344. package/dist/runtime.d.mts +10 -10
  345. package/dist/runtime.mjs +5 -5
  346. package/dist/schema-DLMkODQc.mjs +8 -0
  347. package/dist/{search-DxUKN9Zz.mjs → search-CRzWNfxX.mjs} +4 -4
  348. package/dist/{secrets-AdCrGg1c.mjs → secrets-Cg0D2gQW.mjs} +10 -11
  349. package/dist/{sections-BPFOEMK6.mjs → sections-BwUjOGqn.mjs} +2 -2
  350. package/dist/seed/index.d.mts +2 -2
  351. package/dist/seed/index.mjs +29 -25
  352. package/dist/seo/index.d.mts +3 -3
  353. package/dist/seo/index.mjs +11 -10
  354. package/dist/{seo-DWHdo5aW.mjs → seo-BOTuCeh-.mjs} +25 -15
  355. package/dist/{seo-GfovzqpU.mjs → seo-B_tBFyud.mjs} +1 -1
  356. package/dist/{service-DbgjHWyW.mjs → service--bQht6oN.mjs} +2 -2
  357. package/dist/{service-BrNKVCjC.mjs → service-DilVsWGD.mjs} +3 -3
  358. package/dist/{session-user-DyqWGIh4.mjs → session-user-DeqTcAmR.mjs} +1 -1
  359. package/dist/{settings-CAsQLi0N.mjs → settings-DFzevIrU.mjs} +8 -8
  360. package/dist/{settings-BKEHw6Bu.mjs → settings-Deqx3Upy.mjs} +2 -2
  361. package/dist/{setup-complete-C8LTo8cO.mjs → setup-complete-BFqudwbW.mjs} +1 -1
  362. package/dist/{site-activity-7oezuHXK.mjs → site-activity-BrN2NviL.mjs} +11 -4
  363. package/dist/{site-context-CA7rbxux.mjs → site-context-vCiDRr4H.mjs} +50 -37
  364. package/dist/{site-url-DoZf_jVj.mjs → site-url-wXFqbm9c.mjs} +1 -1
  365. package/dist/state-jyNZ6-7L.mjs +30 -0
  366. package/dist/storage/local.d.mts +1 -1
  367. package/dist/storage/local.mjs +1 -1
  368. package/dist/storage/s3.d.mts +1 -1
  369. package/dist/storage/s3.mjs +3 -3
  370. package/dist/{store-c4qx3gVh.mjs → store-C1yDxxfv.mjs} +37 -12
  371. package/dist/submission-BsHNfHc7.mjs +155 -0
  372. package/dist/{taxonomies-ALDiRQ84.mjs → taxonomies-4cnTcbD6.mjs} +3 -3
  373. package/dist/{taxonomies-93DV-1QT.mjs → taxonomies-CllxqaH0.mjs} +7 -7
  374. package/dist/{taxonomy-BOBTJ_aE.mjs → taxonomy-DWxxLpp5.mjs} +3 -3
  375. package/dist/{tokens-c-qxNqzC.mjs → tokens-Bjuf1HID.mjs} +1 -1
  376. package/dist/{trusted-proxy-CdEl6g6B.mjs → trusted-proxy-CAW9o4Dw.mjs} +4 -12
  377. package/dist/{types-BRCUO8NR.d.mts → types-7Th6Mwz3.d.mts} +1 -0
  378. package/dist/{types-BpSTdH1H.mjs → types-BqxIv8Il.mjs} +2 -2
  379. package/dist/{types-6KmeXInJ.d.mts → types-CFgTpfPk.d.mts} +1 -1
  380. package/dist/{types-TpXK8km5.d.mts → types-QjOcidFc.d.mts} +300 -172
  381. package/dist/ui/server-runtime.d.mts +13 -13
  382. package/dist/ui/server-runtime.mjs +28 -26
  383. package/dist/{user-D0NJ7gYf.mjs → user-1-YV30lf.mjs} +2 -2
  384. package/dist/{utils-BK2efsHv.mjs → utils-Cglcqpm2.mjs} +2 -2
  385. package/dist/{validate-CDWVODvc.d.mts → validate-A27peRc4.d.mts} +3 -3
  386. package/dist/{validate-C9g9iX3q.mjs → validate-Wl4MSf3V.mjs} +3 -3
  387. package/dist/version-BWxyC5s4.mjs +6 -0
  388. package/dist/{widgets-Cm5Qx2Np.mjs → widgets-Di-6yDH7.mjs} +3 -3
  389. package/dist/{wordpress-slugs-WdPZaVXf.mjs → wordpress-slugs-vOx7R1dM.mjs} +1 -1
  390. package/dist/{worker-D7OccgB8.mjs → worker-RpaMP71d.mjs} +76 -47
  391. package/dist/workers-build-BaQCrSmf.mjs +36 -0
  392. package/dist/{zod-generator-DS5oZNaL.mjs → zod-generator-Cylvl_SM.mjs} +2 -2
  393. package/package.json +35 -9
  394. package/dist/after-BfniwgIf.mjs +0 -9
  395. package/dist/api-tokens-CmT83Bgj.mjs +0 -3
  396. package/dist/db/libsql-http.d.mts +0 -27
  397. package/dist/db/libsql-http.mjs +0 -29
  398. package/dist/libsql-dialect-CANq6UNI.mjs +0 -47
  399. package/dist/oauth-user-lookup-B451pZmd.mjs +0 -25
  400. package/dist/revocation-CkTOhdlw.mjs +0 -42
  401. package/dist/schema-IjuRxkqq.mjs +0 -8
  402. package/dist/submission-C47cHBIg.mjs +0 -67
  403. package/dist/transaction-BGQgnwUi.mjs +0 -28
  404. package/dist/version-9orir5LL.mjs +0 -6
  405. /package/dist/{base64-F8-DUraK.mjs → base64-Cz-aU0X1.mjs} +0 -0
  406. /package/dist/{challenge-store-CYrg4F4t.mjs → challenge-store-D-_-VavY.mjs} +0 -0
  407. /package/dist/{components-DAq_4iPX.mjs → components-BWQUCJEr.mjs} +0 -0
  408. /package/dist/{config-CVssduLe.mjs → config-XW5tMrH8.mjs} +0 -0
  409. /package/dist/{content-index-names-Bbu1FY1r.mjs → content-index-names-CDc2IQIx.mjs} +0 -0
  410. /package/dist/{context-types-CPWAJRs5.mjs → context-types-DqTo6C79.mjs} +0 -0
  411. /package/dist/{default-BeIzUa1e.mjs → default-D9zxuUU7.mjs} +0 -0
  412. /package/dist/{email-console-Bfi_exVg.mjs → email-console-BONByQiC.mjs} +0 -0
  413. /package/dist/{error-DLg1H2LT.mjs → error-Dd8LtpG5.mjs} +0 -0
  414. /package/dist/{escape-C6lkys0j.mjs → escape-BWC4s5bV.mjs} +0 -0
  415. /package/dist/{experimental-workflows-B9x8delL.mjs → experimental-workflows-M5D3RTFo.mjs} +0 -0
  416. /package/dist/{hash-jhbF98tT.mjs → hash-lNx3KJis.mjs} +0 -0
  417. /package/dist/{media-url-CL3NzgLh.mjs → media-url-B4YtTY6c.mjs} +0 -0
  418. /package/dist/{mime-CDTtL7jE.mjs → mime-D_ae-u_U.mjs} +0 -0
  419. /package/dist/{mode-D554vAgH.mjs → mode-CPf_KZ37.mjs} +0 -0
  420. /package/dist/{normalize-Ev3FiBMx.mjs → normalize-5rct_U0I.mjs} +0 -0
  421. /package/dist/{oauth-state-store-Do1a_o3H.mjs → oauth-state-store-CMgcimzA.mjs} +0 -0
  422. /package/dist/{options-1dBRkoCl.mjs → options-BcqHWpc-.mjs} +0 -0
  423. /package/dist/{output-8j9oltTf.mjs → output-BYpiVUBf.mjs} +0 -0
  424. /package/dist/{parser-C9rzPuSZ.mjs → parser-BV0wzQHo.mjs} +0 -0
  425. /package/dist/{passkey-config-CRN44T04.mjs → passkey-config-BG4GO4OO.mjs} +0 -0
  426. /package/dist/{patterns-3XE9bU4r.mjs → patterns-CZ7D4y_R.mjs} +0 -0
  427. /package/dist/{placeholder-D03pGvqM.d.mts → placeholder-BHTaoCYx.d.mts} +0 -0
  428. /package/dist/{portable-text-tIk9_uz_.mjs → portable-text-B9YuySom.mjs} +0 -0
  429. /package/dist/{portable-text-BdRm4uZq.d.mts → portable-text-FKf3IrPz.d.mts} +0 -0
  430. /package/dist/{process-cache-B-L-A9zg.mjs → process-cache-MHM4Sqzs.mjs} +0 -0
  431. /package/dist/{provider-loader-C4i82ll1.mjs → provider-loader-3MY1SjzA.mjs} +0 -0
  432. /package/dist/{public-discovery-CyDzK1-S.mjs → public-discovery-BAbOvKiR.mjs} +0 -0
  433. /package/dist/{public-url-oudwI7K0.mjs → public-url-C7pbmS_7.mjs} +0 -0
  434. /package/dist/{public-url-BVIjzMo3.mjs → public-url-D5Wjq0sy.mjs} +0 -0
  435. /package/dist/{redirect-Dp5u-8dH.mjs → redirect-Bx96u2nS.mjs} +0 -0
  436. /package/dist/{request-cache-BruBnFAR.mjs → request-cache-DPmV5nk4.mjs} +0 -0
  437. /package/dist/{seo-contributions-BAtRDXEQ.mjs → seo-contributions-Dt57p6Sq.mjs} +0 -0
  438. /package/dist/{service-DeX1PRNt.mjs → service-wYQ_ePZ4.mjs} +0 -0
  439. /package/dist/{setup-nonce-D-CEYlw7.mjs → setup-nonce-CAqDUxxU.mjs} +0 -0
  440. /package/dist/{sidecar-client-Bw2C0XTf.mjs → sidecar-client-CnpGTvYq.mjs} +0 -0
  441. /package/dist/{slugify-KSsVD_D3.mjs → slugify-Di8Q_MFq.mjs} +0 -0
  442. /package/dist/{ssrf-C7tTSD1r.mjs → ssrf-LN16WMip.mjs} +0 -0
  443. /package/dist/{stable-hash-DF7R5eN8.mjs → stable-hash-DEtJgcp7.mjs} +0 -0
  444. /package/dist/{status-Bba6RbkS.mjs → status-Bwkeuz8g.mjs} +0 -0
  445. /package/dist/{transport-BddGhTAI.mjs → transport-472KVGBe.mjs} +0 -0
  446. /package/dist/{transport-ktLL9r2O.d.mts → transport-C0jj-Nc8.d.mts} +0 -0
  447. /package/dist/{types-BQZFeZjd.mjs → types-BDq9t5lG.mjs} +0 -0
  448. /package/dist/{types-CKIt_jmM.d.mts → types-Bs-7Geuh.d.mts} +0 -0
  449. /package/dist/{types-CLMOusxP.d.mts → types-CwkJp6zr.d.mts} +0 -0
  450. /package/dist/{types-C0DPvhR5.mjs → types-CyBH89BS.mjs} +0 -0
  451. /package/dist/{types-BbkkkAb6.mjs → types-D17dJRht.mjs} +0 -0
  452. /package/dist/{types--3oJQ0hs.d.mts → types-DTjrkhKU.d.mts} +0 -0
  453. /package/dist/{types-CPaVj_GC.d.mts → types-DkXuBo8k.d.mts} +0 -0
  454. /package/dist/{types-CU3Wn2HC.d.mts → types-b2sq7ZDk.d.mts} +0 -0
  455. /package/dist/{url-C_pLSrGZ.mjs → url-D375-6LM.mjs} +0 -0
  456. /package/dist/{url-Dumsft7G.mjs → url-bv5i4JN0.mjs} +0 -0
  457. /package/dist/{validate-VPnKoIzW.mjs → validate-Co3j6T_K.mjs} +0 -0
@@ -1,14 +1,14 @@
1
- import { a as __exportAll } from "./runner-DJiRFyLI.mjs";
2
- import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
3
- import { i as currentTimestamp, l as listTablesLike, n as columnExists, u as tableExists } from "./dialect-helpers-fk43GbDb.mjs";
4
- import { n as contentLocaleUpdatedIndexName, t as contentLocaleCreatedIndexName } from "./content-index-names-Bbu1FY1r.mjs";
5
- import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-CnuL55JE.mjs";
6
- import { t as buildStableHash } from "./stable-hash-DF7R5eN8.mjs";
7
- import { t as withTransaction } from "./transaction-BGQgnwUi.mjs";
8
- import { a as RESERVED_COLLECTION_SLUGS, o as RESERVED_FIELD_SLUGS, r as FIELD_TYPE_TO_COLUMN } from "./types-C0DPvhR5.mjs";
9
- import { a as markContentMediaUsageCollectionStaleSafely, n as deleteContentMediaUsageCollection } from "./content-refresh-QvBIyb_g.mjs";
10
- import { t as FTSManager } from "./fts-manager-DX7ZkrCa.mjs";
11
- import { t as parsePublicDiscoveryRules } from "./public-discovery-CyDzK1-S.mjs";
1
+ import { c as __exportAll } from "./runner-CVeq0266.mjs";
2
+ import { atomicBatch, rowUnchanged } from "./database/batch.mjs";
3
+ import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
4
+ import { i as currentTimestamp, l as listTablesLike, n as columnExists, s as isSqlite, u as tableExists } from "./dialect-helpers-C6xtO-Ui.mjs";
5
+ import { n as contentLocaleUpdatedIndexName, t as contentLocaleCreatedIndexName } from "./content-index-names-CDc2IQIx.mjs";
6
+ import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-BnG3LPMN.mjs";
7
+ import { t as buildStableHash } from "./stable-hash-DEtJgcp7.mjs";
8
+ import { a as RESERVED_COLLECTION_SLUGS, o as RESERVED_FIELD_SLUGS, r as FIELD_TYPE_TO_COLUMN } from "./types-CyBH89BS.mjs";
9
+ import { a as markContentMediaUsageCollectionStaleSafely, n as deleteContentMediaUsageCollection } from "./content-refresh-l4mPoGeX.mjs";
10
+ import { r as parseSearchConfig, t as FTSManager } from "./fts-manager-BeWtB7ZD.mjs";
11
+ import { t as parsePublicDiscoveryRules } from "./public-discovery-BAbOvKiR.mjs";
12
12
  import { sql } from "kysely";
13
13
  import { ulid } from "ulidx";
14
14
 
@@ -113,8 +113,14 @@ var SchemaRegistry = class {
113
113
  * Get a collection by slug
114
114
  */
115
115
  async getCollection(slug) {
116
+ return (await this.collectionSnapshot(slug))?.value ?? null;
117
+ }
118
+ async collectionSnapshot(slug) {
116
119
  const row = await this.db.selectFrom("_dineway_collections").where("slug", "=", slug).selectAll().executeTakeFirst();
117
- return row ? this.mapCollectionRow(row) : null;
120
+ return row ? {
121
+ row,
122
+ value: this.mapCollectionRow(row)
123
+ } : null;
118
124
  }
119
125
  /**
120
126
  * Get a collection with all its fields
@@ -147,24 +153,21 @@ var SchemaRegistry = class {
147
153
  const publicDiscovery = input.publicDiscovery == null ? void 0 : parsePublicDiscoveryRules(input.publicDiscovery);
148
154
  const id = ulid();
149
155
  const hasSeo = input.hasSeo ?? input.supports?.includes("seo") ?? false;
150
- await withTransaction(this.db, async (trx) => {
151
- await trx.insertInto("_dineway_collections").values({
152
- id,
153
- slug: input.slug,
154
- label: input.label,
155
- label_singular: input.labelSingular ?? null,
156
- description: input.description ?? null,
157
- icon: input.icon ?? null,
158
- supports: input.supports ? JSON.stringify(input.supports) : null,
159
- source: input.source ?? "manual",
160
- has_seo: hasSeo ? 1 : 0,
161
- comments_enabled: input.commentsEnabled ? 1 : 0,
162
- url_pattern: input.urlPattern ?? null,
163
- url_field: input.urlField || null,
164
- public_discovery: publicDiscovery ? JSON.stringify(publicDiscovery) : null
165
- }).execute();
166
- await this.createContentTable(input.slug, trx);
167
- });
156
+ await atomicBatch(this.db, { statements: [this.db.insertInto("_dineway_collections").values({
157
+ id,
158
+ slug: input.slug,
159
+ label: input.label,
160
+ label_singular: input.labelSingular ?? null,
161
+ description: input.description ?? null,
162
+ icon: input.icon ?? null,
163
+ supports: input.supports ? JSON.stringify(input.supports) : null,
164
+ source: input.source ?? "manual",
165
+ has_seo: hasSeo ? 1 : 0,
166
+ comments_enabled: input.commentsEnabled ? 1 : 0,
167
+ url_pattern: input.urlPattern ?? null,
168
+ url_field: input.urlField || null,
169
+ public_discovery: publicDiscovery ? JSON.stringify(publicDiscovery) : null
170
+ }).compile(), ...this.contentTableStatements(input.slug)] });
168
171
  const collection = await this.getCollection(input.slug);
169
172
  if (!collection) throw new SchemaError("Failed to create collection", "CREATE_FAILED");
170
173
  return collection;
@@ -173,8 +176,9 @@ var SchemaRegistry = class {
173
176
  * Update a collection
174
177
  */
175
178
  async updateCollection(slug, input) {
176
- const existing = await this.getCollection(slug);
177
- if (!existing) throw new SchemaError(`Collection "${slug}" not found`, "COLLECTION_NOT_FOUND");
179
+ const snapshot = await this.collectionSnapshot(slug);
180
+ if (!snapshot) throw new SchemaError(`Collection "${slug}" not found`, "COLLECTION_NOT_FOUND");
181
+ const existing = snapshot.value;
178
182
  const labelChanged = input.label !== void 0 && input.label !== existing.label;
179
183
  const labelSingularChanged = input.labelSingular !== void 0 && input.labelSingular !== (existing.labelSingular ?? void 0);
180
184
  if (labelChanged || labelSingularChanged) await this.checkLabelUniqueness(labelChanged ? input.label : void 0, labelSingularChanged ? input.labelSingular : void 0, slug);
@@ -188,8 +192,10 @@ var SchemaRegistry = class {
188
192
  const publicDiscovery = input.publicDiscovery === void 0 ? existing.publicDiscovery : input.publicDiscovery === null ? void 0 : parsePublicDiscoveryRules(input.publicDiscovery);
189
193
  const supportsArray = input.supports ?? existing.supports;
190
194
  const hasSeo = input.hasSeo !== void 0 ? input.hasSeo : input.supports !== void 0 ? supportsArray.includes("seo") : existing.hasSeo;
191
- return withTransaction(this.db, async (trx) => {
192
- await trx.updateTable("_dineway_collections").set({
195
+ const search = input.supports !== void 0 && input.supports.includes("search") !== existing.supports.includes("search") ? await this.searchStatePlan(slug, { supports: input.supports }) : { statements: [] };
196
+ await atomicBatch(this.db, {
197
+ checks: [rowUnchanged("_dineway_collections", snapshot.row), ...search.checks ?? []],
198
+ statements: [this.db.updateTable("_dineway_collections").set({
193
199
  label: input.label ?? existing.label,
194
200
  label_singular: input.labelSingular ?? existing.labelSingular ?? null,
195
201
  description: input.description ?? existing.description ?? null,
@@ -204,14 +210,11 @@ var SchemaRegistry = class {
204
210
  comments_closed_after_days: input.commentsClosedAfterDays !== void 0 ? input.commentsClosedAfterDays : existing.commentsClosedAfterDays,
205
211
  comments_auto_approve_users: input.commentsAutoApproveUsers !== void 0 ? input.commentsAutoApproveUsers ? 1 : 0 : existing.commentsAutoApproveUsers ? 1 : 0,
206
212
  updated_at: now
207
- }).where("slug", "=", slug).execute();
208
- const row = await trx.selectFrom("_dineway_collections").where("slug", "=", slug).selectAll().executeTakeFirst();
209
- if (!row) throw new SchemaError("Failed to update collection", "UPDATE_FAILED");
210
- if (input.supports !== void 0) {
211
- if (existing.supports.includes("search") !== parseSupports(row.supports).includes("search")) await this.syncSearchState(slug, trx);
212
- }
213
- return this.mapCollectionRow(row);
213
+ }).where("slug", "=", slug).compile(), ...search.statements]
214
214
  });
215
+ const updated = await this.getCollection(slug);
216
+ if (!updated) throw new SchemaError("Failed to update collection", "UPDATE_FAILED");
217
+ return updated;
215
218
  }
216
219
  async validateUrlPattern(urlPattern) {
217
220
  if (!urlPattern) return;
@@ -246,24 +249,20 @@ var SchemaRegistry = class {
246
249
  * Delete a collection
247
250
  */
248
251
  async deleteCollection(slug, options) {
249
- const existing = await this.getCollection(slug);
250
- if (!existing) throw new SchemaError(`Collection "${slug}" not found`, "COLLECTION_NOT_FOUND");
252
+ const snapshot = await this.collectionSnapshot(slug);
253
+ if (!snapshot) throw new SchemaError(`Collection "${slug}" not found`, "COLLECTION_NOT_FOUND");
251
254
  if (!options?.force) {
252
255
  if (await this.collectionHasContent(slug)) throw new SchemaError(`Collection "${slug}" has content. Use force: true to delete.`, "COLLECTION_HAS_CONTENT");
253
256
  }
254
- let contentTableDropped = false;
255
- try {
256
- await withTransaction(this.db, async (trx) => {
257
- await new FTSManager(trx).dropFtsTable(slug);
258
- await this.dropContentTable(slug, trx);
259
- contentTableDropped = true;
260
- await trx.deleteFrom("_dineway_collections").where("id", "=", existing.id).execute();
261
- });
262
- await deleteContentMediaUsageCollection(this.db, slug);
263
- } catch (error) {
264
- if (contentTableDropped && !await tableExists(this.db, this.getTableName(slug))) await deleteContentMediaUsageCollection(this.db, slug);
265
- throw error;
266
- }
257
+ await atomicBatch(this.db, {
258
+ checks: [rowUnchanged("_dineway_collections", snapshot.row), ...options?.force ? [] : [sql`NOT EXISTS (SELECT 1 FROM ${sql.ref(this.getTableName(slug))} WHERE deleted_at IS NULL)`]],
259
+ statements: [
260
+ ...new FTSManager(this.db).dropStatements(slug),
261
+ sql`DROP TABLE IF EXISTS ${sql.ref(this.getTableName(slug))}`.compile(this.db),
262
+ this.db.deleteFrom("_dineway_collections").where("id", "=", snapshot.value.id).compile()
263
+ ]
264
+ });
265
+ await deleteContentMediaUsageCollection(this.db, slug);
267
266
  }
268
267
  /**
269
268
  * List fields for a collection
@@ -275,10 +274,16 @@ var SchemaRegistry = class {
275
274
  * Get a field by slug within a collection
276
275
  */
277
276
  async getField(collectionSlug, fieldSlug) {
277
+ return (await this.fieldSnapshot(collectionSlug, fieldSlug))?.value ?? null;
278
+ }
279
+ async fieldSnapshot(collectionSlug, fieldSlug) {
278
280
  const collection = await this.getCollection(collectionSlug);
279
281
  if (!collection) return null;
280
282
  const row = await this.db.selectFrom("_dineway_fields").where("collection_id", "=", collection.id).where("slug", "=", fieldSlug).selectAll().executeTakeFirst();
281
- return row ? this.mapFieldRow(row) : null;
283
+ return row ? {
284
+ row,
285
+ value: this.mapFieldRow(row)
286
+ } : null;
282
287
  }
283
288
  /**
284
289
  * Create a new field
@@ -293,10 +298,11 @@ var SchemaRegistry = class {
293
298
  const columnType = FIELD_TYPE_TO_COLUMN[input.type];
294
299
  const maxSort = await this.db.selectFrom("_dineway_fields").where("collection_id", "=", collection.id).select((eb) => eb.fn.max("sort_order").as("max")).executeTakeFirst();
295
300
  const sortOrder = input.sortOrder ?? (maxSort?.max ?? -1) + 1;
296
- let schemaMutated = false;
297
- try {
298
- const created = await withTransaction(this.db, async (trx) => {
299
- await trx.insertInto("_dineway_fields").values({
301
+ const search = input.searchable ? await this.searchStatePlan(collectionSlug, { add: input.slug }) : { statements: [] };
302
+ await atomicBatch(this.db, {
303
+ checks: search.checks,
304
+ statements: [
305
+ this.db.insertInto("_dineway_fields").values({
300
306
  id,
301
307
  collection_id: collection.id,
302
308
  slug: input.slug,
@@ -312,24 +318,18 @@ var SchemaRegistry = class {
312
318
  sort_order: sortOrder,
313
319
  searchable: input.searchable ? 1 : 0,
314
320
  translatable: input.translatable === false ? 0 : 1
315
- }).execute();
316
- schemaMutated = true;
317
- await this.addColumn(collectionSlug, input.slug, input.type, {
321
+ }).compile(),
322
+ this.columnStatement(collectionSlug, input.slug, input.type, {
318
323
  required: input.required,
319
324
  defaultValue: input.defaultValue
320
- }, trx);
321
- const fieldRow = await trx.selectFrom("_dineway_fields").where("collection_id", "=", collection.id).where("slug", "=", input.slug).selectAll().executeTakeFirst();
322
- if (!fieldRow) throw new SchemaError("Failed to create field", "CREATE_FAILED");
323
- const field = this.mapFieldRow(fieldRow);
324
- if (input.searchable) await this.syncSearchState(collectionSlug, trx);
325
- return field;
326
- });
327
- await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
328
- return created;
329
- } catch (error) {
330
- if (schemaMutated) await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
331
- throw error;
332
- }
325
+ }),
326
+ ...search.statements
327
+ ]
328
+ });
329
+ const created = await this.getField(collectionSlug, input.slug);
330
+ if (!created) throw new SchemaError("Failed to create field", "CREATE_FAILED");
331
+ await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
332
+ return created;
333
333
  }
334
334
  /**
335
335
  * Ensure the content table for an existing collection exists.
@@ -341,7 +341,7 @@ var SchemaRegistry = class {
341
341
  if (!await this.getCollection(collectionSlug)) throw new SchemaError(`Collection "${collectionSlug}" not found`, "COLLECTION_NOT_FOUND");
342
342
  const tableName = this.getTableName(collectionSlug);
343
343
  if (await tableExists(this.db, tableName)) return false;
344
- await this.createContentTable(collectionSlug);
344
+ await atomicBatch(this.db, { statements: this.contentTableStatements(collectionSlug) });
345
345
  return true;
346
346
  }
347
347
  /**
@@ -367,8 +367,9 @@ var SchemaRegistry = class {
367
367
  * Update a field
368
368
  */
369
369
  async updateField(collectionSlug, fieldSlug, input) {
370
- const field = await this.getField(collectionSlug, fieldSlug);
371
- if (!field) throw new SchemaError(`Field "${fieldSlug}" not found in collection "${collectionSlug}"`, "FIELD_NOT_FOUND");
370
+ const snapshot = await this.fieldSnapshot(collectionSlug, fieldSlug);
371
+ if (!snapshot) throw new SchemaError(`Field "${fieldSlug}" not found in collection "${collectionSlug}"`, "FIELD_NOT_FOUND");
372
+ const field = snapshot.value;
372
373
  let nextType = field.type;
373
374
  let nextColumnType = field.columnType;
374
375
  if (input.type !== void 0 && input.type !== field.type) {
@@ -377,36 +378,28 @@ var SchemaRegistry = class {
377
378
  nextType = input.type;
378
379
  }
379
380
  const nextValidation = input.validation === void 0 ? field.validation : input.validation;
380
- let schemaMutated = false;
381
- try {
382
- const updatedField = await withTransaction(this.db, async (trx) => {
383
- await trx.updateTable("_dineway_fields").set({
384
- label: input.label ?? field.label,
385
- type: nextType,
386
- column_type: nextColumnType,
387
- required: input.required !== void 0 ? input.required ? 1 : 0 : field.required ? 1 : 0,
388
- unique: input.unique !== void 0 ? input.unique ? 1 : 0 : field.unique ? 1 : 0,
389
- searchable: input.searchable !== void 0 ? input.searchable ? 1 : 0 : field.searchable ? 1 : 0,
390
- translatable: input.translatable !== void 0 ? input.translatable ? 1 : 0 : field.translatable ? 1 : 0,
391
- default_value: input.defaultValue !== void 0 ? JSON.stringify(input.defaultValue) : field.defaultValue !== void 0 ? JSON.stringify(field.defaultValue) : null,
392
- validation: nextValidation ? JSON.stringify(nextValidation) : null,
393
- widget: input.widget ?? field.widget ?? null,
394
- options: input.options ? JSON.stringify(input.options) : field.options ? JSON.stringify(field.options) : null,
395
- sort_order: input.sortOrder ?? field.sortOrder
396
- }).where("id", "=", field.id).execute();
397
- schemaMutated = true;
398
- const updatedRow = await trx.selectFrom("_dineway_fields").where("collection_id", "=", field.collectionId).where("slug", "=", fieldSlug).selectAll().executeTakeFirst();
399
- if (!updatedRow) throw new SchemaError("Failed to update field", "UPDATE_FAILED");
400
- const updated = this.mapFieldRow(updatedRow);
401
- if (input.searchable !== void 0 && input.searchable !== field.searchable) await this.syncSearchState(collectionSlug, trx);
402
- return updated;
403
- });
404
- await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
405
- return updatedField;
406
- } catch (error) {
407
- if (schemaMutated) await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
408
- throw error;
409
- }
381
+ const search = input.searchable !== void 0 && input.searchable !== field.searchable ? await this.searchStatePlan(collectionSlug, input.searchable ? { add: fieldSlug } : { remove: fieldSlug }) : { statements: [] };
382
+ await atomicBatch(this.db, {
383
+ checks: [rowUnchanged("_dineway_fields", snapshot.row), ...search.checks ?? []],
384
+ statements: [this.db.updateTable("_dineway_fields").set({
385
+ label: input.label ?? field.label,
386
+ type: nextType,
387
+ column_type: nextColumnType,
388
+ required: input.required !== void 0 ? input.required ? 1 : 0 : field.required ? 1 : 0,
389
+ unique: input.unique !== void 0 ? input.unique ? 1 : 0 : field.unique ? 1 : 0,
390
+ searchable: input.searchable !== void 0 ? input.searchable ? 1 : 0 : field.searchable ? 1 : 0,
391
+ translatable: input.translatable !== void 0 ? input.translatable ? 1 : 0 : field.translatable ? 1 : 0,
392
+ default_value: input.defaultValue !== void 0 ? JSON.stringify(input.defaultValue) : field.defaultValue !== void 0 ? JSON.stringify(field.defaultValue) : null,
393
+ validation: nextValidation ? JSON.stringify(nextValidation) : null,
394
+ widget: input.widget ?? field.widget ?? null,
395
+ options: input.options ? JSON.stringify(input.options) : field.options ? JSON.stringify(field.options) : null,
396
+ sort_order: input.sortOrder ?? field.sortOrder
397
+ }).where("id", "=", field.id).compile(), ...search.statements]
398
+ });
399
+ const updated = await this.getField(collectionSlug, fieldSlug);
400
+ if (!updated) throw new SchemaError("Failed to update field", "UPDATE_FAILED");
401
+ await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
402
+ return updated;
410
403
  }
411
404
  /**
412
405
  * Synchronize an existing FTS index with the collection's current state.
@@ -414,37 +407,48 @@ var SchemaRegistry = class {
414
407
  * Schema writes must not first-time enable FTS. Initial enablement stays in
415
408
  * explicit seed/import/admin flows where FTS failures can be handled deliberately.
416
409
  */
417
- async syncSearchState(collectionSlug, db) {
418
- const conn = db ?? this.db;
419
- const ftsManager = new FTSManager(conn);
420
- const row = await conn.selectFrom("_dineway_collections").where("slug", "=", collectionSlug).select("supports").executeTakeFirst();
421
- if (!row) return;
422
- const wantsSearch = parseSupports(row.supports).includes("search");
423
- const searchableFields = await ftsManager.getSearchableFields(collectionSlug);
424
- const config = await ftsManager.getSearchConfig(collectionSlug);
425
- const ftsActive = config?.enabled === true;
426
- if (wantsSearch && searchableFields.length > 0 && ftsActive) await ftsManager.rebuildIndex(collectionSlug, searchableFields, config?.weights);
427
- else if (ftsActive && (!wantsSearch || searchableFields.length === 0)) await ftsManager.disableSearch(collectionSlug);
410
+ async searchStatePlan(collectionSlug, change = {}, db = this.db) {
411
+ if (!isSqlite(db)) return { statements: [] };
412
+ const collection = await db.selectFrom("_dineway_collections").selectAll().where("slug", "=", collectionSlug).executeTakeFirst();
413
+ if (!collection) return { statements: [] };
414
+ const fields = await db.selectFrom("_dineway_fields").selectAll().where("collection_id", "=", collection.id).execute();
415
+ const checks = [
416
+ rowUnchanged("_dineway_collections", collection),
417
+ sql`(SELECT count(*) FROM _dineway_fields WHERE collection_id = ${collection.id}) = ${fields.length}`,
418
+ ...fields.map((field) => rowUnchanged("_dineway_fields", field))
419
+ ];
420
+ const searchable = new Set(fields.filter((field) => field.searchable === 1).map((field) => field.slug));
421
+ if (change.add) searchable.add(change.add);
422
+ if (change.remove) searchable.delete(change.remove);
423
+ const names = [...searchable];
424
+ const config = parseSearchConfig(collection.search_config);
425
+ const wantsSearch = (change.supports ?? parseSupports(collection.supports)).includes("search");
426
+ const fts = new FTSManager(db);
427
+ return {
428
+ checks,
429
+ statements: !config?.enabled ? [] : wantsSearch && names.length ? fts.rebuildStatements(collectionSlug, names, config.weights) : [...fts.dropStatements(collectionSlug), fts.configStatement(collectionSlug, {
430
+ enabled: false,
431
+ weights: config.weights
432
+ })]
433
+ };
428
434
  }
429
435
  /**
430
436
  * Delete a field
431
437
  */
432
438
  async deleteField(collectionSlug, fieldSlug) {
433
- const field = await this.getField(collectionSlug, fieldSlug);
434
- if (!field) throw new SchemaError(`Field "${fieldSlug}" not found in collection "${collectionSlug}"`, "FIELD_NOT_FOUND");
435
- let schemaMutated = false;
436
- try {
437
- await withTransaction(this.db, async (trx) => {
438
- await trx.deleteFrom("_dineway_fields").where("id", "=", field.id).execute();
439
- schemaMutated = true;
440
- if (field.searchable) await this.syncSearchState(collectionSlug, trx);
441
- await this.dropColumn(collectionSlug, fieldSlug, trx);
442
- });
443
- await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
444
- } catch (error) {
445
- if (schemaMutated) await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
446
- throw error;
447
- }
439
+ const snapshot = await this.fieldSnapshot(collectionSlug, fieldSlug);
440
+ if (!snapshot) throw new SchemaError(`Field "${fieldSlug}" not found in collection "${collectionSlug}"`, "FIELD_NOT_FOUND");
441
+ const field = snapshot.value;
442
+ const search = field.searchable ? await this.searchStatePlan(collectionSlug, { remove: fieldSlug }) : { statements: [] };
443
+ await atomicBatch(this.db, {
444
+ checks: [rowUnchanged("_dineway_fields", snapshot.row), ...search.checks ?? []],
445
+ statements: [
446
+ this.db.deleteFrom("_dineway_fields").where("id", "=", field.id).compile(),
447
+ ...search.statements,
448
+ sql`ALTER TABLE ${sql.ref(this.getTableName(collectionSlug))} DROP COLUMN ${sql.ref(this.getColumnName(fieldSlug))}`.compile(this.db)
449
+ ]
450
+ });
451
+ await markContentMediaUsageCollectionStaleSafely(this.db, collectionSlug, "CONTENT_USAGE_STALE");
448
452
  }
449
453
  /**
450
454
  * Reorder fields
@@ -457,112 +461,105 @@ var SchemaRegistry = class {
457
461
  /**
458
462
  * Create a content table for a collection
459
463
  */
460
- async createContentTable(slug, db) {
461
- const conn = db ?? this.db;
464
+ contentTableStatements(slug) {
465
+ const conn = this.db;
466
+ const statements = [];
462
467
  const tableName = this.getTableName(slug);
463
- await conn.schema.createTable(tableName).addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text").addColumn("status", "text", (col) => col.defaultTo("draft")).addColumn("author_id", "text").addColumn("primary_byline_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(conn))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(conn))).addColumn("published_at", "text").addColumn("scheduled_at", "text").addColumn("deleted_at", "text").addColumn("version", "integer", (col) => col.defaultTo(1)).addColumn("live_revision_id", "text", (col) => col.references("revisions.id")).addColumn("draft_revision_id", "text", (col) => col.references("revisions.id")).addColumn("locale", "text", (col) => col.notNull().defaultTo("en")).addColumn("translation_group", "text").addUniqueConstraint(`${tableName}_slug_locale_unique`, ["slug", "locale"]).execute();
464
- await sql`
468
+ statements.push(conn.schema.createTable(tableName).addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text").addColumn("status", "text", (col) => col.defaultTo("draft")).addColumn("author_id", "text").addColumn("primary_byline_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(conn))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(conn))).addColumn("published_at", "text").addColumn("scheduled_at", "text").addColumn("deleted_at", "text").addColumn("version", "integer", (col) => col.defaultTo(1)).addColumn("live_revision_id", "text", (col) => col.references("revisions.id")).addColumn("draft_revision_id", "text", (col) => col.references("revisions.id")).addColumn("locale", "text", (col) => col.notNull().defaultTo("en")).addColumn("translation_group", "text").addUniqueConstraint(`${tableName}_slug_locale_unique`, ["slug", "locale"]).compile());
469
+ statements.push(sql`
465
470
  CREATE INDEX ${sql.ref(`idx_${tableName}_slug`)}
466
471
  ON ${sql.ref(tableName)} (slug)
467
- `.execute(conn);
468
- await sql`
472
+ `.compile(conn));
473
+ statements.push(sql`
469
474
  CREATE INDEX ${sql.ref(`idx_${tableName}_scheduled`)}
470
475
  ON ${sql.ref(tableName)} (scheduled_at)
471
476
  WHERE scheduled_at IS NOT NULL
472
- `.execute(conn);
473
- await sql`
477
+ `.compile(conn));
478
+ statements.push(sql`
474
479
  CREATE INDEX ${sql.ref(`idx_${tableName}_live_revision`)}
475
480
  ON ${sql.ref(tableName)} (live_revision_id)
476
- `.execute(conn);
477
- await sql`
481
+ `.compile(conn));
482
+ statements.push(sql`
478
483
  CREATE INDEX ${sql.ref(`idx_${tableName}_draft_revision`)}
479
484
  ON ${sql.ref(tableName)} (draft_revision_id)
480
- `.execute(conn);
481
- await sql`
485
+ `.compile(conn));
486
+ statements.push(sql`
482
487
  CREATE INDEX ${sql.ref(`idx_${tableName}_author`)}
483
488
  ON ${sql.ref(tableName)} (author_id)
484
- `.execute(conn);
485
- await sql`
489
+ `.compile(conn));
490
+ statements.push(sql`
486
491
  CREATE INDEX ${sql.ref(`idx_${tableName}_primary_byline`)}
487
492
  ON ${sql.ref(tableName)} (primary_byline_id)
488
- `.execute(conn);
489
- await sql`
493
+ `.compile(conn));
494
+ statements.push(sql`
490
495
  CREATE INDEX ${sql.ref(`idx_${tableName}_locale`)}
491
496
  ON ${sql.ref(tableName)} (locale)
492
- `.execute(conn);
493
- await sql`
497
+ `.compile(conn));
498
+ statements.push(sql`
494
499
  CREATE INDEX ${sql.ref(`idx_${tableName}_translation_group`)}
495
500
  ON ${sql.ref(tableName)} (translation_group)
496
- `.execute(conn);
497
- await sql`CREATE INDEX ${sql.ref(`idx_${tableName}_public_id`)} ON ${sql.ref(tableName)} (deleted_at, status, id)`.execute(conn);
498
- await sql`
501
+ `.compile(conn));
502
+ statements.push(sql`CREATE INDEX ${sql.ref(`idx_${tableName}_public_id`)} ON ${sql.ref(tableName)} (deleted_at, status, id)`.compile(conn));
503
+ statements.push(sql`
499
504
  CREATE INDEX ${sql.ref(`idx_${tableName}_deleted_updated_id`)}
500
505
  ON ${sql.ref(tableName)} (deleted_at, updated_at DESC, id DESC)
501
- `.execute(conn);
502
- await sql`
506
+ `.compile(conn));
507
+ statements.push(sql`
503
508
  CREATE INDEX ${sql.ref(`idx_${tableName}_deleted_status`)}
504
509
  ON ${sql.ref(tableName)} (deleted_at, status)
505
- `.execute(conn);
506
- await sql`
510
+ `.compile(conn));
511
+ statements.push(sql`
507
512
  CREATE INDEX ${sql.ref(`idx_${tableName}_deleted_created_id`)}
508
513
  ON ${sql.ref(tableName)} (deleted_at, created_at DESC, id DESC)
509
- `.execute(conn);
510
- await sql`
514
+ `.compile(conn));
515
+ statements.push(sql`
511
516
  CREATE INDEX ${sql.ref(`idx_${tableName}_deleted_published_id`)}
512
517
  ON ${sql.ref(tableName)} (deleted_at, published_at DESC, id DESC)
513
- `.execute(conn);
514
- await sql`
518
+ `.compile(conn));
519
+ statements.push(sql`
515
520
  CREATE INDEX ${sql.ref(contentLocaleUpdatedIndexName(tableName))}
516
521
  ON ${sql.ref(tableName)} (deleted_at, locale, updated_at DESC, id DESC)
517
- `.execute(conn);
518
- await sql`
522
+ `.compile(conn));
523
+ statements.push(sql`
519
524
  CREATE INDEX ${sql.ref(contentLocaleCreatedIndexName(tableName))}
520
525
  ON ${sql.ref(tableName)} (deleted_at, locale, created_at DESC, id DESC)
521
- `.execute(conn);
526
+ `.compile(conn));
527
+ return statements;
522
528
  }
523
529
  /**
524
530
  * Drop a content table
525
531
  */
526
- async dropContentTable(slug, db) {
527
- const tableName = this.getTableName(slug);
528
- await sql`DROP TABLE IF EXISTS ${sql.ref(tableName)}`.execute(db ?? this.db);
529
- }
530
532
  /**
531
533
  * Add a column to a content table
532
534
  */
533
535
  async addColumn(collectionSlug, fieldSlug, fieldType, options, db) {
536
+ await (db ?? this.db).executeQuery(this.columnStatement(collectionSlug, fieldSlug, fieldType, options, db));
537
+ }
538
+ columnStatement(collectionSlug, fieldSlug, fieldType, options, db) {
534
539
  const conn = db ?? this.db;
535
540
  const tableName = this.getTableName(collectionSlug);
536
541
  const columnType = FIELD_TYPE_TO_COLUMN[fieldType];
537
542
  const columnName = this.getColumnName(fieldSlug);
538
543
  if (options?.required && options?.defaultValue !== void 0) {
539
544
  const defaultVal = this.formatDefaultValue(options.defaultValue, fieldType);
540
- await sql`
545
+ return sql`
541
546
  ALTER TABLE ${sql.ref(tableName)}
542
547
  ADD COLUMN ${sql.ref(columnName)} ${sql.raw(columnType)} NOT NULL DEFAULT ${sql.raw(defaultVal)}
543
- `.execute(conn);
548
+ `.compile(conn);
544
549
  } else if (options?.required) {
545
550
  const defaultVal = this.getEmptyDefault(fieldType);
546
- await sql`
551
+ return sql`
547
552
  ALTER TABLE ${sql.ref(tableName)}
548
553
  ADD COLUMN ${sql.ref(columnName)} ${sql.raw(columnType)} NOT NULL DEFAULT ${sql.raw(defaultVal)}
549
- `.execute(conn);
550
- } else await sql`
554
+ `.compile(conn);
555
+ } else return sql`
551
556
  ALTER TABLE ${sql.ref(tableName)}
552
557
  ADD COLUMN ${sql.ref(columnName)} ${sql.raw(columnType)}
553
- `.execute(conn);
558
+ `.compile(conn);
554
559
  }
555
560
  /**
556
561
  * Drop a column from a content table
557
562
  */
558
- async dropColumn(collectionSlug, fieldSlug, db) {
559
- const tableName = this.getTableName(collectionSlug);
560
- const columnName = this.getColumnName(fieldSlug);
561
- await sql`
562
- ALTER TABLE ${sql.ref(tableName)}
563
- DROP COLUMN ${sql.ref(columnName)}
564
- `.execute(db ?? this.db);
565
- }
566
563
  /**
567
564
  * Check if a collection has any content
568
565
  */