d1s 0.2.10 → 0.2.12

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 (329) hide show
  1. package/dist/.next/.next/BUILD_ID +1 -1
  2. package/dist/.next/.next/app-build-manifest.json +33 -33
  3. package/dist/.next/.next/app-path-routes-manifest.json +1 -1
  4. package/dist/.next/.next/build-manifest.json +3 -3
  5. package/dist/.next/.next/cache/.rscinfo +1 -1
  6. package/dist/.next/.next/cache/.tsbuildinfo +1 -1
  7. package/dist/.next/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/dist/.next/.next/cache/webpack/client-production/1.pack +0 -0
  9. package/dist/.next/.next/cache/webpack/client-production/10.pack +0 -0
  10. package/dist/.next/.next/cache/webpack/client-production/11.pack +0 -0
  11. package/dist/.next/.next/cache/webpack/client-production/12.pack +0 -0
  12. package/dist/.next/.next/cache/webpack/client-production/2.pack +0 -0
  13. package/dist/.next/.next/cache/webpack/client-production/3.pack +0 -0
  14. package/dist/.next/.next/cache/webpack/client-production/4.pack +0 -0
  15. package/dist/.next/.next/cache/webpack/client-production/5.pack +0 -0
  16. package/dist/.next/.next/cache/webpack/client-production/6.pack +0 -0
  17. package/dist/.next/.next/cache/webpack/client-production/7.pack +0 -0
  18. package/dist/.next/.next/cache/webpack/client-production/8.pack +0 -0
  19. package/dist/.next/.next/cache/webpack/client-production/9.pack +0 -0
  20. package/dist/.next/.next/cache/webpack/client-production/index.pack +0 -0
  21. package/dist/.next/.next/cache/webpack/client-production/index.pack.old +0 -0
  22. package/dist/.next/.next/cache/webpack/edge-server-production/index.pack +0 -0
  23. package/dist/.next/.next/cache/webpack/server-production/0.pack +0 -0
  24. package/dist/.next/.next/cache/webpack/server-production/1.pack +0 -0
  25. package/dist/.next/.next/cache/webpack/server-production/index.pack +0 -0
  26. package/dist/.next/.next/cache/webpack/server-production/index.pack.old +0 -0
  27. package/dist/.next/.next/next-minimal-server.js.nft.json +1 -1
  28. package/dist/.next/.next/next-server.js.nft.json +1 -1
  29. package/dist/.next/.next/prerender-manifest.json +1 -1
  30. package/dist/.next/.next/required-server-files.json +1 -1
  31. package/dist/.next/.next/server/app/_not-found/page.js +1 -1
  32. package/dist/.next/.next/server/app/_not-found/page.js.nft.json +1 -1
  33. package/dist/.next/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/dist/.next/.next/server/app/_not-found.html +1 -1
  35. package/dist/.next/.next/server/app/_not-found.rsc +4 -4
  36. package/dist/.next/.next/server/app/api/cloudflare/route.js +1 -1
  37. package/dist/.next/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
  38. package/dist/.next/.next/server/app/api/databases/route.js +1 -1
  39. package/dist/.next/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
  40. package/dist/.next/.next/server/app/api/migrations/sync/route.js +5 -5
  41. package/dist/.next/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
  42. package/dist/.next/.next/server/app/api/migrations/sync-files/route.js +3 -3
  43. package/dist/.next/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
  44. package/dist/.next/.next/server/app/api/pull-data/confirm/route.js +1 -1
  45. package/dist/.next/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
  46. package/dist/.next/.next/server/app/api/pull-remote/confirm/route.js +2 -2
  47. package/dist/.next/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
  48. package/dist/.next/.next/server/app/api/pull-remote/preview/route.js +4 -4
  49. package/dist/.next/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
  50. package/dist/.next/.next/server/app/api/push-remote/confirm/route.js +5 -5
  51. package/dist/.next/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
  52. package/dist/.next/.next/server/app/api/push-remote/preview/route.js +4 -4
  53. package/dist/.next/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
  54. package/dist/.next/.next/server/app/api/query/route.js +3 -3
  55. package/dist/.next/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
  56. package/dist/.next/.next/server/app/api/tables/[name]/route.js +5 -5
  57. package/dist/.next/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
  58. package/dist/.next/.next/server/app/api/tables/route.js +2 -2
  59. package/dist/.next/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
  60. package/dist/.next/.next/server/app/api/update/route.js +1 -1
  61. package/dist/.next/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  62. package/dist/.next/.next/server/app/index.html +3 -3
  63. package/dist/.next/.next/server/app/index.rsc +5 -5
  64. package/dist/.next/.next/server/app/page.js +11 -13
  65. package/dist/.next/.next/server/app/page.js.nft.json +1 -1
  66. package/dist/.next/.next/server/app/page_client-reference-manifest.js +1 -1
  67. package/dist/.next/.next/server/app-paths-manifest.json +3 -3
  68. package/dist/.next/.next/server/chunks/226.js +12 -12
  69. package/dist/.next/.next/server/chunks/391.js +5 -5
  70. package/dist/.next/.next/server/chunks/452.js +1 -1
  71. package/dist/.next/.next/server/chunks/572.js +1 -0
  72. package/dist/.next/.next/server/chunks/627.js +3 -3
  73. package/dist/.next/.next/server/chunks/638.js +3 -3
  74. package/dist/.next/.next/server/chunks/992.js +3 -3
  75. package/dist/.next/.next/server/middleware-build-manifest.js +1 -1
  76. package/dist/.next/.next/server/next-font-manifest.js +1 -1
  77. package/dist/.next/.next/server/next-font-manifest.json +1 -1
  78. package/dist/.next/.next/server/pages/404.html +1 -1
  79. package/dist/.next/.next/server/pages/500.html +1 -1
  80. package/dist/.next/.next/server/pages/_app.js +1 -1
  81. package/dist/.next/.next/server/pages/_document.js +1 -1
  82. package/dist/.next/.next/server/pages/_error.js +1 -1
  83. package/dist/.next/.next/server/server-reference-manifest.json +1 -1
  84. package/dist/.next/.next/static/chunks/576-18a2209e1ed26aad.js +1 -0
  85. package/dist/.next/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  86. package/dist/.next/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  87. package/dist/.next/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  88. package/dist/.next/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  89. package/dist/.next/.next/static/css/7c16f57d325d0d7d.css +3 -0
  90. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_buildManifest.js +1 -0
  91. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_ssgManifest.js +1 -0
  92. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_buildManifest.js +1 -0
  93. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_ssgManifest.js +1 -0
  94. package/dist/.next/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  95. package/dist/.next/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  96. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_buildManifest.js +1 -0
  97. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_ssgManifest.js +1 -0
  98. package/dist/.next/.next/trace +3 -3
  99. package/dist/.next/.next/types/app/api/cloudflare/route.ts +1 -1
  100. package/dist/.next/.next/types/app/api/databases/route.ts +1 -1
  101. package/dist/.next/.next/types/app/api/migrations/sync/route.ts +1 -1
  102. package/dist/.next/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  103. package/dist/.next/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  104. package/dist/.next/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  105. package/dist/.next/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  106. package/dist/.next/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  107. package/dist/.next/.next/types/app/api/push-remote/preview/route.ts +1 -1
  108. package/dist/.next/.next/types/app/api/query/route.ts +1 -1
  109. package/dist/.next/.next/types/app/api/tables/[name]/route.ts +1 -1
  110. package/dist/.next/.next/types/app/api/tables/route.ts +1 -1
  111. package/dist/.next/.next/types/app/api/update/route.ts +1 -1
  112. package/dist/.next/.next/types/app/page.ts +1 -1
  113. package/dist/.next/BUILD_ID +1 -1
  114. package/dist/.next/app-build-manifest.json +32 -32
  115. package/dist/.next/app-path-routes-manifest.json +1 -1
  116. package/dist/.next/build-manifest.json +3 -3
  117. package/dist/.next/cache/.rscinfo +1 -1
  118. package/dist/.next/cache/.tsbuildinfo +1 -1
  119. package/dist/.next/cache/webpack/client-production/0.pack +0 -0
  120. package/dist/.next/cache/webpack/client-production/1.pack +0 -0
  121. package/dist/.next/cache/webpack/client-production/2.pack +0 -0
  122. package/dist/.next/cache/webpack/client-production/index.pack +0 -0
  123. package/dist/.next/cache/webpack/client-production/index.pack.old +0 -0
  124. package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
  125. package/dist/.next/cache/webpack/server-production/0.pack +0 -0
  126. package/dist/.next/cache/webpack/server-production/index.pack +0 -0
  127. package/dist/.next/next-minimal-server.js.nft.json +1 -1
  128. package/dist/.next/next-server.js.nft.json +1 -1
  129. package/dist/.next/prerender-manifest.json +1 -1
  130. package/dist/.next/required-server-files.json +1 -1
  131. package/dist/.next/server/app/_not-found/page.js +1 -1
  132. package/dist/.next/server/app/_not-found/page.js.nft.json +1 -1
  133. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  134. package/dist/.next/server/app/_not-found.html +1 -1
  135. package/dist/.next/server/app/_not-found.rsc +4 -4
  136. package/dist/.next/server/app/api/cloudflare/route.js +1 -1
  137. package/dist/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
  138. package/dist/.next/server/app/api/databases/route.js +1 -1
  139. package/dist/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
  140. package/dist/.next/server/app/api/migrations/sync/route.js +5 -5
  141. package/dist/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
  142. package/dist/.next/server/app/api/migrations/sync-files/route.js +3 -3
  143. package/dist/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
  144. package/dist/.next/server/app/api/pull-data/confirm/route.js +1 -1
  145. package/dist/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
  146. package/dist/.next/server/app/api/pull-remote/confirm/route.js +2 -2
  147. package/dist/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
  148. package/dist/.next/server/app/api/pull-remote/preview/route.js +4 -4
  149. package/dist/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
  150. package/dist/.next/server/app/api/push-remote/confirm/route.js +5 -5
  151. package/dist/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
  152. package/dist/.next/server/app/api/push-remote/preview/route.js +4 -4
  153. package/dist/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
  154. package/dist/.next/server/app/api/query/route.js +3 -3
  155. package/dist/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
  156. package/dist/.next/server/app/api/tables/[name]/route.js +5 -5
  157. package/dist/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
  158. package/dist/.next/server/app/api/tables/route.js +2 -2
  159. package/dist/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
  160. package/dist/.next/server/app/api/update/route.js +1 -1
  161. package/dist/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  162. package/dist/.next/server/app/index.html +3 -3
  163. package/dist/.next/server/app/index.rsc +5 -5
  164. package/dist/.next/server/app/page.js +11 -13
  165. package/dist/.next/server/app/page.js.nft.json +1 -1
  166. package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
  167. package/dist/.next/server/app-paths-manifest.json +2 -2
  168. package/dist/.next/server/chunks/226.js +12 -12
  169. package/dist/.next/server/chunks/391.js +5 -5
  170. package/dist/.next/server/chunks/452.js +1 -1
  171. package/dist/.next/server/chunks/572.js +1 -0
  172. package/dist/.next/server/chunks/627.js +3 -3
  173. package/dist/.next/server/chunks/638.js +3 -3
  174. package/dist/.next/server/chunks/992.js +3 -3
  175. package/dist/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/.next/server/next-font-manifest.js +1 -1
  177. package/dist/.next/server/next-font-manifest.json +1 -1
  178. package/dist/.next/server/pages/404.html +1 -1
  179. package/dist/.next/server/pages/500.html +1 -1
  180. package/dist/.next/server/pages/_app.js +1 -1
  181. package/dist/.next/server/pages/_document.js +1 -1
  182. package/dist/.next/server/pages/_error.js +1 -1
  183. package/dist/.next/server/server-reference-manifest.json +1 -1
  184. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_buildManifest.js +1 -0
  185. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_ssgManifest.js +1 -0
  186. package/dist/.next/static/chunks/576-18a2209e1ed26aad.js +1 -0
  187. package/dist/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  188. package/dist/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  189. package/dist/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  190. package/dist/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  191. package/dist/.next/static/css/7c16f57d325d0d7d.css +3 -0
  192. package/dist/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  193. package/dist/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  194. package/dist/.next/trace +3 -16
  195. package/dist/.next/types/app/api/cloudflare/route.ts +1 -1
  196. package/dist/.next/types/app/api/databases/route.ts +1 -1
  197. package/dist/.next/types/app/api/migrations/sync/route.ts +1 -1
  198. package/dist/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  199. package/dist/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  200. package/dist/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  201. package/dist/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  202. package/dist/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  203. package/dist/.next/types/app/api/push-remote/preview/route.ts +1 -1
  204. package/dist/.next/types/app/api/query/route.ts +1 -1
  205. package/dist/.next/types/app/api/tables/[name]/route.ts +1 -1
  206. package/dist/.next/types/app/api/tables/route.ts +1 -1
  207. package/dist/.next/types/app/api/update/route.ts +1 -1
  208. package/dist/.next/types/app/page.ts +1 -1
  209. package/dist/app/api/tables/[name]/route.js +22 -10
  210. package/dist/app/globals.css +39 -0
  211. package/dist/app/page.jsx +13 -23
  212. package/dist/d1-studio.js +34 -4
  213. package/dist/lib/data-type-handlers.js +426 -0
  214. package/dist/lib/sql-operations.js +32 -8
  215. package/dist/lib/sql-sanitizer.js +233 -0
  216. package/package.json +3 -9
  217. package/dist/.next/.next/cache/webpack/server-production/2.pack +0 -0
  218. package/dist/.next/.next/server/chunks/90.js +0 -1
  219. package/dist/.next/.next/static/chunks/700-dc8f9f08b166c5e6.js +0 -1
  220. package/dist/.next/.next/static/chunks/app/page-16ec561fc8bebb5d.js +0 -1
  221. package/dist/.next/.next/static/css/0c512cea5f3d317a.css +0 -3
  222. package/dist/.next/server/chunks/90.js +0 -1
  223. package/dist/.next/static/chunks/700-dc8f9f08b166c5e6.js +0 -1
  224. package/dist/.next/static/chunks/app/page-16ec561fc8bebb5d.js +0 -1
  225. package/dist/.next/static/css/0c512cea5f3d317a.css +0 -3
  226. package/dist/app/app/api/cloudflare/route.js +0 -150
  227. package/dist/app/app/api/databases/route.js +0 -71
  228. package/dist/app/app/api/migrations/sync/route.js +0 -174
  229. package/dist/app/app/api/migrations/sync-files/route.js +0 -172
  230. package/dist/app/app/api/pull-data/confirm/route.js +0 -230
  231. package/dist/app/app/api/pull-remote/confirm/route.js +0 -278
  232. package/dist/app/app/api/pull-remote/preview/route.js +0 -144
  233. package/dist/app/app/api/push-remote/confirm/route.js +0 -196
  234. package/dist/app/app/api/push-remote/preview/route.js +0 -179
  235. package/dist/app/app/api/query/route.js +0 -168
  236. package/dist/app/app/api/tables/[name]/route.js +0 -174
  237. package/dist/app/app/api/tables/route.js +0 -178
  238. package/dist/app/app/api/update/route.js +0 -45
  239. package/dist/app/app/globals.css +0 -93
  240. package/dist/app/app/layout.jsx +0 -35
  241. package/dist/app/app/page.jsx +0 -44
  242. package/next.config.mjs +0 -18
  243. package/postcss.config.mjs +0 -8
  244. package/scripts/studio.js +0 -169
  245. package/scripts/test.js +0 -366
  246. package/src/app/api/cloudflare/route.js +0 -150
  247. package/src/app/api/databases/route.js +0 -71
  248. package/src/app/api/migrations/sync/route.js +0 -174
  249. package/src/app/api/migrations/sync-files/route.js +0 -172
  250. package/src/app/api/pull-data/confirm/route.js +0 -230
  251. package/src/app/api/pull-remote/confirm/route.js +0 -278
  252. package/src/app/api/pull-remote/preview/route.js +0 -144
  253. package/src/app/api/push-remote/confirm/route.js +0 -196
  254. package/src/app/api/push-remote/preview/route.js +0 -179
  255. package/src/app/api/query/route.js +0 -168
  256. package/src/app/api/tables/[name]/route.js +0 -174
  257. package/src/app/api/tables/route.js +0 -178
  258. package/src/app/api/update/route.js +0 -45
  259. package/src/app/globals.css +0 -93
  260. package/src/app/layout.jsx +0 -35
  261. package/src/app/page.jsx +0 -44
  262. package/src/components/cloudflare-credentials-modal.jsx +0 -94
  263. package/src/components/column-selector.jsx +0 -133
  264. package/src/components/column-sorting.jsx +0 -65
  265. package/src/components/delete-records-dialog.jsx +0 -64
  266. package/src/components/download-button.jsx +0 -205
  267. package/src/components/edit-error-alert.jsx +0 -30
  268. package/src/components/editable-cell.jsx +0 -163
  269. package/src/components/editable-row.jsx +0 -169
  270. package/src/components/environment-handler.jsx +0 -332
  271. package/src/components/environment-select.jsx +0 -62
  272. package/src/components/pull-preview-toast.jsx +0 -215
  273. package/src/components/push-error-alert.jsx +0 -72
  274. package/src/components/push-preview-toast.jsx +0 -183
  275. package/src/components/query-results.jsx +0 -112
  276. package/src/components/refresh-button.jsx +0 -61
  277. package/src/components/resize-columns.jsx +0 -101
  278. package/src/components/sidebar.jsx +0 -254
  279. package/src/components/sql-editor.jsx +0 -411
  280. package/src/components/sql-error-display.jsx +0 -167
  281. package/src/components/sync-migrations-button.jsx +0 -87
  282. package/src/components/table-error-dialog.jsx +0 -65
  283. package/src/components/table-toolbar.jsx +0 -285
  284. package/src/components/table-view.jsx +0 -843
  285. package/src/components/ui/alert.jsx +0 -47
  286. package/src/components/ui/button.jsx +0 -48
  287. package/src/components/ui/card.jsx +0 -50
  288. package/src/components/ui/checkbox.jsx +0 -24
  289. package/src/components/ui/collapsible.jsx +0 -11
  290. package/src/components/ui/dialog.jsx +0 -96
  291. package/src/components/ui/dropdown-menu.jsx +0 -158
  292. package/src/components/ui/input.jsx +0 -19
  293. package/src/components/ui/scroll-area.jsx +0 -40
  294. package/src/components/ui/select.jsx +0 -121
  295. package/src/components/ui/separator.jsx +0 -25
  296. package/src/components/ui/sheet.jsx +0 -109
  297. package/src/components/ui/sidebar.jsx +0 -620
  298. package/src/components/ui/skeleton.jsx +0 -14
  299. package/src/components/ui/table.jsx +0 -86
  300. package/src/components/ui/tabs.jsx +0 -43
  301. package/src/components/ui/toast.jsx +0 -86
  302. package/src/components/ui/toaster.jsx +0 -35
  303. package/src/components/ui/tooltip.jsx +0 -28
  304. package/src/components/update-banner.jsx +0 -93
  305. package/src/context/database-context.js +0 -510
  306. package/src/hooks/use-mobile.jsx +0 -19
  307. package/src/hooks/use-sql-error.ts +0 -23
  308. package/src/hooks/use-toast.js +0 -155
  309. package/src/lib/database-queue.js +0 -37
  310. package/src/lib/error.js +0 -20
  311. package/src/lib/find-wrangler-config.js +0 -74
  312. package/src/lib/license.js +0 -99
  313. package/src/lib/logger.js +0 -58
  314. package/src/lib/migrations.js +0 -415
  315. package/src/lib/parse-sql-error.js +0 -200
  316. package/src/lib/request-deduplication.js +0 -24
  317. package/src/lib/schema-operations.js +0 -106
  318. package/src/lib/sql-error-types.js +0 -14
  319. package/src/lib/sql-operations.js +0 -647
  320. package/src/lib/utils.js +0 -6
  321. package/src/lib/version-utils.js +0 -34
  322. /package/dist/.next/.next/static/{5dBGGUmK5q7of4h5Rahrg → Y9mYu4WBghepP5oT_3OdR}/_buildManifest.js +0 -0
  323. /package/dist/.next/.next/static/{5dBGGUmK5q7of4h5Rahrg → Y9mYu4WBghepP5oT_3OdR}/_ssgManifest.js +0 -0
  324. /package/dist/.next/.next/static/{PflNFnmFsNegSqhzjI6lA → ae3gNmoSGm-R5LJC4UagI}/_buildManifest.js +0 -0
  325. /package/dist/.next/.next/static/{PflNFnmFsNegSqhzjI6lA → ae3gNmoSGm-R5LJC4UagI}/_ssgManifest.js +0 -0
  326. /package/dist/.next/.next/static/{p8875OZM4iDNsPzmoyLe7 → bKfUJeuvAQlBmR3TjrfkH}/_buildManifest.js +0 -0
  327. /package/dist/.next/.next/static/{p8875OZM4iDNsPzmoyLe7 → bKfUJeuvAQlBmR3TjrfkH}/_ssgManifest.js +0 -0
  328. /package/dist/.next/{static 2/5dBGGUmK5q7of4h5Rahrg → .next/static/ejYPqJ2kVicVp5EFWOZIC}/_buildManifest.js +0 -0
  329. /package/dist/.next/{static 2/5dBGGUmK5q7of4h5Rahrg → .next/static/ejYPqJ2kVicVp5EFWOZIC}/_ssgManifest.js +0 -0
@@ -1,179 +0,0 @@
1
- // api/push-remote/preview/route.js
2
-
3
- import { NextResponse } from 'next/server';
4
- import { readdir } from 'fs/promises';
5
- import path from 'path';
6
- import { findWranglerConfig } from '@/lib/find-wrangler-config.js';
7
- import { executeSQL, ErrorTypes } from '@/lib/sql-operations';
8
- import { validateMigrationFile } from '@/lib/migrations.js';
9
- import logger from '@/lib/logger';
10
-
11
- /**
12
- * Pushes migration preview to remote.
13
- * Validates migration files against remote migration records and returns a preview
14
- * of which migrations will be applied, skipped, or failed.
15
- *
16
- * Note: For remote, we no longer use the checksum.
17
- */
18
- async function pushToRemote(projectDir, accountId, apiToken, databaseName, preview = true) {
19
- const env = {
20
- ...process.env,
21
- CLOUDFLARE_ACCOUNT_ID: accountId,
22
- CLOUDFLARE_API_TOKEN: apiToken,
23
- };
24
-
25
- try {
26
- // Create local migrations table (with checksum)
27
- const localCreateMigrationsTable = `
28
- CREATE TABLE IF NOT EXISTS d1_migrations (
29
- id INTEGER PRIMARY KEY AUTOINCREMENT,
30
- name TEXT NOT NULL UNIQUE,
31
- checksum TEXT NOT NULL,
32
- applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
33
- );
34
- `;
35
- // Create remote migrations table (without checksum; use applied_at)
36
- const remoteCreateMigrationsTable = `
37
- CREATE TABLE IF NOT EXISTS d1_migrations (
38
- id INTEGER PRIMARY KEY AUTOINCREMENT,
39
- name TEXT NOT NULL UNIQUE,
40
- applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
41
- );
42
- `;
43
- await executeSQL(projectDir, databaseName, localCreateMigrationsTable);
44
- await executeSQL(projectDir, databaseName, remoteCreateMigrationsTable, env, true);
45
-
46
- // Get remote migration records using applied_at for ordering.
47
- const remoteMigrations = await executeSQL(
48
- projectDir,
49
- databaseName,
50
- 'SELECT name FROM d1_migrations ORDER BY applied_at;',
51
- env,
52
- true
53
- );
54
- const parseResults = (stdout) => {
55
- try {
56
- const parsed = JSON.parse(stdout);
57
- return parsed[0]?.results || [];
58
- } catch {
59
- return [];
60
- }
61
- };
62
- // Use migration file name as key
63
- const remoteMigrationsMap = new Map(
64
- parseResults(remoteMigrations).map(m => [m.name, m])
65
- );
66
-
67
- // Read migration files from disk.
68
- const migrationsDir = path.join(projectDir, 'migrations');
69
- const files = await readdir(migrationsDir);
70
- const migrationFiles = files.filter(f => f.endsWith('.sql')).sort();
71
-
72
- const results = { applied: [], skipped: [], preview: [] };
73
-
74
- // Process each migration file.
75
- for (const migrationFile of migrationFiles) {
76
- const fullPath = path.join(migrationsDir, migrationFile);
77
- const previewRecord = { name: migrationFile, action: '', reason: '' };
78
- try {
79
- const validation = await validateMigrationFile(fullPath);
80
- if (!validation.isValid) {
81
- previewRecord.action = 'failed validation';
82
- previewRecord.reason = 'Migration validation failed';
83
- results.preview.push(previewRecord);
84
- continue;
85
- }
86
- // For push preview, compare by migration file name.
87
- if (remoteMigrationsMap.has(migrationFile)) {
88
- previewRecord.action = 'skipped';
89
- previewRecord.reason = 'Already applied';
90
- results.preview.push(previewRecord);
91
- results.skipped.push({ name: migrationFile, reason: previewRecord.reason });
92
- continue;
93
- }
94
- previewRecord.action = 'will be applied';
95
- results.preview.push(previewRecord);
96
- } catch (error) {
97
- previewRecord.action = 'failed';
98
- previewRecord.reason = error.message || 'Failed to process migration';
99
- results.preview.push(previewRecord);
100
- results.skipped.push({ name: migrationFile, reason: previewRecord.reason });
101
- }
102
- }
103
-
104
- logger.debug("Push Preview Result (server):", results);
105
- return { success: true, preview: true, applied: results.applied.length, skipped: results.skipped.length, details: results };
106
- } catch (error) {
107
- throw {
108
- type: ErrorTypes.EXECUTION_ERROR,
109
- message: error.message || 'Failed to push migrations',
110
- details: error.details || { error: error.stderr || error.message }
111
- };
112
- }
113
- }
114
-
115
- /**
116
- * POST handler for push-remote preview.
117
- * Loads the Wrangler configuration to obtain the D1 database name,
118
- * then calls pushToRemote in preview mode and returns a preview.
119
- */
120
- export async function POST(req) {
121
- try {
122
- const { accountId, apiToken } = await req.json();
123
- const projectDir = process.env.D1_PROJECT_DIR;
124
- if (!projectDir) {
125
- return NextResponse.json({
126
- success: false,
127
- error: {
128
- type: ErrorTypes.VALIDATION_ERROR,
129
- message: 'Project directory not configured'
130
- }
131
- }, { status: 500 });
132
- }
133
- const wranglerResult = await findWranglerConfig(projectDir);
134
- if (!wranglerResult || !wranglerResult.config) {
135
- return NextResponse.json({
136
- success: false,
137
- error: {
138
- type: ErrorTypes.VALIDATION_ERROR,
139
- message: 'Could not find Wrangler configuration'
140
- }
141
- }, { status: 400 });
142
- }
143
- const config = wranglerResult.config;
144
- if (!config.d1_databases?.length) {
145
- return NextResponse.json({
146
- success: false,
147
- error: {
148
- type: ErrorTypes.VALIDATION_ERROR,
149
- message: 'No D1 databases configured'
150
- }
151
- }, { status: 400 });
152
- }
153
- const databaseName = config.d1_databases[0].database_name;
154
- const result = await pushToRemote(projectDir, accountId, apiToken, databaseName, true);
155
- return NextResponse.json({
156
- success: true,
157
- message: 'Preview generated for migrations to be pushed to remote',
158
- details: result
159
- });
160
- } catch (error) {
161
- logger.error('Push to remote preview error:', error);
162
- return NextResponse.json({
163
- success: false,
164
- error: {
165
- type: error.type || ErrorTypes.EXECUTION_ERROR,
166
- message: error.message || 'Failed to push to remote preview',
167
- details: error.details || { error: error.stderr || error.message }
168
- }
169
- }, { status: error.type === ErrorTypes.VALIDATION_ERROR ? 400 : 500 });
170
- }
171
- }
172
-
173
- /**
174
- * OPTIONS handler for pre-flight requests.
175
- */
176
- export async function OPTIONS() {
177
- return new NextResponse(null, { status: 204 });
178
- }
179
-
@@ -1,168 +0,0 @@
1
- // api/query/route.js
2
-
3
- import { NextResponse } from 'next/server';
4
- import { findWranglerConfig } from '@/lib/find-wrangler-config.js';
5
- import {
6
- ErrorTypes,
7
- parseQuery,
8
- executeSQL,
9
- validateStatement
10
- } from '@/lib/sql-operations';
11
- import { handleSchemaChange } from '@/lib/migrations';
12
- import { isSchemaChange } from '@/lib/sql-operations';
13
- import { parseSQLError } from '@/lib/parse-sql-error';
14
- import logger from '@/lib/logger';
15
-
16
- /**
17
- * API POST handler to execute SQL queries against the configured D1 database.
18
- */
19
- export async function POST(req) {
20
- logger.logRequest('POST', '/api/query');
21
-
22
- try {
23
- // Ensure that the project directory is set.
24
- const projectDir = process.env.D1_PROJECT_DIR;
25
- if (!projectDir) {
26
- logger.error('Project directory not configured');
27
- return NextResponse.json(
28
- { error: 'Project directory not configured' },
29
- { status: 500 }
30
- );
31
- }
32
-
33
- // Extract the SQL query from the request body.
34
- const { query } = await req.json();
35
-
36
- if (logger.shouldLog('debug')) {
37
- logger.debug('Received query:', query);
38
- }
39
-
40
- if (!query?.trim()) {
41
- return NextResponse.json(
42
- { success: false, error: { message: 'Query cannot be empty' } },
43
- { status: 400 }
44
- );
45
- }
46
-
47
- // Retrieve the Wrangler configuration using the centralized helper.
48
- const wranglerResult = await findWranglerConfig(projectDir);
49
- if (!wranglerResult || !wranglerResult.config) {
50
- logger.error('No Wrangler configuration file found');
51
- return NextResponse.json(
52
- { success: false, error: { message: 'No Wrangler configuration file found' } },
53
- { status: 404 }
54
- );
55
- }
56
- const config = wranglerResult.config;
57
-
58
- // Check if there is at least one D1 database configured.
59
- if (!config.d1_databases?.length) {
60
- return NextResponse.json(
61
- { success: false, error: { message: 'No D1 databases configured' } },
62
- { status: 404 }
63
- );
64
- }
65
-
66
- // Use the first configured database.
67
- const databaseName = config.d1_databases[0].database_name;
68
- // console.log('Using database:', databaseName);
69
-
70
- // Parse the query into individual SQL statements.
71
- let statements = parseQuery(query);
72
- // console.log('Parsed statements:', statements);
73
-
74
- if (!statements.length) {
75
- return NextResponse.json(
76
- { success: false, error: { message: 'No valid SQL statements found' } },
77
- { status: 400 }
78
- );
79
- }
80
-
81
- // Validate each parsed statement.
82
- statements = statements.map(validateStatement);
83
- // console.log('Validated statements:', statements);
84
-
85
- // Initialize the migrations table (if it doesn't already exist).
86
- const createMigrationsTable = `
87
- CREATE TABLE IF NOT EXISTS d1_migrations (
88
- id INTEGER PRIMARY KEY AUTOINCREMENT,
89
- name TEXT NOT NULL UNIQUE,
90
- checksum TEXT NOT NULL,
91
- applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
92
- );
93
- `;
94
- await executeSQL(projectDir, databaseName, createMigrationsTable);
95
-
96
- // Determine whether the query involves any schema changes.
97
- const hasSchemaChanges = statements.some(isSchemaChange);
98
- // console.log('Has schema changes:', hasSchemaChanges);
99
-
100
- let result;
101
- if (hasSchemaChanges) {
102
- // Process schema changes and capture migrations.
103
- // The handleSchemaChange helper is responsible for executing the DDL statements.
104
- const migrations = await handleSchemaChange(projectDir, databaseName, statements);
105
- // console.log('Schema changes processed:', migrations);
106
-
107
- result = {
108
- success: true,
109
- migrations,
110
- results: [{ results: [] }]
111
- };
112
- } else {
113
- // For data modification queries, execute the statements.
114
- const results = [];
115
- for (const stmt of statements) {
116
- // console.log('Executing data modification:', stmt.sql);
117
- const output = await executeSQL(projectDir, databaseName, stmt.sql);
118
-
119
- try {
120
- const parsed = JSON.parse(output);
121
- const queryResults = parsed[0]?.results || [];
122
- results.push(...queryResults);
123
- } catch (parseError) {
124
- // console.log('Non-JSON output:', output);
125
- continue;
126
- }
127
- }
128
-
129
- result = {
130
- success: true,
131
- results: [{ results }]
132
- };
133
- }
134
-
135
- return NextResponse.json(result);
136
-
137
- } catch (error) {
138
- logger.logError(error, 'query-route');
139
- const parsedError = parseSQLError(error);
140
-
141
- const statusCode =
142
- error.type === ErrorTypes.VALIDATION_ERROR ? 400 :
143
- error.type === ErrorTypes.DEPENDENCY_ERROR ? 409 :
144
- 500;
145
-
146
- return NextResponse.json(
147
- {
148
- success: false,
149
- error: parsedError
150
- },
151
- { status: statusCode }
152
- );
153
- }
154
- }
155
-
156
- /**
157
- * OPTIONS handler for pre-flight requests.
158
- */
159
- export async function OPTIONS() {
160
- return new NextResponse(null, {
161
- status: 204,
162
- headers: {
163
- 'Access-Control-Allow-Origin': '*',
164
- 'Access-Control-Allow-Methods': 'POST, OPTIONS',
165
- 'Access-Control-Allow-Headers': 'Content-Type'
166
- }
167
- });
168
- }
@@ -1,174 +0,0 @@
1
- // app/api/tables/[name]/route.js
2
-
3
- import { NextResponse } from 'next/server';
4
- import { promisify } from 'util';
5
- import { exec } from 'child_process';
6
- import { findWranglerConfig } from '@/lib/find-wrangler-config.js';
7
- import { dbQueue } from '@/lib/database-queue';
8
- import logger from '@/lib/logger';
9
-
10
- const execAsync = promisify(exec);
11
-
12
- export const runtime = 'nodejs';
13
- export const dynamic = 'force-dynamic';
14
-
15
- // Global query queue to prevent database locks
16
- let isProcessing = false;
17
-
18
- /**
19
- * Executes a D1 SQL query using Wrangler.
20
- * This function ensures that only one query is processed at a time.
21
- */
22
- async function executeD1Query(command, projectDir, databaseName) {
23
- try {
24
- // Wait until any current query is finished.
25
- while (isProcessing) {
26
- await new Promise(resolve => setTimeout(resolve, 100));
27
- }
28
- isProcessing = true;
29
-
30
- // Escape double quotes in the command and execute the query
31
- const { stdout } = await execAsync(
32
- `wrangler d1 execute ${databaseName} --local --command="${command.replace(/"/g, '\\"')}" --json`,
33
- { cwd: projectDir }
34
- );
35
-
36
- const result = JSON.parse(stdout);
37
- return result[0]?.results || [];
38
- } catch (error) {
39
- logger.error('Query execution error:', error);
40
- throw error;
41
- } finally {
42
- isProcessing = false;
43
- }
44
- }
45
-
46
- /**
47
- * Extracts CHECK constraints from a CREATE TABLE SQL statement.
48
- */
49
- function extractCheckConstraints(createTableSQL) {
50
- const checkConstraints = {};
51
- const checkRegex = /CHECK\s*\(\s*(\w+)\s+IN\s*\((.*?)\)\s*\)/gi;
52
- let match;
53
-
54
- while ((match = checkRegex.exec(createTableSQL)) !== null) {
55
- const columnName = match[1];
56
- const values = match[2]
57
- .split(',')
58
- .map(value => value.trim().replace(/^'|'$/g, ''));
59
-
60
- checkConstraints[columnName] = values;
61
- }
62
-
63
- return checkConstraints;
64
- }
65
-
66
- /**
67
- * GET handler for fetching table details, schema, and data.
68
- * It retrieves the Wrangler configuration using the helper and uses that
69
- * to determine the target D1 database.
70
- */
71
- export async function GET(request, context) {
72
- return dbQueue.add(async () => {
73
- try {
74
- // Extract table name from route parameters
75
- const params = await context.params;
76
- const { name } = params;
77
-
78
- // Get pagination info from the query parameters
79
- const { searchParams } = new URL(request.url);
80
- const page = parseInt(searchParams.get('page')) || 1;
81
- const limit = parseInt(searchParams.get('limit')) || 50;
82
- const offset = (page - 1) * limit;
83
-
84
- const projectDir = process.env.D1_PROJECT_DIR;
85
- if (!projectDir) {
86
- throw new Error('Project directory not configured');
87
- }
88
-
89
- // Use the centralized helper to find Wrangler configuration
90
- const wranglerResult = await findWranglerConfig(projectDir);
91
- if (!wranglerResult || !wranglerResult.config) {
92
- throw new Error('No Wrangler configuration file found');
93
- }
94
- const config = wranglerResult.config;
95
- if (!config.d1_databases?.length) {
96
- throw new Error('No D1 databases configured');
97
- }
98
- // Get the first D1 database name from the configuration
99
- const databaseName = config.d1_databases[0].database_name;
100
-
101
- // Get table schema using PRAGMA query
102
- const schemaQuery = `PRAGMA table_info(${name});`;
103
- const schema = await executeD1Query(schemaQuery, projectDir, databaseName);
104
-
105
- // Get the CREATE TABLE statement from sqlite_master
106
- const createTableQuery = `SELECT sql FROM sqlite_master WHERE type='table' AND name='${name}';`;
107
- const tableDefinition = await executeD1Query(createTableQuery, projectDir, databaseName);
108
- const createTableSQL = tableDefinition[0]?.sql || '';
109
-
110
- // Extract CHECK constraints from the CREATE TABLE statement
111
- const checkConstraints = extractCheckConstraints(createTableSQL);
112
-
113
- // Merge constraints into the schema response
114
- const enhancedSchema = schema.map(column => ({
115
- ...column,
116
- check: checkConstraints[column.name] || null
117
- }));
118
-
119
- // Get total row count for the table
120
- const countQuery = `SELECT COUNT(*) as total FROM ${name};`;
121
- const countResult = await executeD1Query(countQuery, projectDir, databaseName);
122
- const totalRows = countResult[0]?.total || 0;
123
-
124
- // Fetch paginated data using the primary key column for ordering
125
- const primaryKeyColumn = schema.find(col => col.pk === 1)?.name || schema[0]?.name;
126
- const dataQuery = `
127
- SELECT * FROM ${name}
128
- ORDER BY ${primaryKeyColumn} DESC
129
- LIMIT ${limit} OFFSET ${offset};
130
- `;
131
- const data = await executeD1Query(dataQuery, projectDir, databaseName);
132
-
133
- return NextResponse.json({
134
- success: true,
135
- schema: enhancedSchema,
136
- data,
137
- meta: {
138
- tableName: name,
139
- total: totalRows,
140
- page,
141
- limit,
142
- totalPages: Math.ceil(totalRows / limit),
143
- rowCount: data.length,
144
- columnCount: schema.length
145
- }
146
- });
147
-
148
- } catch (error) {
149
- logger.error('Error handling request:', error);
150
- return NextResponse.json({
151
- success: false,
152
- error: {
153
- message: error.message,
154
- details: error.stack
155
- }
156
- }, {
157
- status: error.message.includes('not configured') ? 500 :
158
- error.message.includes('not found') ? 404 : 500
159
- });
160
- }
161
- });
162
- }
163
-
164
- export async function OPTIONS() {
165
- return new NextResponse(null, {
166
- status: 204,
167
- headers: {
168
- 'Access-Control-Allow-Origin': '*',
169
- 'Access-Control-Allow-Methods': 'GET, OPTIONS',
170
- 'Access-Control-Allow-Headers': 'Content-Type',
171
- },
172
- });
173
- }
174
-
@@ -1,178 +0,0 @@
1
- // app/api/tables/route.js
2
-
3
- import { NextResponse } from 'next/server';
4
- import { promisify } from 'util';
5
- import { exec } from 'child_process';
6
- import { findWranglerConfig } from '@/lib/find-wrangler-config.js';
7
- import logger from '@/lib/logger';
8
-
9
- const execAsync = promisify(exec);
10
-
11
- /**
12
- * Attempts to extract a JSON object from a string.
13
- * First, it tries to parse the entire string.
14
- * If that fails, it searches for a JSON portion within the string.
15
- */
16
- function extractJSONFromOutput(stdout) {
17
- try {
18
- // First try to parse the entire output as JSON
19
- return JSON.parse(stdout);
20
- } catch (e) {
21
- // If that fails, try to find and parse just the JSON portion
22
- const jsonStart = stdout.indexOf('[') !== -1 ?
23
- stdout.indexOf('[') :
24
- stdout.indexOf('{');
25
-
26
- if (jsonStart === -1) return null;
27
-
28
- try {
29
- const jsonStr = stdout.substring(jsonStart);
30
- return JSON.parse(jsonStr);
31
- } catch (error) {
32
- console.error('Error parsing JSON portion:', error);
33
- return null;
34
- }
35
- }
36
- }
37
-
38
- /**
39
- * Extracts table names from the query result.
40
- */
41
- function extractTablesFromResult(result) {
42
- if (!result) return [];
43
-
44
- if (Array.isArray(result) && result[0]?.results) {
45
- return result[0].results.map(row => row.name);
46
- }
47
-
48
- if (result.results?.[0]?.results) {
49
- return result.results[0].results.map(row => row.name);
50
- }
51
-
52
- return [];
53
- }
54
-
55
- /**
56
- * Retries a function if it fails with a timeout (e.g. due to a locked database).
57
- */
58
- async function retryWithTimeout(fn, retries = 3, timeout = 1000) {
59
- for (let i = 0; i < retries; i++) {
60
- try {
61
- return await fn();
62
- } catch (error) {
63
- if (i === retries - 1) throw error;
64
- if (error.message.includes('database is locked')) {
65
- console.log(`Database locked, retrying in ${timeout}ms... (attempt ${i + 1}/${retries})`);
66
- await new Promise(resolve => setTimeout(resolve, timeout));
67
- continue;
68
- }
69
- throw error;
70
- }
71
- }
72
- }
73
-
74
- /**
75
- * GET handler for listing tables.
76
- * It uses the Wrangler configuration (via findWranglerConfig) to determine the D1 database.
77
- */
78
- export async function GET() {
79
- logger.logRequest('GET', '/api/tables');
80
-
81
- try {
82
- const projectDir = process.env.D1_PROJECT_DIR;
83
-
84
- if (!projectDir) {
85
- logger.error('D1_PROJECT_DIR environment variable is not set');
86
- return NextResponse.json(
87
- { error: 'Project directory not configured' },
88
- { status: 500 }
89
- );
90
- }
91
-
92
- // Use the centralized helper to get Wrangler configuration
93
- const wranglerResult = await findWranglerConfig(projectDir);
94
- if (!wranglerResult || !wranglerResult.config) {
95
- logger.error('No Wrangler configuration file found');
96
- return NextResponse.json(
97
- { error: 'No Wrangler configuration file found in project directory' },
98
- { status: 404 }
99
- );
100
- }
101
- const config = wranglerResult.config;
102
- if (!config.d1_databases?.length) {
103
- return NextResponse.json(
104
- { error: 'No D1 databases configured in Wrangler configuration' },
105
- { status: 404 }
106
- );
107
- }
108
- // Get the first D1 database name from the configuration
109
- const databaseName = config.d1_databases[0].database_name;
110
-
111
- // SQL query to list non-system tables
112
- const query = `
113
- SELECT name FROM sqlite_master
114
- WHERE type='table'
115
- AND name NOT LIKE 'sqlite_%'
116
- AND name NOT LIKE '_cf_%'
117
- ORDER BY name;
118
- `;
119
-
120
- // Execute the query with a retry mechanism if the database is locked
121
- const { stdout } = await retryWithTimeout(async () => {
122
- return execAsync(
123
- `wrangler d1 execute ${databaseName} --local --command="${query}"`,
124
- {
125
- cwd: projectDir,
126
- timeout: 5000 // 5 second timeout
127
- }
128
- );
129
- });
130
-
131
- // Extract JSON from the command output and then extract table names
132
- const result = extractJSONFromOutput(stdout);
133
- const tables = extractTablesFromResult(result);
134
-
135
- return NextResponse.json({
136
- success: true,
137
- tables,
138
- debug: {
139
- projectDir,
140
- tableCount: tables.length
141
- }
142
- });
143
-
144
- } catch (error) {
145
- logger.logError(error, 'tables-route');
146
-
147
- // Enhanced error response for troubleshooting
148
- const errorResponse = {
149
- error: 'Failed to fetch tables',
150
- details: error.message,
151
- debug: {
152
- errorCode: error.code,
153
- errorStack: error.stack,
154
- }
155
- };
156
-
157
- // Check for specific error types (e.g., database locked)
158
- if (error.message.includes('database is locked')) {
159
- errorResponse.error = 'Database is temporarily locked';
160
- errorResponse.retryAfter = 1000; // Suggest retry after 1 second
161
- }
162
-
163
- return NextResponse.json(errorResponse, {
164
- status: error.message.includes('database is locked') ? 503 : 500
165
- });
166
- }
167
- }
168
-
169
- export async function OPTIONS() {
170
- return new NextResponse(null, {
171
- status: 204,
172
- headers: {
173
- 'Access-Control-Allow-Origin': '*',
174
- 'Access-Control-Allow-Methods': 'GET, OPTIONS',
175
- 'Access-Control-Allow-Headers': 'Content-Type',
176
- },
177
- });
178
- }