d1s 0.2.11 → 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 (312) hide show
  1. package/dist/.next/.next/BUILD_ID +1 -1
  2. package/dist/.next/.next/app-build-manifest.json +28 -28
  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 +2 -2
  63. package/dist/.next/.next/server/app/index.rsc +5 -5
  64. package/dist/.next/.next/server/app/page.js +7 -7
  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 +1 -1
  68. package/dist/.next/.next/server/chunks/226.js +12 -12
  69. package/dist/.next/.next/server/chunks/391.js +1 -1
  70. package/dist/.next/.next/server/chunks/572.js +1 -0
  71. package/dist/.next/.next/server/chunks/992.js +3 -3
  72. package/dist/.next/.next/server/middleware-build-manifest.js +1 -1
  73. package/dist/.next/.next/server/next-font-manifest.js +1 -1
  74. package/dist/.next/.next/server/next-font-manifest.json +1 -1
  75. package/dist/.next/.next/server/pages/404.html +1 -1
  76. package/dist/.next/.next/server/pages/500.html +1 -1
  77. package/dist/.next/.next/server/server-reference-manifest.json +1 -1
  78. package/dist/.next/.next/static/chunks/{576-c4daf274bb6469a1.js → 576-18a2209e1ed26aad.js} +1 -1
  79. package/dist/.next/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  80. package/dist/.next/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  81. package/dist/.next/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  82. package/dist/.next/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  83. package/dist/.next/.next/static/css/{9f6c25c5400f83d3.css → 7c16f57d325d0d7d.css} +1 -1
  84. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_buildManifest.js +1 -0
  85. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_ssgManifest.js +1 -0
  86. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_buildManifest.js +1 -0
  87. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_ssgManifest.js +1 -0
  88. package/dist/.next/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  89. package/dist/.next/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  90. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_buildManifest.js +1 -0
  91. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_ssgManifest.js +1 -0
  92. package/dist/.next/.next/trace +3 -3
  93. package/dist/.next/.next/types/app/api/cloudflare/route.ts +1 -1
  94. package/dist/.next/.next/types/app/api/databases/route.ts +1 -1
  95. package/dist/.next/.next/types/app/api/migrations/sync/route.ts +1 -1
  96. package/dist/.next/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  97. package/dist/.next/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  98. package/dist/.next/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  99. package/dist/.next/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  100. package/dist/.next/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  101. package/dist/.next/.next/types/app/api/push-remote/preview/route.ts +1 -1
  102. package/dist/.next/.next/types/app/api/query/route.ts +1 -1
  103. package/dist/.next/.next/types/app/api/tables/[name]/route.ts +1 -1
  104. package/dist/.next/.next/types/app/api/tables/route.ts +1 -1
  105. package/dist/.next/.next/types/app/api/update/route.ts +1 -1
  106. package/dist/.next/.next/types/app/page.ts +1 -1
  107. package/dist/.next/BUILD_ID +1 -1
  108. package/dist/.next/app-build-manifest.json +28 -28
  109. package/dist/.next/app-path-routes-manifest.json +1 -1
  110. package/dist/.next/build-manifest.json +3 -3
  111. package/dist/.next/cache/.rscinfo +1 -1
  112. package/dist/.next/cache/.tsbuildinfo +1 -1
  113. package/dist/.next/cache/webpack/client-production/0.pack +0 -0
  114. package/dist/.next/cache/webpack/client-production/1.pack +0 -0
  115. package/dist/.next/cache/webpack/client-production/2.pack +0 -0
  116. package/dist/.next/cache/webpack/client-production/index.pack +0 -0
  117. package/dist/.next/cache/webpack/client-production/index.pack.old +0 -0
  118. package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
  119. package/dist/.next/cache/webpack/server-production/0.pack +0 -0
  120. package/dist/.next/cache/webpack/server-production/index.pack +0 -0
  121. package/dist/.next/next-minimal-server.js.nft.json +1 -1
  122. package/dist/.next/next-server.js.nft.json +1 -1
  123. package/dist/.next/prerender-manifest.json +1 -1
  124. package/dist/.next/required-server-files.json +1 -1
  125. package/dist/.next/server/app/_not-found/page.js +1 -1
  126. package/dist/.next/server/app/_not-found/page.js.nft.json +1 -1
  127. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  128. package/dist/.next/server/app/_not-found.html +1 -1
  129. package/dist/.next/server/app/_not-found.rsc +4 -4
  130. package/dist/.next/server/app/api/cloudflare/route.js +1 -1
  131. package/dist/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
  132. package/dist/.next/server/app/api/databases/route.js +1 -1
  133. package/dist/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
  134. package/dist/.next/server/app/api/migrations/sync/route.js +5 -5
  135. package/dist/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
  136. package/dist/.next/server/app/api/migrations/sync-files/route.js +3 -3
  137. package/dist/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
  138. package/dist/.next/server/app/api/pull-data/confirm/route.js +1 -1
  139. package/dist/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
  140. package/dist/.next/server/app/api/pull-remote/confirm/route.js +2 -2
  141. package/dist/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
  142. package/dist/.next/server/app/api/pull-remote/preview/route.js +4 -4
  143. package/dist/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
  144. package/dist/.next/server/app/api/push-remote/confirm/route.js +5 -5
  145. package/dist/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
  146. package/dist/.next/server/app/api/push-remote/preview/route.js +4 -4
  147. package/dist/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
  148. package/dist/.next/server/app/api/query/route.js +3 -3
  149. package/dist/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
  150. package/dist/.next/server/app/api/tables/[name]/route.js +5 -5
  151. package/dist/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
  152. package/dist/.next/server/app/api/tables/route.js +2 -2
  153. package/dist/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
  154. package/dist/.next/server/app/api/update/route.js +1 -1
  155. package/dist/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  156. package/dist/.next/server/app/index.html +2 -2
  157. package/dist/.next/server/app/index.rsc +5 -5
  158. package/dist/.next/server/app/page.js +7 -7
  159. package/dist/.next/server/app/page.js.nft.json +1 -1
  160. package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
  161. package/dist/.next/server/app-paths-manifest.json +1 -1
  162. package/dist/.next/server/chunks/226.js +12 -12
  163. package/dist/.next/server/chunks/391.js +1 -1
  164. package/dist/.next/server/chunks/572.js +1 -0
  165. package/dist/.next/server/chunks/992.js +3 -3
  166. package/dist/.next/server/middleware-build-manifest.js +1 -1
  167. package/dist/.next/server/next-font-manifest.js +1 -1
  168. package/dist/.next/server/next-font-manifest.json +1 -1
  169. package/dist/.next/server/pages/404.html +1 -1
  170. package/dist/.next/server/pages/500.html +1 -1
  171. package/dist/.next/server/server-reference-manifest.json +1 -1
  172. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_buildManifest.js +1 -0
  173. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_ssgManifest.js +1 -0
  174. package/dist/.next/static/chunks/{576-c4daf274bb6469a1.js → 576-18a2209e1ed26aad.js} +1 -1
  175. package/dist/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  176. package/dist/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  177. package/dist/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  178. package/dist/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  179. package/dist/.next/static/css/{9f6c25c5400f83d3.css → 7c16f57d325d0d7d.css} +1 -1
  180. package/dist/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  181. package/dist/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  182. package/dist/.next/trace +3 -14
  183. package/dist/.next/types/app/api/cloudflare/route.ts +1 -1
  184. package/dist/.next/types/app/api/databases/route.ts +1 -1
  185. package/dist/.next/types/app/api/migrations/sync/route.ts +1 -1
  186. package/dist/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  187. package/dist/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  188. package/dist/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  189. package/dist/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  190. package/dist/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  191. package/dist/.next/types/app/api/push-remote/preview/route.ts +1 -1
  192. package/dist/.next/types/app/api/query/route.ts +1 -1
  193. package/dist/.next/types/app/api/tables/[name]/route.ts +1 -1
  194. package/dist/.next/types/app/api/tables/route.ts +1 -1
  195. package/dist/.next/types/app/api/update/route.ts +1 -1
  196. package/dist/.next/types/app/page.ts +1 -1
  197. package/dist/app/api/tables/[name]/route.js +22 -10
  198. package/dist/app/globals.css +39 -0
  199. package/dist/d1-studio.js +2 -2
  200. package/dist/lib/data-type-handlers.js +426 -0
  201. package/dist/lib/sql-operations.js +32 -8
  202. package/dist/lib/sql-sanitizer.js +233 -0
  203. package/package.json +3 -9
  204. package/dist/.next/.next/cache/webpack/server-production/2.pack +0 -0
  205. package/dist/.next/.next/server/chunks/90.js +0 -1
  206. package/dist/.next/.next/static/chunks/app/page-36ed30b2266617f3.js +0 -1
  207. package/dist/.next/server/chunks/90.js +0 -1
  208. package/dist/.next/static/chunks/app/page-36ed30b2266617f3.js +0 -1
  209. package/dist/app/app/api/cloudflare/route.js +0 -150
  210. package/dist/app/app/api/databases/route.js +0 -71
  211. package/dist/app/app/api/migrations/sync/route.js +0 -174
  212. package/dist/app/app/api/migrations/sync-files/route.js +0 -172
  213. package/dist/app/app/api/pull-data/confirm/route.js +0 -230
  214. package/dist/app/app/api/pull-remote/confirm/route.js +0 -278
  215. package/dist/app/app/api/pull-remote/preview/route.js +0 -144
  216. package/dist/app/app/api/push-remote/confirm/route.js +0 -196
  217. package/dist/app/app/api/push-remote/preview/route.js +0 -179
  218. package/dist/app/app/api/query/route.js +0 -168
  219. package/dist/app/app/api/tables/[name]/route.js +0 -174
  220. package/dist/app/app/api/tables/route.js +0 -178
  221. package/dist/app/app/api/update/route.js +0 -45
  222. package/dist/app/app/globals.css +0 -93
  223. package/dist/app/app/layout.jsx +0 -35
  224. package/dist/app/app/page.jsx +0 -34
  225. package/next.config.mjs +0 -18
  226. package/postcss.config.mjs +0 -8
  227. package/scripts/studio.js +0 -199
  228. package/scripts/test.js +0 -366
  229. package/src/app/api/cloudflare/route.js +0 -150
  230. package/src/app/api/databases/route.js +0 -71
  231. package/src/app/api/migrations/sync/route.js +0 -174
  232. package/src/app/api/migrations/sync-files/route.js +0 -172
  233. package/src/app/api/pull-data/confirm/route.js +0 -230
  234. package/src/app/api/pull-remote/confirm/route.js +0 -278
  235. package/src/app/api/pull-remote/preview/route.js +0 -144
  236. package/src/app/api/push-remote/confirm/route.js +0 -196
  237. package/src/app/api/push-remote/preview/route.js +0 -179
  238. package/src/app/api/query/route.js +0 -168
  239. package/src/app/api/tables/[name]/route.js +0 -174
  240. package/src/app/api/tables/route.js +0 -178
  241. package/src/app/api/update/route.js +0 -45
  242. package/src/app/globals.css +0 -93
  243. package/src/app/layout.jsx +0 -35
  244. package/src/app/page.jsx +0 -34
  245. package/src/components/cloudflare-credentials-modal.jsx +0 -94
  246. package/src/components/column-selector.jsx +0 -133
  247. package/src/components/column-sorting.jsx +0 -65
  248. package/src/components/delete-records-dialog.jsx +0 -64
  249. package/src/components/download-button.jsx +0 -205
  250. package/src/components/edit-error-alert.jsx +0 -30
  251. package/src/components/editable-cell.jsx +0 -163
  252. package/src/components/editable-row.jsx +0 -169
  253. package/src/components/environment-handler.jsx +0 -332
  254. package/src/components/environment-select.jsx +0 -62
  255. package/src/components/pull-preview-toast.jsx +0 -215
  256. package/src/components/push-error-alert.jsx +0 -72
  257. package/src/components/push-preview-toast.jsx +0 -183
  258. package/src/components/query-results.jsx +0 -112
  259. package/src/components/refresh-button.jsx +0 -61
  260. package/src/components/resize-columns.jsx +0 -101
  261. package/src/components/sidebar.jsx +0 -254
  262. package/src/components/sql-editor.jsx +0 -411
  263. package/src/components/sql-error-display.jsx +0 -167
  264. package/src/components/sync-migrations-button.jsx +0 -87
  265. package/src/components/table-error-dialog.jsx +0 -65
  266. package/src/components/table-toolbar.jsx +0 -285
  267. package/src/components/table-view.jsx +0 -843
  268. package/src/components/ui/alert.jsx +0 -47
  269. package/src/components/ui/button.jsx +0 -48
  270. package/src/components/ui/card.jsx +0 -50
  271. package/src/components/ui/checkbox.jsx +0 -24
  272. package/src/components/ui/collapsible.jsx +0 -11
  273. package/src/components/ui/dialog.jsx +0 -96
  274. package/src/components/ui/dropdown-menu.jsx +0 -158
  275. package/src/components/ui/input.jsx +0 -19
  276. package/src/components/ui/scroll-area.jsx +0 -40
  277. package/src/components/ui/select.jsx +0 -121
  278. package/src/components/ui/separator.jsx +0 -25
  279. package/src/components/ui/sheet.jsx +0 -109
  280. package/src/components/ui/sidebar.jsx +0 -620
  281. package/src/components/ui/skeleton.jsx +0 -14
  282. package/src/components/ui/table.jsx +0 -86
  283. package/src/components/ui/tabs.jsx +0 -43
  284. package/src/components/ui/toast.jsx +0 -86
  285. package/src/components/ui/toaster.jsx +0 -35
  286. package/src/components/ui/tooltip.jsx +0 -28
  287. package/src/components/update-banner.jsx +0 -93
  288. package/src/context/database-context.js +0 -510
  289. package/src/hooks/use-mobile.jsx +0 -19
  290. package/src/hooks/use-sql-error.ts +0 -23
  291. package/src/hooks/use-toast.js +0 -155
  292. package/src/lib/database-queue.js +0 -37
  293. package/src/lib/error.js +0 -20
  294. package/src/lib/find-wrangler-config.js +0 -74
  295. package/src/lib/license.js +0 -99
  296. package/src/lib/logger.js +0 -58
  297. package/src/lib/migrations.js +0 -415
  298. package/src/lib/parse-sql-error.js +0 -200
  299. package/src/lib/request-deduplication.js +0 -24
  300. package/src/lib/schema-operations.js +0 -106
  301. package/src/lib/sql-error-types.js +0 -14
  302. package/src/lib/sql-operations.js +0 -647
  303. package/src/lib/utils.js +0 -6
  304. package/src/lib/version-utils.js +0 -34
  305. /package/dist/.next/.next/static/{OUHnbB-64afrrZQL0Srn5 → Y9mYu4WBghepP5oT_3OdR}/_buildManifest.js +0 -0
  306. /package/dist/.next/.next/static/{OUHnbB-64afrrZQL0Srn5 → Y9mYu4WBghepP5oT_3OdR}/_ssgManifest.js +0 -0
  307. /package/dist/.next/.next/static/{ZBTCAyp1kO5FdEHMU-Dw2 → ae3gNmoSGm-R5LJC4UagI}/_buildManifest.js +0 -0
  308. /package/dist/.next/.next/static/{ZBTCAyp1kO5FdEHMU-Dw2 → ae3gNmoSGm-R5LJC4UagI}/_ssgManifest.js +0 -0
  309. /package/dist/.next/.next/static/{bHYW7fgIBDF8-Q33_WPoE → bKfUJeuvAQlBmR3TjrfkH}/_buildManifest.js +0 -0
  310. /package/dist/.next/.next/static/{bHYW7fgIBDF8-Q33_WPoE → bKfUJeuvAQlBmR3TjrfkH}/_ssgManifest.js +0 -0
  311. /package/dist/.next/{static/ZBTCAyp1kO5FdEHMU-Dw2 → .next/static/ejYPqJ2kVicVp5EFWOZIC}/_buildManifest.js +0 -0
  312. /package/dist/.next/{static/ZBTCAyp1kO5FdEHMU-Dw2 → .next/static/ejYPqJ2kVicVp5EFWOZIC}/_ssgManifest.js +0 -0
@@ -1,133 +0,0 @@
1
- // components/column-selector.jsx
2
- import React, { useState, useEffect } from 'react';
3
- import {
4
- DropdownMenu,
5
- DropdownMenuContent,
6
- DropdownMenuTrigger
7
- } from "@/components/ui/dropdown-menu";
8
- import { Button } from "@/components/ui/button";
9
- import { Checkbox } from "@/components/ui/checkbox";
10
- import { Input } from "@/components/ui/input";
11
- import { Columns } from 'lucide-react';
12
-
13
- export function ColumnSelector({ schema = [], visibleColumns = [], onColumnToggle }) {
14
- const [searchTerm, setSearchTerm] = useState('');
15
-
16
- // Initialize visible columns with all columns from schema
17
- useEffect(() => {
18
- if (!schema || schema.length === 0) return;
19
-
20
- // Get all column names from schema
21
- const allColumns = schema.map(col => col.name);
22
-
23
- // If visibleColumns is empty, make all columns visible
24
- if (visibleColumns.length === 0) {
25
- allColumns.forEach(col => onColumnToggle(col));
26
- }
27
- }, [schema, visibleColumns.length, onColumnToggle]);
28
-
29
- // Filter columns based on search term
30
- const filteredColumns = schema.filter(col =>
31
- col.name.toLowerCase().includes(searchTerm.toLowerCase())
32
- );
33
- const filteredColumnNames = filteredColumns.map(col => col.name);
34
-
35
- // Determine if all filtered columns are selected
36
- const allFilteredSelected =
37
- filteredColumnNames.length > 0 &&
38
- filteredColumnNames.every(name => visibleColumns.includes(name));
39
-
40
- // Handle individual checkbox change
41
- const handleCheckboxChange = (columnName) => {
42
- onColumnToggle(columnName);
43
- };
44
-
45
- // Handle the "Select All" checkbox change for the filtered list
46
- const handleSelectAllChange = (checked) => {
47
- if (checked) {
48
- // For every filtered column that is not visible, toggle it on
49
- filteredColumns.forEach(col => {
50
- if (!visibleColumns.includes(col.name)) {
51
- onColumnToggle(col.name);
52
- }
53
- });
54
- } else {
55
- // For every filtered column that is visible, toggle it off
56
- filteredColumns.forEach(col => {
57
- if (visibleColumns.includes(col.name)) {
58
- onColumnToggle(col.name);
59
- }
60
- });
61
- }
62
- };
63
-
64
- return (
65
- <DropdownMenu>
66
- <DropdownMenuTrigger asChild>
67
- <Button
68
- size="sm"
69
- variant="outline"
70
- className="font-semibold"
71
- >
72
- <Columns className="h-4 w-4" />
73
- Columns ({visibleColumns.length})
74
- </Button>
75
- </DropdownMenuTrigger>
76
- <DropdownMenuContent align="end" className="w-64 font-sans">
77
- <div className="p-2">
78
- <Input
79
- placeholder="Search columns..."
80
- value={searchTerm}
81
- onChange={(e) => setSearchTerm(e.target.value)}
82
- className="h-8"
83
- />
84
- </div>
85
-
86
- {/* Select All Option */}
87
- <div className="flex items-center space-x-2 px-2 py-1.5 hover:bg-accent rounded-md">
88
- <Checkbox
89
- id="select-all-columns"
90
- checked={allFilteredSelected}
91
- onCheckedChange={handleSelectAllChange}
92
- className="shrink-0"
93
- />
94
- <label
95
- htmlFor="select-all-columns"
96
- className="flex-1 cursor-pointer text-sm font-medium"
97
- >
98
- Select All {searchTerm && '(Filtered)'}
99
- </label>
100
- </div>
101
-
102
- <div className="max-h-[300px] overflow-y-auto">
103
- {filteredColumns.map((column) => (
104
- <div
105
- key={column.name}
106
- className="flex items-start space-x-2 px-2 py-1.5 hover:bg-accent rounded-md"
107
- >
108
- <Checkbox
109
- id={`column-${column.name}`}
110
- checked={visibleColumns.includes(column.name)}
111
- onCheckedChange={() => handleCheckboxChange(column.name)}
112
- className="mt-1"
113
- />
114
- <label
115
- htmlFor={`column-${column.name}`}
116
- className="flex-1 cursor-pointer"
117
- >
118
- <div className="text-sm font-medium">
119
- {column.name}
120
- </div>
121
- <div className="text-xs text-muted-foreground">
122
- {column.type.toLowerCase()}
123
- </div>
124
- </label>
125
- </div>
126
- ))}
127
- </div>
128
- </DropdownMenuContent>
129
- </DropdownMenu>
130
- );
131
- }
132
-
133
- export default ColumnSelector;
@@ -1,65 +0,0 @@
1
- // components/column-sorting.jsx
2
- 'use client';
3
-
4
- import { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react';
5
- import { Button } from "@/components/ui/button";
6
-
7
- export function SortableHeader({
8
- column,
9
- sortConfig,
10
- onSort,
11
- children
12
- }) {
13
- const direction = sortConfig[column];
14
-
15
- return (
16
- <div className="flex items-center w-full">
17
- <Button
18
- variant="ghost"
19
- size="sm"
20
- className="h-8 hover:bg-neutral-100 w-full justify-between"
21
- onClick={() => {
22
- const nextDirection = !direction
23
- ? 'asc'
24
- : direction === 'asc'
25
- ? 'desc'
26
- : null;
27
- onSort(column, nextDirection);
28
- }}
29
- >
30
- <span className="flex items-center gap-1 font-mono">
31
- {children}
32
- </span>
33
- <span className="shrink-0">
34
- {direction === 'asc' && <ArrowUp className="h-4 w-4" />}
35
- {direction === 'desc' && <ArrowDown className="h-4 w-4" />}
36
- {!direction && <ArrowUpDown className="h-4 w-4" />}
37
- </span>
38
- </Button>
39
- </div>
40
- );
41
- }
42
-
43
- export function sortData(data, column, direction) {
44
- if (!direction || !data.length) return data;
45
-
46
- return [...data].sort((a, b) => {
47
- const aVal = a[column];
48
- const bVal = b[column];
49
-
50
- // Handle null values
51
- if (aVal == null && bVal == null) return 0;
52
- if (aVal == null) return 1;
53
- if (bVal == null) return -1;
54
-
55
- // Compare based on type
56
- if (typeof aVal === 'number' && typeof bVal === 'number') {
57
- return direction === 'asc' ? aVal - bVal : bVal - aVal;
58
- }
59
-
60
- // String comparison for everything else
61
- const aStr = String(aVal).toLowerCase();
62
- const bStr = String(bVal).toLowerCase();
63
- return direction === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr);
64
- });
65
- }
@@ -1,64 +0,0 @@
1
- // components/delete-records-dialog.jsx
2
- 'use client';
3
-
4
- import React from 'react';
5
- import { AlertCircle } from 'lucide-react';
6
- import {
7
- Dialog,
8
- DialogContent,
9
- DialogDescription,
10
- DialogHeader,
11
- DialogTitle,
12
- DialogFooter,
13
- } from "@/components/ui/dialog";
14
- import { Button } from "@/components/ui/button";
15
- import { Alert, AlertDescription } from "@/components/ui/alert";
16
-
17
- export function DeleteRecordsDialog({
18
- isOpen,
19
- onClose,
20
- onConfirm,
21
- selectedCount,
22
- tableName,
23
- isDeleting,
24
- error
25
- }) {
26
- return (
27
- <Dialog open={isOpen} onOpenChange={onClose}>
28
- <DialogContent className="sm:max-w-md font-sans">
29
- <DialogHeader>
30
- <DialogTitle className="mb-2">Delete {selectedCount} {selectedCount === 1 ? 'Record' : 'Records'}?</DialogTitle>
31
- <DialogDescription className="text-neutral-600 font-medium">
32
- You're about to delete {selectedCount} {selectedCount === 1 ? 'record' : 'records'} from <span className="font-sans font-bold text-neutral-900">{tableName}</span>.
33
- </DialogDescription>
34
- </DialogHeader>
35
-
36
- {error && (
37
- <Alert variant="destructive">
38
- <AlertCircle className="h-4 w-4" />
39
- <AlertDescription>{error}</AlertDescription>
40
- </Alert>
41
- )}
42
-
43
- <DialogFooter className="flex gap-1 mt-2 sm:justify-end font-sans">
44
- <Button
45
- variant="outline"
46
- onClick={onClose}
47
- disabled={isDeleting}
48
- >
49
- Cancel
50
- </Button>
51
- <Button
52
- variant="destructive"
53
- onClick={onConfirm}
54
- disabled={isDeleting}
55
- >
56
- {isDeleting ? 'Deleting...' : 'Delete'}
57
- </Button>
58
- </DialogFooter>
59
- </DialogContent>
60
- </Dialog>
61
- );
62
- }
63
-
64
- export default DeleteRecordsDialog;
@@ -1,205 +0,0 @@
1
- // components/download-button.jsx
2
- 'use client';
3
-
4
- import React, { memo, useState } from 'react';
5
- import { Download, FileJson, FileSpreadsheet, FileCode, Loader2 } from 'lucide-react';
6
- import { Button } from "@/components/ui/button";
7
- import {
8
- DropdownMenu,
9
- DropdownMenuContent,
10
- DropdownMenuItem,
11
- DropdownMenuTrigger,
12
- } from "@/components/ui/dropdown-menu";
13
- import {
14
- Tooltip,
15
- TooltipContent,
16
- TooltipProvider,
17
- TooltipTrigger,
18
- } from "@/components/ui/tooltip";
19
- import { useToast } from "@/hooks/use-toast";
20
-
21
- const DownloadButton = memo(({
22
- tableName,
23
- onDownloadStart,
24
- onDownloadComplete,
25
- disabled
26
- }) => {
27
- const [isDownloading, setIsDownloading] = useState(false);
28
- const { toast } = useToast();
29
-
30
- const downloadAsFile = (data, filename) => {
31
- try {
32
- const blob = new Blob([data], { type: "application/octet-stream" });
33
- const url = window.URL.createObjectURL(blob);
34
-
35
- const link = document.createElement("a");
36
- link.href = url;
37
- link.download = filename;
38
- document.body.appendChild(link);
39
- link.click();
40
- document.body.removeChild(link);
41
- window.URL.revokeObjectURL(url);
42
- } catch (error) {
43
- console.error("Error during file download:", error);
44
- throw error;
45
- }
46
- };
47
-
48
- const handleDownload = async (format) => {
49
- if (disabled) return;
50
-
51
- try {
52
- setIsDownloading(true);
53
- onDownloadStart?.();
54
-
55
- const response = await fetch(`/api/tables/${tableName}`);
56
- const result = await response.json();
57
-
58
- if (!response.ok) {
59
- throw new Error(result.error || 'Failed to fetch data');
60
- }
61
-
62
- const { data, schema } = result;
63
-
64
- if (!data?.length) {
65
- toast({
66
- title: "No Data",
67
- description: "The table is empty.",
68
- variant: "destructive",
69
- });
70
- return;
71
- }
72
-
73
- const timestamp = new Date().toISOString().split("T")[0];
74
- const filename = `${tableName}_${timestamp}.${format}`;
75
-
76
- switch (format) {
77
- case "json": {
78
- const jsonStr = JSON.stringify(data, null, 2);
79
- downloadAsFile(jsonStr, filename);
80
- break;
81
- }
82
- case "csv": {
83
- const headers = Object.keys(data[0]);
84
- const csvRows = [
85
- headers.join(","),
86
- ...data.map((row) =>
87
- headers.map((header) => {
88
- const value = row[header];
89
- if (value === null || value === undefined) return "";
90
- if (typeof value === "string") {
91
- const escaped = value.replace(/"/g, '""');
92
- return `"${escaped}"`;
93
- }
94
- return value;
95
- }).join(",")
96
- ),
97
- ];
98
- const csvStr = csvRows.join("\n");
99
- downloadAsFile(csvStr, filename);
100
- break;
101
- }
102
- case "sql": {
103
- // Generate CREATE TABLE statement
104
- const createTable = `CREATE TABLE IF NOT EXISTS ${tableName} (\n` +
105
- schema.map(col => {
106
- const constraints = [];
107
- if (col.pk) constraints.push('PRIMARY KEY');
108
- if (!col.notnull) constraints.push('NOT NULL');
109
-
110
- return ` ${col.name} ${col.type}${constraints.length ? ` ${constraints.join(' ')}` : ''}`;
111
- }).join(',\n') +
112
- '\n);\n\n';
113
-
114
- // Generate INSERT statements
115
- const insertStatements = data.map(row => {
116
- const columns = Object.keys(row);
117
- const values = columns.map(col => {
118
- const value = row[col];
119
- if (value === null) return 'NULL';
120
- if (typeof value === 'string') return `'${value.replace(/'/g, "''")}'`;
121
- return value;
122
- });
123
-
124
- return `INSERT INTO ${tableName} (${columns.join(', ')})\nVALUES (${values.join(', ')});`;
125
- }).join('\n');
126
-
127
- const sqlContent = createTable + insertStatements;
128
- downloadAsFile(sqlContent, filename);
129
- break;
130
- }
131
- }
132
-
133
- toast({
134
- title: "Download Complete",
135
- description: `${data.length} rows exported as ${format.toUpperCase()}.`,
136
- });
137
- onDownloadComplete?.();
138
-
139
- } catch (error) {
140
- console.error("Download error:", error);
141
- toast({
142
- variant: "destructive",
143
- title: "Download Failed",
144
- description: error.message,
145
- });
146
- } finally {
147
- setIsDownloading(false);
148
- }
149
- };
150
-
151
- return (
152
- <DropdownMenu>
153
- <TooltipProvider>
154
- <Tooltip>
155
- <TooltipTrigger asChild>
156
- <DropdownMenuTrigger asChild>
157
- <Button
158
- variant="outline"
159
- size="icon"
160
- className="h-8"
161
- disabled={isDownloading || disabled}
162
- >
163
- {isDownloading ? (
164
- <Loader2 className="h-4 w-4 animate-spin" />
165
- ) : (
166
- <Download className="h-4 w-4" />
167
- )}
168
- </Button>
169
- </DropdownMenuTrigger>
170
- </TooltipTrigger>
171
- <TooltipContent>
172
- <p>Download table data</p>
173
- </TooltipContent>
174
- </Tooltip>
175
- </TooltipProvider>
176
- <DropdownMenuContent align="end">
177
- <DropdownMenuItem
178
- onClick={() => handleDownload('json')}
179
- disabled={disabled}
180
- >
181
- <FileJson className="mr-2 h-4 w-4" />
182
- <span>Download JSON</span>
183
- </DropdownMenuItem>
184
- <DropdownMenuItem
185
- onClick={() => handleDownload('csv')}
186
- disabled={disabled}
187
- >
188
- <FileSpreadsheet className="mr-2 h-4 w-4" />
189
- <span>Download CSV</span>
190
- </DropdownMenuItem>
191
- <DropdownMenuItem
192
- onClick={() => handleDownload('sql')}
193
- disabled={disabled}
194
- >
195
- <FileCode className="mr-2 h-4 w-4" />
196
- <span>Download SQL</span>
197
- </DropdownMenuItem>
198
- </DropdownMenuContent>
199
- </DropdownMenu>
200
- );
201
- });
202
-
203
- DownloadButton.displayName = 'DownloadButton';
204
-
205
- export default DownloadButton;
@@ -1,30 +0,0 @@
1
- // components/edit-error-alert.jsx
2
- 'use client';
3
-
4
- import React from 'react';
5
- import { AlertCircle, X } from 'lucide-react';
6
- import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
7
-
8
- export function EditErrorAlert({ error, onDismiss }) {
9
- if (!error) return null;
10
-
11
- return (
12
- <Alert variant="destructive" className="mb-4">
13
- <AlertCircle className="h-4 w-4" />
14
- <AlertTitle className="flex items-center justify-between">
15
- <span>Failed to save changes</span>
16
- {onDismiss && (
17
- <button
18
- onClick={onDismiss}
19
- className="p-1 hover:bg-destructive/10 rounded-full"
20
- >
21
- <X className="h-4 w-4" />
22
- </button>
23
- )}
24
- </AlertTitle>
25
- <AlertDescription>{error.message}</AlertDescription>
26
- </Alert>
27
- );
28
- }
29
-
30
- export default EditErrorAlert;
@@ -1,163 +0,0 @@
1
- // components/editable-cell.jsx
2
-
3
- 'use client';
4
-
5
- import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';
6
- import { TableCell } from '@/components/ui/table';
7
- import { Input } from '@/components/ui/input';
8
- import {
9
- Select,
10
- SelectContent,
11
- SelectItem,
12
- SelectTrigger,
13
- SelectValue,
14
- } from "@/components/ui/select";
15
-
16
- export function EditableCell({
17
- value: initialValue,
18
- row: _row,
19
- column,
20
- schema,
21
- onChange,
22
- onStartEdit,
23
- isEditing
24
- }) {
25
- const cleanValue = typeof initialValue === 'string' ?
26
- initialValue.replace(/^'|'$/g, '') :
27
- initialValue;
28
-
29
- const [value, setValue] = useState(cleanValue);
30
- const [width, setWidth] = useState('auto');
31
- const cellRef = useRef(null);
32
- const inputRef = useRef(null);
33
-
34
- // Find column schema and extract column type and constraints
35
- const columnSchema = schema.find(col => col.name === column);
36
- const allowedValues = useMemo(() => columnSchema?.check || null, [columnSchema]);
37
- const isBoolean = useMemo(() => {
38
- const type = columnSchema?.type?.toLowerCase() || '';
39
- return type === 'boolean' || type === 'bool' || (type === 'integer' && column.toLowerCase().startsWith('is_'));
40
- }, [columnSchema, column]);
41
-
42
- useEffect(() => {
43
- setValue(cleanValue);
44
- }, [cleanValue]);
45
-
46
- useEffect(() => {
47
- if (cellRef.current && !isEditing) {
48
- const cellWidth = cellRef.current.offsetWidth;
49
- setWidth(`${cellWidth}px`);
50
- }
51
- }, [isEditing]);
52
-
53
- useEffect(() => {
54
- if (isEditing && inputRef.current) {
55
- inputRef.current.focus();
56
- inputRef.current.select();
57
- }
58
- }, [isEditing]);
59
-
60
- // Allow editing of primary key now.
61
- const isPrimaryKey = columnSchema?.pk === 1;
62
-
63
- const handleChange = useCallback((newValue) => {
64
- // Convert boolean values to 1/0 for storage if it's a boolean field
65
- const processedValue = isBoolean ?
66
- (newValue === 'true' ? 1 : newValue === 'false' ? 0 : newValue) :
67
- newValue;
68
-
69
- setValue(newValue);
70
- onChange?.(processedValue);
71
- }, [onChange, isBoolean]);
72
-
73
- const handleCellClick = useCallback(() => {
74
- // Removed isPrimaryKey check so that even primary key cells can be edited
75
- if (!isEditing && onStartEdit) {
76
- onStartEdit(cleanValue);
77
- }
78
- }, [isEditing, onStartEdit, cleanValue]);
79
-
80
- const baseClasses = "border-x border-neutral-200 px-3 py-2.5 text-xs font-mono whitespace-nowrap";
81
-
82
- // Display formatting for cell value when not editing
83
- const displayValue = useMemo(() => {
84
- if (cleanValue === null || cleanValue === undefined) return 'null';
85
- if (isBoolean) {
86
- return cleanValue === 1 || cleanValue === '1' || cleanValue === 'true' ? 'true' : 'false';
87
- }
88
- return cleanValue.toString();
89
- }, [cleanValue, isBoolean]);
90
-
91
- if (!isEditing) {
92
- return (
93
- <TableCell
94
- ref={cellRef}
95
- className={`${baseClasses} cursor-pointer hover:bg-muted/50`}
96
- onClick={handleCellClick}
97
- >
98
- {displayValue}
99
- </TableCell>
100
- );
101
- }
102
-
103
- // Render boolean dropdown
104
- if (isBoolean) {
105
- return (
106
- <TableCell className={`${baseClasses} p-0`} style={{ width }}>
107
- <div className="w-full h-full">
108
- <Select
109
- value={displayValue}
110
- onValueChange={handleChange}
111
- defaultOpen={isEditing}
112
- >
113
- <SelectTrigger className="w-full h-9 min-w-0 rounded-none border-0 bg-orange-50 text-orange-900">
114
- <SelectValue placeholder="Select value" />
115
- </SelectTrigger>
116
- <SelectContent className="min-w-[8rem]">
117
- <SelectItem value="true">true</SelectItem>
118
- <SelectItem value="false">false</SelectItem>
119
- </SelectContent>
120
- </Select>
121
- </div>
122
- </TableCell>
123
- );
124
- }
125
-
126
- // Render check constraint dropdown
127
- if (allowedValues?.length > 0) {
128
- return (
129
- <TableCell className={`${baseClasses} p-0`} style={{ width }}>
130
- <div className="w-full h-full">
131
- <Select
132
- value={value ?? allowedValues[0]}
133
- onValueChange={handleChange}
134
- defaultOpen={isEditing}
135
- >
136
- <SelectTrigger className="w-full h-9 min-w-0 rounded-none border-0 bg-orange-50 text-orange-900">
137
- <SelectValue placeholder={`Select ${column}`} />
138
- </SelectTrigger>
139
- <SelectContent className="min-w-[8rem]">
140
- {allowedValues.map(allowedValue => (
141
- <SelectItem key={allowedValue} value={allowedValue}>
142
- {allowedValue}
143
- </SelectItem>
144
- ))}
145
- </SelectContent>
146
- </Select>
147
- </div>
148
- </TableCell>
149
- );
150
- }
151
-
152
- // Default input for other fields
153
- return (
154
- <TableCell className={`${baseClasses} p-0`} style={{ width }}>
155
- <Input
156
- ref={inputRef}
157
- value={value ?? ''}
158
- onChange={(e) => handleChange(e.target.value)}
159
- className="w-full min-w-0 rounded-none border-0 bg-orange-50 text-orange-900"
160
- />
161
- </TableCell>
162
- );
163
- }