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.
- package/dist/.next/.next/BUILD_ID +1 -1
- package/dist/.next/.next/app-build-manifest.json +28 -28
- 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/2.pack +0 -0
- package/dist/.next/.next/cache/webpack/server-production/3.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 +2 -2
- package/dist/.next/.next/server/app/index.rsc +5 -5
- package/dist/.next/.next/server/app/page.js +7 -7
- 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 +1 -1
- package/dist/.next/.next/server/chunks/226.js +12 -12
- package/dist/.next/.next/server/chunks/391.js +1 -1
- package/dist/.next/.next/server/chunks/572.js +1 -0
- 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/server-reference-manifest.json +1 -1
- package/dist/.next/.next/static/chunks/{576-c4daf274bb6469a1.js → 576-18a2209e1ed26aad.js} +1 -1
- 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/app/page-f2bc307c0d8acdaa.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/{9f6c25c5400f83d3.css → 7c16f57d325d0d7d.css} +1 -1
- package/dist/.next/.next/static/ejYPqJ2kVicVp5EFWOZIC/_buildManifest.js +1 -0
- package/dist/.next/.next/static/ejYPqJ2kVicVp5EFWOZIC/_ssgManifest.js +1 -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/thaCy2qVeNqYYhdayr13C/_buildManifest.js +1 -0
- package/dist/.next/.next/static/thaCy2qVeNqYYhdayr13C/_ssgManifest.js +1 -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 +28 -28
- 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 +2 -2
- package/dist/.next/server/app/index.rsc +5 -5
- package/dist/.next/server/app/page.js +7 -7
- 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 +1 -1
- package/dist/.next/server/chunks/226.js +12 -12
- package/dist/.next/server/chunks/391.js +1 -1
- package/dist/.next/server/chunks/572.js +1 -0
- 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/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-c4daf274bb6469a1.js → 576-18a2209e1ed26aad.js} +1 -1
- 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/{9f6c25c5400f83d3.css → 7c16f57d325d0d7d.css} +1 -1
- 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 -14
- 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/d1-studio.js +2 -2
- 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/server/chunks/90.js +0 -1
- package/dist/.next/.next/static/chunks/app/page-36ed30b2266617f3.js +0 -1
- package/dist/.next/server/chunks/90.js +0 -1
- package/dist/.next/static/chunks/app/page-36ed30b2266617f3.js +0 -1
- 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 -34
- package/next.config.mjs +0 -18
- package/postcss.config.mjs +0 -8
- package/scripts/studio.js +0 -199
- 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 -34
- 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/{OUHnbB-64afrrZQL0Srn5 → FEsQ9jwPUQv5A3fwg6Opl}/_buildManifest.js +0 -0
- /package/dist/.next/.next/static/{OUHnbB-64afrrZQL0Srn5 → FEsQ9jwPUQv5A3fwg6Opl}/_ssgManifest.js +0 -0
- /package/dist/.next/.next/static/{ZBTCAyp1kO5FdEHMU-Dw2 → Y9mYu4WBghepP5oT_3OdR}/_buildManifest.js +0 -0
- /package/dist/.next/.next/static/{ZBTCAyp1kO5FdEHMU-Dw2 → Y9mYu4WBghepP5oT_3OdR}/_ssgManifest.js +0 -0
- /package/dist/.next/.next/static/{bHYW7fgIBDF8-Q33_WPoE → ae3gNmoSGm-R5LJC4UagI}/_buildManifest.js +0 -0
- /package/dist/.next/.next/static/{bHYW7fgIBDF8-Q33_WPoE → ae3gNmoSGm-R5LJC4UagI}/_ssgManifest.js +0 -0
- /package/dist/.next/{static/ZBTCAyp1kO5FdEHMU-Dw2 → .next/static/bKfUJeuvAQlBmR3TjrfkH}/_buildManifest.js +0 -0
- /package/dist/.next/{static/ZBTCAyp1kO5FdEHMU-Dw2 → .next/static/bKfUJeuvAQlBmR3TjrfkH}/_ssgManifest.js +0 -0
package/scripts/studio.js
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import open from 'open';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
import { dirname, join } from 'path';
|
|
6
|
-
import express from 'express';
|
|
7
|
-
import { createServer } from 'http';
|
|
8
|
-
import next from 'next';
|
|
9
|
-
import { findWranglerConfig } from '../src/lib/find-wrangler-config.js';
|
|
10
|
-
import logger from '../src/lib/logger.js';
|
|
11
|
-
import updateNotifier from 'update-notifier';
|
|
12
|
-
import pkg from '../package.json' with { type: 'json' };
|
|
13
|
-
|
|
14
|
-
// Check for debug flag
|
|
15
|
-
const hasDebugFlag = process.argv.includes('--debug');
|
|
16
|
-
if (hasDebugFlag) {
|
|
17
|
-
process.env.DEBUG = 'true';
|
|
18
|
-
logger.debug('Debug mode enabled');
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const notifier = updateNotifier({
|
|
22
|
-
pkg,
|
|
23
|
-
updateCheckInterval: 1000 * 60 * 60 * 24,
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
// Check if update is available
|
|
27
|
-
if (notifier.update) {
|
|
28
|
-
// Get current version and latest version
|
|
29
|
-
const currentVersion = pkg.version;
|
|
30
|
-
const latestVersion = notifier.update.latest;
|
|
31
|
-
|
|
32
|
-
// Version-specific messages
|
|
33
|
-
const versionMessages = {
|
|
34
|
-
// Add specific version messages here
|
|
35
|
-
'0.2.11': 'Fixed table toolbar and table view horizontal/vertical scroll issues'
|
|
36
|
-
// Add more version messages as needed
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// Create custom message
|
|
40
|
-
let message = `Update available ${chalk.dim(currentVersion)} → ${chalk.green(latestVersion)}`;
|
|
41
|
-
|
|
42
|
-
// Add version-specific message if available
|
|
43
|
-
if (versionMessages[latestVersion]) {
|
|
44
|
-
message += `\n${chalk.cyan('What\'s new:')} ${versionMessages[latestVersion]}`;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Add installation instructions
|
|
48
|
-
message += `\nRun ${chalk.cyan('npm i -g d1s@latest')} to update`;
|
|
49
|
-
|
|
50
|
-
// Display custom notification
|
|
51
|
-
notifier.notify({ message });
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Compute the absolute path of this file and its directory
|
|
55
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
56
|
-
const __dirname = dirname(__filename);
|
|
57
|
-
|
|
58
|
-
async function startServer(port, projectDirectory) {
|
|
59
|
-
return new Promise((resolvePromise, rejectPromise) => {
|
|
60
|
-
// Determine Next.js app directory based on environment:
|
|
61
|
-
// In production (published package) __dirname is used.
|
|
62
|
-
// In development (npm link), assume the build is in the parent folder.
|
|
63
|
-
const isProduction = process.env.NODE_ENV !== 'development';
|
|
64
|
-
const nextAppDir = isProduction ? __dirname : join(__dirname, '..');
|
|
65
|
-
|
|
66
|
-
const dev = process.env.NODE_ENV === 'development';
|
|
67
|
-
const app = next({
|
|
68
|
-
dev,
|
|
69
|
-
dir: nextAppDir,
|
|
70
|
-
conf: {
|
|
71
|
-
distDir: '.next',
|
|
72
|
-
experimental: { appDir: true }
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
const handle = app.getRequestHandler();
|
|
76
|
-
|
|
77
|
-
app.prepare()
|
|
78
|
-
.then(() => {
|
|
79
|
-
const server = express();
|
|
80
|
-
process.env.PORT = port.toString();
|
|
81
|
-
process.env.D1_PROJECT_DIR = projectDirectory;
|
|
82
|
-
const httpServer = createServer((req, res) => handle(req, res));
|
|
83
|
-
|
|
84
|
-
server.all('*', (req, res) => handle(req, res));
|
|
85
|
-
|
|
86
|
-
httpServer.listen(port, (err) => {
|
|
87
|
-
if (err) {
|
|
88
|
-
logger.error(chalk.red(`Failed to start server: ${err}`));
|
|
89
|
-
rejectPromise(err);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
logger.info(chalk.green(`Server started on port ${port}`));
|
|
93
|
-
resolvePromise(httpServer);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
httpServer.on('error', (err) => {
|
|
97
|
-
logger.error(chalk.red(`Server error: ${err}`));
|
|
98
|
-
rejectPromise(err);
|
|
99
|
-
});
|
|
100
|
-
})
|
|
101
|
-
.catch((err) => {
|
|
102
|
-
logger.error(chalk.red(`Failed to prepare Next.js app: ${err}`));
|
|
103
|
-
rejectPromise(err);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async function startStudio() {
|
|
109
|
-
try {
|
|
110
|
-
logger.info(chalk.green('Initializing D1 Studio...'));
|
|
111
|
-
|
|
112
|
-
// Get wrangler configuration
|
|
113
|
-
try {
|
|
114
|
-
const userProjectPath = process.cwd();
|
|
115
|
-
if (!userProjectPath) {
|
|
116
|
-
logger.error(chalk.red('Error: Could not determine project directory'));
|
|
117
|
-
process.exit(1);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const wranglerResult = await findWranglerConfig(userProjectPath);
|
|
121
|
-
if (!wranglerResult || !wranglerResult.config) {
|
|
122
|
-
logger.error(chalk.red('\nError: No wrangler.toml found in current directory'));
|
|
123
|
-
logger.info(chalk.yellow('Make sure you are in a Cloudflare Workers project directory'));
|
|
124
|
-
logger.info(chalk.yellow('with a valid wrangler.toml file.'));
|
|
125
|
-
process.exit(1);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const { config, projectPath } = wranglerResult;
|
|
129
|
-
if (!config.d1_databases?.length) {
|
|
130
|
-
logger.error(chalk.red('\nError: No D1 databases configured in wrangler.toml'));
|
|
131
|
-
logger.info(chalk.yellow('\nAdd D1 configuration to your wrangler.toml:'));
|
|
132
|
-
logger.info(chalk.gray(`
|
|
133
|
-
[[d1_databases]]
|
|
134
|
-
binding = "DB"
|
|
135
|
-
database_name = "my-database"
|
|
136
|
-
database_id = "<your-database-id>"
|
|
137
|
-
`));
|
|
138
|
-
process.exit(1);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
logger.info(chalk.green('\nFound D1 databases:'));
|
|
142
|
-
config.d1_databases.forEach((db) => {
|
|
143
|
-
logger.info(chalk.blue(` - ${db.database_name} (${db.binding})`));
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
const port = 4000;
|
|
147
|
-
const url = `http://localhost:${port}`;
|
|
148
|
-
|
|
149
|
-
await startServer(port, projectPath);
|
|
150
|
-
|
|
151
|
-
logger.info(chalk.green(`
|
|
152
|
-
┌─────────────────────────────────────────┐
|
|
153
|
-
│ │
|
|
154
|
-
│ D1 Studio is running on port ${port} │
|
|
155
|
-
│ │
|
|
156
|
-
│ Local: ${url} │
|
|
157
|
-
│ │
|
|
158
|
-
└─────────────────────────────────────────┘
|
|
159
|
-
`));
|
|
160
|
-
|
|
161
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
await open(url, {
|
|
165
|
-
wait: false,
|
|
166
|
-
url: true,
|
|
167
|
-
app: { name: open.apps.chrome }
|
|
168
|
-
}).catch(() => {
|
|
169
|
-
return open(url, { wait: false, url: true });
|
|
170
|
-
});
|
|
171
|
-
} catch (browserError) {
|
|
172
|
-
logger.info(chalk.yellow('\nCould not automatically open browser.'));
|
|
173
|
-
logger.info(chalk.blue(`Please open your browser and navigate to: ${url}`));
|
|
174
|
-
}
|
|
175
|
-
} catch (configError) {
|
|
176
|
-
logger.error(chalk.red(`\nConfiguration error: ${configError.message}`));
|
|
177
|
-
process.exit(1);
|
|
178
|
-
}
|
|
179
|
-
} catch (error) {
|
|
180
|
-
logger.error(chalk.red(`\nFailed to start D1 Studio: ${error}`));
|
|
181
|
-
process.exit(1);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Handle termination
|
|
186
|
-
process.on('SIGINT', () => {
|
|
187
|
-
logger.info(chalk.yellow('\nShutting down D1 Studio...'));
|
|
188
|
-
process.exit(0);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
process.on('SIGTERM', () => {
|
|
192
|
-
logger.info(chalk.yellow('\nShutting down D1 Studio...'));
|
|
193
|
-
process.exit(0);
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
startStudio().catch((error) => {
|
|
197
|
-
logger.error(chalk.red(`\nFailed to start D1 Studio: ${error}`));
|
|
198
|
-
process.exit(1);
|
|
199
|
-
});
|
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
|
-
});
|