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,37 +0,0 @@
1
- // utils/database-queue.js
2
-
3
- import logger from '@/lib/logger.js';
4
-
5
- class DatabaseQueue {
6
- constructor() {
7
- this.queue = [];
8
- this.isProcessing = false;
9
- }
10
-
11
- async add(operation) {
12
- return new Promise((resolve, reject) => {
13
- this.queue.push({ operation, resolve, reject });
14
- this.processNext();
15
- });
16
- }
17
-
18
- async processNext() {
19
- if (this.isProcessing || this.queue.length === 0) return;
20
-
21
- this.isProcessing = true;
22
- const { operation, resolve, reject } = this.queue.shift();
23
-
24
- try {
25
- const result = await operation();
26
- resolve(result);
27
- } catch (error) {
28
- logger.error('Error processing database queue operation:', error);
29
- reject(error);
30
- } finally {
31
- this.isProcessing = false;
32
- this.processNext();
33
- }
34
- }
35
- }
36
-
37
- export const dbQueue = new DatabaseQueue();
package/src/lib/error.js DELETED
@@ -1,20 +0,0 @@
1
- // lib/errors.js
2
- export class LicenseError extends Error {
3
- constructor(message, type = 'VALIDATION_ERROR') {
4
- super(message);
5
- this.name = 'LicenseError';
6
- this.type = type;
7
- }
8
- }
9
-
10
- export const ErrorTypes = {
11
- LICENSE_NOT_FOUND: 'LICENSE_NOT_FOUND',
12
- EMAIL_MISMATCH: 'EMAIL_MISMATCH',
13
- INACTIVE_LICENSE: 'INACTIVE_LICENSE',
14
- INACTIVE_SUBSCRIPTION: 'INACTIVE_SUBSCRIPTION',
15
- EXPIRED_SUBSCRIPTION: 'EXPIRED_SUBSCRIPTION',
16
- MAX_ACTIVATIONS: 'MAX_ACTIVATIONS',
17
- CONNECTION_ERROR: 'CONNECTION_ERROR',
18
- VALIDATION_ERROR: 'VALIDATION_ERROR',
19
- SAVE_ERROR: 'SAVE_ERROR'
20
- };
@@ -1,74 +0,0 @@
1
- import { readFile } from 'fs/promises';
2
- import { findUp } from 'find-up';
3
- import { parse as parseToml } from '@iarna/toml';
4
- import stripJsonComments from 'strip-json-comments';
5
- import logger from './logger.js';
6
-
7
- let cachedConfig = null;
8
- let cachedProjectPath = null;
9
-
10
- /**
11
- * Finds and parses the Wrangler configuration file.
12
- * This function caches the result so that the configuration is read and logged only once per project path.
13
- *
14
- * @param {string} userProjectPath - The path where to look for the config file
15
- * @returns {Promise<{config: object, projectPath: string}|null>}
16
- */
17
- export async function findWranglerConfig(userProjectPath) {
18
- try {
19
- if (!userProjectPath || typeof userProjectPath !== 'string') {
20
- throw new Error('Project path is required and must be a string');
21
- }
22
-
23
- // Return the cached config if available for the same project path.
24
- if (cachedConfig && cachedProjectPath === userProjectPath) {
25
- return cachedConfig;
26
- }
27
-
28
- // Define the possible configuration file names in priority order.
29
- const possibleFiles = ['wrangler.toml', 'wrangler.json', 'wrangler.jsonc'];
30
- let configPath = null;
31
- let configFileUsed = null;
32
-
33
- // Search for any of the possible config files.
34
- for (const file of possibleFiles) {
35
- configPath = await findUp(file, { cwd: userProjectPath });
36
- if (configPath) {
37
- configFileUsed = file;
38
- break;
39
- }
40
- }
41
-
42
- if (!configPath) {
43
- logger.warn(`No Wrangler configuration file found in: ${userProjectPath}`);
44
- return null;
45
- }
46
-
47
- logger.info(`Found ${configFileUsed} at: ${configPath}`);
48
-
49
- // Read the configuration file.
50
- let configContent = await readFile(configPath, 'utf-8');
51
- let config;
52
-
53
- // Parse based on file type.
54
- if (configFileUsed.endsWith('.toml')) {
55
- config = parseToml(configContent);
56
- } else {
57
- // If it's JSONC, strip comments before parsing.
58
- if (configFileUsed.endsWith('.jsonc')) {
59
- configContent = stripJsonComments(configContent);
60
- }
61
- config = JSON.parse(configContent);
62
- }
63
-
64
- // Cache the result.
65
- cachedConfig = { config, projectPath: userProjectPath };
66
- cachedProjectPath = userProjectPath;
67
-
68
- return cachedConfig;
69
-
70
- } catch (error) {
71
- logger.error(`Error reading Wrangler configuration: ${error.message}`);
72
- throw error;
73
- }
74
- }
@@ -1,99 +0,0 @@
1
- // lib/license.js
2
- import os from 'os';
3
- import { join } from 'path';
4
- import { readFile, writeFile, mkdir } from 'node:fs/promises';
5
- import { createHash } from 'crypto';
6
- import { LicenseError } from './errors.js';
7
-
8
- export async function generateHardwareId() {
9
- const osInfo = {
10
- platform: process.platform,
11
- arch: process.arch,
12
- cpus: os.cpus().length,
13
- hostname: os.hostname(),
14
- username: os.userInfo().username
15
- };
16
-
17
- const systemString = JSON.stringify(osInfo);
18
- return createHash('sha256').update(systemString).digest('hex');
19
- }
20
-
21
- export async function checkLicenseFile() {
22
- const licenseDir = join(os.homedir(), '.d1studio');
23
- const licensePath = join(licenseDir, 'license.json');
24
-
25
- try {
26
- const licenseData = JSON.parse(await readFile(licensePath, 'utf8'));
27
- const hardwareId = await generateHardwareId();
28
-
29
- if (licenseData.hardwareId !== hardwareId) {
30
- return null;
31
- }
32
-
33
- return licenseData;
34
- } catch (error) {
35
- return null;
36
- }
37
- }
38
-
39
- export async function saveLicenseFile(licenseData) {
40
- const licenseDir = join(os.homedir(), '.d1studio');
41
- const licensePath = join(licenseDir, 'license.json');
42
-
43
- try {
44
- await mkdir(licenseDir, { recursive: true });
45
- await writeFile(licensePath, JSON.stringify(licenseData, null, 2));
46
- } catch (error) {
47
- throw new LicenseError('Failed to save license information', 'SAVE_ERROR');
48
- }
49
- }
50
-
51
- export async function validateLicenseRemote(licenseKey, email, hardwareId) {
52
- const baseUrl = process.env.NODE_ENV === 'development'
53
- ? 'http://localhost:4000'
54
- : 'https://d1-studio.com';
55
-
56
- try {
57
- const response = await fetch(`${baseUrl}/api/validate-license`, {
58
- method: 'POST',
59
- headers: {
60
- 'Content-Type': 'application/json',
61
- },
62
- body: JSON.stringify({
63
- licenseKey,
64
- email,
65
- hardwareId
66
- })
67
- });
68
-
69
- const result = await response.json();
70
-
71
- if (!response.ok) {
72
- throw new LicenseError(
73
- result.message || 'License validation failed',
74
- result.type || 'VALIDATION_ERROR'
75
- );
76
- }
77
-
78
- return result;
79
-
80
- } catch (error) {
81
- if (error instanceof LicenseError) {
82
- throw error;
83
- }
84
-
85
- if (error.name === 'TypeError' && error.message.includes('fetch')) {
86
- throw new LicenseError(
87
- process.env.NODE_ENV === 'development'
88
- ? 'Unable to connect to local license validation service. Make sure the development server is running.'
89
- : 'Unable to connect to license server. Please check your internet connection.',
90
- 'CONNECTION_ERROR'
91
- );
92
- }
93
-
94
- throw new LicenseError(
95
- 'An unexpected error occurred during license validation',
96
- 'VALIDATION_ERROR'
97
- );
98
- }
99
- }
package/src/lib/logger.js DELETED
@@ -1,58 +0,0 @@
1
- import winston from 'winston';
2
-
3
- const { combine, timestamp, printf, colorize } = winston.format;
4
-
5
- const isDevelopment = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === undefined;
6
- const isProduction = process.env.NODE_ENV === 'production';
7
- // Check for DEBUG env var which is set by --debug flag
8
- const isDebug = process.env.DEBUG === 'true';
9
-
10
- const logFormat = printf(({ level, message, timestamp, ...metadata }) => {
11
- let msg = `${timestamp} ${level}: ${message}`;
12
- // Add metadata if present
13
- if (Object.keys(metadata).length > 0) {
14
- msg += ` ${JSON.stringify(metadata)}`;
15
- }
16
- return msg;
17
- });
18
-
19
- const logger = winston.createLogger({
20
- // Set log level based on environment and debug flag
21
- level: isDebug ? 'debug' : (isProduction ? 'warn' : 'info'),
22
- format: combine(
23
- timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
24
- colorize(),
25
- logFormat
26
- ),
27
- transports: [
28
- new winston.transports.Console({
29
- level: isDebug ? 'debug' : (isProduction ? 'warn' : 'info'),
30
- silent: process.env.NODE_ENV === 'test'
31
- })
32
- ]
33
- });
34
-
35
- // Add helper methods
36
- logger.logRequest = (method, path, params = {}) => {
37
- logger.debug(`Request: ${method} ${path}`, params);
38
- };
39
-
40
- logger.logError = (error, source = 'unknown') => {
41
- logger.error(`Error in ${source}: ${error.message}`, {
42
- error: error.stack || error.message,
43
- source
44
- });
45
- };
46
-
47
- logger.shouldLog = (level) => {
48
- const currentLevel = logger.level;
49
- const levels = {
50
- error: 0,
51
- warn: 1,
52
- info: 2,
53
- debug: 3
54
- };
55
- return levels[level] <= levels[currentLevel];
56
- };
57
-
58
- export default logger;
@@ -1,415 +0,0 @@
1
- // /lib/migrations.js
2
-
3
- import { readFile } from 'fs/promises';
4
- import { promisify } from 'util';
5
- import { exec } from 'child_process';
6
- import { createHash } from 'crypto';
7
- import { mkdir, writeFile } from 'fs/promises';
8
- import path from 'path';
9
- import {
10
- executeSQL,
11
- ErrorTypes,
12
- formatMigrationContent,
13
- parseStatement,
14
- validateStatement,
15
- Operations,
16
- tableExists
17
- } from './sql-operations.js';
18
- import { analyzeDependencies } from '@/lib/schema-operations';
19
- import logger from './logger.js';
20
-
21
- const execAsync = promisify(exec);
22
-
23
- /**
24
- * Initializes the migrations table.
25
- * For remote environments: table with (id, name, applied_at).
26
- * For local environments: table with (id, name, checksum, applied_at),
27
- * where checksum is optional.
28
- *
29
- * If reset is true (e.g. during a pull operation), the table is cleared.
30
- *
31
- * @param {string} projectDir
32
- * @param {string} databaseName
33
- * @param {('local'|'remote')} environment
34
- * @param {boolean} [reset=false] - If true, clear existing records.
35
- */
36
- export async function initMigrationsTable(projectDir, databaseName, environment = 'local', reset = false) {
37
- const flag = environment === 'remote' ? '--remote' : '--local';
38
- // For remote, keep original D1 schema
39
- const createTableSQL = environment === 'remote'
40
- ? `
41
- CREATE TABLE IF NOT EXISTS d1_migrations (
42
- id INTEGER PRIMARY KEY AUTOINCREMENT,
43
- name TEXT NOT NULL UNIQUE,
44
- applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
45
- );
46
- `
47
- : `
48
- CREATE TABLE IF NOT EXISTS d1_migrations (
49
- id INTEGER PRIMARY KEY AUTOINCREMENT,
50
- name TEXT NOT NULL UNIQUE,
51
- checksum TEXT NULL,
52
- applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
53
- );
54
- `;
55
-
56
- try {
57
- // Create the table if it doesn't exist
58
- await execAsync(
59
- `wrangler d1 execute ${databaseName} ${flag} --command="${createTableSQL.replace(/"/g, '\\"')}"`,
60
- { cwd: projectDir }
61
- );
62
-
63
- if (reset) {
64
- const deleteSQL = `DELETE FROM d1_migrations;`;
65
- await execAsync(
66
- `wrangler d1 execute ${databaseName} ${flag} --command="${deleteSQL.replace(/"/g, '\\"')}"`,
67
- { cwd: projectDir }
68
- );
69
- }
70
- } catch (error) {
71
- logger.error(`Failed to initialize migrations table in ${environment}:`, error);
72
- throw error;
73
- }
74
- }
75
-
76
- /**
77
- * Generate a migration file name using a stable naming convention.
78
- * Format: YYYYMMDDHHMMSS_operation_tablename[optional-description].sql
79
- *
80
- * @param {Object} stmt - The SQL statement object containing type, tableName and optional description
81
- * @returns {string} The formatted migration filename
82
- */
83
- function getMigrationFileName(stmt) {
84
- const timestamp = new Date().toISOString().replace(/[^0-9]/g, '').slice(0, -3);
85
- const operation = stmt.type.toLowerCase().replace(/_/g, '-');
86
-
87
- // Map for non-index operations.
88
- const operationMap = {
89
- 'create-table': 'create-table',
90
- 'alter-table': 'alter-table',
91
- 'drop-table': 'drop-table',
92
- 'drop-index': 'drop-index',
93
- 'create-view': 'create-view',
94
- 'drop-view': 'drop-view',
95
- 'add-foreign-key': 'add-foreign-key',
96
- 'drop-foreign-key': 'drop-foreign-key',
97
- 'add-constraint': 'add-constraint',
98
- 'drop-constraint': 'drop-constraint'
99
- };
100
-
101
- if (stmt.type === 'CREATE_INDEX') {
102
- // For index migrations, simply include the operation and the description.
103
- const desc = stmt.description.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-_]/g, '');
104
- return `${timestamp}_create-index_${desc}.sql`;
105
- } else {
106
- let fileName = `${timestamp}_${operationMap[operation] || operation}_${stmt.tableName}`;
107
- // Append description for alter migrations if available.
108
- if (stmt.type === 'ALTER_TABLE' && stmt.description) {
109
- fileName += `_${stmt.description}`;
110
- }
111
- fileName = fileName.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-_]/g, '');
112
- return fileName + '.sql';
113
- }
114
- }
115
-
116
- /**
117
- * Validates a migration file by reading, parsing, and validating its SQL.
118
- *
119
- * @param {string} filePath - Full path to the migration file.
120
- * @returns {object} Object with `isValid` flag and either the parsed statement or errors.
121
- */
122
- export async function validateMigrationFile(filePath) {
123
- const content = await readFile(filePath, 'utf8');
124
- try {
125
- const statement = parseStatement(content);
126
- validateStatement(statement);
127
- return { isValid: true, statement };
128
- } catch (error) {
129
- return { isValid: false, errors: error };
130
- }
131
- }
132
-
133
- // Get remote migrations
134
- export async function getRemoteMigrations(projectDir, databaseName, env) {
135
- try {
136
- const result = await executeSQL(
137
- projectDir,
138
- databaseName,
139
- 'SELECT name, applied_at FROM d1_migrations ORDER BY applied_at;',
140
- env,
141
- true
142
- );
143
-
144
- if (typeof result === 'string') {
145
- const jsonStart = result.indexOf('[');
146
- if (jsonStart !== -1) {
147
- const jsonStr = result.substring(jsonStart);
148
- const parsed = JSON.parse(jsonStr);
149
- return parsed[0]?.results || [];
150
- }
151
- }
152
- return [];
153
- } catch (error) {
154
- throw {
155
- type: ErrorTypes.EXECUTION_ERROR,
156
- message: 'Failed to get remote migrations',
157
- details: {
158
- error: error.message,
159
- suggestions: [
160
- 'Check remote database permissions',
161
- 'Verify credentials and connection'
162
- ]
163
- }
164
- };
165
- }
166
- }
167
-
168
- /**
169
- * Records (or tracks) a migration.
170
- * For remote, skips checksum.
171
- *
172
- * @param {string} projectDir
173
- * @param {string} databaseName
174
- * @param {Object} migrationData { name, checksum }
175
- * @param {('local'|'remote')} environment
176
- */
177
- export async function trackMigration(projectDir, databaseName, { name, checksum }, environment = 'local') {
178
- const flag = environment === 'remote' ? '--remote' : '--local';
179
-
180
- // For Studio-originated migrations (with checksum), check if we need to add the column
181
- if (environment === 'local' && checksum) {
182
- try {
183
- // Check if checksum column exists
184
- const hasChecksumColumn = await execAsync(
185
- `wrangler d1 execute ${databaseName} ${flag} --command="SELECT checksum FROM d1_migrations LIMIT 1;"`,
186
- { cwd: projectDir }
187
- ).catch(() => false);
188
-
189
- // If column doesn't exist, alter table to add it
190
- if (!hasChecksumColumn) {
191
- await execAsync(
192
- `wrangler d1 execute ${databaseName} ${flag} --command="ALTER TABLE d1_migrations ADD COLUMN checksum TEXT;"`,
193
- { cwd: projectDir }
194
- );
195
- }
196
- } catch (error) {
197
- // Ignore errors - the column might already exist
198
- }
199
- }
200
-
201
- // For Studio migrations (with checksum)
202
- const insertSQL = environment === 'remote' || !checksum
203
- ? `
204
- INSERT OR REPLACE INTO d1_migrations (name, applied_at)
205
- VALUES ('${name}', CURRENT_TIMESTAMP);
206
- `
207
- : `
208
- INSERT OR REPLACE INTO d1_migrations (name, checksum, applied_at)
209
- VALUES ('${name}', '${checksum}', CURRENT_TIMESTAMP);
210
- `;
211
-
212
- try {
213
- await execAsync(
214
- `wrangler d1 execute ${databaseName} ${flag} --command="${insertSQL.replace(/"/g, '\\"')}"`,
215
- { cwd: projectDir }
216
- );
217
- } catch (error) {
218
- logger.error('Failed to track migration:', error);
219
- throw error;
220
- }
221
- }
222
-
223
- /**
224
- * Records a migration (used during push).
225
- * For remote, checksum is omitted.
226
- *
227
- * @param {string} projectDir
228
- * @param {string} databaseName
229
- * @param {Object} migrationData { name, checksum }
230
- * @param {object} env
231
- * @param {boolean} remote
232
- */
233
- export async function recordMigration(projectDir, databaseName, { name, checksum }, env = {}, remote = false) {
234
- // For CLI migrations or remote, don't include checksum
235
- const sql = remote || !checksum
236
- ? `
237
- INSERT OR REPLACE INTO d1_migrations (name, applied_at)
238
- VALUES ('${name}', CURRENT_TIMESTAMP);
239
- `
240
- : `
241
- INSERT OR REPLACE INTO d1_migrations (name, checksum, applied_at)
242
- VALUES ('${name}', '${checksum}', CURRENT_TIMESTAMP);
243
- `;
244
-
245
- try {
246
- await executeSQL(projectDir, databaseName, sql, env, remote);
247
- } catch (error) {
248
- throw {
249
- type: ErrorTypes.EXECUTION_ERROR,
250
- message: `Failed to record migration ${name}`,
251
- details: {
252
- file: name,
253
- error: error.message,
254
- suggestions: ['Check if migration is already recorded']
255
- }
256
- };
257
- }
258
- }
259
-
260
- /**
261
- * Compares local and remote migrations.
262
- *
263
- * @param {string} projectDir
264
- * @param {string} databaseName
265
- * @returns {Promise<Object>} { applied: Array, count: Number }
266
- */
267
- export async function compareMigrations(projectDir, databaseName) {
268
- try {
269
- const migrations = await getRemoteMigrations(projectDir, databaseName, {});
270
- const migrationMap = new Map(migrations.map(m => [m.name, m]));
271
- return {
272
- applied: Array.from(migrationMap.keys()),
273
- count: migrationMap.size
274
- };
275
- } catch (error) {
276
- logger.error('Failed to compare migrations:', error);
277
- throw error;
278
- }
279
- }
280
-
281
- /**
282
- * Generates a SHA256 checksum for migration content.
283
- *
284
- * @param {string} content
285
- * @returns {string}
286
- */
287
- export function createChecksum(content) {
288
- return createHash('sha256').update(content).digest('hex');
289
- }
290
-
291
- /**
292
- * Processes schema changes (DDL) and creates migration files.
293
- * Uses a stable naming convention:
294
- * YYYYMMDDHHMMSS_operation_tablename[optional-description].sql
295
- *
296
- * Executes the SQL, writes the migration file, and tracks it.
297
- * If any part fails, the process aborts (all-or-nothing).
298
- *
299
- * This updated version uses analyzeDependencies to order the changes.
300
- *
301
- * @param {string} projectDir
302
- * @param {string} databaseName
303
- * @param {Array<Object>} statements - Parsed schema change statements.
304
- * Each statement is expected to have at least a `tableName` (if applicable) and `sql` property.
305
- * @returns {Promise<Array>} Array of migration records.
306
- */
307
- export async function handleSchemaChange(projectDir, databaseName, statements) {
308
- try {
309
- const migrationsDir = path.join(projectDir, 'migrations');
310
- await mkdir(migrationsDir, { recursive: true });
311
- const results = [];
312
-
313
- // Partition statements into schema changes and data modifications.
314
- const schemaChanges = [];
315
- const dataModifications = [];
316
- for (const stmt of statements) {
317
- if (stmt.type === Operations.DATA_MODIFICATION) {
318
- dataModifications.push(stmt);
319
- } else {
320
- schemaChanges.push(stmt);
321
- }
322
- }
323
-
324
- // Group schema change statements by table name.
325
- const groupedStatements = new Map();
326
- const NO_TABLE_KEY = '__no_table__';
327
- for (const stmt of schemaChanges) {
328
- const key = stmt.tableName ? stmt.tableName.toLowerCase() : NO_TABLE_KEY;
329
- if (!groupedStatements.has(key)) {
330
- groupedStatements.set(key, []);
331
- }
332
- groupedStatements.get(key).push(stmt);
333
- }
334
-
335
- // For those with a table name, get an ordered list using analyzeDependencies.
336
- const tableKeys = [...groupedStatements.keys()].filter(key => key !== NO_TABLE_KEY);
337
- let orderedTables = [];
338
- if (tableKeys.length > 0) {
339
- const sampleStatements = tableKeys.map(key => groupedStatements.get(key)[0]);
340
- orderedTables = analyzeDependencies(sampleStatements);
341
- }
342
-
343
- // Process schema changes (create migration files).
344
- for (const tableName of orderedTables) {
345
- const stmts = groupedStatements.get(tableName) || [];
346
- for (const stmt of stmts) {
347
- try {
348
- // For DROP TABLE statements, check if the table exists.
349
- if (stmt.type === Operations.DROP_TABLE) {
350
- const exists = await tableExists(projectDir, databaseName, {}, stmt.tableName, false);
351
- if (!exists) {
352
- throw new Error(`no such table: ${stmt.tableName}`);
353
- }
354
- }
355
- // Execute the schema change SQL.
356
- const result = await executeSQL(projectDir, databaseName, stmt.sql);
357
- // Check the output for syntax error messages.
358
- if (
359
- result &&
360
- (result.toLowerCase().includes('syntax error') ||
361
- result.toLowerCase().includes('sqlite_error'))
362
- ) {
363
- throw new Error(result);
364
- }
365
- // Generate a migration file.
366
- const migrationFileName = getMigrationFileName(stmt);
367
- const migrationPath = path.join(migrationsDir, migrationFileName);
368
- const formattedSQL = formatMigrationContent(stmt.sql);
369
- await writeFile(migrationPath, formattedSQL, 'utf8');
370
- // Compute checksum and track the migration.
371
- const checksum = createChecksum(stmt.sql);
372
- await trackMigration(projectDir, databaseName, { name: migrationFileName, checksum }, 'local');
373
- results.push({ type: stmt.type, table: stmt.tableName, migration: migrationFileName, checksum });
374
- } catch (error) {
375
- throw error;
376
- }
377
- }
378
- groupedStatements.delete(tableName);
379
- }
380
-
381
- // Process any remaining schema changes with no table name.
382
- if (groupedStatements.has(NO_TABLE_KEY)) {
383
- for (const stmt of groupedStatements.get(NO_TABLE_KEY)) {
384
- try {
385
- await executeSQL(projectDir, databaseName, stmt.sql);
386
- const migrationFileName = getMigrationFileName(stmt);
387
- const migrationPath = path.join(migrationsDir, migrationFileName);
388
- const formattedSQL = formatMigrationContent(stmt.sql);
389
- await writeFile(migrationPath, formattedSQL, 'utf8');
390
- const checksum = createChecksum(stmt.sql);
391
- await trackMigration(projectDir, databaseName, { name: migrationFileName, checksum }, 'local');
392
- results.push({ type: stmt.type, table: stmt.tableName || null, migration: migrationFileName, checksum });
393
- } catch (error) {
394
- throw error;
395
- }
396
- }
397
- }
398
-
399
- // Now process data modification statements (execute them, but don't create migration files).
400
- for (const stmt of dataModifications) {
401
- try {
402
- await executeSQL(projectDir, databaseName, stmt.sql);
403
- // Record the success of the data modification execution.
404
- results.push({ type: stmt.type, table: stmt.tableName || null, executed: true });
405
- } catch (error) {
406
- throw error;
407
- }
408
- }
409
-
410
- return results;
411
- } catch (error) {
412
- throw error;
413
- }
414
- }
415
-