d1s 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +7 -0
  2. package/dist/.next/.next/BUILD_ID +1 -0
  3. package/dist/.next/.next/app-build-manifest.json +109 -0
  4. package/dist/.next/.next/app-path-routes-manifest.json +1 -0
  5. package/dist/.next/.next/build-manifest.json +33 -0
  6. package/dist/.next/.next/cache/.rscinfo +1 -0
  7. package/dist/.next/.next/cache/.tsbuildinfo +1 -0
  8. package/dist/.next/.next/cache/webpack/client-production/0.pack +0 -0
  9. package/dist/.next/.next/cache/webpack/client-production/1.pack +0 -0
  10. package/dist/.next/.next/cache/webpack/client-production/2.pack +0 -0
  11. package/dist/.next/.next/cache/webpack/client-production/index.pack +0 -0
  12. package/dist/.next/.next/cache/webpack/client-production/index.pack.old +0 -0
  13. package/dist/.next/.next/cache/webpack/edge-server-production/0.pack +0 -0
  14. package/dist/.next/.next/cache/webpack/edge-server-production/index.pack +0 -0
  15. package/dist/.next/.next/cache/webpack/server-production/0.pack +0 -0
  16. package/dist/.next/.next/cache/webpack/server-production/1.pack +0 -0
  17. package/dist/.next/.next/cache/webpack/server-production/index.pack +0 -0
  18. package/dist/.next/.next/cache/webpack/server-production/index.pack.old +0 -0
  19. package/dist/.next/.next/diagnostics/build-diagnostics.json +6 -0
  20. package/dist/.next/.next/diagnostics/framework.json +1 -0
  21. package/dist/.next/.next/export-marker.json +1 -0
  22. package/dist/.next/.next/images-manifest.json +1 -0
  23. package/dist/.next/.next/next-minimal-server.js.nft.json +1 -0
  24. package/dist/.next/.next/next-server.js.nft.json +1 -0
  25. package/dist/.next/.next/package.json +1 -0
  26. package/dist/.next/.next/prerender-manifest.json +1 -0
  27. package/dist/.next/.next/react-loadable-manifest.json +1 -0
  28. package/dist/.next/.next/required-server-files.json +1 -0
  29. package/dist/.next/.next/routes-manifest.json +1 -0
  30. package/dist/.next/.next/server/app/_not-found/page.js +1 -0
  31. package/dist/.next/.next/server/app/_not-found/page.js.nft.json +1 -0
  32. package/dist/.next/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  33. package/dist/.next/.next/server/app/_not-found.html +1 -0
  34. package/dist/.next/.next/server/app/_not-found.meta +8 -0
  35. package/dist/.next/.next/server/app/_not-found.rsc +16 -0
  36. package/dist/.next/.next/server/app/api/cloudflare/route.js +1 -0
  37. package/dist/.next/.next/server/app/api/cloudflare/route.js.nft.json +1 -0
  38. package/dist/.next/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -0
  39. package/dist/.next/.next/server/app/api/databases/route.js +1 -0
  40. package/dist/.next/.next/server/app/api/databases/route.js.nft.json +1 -0
  41. package/dist/.next/.next/server/app/api/databases/route_client-reference-manifest.js +1 -0
  42. package/dist/.next/.next/server/app/api/migrations/sync/route.js +12 -0
  43. package/dist/.next/.next/server/app/api/migrations/sync/route.js.nft.json +1 -0
  44. package/dist/.next/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -0
  45. package/dist/.next/.next/server/app/api/migrations/sync-files/route.js +1 -0
  46. package/dist/.next/.next/server/app/api/migrations/sync-files/route.js.nft.json +1 -0
  47. package/dist/.next/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -0
  48. package/dist/.next/.next/server/app/api/pull-remote/confirm/route.js +1 -0
  49. package/dist/.next/.next/server/app/api/pull-remote/confirm/route.js.nft.json +1 -0
  50. package/dist/.next/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -0
  51. package/dist/.next/.next/server/app/api/pull-remote/preview/route.js +1 -0
  52. package/dist/.next/.next/server/app/api/pull-remote/preview/route.js.nft.json +1 -0
  53. package/dist/.next/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -0
  54. package/dist/.next/.next/server/app/api/push-remote/confirm/route.js +14 -0
  55. package/dist/.next/.next/server/app/api/push-remote/confirm/route.js.nft.json +1 -0
  56. package/dist/.next/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -0
  57. package/dist/.next/.next/server/app/api/push-remote/preview/route.js +14 -0
  58. package/dist/.next/.next/server/app/api/push-remote/preview/route.js.nft.json +1 -0
  59. package/dist/.next/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -0
  60. package/dist/.next/.next/server/app/api/query/route.js +8 -0
  61. package/dist/.next/.next/server/app/api/query/route.js.nft.json +1 -0
  62. package/dist/.next/.next/server/app/api/query/route_client-reference-manifest.js +1 -0
  63. package/dist/.next/.next/server/app/api/tables/[name]/route.js +5 -0
  64. package/dist/.next/.next/server/app/api/tables/[name]/route.js.nft.json +1 -0
  65. package/dist/.next/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -0
  66. package/dist/.next/.next/server/app/api/tables/route.js +7 -0
  67. package/dist/.next/.next/server/app/api/tables/route.js.nft.json +1 -0
  68. package/dist/.next/.next/server/app/api/tables/route_client-reference-manifest.js +1 -0
  69. package/dist/.next/.next/server/app/index.html +3 -0
  70. package/dist/.next/.next/server/app/index.meta +7 -0
  71. package/dist/.next/.next/server/app/index.rsc +20 -0
  72. package/dist/.next/.next/server/app/page.js +58 -0
  73. package/dist/.next/.next/server/app/page.js.nft.json +1 -0
  74. package/dist/.next/.next/server/app/page_client-reference-manifest.js +1 -0
  75. package/dist/.next/.next/server/app-paths-manifest.json +15 -0
  76. package/dist/.next/.next/server/chunks/336.js +1 -0
  77. package/dist/.next/.next/server/chunks/627.js +6 -0
  78. package/dist/.next/.next/server/chunks/638.js +13 -0
  79. package/dist/.next/.next/server/chunks/801.js +55 -0
  80. package/dist/.next/.next/server/chunks/973.js +2 -0
  81. package/dist/.next/.next/server/chunks/992.js +3 -0
  82. package/dist/.next/.next/server/functions-config-manifest.json +1 -0
  83. package/dist/.next/.next/server/interception-route-rewrite-manifest.js +1 -0
  84. package/dist/.next/.next/server/middleware-build-manifest.js +1 -0
  85. package/dist/.next/.next/server/middleware-manifest.json +6 -0
  86. package/dist/.next/.next/server/middleware-react-loadable-manifest.js +1 -0
  87. package/dist/.next/.next/server/next-font-manifest.js +1 -0
  88. package/dist/.next/.next/server/next-font-manifest.json +1 -0
  89. package/dist/.next/.next/server/pages/404.html +1 -0
  90. package/dist/.next/.next/server/pages/500.html +1 -0
  91. package/dist/.next/.next/server/pages/_app.js +1 -0
  92. package/dist/.next/.next/server/pages/_app.js.nft.json +1 -0
  93. package/dist/.next/.next/server/pages/_document.js +1 -0
  94. package/dist/.next/.next/server/pages/_document.js.nft.json +1 -0
  95. package/dist/.next/.next/server/pages/_error.js +1 -0
  96. package/dist/.next/.next/server/pages/_error.js.nft.json +1 -0
  97. package/dist/.next/.next/server/pages-manifest.json +1 -0
  98. package/dist/.next/.next/server/server-reference-manifest.js +1 -0
  99. package/dist/.next/.next/server/server-reference-manifest.json +1 -0
  100. package/dist/.next/.next/server/webpack-runtime.js +1 -0
  101. package/dist/.next/.next/static/ODMSSwVqLoDcBgbFHUjr8/_buildManifest.js +1 -0
  102. package/dist/.next/.next/static/ODMSSwVqLoDcBgbFHUjr8/_ssgManifest.js +1 -0
  103. package/dist/.next/.next/static/chunks/422-6fa3c14fc64ad67b.js +1 -0
  104. package/dist/.next/.next/static/chunks/4bd1b696-8c908eb707f85a27.js +1 -0
  105. package/dist/.next/.next/static/chunks/517-3b698a5d3da06ff7.js +2 -0
  106. package/dist/.next/.next/static/chunks/692-ede418e1d28a1394.js +1 -0
  107. package/dist/.next/.next/static/chunks/735-c9144179c6bd7d06.js +1 -0
  108. package/dist/.next/.next/static/chunks/92-c4466e0f1ca8a3a8.js +1 -0
  109. package/dist/.next/.next/static/chunks/app/_not-found/page-b786c3dd79ad15a5.js +1 -0
  110. package/dist/.next/.next/static/chunks/app/api/cloudflare/route-3458d78022185d7f.js +1 -0
  111. package/dist/.next/.next/static/chunks/app/api/databases/route-64255424877a9f72.js +1 -0
  112. package/dist/.next/.next/static/chunks/app/api/migrations/sync/route-03766b3afcf043ba.js +1 -0
  113. package/dist/.next/.next/static/chunks/app/api/migrations/sync-files/route-02fa291c8000dadf.js +1 -0
  114. package/dist/.next/.next/static/chunks/app/api/pull-remote/confirm/route-7e05bb8920127abe.js +1 -0
  115. package/dist/.next/.next/static/chunks/app/api/pull-remote/preview/route-0fa15f783e8a306c.js +1 -0
  116. package/dist/.next/.next/static/chunks/app/api/push-remote/confirm/route-96691f1880e4ed14.js +1 -0
  117. package/dist/.next/.next/static/chunks/app/api/push-remote/preview/route-a798679c67374552.js +1 -0
  118. package/dist/.next/.next/static/chunks/app/api/query/route-e90d0030a5083e20.js +1 -0
  119. package/dist/.next/.next/static/chunks/app/api/tables/[name]/route-1efe63e73b480e58.js +1 -0
  120. package/dist/.next/.next/static/chunks/app/api/tables/route-3772b4f480c4b4a4.js +1 -0
  121. package/dist/.next/.next/static/chunks/app/layout-8360fab69b848283.js +1 -0
  122. package/dist/.next/.next/static/chunks/app/page-75081ac7a88cb706.js +1 -0
  123. package/dist/.next/.next/static/chunks/framework-d29117d969504448.js +1 -0
  124. package/dist/.next/.next/static/chunks/main-8d0ab17774ffa031.js +1 -0
  125. package/dist/.next/.next/static/chunks/main-app-d36cdfb402b40f13.js +1 -0
  126. package/dist/.next/.next/static/chunks/pages/_app-d23763e3e6c904ff.js +1 -0
  127. package/dist/.next/.next/static/chunks/pages/_error-9b7125ad1a1e68fa.js +1 -0
  128. package/dist/.next/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  129. package/dist/.next/.next/static/chunks/webpack-c76ac1e586b2802a.js +1 -0
  130. package/dist/.next/.next/static/css/c51a7ef325e30c16.css +3 -0
  131. package/dist/.next/.next/static/media/569ce4b8f30dc480-s.p.woff2 +0 -0
  132. package/dist/.next/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  133. package/dist/.next/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  134. package/dist/.next/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  135. package/dist/.next/.next/trace +3 -0
  136. package/dist/.next/.next/types/app/api/cloudflare/route.ts +347 -0
  137. package/dist/.next/.next/types/app/api/databases/route.ts +347 -0
  138. package/dist/.next/.next/types/app/api/migrations/sync/route.ts +347 -0
  139. package/dist/.next/.next/types/app/api/migrations/sync-files/route.ts +347 -0
  140. package/dist/.next/.next/types/app/api/pull-remote/confirm/route.ts +347 -0
  141. package/dist/.next/.next/types/app/api/pull-remote/preview/route.ts +347 -0
  142. package/dist/.next/.next/types/app/api/push-remote/confirm/route.ts +347 -0
  143. package/dist/.next/.next/types/app/api/push-remote/preview/route.ts +347 -0
  144. package/dist/.next/.next/types/app/api/query/route.ts +347 -0
  145. package/dist/.next/.next/types/app/api/tables/[name]/route.ts +347 -0
  146. package/dist/.next/.next/types/app/api/tables/route.ts +347 -0
  147. package/dist/.next/.next/types/app/page.ts +84 -0
  148. package/dist/.next/.next/types/cache-life.d.ts +141 -0
  149. package/dist/.next/.next/types/package.json +1 -0
  150. package/dist/.next/BUILD_ID +1 -0
  151. package/dist/.next/app-build-manifest.json +109 -0
  152. package/dist/.next/app-path-routes-manifest.json +1 -0
  153. package/dist/.next/build-manifest.json +33 -0
  154. package/dist/.next/cache/.rscinfo +1 -0
  155. package/dist/.next/cache/.tsbuildinfo +1 -0
  156. package/dist/.next/cache/webpack/client-production/0.pack +0 -0
  157. package/dist/.next/cache/webpack/client-production/index.pack +0 -0
  158. package/dist/.next/cache/webpack/edge-server-production/0.pack +0 -0
  159. package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
  160. package/dist/.next/cache/webpack/server-production/0.pack +0 -0
  161. package/dist/.next/cache/webpack/server-production/index.pack +0 -0
  162. package/dist/.next/diagnostics/build-diagnostics.json +6 -0
  163. package/dist/.next/diagnostics/framework.json +1 -0
  164. package/dist/.next/export-marker.json +1 -0
  165. package/dist/.next/images-manifest.json +1 -0
  166. package/dist/.next/next-minimal-server.js.nft.json +1 -0
  167. package/dist/.next/next-server.js.nft.json +1 -0
  168. package/dist/.next/package.json +1 -0
  169. package/dist/.next/prerender-manifest.json +1 -0
  170. package/dist/.next/react-loadable-manifest.json +1 -0
  171. package/dist/.next/required-server-files.json +1 -0
  172. package/dist/.next/routes-manifest.json +1 -0
  173. package/dist/.next/server/app/_not-found/page.js +1 -0
  174. package/dist/.next/server/app/_not-found/page.js.nft.json +1 -0
  175. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  176. package/dist/.next/server/app/_not-found.html +1 -0
  177. package/dist/.next/server/app/_not-found.meta +8 -0
  178. package/dist/.next/server/app/_not-found.rsc +16 -0
  179. package/dist/.next/server/app/api/cloudflare/route.js +1 -0
  180. package/dist/.next/server/app/api/cloudflare/route.js.nft.json +1 -0
  181. package/dist/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -0
  182. package/dist/.next/server/app/api/databases/route.js +1 -0
  183. package/dist/.next/server/app/api/databases/route.js.nft.json +1 -0
  184. package/dist/.next/server/app/api/databases/route_client-reference-manifest.js +1 -0
  185. package/dist/.next/server/app/api/migrations/sync/route.js +12 -0
  186. package/dist/.next/server/app/api/migrations/sync/route.js.nft.json +1 -0
  187. package/dist/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -0
  188. package/dist/.next/server/app/api/migrations/sync-files/route.js +1 -0
  189. package/dist/.next/server/app/api/migrations/sync-files/route.js.nft.json +1 -0
  190. package/dist/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -0
  191. package/dist/.next/server/app/api/pull-remote/confirm/route.js +1 -0
  192. package/dist/.next/server/app/api/pull-remote/confirm/route.js.nft.json +1 -0
  193. package/dist/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -0
  194. package/dist/.next/server/app/api/pull-remote/preview/route.js +1 -0
  195. package/dist/.next/server/app/api/pull-remote/preview/route.js.nft.json +1 -0
  196. package/dist/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -0
  197. package/dist/.next/server/app/api/push-remote/confirm/route.js +14 -0
  198. package/dist/.next/server/app/api/push-remote/confirm/route.js.nft.json +1 -0
  199. package/dist/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -0
  200. package/dist/.next/server/app/api/push-remote/preview/route.js +14 -0
  201. package/dist/.next/server/app/api/push-remote/preview/route.js.nft.json +1 -0
  202. package/dist/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -0
  203. package/dist/.next/server/app/api/query/route.js +8 -0
  204. package/dist/.next/server/app/api/query/route.js.nft.json +1 -0
  205. package/dist/.next/server/app/api/query/route_client-reference-manifest.js +1 -0
  206. package/dist/.next/server/app/api/tables/[name]/route.js +5 -0
  207. package/dist/.next/server/app/api/tables/[name]/route.js.nft.json +1 -0
  208. package/dist/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -0
  209. package/dist/.next/server/app/api/tables/route.js +7 -0
  210. package/dist/.next/server/app/api/tables/route.js.nft.json +1 -0
  211. package/dist/.next/server/app/api/tables/route_client-reference-manifest.js +1 -0
  212. package/dist/.next/server/app/index.html +3 -0
  213. package/dist/.next/server/app/index.meta +7 -0
  214. package/dist/.next/server/app/index.rsc +20 -0
  215. package/dist/.next/server/app/page.js +58 -0
  216. package/dist/.next/server/app/page.js.nft.json +1 -0
  217. package/dist/.next/server/app/page_client-reference-manifest.js +1 -0
  218. package/dist/.next/server/app-paths-manifest.json +15 -0
  219. package/dist/.next/server/chunks/336.js +1 -0
  220. package/dist/.next/server/chunks/627.js +6 -0
  221. package/dist/.next/server/chunks/638.js +13 -0
  222. package/dist/.next/server/chunks/801.js +55 -0
  223. package/dist/.next/server/chunks/973.js +2 -0
  224. package/dist/.next/server/chunks/992.js +3 -0
  225. package/dist/.next/server/functions-config-manifest.json +1 -0
  226. package/dist/.next/server/interception-route-rewrite-manifest.js +1 -0
  227. package/dist/.next/server/middleware-build-manifest.js +1 -0
  228. package/dist/.next/server/middleware-manifest.json +6 -0
  229. package/dist/.next/server/middleware-react-loadable-manifest.js +1 -0
  230. package/dist/.next/server/next-font-manifest.js +1 -0
  231. package/dist/.next/server/next-font-manifest.json +1 -0
  232. package/dist/.next/server/pages/404.html +1 -0
  233. package/dist/.next/server/pages/500.html +1 -0
  234. package/dist/.next/server/pages/_app.js +1 -0
  235. package/dist/.next/server/pages/_app.js.nft.json +1 -0
  236. package/dist/.next/server/pages/_document.js +1 -0
  237. package/dist/.next/server/pages/_document.js.nft.json +1 -0
  238. package/dist/.next/server/pages/_error.js +1 -0
  239. package/dist/.next/server/pages/_error.js.nft.json +1 -0
  240. package/dist/.next/server/pages-manifest.json +1 -0
  241. package/dist/.next/server/server-reference-manifest.js +1 -0
  242. package/dist/.next/server/server-reference-manifest.json +1 -0
  243. package/dist/.next/server/webpack-runtime.js +1 -0
  244. package/dist/.next/static/OmPVuV0d1lrcjSBQzxkdH/_buildManifest.js +1 -0
  245. package/dist/.next/static/OmPVuV0d1lrcjSBQzxkdH/_ssgManifest.js +1 -0
  246. package/dist/.next/static/chunks/422-6fa3c14fc64ad67b.js +1 -0
  247. package/dist/.next/static/chunks/4bd1b696-8c908eb707f85a27.js +1 -0
  248. package/dist/.next/static/chunks/517-3b698a5d3da06ff7.js +2 -0
  249. package/dist/.next/static/chunks/692-ede418e1d28a1394.js +1 -0
  250. package/dist/.next/static/chunks/735-c9144179c6bd7d06.js +1 -0
  251. package/dist/.next/static/chunks/92-c4466e0f1ca8a3a8.js +1 -0
  252. package/dist/.next/static/chunks/app/_not-found/page-b786c3dd79ad15a5.js +1 -0
  253. package/dist/.next/static/chunks/app/api/cloudflare/route-3458d78022185d7f.js +1 -0
  254. package/dist/.next/static/chunks/app/api/databases/route-64255424877a9f72.js +1 -0
  255. package/dist/.next/static/chunks/app/api/migrations/sync/route-03766b3afcf043ba.js +1 -0
  256. package/dist/.next/static/chunks/app/api/migrations/sync-files/route-02fa291c8000dadf.js +1 -0
  257. package/dist/.next/static/chunks/app/api/pull-remote/confirm/route-7e05bb8920127abe.js +1 -0
  258. package/dist/.next/static/chunks/app/api/pull-remote/preview/route-0fa15f783e8a306c.js +1 -0
  259. package/dist/.next/static/chunks/app/api/push-remote/confirm/route-96691f1880e4ed14.js +1 -0
  260. package/dist/.next/static/chunks/app/api/push-remote/preview/route-a798679c67374552.js +1 -0
  261. package/dist/.next/static/chunks/app/api/query/route-e90d0030a5083e20.js +1 -0
  262. package/dist/.next/static/chunks/app/api/tables/[name]/route-1efe63e73b480e58.js +1 -0
  263. package/dist/.next/static/chunks/app/api/tables/route-3772b4f480c4b4a4.js +1 -0
  264. package/dist/.next/static/chunks/app/layout-8360fab69b848283.js +1 -0
  265. package/dist/.next/static/chunks/app/page-75081ac7a88cb706.js +1 -0
  266. package/dist/.next/static/chunks/framework-d29117d969504448.js +1 -0
  267. package/dist/.next/static/chunks/main-8d0ab17774ffa031.js +1 -0
  268. package/dist/.next/static/chunks/main-app-d36cdfb402b40f13.js +1 -0
  269. package/dist/.next/static/chunks/pages/_app-d23763e3e6c904ff.js +1 -0
  270. package/dist/.next/static/chunks/pages/_error-9b7125ad1a1e68fa.js +1 -0
  271. package/dist/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  272. package/dist/.next/static/chunks/webpack-c76ac1e586b2802a.js +1 -0
  273. package/dist/.next/static/css/c51a7ef325e30c16.css +3 -0
  274. package/dist/.next/static/media/569ce4b8f30dc480-s.p.woff2 +0 -0
  275. package/dist/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  276. package/dist/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  277. package/dist/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  278. package/dist/.next/trace +13 -0
  279. package/dist/.next/types/app/api/cloudflare/route.ts +347 -0
  280. package/dist/.next/types/app/api/databases/route.ts +347 -0
  281. package/dist/.next/types/app/api/migrations/sync/route.ts +347 -0
  282. package/dist/.next/types/app/api/migrations/sync-files/route.ts +347 -0
  283. package/dist/.next/types/app/api/pull-remote/confirm/route.ts +347 -0
  284. package/dist/.next/types/app/api/pull-remote/preview/route.ts +347 -0
  285. package/dist/.next/types/app/api/push-remote/confirm/route.ts +347 -0
  286. package/dist/.next/types/app/api/push-remote/preview/route.ts +347 -0
  287. package/dist/.next/types/app/api/query/route.ts +347 -0
  288. package/dist/.next/types/app/api/tables/[name]/route.ts +347 -0
  289. package/dist/.next/types/app/api/tables/route.ts +347 -0
  290. package/dist/.next/types/app/page.ts +84 -0
  291. package/dist/.next/types/cache-life.d.ts +141 -0
  292. package/dist/.next/types/package.json +1 -0
  293. package/dist/app/api/cloudflare/route.js +146 -0
  294. package/dist/app/api/databases/route.js +72 -0
  295. package/dist/app/api/migrations/sync/route.js +172 -0
  296. package/dist/app/api/migrations/sync-files/route.js +172 -0
  297. package/dist/app/api/pull-remote/confirm/route.js +277 -0
  298. package/dist/app/api/pull-remote/preview/route.js +143 -0
  299. package/dist/app/api/push-remote/confirm/route.js +196 -0
  300. package/dist/app/api/push-remote/preview/route.js +178 -0
  301. package/dist/app/api/query/route.js +160 -0
  302. package/dist/app/api/tables/[name]/route.js +173 -0
  303. package/dist/app/api/tables/route.js +174 -0
  304. package/dist/app/app/api/cloudflare/route.js +146 -0
  305. package/dist/app/app/api/databases/route.js +72 -0
  306. package/dist/app/app/api/migrations/sync/route.js +172 -0
  307. package/dist/app/app/api/migrations/sync-files/route.js +172 -0
  308. package/dist/app/app/api/pull-remote/confirm/route.js +277 -0
  309. package/dist/app/app/api/pull-remote/preview/route.js +143 -0
  310. package/dist/app/app/api/push-remote/confirm/route.js +196 -0
  311. package/dist/app/app/api/push-remote/preview/route.js +178 -0
  312. package/dist/app/app/api/query/route.js +160 -0
  313. package/dist/app/app/api/tables/[name]/route.js +173 -0
  314. package/dist/app/app/api/tables/route.js +174 -0
  315. package/dist/app/app/globals.css +93 -0
  316. package/dist/app/app/layout.jsx +35 -0
  317. package/dist/app/app/page.jsx +37 -0
  318. package/dist/app/globals.css +93 -0
  319. package/dist/app/layout.jsx +35 -0
  320. package/dist/app/page.jsx +37 -0
  321. package/dist/d1-studio.js +344 -0
  322. package/dist/lib/database-queue.js +33 -0
  323. package/dist/lib/error.js +20 -0
  324. package/dist/lib/find-wrangler-config.js +67 -0
  325. package/dist/lib/license.js +99 -0
  326. package/dist/lib/migrations.js +415 -0
  327. package/dist/lib/parse-sql-error.js +200 -0
  328. package/dist/lib/request-deduplication.js +24 -0
  329. package/dist/lib/schema-operations.js +103 -0
  330. package/dist/lib/sql-error-types.js +14 -0
  331. package/dist/lib/sql-operations.js +557 -0
  332. package/dist/lib/utils.js +6 -0
  333. package/next.config.mjs +18 -0
  334. package/package.json +97 -0
  335. package/postcss.config.mjs +8 -0
  336. package/scripts/studio.js +344 -0
  337. package/scripts/test.js +168 -0
  338. package/src/app/api/cloudflare/route.js +146 -0
  339. package/src/app/api/databases/route.js +72 -0
  340. package/src/app/api/migrations/sync/route.js +172 -0
  341. package/src/app/api/migrations/sync-files/route.js +172 -0
  342. package/src/app/api/pull-remote/confirm/route.js +277 -0
  343. package/src/app/api/pull-remote/preview/route.js +143 -0
  344. package/src/app/api/push-remote/confirm/route.js +196 -0
  345. package/src/app/api/push-remote/preview/route.js +178 -0
  346. package/src/app/api/query/route.js +160 -0
  347. package/src/app/api/tables/[name]/route.js +173 -0
  348. package/src/app/api/tables/route.js +174 -0
  349. package/src/app/globals.css +93 -0
  350. package/src/app/layout.jsx +35 -0
  351. package/src/app/page.jsx +37 -0
  352. package/src/components/cloudflare-credentials-modal.jsx +94 -0
  353. package/src/components/column-selector.jsx +133 -0
  354. package/src/components/column-sorting.jsx +65 -0
  355. package/src/components/delete-records-dialog.jsx +64 -0
  356. package/src/components/download-button.jsx +205 -0
  357. package/src/components/edit-error-alert.jsx +30 -0
  358. package/src/components/editable-cell.jsx +163 -0
  359. package/src/components/editable-row.jsx +169 -0
  360. package/src/components/environment-handler.jsx +278 -0
  361. package/src/components/environment-select.jsx +59 -0
  362. package/src/components/pull-preview-toast.jsx +188 -0
  363. package/src/components/push-error-alert.jsx +72 -0
  364. package/src/components/push-preview-toast.jsx +183 -0
  365. package/src/components/query-results.jsx +112 -0
  366. package/src/components/refresh-button.jsx +61 -0
  367. package/src/components/resize-columns.jsx +101 -0
  368. package/src/components/sidebar.jsx +236 -0
  369. package/src/components/sql-editor.jsx +411 -0
  370. package/src/components/sql-error-display.jsx +167 -0
  371. package/src/components/sync-migrations-button.jsx +87 -0
  372. package/src/components/table-error-dialog.jsx +65 -0
  373. package/src/components/table-toolbar.jsx +285 -0
  374. package/src/components/table-view.jsx +843 -0
  375. package/src/components/ui/alert.jsx +47 -0
  376. package/src/components/ui/button.jsx +48 -0
  377. package/src/components/ui/card.jsx +50 -0
  378. package/src/components/ui/checkbox.jsx +24 -0
  379. package/src/components/ui/collapsible.jsx +11 -0
  380. package/src/components/ui/dialog.jsx +96 -0
  381. package/src/components/ui/dropdown-menu.jsx +158 -0
  382. package/src/components/ui/input.jsx +19 -0
  383. package/src/components/ui/scroll-area.jsx +40 -0
  384. package/src/components/ui/select.jsx +121 -0
  385. package/src/components/ui/separator.jsx +25 -0
  386. package/src/components/ui/sheet.jsx +109 -0
  387. package/src/components/ui/sidebar.jsx +620 -0
  388. package/src/components/ui/skeleton.jsx +14 -0
  389. package/src/components/ui/table.jsx +86 -0
  390. package/src/components/ui/tabs.jsx +43 -0
  391. package/src/components/ui/toast.jsx +86 -0
  392. package/src/components/ui/toaster.jsx +35 -0
  393. package/src/components/ui/tooltip.jsx +28 -0
  394. package/src/context/database-context.js +510 -0
  395. package/src/hooks/use-mobile.jsx +19 -0
  396. package/src/hooks/use-sql-error.ts +23 -0
  397. package/src/hooks/use-toast.js +155 -0
  398. package/src/lib/database-queue.js +33 -0
  399. package/src/lib/error.js +20 -0
  400. package/src/lib/find-wrangler-config.js +67 -0
  401. package/src/lib/license.js +99 -0
  402. package/src/lib/migrations.js +415 -0
  403. package/src/lib/parse-sql-error.js +200 -0
  404. package/src/lib/request-deduplication.js +24 -0
  405. package/src/lib/schema-operations.js +103 -0
  406. package/src/lib/sql-error-types.js +14 -0
  407. package/src/lib/sql-operations.js +557 -0
  408. package/src/lib/utils.js +6 -0
@@ -0,0 +1,72 @@
1
+ // components/push-error-alert.jsx
2
+ 'use client';
3
+
4
+ import React from 'react';
5
+ import { AlertCircle, X, ChevronDown, ChevronUp } from 'lucide-react';
6
+ import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
7
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible";
8
+
9
+ export const PushErrorAlert = ({ error, onDismiss }) => {
10
+ const [showSuggestions, setShowSuggestions] = React.useState(true);
11
+
12
+ if (!error) return null;
13
+
14
+ // Ensure error message is visible by scrolling to it
15
+ useEffect(() => {
16
+ if (error) {
17
+ const alertElement = document.querySelector('.alert-push-error');
18
+ alertElement?.scrollIntoView({ behavior: 'smooth', block: 'start' });
19
+ }
20
+ }, [error]);
21
+
22
+ return (
23
+ <Alert variant="destructive" className="mt-4 mb-4 alert-push-error">
24
+ <AlertCircle className="h-4 w-4" />
25
+ <AlertTitle className="flex items-center justify-between">
26
+ <span>{error.message}</span>
27
+ {onDismiss && (
28
+ <button
29
+ onClick={onDismiss}
30
+ className="p-1 hover:bg-destructive/10 rounded-full"
31
+ >
32
+ <X className="h-4 w-4" />
33
+ </button>
34
+ )}
35
+ </AlertTitle>
36
+
37
+ <AlertDescription className="mt-2">
38
+ <Collapsible
39
+ open={showSuggestions}
40
+ onOpenChange={setShowSuggestions}
41
+ className="space-y-2"
42
+ >
43
+ <CollapsibleTrigger className="flex items-center gap-2 text-sm font-medium">
44
+ {showSuggestions ? (
45
+ <ChevronUp className="h-4 w-4" />
46
+ ) : (
47
+ <ChevronDown className="h-4 w-4" />
48
+ )}
49
+ Suggested Actions
50
+ </CollapsibleTrigger>
51
+
52
+ <CollapsibleContent className="space-y-2">
53
+ {error.details?.suggestions?.map((suggestion, index) => (
54
+ <div
55
+ key={index}
56
+ className="text-sm text-destructive-foreground/80 pl-6"
57
+ >
58
+ • {suggestion}
59
+ </div>
60
+ ))}
61
+ </CollapsibleContent>
62
+ </Collapsible>
63
+
64
+ {error.details?.error && (
65
+ <div className="mt-4 text-sm font-mono bg-destructive/10 p-2 rounded">
66
+ {error.details.error}
67
+ </div>
68
+ )}
69
+ </AlertDescription>
70
+ </Alert>
71
+ );
72
+ };
@@ -0,0 +1,183 @@
1
+ // components/push-preview-toast.jsx
2
+ 'use client';
3
+
4
+ import React, { useEffect, useState } from 'react';
5
+ import { Button } from "@/components/ui/button";
6
+ import { ScrollArea } from "@/components/ui/scroll-area";
7
+ import {
8
+ Table,
9
+ TableBody,
10
+ TableCell,
11
+ TableHead,
12
+ TableHeader,
13
+ TableRow,
14
+ } from "@/components/ui/table";
15
+ import { Loader2, X } from "lucide-react";
16
+ import { cn } from "@/lib/utils";
17
+
18
+ export function PushPreviewToast({
19
+ preview = [],
20
+ onConfirm,
21
+ onCancel,
22
+ isConfirming,
23
+ error,
24
+ isLoading,
25
+ success
26
+ }) {
27
+ const [isDetailsOpen, setIsDetailsOpen] = useState(true);
28
+
29
+ // Handle loading state
30
+ if (isLoading) {
31
+ return (
32
+ <div className="fixed bottom-4 right-4 z-50 font-sans w-[600px]">
33
+ <div className="rounded-lg border p-4 shadow-lg bg-background">
34
+ <div className="flex items-start gap-3">
35
+ <Loader2 className="h-5 w-5 text-neutral-600 shrink-0 mt-0.5 animate-spin" />
36
+ <div className="flex-1 space-y-3">
37
+ <div className="space-y-1">
38
+ <p className="font-medium text-neutral-800">
39
+ Preparing Push Migration
40
+ </p>
41
+ <p className="text-sm text-neutral-600">
42
+ Checking local migrations...
43
+ </p>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ );
50
+ }
51
+
52
+ if (!preview?.length) {
53
+ return (
54
+ <div className="fixed bottom-4 right-4 z-50 w-[600px]">
55
+ <div className="rounded-lg border p-4">
56
+ <p className="text-sm font-medium">No migrations to preview</p>
57
+ </div>
58
+ </div>
59
+ );
60
+ }
61
+
62
+ // Calculate migration stats
63
+ const pendingCount = preview.filter(m => m.action === 'will be applied').length;
64
+ const skippedCount = preview.filter(m => m.action === 'skipped').length;
65
+ const appliedCount = preview.filter(m => m.action === 'applied').length;
66
+
67
+ // Get status style based on action
68
+ const getStatusEmoji = (action) => {
69
+ switch (action) {
70
+ case 'will be applied':
71
+ return '🕒️';
72
+ case 'applied':
73
+ case 'skipped':
74
+ return '✅';
75
+ case 'failed':
76
+ return '❌';
77
+ default:
78
+ return '';
79
+ }
80
+ };
81
+
82
+ return (
83
+ <div className="fixed bottom-4 right-4 z-50 font-sans w-[600px]">
84
+ <div className={cn(
85
+ "rounded-lg border p-4 shadow-lg",
86
+ error ? "bg-destructive/15" : "bg-background"
87
+ )}>
88
+ <div className="flex flex-col gap-3">
89
+ {/* Header */}
90
+ <div className="space-y-2">
91
+ <div className="flex items-center justify-between">
92
+ <h5 className="font-medium text-neutral-900">
93
+ Push Migration Preview
94
+ </h5>
95
+ <button
96
+ onClick={onCancel}
97
+ className="text-neutral-500 hover:text-neutral-900 p-1 rounded-md hover:bg-neutral-100"
98
+ >
99
+ <X className="h-4 w-4" />
100
+ </button>
101
+ </div>
102
+ <p className="text-sm text-neutral-700">
103
+ {pendingCount} migration(s) 🕒️ pending, {skippedCount} to ✅ skip
104
+ </p>
105
+ {/* Status Messages */}
106
+ {error ? (
107
+ <p className="text-sm text-destructive font-medium mt-1">
108
+ {error.message}
109
+ </p>
110
+ ) : success && (
111
+ <p className="text-sm text-green-700 font-medium mt-1">
112
+ {success}
113
+ </p>
114
+ )}
115
+ </div>
116
+
117
+ {/* Migration Details */}
118
+ <div>
119
+ <button
120
+ onClick={() => setIsDetailsOpen(!isDetailsOpen)}
121
+ className="text-sm font-medium hover:underline"
122
+ >
123
+ {isDetailsOpen ? 'Hide Details' : 'Show Details'}
124
+ </button>
125
+
126
+ {isDetailsOpen && (
127
+ <ScrollArea className="h-[480px] mt-2 rounded border border-neutral-200">
128
+ <Table>
129
+ <TableHeader>
130
+ <TableRow>
131
+ <TableHead>Migration</TableHead>
132
+ <TableHead className="text-center w-24">Status</TableHead>
133
+ </TableRow>
134
+ </TableHeader>
135
+ <TableBody>
136
+ {preview.map((item, index) => (
137
+ <TableRow key={index}>
138
+ <TableCell className="font-mono text-xs">
139
+ {item.name}
140
+ </TableCell>
141
+ <TableCell className="text-center align-middle">
142
+ {getStatusEmoji(item.action)}
143
+ </TableCell>
144
+ </TableRow>
145
+ ))}
146
+ </TableBody>
147
+ </Table>
148
+ </ScrollArea>
149
+ )}
150
+ </div>
151
+
152
+ {/* Action Buttons */}
153
+ <div className="flex gap-2 pt-1">
154
+ <Button
155
+ onClick={onConfirm}
156
+ disabled={isConfirming || pendingCount === 0}
157
+ className="flex-1"
158
+ >
159
+ {isConfirming ? (
160
+ <>
161
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" />
162
+ Confirming...
163
+ </>
164
+ ) : (
165
+ 'Confirm Push'
166
+ )}
167
+ </Button>
168
+ <Button
169
+ variant="outline"
170
+ onClick={onCancel}
171
+ disabled={isConfirming}
172
+ className="flex-1"
173
+ >
174
+ Cancel
175
+ </Button>
176
+ </div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ );
181
+ }
182
+
183
+ export default PushPreviewToast;
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
5
+
6
+ function QuerySummary({ results }) {
7
+ if (!results || !Array.isArray(results)) return null;
8
+
9
+ return (
10
+ <div className="text-xs font-medium text-neutral-900 flex items-center gap-2 mb-2">
11
+ {results.length} {results.length === 1 ? 'row' : 'rows'} returned
12
+ </div>
13
+ );
14
+ }
15
+
16
+ /**
17
+ * SQLErrorDisplay now logs the error object received from the parent.
18
+ * It safely handles null/undefined errors and logs them to the console.
19
+ */
20
+ export function SQLErrorDisplay({ error }) {
21
+ console.debug("SQLErrorDisplay - Received error prop:", error);
22
+ // Create a safe fallback error object if needed.
23
+ const safeError =
24
+ error && typeof error.message === 'string'
25
+ ? error
26
+ : { message: 'An unknown error occurred', details: {} };
27
+
28
+ return (
29
+ <div>
30
+ <div className="text-neutral-700 text-sm">{safeError.message}</div>
31
+ {safeError.details?.stderr && (
32
+ <pre className="mt-2 p-2 text-xs text-red-500 whitespace-pre-wrap">
33
+ {safeError.details.stderr}
34
+ </pre>
35
+ )}
36
+ </div>
37
+ );
38
+ }
39
+
40
+ export function SQLResultsView({ query, results }) {
41
+ if (!results?.length) {
42
+ return (
43
+ <div className="text-sm text-neutral-500">
44
+ No results to display.
45
+ </div>
46
+ );
47
+ }
48
+
49
+ // Detect if the query is a PRAGMA table_info query
50
+ const isSchemaQuery = query?.trim().toLowerCase().startsWith('pragma table_info');
51
+
52
+ // Define columns for schema queries
53
+ const schemaColumns = isSchemaQuery
54
+ ? ['Column Name', 'Type', 'Not Null', 'Default Value', 'Primary Key']
55
+ : Object.keys(results[0]);
56
+
57
+ // Format schema rows if it's a schema query
58
+ const formattedResults = isSchemaQuery
59
+ ? results.map((row) => ({
60
+ 'Column Name': row.name,
61
+ 'Type': row.type,
62
+ 'Not Null': row.notnull === 1 ? 'YES' : 'NO',
63
+ 'Default Value': row.dflt_value || '(null)',
64
+ 'Primary Key': row.pk === 1 ? 'YES' : 'NO',
65
+ }))
66
+ : results;
67
+
68
+ return (
69
+ <div className="flex flex-col h-full">
70
+ <QuerySummary results={formattedResults} />
71
+ <div className="flex-1 overflow-auto border rounded-lg">
72
+ <div className="min-w-full">
73
+ <Table>
74
+ <TableHeader>
75
+ <TableRow className="bg-muted/50">
76
+ {schemaColumns.map((column) => (
77
+ <TableHead
78
+ key={column}
79
+ className="font-mono text-xs font-medium text-muted-foreground"
80
+ >
81
+ {column}
82
+ </TableHead>
83
+ ))}
84
+ </TableRow>
85
+ </TableHeader>
86
+ <TableBody>
87
+ {formattedResults.map((row, rowIndex) => (
88
+ <TableRow key={rowIndex} className="hover:bg-muted/50">
89
+ {schemaColumns.map((column) => {
90
+ const value = row[column];
91
+ const displayValue = value === null ? '(null)' : String(value);
92
+
93
+ return (
94
+ <TableCell
95
+ key={`${rowIndex}-${column}`}
96
+ className="font-monospace text-xs whitespace-nowrap"
97
+ >
98
+ {displayValue}
99
+ </TableCell>
100
+ );
101
+ })}
102
+ </TableRow>
103
+ ))}
104
+ </TableBody>
105
+ </Table>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ );
110
+ }
111
+
112
+ export default SQLResultsView;
@@ -0,0 +1,61 @@
1
+ // components/refresh-button.jsx
2
+ 'use client';
3
+
4
+ import React, { memo, useState } from 'react';
5
+ import { Button } from "@/components/ui/button";
6
+ import { RefreshCw, Loader2 } from 'lucide-react';
7
+ import {
8
+ Tooltip,
9
+ TooltipContent,
10
+ TooltipProvider,
11
+ TooltipTrigger,
12
+ } from "@/components/ui/tooltip";
13
+
14
+ const RefreshButton = memo(({ onRefresh, disabled }) => {
15
+ const [isRefreshing, setIsRefreshing] = useState(false);
16
+
17
+ const handleRefresh = async () => {
18
+ if (isRefreshing || disabled) return;
19
+
20
+ setIsRefreshing(true);
21
+ try {
22
+ await onRefresh();
23
+ } catch (error) {
24
+ console.error('Refresh failed:', error);
25
+ } finally {
26
+ // Add a small delay before allowing another refresh
27
+ setTimeout(() => {
28
+ setIsRefreshing(false);
29
+ }, 500);
30
+ }
31
+ };
32
+
33
+ return (
34
+ <TooltipProvider>
35
+ <Tooltip>
36
+ <TooltipTrigger asChild>
37
+ <Button
38
+ variant="outline"
39
+ size="icon"
40
+ onClick={handleRefresh}
41
+ disabled={isRefreshing || disabled}
42
+ className="h-8"
43
+ >
44
+ {isRefreshing ? (
45
+ <Loader2 className="h-4 w-4 animate-spin" />
46
+ ) : (
47
+ <RefreshCw className="h-4 w-4" />
48
+ )}
49
+ </Button>
50
+ </TooltipTrigger>
51
+ <TooltipContent>
52
+ <p>Refresh table data</p>
53
+ </TooltipContent>
54
+ </Tooltip>
55
+ </TooltipProvider>
56
+ );
57
+ });
58
+
59
+ RefreshButton.displayName = 'RefreshButton';
60
+
61
+ export default RefreshButton;
@@ -0,0 +1,101 @@
1
+ // components/resize-columns.jsx
2
+ 'use client';
3
+
4
+ import React, { useState, useCallback, useRef } from 'react';
5
+
6
+ const MIN_COLUMN_WIDTH = 100;
7
+
8
+ /**
9
+ * A resizable table header component.
10
+ */
11
+ export const ResizableHeader = ({
12
+ children,
13
+ width,
14
+ onResize,
15
+ className = ""
16
+ }) => {
17
+ const [isResizing, setIsResizing] = useState(false);
18
+ const headerRef = useRef(null);
19
+
20
+ const startResizing = useCallback((e) => {
21
+ e.preventDefault();
22
+ setIsResizing(true);
23
+
24
+ const startX = e.clientX;
25
+ const startWidth = headerRef.current?.offsetWidth || 0;
26
+
27
+ const handleMouseMove = (e) => {
28
+ if (!headerRef.current) return;
29
+
30
+ // Calculate the new width based on mouse movement
31
+ const diff = e.clientX - startX;
32
+ const newWidth = Math.max(startWidth + diff, MIN_COLUMN_WIDTH);
33
+
34
+ // Update only the current column's width
35
+ onResize(newWidth);
36
+ };
37
+
38
+ const handleMouseUp = () => {
39
+ setIsResizing(false);
40
+ document.removeEventListener("mousemove", handleMouseMove);
41
+ document.removeEventListener("mouseup", handleMouseUp);
42
+ };
43
+
44
+ document.addEventListener("mousemove", handleMouseMove);
45
+ document.addEventListener("mouseup", handleMouseUp);
46
+ }, [onResize]);
47
+
48
+ return (
49
+ <th
50
+ ref={headerRef}
51
+ className={`relative ${className} ${isResizing ? 'select-none' : ''}`}
52
+ style={{ width: `${width}px` }}
53
+ >
54
+ {children}
55
+ <div
56
+ className="absolute top-0 right-0 h-full w-1 cursor-col-resize group hover:bg-neutral-300"
57
+ onMouseDown={startResizing}
58
+ />
59
+ </th>
60
+ );
61
+ };
62
+
63
+ /**
64
+ * A resizable table wrapper component.
65
+ */
66
+ export const ResizableTable = ({
67
+ columns,
68
+ children,
69
+ onColumnsResize,
70
+ className = ""
71
+ }) => {
72
+ const [columnWidths, setColumnWidths] = useState(
73
+ columns.reduce((acc, col) => ({
74
+ ...acc,
75
+ [col.key]: col.width || 150
76
+ }), {})
77
+ );
78
+
79
+ const handleColumnResize = useCallback((columnKey, newWidth) => {
80
+ setColumnWidths((prev) => {
81
+ const updated = { ...prev, [columnKey]: newWidth };
82
+ onColumnsResize?.(updated); // Notify parent of updated widths
83
+ return updated;
84
+ });
85
+ }, [onColumnsResize]);
86
+
87
+ return (
88
+ <div className={`w-full ${className}`}>
89
+ {React.Children.map(children, child => {
90
+ if (React.isValidElement(child)) {
91
+ return React.cloneElement(child, {
92
+ onResize: handleColumnResize, // ✅ Only pass valid props
93
+ });
94
+ }
95
+ return child;
96
+ })}
97
+ </div>
98
+ );
99
+ };
100
+
101
+ export default ResizableTable;