d1s 0.2.11 → 0.2.13

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 (318) 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/2.pack +0 -0
  26. package/dist/.next/.next/cache/webpack/server-production/3.pack +0 -0
  27. package/dist/.next/.next/cache/webpack/server-production/index.pack +0 -0
  28. package/dist/.next/.next/cache/webpack/server-production/index.pack.old +0 -0
  29. package/dist/.next/.next/next-minimal-server.js.nft.json +1 -1
  30. package/dist/.next/.next/next-server.js.nft.json +1 -1
  31. package/dist/.next/.next/prerender-manifest.json +1 -1
  32. package/dist/.next/.next/required-server-files.json +1 -1
  33. package/dist/.next/.next/server/app/_not-found/page.js +1 -1
  34. package/dist/.next/.next/server/app/_not-found/page.js.nft.json +1 -1
  35. package/dist/.next/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. package/dist/.next/.next/server/app/_not-found.html +1 -1
  37. package/dist/.next/.next/server/app/_not-found.rsc +4 -4
  38. package/dist/.next/.next/server/app/api/cloudflare/route.js +1 -1
  39. package/dist/.next/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
  40. package/dist/.next/.next/server/app/api/databases/route.js +1 -1
  41. package/dist/.next/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
  42. package/dist/.next/.next/server/app/api/migrations/sync/route.js +5 -5
  43. package/dist/.next/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
  44. package/dist/.next/.next/server/app/api/migrations/sync-files/route.js +3 -3
  45. package/dist/.next/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
  46. package/dist/.next/.next/server/app/api/pull-data/confirm/route.js +1 -1
  47. package/dist/.next/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
  48. package/dist/.next/.next/server/app/api/pull-remote/confirm/route.js +2 -2
  49. package/dist/.next/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
  50. package/dist/.next/.next/server/app/api/pull-remote/preview/route.js +4 -4
  51. package/dist/.next/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
  52. package/dist/.next/.next/server/app/api/push-remote/confirm/route.js +5 -5
  53. package/dist/.next/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
  54. package/dist/.next/.next/server/app/api/push-remote/preview/route.js +4 -4
  55. package/dist/.next/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
  56. package/dist/.next/.next/server/app/api/query/route.js +3 -3
  57. package/dist/.next/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
  58. package/dist/.next/.next/server/app/api/tables/[name]/route.js +5 -5
  59. package/dist/.next/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
  60. package/dist/.next/.next/server/app/api/tables/route.js +2 -2
  61. package/dist/.next/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
  62. package/dist/.next/.next/server/app/api/update/route.js +1 -1
  63. package/dist/.next/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  64. package/dist/.next/.next/server/app/index.html +2 -2
  65. package/dist/.next/.next/server/app/index.rsc +5 -5
  66. package/dist/.next/.next/server/app/page.js +7 -7
  67. package/dist/.next/.next/server/app/page.js.nft.json +1 -1
  68. package/dist/.next/.next/server/app/page_client-reference-manifest.js +1 -1
  69. package/dist/.next/.next/server/app-paths-manifest.json +1 -1
  70. package/dist/.next/.next/server/chunks/226.js +12 -12
  71. package/dist/.next/.next/server/chunks/391.js +1 -1
  72. package/dist/.next/.next/server/chunks/572.js +1 -0
  73. package/dist/.next/.next/server/chunks/992.js +3 -3
  74. package/dist/.next/.next/server/middleware-build-manifest.js +1 -1
  75. package/dist/.next/.next/server/next-font-manifest.js +1 -1
  76. package/dist/.next/.next/server/next-font-manifest.json +1 -1
  77. package/dist/.next/.next/server/pages/404.html +1 -1
  78. package/dist/.next/.next/server/pages/500.html +1 -1
  79. package/dist/.next/.next/server/server-reference-manifest.json +1 -1
  80. package/dist/.next/.next/static/chunks/{576-c4daf274bb6469a1.js → 576-18a2209e1ed26aad.js} +1 -1
  81. package/dist/.next/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  82. package/dist/.next/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  83. package/dist/.next/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  84. package/dist/.next/.next/static/chunks/app/page-f2bc307c0d8acdaa.js +1 -0
  85. package/dist/.next/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  86. package/dist/.next/.next/static/css/{9f6c25c5400f83d3.css → 7c16f57d325d0d7d.css} +1 -1
  87. package/dist/.next/.next/static/ejYPqJ2kVicVp5EFWOZIC/_buildManifest.js +1 -0
  88. package/dist/.next/.next/static/ejYPqJ2kVicVp5EFWOZIC/_ssgManifest.js +1 -0
  89. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_buildManifest.js +1 -0
  90. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_ssgManifest.js +1 -0
  91. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_buildManifest.js +1 -0
  92. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_ssgManifest.js +1 -0
  93. package/dist/.next/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  94. package/dist/.next/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  95. package/dist/.next/.next/static/thaCy2qVeNqYYhdayr13C/_buildManifest.js +1 -0
  96. package/dist/.next/.next/static/thaCy2qVeNqYYhdayr13C/_ssgManifest.js +1 -0
  97. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_buildManifest.js +1 -0
  98. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_ssgManifest.js +1 -0
  99. package/dist/.next/.next/trace +3 -3
  100. package/dist/.next/.next/types/app/api/cloudflare/route.ts +1 -1
  101. package/dist/.next/.next/types/app/api/databases/route.ts +1 -1
  102. package/dist/.next/.next/types/app/api/migrations/sync/route.ts +1 -1
  103. package/dist/.next/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  104. package/dist/.next/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  105. package/dist/.next/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  106. package/dist/.next/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  107. package/dist/.next/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  108. package/dist/.next/.next/types/app/api/push-remote/preview/route.ts +1 -1
  109. package/dist/.next/.next/types/app/api/query/route.ts +1 -1
  110. package/dist/.next/.next/types/app/api/tables/[name]/route.ts +1 -1
  111. package/dist/.next/.next/types/app/api/tables/route.ts +1 -1
  112. package/dist/.next/.next/types/app/api/update/route.ts +1 -1
  113. package/dist/.next/.next/types/app/page.ts +1 -1
  114. package/dist/.next/BUILD_ID +1 -1
  115. package/dist/.next/app-build-manifest.json +28 -28
  116. package/dist/.next/app-path-routes-manifest.json +1 -1
  117. package/dist/.next/build-manifest.json +3 -3
  118. package/dist/.next/cache/.rscinfo +1 -1
  119. package/dist/.next/cache/.tsbuildinfo +1 -1
  120. package/dist/.next/cache/webpack/client-production/0.pack +0 -0
  121. package/dist/.next/cache/webpack/client-production/1.pack +0 -0
  122. package/dist/.next/cache/webpack/client-production/2.pack +0 -0
  123. package/dist/.next/cache/webpack/client-production/index.pack +0 -0
  124. package/dist/.next/cache/webpack/client-production/index.pack.old +0 -0
  125. package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
  126. package/dist/.next/cache/webpack/server-production/0.pack +0 -0
  127. package/dist/.next/cache/webpack/server-production/index.pack +0 -0
  128. package/dist/.next/next-minimal-server.js.nft.json +1 -1
  129. package/dist/.next/next-server.js.nft.json +1 -1
  130. package/dist/.next/prerender-manifest.json +1 -1
  131. package/dist/.next/required-server-files.json +1 -1
  132. package/dist/.next/server/app/_not-found/page.js +1 -1
  133. package/dist/.next/server/app/_not-found/page.js.nft.json +1 -1
  134. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  135. package/dist/.next/server/app/_not-found.html +1 -1
  136. package/dist/.next/server/app/_not-found.rsc +4 -4
  137. package/dist/.next/server/app/api/cloudflare/route.js +1 -1
  138. package/dist/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
  139. package/dist/.next/server/app/api/databases/route.js +1 -1
  140. package/dist/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
  141. package/dist/.next/server/app/api/migrations/sync/route.js +5 -5
  142. package/dist/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
  143. package/dist/.next/server/app/api/migrations/sync-files/route.js +3 -3
  144. package/dist/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
  145. package/dist/.next/server/app/api/pull-data/confirm/route.js +1 -1
  146. package/dist/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
  147. package/dist/.next/server/app/api/pull-remote/confirm/route.js +2 -2
  148. package/dist/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
  149. package/dist/.next/server/app/api/pull-remote/preview/route.js +4 -4
  150. package/dist/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
  151. package/dist/.next/server/app/api/push-remote/confirm/route.js +5 -5
  152. package/dist/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
  153. package/dist/.next/server/app/api/push-remote/preview/route.js +4 -4
  154. package/dist/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
  155. package/dist/.next/server/app/api/query/route.js +3 -3
  156. package/dist/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
  157. package/dist/.next/server/app/api/tables/[name]/route.js +5 -5
  158. package/dist/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
  159. package/dist/.next/server/app/api/tables/route.js +2 -2
  160. package/dist/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
  161. package/dist/.next/server/app/api/update/route.js +1 -1
  162. package/dist/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  163. package/dist/.next/server/app/index.html +2 -2
  164. package/dist/.next/server/app/index.rsc +5 -5
  165. package/dist/.next/server/app/page.js +7 -7
  166. package/dist/.next/server/app/page.js.nft.json +1 -1
  167. package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
  168. package/dist/.next/server/app-paths-manifest.json +1 -1
  169. package/dist/.next/server/chunks/226.js +12 -12
  170. package/dist/.next/server/chunks/391.js +1 -1
  171. package/dist/.next/server/chunks/572.js +1 -0
  172. package/dist/.next/server/chunks/992.js +3 -3
  173. package/dist/.next/server/middleware-build-manifest.js +1 -1
  174. package/dist/.next/server/next-font-manifest.js +1 -1
  175. package/dist/.next/server/next-font-manifest.json +1 -1
  176. package/dist/.next/server/pages/404.html +1 -1
  177. package/dist/.next/server/pages/500.html +1 -1
  178. package/dist/.next/server/server-reference-manifest.json +1 -1
  179. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_buildManifest.js +1 -0
  180. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_ssgManifest.js +1 -0
  181. package/dist/.next/static/chunks/{576-c4daf274bb6469a1.js → 576-18a2209e1ed26aad.js} +1 -1
  182. package/dist/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  183. package/dist/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  184. package/dist/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  185. package/dist/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  186. package/dist/.next/static/css/{9f6c25c5400f83d3.css → 7c16f57d325d0d7d.css} +1 -1
  187. package/dist/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  188. package/dist/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  189. package/dist/.next/trace +3 -14
  190. package/dist/.next/types/app/api/cloudflare/route.ts +1 -1
  191. package/dist/.next/types/app/api/databases/route.ts +1 -1
  192. package/dist/.next/types/app/api/migrations/sync/route.ts +1 -1
  193. package/dist/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  194. package/dist/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  195. package/dist/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  196. package/dist/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  197. package/dist/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  198. package/dist/.next/types/app/api/push-remote/preview/route.ts +1 -1
  199. package/dist/.next/types/app/api/query/route.ts +1 -1
  200. package/dist/.next/types/app/api/tables/[name]/route.ts +1 -1
  201. package/dist/.next/types/app/api/tables/route.ts +1 -1
  202. package/dist/.next/types/app/api/update/route.ts +1 -1
  203. package/dist/.next/types/app/page.ts +1 -1
  204. package/dist/app/api/tables/[name]/route.js +22 -10
  205. package/dist/app/globals.css +39 -0
  206. package/dist/d1-studio.js +2 -2
  207. package/dist/lib/data-type-handlers.js +426 -0
  208. package/dist/lib/sql-operations.js +32 -8
  209. package/dist/lib/sql-sanitizer.js +233 -0
  210. package/package.json +3 -9
  211. package/dist/.next/.next/server/chunks/90.js +0 -1
  212. package/dist/.next/.next/static/chunks/app/page-36ed30b2266617f3.js +0 -1
  213. package/dist/.next/server/chunks/90.js +0 -1
  214. package/dist/.next/static/chunks/app/page-36ed30b2266617f3.js +0 -1
  215. package/dist/app/app/api/cloudflare/route.js +0 -150
  216. package/dist/app/app/api/databases/route.js +0 -71
  217. package/dist/app/app/api/migrations/sync/route.js +0 -174
  218. package/dist/app/app/api/migrations/sync-files/route.js +0 -172
  219. package/dist/app/app/api/pull-data/confirm/route.js +0 -230
  220. package/dist/app/app/api/pull-remote/confirm/route.js +0 -278
  221. package/dist/app/app/api/pull-remote/preview/route.js +0 -144
  222. package/dist/app/app/api/push-remote/confirm/route.js +0 -196
  223. package/dist/app/app/api/push-remote/preview/route.js +0 -179
  224. package/dist/app/app/api/query/route.js +0 -168
  225. package/dist/app/app/api/tables/[name]/route.js +0 -174
  226. package/dist/app/app/api/tables/route.js +0 -178
  227. package/dist/app/app/api/update/route.js +0 -45
  228. package/dist/app/app/globals.css +0 -93
  229. package/dist/app/app/layout.jsx +0 -35
  230. package/dist/app/app/page.jsx +0 -34
  231. package/next.config.mjs +0 -18
  232. package/postcss.config.mjs +0 -8
  233. package/scripts/studio.js +0 -199
  234. package/scripts/test.js +0 -366
  235. package/src/app/api/cloudflare/route.js +0 -150
  236. package/src/app/api/databases/route.js +0 -71
  237. package/src/app/api/migrations/sync/route.js +0 -174
  238. package/src/app/api/migrations/sync-files/route.js +0 -172
  239. package/src/app/api/pull-data/confirm/route.js +0 -230
  240. package/src/app/api/pull-remote/confirm/route.js +0 -278
  241. package/src/app/api/pull-remote/preview/route.js +0 -144
  242. package/src/app/api/push-remote/confirm/route.js +0 -196
  243. package/src/app/api/push-remote/preview/route.js +0 -179
  244. package/src/app/api/query/route.js +0 -168
  245. package/src/app/api/tables/[name]/route.js +0 -174
  246. package/src/app/api/tables/route.js +0 -178
  247. package/src/app/api/update/route.js +0 -45
  248. package/src/app/globals.css +0 -93
  249. package/src/app/layout.jsx +0 -35
  250. package/src/app/page.jsx +0 -34
  251. package/src/components/cloudflare-credentials-modal.jsx +0 -94
  252. package/src/components/column-selector.jsx +0 -133
  253. package/src/components/column-sorting.jsx +0 -65
  254. package/src/components/delete-records-dialog.jsx +0 -64
  255. package/src/components/download-button.jsx +0 -205
  256. package/src/components/edit-error-alert.jsx +0 -30
  257. package/src/components/editable-cell.jsx +0 -163
  258. package/src/components/editable-row.jsx +0 -169
  259. package/src/components/environment-handler.jsx +0 -332
  260. package/src/components/environment-select.jsx +0 -62
  261. package/src/components/pull-preview-toast.jsx +0 -215
  262. package/src/components/push-error-alert.jsx +0 -72
  263. package/src/components/push-preview-toast.jsx +0 -183
  264. package/src/components/query-results.jsx +0 -112
  265. package/src/components/refresh-button.jsx +0 -61
  266. package/src/components/resize-columns.jsx +0 -101
  267. package/src/components/sidebar.jsx +0 -254
  268. package/src/components/sql-editor.jsx +0 -411
  269. package/src/components/sql-error-display.jsx +0 -167
  270. package/src/components/sync-migrations-button.jsx +0 -87
  271. package/src/components/table-error-dialog.jsx +0 -65
  272. package/src/components/table-toolbar.jsx +0 -285
  273. package/src/components/table-view.jsx +0 -843
  274. package/src/components/ui/alert.jsx +0 -47
  275. package/src/components/ui/button.jsx +0 -48
  276. package/src/components/ui/card.jsx +0 -50
  277. package/src/components/ui/checkbox.jsx +0 -24
  278. package/src/components/ui/collapsible.jsx +0 -11
  279. package/src/components/ui/dialog.jsx +0 -96
  280. package/src/components/ui/dropdown-menu.jsx +0 -158
  281. package/src/components/ui/input.jsx +0 -19
  282. package/src/components/ui/scroll-area.jsx +0 -40
  283. package/src/components/ui/select.jsx +0 -121
  284. package/src/components/ui/separator.jsx +0 -25
  285. package/src/components/ui/sheet.jsx +0 -109
  286. package/src/components/ui/sidebar.jsx +0 -620
  287. package/src/components/ui/skeleton.jsx +0 -14
  288. package/src/components/ui/table.jsx +0 -86
  289. package/src/components/ui/tabs.jsx +0 -43
  290. package/src/components/ui/toast.jsx +0 -86
  291. package/src/components/ui/toaster.jsx +0 -35
  292. package/src/components/ui/tooltip.jsx +0 -28
  293. package/src/components/update-banner.jsx +0 -93
  294. package/src/context/database-context.js +0 -510
  295. package/src/hooks/use-mobile.jsx +0 -19
  296. package/src/hooks/use-sql-error.ts +0 -23
  297. package/src/hooks/use-toast.js +0 -155
  298. package/src/lib/database-queue.js +0 -37
  299. package/src/lib/error.js +0 -20
  300. package/src/lib/find-wrangler-config.js +0 -74
  301. package/src/lib/license.js +0 -99
  302. package/src/lib/logger.js +0 -58
  303. package/src/lib/migrations.js +0 -415
  304. package/src/lib/parse-sql-error.js +0 -200
  305. package/src/lib/request-deduplication.js +0 -24
  306. package/src/lib/schema-operations.js +0 -106
  307. package/src/lib/sql-error-types.js +0 -14
  308. package/src/lib/sql-operations.js +0 -647
  309. package/src/lib/utils.js +0 -6
  310. package/src/lib/version-utils.js +0 -34
  311. /package/dist/.next/.next/static/{OUHnbB-64afrrZQL0Srn5 → FEsQ9jwPUQv5A3fwg6Opl}/_buildManifest.js +0 -0
  312. /package/dist/.next/.next/static/{OUHnbB-64afrrZQL0Srn5 → FEsQ9jwPUQv5A3fwg6Opl}/_ssgManifest.js +0 -0
  313. /package/dist/.next/.next/static/{ZBTCAyp1kO5FdEHMU-Dw2 → Y9mYu4WBghepP5oT_3OdR}/_buildManifest.js +0 -0
  314. /package/dist/.next/.next/static/{ZBTCAyp1kO5FdEHMU-Dw2 → Y9mYu4WBghepP5oT_3OdR}/_ssgManifest.js +0 -0
  315. /package/dist/.next/.next/static/{bHYW7fgIBDF8-Q33_WPoE → ae3gNmoSGm-R5LJC4UagI}/_buildManifest.js +0 -0
  316. /package/dist/.next/.next/static/{bHYW7fgIBDF8-Q33_WPoE → ae3gNmoSGm-R5LJC4UagI}/_ssgManifest.js +0 -0
  317. /package/dist/.next/{static/ZBTCAyp1kO5FdEHMU-Dw2 → .next/static/bKfUJeuvAQlBmR3TjrfkH}/_buildManifest.js +0 -0
  318. /package/dist/.next/{static/ZBTCAyp1kO5FdEHMU-Dw2 → .next/static/bKfUJeuvAQlBmR3TjrfkH}/_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
- }