d1s 0.2.10 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/dist/.next/.next/BUILD_ID +1 -1
  2. package/dist/.next/.next/app-build-manifest.json +33 -33
  3. package/dist/.next/.next/app-path-routes-manifest.json +1 -1
  4. package/dist/.next/.next/build-manifest.json +3 -3
  5. package/dist/.next/.next/cache/.rscinfo +1 -1
  6. package/dist/.next/.next/cache/.tsbuildinfo +1 -1
  7. package/dist/.next/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/dist/.next/.next/cache/webpack/client-production/1.pack +0 -0
  9. package/dist/.next/.next/cache/webpack/client-production/10.pack +0 -0
  10. package/dist/.next/.next/cache/webpack/client-production/11.pack +0 -0
  11. package/dist/.next/.next/cache/webpack/client-production/12.pack +0 -0
  12. package/dist/.next/.next/cache/webpack/client-production/2.pack +0 -0
  13. package/dist/.next/.next/cache/webpack/client-production/3.pack +0 -0
  14. package/dist/.next/.next/cache/webpack/client-production/4.pack +0 -0
  15. package/dist/.next/.next/cache/webpack/client-production/5.pack +0 -0
  16. package/dist/.next/.next/cache/webpack/client-production/6.pack +0 -0
  17. package/dist/.next/.next/cache/webpack/client-production/7.pack +0 -0
  18. package/dist/.next/.next/cache/webpack/client-production/8.pack +0 -0
  19. package/dist/.next/.next/cache/webpack/client-production/9.pack +0 -0
  20. package/dist/.next/.next/cache/webpack/client-production/index.pack +0 -0
  21. package/dist/.next/.next/cache/webpack/client-production/index.pack.old +0 -0
  22. package/dist/.next/.next/cache/webpack/edge-server-production/index.pack +0 -0
  23. package/dist/.next/.next/cache/webpack/server-production/0.pack +0 -0
  24. package/dist/.next/.next/cache/webpack/server-production/1.pack +0 -0
  25. package/dist/.next/.next/cache/webpack/server-production/index.pack +0 -0
  26. package/dist/.next/.next/cache/webpack/server-production/index.pack.old +0 -0
  27. package/dist/.next/.next/next-minimal-server.js.nft.json +1 -1
  28. package/dist/.next/.next/next-server.js.nft.json +1 -1
  29. package/dist/.next/.next/prerender-manifest.json +1 -1
  30. package/dist/.next/.next/required-server-files.json +1 -1
  31. package/dist/.next/.next/server/app/_not-found/page.js +1 -1
  32. package/dist/.next/.next/server/app/_not-found/page.js.nft.json +1 -1
  33. package/dist/.next/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/dist/.next/.next/server/app/_not-found.html +1 -1
  35. package/dist/.next/.next/server/app/_not-found.rsc +4 -4
  36. package/dist/.next/.next/server/app/api/cloudflare/route.js +1 -1
  37. package/dist/.next/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
  38. package/dist/.next/.next/server/app/api/databases/route.js +1 -1
  39. package/dist/.next/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
  40. package/dist/.next/.next/server/app/api/migrations/sync/route.js +5 -5
  41. package/dist/.next/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
  42. package/dist/.next/.next/server/app/api/migrations/sync-files/route.js +3 -3
  43. package/dist/.next/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
  44. package/dist/.next/.next/server/app/api/pull-data/confirm/route.js +1 -1
  45. package/dist/.next/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
  46. package/dist/.next/.next/server/app/api/pull-remote/confirm/route.js +2 -2
  47. package/dist/.next/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
  48. package/dist/.next/.next/server/app/api/pull-remote/preview/route.js +4 -4
  49. package/dist/.next/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
  50. package/dist/.next/.next/server/app/api/push-remote/confirm/route.js +5 -5
  51. package/dist/.next/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
  52. package/dist/.next/.next/server/app/api/push-remote/preview/route.js +4 -4
  53. package/dist/.next/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
  54. package/dist/.next/.next/server/app/api/query/route.js +3 -3
  55. package/dist/.next/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
  56. package/dist/.next/.next/server/app/api/tables/[name]/route.js +5 -5
  57. package/dist/.next/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
  58. package/dist/.next/.next/server/app/api/tables/route.js +2 -2
  59. package/dist/.next/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
  60. package/dist/.next/.next/server/app/api/update/route.js +1 -1
  61. package/dist/.next/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  62. package/dist/.next/.next/server/app/index.html +3 -3
  63. package/dist/.next/.next/server/app/index.rsc +5 -5
  64. package/dist/.next/.next/server/app/page.js +11 -13
  65. package/dist/.next/.next/server/app/page.js.nft.json +1 -1
  66. package/dist/.next/.next/server/app/page_client-reference-manifest.js +1 -1
  67. package/dist/.next/.next/server/app-paths-manifest.json +3 -3
  68. package/dist/.next/.next/server/chunks/226.js +12 -12
  69. package/dist/.next/.next/server/chunks/391.js +5 -5
  70. package/dist/.next/.next/server/chunks/452.js +1 -1
  71. package/dist/.next/.next/server/chunks/572.js +1 -0
  72. package/dist/.next/.next/server/chunks/627.js +3 -3
  73. package/dist/.next/.next/server/chunks/638.js +3 -3
  74. package/dist/.next/.next/server/chunks/992.js +3 -3
  75. package/dist/.next/.next/server/middleware-build-manifest.js +1 -1
  76. package/dist/.next/.next/server/next-font-manifest.js +1 -1
  77. package/dist/.next/.next/server/next-font-manifest.json +1 -1
  78. package/dist/.next/.next/server/pages/404.html +1 -1
  79. package/dist/.next/.next/server/pages/500.html +1 -1
  80. package/dist/.next/.next/server/pages/_app.js +1 -1
  81. package/dist/.next/.next/server/pages/_document.js +1 -1
  82. package/dist/.next/.next/server/pages/_error.js +1 -1
  83. package/dist/.next/.next/server/server-reference-manifest.json +1 -1
  84. package/dist/.next/.next/static/chunks/576-18a2209e1ed26aad.js +1 -0
  85. package/dist/.next/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  86. package/dist/.next/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  87. package/dist/.next/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  88. package/dist/.next/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  89. package/dist/.next/.next/static/css/7c16f57d325d0d7d.css +3 -0
  90. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_buildManifest.js +1 -0
  91. package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_ssgManifest.js +1 -0
  92. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_buildManifest.js +1 -0
  93. package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_ssgManifest.js +1 -0
  94. package/dist/.next/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  95. package/dist/.next/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  96. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_buildManifest.js +1 -0
  97. package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_ssgManifest.js +1 -0
  98. package/dist/.next/.next/trace +3 -3
  99. package/dist/.next/.next/types/app/api/cloudflare/route.ts +1 -1
  100. package/dist/.next/.next/types/app/api/databases/route.ts +1 -1
  101. package/dist/.next/.next/types/app/api/migrations/sync/route.ts +1 -1
  102. package/dist/.next/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  103. package/dist/.next/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  104. package/dist/.next/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  105. package/dist/.next/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  106. package/dist/.next/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  107. package/dist/.next/.next/types/app/api/push-remote/preview/route.ts +1 -1
  108. package/dist/.next/.next/types/app/api/query/route.ts +1 -1
  109. package/dist/.next/.next/types/app/api/tables/[name]/route.ts +1 -1
  110. package/dist/.next/.next/types/app/api/tables/route.ts +1 -1
  111. package/dist/.next/.next/types/app/api/update/route.ts +1 -1
  112. package/dist/.next/.next/types/app/page.ts +1 -1
  113. package/dist/.next/BUILD_ID +1 -1
  114. package/dist/.next/app-build-manifest.json +32 -32
  115. package/dist/.next/app-path-routes-manifest.json +1 -1
  116. package/dist/.next/build-manifest.json +3 -3
  117. package/dist/.next/cache/.rscinfo +1 -1
  118. package/dist/.next/cache/.tsbuildinfo +1 -1
  119. package/dist/.next/cache/webpack/client-production/0.pack +0 -0
  120. package/dist/.next/cache/webpack/client-production/1.pack +0 -0
  121. package/dist/.next/cache/webpack/client-production/2.pack +0 -0
  122. package/dist/.next/cache/webpack/client-production/index.pack +0 -0
  123. package/dist/.next/cache/webpack/client-production/index.pack.old +0 -0
  124. package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
  125. package/dist/.next/cache/webpack/server-production/0.pack +0 -0
  126. package/dist/.next/cache/webpack/server-production/index.pack +0 -0
  127. package/dist/.next/next-minimal-server.js.nft.json +1 -1
  128. package/dist/.next/next-server.js.nft.json +1 -1
  129. package/dist/.next/prerender-manifest.json +1 -1
  130. package/dist/.next/required-server-files.json +1 -1
  131. package/dist/.next/server/app/_not-found/page.js +1 -1
  132. package/dist/.next/server/app/_not-found/page.js.nft.json +1 -1
  133. package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  134. package/dist/.next/server/app/_not-found.html +1 -1
  135. package/dist/.next/server/app/_not-found.rsc +4 -4
  136. package/dist/.next/server/app/api/cloudflare/route.js +1 -1
  137. package/dist/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
  138. package/dist/.next/server/app/api/databases/route.js +1 -1
  139. package/dist/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
  140. package/dist/.next/server/app/api/migrations/sync/route.js +5 -5
  141. package/dist/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
  142. package/dist/.next/server/app/api/migrations/sync-files/route.js +3 -3
  143. package/dist/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
  144. package/dist/.next/server/app/api/pull-data/confirm/route.js +1 -1
  145. package/dist/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
  146. package/dist/.next/server/app/api/pull-remote/confirm/route.js +2 -2
  147. package/dist/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
  148. package/dist/.next/server/app/api/pull-remote/preview/route.js +4 -4
  149. package/dist/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
  150. package/dist/.next/server/app/api/push-remote/confirm/route.js +5 -5
  151. package/dist/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
  152. package/dist/.next/server/app/api/push-remote/preview/route.js +4 -4
  153. package/dist/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
  154. package/dist/.next/server/app/api/query/route.js +3 -3
  155. package/dist/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
  156. package/dist/.next/server/app/api/tables/[name]/route.js +5 -5
  157. package/dist/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
  158. package/dist/.next/server/app/api/tables/route.js +2 -2
  159. package/dist/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
  160. package/dist/.next/server/app/api/update/route.js +1 -1
  161. package/dist/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  162. package/dist/.next/server/app/index.html +3 -3
  163. package/dist/.next/server/app/index.rsc +5 -5
  164. package/dist/.next/server/app/page.js +11 -13
  165. package/dist/.next/server/app/page.js.nft.json +1 -1
  166. package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
  167. package/dist/.next/server/app-paths-manifest.json +2 -2
  168. package/dist/.next/server/chunks/226.js +12 -12
  169. package/dist/.next/server/chunks/391.js +5 -5
  170. package/dist/.next/server/chunks/452.js +1 -1
  171. package/dist/.next/server/chunks/572.js +1 -0
  172. package/dist/.next/server/chunks/627.js +3 -3
  173. package/dist/.next/server/chunks/638.js +3 -3
  174. package/dist/.next/server/chunks/992.js +3 -3
  175. package/dist/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/.next/server/next-font-manifest.js +1 -1
  177. package/dist/.next/server/next-font-manifest.json +1 -1
  178. package/dist/.next/server/pages/404.html +1 -1
  179. package/dist/.next/server/pages/500.html +1 -1
  180. package/dist/.next/server/pages/_app.js +1 -1
  181. package/dist/.next/server/pages/_document.js +1 -1
  182. package/dist/.next/server/pages/_error.js +1 -1
  183. package/dist/.next/server/server-reference-manifest.json +1 -1
  184. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_buildManifest.js +1 -0
  185. package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_ssgManifest.js +1 -0
  186. package/dist/.next/static/chunks/576-18a2209e1ed26aad.js +1 -0
  187. package/dist/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
  188. package/dist/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
  189. package/dist/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
  190. package/dist/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
  191. package/dist/.next/static/css/7c16f57d325d0d7d.css +3 -0
  192. package/dist/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  193. package/dist/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  194. package/dist/.next/trace +3 -16
  195. package/dist/.next/types/app/api/cloudflare/route.ts +1 -1
  196. package/dist/.next/types/app/api/databases/route.ts +1 -1
  197. package/dist/.next/types/app/api/migrations/sync/route.ts +1 -1
  198. package/dist/.next/types/app/api/migrations/sync-files/route.ts +1 -1
  199. package/dist/.next/types/app/api/pull-data/confirm/route.ts +1 -1
  200. package/dist/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
  201. package/dist/.next/types/app/api/pull-remote/preview/route.ts +1 -1
  202. package/dist/.next/types/app/api/push-remote/confirm/route.ts +1 -1
  203. package/dist/.next/types/app/api/push-remote/preview/route.ts +1 -1
  204. package/dist/.next/types/app/api/query/route.ts +1 -1
  205. package/dist/.next/types/app/api/tables/[name]/route.ts +1 -1
  206. package/dist/.next/types/app/api/tables/route.ts +1 -1
  207. package/dist/.next/types/app/api/update/route.ts +1 -1
  208. package/dist/.next/types/app/page.ts +1 -1
  209. package/dist/app/api/tables/[name]/route.js +22 -10
  210. package/dist/app/globals.css +39 -0
  211. package/dist/app/page.jsx +13 -23
  212. package/dist/d1-studio.js +34 -4
  213. package/dist/lib/data-type-handlers.js +426 -0
  214. package/dist/lib/sql-operations.js +32 -8
  215. package/dist/lib/sql-sanitizer.js +233 -0
  216. package/package.json +3 -9
  217. package/dist/.next/.next/cache/webpack/server-production/2.pack +0 -0
  218. package/dist/.next/.next/server/chunks/90.js +0 -1
  219. package/dist/.next/.next/static/chunks/700-dc8f9f08b166c5e6.js +0 -1
  220. package/dist/.next/.next/static/chunks/app/page-16ec561fc8bebb5d.js +0 -1
  221. package/dist/.next/.next/static/css/0c512cea5f3d317a.css +0 -3
  222. package/dist/.next/server/chunks/90.js +0 -1
  223. package/dist/.next/static/chunks/700-dc8f9f08b166c5e6.js +0 -1
  224. package/dist/.next/static/chunks/app/page-16ec561fc8bebb5d.js +0 -1
  225. package/dist/.next/static/css/0c512cea5f3d317a.css +0 -3
  226. package/dist/app/app/api/cloudflare/route.js +0 -150
  227. package/dist/app/app/api/databases/route.js +0 -71
  228. package/dist/app/app/api/migrations/sync/route.js +0 -174
  229. package/dist/app/app/api/migrations/sync-files/route.js +0 -172
  230. package/dist/app/app/api/pull-data/confirm/route.js +0 -230
  231. package/dist/app/app/api/pull-remote/confirm/route.js +0 -278
  232. package/dist/app/app/api/pull-remote/preview/route.js +0 -144
  233. package/dist/app/app/api/push-remote/confirm/route.js +0 -196
  234. package/dist/app/app/api/push-remote/preview/route.js +0 -179
  235. package/dist/app/app/api/query/route.js +0 -168
  236. package/dist/app/app/api/tables/[name]/route.js +0 -174
  237. package/dist/app/app/api/tables/route.js +0 -178
  238. package/dist/app/app/api/update/route.js +0 -45
  239. package/dist/app/app/globals.css +0 -93
  240. package/dist/app/app/layout.jsx +0 -35
  241. package/dist/app/app/page.jsx +0 -44
  242. package/next.config.mjs +0 -18
  243. package/postcss.config.mjs +0 -8
  244. package/scripts/studio.js +0 -169
  245. package/scripts/test.js +0 -366
  246. package/src/app/api/cloudflare/route.js +0 -150
  247. package/src/app/api/databases/route.js +0 -71
  248. package/src/app/api/migrations/sync/route.js +0 -174
  249. package/src/app/api/migrations/sync-files/route.js +0 -172
  250. package/src/app/api/pull-data/confirm/route.js +0 -230
  251. package/src/app/api/pull-remote/confirm/route.js +0 -278
  252. package/src/app/api/pull-remote/preview/route.js +0 -144
  253. package/src/app/api/push-remote/confirm/route.js +0 -196
  254. package/src/app/api/push-remote/preview/route.js +0 -179
  255. package/src/app/api/query/route.js +0 -168
  256. package/src/app/api/tables/[name]/route.js +0 -174
  257. package/src/app/api/tables/route.js +0 -178
  258. package/src/app/api/update/route.js +0 -45
  259. package/src/app/globals.css +0 -93
  260. package/src/app/layout.jsx +0 -35
  261. package/src/app/page.jsx +0 -44
  262. package/src/components/cloudflare-credentials-modal.jsx +0 -94
  263. package/src/components/column-selector.jsx +0 -133
  264. package/src/components/column-sorting.jsx +0 -65
  265. package/src/components/delete-records-dialog.jsx +0 -64
  266. package/src/components/download-button.jsx +0 -205
  267. package/src/components/edit-error-alert.jsx +0 -30
  268. package/src/components/editable-cell.jsx +0 -163
  269. package/src/components/editable-row.jsx +0 -169
  270. package/src/components/environment-handler.jsx +0 -332
  271. package/src/components/environment-select.jsx +0 -62
  272. package/src/components/pull-preview-toast.jsx +0 -215
  273. package/src/components/push-error-alert.jsx +0 -72
  274. package/src/components/push-preview-toast.jsx +0 -183
  275. package/src/components/query-results.jsx +0 -112
  276. package/src/components/refresh-button.jsx +0 -61
  277. package/src/components/resize-columns.jsx +0 -101
  278. package/src/components/sidebar.jsx +0 -254
  279. package/src/components/sql-editor.jsx +0 -411
  280. package/src/components/sql-error-display.jsx +0 -167
  281. package/src/components/sync-migrations-button.jsx +0 -87
  282. package/src/components/table-error-dialog.jsx +0 -65
  283. package/src/components/table-toolbar.jsx +0 -285
  284. package/src/components/table-view.jsx +0 -843
  285. package/src/components/ui/alert.jsx +0 -47
  286. package/src/components/ui/button.jsx +0 -48
  287. package/src/components/ui/card.jsx +0 -50
  288. package/src/components/ui/checkbox.jsx +0 -24
  289. package/src/components/ui/collapsible.jsx +0 -11
  290. package/src/components/ui/dialog.jsx +0 -96
  291. package/src/components/ui/dropdown-menu.jsx +0 -158
  292. package/src/components/ui/input.jsx +0 -19
  293. package/src/components/ui/scroll-area.jsx +0 -40
  294. package/src/components/ui/select.jsx +0 -121
  295. package/src/components/ui/separator.jsx +0 -25
  296. package/src/components/ui/sheet.jsx +0 -109
  297. package/src/components/ui/sidebar.jsx +0 -620
  298. package/src/components/ui/skeleton.jsx +0 -14
  299. package/src/components/ui/table.jsx +0 -86
  300. package/src/components/ui/tabs.jsx +0 -43
  301. package/src/components/ui/toast.jsx +0 -86
  302. package/src/components/ui/toaster.jsx +0 -35
  303. package/src/components/ui/tooltip.jsx +0 -28
  304. package/src/components/update-banner.jsx +0 -93
  305. package/src/context/database-context.js +0 -510
  306. package/src/hooks/use-mobile.jsx +0 -19
  307. package/src/hooks/use-sql-error.ts +0 -23
  308. package/src/hooks/use-toast.js +0 -155
  309. package/src/lib/database-queue.js +0 -37
  310. package/src/lib/error.js +0 -20
  311. package/src/lib/find-wrangler-config.js +0 -74
  312. package/src/lib/license.js +0 -99
  313. package/src/lib/logger.js +0 -58
  314. package/src/lib/migrations.js +0 -415
  315. package/src/lib/parse-sql-error.js +0 -200
  316. package/src/lib/request-deduplication.js +0 -24
  317. package/src/lib/schema-operations.js +0 -106
  318. package/src/lib/sql-error-types.js +0 -14
  319. package/src/lib/sql-operations.js +0 -647
  320. package/src/lib/utils.js +0 -6
  321. package/src/lib/version-utils.js +0 -34
  322. /package/dist/.next/.next/static/{5dBGGUmK5q7of4h5Rahrg → Y9mYu4WBghepP5oT_3OdR}/_buildManifest.js +0 -0
  323. /package/dist/.next/.next/static/{5dBGGUmK5q7of4h5Rahrg → Y9mYu4WBghepP5oT_3OdR}/_ssgManifest.js +0 -0
  324. /package/dist/.next/.next/static/{PflNFnmFsNegSqhzjI6lA → ae3gNmoSGm-R5LJC4UagI}/_buildManifest.js +0 -0
  325. /package/dist/.next/.next/static/{PflNFnmFsNegSqhzjI6lA → ae3gNmoSGm-R5LJC4UagI}/_ssgManifest.js +0 -0
  326. /package/dist/.next/.next/static/{p8875OZM4iDNsPzmoyLe7 → bKfUJeuvAQlBmR3TjrfkH}/_buildManifest.js +0 -0
  327. /package/dist/.next/.next/static/{p8875OZM4iDNsPzmoyLe7 → bKfUJeuvAQlBmR3TjrfkH}/_ssgManifest.js +0 -0
  328. /package/dist/.next/{static 2/5dBGGUmK5q7of4h5Rahrg → .next/static/ejYPqJ2kVicVp5EFWOZIC}/_buildManifest.js +0 -0
  329. /package/dist/.next/{static 2/5dBGGUmK5q7of4h5Rahrg → .next/static/ejYPqJ2kVicVp5EFWOZIC}/_ssgManifest.js +0 -0
package/scripts/test.js DELETED
@@ -1,366 +0,0 @@
1
- // scripts/test.js
2
- import { findWranglerConfig } from '../src/lib/find-wrangler-config.js';
3
- import { fileURLToPath } from 'url';
4
- import { dirname, join } from 'path';
5
- import chalk from 'chalk';
6
- import fs from 'fs/promises';
7
- import os from 'os';
8
- import { exec, execSync } from 'child_process';
9
- import { promisify } from 'util';
10
- import winston from 'winston';
11
- import logger from '../src/lib/logger.js';
12
-
13
- const execAsync = promisify(exec);
14
- const __filename = fileURLToPath(import.meta.url);
15
- const __dirname = dirname(__filename);
16
-
17
- // Mock license data for testing
18
- const mockLicenseData = {
19
- licenseKey: 'test-license-key',
20
- email: 'test@example.com',
21
- hardwareId: 'mock-hardware-id',
22
- end_date: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), // 30 days from now
23
- subscription_status: 'active',
24
- type: 'test',
25
- activatedAt: new Date().toISOString()
26
- };
27
-
28
- // Test configuration file contents
29
- const mockNextConfig = `
30
- /** @type {import('next').NextConfig} */
31
- const nextConfig = {
32
- output: 'standalone',
33
- }
34
- module.exports = nextConfig
35
- `;
36
-
37
- const mockTailwindConfig = `
38
- /** @type {import('tailwindcss').Config} */
39
- module.exports = {
40
- content: [
41
- './src/**/*.{js,ts,jsx,tsx,mdx}',
42
- ],
43
- theme: {
44
- extend: {},
45
- },
46
- plugins: [],
47
- }
48
- `;
49
-
50
- // Test Wrangler config file contents
51
- const mockWranglerConfig = `
52
- [[d1_databases]]
53
- binding = "DB"
54
- database_name = "test_db"
55
- database_id = "test-id"
56
- `;
57
-
58
- // Create mock configuration files in a given directory.
59
- async function createMockConfigs(testDir) {
60
- await fs.writeFile(join(testDir, 'next.config.js'), mockNextConfig);
61
- await fs.writeFile(join(testDir, 'tailwind.config.js'), mockTailwindConfig);
62
- await fs.writeFile(join(testDir, 'wrangler.toml'), mockWranglerConfig);
63
- }
64
-
65
- async function createMockPackageAndDist(testDir) {
66
- const packageJsonPath = join(testDir, 'package.json');
67
- const packageJsonContent = JSON.stringify({
68
- name: "d1-studio",
69
- version: "1.0.0",
70
- main: "dist/d1-studio.js"
71
- }, null, 2);
72
- await fs.writeFile(packageJsonPath, packageJsonContent);
73
-
74
- const distDir = join(testDir, 'dist');
75
- await fs.mkdir(distDir, { recursive: true });
76
- const d1StudioPath = join(distDir, 'd1-studio.js');
77
- const d1StudioContent = `#!/usr/bin/env node
78
- if (process.argv.includes('--version')) {
79
- console.log('1.0.0');
80
- } else {
81
- console.log('D1 Studio CLI');
82
- }
83
- `;
84
- await fs.writeFile(d1StudioPath, d1StudioContent);
85
- await fs.chmod(d1StudioPath, 0o755);
86
- }
87
-
88
- async function testProjectStructure() {
89
- console.log('\nTesting project structure...');
90
- const requiredDirs = ['src', 'scripts', 'dist'];
91
- for (const dir of requiredDirs) {
92
- try {
93
- await fs.access(join(__dirname, '..', dir));
94
- console.log(chalk.green(`✓ ${dir} directory exists`));
95
- } catch {
96
- console.warn(chalk.yellow(`⚠ ${dir} directory missing`));
97
- }
98
- }
99
- const testDir = await fs.mkdtemp(join(os.tmpdir(), 'd1-studio-test-'));
100
- await createMockConfigs(testDir);
101
- await createMockPackageAndDist(testDir);
102
- const requiredFiles = [
103
- 'package.json',
104
- 'next.config.js',
105
- 'tailwind.config.js',
106
- 'scripts/studio.js'
107
- ];
108
- for (const file of requiredFiles) {
109
- try {
110
- await fs.access(join(testDir, file));
111
- console.log(chalk.green(`✓ ${file} exists`));
112
- } catch {
113
- console.warn(chalk.yellow(`⚠ ${file} missing or not copied`));
114
- }
115
- }
116
- return testDir;
117
- }
118
-
119
- async function testWranglerConfig(testDir) {
120
- console.log('\nTesting Wrangler configuration...');
121
- try {
122
- const config = await findWranglerConfig(testDir);
123
- if (!config || !config.config.d1_databases) {
124
- console.warn(chalk.yellow('⚠ Valid wrangler.toml test: Config parsing incomplete'));
125
- } else {
126
- console.log(chalk.green('✓ Valid wrangler.toml test passed'));
127
- }
128
- } catch (error) {
129
- console.warn(chalk.yellow('⚠ Valid wrangler.toml test issues:'), error.message);
130
- }
131
- try {
132
- await fs.writeFile(join(testDir, 'wrangler.toml'), 'invalid: config: {');
133
- await findWranglerConfig(testDir);
134
- console.warn(chalk.yellow('⚠ Invalid wrangler.toml test: Did not catch invalid config'));
135
- } catch (error) {
136
- console.log(chalk.green('✓ Invalid wrangler.toml handling test passed'));
137
- }
138
- }
139
-
140
- async function testCaching(testDir) {
141
- console.log('\nTesting caching of findWranglerConfig...');
142
- const config1 = await findWranglerConfig(testDir);
143
- console.log(chalk.green('✓ First call completed.'));
144
- const config2 = await findWranglerConfig(testDir);
145
- console.log(chalk.green('✓ Second call completed.'));
146
- if (JSON.stringify(config1) === JSON.stringify(config2)) {
147
- console.log(chalk.green('✓ Caching works: configurations are identical'));
148
- } else {
149
- console.warn(chalk.yellow('⚠ Caching issue: configurations differ'));
150
- }
151
- const newTestDir = await fs.mkdtemp(join(os.tmpdir(), 'new-d1-studio-test-'));
152
- await fs.writeFile(join(newTestDir, 'wrangler.toml'), mockWranglerConfig);
153
- const configNew = await findWranglerConfig(newTestDir);
154
- console.log(chalk.green('✓ New project configuration loaded.'));
155
- await fs.rm(newTestDir, { recursive: true, force: true });
156
- }
157
-
158
- async function testLoggerBehavior() {
159
- console.log('\nTesting logger behavior in production mode...');
160
- const { combine, timestamp, colorize, printf } = winston.format;
161
- const logFormat = printf(({ level, message, timestamp }) => {
162
- return `${timestamp} ${level}: ${message}`;
163
- });
164
- const originalNodeEnv = process.env.NODE_ENV;
165
- const originalDebug = process.env.DEBUG;
166
- process.env.NODE_ENV = 'production';
167
- process.env.DEBUG = 'false';
168
- class MemoryTransport extends winston.Transport {
169
- constructor(opts) {
170
- super(opts);
171
- this.logs = [];
172
- }
173
- log(info, callback) {
174
- this.logs.push(info);
175
- callback();
176
- }
177
- }
178
- const memTransport = new MemoryTransport({ level: 'warn' });
179
- logger.configure({
180
- level: 'warn',
181
- format: combine(
182
- timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
183
- colorize(),
184
- logFormat
185
- ),
186
- transports: [
187
- new winston.transports.Console({ level: 'warn', silent: true }),
188
- memTransport
189
- ]
190
- });
191
- logger.debug('Test debug message');
192
- logger.info('Test info message');
193
- logger.warn('Test warn message');
194
- logger.error('Test error message');
195
- await new Promise(resolve => setTimeout(resolve, 100));
196
- const messages = memTransport.logs.map(log => log.message);
197
- if (messages.includes('Test debug message') || messages.includes('Test info message')) {
198
- console.warn(chalk.yellow('⚠ Logger behavior failed in production mode: debug or info messages were logged.'));
199
- } else {
200
- console.log(chalk.green('✓ Logger behavior in production mode passed: only warn/error messages logged.'));
201
- }
202
- logger.clear();
203
- process.env.NODE_ENV = originalNodeEnv;
204
- process.env.DEBUG = originalDebug;
205
- }
206
-
207
- async function testPackageExecution(testDir) {
208
- console.log('\nTesting package execution...');
209
- try {
210
- const destDir = join(testDir, 'node_modules', 'd1studio');
211
- await fs.mkdir(destDir, { recursive: true });
212
- await fs.cp(join(testDir, 'dist'), destDir, { recursive: true });
213
- const d1StudioPath = join(destDir, 'dist', 'd1-studio.js');
214
- try {
215
- await fs.access(d1StudioPath);
216
- console.log(chalk.green(`✓ Found d1-studio.js at ${d1StudioPath}`));
217
- } catch (err) {
218
- throw new Error(`d1-studio.js not found at ${d1StudioPath}`);
219
- }
220
- process.env.NODE_ENV = 'development';
221
- await execAsync('node ./dist/d1-studio.js --version', { cwd: testDir });
222
- console.log(chalk.green('✓ Development mode execution test passed'));
223
- process.env.NODE_ENV = 'production';
224
- await execAsync('node ./node_modules/d1studio/dist/d1-studio.js --version', { cwd: testDir });
225
- console.log(chalk.green('✓ Production mode execution test passed'));
226
- } catch (error) {
227
- console.error(chalk.red('Package execution test failed:', error));
228
- }
229
- }
230
-
231
- async function setupTestPackage(testDir) {
232
- console.log('\nSetting up test package structure...');
233
- try {
234
- const packageDir = join(testDir, 'node_modules', 'd1studio');
235
- await fs.mkdir(packageDir, { recursive: true });
236
- await fs.cp(join(__dirname, '..', 'dist'), packageDir, { recursive: true, force: true });
237
- const packageJson = JSON.parse(
238
- await fs.readFile(join(__dirname, '..', 'package.json'), 'utf8')
239
- );
240
- await fs.writeFile(join(packageDir, 'package.json'), JSON.stringify(packageJson, null, 2));
241
- await fs.chmod(join(packageDir, 'd1-studio.js'), 0o755);
242
- console.log(chalk.green('✓ Package structure created successfully'));
243
- return packageDir;
244
- } catch (error) {
245
- console.error(chalk.red('Failed to setup test package:', error));
246
- throw error;
247
- }
248
- }
249
-
250
- async function copyStudioScript(testDir) {
251
- try {
252
- await fs.mkdir(join(testDir, 'scripts'), { recursive: true });
253
- await fs.copyFile(join(__dirname, 'studio.js'), join(testDir, 'scripts', 'studio.js'));
254
- await fs.chmod(join(testDir, 'scripts', 'studio.js'), 0o755);
255
- console.log(chalk.green('✓ studio.js copied and made executable'));
256
- } catch (error) {
257
- console.error(chalk.red('Failed to copy studio.js:', error));
258
- throw error;
259
- }
260
- }
261
-
262
- async function testStudioScript(testDir) {
263
- console.log('\nTesting studio.js script...');
264
- try {
265
- await copyStudioScript(testDir);
266
- const studioPath = join(testDir, 'scripts', 'studio.js');
267
- const stats = await fs.stat(studioPath);
268
- const isExecutable = (stats.mode & 0o111) !== 0;
269
- if (!isExecutable) {
270
- console.warn(chalk.yellow('⚠ studio.js is not executable'));
271
- await fs.chmod(studioPath, 0o755);
272
- console.log(chalk.green('✓ Made studio.js executable'));
273
- } else {
274
- console.log(chalk.green('✓ studio.js has correct permissions'));
275
- }
276
- const content = await fs.readFile(studioPath, 'utf8');
277
- const requiredImports = ['chalk', 'open', 'findWranglerConfig'];
278
- let missingImports = [];
279
- for (const imp of requiredImports) {
280
- if (!content.includes(imp)) {
281
- missingImports.push(imp);
282
- }
283
- }
284
- if (missingImports.length > 0) {
285
- console.warn(chalk.yellow(`⚠ studio.js missing imports: ${missingImports.join(', ')}`));
286
- } else {
287
- console.log(chalk.green('✓ studio.js contains required imports'));
288
- }
289
- try {
290
- await execAsync('node ./scripts/studio.js --version', {
291
- cwd: testDir,
292
- env: { ...process.env, NODE_PATH: join(testDir, 'node_modules') }
293
- });
294
- console.log(chalk.green('✓ studio.js execution test passed'));
295
- } catch (execError) {
296
- console.warn(chalk.yellow('⚠ studio.js execution test failed:', execError.message));
297
- }
298
- } catch (error) {
299
- console.warn(chalk.yellow('⚠ studio.js test issues:'), error.message);
300
- }
301
- }
302
-
303
- async function testLicenseValidation(testDir) {
304
- console.log('\nTesting license validation...');
305
- const d1StudioDir = join(testDir, '.d1studio');
306
- const licenseFile = join(d1StudioDir, 'license.json');
307
- try {
308
- await fs.mkdir(d1StudioDir, { recursive: true });
309
- await fs.writeFile(licenseFile, JSON.stringify(mockLicenseData, null, 2));
310
- console.log(chalk.green('✓ Successfully created test license file'));
311
- const license = JSON.parse(await fs.readFile(licenseFile, 'utf8'));
312
- const requiredFields = ['licenseKey', 'email', 'hardwareId', 'subscription_status', 'end_date'];
313
- const missingFields = requiredFields.filter(field => !license[field]);
314
- if (missingFields.length > 0) {
315
- console.warn(chalk.yellow(`⚠ License file missing fields: ${missingFields.join(', ')}`));
316
- } else {
317
- console.log(chalk.green('✓ License file structure validated'));
318
- }
319
- const expiredLicense = {
320
- ...mockLicenseData,
321
- end_date: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString() // 1 day ago
322
- };
323
- await fs.writeFile(licenseFile, JSON.stringify(expiredLicense, null, 2));
324
- console.log(chalk.green('✓ Successfully tested expired license scenario'));
325
- const expiringSoonLicense = {
326
- ...mockLicenseData,
327
- end_date: new Date(Date.now() + 5 * 24 * 60 * 60 * 1000).toISOString() // 5 days from now
328
- };
329
- await fs.writeFile(licenseFile, JSON.stringify(expiringSoonLicense, null, 2));
330
- console.log(chalk.green('✓ Successfully tested expiring soon scenario'));
331
- } catch (error) {
332
- console.error(chalk.red('License validation test failed:', error));
333
- }
334
- }
335
-
336
- async function runTests() {
337
- console.log(chalk.blue('Running D1 Studio tests...'));
338
- let testDir = null;
339
- try {
340
- testDir = await testProjectStructure();
341
- await testWranglerConfig(testDir);
342
- await testCaching(testDir);
343
- await testStudioScript(testDir);
344
- await testLicenseValidation(testDir);
345
- await testPackageExecution(testDir);
346
- await testLoggerBehavior();
347
- console.log(chalk.green('\nAll tests completed successfully! 🎉'));
348
- console.log(chalk.blue('\nTest Summary:'));
349
- console.log(chalk.blue('============'));
350
- console.log(chalk.yellow('Check warnings above for any issues that need attention.'));
351
- console.log(chalk.blue('\nTest directory:', testDir));
352
- } catch (error) {
353
- console.error(chalk.red('\nTests failed:', error));
354
- process.exit(1);
355
- } finally {
356
- if (testDir) {
357
- console.log(chalk.blue('\nCleaning up test directory...'));
358
- await fs.rm(testDir, { recursive: true, force: true }).catch(() => {});
359
- }
360
- }
361
- }
362
-
363
- runTests().catch(error => {
364
- console.error(chalk.red('Test suite failed:', error));
365
- process.exit(1);
366
- });
@@ -1,150 +0,0 @@
1
- // api/cloudflare/route.js
2
-
3
- import { NextResponse } from 'next/server';
4
- import { findWranglerConfig } from '@/lib/find-wrangler-config.js';
5
- import logger from '@/lib/logger';
6
-
7
- /**
8
- * Validates the provided Cloudflare credentials by fetching databases.
9
- * @param {string} accountId - Cloudflare account ID.
10
- * @param {string} apiToken - Cloudflare API token.
11
- */
12
- async function validateCredentials(accountId, apiToken) {
13
- const response = await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/d1/database`, {
14
- headers: {
15
- 'Authorization': `Bearer ${apiToken}`,
16
- 'Content-Type': 'application/json',
17
- },
18
- });
19
-
20
- if (!response.ok) {
21
- throw new Error('Invalid Cloudflare credentials');
22
- }
23
-
24
- return response.json();
25
- }
26
-
27
- /**
28
- * Fetches the list of databases from Cloudflare and returns the one that matches the given name.
29
- * @param {string} accountId - Cloudflare account ID.
30
- * @param {string} apiToken - Cloudflare API token.
31
- * @param {string} databaseName - The name of the database to find.
32
- */
33
- async function findDatabase(accountId, apiToken, databaseName) {
34
- const response = await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/d1/database`, {
35
- headers: {
36
- 'Authorization': `Bearer ${apiToken}`,
37
- 'Content-Type': 'application/json',
38
- },
39
- });
40
-
41
- if (!response.ok) {
42
- throw new Error('Failed to fetch databases');
43
- }
44
-
45
- const { result } = await response.json();
46
- return result.find(db => db.name === databaseName);
47
- }
48
-
49
- /**
50
- * Creates a new database on Cloudflare.
51
- * @param {string} accountId - Cloudflare account ID.
52
- * @param {string} apiToken - Cloudflare API token.
53
- * @param {string} databaseName - The name for the new database.
54
- */
55
- async function createDatabase(accountId, apiToken, databaseName) {
56
- const response = await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/d1/database`, {
57
- method: 'POST',
58
- headers: {
59
- 'Authorization': `Bearer ${apiToken}`,
60
- 'Content-Type': 'application/json',
61
- },
62
- body: JSON.stringify({
63
- name: databaseName,
64
- }),
65
- });
66
-
67
- if (!response.ok) {
68
- throw new Error('Failed to create database');
69
- }
70
-
71
- return response.json();
72
- }
73
-
74
- /**
75
- * API POST handler to validate credentials, read the Wrangler configuration, and ensure the D1 database exists.
76
- */
77
- export async function POST(req) {
78
- try {
79
- // Parse accountId and apiToken from the request body.
80
- const { accountId, apiToken } = await req.json();
81
- const projectDir = process.env.D1_PROJECT_DIR;
82
-
83
- // Check if the project directory is set.
84
- if (!projectDir) {
85
- logger.error('Project directory not configured');
86
- return NextResponse.json(
87
- { error: 'Project directory not configured' },
88
- { status: 500 }
89
- );
90
- }
91
-
92
- // Validate Cloudflare credentials.
93
- await validateCredentials(accountId, apiToken);
94
-
95
- // Retrieve the Wrangler configuration using the centralized helper.
96
- const wranglerResult = await findWranglerConfig(projectDir);
97
- if (!wranglerResult || !wranglerResult.config) {
98
- logger.error('No Wrangler configuration file found in project directory');
99
- return NextResponse.json(
100
- { error: 'No Wrangler configuration file found in project directory' },
101
- { status: 404 }
102
- );
103
- }
104
- const config = wranglerResult.config;
105
-
106
- // Ensure that at least one D1 database is configured.
107
- if (!config.d1_databases?.length) {
108
- return NextResponse.json(
109
- { error: 'No D1 databases configured in Wrangler configuration' },
110
- { status: 400 }
111
- );
112
- }
113
-
114
- // Use the first configured D1 database.
115
- const localDb = config.d1_databases[0];
116
-
117
- // Check if the database exists on Cloudflare.
118
- let database = await findDatabase(accountId, apiToken, localDb.database_name);
119
-
120
- // If not found, create the database.
121
- if (!database) {
122
- const result = await createDatabase(accountId, apiToken, localDb.database_name);
123
- database = result.result;
124
- }
125
-
126
- // Return the database details in the response.
127
- return NextResponse.json({
128
- success: true,
129
- database: {
130
- id: database.uuid,
131
- name: database.name,
132
- }
133
- });
134
-
135
- } catch (error) {
136
- logger.error('Cloudflare API error:', error);
137
- return NextResponse.json(
138
- { error: error.message },
139
- { status: error.message.includes('Invalid credentials') ? 401 : 500 }
140
- );
141
- }
142
- }
143
-
144
- /**
145
- * OPTIONS handler for pre-flight requests.
146
- */
147
- export async function OPTIONS() {
148
- return new NextResponse(null, { status: 204 });
149
- }
150
-
@@ -1,71 +0,0 @@
1
- // api/databases/route.js
2
-
3
- import { NextResponse } from 'next/server';
4
- import { findWranglerConfig } from '@/lib/find-wrangler-config.js';
5
- import logger from '@/lib/logger';
6
-
7
- export async function GET() {
8
- try {
9
- const projectDir = process.env.D1_PROJECT_DIR;
10
-
11
- if (!projectDir) {
12
- logger.error('D1_PROJECT_DIR environment variable is not set');
13
- return NextResponse.json(
14
- { error: 'Project directory not configured' },
15
- { status: 500 }
16
- );
17
- }
18
-
19
- // Use findWranglerConfig helper
20
- const wranglerResult = await findWranglerConfig(projectDir);
21
- if (!wranglerResult || !wranglerResult.config) {
22
- return NextResponse.json(
23
- { error: 'No Wrangler configuration file found in project directory' },
24
- { status: 404 }
25
- );
26
- }
27
- const config = wranglerResult.config;
28
-
29
- if (!config.d1_databases?.length) {
30
- return NextResponse.json(
31
- { error: 'No D1 databases configured in Wrangler configuration' },
32
- { status: 404 }
33
- );
34
- }
35
-
36
- return NextResponse.json({
37
- databases: config.d1_databases,
38
- debug: {
39
- projectDir,
40
- // Exposing the path from the helper for debugging consistency
41
- configPath: wranglerResult.configPath || 'N/A',
42
- databaseCount: config.d1_databases.length
43
- }
44
- });
45
- } catch (error) {
46
- logger.error('Error reading database configuration:', error);
47
-
48
- return NextResponse.json(
49
- {
50
- error: 'Failed to read database configuration',
51
- details: error.message,
52
- debug: {
53
- errorCode: error.code,
54
- errorStack: error.stack
55
- }
56
- },
57
- { status: 500 }
58
- );
59
- }
60
- }
61
-
62
- export async function OPTIONS() {
63
- return new NextResponse(null, {
64
- status: 204,
65
- headers: {
66
- 'Access-Control-Allow-Origin': '*',
67
- 'Access-Control-Allow-Methods': 'GET, OPTIONS',
68
- 'Access-Control-Allow-Headers': 'Content-Type',
69
- },
70
- });
71
- }