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.
- package/dist/.next/.next/BUILD_ID +1 -1
- package/dist/.next/.next/app-build-manifest.json +33 -33
- package/dist/.next/.next/app-path-routes-manifest.json +1 -1
- package/dist/.next/.next/build-manifest.json +3 -3
- package/dist/.next/.next/cache/.rscinfo +1 -1
- package/dist/.next/.next/cache/.tsbuildinfo +1 -1
- package/dist/.next/.next/cache/webpack/client-production/0.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/1.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/10.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/11.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/12.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/2.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/3.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/4.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/5.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/6.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/7.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/8.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/9.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/index.pack +0 -0
- package/dist/.next/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/dist/.next/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/dist/.next/.next/cache/webpack/server-production/0.pack +0 -0
- package/dist/.next/.next/cache/webpack/server-production/1.pack +0 -0
- package/dist/.next/.next/cache/webpack/server-production/index.pack +0 -0
- package/dist/.next/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/dist/.next/.next/next-minimal-server.js.nft.json +1 -1
- package/dist/.next/.next/next-server.js.nft.json +1 -1
- package/dist/.next/.next/prerender-manifest.json +1 -1
- package/dist/.next/.next/required-server-files.json +1 -1
- package/dist/.next/.next/server/app/_not-found/page.js +1 -1
- package/dist/.next/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/.next/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/_not-found.html +1 -1
- package/dist/.next/.next/server/app/_not-found.rsc +4 -4
- package/dist/.next/.next/server/app/api/cloudflare/route.js +1 -1
- package/dist/.next/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/databases/route.js +1 -1
- package/dist/.next/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/migrations/sync/route.js +5 -5
- package/dist/.next/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/migrations/sync-files/route.js +3 -3
- package/dist/.next/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/pull-data/confirm/route.js +1 -1
- package/dist/.next/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/pull-remote/confirm/route.js +2 -2
- package/dist/.next/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/pull-remote/preview/route.js +4 -4
- package/dist/.next/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/push-remote/confirm/route.js +5 -5
- package/dist/.next/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/push-remote/preview/route.js +4 -4
- package/dist/.next/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/query/route.js +3 -3
- package/dist/.next/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/tables/[name]/route.js +5 -5
- package/dist/.next/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/tables/route.js +2 -2
- package/dist/.next/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/api/update/route.js +1 -1
- package/dist/.next/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app/index.html +3 -3
- package/dist/.next/.next/server/app/index.rsc +5 -5
- package/dist/.next/.next/server/app/page.js +11 -13
- package/dist/.next/.next/server/app/page.js.nft.json +1 -1
- package/dist/.next/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/.next/.next/server/app-paths-manifest.json +3 -3
- package/dist/.next/.next/server/chunks/226.js +12 -12
- package/dist/.next/.next/server/chunks/391.js +5 -5
- package/dist/.next/.next/server/chunks/452.js +1 -1
- package/dist/.next/.next/server/chunks/572.js +1 -0
- package/dist/.next/.next/server/chunks/627.js +3 -3
- package/dist/.next/.next/server/chunks/638.js +3 -3
- package/dist/.next/.next/server/chunks/992.js +3 -3
- package/dist/.next/.next/server/middleware-build-manifest.js +1 -1
- package/dist/.next/.next/server/next-font-manifest.js +1 -1
- package/dist/.next/.next/server/next-font-manifest.json +1 -1
- package/dist/.next/.next/server/pages/404.html +1 -1
- package/dist/.next/.next/server/pages/500.html +1 -1
- package/dist/.next/.next/server/pages/_app.js +1 -1
- package/dist/.next/.next/server/pages/_document.js +1 -1
- package/dist/.next/.next/server/pages/_error.js +1 -1
- package/dist/.next/.next/server/server-reference-manifest.json +1 -1
- package/dist/.next/.next/static/chunks/576-18a2209e1ed26aad.js +1 -0
- package/dist/.next/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
- package/dist/.next/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
- package/dist/.next/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
- package/dist/.next/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
- package/dist/.next/.next/static/css/7c16f57d325d0d7d.css +3 -0
- package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_buildManifest.js +1 -0
- package/dist/.next/.next/static/gABGrAoO8IPArDo_Ns_7g/_ssgManifest.js +1 -0
- package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_buildManifest.js +1 -0
- package/dist/.next/.next/static/gh-QfIUVo4FTTduYCVKT6/_ssgManifest.js +1 -0
- package/dist/.next/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/.next/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_buildManifest.js +1 -0
- package/dist/.next/.next/static/ybCx6L6gHqtODbKmlhU-d/_ssgManifest.js +1 -0
- package/dist/.next/.next/trace +3 -3
- package/dist/.next/.next/types/app/api/cloudflare/route.ts +1 -1
- package/dist/.next/.next/types/app/api/databases/route.ts +1 -1
- package/dist/.next/.next/types/app/api/migrations/sync/route.ts +1 -1
- package/dist/.next/.next/types/app/api/migrations/sync-files/route.ts +1 -1
- package/dist/.next/.next/types/app/api/pull-data/confirm/route.ts +1 -1
- package/dist/.next/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
- package/dist/.next/.next/types/app/api/pull-remote/preview/route.ts +1 -1
- package/dist/.next/.next/types/app/api/push-remote/confirm/route.ts +1 -1
- package/dist/.next/.next/types/app/api/push-remote/preview/route.ts +1 -1
- package/dist/.next/.next/types/app/api/query/route.ts +1 -1
- package/dist/.next/.next/types/app/api/tables/[name]/route.ts +1 -1
- package/dist/.next/.next/types/app/api/tables/route.ts +1 -1
- package/dist/.next/.next/types/app/api/update/route.ts +1 -1
- package/dist/.next/.next/types/app/page.ts +1 -1
- package/dist/.next/BUILD_ID +1 -1
- package/dist/.next/app-build-manifest.json +32 -32
- package/dist/.next/app-path-routes-manifest.json +1 -1
- package/dist/.next/build-manifest.json +3 -3
- package/dist/.next/cache/.rscinfo +1 -1
- package/dist/.next/cache/.tsbuildinfo +1 -1
- package/dist/.next/cache/webpack/client-production/0.pack +0 -0
- package/dist/.next/cache/webpack/client-production/1.pack +0 -0
- package/dist/.next/cache/webpack/client-production/2.pack +0 -0
- package/dist/.next/cache/webpack/client-production/index.pack +0 -0
- package/dist/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/dist/.next/cache/webpack/server-production/0.pack +0 -0
- package/dist/.next/cache/webpack/server-production/index.pack +0 -0
- package/dist/.next/next-minimal-server.js.nft.json +1 -1
- package/dist/.next/next-server.js.nft.json +1 -1
- package/dist/.next/prerender-manifest.json +1 -1
- package/dist/.next/required-server-files.json +1 -1
- package/dist/.next/server/app/_not-found/page.js +1 -1
- package/dist/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/_not-found.html +1 -1
- package/dist/.next/server/app/_not-found.rsc +4 -4
- package/dist/.next/server/app/api/cloudflare/route.js +1 -1
- package/dist/.next/server/app/api/cloudflare/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/databases/route.js +1 -1
- package/dist/.next/server/app/api/databases/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/migrations/sync/route.js +5 -5
- package/dist/.next/server/app/api/migrations/sync/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/migrations/sync-files/route.js +3 -3
- package/dist/.next/server/app/api/migrations/sync-files/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/pull-data/confirm/route.js +1 -1
- package/dist/.next/server/app/api/pull-data/confirm/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/pull-remote/confirm/route.js +2 -2
- package/dist/.next/server/app/api/pull-remote/confirm/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/pull-remote/preview/route.js +4 -4
- package/dist/.next/server/app/api/pull-remote/preview/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/push-remote/confirm/route.js +5 -5
- package/dist/.next/server/app/api/push-remote/confirm/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/push-remote/preview/route.js +4 -4
- package/dist/.next/server/app/api/push-remote/preview/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/query/route.js +3 -3
- package/dist/.next/server/app/api/query/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/tables/[name]/route.js +5 -5
- package/dist/.next/server/app/api/tables/[name]/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/tables/route.js +2 -2
- package/dist/.next/server/app/api/tables/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/api/update/route.js +1 -1
- package/dist/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/.next/server/app/index.html +3 -3
- package/dist/.next/server/app/index.rsc +5 -5
- package/dist/.next/server/app/page.js +11 -13
- package/dist/.next/server/app/page.js.nft.json +1 -1
- package/dist/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/.next/server/app-paths-manifest.json +2 -2
- package/dist/.next/server/chunks/226.js +12 -12
- package/dist/.next/server/chunks/391.js +5 -5
- package/dist/.next/server/chunks/452.js +1 -1
- package/dist/.next/server/chunks/572.js +1 -0
- package/dist/.next/server/chunks/627.js +3 -3
- package/dist/.next/server/chunks/638.js +3 -3
- package/dist/.next/server/chunks/992.js +3 -3
- package/dist/.next/server/middleware-build-manifest.js +1 -1
- package/dist/.next/server/next-font-manifest.js +1 -1
- package/dist/.next/server/next-font-manifest.json +1 -1
- package/dist/.next/server/pages/404.html +1 -1
- package/dist/.next/server/pages/500.html +1 -1
- package/dist/.next/server/pages/_app.js +1 -1
- package/dist/.next/server/pages/_document.js +1 -1
- package/dist/.next/server/pages/_error.js +1 -1
- package/dist/.next/server/server-reference-manifest.json +1 -1
- package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_buildManifest.js +1 -0
- package/dist/.next/static/IX-QLbm7scYnyqWeeimal/_ssgManifest.js +1 -0
- package/dist/.next/static/chunks/576-18a2209e1ed26aad.js +1 -0
- package/dist/.next/static/chunks/{92-c4466e0f1ca8a3a8.js → 92-5f7522943fcb72a8.js} +1 -1
- package/dist/.next/static/chunks/app/{layout-be6ee67cf0c92654.js → layout-40ec07d04681ba81.js} +1 -1
- package/dist/.next/static/chunks/app/page-f05cd0fc436bf9bc.js +1 -0
- package/dist/.next/static/chunks/{main-app-fa35024de9bd9284.js → main-app-4506e88db72db4b7.js} +1 -1
- package/dist/.next/static/css/7c16f57d325d0d7d.css +3 -0
- package/dist/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/.next/trace +3 -16
- package/dist/.next/types/app/api/cloudflare/route.ts +1 -1
- package/dist/.next/types/app/api/databases/route.ts +1 -1
- package/dist/.next/types/app/api/migrations/sync/route.ts +1 -1
- package/dist/.next/types/app/api/migrations/sync-files/route.ts +1 -1
- package/dist/.next/types/app/api/pull-data/confirm/route.ts +1 -1
- package/dist/.next/types/app/api/pull-remote/confirm/route.ts +1 -1
- package/dist/.next/types/app/api/pull-remote/preview/route.ts +1 -1
- package/dist/.next/types/app/api/push-remote/confirm/route.ts +1 -1
- package/dist/.next/types/app/api/push-remote/preview/route.ts +1 -1
- package/dist/.next/types/app/api/query/route.ts +1 -1
- package/dist/.next/types/app/api/tables/[name]/route.ts +1 -1
- package/dist/.next/types/app/api/tables/route.ts +1 -1
- package/dist/.next/types/app/api/update/route.ts +1 -1
- package/dist/.next/types/app/page.ts +1 -1
- package/dist/app/api/tables/[name]/route.js +22 -10
- package/dist/app/globals.css +39 -0
- package/dist/app/page.jsx +13 -23
- package/dist/d1-studio.js +34 -4
- package/dist/lib/data-type-handlers.js +426 -0
- package/dist/lib/sql-operations.js +32 -8
- package/dist/lib/sql-sanitizer.js +233 -0
- package/package.json +3 -9
- package/dist/.next/.next/cache/webpack/server-production/2.pack +0 -0
- package/dist/.next/.next/server/chunks/90.js +0 -1
- package/dist/.next/.next/static/chunks/700-dc8f9f08b166c5e6.js +0 -1
- package/dist/.next/.next/static/chunks/app/page-16ec561fc8bebb5d.js +0 -1
- package/dist/.next/.next/static/css/0c512cea5f3d317a.css +0 -3
- package/dist/.next/server/chunks/90.js +0 -1
- package/dist/.next/static/chunks/700-dc8f9f08b166c5e6.js +0 -1
- package/dist/.next/static/chunks/app/page-16ec561fc8bebb5d.js +0 -1
- package/dist/.next/static/css/0c512cea5f3d317a.css +0 -3
- package/dist/app/app/api/cloudflare/route.js +0 -150
- package/dist/app/app/api/databases/route.js +0 -71
- package/dist/app/app/api/migrations/sync/route.js +0 -174
- package/dist/app/app/api/migrations/sync-files/route.js +0 -172
- package/dist/app/app/api/pull-data/confirm/route.js +0 -230
- package/dist/app/app/api/pull-remote/confirm/route.js +0 -278
- package/dist/app/app/api/pull-remote/preview/route.js +0 -144
- package/dist/app/app/api/push-remote/confirm/route.js +0 -196
- package/dist/app/app/api/push-remote/preview/route.js +0 -179
- package/dist/app/app/api/query/route.js +0 -168
- package/dist/app/app/api/tables/[name]/route.js +0 -174
- package/dist/app/app/api/tables/route.js +0 -178
- package/dist/app/app/api/update/route.js +0 -45
- package/dist/app/app/globals.css +0 -93
- package/dist/app/app/layout.jsx +0 -35
- package/dist/app/app/page.jsx +0 -44
- package/next.config.mjs +0 -18
- package/postcss.config.mjs +0 -8
- package/scripts/studio.js +0 -169
- package/scripts/test.js +0 -366
- package/src/app/api/cloudflare/route.js +0 -150
- package/src/app/api/databases/route.js +0 -71
- package/src/app/api/migrations/sync/route.js +0 -174
- package/src/app/api/migrations/sync-files/route.js +0 -172
- package/src/app/api/pull-data/confirm/route.js +0 -230
- package/src/app/api/pull-remote/confirm/route.js +0 -278
- package/src/app/api/pull-remote/preview/route.js +0 -144
- package/src/app/api/push-remote/confirm/route.js +0 -196
- package/src/app/api/push-remote/preview/route.js +0 -179
- package/src/app/api/query/route.js +0 -168
- package/src/app/api/tables/[name]/route.js +0 -174
- package/src/app/api/tables/route.js +0 -178
- package/src/app/api/update/route.js +0 -45
- package/src/app/globals.css +0 -93
- package/src/app/layout.jsx +0 -35
- package/src/app/page.jsx +0 -44
- package/src/components/cloudflare-credentials-modal.jsx +0 -94
- package/src/components/column-selector.jsx +0 -133
- package/src/components/column-sorting.jsx +0 -65
- package/src/components/delete-records-dialog.jsx +0 -64
- package/src/components/download-button.jsx +0 -205
- package/src/components/edit-error-alert.jsx +0 -30
- package/src/components/editable-cell.jsx +0 -163
- package/src/components/editable-row.jsx +0 -169
- package/src/components/environment-handler.jsx +0 -332
- package/src/components/environment-select.jsx +0 -62
- package/src/components/pull-preview-toast.jsx +0 -215
- package/src/components/push-error-alert.jsx +0 -72
- package/src/components/push-preview-toast.jsx +0 -183
- package/src/components/query-results.jsx +0 -112
- package/src/components/refresh-button.jsx +0 -61
- package/src/components/resize-columns.jsx +0 -101
- package/src/components/sidebar.jsx +0 -254
- package/src/components/sql-editor.jsx +0 -411
- package/src/components/sql-error-display.jsx +0 -167
- package/src/components/sync-migrations-button.jsx +0 -87
- package/src/components/table-error-dialog.jsx +0 -65
- package/src/components/table-toolbar.jsx +0 -285
- package/src/components/table-view.jsx +0 -843
- package/src/components/ui/alert.jsx +0 -47
- package/src/components/ui/button.jsx +0 -48
- package/src/components/ui/card.jsx +0 -50
- package/src/components/ui/checkbox.jsx +0 -24
- package/src/components/ui/collapsible.jsx +0 -11
- package/src/components/ui/dialog.jsx +0 -96
- package/src/components/ui/dropdown-menu.jsx +0 -158
- package/src/components/ui/input.jsx +0 -19
- package/src/components/ui/scroll-area.jsx +0 -40
- package/src/components/ui/select.jsx +0 -121
- package/src/components/ui/separator.jsx +0 -25
- package/src/components/ui/sheet.jsx +0 -109
- package/src/components/ui/sidebar.jsx +0 -620
- package/src/components/ui/skeleton.jsx +0 -14
- package/src/components/ui/table.jsx +0 -86
- package/src/components/ui/tabs.jsx +0 -43
- package/src/components/ui/toast.jsx +0 -86
- package/src/components/ui/toaster.jsx +0 -35
- package/src/components/ui/tooltip.jsx +0 -28
- package/src/components/update-banner.jsx +0 -93
- package/src/context/database-context.js +0 -510
- package/src/hooks/use-mobile.jsx +0 -19
- package/src/hooks/use-sql-error.ts +0 -23
- package/src/hooks/use-toast.js +0 -155
- package/src/lib/database-queue.js +0 -37
- package/src/lib/error.js +0 -20
- package/src/lib/find-wrangler-config.js +0 -74
- package/src/lib/license.js +0 -99
- package/src/lib/logger.js +0 -58
- package/src/lib/migrations.js +0 -415
- package/src/lib/parse-sql-error.js +0 -200
- package/src/lib/request-deduplication.js +0 -24
- package/src/lib/schema-operations.js +0 -106
- package/src/lib/sql-error-types.js +0 -14
- package/src/lib/sql-operations.js +0 -647
- package/src/lib/utils.js +0 -6
- package/src/lib/version-utils.js +0 -34
- /package/dist/.next/.next/static/{5dBGGUmK5q7of4h5Rahrg → Y9mYu4WBghepP5oT_3OdR}/_buildManifest.js +0 -0
- /package/dist/.next/.next/static/{5dBGGUmK5q7of4h5Rahrg → Y9mYu4WBghepP5oT_3OdR}/_ssgManifest.js +0 -0
- /package/dist/.next/.next/static/{PflNFnmFsNegSqhzjI6lA → ae3gNmoSGm-R5LJC4UagI}/_buildManifest.js +0 -0
- /package/dist/.next/.next/static/{PflNFnmFsNegSqhzjI6lA → ae3gNmoSGm-R5LJC4UagI}/_ssgManifest.js +0 -0
- /package/dist/.next/.next/static/{p8875OZM4iDNsPzmoyLe7 → bKfUJeuvAQlBmR3TjrfkH}/_buildManifest.js +0 -0
- /package/dist/.next/.next/static/{p8875OZM4iDNsPzmoyLe7 → bKfUJeuvAQlBmR3TjrfkH}/_ssgManifest.js +0 -0
- /package/dist/.next/{static 2/5dBGGUmK5q7of4h5Rahrg → .next/static/ejYPqJ2kVicVp5EFWOZIC}/_buildManifest.js +0 -0
- /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
|
-
}
|