From aacc3eef154edf32986b573766c545bd870372f3 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Tue, 28 Jun 2022 17:19:29 +0100 Subject: [PATCH 01/16] Adding first version of D1 support for beta --- packages/d1/README.md | 44 ++++++++++++++++++ packages/d1/package.json | 44 ++++++++++++++++++ packages/d1/src/database.ts | 62 +++++++++++++++++++++++++ packages/d1/src/index.ts | 2 + packages/d1/src/plugin.ts | 69 ++++++++++++++++++++++++++++ packages/d1/test/namespace.spec.ts | 49 ++++++++++++++++++++ packages/d1/test/plugin.spec.ts | 53 +++++++++++++++++++++ packages/miniflare/package.json | 1 + packages/miniflare/src/api.ts | 2 + packages/shared/package.json | 2 + packages/shared/src/storage.ts | 12 +++++ packages/shared/src/wrangler.ts | 6 +++ packages/storage-file/src/index.ts | 10 ++++ packages/storage-memory/src/local.ts | 9 ++++ scripts/build.mjs | 2 + 15 files changed, 367 insertions(+) create mode 100644 packages/d1/README.md create mode 100644 packages/d1/package.json create mode 100644 packages/d1/src/database.ts create mode 100644 packages/d1/src/index.ts create mode 100644 packages/d1/src/plugin.ts create mode 100644 packages/d1/test/namespace.spec.ts create mode 100644 packages/d1/test/plugin.spec.ts diff --git a/packages/d1/README.md b/packages/d1/README.md new file mode 100644 index 000000000..f656c3d86 --- /dev/null +++ b/packages/d1/README.md @@ -0,0 +1,44 @@ +# `@miniflare/d1` + +Workers D1 module for [Miniflare](https://github.com/cloudflare/miniflare): a +fun, full-featured, fully-local simulator for Cloudflare Workers. See +[📦 D1](https://miniflare.dev/storage/d1) for more details. + +## Example + +```js +import { BetaDatabase } from "@miniflare/d1"; +import { MemoryStorage } from "@miniflare/storage-memory"; +var db = new BetaDatabase(new MemoryStorage()); + +// BetaDatabase only supports .fetch(), once D1 is out of beta the full API will be available here: +await db.fetch("/execute", { + method: 'POST', + body: JSON.stringify({ + sql: `CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL);`, + }), +}); +const response = await db.fetch("/query", { + method: 'POST', + body: JSON.stringify({ + sql: `SELECT * FROM sqlite_schema`, + }), +}); +console.log(await response.json()) +/* +{ + "success": true, + "result": [ + [ + { + "type": "table", + "name": "my_table", + "tbl_name": "my_table", + "rootpage": 2, + "sql": "CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL)" + } + ] + ] +} +*/ +``` diff --git a/packages/d1/package.json b/packages/d1/package.json new file mode 100644 index 000000000..e1fe25650 --- /dev/null +++ b/packages/d1/package.json @@ -0,0 +1,44 @@ +{ + "name": "@miniflare/d1", + "version": "2.6.0", + "description": "Workers D1 module for Miniflare: a fun, full-featured, fully-local simulator for Cloudflare Workers", + "keywords": [ + "cloudflare", + "workers", + "worker", + "local", + "d1", + "sqlite" + ], + "author": "Glen Maddern ", + "license": "MIT", + "main": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "files": [ + "dist/src" + ], + "engines": { + "node": ">=16.7" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cloudflare/miniflare.git", + "directory": "packages/d1" + }, + "bugs": { + "url": "https://github.com/cloudflare/miniflare/issues" + }, + "homepage": "https://github.com/cloudflare/miniflare/tree/master/packages/d1#readme", + "volta": { + "extends": "../../package.json" + }, + "dependencies": { + "@miniflare/shared": "2.5.0" + }, + "devDependencies": { + "@miniflare/shared-test": "2.5.0" + } +} diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts new file mode 100644 index 000000000..a7f1e0bd2 --- /dev/null +++ b/packages/d1/src/database.ts @@ -0,0 +1,62 @@ +import { RequestInit, Response } from "@miniflare/core"; +import { Storage } from "@miniflare/shared"; +import Database from "better-sqlite3"; + +const _404 = (body: any = {}) => + new Response(JSON.stringify(body), { status: 404 }); +const _200 = (body: any = {}) => new Response(JSON.stringify(body)); + +type Statement = { + sql: string | string[]; + params?: any[]; +}; + +// This is the API for the D1 Beta, which just exposes `.fetch()` +export class BetaDatabase { + readonly #storage: Storage; + readonly #db: Database.Database; + + constructor(storage: Storage) { + this.#storage = storage; + this.#db = storage.getSqliteDatabase(); + } + + async fetch(input: string, init: RequestInit): Promise { + if (init.method !== "POST") return _404(); + const body = JSON.parse(init.body as string) as Statement | Statement[]; + + switch (input) { + case "/execute": + case "/query": { + const queries = Array.isArray(body) ? body : [body]; + const runResult = queries.flatMap((q) => { + const { sql, params = [] } = q; + const statements = Array.isArray(sql) ? sql : [sql]; + return statements.map((s) => { + const statement = this.#db.prepare(s); + try { + return statement.all(...params); + } catch (e: unknown) { + // This is the quickest/simplest way I could find to return results by + // default, falling back to .run() + if ( + /This statement does not return data\. Use run\(\) instead/.exec( + (e as Error).message + ) + ) { + return statement.run(...params); + } + throw e; + } + }); + }); + return _200({ + success: true, + result: runResult, + }); + } + } + + return _404(); + } +} diff --git a/packages/d1/src/index.ts b/packages/d1/src/index.ts new file mode 100644 index 000000000..8d6fcc5f3 --- /dev/null +++ b/packages/d1/src/index.ts @@ -0,0 +1,2 @@ +export * from "./database"; +export * from "./plugin"; diff --git a/packages/d1/src/plugin.ts b/packages/d1/src/plugin.ts new file mode 100644 index 000000000..8272db271 --- /dev/null +++ b/packages/d1/src/plugin.ts @@ -0,0 +1,69 @@ +import { + Context, + Option, + OptionType, + Plugin, + PluginContext, + SetupResult, + StorageFactory, + resolveStoragePersist, +} from "@miniflare/shared"; +import { BetaDatabase } from "./database"; + +export interface D1Options { + d1Databases?: string[]; + d1Persist?: boolean | string; +} +const D1_BETA_PREFIX = `__D1_BETA__`; + +export class D1Plugin extends Plugin implements D1Options { + @Option({ + type: OptionType.ARRAY, + name: "d1", + description: "D1 namespace to bind", + logName: "D1 Namespaces", + fromWrangler: ({ d1_databases }) => + d1_databases?.map(({ binding }) => binding), + }) + d1Databases?: string[]; + + @Option({ + type: OptionType.BOOLEAN_STRING, + description: "Persist D1 data (to optional path)", + logName: "D1 Persistence", + fromWrangler: ({ miniflare }) => miniflare?.d1_persist, + }) + d1Persist?: boolean | string; + readonly #persist?: boolean | string; + + constructor(ctx: PluginContext, options?: D1Options) { + super(ctx); + this.assignOptions(options); + this.#persist = resolveStoragePersist(ctx.rootPath, this.d1Persist); + } + + async getBetaDatabase( + storage: StorageFactory, + dbName: string + ): Promise { + return new BetaDatabase(await storage.storage(dbName, this.#persist)); + } + + async setup(storageFactory: StorageFactory): Promise { + const bindings: Context = {}; + for (const dbName of this.d1Databases ?? []) { + if (dbName.startsWith(D1_BETA_PREFIX)) { + bindings[dbName] = await this.getBetaDatabase( + storageFactory, + // Store it locally without the prefix + dbName.slice(D1_BETA_PREFIX.length) + ); + } else { + console.warn( + `Not injecting D1 Database for '${dbName}' as this version of Miniflare only supports D1 beta bindings. Upgrade Wrangler and/or Miniflare and try again.` + ); + } + } + return { bindings }; + } +} diff --git a/packages/d1/test/namespace.spec.ts b/packages/d1/test/namespace.spec.ts new file mode 100644 index 000000000..7b180c486 --- /dev/null +++ b/packages/d1/test/namespace.spec.ts @@ -0,0 +1,49 @@ +import { BetaDatabase } from "@miniflare/d1"; +import { Storage } from "@miniflare/shared"; +import { testClock } from "@miniflare/shared-test"; +import { MemoryStorage } from "@miniflare/storage-memory"; +import anyTest, { TestInterface } from "ava"; + +interface Context { + storage: Storage; + db: BetaDatabase; +} + +const test = anyTest as TestInterface; + +test.beforeEach((t) => { + const storage = new MemoryStorage(undefined, testClock); + const db = new BetaDatabase(storage); + t.context = { storage, db }; +}); + +test("fetch: accepts /execute and /query", async (t) => { + const { db } = t.context; + + await db.fetch("/execute", { + method: "POST", + body: JSON.stringify({ + sql: `CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL);`, + }), + }); + const response = await db.fetch("/query", { + method: "POST", + body: JSON.stringify({ + sql: `SELECT * FROM sqlite_schema`, + }), + }); + t.deepEqual(await response.json(), { + success: true, + result: [ + [ + { + type: "table", + name: "my_table", + tbl_name: "my_table", + rootpage: 2, + sql: "CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL)", + }, + ], + ], + }); +}); diff --git a/packages/d1/test/plugin.spec.ts b/packages/d1/test/plugin.spec.ts new file mode 100644 index 000000000..9f21bc622 --- /dev/null +++ b/packages/d1/test/plugin.spec.ts @@ -0,0 +1,53 @@ +import { createCrypto } from "@miniflare/core"; +import { D1Plugin } from "@miniflare/d1"; +import { + logPluginOptions, + parsePluginArgv, + parsePluginWranglerConfig, +} from "@miniflare/shared-test"; +import test from "ava"; + +const crypto = createCrypto(); + +test("D1Plugin: parses options from argv", (t) => { + const options = parsePluginArgv(D1Plugin, [ + "--d1", + "DB1", + "--d1", + "DB2", + "--d1-persist", + "path", + ]); + t.deepEqual(options, { + d1Databases: ["DB1", "DB2"], + d1Persist: "path", + }); +}); +test("D1Plugin: parses options from wrangler config", (t) => { + const options = parsePluginWranglerConfig(D1Plugin, { + d1_databases: [ + { + binding: "DB1", + database_name: "data-base-1", + database_id: crypto.randomUUID(), + }, + { + binding: "DB2", + database_name: "data-base-2", + database_id: crypto.randomUUID(), + }, + ], + miniflare: { d1_persist: "path" }, + }); + t.deepEqual(options, { + d1Databases: ["DB1", "DB2"], + d1Persist: "path", + }); +}); +test("D1Plugin: logs options", (t) => { + const logs = logPluginOptions(D1Plugin, { + d1Databases: ["DB1", "DB2"], + d1Persist: true, + }); + t.deepEqual(logs, ["D1 Namespaces: DB1, DB2", "D1 Persistence: true"]); +}); diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json index 69b14df08..a3aca5e4c 100644 --- a/packages/miniflare/package.json +++ b/packages/miniflare/package.json @@ -53,6 +53,7 @@ "@miniflare/html-rewriter": "2.6.0", "@miniflare/http-server": "2.6.0", "@miniflare/kv": "2.6.0", + "@miniflare/d1": "2.6.0", "@miniflare/r2": "2.6.0", "@miniflare/runner-vm": "2.6.0", "@miniflare/scheduler": "2.6.0", diff --git a/packages/miniflare/src/api.ts b/packages/miniflare/src/api.ts index 03aa8620c..800f0e0a7 100644 --- a/packages/miniflare/src/api.ts +++ b/packages/miniflare/src/api.ts @@ -8,6 +8,7 @@ import { MiniflareCore, MiniflareCoreOptions, } from "@miniflare/core"; +import { D1Plugin } from "@miniflare/d1"; import { DurableObjectId, DurableObjectNamespace, @@ -47,6 +48,7 @@ export const PLUGINS = { // Storage KVPlugin, + D1Plugin, R2Plugin, DurableObjectsPlugin, CachePlugin, diff --git a/packages/shared/package.json b/packages/shared/package.json index ff5faae85..bc3ae1831 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -35,6 +35,8 @@ "extends": "../../package.json" }, "dependencies": { + "@types/better-sqlite3": "^7.5.0", + "better-sqlite3": "^7.5.3", "ignore": "^5.1.8", "kleur": "^4.1.4" }, diff --git a/packages/shared/src/storage.ts b/packages/shared/src/storage.ts index 2c94583b7..76e584b5a 100644 --- a/packages/shared/src/storage.ts +++ b/packages/shared/src/storage.ts @@ -1,3 +1,5 @@ +import path from "node:path"; +import type { Database } from "better-sqlite3"; import { Awaitable } from "./sync"; export interface StoredMeta { @@ -116,6 +118,9 @@ export abstract class Storage { options: StorageListOptions, skipMetadata: true ): Awaitable>; + getSqliteDatabase(): Database { + throw new Error("D1 not implemented for this Storage class"); + } // Batch functions, default implementations may be overridden to optimise @@ -161,3 +166,10 @@ export interface StorageFactory { storage(namespace: string, persist?: boolean | string): Awaitable; dispose?(): Awaitable; } + +export function getSQLiteNativeBindingLocation() { + return path.resolve( + path.dirname(require.resolve("better-sqlite3")), + "../build/Release/better_sqlite3.node" + ); +} diff --git a/packages/shared/src/wrangler.ts b/packages/shared/src/wrangler.ts index 579b9ef5b..7989b272c 100644 --- a/packages/shared/src/wrangler.ts +++ b/packages/shared/src/wrangler.ts @@ -27,6 +27,11 @@ export interface WranglerEnvironmentConfig { id?: string; preview_id?: string; }[]; // NOT inherited + d1_databases?: { + binding: string; + database_name: string; + database_id: string; + }[]; // NOT inherited r2_buckets?: { binding: string; bucket_name?: string; @@ -61,6 +66,7 @@ export interface WranglerEnvironmentConfig { watch?: boolean; build_watch_dirs?: string[]; kv_persist?: boolean | string; + d1_persist?: boolean | string; r2_persist?: boolean | string; cache?: boolean; cache_persist?: boolean | string; diff --git a/packages/storage-file/src/index.ts b/packages/storage-file/src/index.ts index 0e105ea6e..40fc675d3 100644 --- a/packages/storage-file/src/index.ts +++ b/packages/storage-file/src/index.ts @@ -1,4 +1,5 @@ import { existsSync } from "fs"; +import fs from "fs"; import path from "path"; import { MiniflareError, @@ -8,10 +9,12 @@ import { StoredMeta, StoredValueMeta, defaultClock, + getSQLiteNativeBindingLocation, sanitisePath, viewToArray, } from "@miniflare/shared"; import { LocalStorage } from "@miniflare/storage-memory"; +import Database from "better-sqlite3"; import { deleteFile, readFile, @@ -104,6 +107,13 @@ export class FileStorage extends LocalStorage { } } + getSqliteDatabase(): Database.Database { + fs.mkdirSync(path.dirname(this.root), { recursive: true }); + return new Database(this.root + ".sqlite3", { + nativeBinding: getSQLiteNativeBindingLocation(), + }); + } + async getRangeMaybeExpired( key: string, { offset: _offset, length: _length, suffix }: Range diff --git a/packages/storage-memory/src/local.ts b/packages/storage-memory/src/local.ts index f8640660d..272ba3799 100644 --- a/packages/storage-memory/src/local.ts +++ b/packages/storage-memory/src/local.ts @@ -9,8 +9,10 @@ import { StoredMeta, StoredValueMeta, defaultClock, + getSQLiteNativeBindingLocation, millisToSeconds, } from "@miniflare/shared"; +import Database from "better-sqlite3"; import { listFilterMatch, listPaginate } from "./helpers"; export abstract class LocalStorage extends Storage { @@ -116,4 +118,11 @@ export abstract class LocalStorage extends Storage { await Promise.all(deletePromises); return res; } + + getSqliteDatabase(): Database.Database { + const location = getSQLiteNativeBindingLocation(); + return new Database(":memory:", { + nativeBinding: location, + }); + } } diff --git a/scripts/build.mjs b/scripts/build.mjs index 0a8f6406d..e2eb42761 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -63,6 +63,8 @@ const buildOptions = { "jest*", // Mark sites manifest as external, it's added by SitesPlugin "__STATIC_CONTENT_MANIFEST", + // SQLite requires a better_sqlite3.node file, so don't bundle it + "better-sqlite3" ], logLevel: watch ? "info" : "warning", watch, From 6d3dbcb05fb7f693d15a6f5548be18c7aab3eb35 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Wed, 29 Jun 2022 16:43:42 +0100 Subject: [PATCH 02/16] Bunch of tweaks based on feedback --- packages/d1/README.md | 2 +- packages/d1/package.json | 1 + packages/d1/src/database.ts | 5 ++--- packages/d1/test/{namespace.spec.ts => database.spec.ts} | 0 scripts/build.mjs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename packages/d1/test/{namespace.spec.ts => database.spec.ts} (100%) diff --git a/packages/d1/README.md b/packages/d1/README.md index f656c3d86..9dd8cd021 100644 --- a/packages/d1/README.md +++ b/packages/d1/README.md @@ -9,7 +9,7 @@ fun, full-featured, fully-local simulator for Cloudflare Workers. See ```js import { BetaDatabase } from "@miniflare/d1"; import { MemoryStorage } from "@miniflare/storage-memory"; -var db = new BetaDatabase(new MemoryStorage()); +const db = new BetaDatabase(new MemoryStorage()); // BetaDatabase only supports .fetch(), once D1 is out of beta the full API will be available here: await db.fetch("/execute", { diff --git a/packages/d1/package.json b/packages/d1/package.json index e1fe25650..ca24bf155 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -36,6 +36,7 @@ "extends": "../../package.json" }, "dependencies": { + "@miniflare/core": "^2.5.0", "@miniflare/shared": "2.5.0" }, "devDependencies": { diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts index a7f1e0bd2..289215bd3 100644 --- a/packages/d1/src/database.ts +++ b/packages/d1/src/database.ts @@ -2,9 +2,8 @@ import { RequestInit, Response } from "@miniflare/core"; import { Storage } from "@miniflare/shared"; import Database from "better-sqlite3"; -const _404 = (body: any = {}) => - new Response(JSON.stringify(body), { status: 404 }); -const _200 = (body: any = {}) => new Response(JSON.stringify(body)); +const _404 = (body: any = {}) => Response.json(body, { status: 404 }); +const _200 = (body: any = {}) => Response.json(body); type Statement = { sql: string | string[]; diff --git a/packages/d1/test/namespace.spec.ts b/packages/d1/test/database.spec.ts similarity index 100% rename from packages/d1/test/namespace.spec.ts rename to packages/d1/test/database.spec.ts diff --git a/scripts/build.mjs b/scripts/build.mjs index e2eb42761..b0c1bc4a1 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -64,7 +64,7 @@ const buildOptions = { // Mark sites manifest as external, it's added by SitesPlugin "__STATIC_CONTENT_MANIFEST", // SQLite requires a better_sqlite3.node file, so don't bundle it - "better-sqlite3" + "better-sqlite3", ], logLevel: watch ? "info" : "warning", watch, From 6c052ea78744b3ffc867da412bac3ce0a203b077 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Thu, 28 Jul 2022 17:52:59 +0100 Subject: [PATCH 03/16] Added D1 API directly, rather than through .fetch() --- packages/d1/src/database.ts | 187 +++++++++++++++++++++++++++--------- 1 file changed, 144 insertions(+), 43 deletions(-) diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts index 289215bd3..64b24a592 100644 --- a/packages/d1/src/database.ts +++ b/packages/d1/src/database.ts @@ -1,16 +1,129 @@ -import { RequestInit, Response } from "@miniflare/core"; +import { performance } from "node:perf_hooks"; import { Storage } from "@miniflare/shared"; import Database from "better-sqlite3"; -const _404 = (body: any = {}) => Response.json(body, { status: 404 }); -const _200 = (body: any = {}) => Response.json(body); +type BindParams = any[] | [Record]; -type Statement = { - sql: string | string[]; - params?: any[]; -}; +function errorWithCause(message: string, e: unknown) { + return new Error(message, { + cause: e, + }); +} + +class Statement { + readonly #db: Database.Database; + readonly #query: string; + readonly #bindings: BindParams | undefined; + + constructor(db: Database.Database, query: string, bindings?: BindParams) { + this.#db = db; + this.#query = query; + this.#bindings = bindings; + } + + // Lazily accumulate binding instructions, because ".bind" in better-sqlite3 + // is a real action that means the query must be valid when it's written, + // not when it's about to be executed (i.e. in a batch). + bind(...params: BindParams) { + return new Statement(this.#db, this.#query, params); + } + private prepareAndBind() { + const prepared = this.#db.prepare(this.#query); + if (this.#bindings === undefined) return prepared; + try { + return prepared.bind(this.#bindings); + } catch (e) { + // For statements using ?1 ?2, etc, we want to pass them as varargs but + // "better" sqlite3 wants them as an object of {1: params[0], 2: params[1], ...} + if (this.#bindings.length > 0 && typeof this.#bindings[0] !== "object") { + return prepared.bind( + Object.fromEntries(this.#bindings.map((v, i) => [i + 1, v])) + ); + } else { + throw e; + } + } + } + + async all() { + const start = performance.now(); + const statementWithBindings = this.prepareAndBind(); + try { + const results = Statement._all(statementWithBindings); + return { + results, + duration: performance.now() - start, + lastRowId: null, + changes: null, + success: true, + served_by: "x-miniflare.db3", + }; + } catch (e) { + throw errorWithCause("D1_ALL_ERROR", e); + } + } + private static _all(statementWithBindings: Database.Statement) { + try { + return statementWithBindings.all(); + } catch (e: unknown) { + // This is the quickest/simplest way I could find to return results by + // default, falling back to .run() + if ( + /This statement does not return data\. Use run\(\) instead/.exec( + (e as Error).message + ) + ) { + return Statement._run(statementWithBindings); + } + throw e; + } + } + + async first(col?: string) { + const statementWithBindings = this.prepareAndBind(); + try { + const data = Statement._first(statementWithBindings); + return typeof col === "string" ? data[col] : data; + } catch (e) { + throw errorWithCause("D1_FIRST_ERROR", e); + } + } + private static _first(statementWithBindings: Database.Statement) { + return statementWithBindings.get(); + } + + async run() { + const start = performance.now(); + const statementWithBindings = this.prepareAndBind(); + try { + const { changes, lastInsertRowid } = Statement._run( + statementWithBindings + ); + return { + results: null, + duration: performance.now() - start, + lastRowId: lastInsertRowid, + changes, + success: true, + served_by: "x-miniflare.db3", + }; + } catch (e) { + throw errorWithCause("D1_RUN_ERROR", e); + } + } + private static _run(statementWithBindings: Database.Statement) { + return statementWithBindings.run(); + } + + async raw() { + const statementWithBindings = this.prepareAndBind(); + return Statement._raw(statementWithBindings); + } + private static _raw(statementWithBindings: Database.Statement) { + return statementWithBindings.raw() as any; + } +} -// This is the API for the D1 Beta, which just exposes `.fetch()` export class BetaDatabase { readonly #storage: Storage; readonly #db: Database.Database; @@ -20,42 +133,30 @@ export class BetaDatabase { this.#db = storage.getSqliteDatabase(); } - async fetch(input: string, init: RequestInit): Promise { - if (init.method !== "POST") return _404(); - const body = JSON.parse(init.body as string) as Statement | Statement[]; - - switch (input) { - case "/execute": - case "/query": { - const queries = Array.isArray(body) ? body : [body]; - const runResult = queries.flatMap((q) => { - const { sql, params = [] } = q; - const statements = Array.isArray(sql) ? sql : [sql]; - return statements.map((s) => { - const statement = this.#db.prepare(s); - try { - return statement.all(...params); - } catch (e: unknown) { - // This is the quickest/simplest way I could find to return results by - // default, falling back to .run() - if ( - /This statement does not return data\. Use run\(\) instead/.exec( - (e as Error).message - ) - ) { - return statement.run(...params); - } - throw e; - } - }); - }); - return _200({ - success: true, - result: runResult, - }); - } + prepare(source: string) { + return new Statement(this.#db, source); + } + + async batch(statements: Statement[]) { + return await Promise.all(statements.map((s) => s.all())); + } + + async exec(multiLineStatements: string) { + const statements = multiLineStatements + .split("\n") + .map((line) => line.trim()) + .filter((line) => line.length > 0); + const start = performance.now(); + for (const statement of statements) { + await new Statement(this.#db, statement).all(); } + return { + count: statements.length, + duration: performance.now() - start, + }; + } - return _404(); + async dump() { + throw new Error("DB.dump() not implemented locally!"); } } From cb7f42faed26cf40fc51e9f3fd16a9d599c1f628 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Thu, 28 Jul 2022 17:56:54 +0100 Subject: [PATCH 04/16] rebased, bumped d1 version to 2.6, npm installed --- package-lock.json | 486 +++++++++++++++++++++++++++++++++------ packages/d1/package.json | 6 +- 2 files changed, 422 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4d35ecaf..d03259d7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1414,6 +1414,10 @@ "resolved": "packages/core", "link": true }, + "node_modules/@miniflare/d1": { + "resolved": "packages/d1", + "link": true + }, "node_modules/@miniflare/durable-objects": { "resolved": "packages/durable-objects", "link": true @@ -1646,6 +1650,14 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/better-sqlite3": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.5.0.tgz", + "integrity": "sha512-G9ZbMjydW2yj1AgiPlUtdgF3a1qNpLJLudc9ynJCeJByS3XFWpmT9LT+VSHrKHFbxb31CvtYwetLTOvG9zdxdg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/busboy": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.0.tgz", @@ -1740,8 +1752,7 @@ "node_modules/@types/node": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", - "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==", - "dev": true + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" }, "node_modules/@types/node-forge": { "version": "0.10.9", @@ -2418,7 +2429,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -2434,6 +2444,16 @@ } ] }, + "node_modules/better-sqlite3": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", + "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2443,11 +2463,18 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -2540,7 +2567,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -2741,6 +2767,11 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -3100,7 +3131,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, "engines": { "node": ">=4.0.0" } @@ -3195,6 +3225,14 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3282,7 +3320,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -3917,6 +3954,14 @@ "node": ">= 0.8.0" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4011,6 +4056,11 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4054,6 +4104,11 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -4169,6 +4224,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -4392,7 +4452,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -4579,8 +4638,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", @@ -5665,7 +5723,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -5835,8 +5892,12 @@ "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mri": { "version": "1.2.0", @@ -5861,12 +5922,28 @@ "mustache": "bin/mustache" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/node-abi": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", + "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -5995,7 +6072,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -6420,6 +6496,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6537,7 +6638,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6588,7 +6688,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -6602,14 +6701,12 @@ "node_modules/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6692,7 +6789,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6907,8 +7003,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/scheduler": { "version": "0.22.0", @@ -6942,7 +7037,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7047,6 +7141,74 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -7210,7 +7372,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -7219,7 +7380,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -7392,6 +7552,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -7536,6 +7722,17 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7701,8 +7898,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/v8-compile-cache": { "version": "2.3.0", @@ -7861,8 +8057,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -7917,8 +8112,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", @@ -8043,6 +8237,20 @@ "node": ">=16.7" } }, + "packages/d1": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "@miniflare/core": "^2.6.0", + "@miniflare/shared": "2.6.0" + }, + "devDependencies": { + "@miniflare/shared-test": "2.6.0" + }, + "engines": { + "node": ">=16.7" + } + }, "packages/durable-objects": { "name": "@miniflare/durable-objects", "version": "2.6.0", @@ -9141,6 +9349,7 @@ "@miniflare/cache": "2.6.0", "@miniflare/cli-parser": "2.6.0", "@miniflare/core": "2.6.0", + "@miniflare/d1": "2.6.0", "@miniflare/durable-objects": "2.6.0", "@miniflare/html-rewriter": "2.6.0", "@miniflare/http-server": "2.6.0", @@ -9236,6 +9445,8 @@ "version": "2.6.0", "license": "MIT", "dependencies": { + "@types/better-sqlite3": "^7.5.0", + "better-sqlite3": "^7.5.3", "ignore": "^5.1.8", "kleur": "^4.1.4" }, @@ -10489,6 +10700,14 @@ "urlpattern-polyfill": "^4.0.3" } }, + "@miniflare/d1": { + "version": "file:packages/d1", + "requires": { + "@miniflare/core": "^2.6.0", + "@miniflare/shared": "2.6.0", + "@miniflare/shared-test": "2.6.0" + } + }, "@miniflare/durable-objects": { "version": "file:packages/durable-objects", "requires": { @@ -10561,6 +10780,8 @@ "version": "file:packages/shared", "requires": { "@miniflare/shared-test": "2.6.0", + "@types/better-sqlite3": "^7.5.0", + "better-sqlite3": "^7.5.3", "ignore": "^5.1.8", "kleur": "^4.1.4" } @@ -10789,6 +11010,14 @@ "@babel/types": "^7.3.0" } }, + "@types/better-sqlite3": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.5.0.tgz", + "integrity": "sha512-G9ZbMjydW2yj1AgiPlUtdgF3a1qNpLJLudc9ynJCeJByS3XFWpmT9LT+VSHrKHFbxb31CvtYwetLTOvG9zdxdg==", + "requires": { + "@types/node": "*" + } + }, "@types/busboy": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.0.tgz", @@ -10883,8 +11112,7 @@ "@types/node": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", - "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==", - "dev": true + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" }, "@types/node-forge": { "version": "0.10.9", @@ -11379,8 +11607,16 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "better-sqlite3": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", + "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } }, "binary-extensions": { "version": "2.2.0", @@ -11388,11 +11624,18 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -11466,7 +11709,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -11603,6 +11845,11 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -11885,8 +12132,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.4", @@ -11957,6 +12203,11 @@ "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -12023,7 +12274,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -12501,6 +12751,11 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12582,6 +12837,11 @@ "flat-cache": "^3.0.4" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -12616,6 +12876,11 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -12697,6 +12962,11 @@ "get-intrinsic": "^1.1.1" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -12861,8 +13131,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.1.8", @@ -12986,8 +13255,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "2.0.0", @@ -14575,7 +14843,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -14689,6 +14956,7 @@ "@miniflare/cache": "2.6.0", "@miniflare/cli-parser": "2.6.0", "@miniflare/core": "2.6.0", + "@miniflare/d1": "2.6.0", "@miniflare/durable-objects": "2.6.0", "@miniflare/html-rewriter": "2.6.0", "@miniflare/http-server": "2.6.0", @@ -14722,8 +14990,12 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "mri": { "version": "1.2.0", @@ -14742,12 +15014,25 @@ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node-abi": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", + "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", + "requires": { + "semver": "^7.3.5" + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -14845,7 +15130,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -15150,6 +15434,25 @@ "irregular-plurals": "^3.2.0" } }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -15238,7 +15541,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -15269,7 +15571,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -15280,14 +15581,12 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } }, @@ -15353,7 +15652,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15501,8 +15799,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "scheduler": { "version": "0.22.0", @@ -15530,7 +15827,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -15606,6 +15902,36 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -15743,7 +16069,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" }, @@ -15751,8 +16076,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -15868,6 +16192,29 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -15979,6 +16326,14 @@ "tslib": "^1.8.1" } }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -16103,8 +16458,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "v8-compile-cache": { "version": "2.3.0", @@ -16229,8 +16583,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", @@ -16265,8 +16618,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "16.2.0", diff --git a/packages/d1/package.json b/packages/d1/package.json index ca24bf155..bb9662589 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -36,10 +36,10 @@ "extends": "../../package.json" }, "dependencies": { - "@miniflare/core": "^2.5.0", - "@miniflare/shared": "2.5.0" + "@miniflare/core": "^2.6.0", + "@miniflare/shared": "2.6.0" }, "devDependencies": { - "@miniflare/shared-test": "2.5.0" + "@miniflare/shared-test": "2.6.0" } } From 110edcea9abdb892db6d29f252f01d6a1f1b8d12 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Fri, 29 Jul 2022 11:27:22 +0100 Subject: [PATCH 05/16] Fixing types and tests --- packages/d1/src/database.ts | 7 ++--- packages/d1/test/database.spec.ts | 51 +++++++++++++++---------------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts index 64b24a592..a431d33a5 100644 --- a/packages/d1/src/database.ts +++ b/packages/d1/src/database.ts @@ -5,12 +5,11 @@ import Database from "better-sqlite3"; type BindParams = any[] | [Record]; function errorWithCause(message: string, e: unknown) { - return new Error(message, { - cause: e, - }); + // @ts-ignore Errors have causes now, why don't you know this Typescript? + return new Error(message, { cause: e }); } -class Statement { +export class Statement { readonly #db: Database.Database; readonly #query: string; readonly #bindings: BindParams | undefined; diff --git a/packages/d1/test/database.spec.ts b/packages/d1/test/database.spec.ts index 7b180c486..997f4a4d4 100644 --- a/packages/d1/test/database.spec.ts +++ b/packages/d1/test/database.spec.ts @@ -17,33 +17,30 @@ test.beforeEach((t) => { t.context = { storage, db }; }); -test("fetch: accepts /execute and /query", async (t) => { +test("batch, prepare & all", async (t) => { const { db } = t.context; - await db.fetch("/execute", { - method: "POST", - body: JSON.stringify({ - sql: `CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL);`, - }), - }); - const response = await db.fetch("/query", { - method: "POST", - body: JSON.stringify({ - sql: `SELECT * FROM sqlite_schema`, - }), - }); - t.deepEqual(await response.json(), { - success: true, - result: [ - [ - { - type: "table", - name: "my_table", - tbl_name: "my_table", - rootpage: 2, - sql: "CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL)", - }, - ], - ], - }); + await db.batch([ + db.prepare( + `CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL);` + ), + ]); + const response = await db.prepare(`SELECT * FROM sqlite_schema`).all(); + t.deepEqual(Object.keys(response), [ + "results", + "duration", + "lastRowId", + "changes", + "success", + "served_by", + ]); + t.deepEqual(response.results, [ + { + type: "table", + name: "my_table", + tbl_name: "my_table", + rootpage: 2, + sql: "CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL)", + }, + ]); }); From e9a78edd303e410f3da48f8ff703ebf64465eb3b Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Fri, 29 Jul 2022 11:31:24 +0100 Subject: [PATCH 06/16] npm install --- package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package-lock.json b/package-lock.json index d03259d7a..133faac63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8238,6 +8238,7 @@ } }, "packages/d1": { + "name": "@miniflare/d1", "version": "2.6.0", "license": "MIT", "dependencies": { From 7e1de66f3efce5e916f93ed880f56df9fdcb2fa9 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Thu, 4 Aug 2022 15:57:29 +0100 Subject: [PATCH 07/16] lazy-installing better-sqlite3 using npx-import --- package-lock.json | 706 ++++++++++++--------------- packages/d1/src/database.ts | 16 +- packages/d1/src/plugin.ts | 4 +- packages/shared/package.json | 2 +- packages/shared/src/storage.ts | 13 +- packages/storage-file/src/index.ts | 18 +- packages/storage-memory/src/local.ts | 16 +- 7 files changed, 351 insertions(+), 424 deletions(-) diff --git a/package-lock.json b/package-lock.json index 133faac63..a845bc0e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2429,6 +2429,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -2444,16 +2445,6 @@ } ] }, - "node_modules/better-sqlite3": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", - "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.0" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2463,18 +2454,11 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -2567,6 +2551,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -2591,6 +2576,14 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dependencies": { + "semver": "^7.0.0" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -2767,11 +2760,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -3045,7 +3033,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3131,6 +3118,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, "engines": { "node": ">=4.0.0" } @@ -3225,14 +3213,6 @@ "node": ">=6" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3320,6 +3300,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "dependencies": { "once": "^1.4.0" } @@ -3954,14 +3935,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4056,11 +4029,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4104,11 +4072,6 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -4200,7 +4163,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -4224,11 +4186,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -4452,6 +4409,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -4638,7 +4596,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "2.0.0", @@ -5095,8 +5054,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -5818,8 +5776,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -5892,12 +5849,8 @@ "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "node_modules/mri": { "version": "1.2.0", @@ -5922,28 +5875,12 @@ "mustache": "bin/mustache" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/node-abi": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", - "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -6015,6 +5952,119 @@ "node": ">=8" } }, + "node_modules/npx-import": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.0.tgz", + "integrity": "sha512-hxUjLjCpXEHEWazNBhwzAF1JG29rVYy9s3ED89r73E+KTQoG0Mr0LP//YCvcVd0WPQoE3cHSl4kxyKkv3tqwhw==", + "dependencies": { + "execa": "^6.1.0", + "parse-package-name": "^1.0.0", + "semver": "^7.3.7", + "validate-npm-package-name": "^4.0.0" + } + }, + "node_modules/npx-import/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/npx-import/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/npx-import/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", @@ -6072,6 +6122,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "dependencies": { "wrappy": "1" } @@ -6317,6 +6368,11 @@ "node": ">=6" } }, + "node_modules/parse-package-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -6339,7 +6395,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -6496,31 +6551,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6638,6 +6668,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6688,6 +6719,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -6701,12 +6733,14 @@ "node_modules/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6789,6 +6823,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7003,7 +7038,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/scheduler": { "version": "0.22.0", @@ -7034,9 +7070,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7104,7 +7140,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7116,7 +7151,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -7138,76 +7172,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -7372,6 +7337,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -7380,6 +7346,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -7552,32 +7519,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -7722,17 +7663,6 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7898,7 +7828,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "node_modules/v8-compile-cache": { "version": "2.3.0", @@ -7916,6 +7847,17 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -7956,7 +7898,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8057,7 +7998,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -9447,9 +9389,9 @@ "license": "MIT", "dependencies": { "@types/better-sqlite3": "^7.5.0", - "better-sqlite3": "^7.5.3", "ignore": "^5.1.8", - "kleur": "^4.1.4" + "kleur": "^4.1.4", + "npx-import": "^1.0.0" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" @@ -10782,9 +10724,9 @@ "requires": { "@miniflare/shared-test": "2.6.0", "@types/better-sqlite3": "^7.5.0", - "better-sqlite3": "^7.5.3", "ignore": "^5.1.8", - "kleur": "^4.1.4" + "kleur": "^4.1.4", + "npx-import": "^1.0.0" } }, "@miniflare/shared-test": { @@ -11608,16 +11550,8 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "better-sqlite3": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", - "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", - "requires": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.0" - } + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, "binary-extensions": { "version": "2.2.0", @@ -11625,18 +11559,11 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -11710,6 +11637,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -11720,6 +11648,14 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "requires": { + "semver": "^7.0.0" + } + }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -11846,11 +11782,6 @@ "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -12069,7 +12000,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -12133,7 +12063,8 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true }, "deep-is": { "version": "0.1.4", @@ -12204,11 +12135,6 @@ "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -12275,6 +12201,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -12752,11 +12679,6 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12838,11 +12760,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -12877,11 +12794,6 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -12950,8 +12862,7 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-symbol-description": { "version": "1.0.0", @@ -12963,11 +12874,6 @@ "get-intrinsic": "^1.1.1" } }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -13132,7 +13038,8 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true }, "ignore": { "version": "5.1.8", @@ -13256,7 +13163,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "2.0.0", @@ -13564,8 +13472,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -14914,8 +14821,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -14991,12 +14897,8 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "mri": { "version": "1.2.0", @@ -15015,25 +14917,12 @@ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node-abi": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", - "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", - "requires": { - "semver": "^7.3.5" - } - }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -15092,6 +14981,76 @@ "path-key": "^3.0.0" } }, + "npx-import": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.0.tgz", + "integrity": "sha512-hxUjLjCpXEHEWazNBhwzAF1JG29rVYy9s3ED89r73E+KTQoG0Mr0LP//YCvcVd0WPQoE3cHSl4kxyKkv3tqwhw==", + "requires": { + "execa": "^6.1.0", + "parse-package-name": "^1.0.0", + "semver": "^7.3.7", + "validate-npm-package-name": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==" + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + } + } + }, "object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", @@ -15131,6 +15090,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -15308,6 +15268,11 @@ "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", "dev": true }, + "parse-package-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -15323,8 +15288,7 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -15435,25 +15399,6 @@ "irregular-plurals": "^3.2.0" } }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -15542,6 +15487,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -15572,6 +15518,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -15582,12 +15529,14 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true } } }, @@ -15653,6 +15602,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15800,7 +15750,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "scheduler": { "version": "0.22.0", @@ -15825,9 +15776,9 @@ "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -15875,7 +15826,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -15883,8 +15833,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { "version": "1.0.4", @@ -15900,38 +15849,7 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sisteransi": { "version": "1.0.5", @@ -16070,6 +15988,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "requires": { "safe-buffer": "~5.2.0" }, @@ -16077,7 +15996,8 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true } } }, @@ -16193,29 +16113,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -16327,14 +16224,6 @@ "tslib": "^1.8.1" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -16459,7 +16348,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "v8-compile-cache": { "version": "2.3.0", @@ -16477,6 +16367,14 @@ "spdx-expression-parse": "^3.0.0" } }, + "validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "requires": { + "builtins": "^5.0.0" + } + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -16511,7 +16409,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -16584,7 +16481,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "3.0.3", diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts index a431d33a5..f8556fddf 100644 --- a/packages/d1/src/database.ts +++ b/packages/d1/src/database.ts @@ -1,6 +1,6 @@ import { performance } from "node:perf_hooks"; import { Storage } from "@miniflare/shared"; -import Database from "better-sqlite3"; +import type Database from "better-sqlite3"; type BindParams = any[] | [Record]; @@ -123,16 +123,25 @@ export class Statement { } } +function assert(db: T | undefined): asserts db is T { + if (typeof db === "undefined") + throw new Error("D1 BetaDatabase must have await init() called!"); +} + export class BetaDatabase { readonly #storage: Storage; - readonly #db: Database.Database; + #db?: Database.Database; constructor(storage: Storage) { this.#storage = storage; - this.#db = storage.getSqliteDatabase(); + } + + async init() { + this.#db = await this.#storage.getSqliteDatabase(); } prepare(source: string) { + assert(this.#db); return new Statement(this.#db, source); } @@ -141,6 +150,7 @@ export class BetaDatabase { } async exec(multiLineStatements: string) { + assert(this.#db); const statements = multiLineStatements .split("\n") .map((line) => line.trim()) diff --git a/packages/d1/src/plugin.ts b/packages/d1/src/plugin.ts index 8272db271..b48003948 100644 --- a/packages/d1/src/plugin.ts +++ b/packages/d1/src/plugin.ts @@ -46,7 +46,9 @@ export class D1Plugin extends Plugin implements D1Options { storage: StorageFactory, dbName: string ): Promise { - return new BetaDatabase(await storage.storage(dbName, this.#persist)); + const db = new BetaDatabase(await storage.storage(dbName, this.#persist)); + await db.init(); + return db; } async setup(storageFactory: StorageFactory): Promise { diff --git a/packages/shared/package.json b/packages/shared/package.json index bc3ae1831..f59a72c15 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "@types/better-sqlite3": "^7.5.0", - "better-sqlite3": "^7.5.3", + "npx-import": "^1.0.0", "ignore": "^5.1.8", "kleur": "^4.1.4" }, diff --git a/packages/shared/src/storage.ts b/packages/shared/src/storage.ts index 76e584b5a..b05051db3 100644 --- a/packages/shared/src/storage.ts +++ b/packages/shared/src/storage.ts @@ -1,5 +1,5 @@ import path from "node:path"; -import type { Database } from "better-sqlite3"; +import type Database from "better-sqlite3"; import { Awaitable } from "./sync"; export interface StoredMeta { @@ -118,7 +118,7 @@ export abstract class Storage { options: StorageListOptions, skipMetadata: true ): Awaitable>; - getSqliteDatabase(): Database { + async getSqliteDatabase(): Promise { throw new Error("D1 not implemented for this Storage class"); } @@ -167,9 +167,14 @@ export interface StorageFactory { dispose?(): Awaitable; } -export function getSQLiteNativeBindingLocation() { +// @types/better-sqlite3 doesn't seem to export DatabaseConstructor, so we do this +export type BetterSqlite3Exports = { + new (filename: string, options?: Database.Options): Database.Database; +}; + +export function getSQLiteNativeBindingLocation(sqliteResolvePath: string) { return path.resolve( - path.dirname(require.resolve("better-sqlite3")), + path.dirname(sqliteResolvePath), "../build/Release/better_sqlite3.node" ); } diff --git a/packages/storage-file/src/index.ts b/packages/storage-file/src/index.ts index 40fc675d3..0d3ac926a 100644 --- a/packages/storage-file/src/index.ts +++ b/packages/storage-file/src/index.ts @@ -1,7 +1,7 @@ -import { existsSync } from "fs"; -import fs from "fs"; +import fs, { existsSync } from "fs"; import path from "path"; import { + BetterSqlite3Exports, MiniflareError, Range, RangeStoredValueMeta, @@ -14,7 +14,8 @@ import { viewToArray, } from "@miniflare/shared"; import { LocalStorage } from "@miniflare/storage-memory"; -import Database from "better-sqlite3"; +import type Database from "better-sqlite3"; +import { npxImport, npxResolve } from "npx-import"; import { deleteFile, readFile, @@ -107,10 +108,15 @@ export class FileStorage extends LocalStorage { } } - getSqliteDatabase(): Database.Database { + async getSqliteDatabase(): Promise { + const DatabaseConstructor = await npxImport( + "better-sqlite3@^7.5.3" + ); fs.mkdirSync(path.dirname(this.root), { recursive: true }); - return new Database(this.root + ".sqlite3", { - nativeBinding: getSQLiteNativeBindingLocation(), + return new DatabaseConstructor(this.root + ".sqlite3", { + nativeBinding: getSQLiteNativeBindingLocation( + npxResolve("better-sqlite3") + ), }); } diff --git a/packages/storage-memory/src/local.ts b/packages/storage-memory/src/local.ts index 272ba3799..32e8260d6 100644 --- a/packages/storage-memory/src/local.ts +++ b/packages/storage-memory/src/local.ts @@ -1,5 +1,6 @@ import { Awaitable, + BetterSqlite3Exports, Range, RangeStoredValueMeta, Storage, @@ -12,7 +13,8 @@ import { getSQLiteNativeBindingLocation, millisToSeconds, } from "@miniflare/shared"; -import Database from "better-sqlite3"; +import type Database from "better-sqlite3"; +import { npxImport, npxResolve } from "npx-import"; import { listFilterMatch, listPaginate } from "./helpers"; export abstract class LocalStorage extends Storage { @@ -119,10 +121,14 @@ export abstract class LocalStorage extends Storage { return res; } - getSqliteDatabase(): Database.Database { - const location = getSQLiteNativeBindingLocation(); - return new Database(":memory:", { - nativeBinding: location, + async getSqliteDatabase(): Promise { + const DatabaseConstructor = await npxImport( + "better-sqlite3@^7.5.3" + ); + return new DatabaseConstructor(":memory:", { + nativeBinding: getSQLiteNativeBindingLocation( + npxResolve("better-sqlite3") + ), }); } } From b8201b7651ef50594d8c3786f8ba210dc24c6906 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Thu, 4 Aug 2022 16:35:32 +0100 Subject: [PATCH 08/16] fixed tests and removed type alias --- package-lock.json | 4 ++-- packages/d1/package.json | 2 +- packages/d1/src/database.ts | 2 +- packages/d1/test/database.spec.ts | 3 ++- packages/shared/src/storage.ts | 5 ----- packages/storage-file/src/index.ts | 7 +++---- packages/storage-memory/src/local.ts | 7 +++---- 7 files changed, 12 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index a845bc0e1..fc3f5baa6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8184,7 +8184,7 @@ "version": "2.6.0", "license": "MIT", "dependencies": { - "@miniflare/core": "^2.6.0", + "@miniflare/core": "2.6.0", "@miniflare/shared": "2.6.0" }, "devDependencies": { @@ -10646,7 +10646,7 @@ "@miniflare/d1": { "version": "file:packages/d1", "requires": { - "@miniflare/core": "^2.6.0", + "@miniflare/core": "2.6.0", "@miniflare/shared": "2.6.0", "@miniflare/shared-test": "2.6.0" } diff --git a/packages/d1/package.json b/packages/d1/package.json index bb9662589..9c7e1592d 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -36,7 +36,7 @@ "extends": "../../package.json" }, "dependencies": { - "@miniflare/core": "^2.6.0", + "@miniflare/core": "2.6.0", "@miniflare/shared": "2.6.0" }, "devDependencies": { diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts index f8556fddf..8f7cc5ab6 100644 --- a/packages/d1/src/database.ts +++ b/packages/d1/src/database.ts @@ -2,7 +2,7 @@ import { performance } from "node:perf_hooks"; import { Storage } from "@miniflare/shared"; import type Database from "better-sqlite3"; -type BindParams = any[] | [Record]; +export type BindParams = any[] | [Record]; function errorWithCause(message: string, e: unknown) { // @ts-ignore Errors have causes now, why don't you know this Typescript? diff --git a/packages/d1/test/database.spec.ts b/packages/d1/test/database.spec.ts index 997f4a4d4..26f02e693 100644 --- a/packages/d1/test/database.spec.ts +++ b/packages/d1/test/database.spec.ts @@ -11,9 +11,10 @@ interface Context { const test = anyTest as TestInterface; -test.beforeEach((t) => { +test.beforeEach(async (t) => { const storage = new MemoryStorage(undefined, testClock); const db = new BetaDatabase(storage); + await db.init(); t.context = { storage, db }; }); diff --git a/packages/shared/src/storage.ts b/packages/shared/src/storage.ts index b05051db3..bf2e6f09b 100644 --- a/packages/shared/src/storage.ts +++ b/packages/shared/src/storage.ts @@ -167,11 +167,6 @@ export interface StorageFactory { dispose?(): Awaitable; } -// @types/better-sqlite3 doesn't seem to export DatabaseConstructor, so we do this -export type BetterSqlite3Exports = { - new (filename: string, options?: Database.Options): Database.Database; -}; - export function getSQLiteNativeBindingLocation(sqliteResolvePath: string) { return path.resolve( path.dirname(sqliteResolvePath), diff --git a/packages/storage-file/src/index.ts b/packages/storage-file/src/index.ts index 0d3ac926a..3bf18b03f 100644 --- a/packages/storage-file/src/index.ts +++ b/packages/storage-file/src/index.ts @@ -1,7 +1,6 @@ import fs, { existsSync } from "fs"; import path from "path"; import { - BetterSqlite3Exports, MiniflareError, Range, RangeStoredValueMeta, @@ -109,9 +108,9 @@ export class FileStorage extends LocalStorage { } async getSqliteDatabase(): Promise { - const DatabaseConstructor = await npxImport( - "better-sqlite3@^7.5.3" - ); + const DatabaseConstructor = await npxImport< + typeof import("better-sqlite3") + >("better-sqlite3@^7.5.3"); fs.mkdirSync(path.dirname(this.root), { recursive: true }); return new DatabaseConstructor(this.root + ".sqlite3", { nativeBinding: getSQLiteNativeBindingLocation( diff --git a/packages/storage-memory/src/local.ts b/packages/storage-memory/src/local.ts index 32e8260d6..649d610d1 100644 --- a/packages/storage-memory/src/local.ts +++ b/packages/storage-memory/src/local.ts @@ -1,6 +1,5 @@ import { Awaitable, - BetterSqlite3Exports, Range, RangeStoredValueMeta, Storage, @@ -122,9 +121,9 @@ export abstract class LocalStorage extends Storage { } async getSqliteDatabase(): Promise { - const DatabaseConstructor = await npxImport( - "better-sqlite3@^7.5.3" - ); + const DatabaseConstructor = await npxImport< + typeof import("better-sqlite3") + >("better-sqlite3@^7.5.3"); return new DatabaseConstructor(":memory:", { nativeBinding: getSQLiteNativeBindingLocation( npxResolve("better-sqlite3") From 0563f664d91cdc4d05a4829b4cb0769de862e3fc Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Tue, 9 Aug 2022 12:21:47 +0100 Subject: [PATCH 09/16] fixing npx-import problems with local installs of sqlite3 --- package-lock.json | 32 ++++++++++++++-------------- packages/shared/package.json | 6 +++--- packages/storage-file/src/index.ts | 6 +++--- packages/storage-memory/src/local.ts | 6 +++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc3f5baa6..4fd9a045f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1651,9 +1651,9 @@ } }, "node_modules/@types/better-sqlite3": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.5.0.tgz", - "integrity": "sha512-G9ZbMjydW2yj1AgiPlUtdgF3a1qNpLJLudc9ynJCeJByS3XFWpmT9LT+VSHrKHFbxb31CvtYwetLTOvG9zdxdg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.0.tgz", + "integrity": "sha512-rnSP9vY+fVsF3iJja5yRGBJV63PNBiezJlYrCkqUmQWFoB16cxAHwOkjsAYEu317miOfKaJpa65cbp0P4XJ/jw==", "dependencies": { "@types/node": "*" } @@ -5953,9 +5953,9 @@ } }, "node_modules/npx-import": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.0.tgz", - "integrity": "sha512-hxUjLjCpXEHEWazNBhwzAF1JG29rVYy9s3ED89r73E+KTQoG0Mr0LP//YCvcVd0WPQoE3cHSl4kxyKkv3tqwhw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.2.tgz", + "integrity": "sha512-T5h3UmkdaGsLrS5rMug7PeWNMmXbe2Cz3BOdA4AorBVANRh0ZFUE+/Fcm34wFleXEx6kFJBo1BGvmsqWn6mW3Q==", "dependencies": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", @@ -9388,10 +9388,10 @@ "version": "2.6.0", "license": "MIT", "dependencies": { - "@types/better-sqlite3": "^7.5.0", + "@types/better-sqlite3": "^7.6.0", "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.0" + "npx-import": "^1.0.2" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" @@ -10723,10 +10723,10 @@ "version": "file:packages/shared", "requires": { "@miniflare/shared-test": "2.6.0", - "@types/better-sqlite3": "^7.5.0", + "@types/better-sqlite3": "7.6.0", "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.0" + "npx-import": "^1.0.2" } }, "@miniflare/shared-test": { @@ -10954,9 +10954,9 @@ } }, "@types/better-sqlite3": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.5.0.tgz", - "integrity": "sha512-G9ZbMjydW2yj1AgiPlUtdgF3a1qNpLJLudc9ynJCeJByS3XFWpmT9LT+VSHrKHFbxb31CvtYwetLTOvG9zdxdg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.0.tgz", + "integrity": "sha512-rnSP9vY+fVsF3iJja5yRGBJV63PNBiezJlYrCkqUmQWFoB16cxAHwOkjsAYEu317miOfKaJpa65cbp0P4XJ/jw==", "requires": { "@types/node": "*" } @@ -14982,9 +14982,9 @@ } }, "npx-import": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.0.tgz", - "integrity": "sha512-hxUjLjCpXEHEWazNBhwzAF1JG29rVYy9s3ED89r73E+KTQoG0Mr0LP//YCvcVd0WPQoE3cHSl4kxyKkv3tqwhw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.2.tgz", + "integrity": "sha512-T5h3UmkdaGsLrS5rMug7PeWNMmXbe2Cz3BOdA4AorBVANRh0ZFUE+/Fcm34wFleXEx6kFJBo1BGvmsqWn6mW3Q==", "requires": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", diff --git a/packages/shared/package.json b/packages/shared/package.json index f59a72c15..449cef1a3 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -35,10 +35,10 @@ "extends": "../../package.json" }, "dependencies": { - "@types/better-sqlite3": "^7.5.0", - "npx-import": "^1.0.0", + "@types/better-sqlite3": "^7.6.0", "ignore": "^5.1.8", - "kleur": "^4.1.4" + "kleur": "^4.1.4", + "npx-import": "^1.0.2" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" diff --git a/packages/storage-file/src/index.ts b/packages/storage-file/src/index.ts index 3bf18b03f..0e81c2f73 100644 --- a/packages/storage-file/src/index.ts +++ b/packages/storage-file/src/index.ts @@ -108,9 +108,9 @@ export class FileStorage extends LocalStorage { } async getSqliteDatabase(): Promise { - const DatabaseConstructor = await npxImport< - typeof import("better-sqlite3") - >("better-sqlite3@^7.5.3"); + const { default: DatabaseConstructor } = await npxImport<{ + default: typeof import("better-sqlite3"); + }>("better-sqlite3@7.6.2"); fs.mkdirSync(path.dirname(this.root), { recursive: true }); return new DatabaseConstructor(this.root + ".sqlite3", { nativeBinding: getSQLiteNativeBindingLocation( diff --git a/packages/storage-memory/src/local.ts b/packages/storage-memory/src/local.ts index 649d610d1..cca014329 100644 --- a/packages/storage-memory/src/local.ts +++ b/packages/storage-memory/src/local.ts @@ -121,9 +121,9 @@ export abstract class LocalStorage extends Storage { } async getSqliteDatabase(): Promise { - const DatabaseConstructor = await npxImport< - typeof import("better-sqlite3") - >("better-sqlite3@^7.5.3"); + const { default: DatabaseConstructor } = await npxImport<{ + default: typeof import("better-sqlite3"); + }>("better-sqlite3@7.6.2"); return new DatabaseConstructor(":memory:", { nativeBinding: getSQLiteNativeBindingLocation( npxResolve("better-sqlite3") From f2506538b3b61b3b503187f9b28b67d6e6e17d5a Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Fri, 12 Aug 2022 16:56:00 +0100 Subject: [PATCH 10/16] Invoking better-sqlite3 through @miniflare/d1 instead --- package-lock.json | 8 ++--- packages/d1/package.json | 3 +- packages/d1/src/database.ts | 49 +++++++++++++++++++++------- packages/shared/package.json | 1 - packages/shared/src/storage.ts | 11 +------ packages/storage-file/src/index.ts | 14 ++------ packages/storage-memory/src/local.ts | 14 ++------ 7 files changed, 49 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4fd9a045f..1ec5ecf3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8185,7 +8185,8 @@ "license": "MIT", "dependencies": { "@miniflare/core": "2.6.0", - "@miniflare/shared": "2.6.0" + "@miniflare/shared": "2.6.0", + "@types/better-sqlite3": "^7.6.0" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" @@ -9388,7 +9389,6 @@ "version": "2.6.0", "license": "MIT", "dependencies": { - "@types/better-sqlite3": "^7.6.0", "ignore": "^5.1.8", "kleur": "^4.1.4", "npx-import": "^1.0.2" @@ -10648,7 +10648,8 @@ "requires": { "@miniflare/core": "2.6.0", "@miniflare/shared": "2.6.0", - "@miniflare/shared-test": "2.6.0" + "@miniflare/shared-test": "2.6.0", + "@types/better-sqlite3": "^7.6.0" } }, "@miniflare/durable-objects": { @@ -10723,7 +10724,6 @@ "version": "file:packages/shared", "requires": { "@miniflare/shared-test": "2.6.0", - "@types/better-sqlite3": "7.6.0", "ignore": "^5.1.8", "kleur": "^4.1.4", "npx-import": "^1.0.2" diff --git a/packages/d1/package.json b/packages/d1/package.json index 9c7e1592d..c1d191aa0 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -37,7 +37,8 @@ }, "dependencies": { "@miniflare/core": "2.6.0", - "@miniflare/shared": "2.6.0" + "@miniflare/shared": "2.6.0", + "@types/better-sqlite3": "^7.6.0" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts index 8f7cc5ab6..a43eb5d32 100644 --- a/packages/d1/src/database.ts +++ b/packages/d1/src/database.ts @@ -1,7 +1,17 @@ +import path from "node:path"; import { performance } from "node:perf_hooks"; import { Storage } from "@miniflare/shared"; -import type Database from "better-sqlite3"; - +import type { + Database as SqliteDB, + Options as SqliteOptions, + Statement as SqliteStatement, +} from "better-sqlite3"; +import { npxImport, npxResolve } from "npx-import"; + +// Can't export typeof import(), so reproducing BetterSqlite3.DatabaseConstructor here +export interface DBConstructor { + new (filename: string | Buffer, options?: SqliteOptions): SqliteDB; +} export type BindParams = any[] | [Record]; function errorWithCause(message: string, e: unknown) { @@ -10,11 +20,11 @@ function errorWithCause(message: string, e: unknown) { } export class Statement { - readonly #db: Database.Database; + readonly #db: SqliteDB; readonly #query: string; readonly #bindings: BindParams | undefined; - constructor(db: Database.Database, query: string, bindings?: BindParams) { + constructor(db: SqliteDB, query: string, bindings?: BindParams) { this.#db = db; this.#query = query; this.#bindings = bindings; @@ -61,7 +71,7 @@ export class Statement { throw errorWithCause("D1_ALL_ERROR", e); } } - private static _all(statementWithBindings: Database.Statement) { + private static _all(statementWithBindings: SqliteStatement) { try { return statementWithBindings.all(); } catch (e: unknown) { @@ -87,7 +97,7 @@ export class Statement { throw errorWithCause("D1_FIRST_ERROR", e); } } - private static _first(statementWithBindings: Database.Statement) { + private static _first(statementWithBindings: SqliteStatement) { return statementWithBindings.get(); } @@ -110,7 +120,7 @@ export class Statement { throw errorWithCause("D1_RUN_ERROR", e); } } - private static _run(statementWithBindings: Database.Statement) { + private static _run(statementWithBindings: SqliteStatement) { return statementWithBindings.run(); } @@ -118,26 +128,27 @@ export class Statement { const statementWithBindings = this.prepareAndBind(); return Statement._raw(statementWithBindings); } - private static _raw(statementWithBindings: Database.Statement) { + private static _raw(statementWithBindings: SqliteStatement) { return statementWithBindings.raw() as any; } } function assert(db: T | undefined): asserts db is T { if (typeof db === "undefined") - throw new Error("D1 BetaDatabase must have await init() called!"); + throw new Error("D1 BetaDatabase must have `await init()` called!"); } export class BetaDatabase { readonly #storage: Storage; - #db?: Database.Database; + #db?: SqliteDB; constructor(storage: Storage) { this.#storage = storage; } async init() { - this.#db = await this.#storage.getSqliteDatabase(); + const dbPath = this.#storage.getSqliteDatabasePath(); + this.#db = await createSQLiteDB(dbPath); } prepare(source: string) { @@ -169,3 +180,19 @@ export class BetaDatabase { throw new Error("DB.dump() not implemented locally!"); } } + +export async function createSQLiteDB(dbPath: string): Promise { + const { default: DatabaseConstructor } = await npxImport<{ + default: DBConstructor; + }>("better-sqlite3@7.6.2"); + return new DatabaseConstructor(dbPath, { + nativeBinding: getSQLiteNativeBindingLocation(npxResolve("better-sqlite3")), + }); +} + +export function getSQLiteNativeBindingLocation(sqliteResolvePath: string) { + return path.resolve( + path.dirname(sqliteResolvePath), + "../build/Release/better_sqlite3.node" + ); +} diff --git a/packages/shared/package.json b/packages/shared/package.json index 449cef1a3..0981d8976 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -35,7 +35,6 @@ "extends": "../../package.json" }, "dependencies": { - "@types/better-sqlite3": "^7.6.0", "ignore": "^5.1.8", "kleur": "^4.1.4", "npx-import": "^1.0.2" diff --git a/packages/shared/src/storage.ts b/packages/shared/src/storage.ts index bf2e6f09b..d74d193c3 100644 --- a/packages/shared/src/storage.ts +++ b/packages/shared/src/storage.ts @@ -1,5 +1,3 @@ -import path from "node:path"; -import type Database from "better-sqlite3"; import { Awaitable } from "./sync"; export interface StoredMeta { @@ -118,7 +116,7 @@ export abstract class Storage { options: StorageListOptions, skipMetadata: true ): Awaitable>; - async getSqliteDatabase(): Promise { + getSqliteDatabasePath(): string { throw new Error("D1 not implemented for this Storage class"); } @@ -166,10 +164,3 @@ export interface StorageFactory { storage(namespace: string, persist?: boolean | string): Awaitable; dispose?(): Awaitable; } - -export function getSQLiteNativeBindingLocation(sqliteResolvePath: string) { - return path.resolve( - path.dirname(sqliteResolvePath), - "../build/Release/better_sqlite3.node" - ); -} diff --git a/packages/storage-file/src/index.ts b/packages/storage-file/src/index.ts index 0e81c2f73..94868007b 100644 --- a/packages/storage-file/src/index.ts +++ b/packages/storage-file/src/index.ts @@ -8,13 +8,10 @@ import { StoredMeta, StoredValueMeta, defaultClock, - getSQLiteNativeBindingLocation, sanitisePath, viewToArray, } from "@miniflare/shared"; import { LocalStorage } from "@miniflare/storage-memory"; -import type Database from "better-sqlite3"; -import { npxImport, npxResolve } from "npx-import"; import { deleteFile, readFile, @@ -107,16 +104,9 @@ export class FileStorage extends LocalStorage { } } - async getSqliteDatabase(): Promise { - const { default: DatabaseConstructor } = await npxImport<{ - default: typeof import("better-sqlite3"); - }>("better-sqlite3@7.6.2"); + getSqliteDatabasePath(): string { fs.mkdirSync(path.dirname(this.root), { recursive: true }); - return new DatabaseConstructor(this.root + ".sqlite3", { - nativeBinding: getSQLiteNativeBindingLocation( - npxResolve("better-sqlite3") - ), - }); + return this.root + ".sqlite3"; } async getRangeMaybeExpired( diff --git a/packages/storage-memory/src/local.ts b/packages/storage-memory/src/local.ts index cca014329..919ebbcc1 100644 --- a/packages/storage-memory/src/local.ts +++ b/packages/storage-memory/src/local.ts @@ -9,11 +9,8 @@ import { StoredMeta, StoredValueMeta, defaultClock, - getSQLiteNativeBindingLocation, millisToSeconds, } from "@miniflare/shared"; -import type Database from "better-sqlite3"; -import { npxImport, npxResolve } from "npx-import"; import { listFilterMatch, listPaginate } from "./helpers"; export abstract class LocalStorage extends Storage { @@ -120,14 +117,7 @@ export abstract class LocalStorage extends Storage { return res; } - async getSqliteDatabase(): Promise { - const { default: DatabaseConstructor } = await npxImport<{ - default: typeof import("better-sqlite3"); - }>("better-sqlite3@7.6.2"); - return new DatabaseConstructor(":memory:", { - nativeBinding: getSQLiteNativeBindingLocation( - npxResolve("better-sqlite3") - ), - }); + getSqliteDatabasePath(): string { + return ":memory:"; } } From f915a75c30d4e3e2bae27017a72487afb5b8d318 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Fri, 12 Aug 2022 17:55:06 +0100 Subject: [PATCH 11/16] bumping npx-import to version compatible with npx 7 --- package-lock.json | 410 ++++++++++++++++++++++++++++++++++- packages/d1/package.json | 3 +- packages/shared/package.json | 2 +- 3 files changed, 403 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ec5ecf3b..2611d474e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2445,6 +2445,17 @@ } ] }, + "node_modules/better-sqlite3": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", + "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2454,6 +2465,15 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2760,6 +2780,12 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "node_modules/chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -3213,6 +3239,15 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3935,6 +3970,15 @@ "node": ">= 0.8.0" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4029,6 +4073,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4072,6 +4122,12 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -4186,6 +4242,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -5852,6 +5914,12 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -5875,12 +5943,30 @@ "mustache": "bin/mustache" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/node-abi": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", + "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -5953,9 +6039,9 @@ } }, "node_modules/npx-import": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.2.tgz", - "integrity": "sha512-T5h3UmkdaGsLrS5rMug7PeWNMmXbe2Cz3BOdA4AorBVANRh0ZFUE+/Fcm34wFleXEx6kFJBo1BGvmsqWn6mW3Q==", + "version": "1.0.5-0", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.5-0.tgz", + "integrity": "sha512-tuERsE1gjO9xZRnoPROzEoZVoU8Xnpz8+B+yuvQNGFP8h49HviPuzPk5K2XTZATsdVTfkcLOXCIEpKrcxQa9sg==", "dependencies": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", @@ -6551,6 +6637,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7174,6 +7286,78 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -7519,6 +7703,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -7663,6 +7875,18 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8189,7 +8413,8 @@ "@types/better-sqlite3": "^7.6.0" }, "devDependencies": { - "@miniflare/shared-test": "2.6.0" + "@miniflare/shared-test": "2.6.0", + "better-sqlite3": "^7.6.2" }, "engines": { "node": ">=16.7" @@ -9391,7 +9616,7 @@ "dependencies": { "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.2" + "npx-import": "^1.0.5-0" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" @@ -10649,7 +10874,8 @@ "@miniflare/core": "2.6.0", "@miniflare/shared": "2.6.0", "@miniflare/shared-test": "2.6.0", - "@types/better-sqlite3": "^7.6.0" + "@types/better-sqlite3": "^7.6.0", + "better-sqlite3": "*" } }, "@miniflare/durable-objects": { @@ -10726,7 +10952,7 @@ "@miniflare/shared-test": "2.6.0", "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.2" + "npx-import": "^1.0.5-0" } }, "@miniflare/shared-test": { @@ -11553,12 +11779,31 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "better-sqlite3": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", + "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", + "dev": true, + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -11782,6 +12027,12 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -12135,6 +12386,12 @@ "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -12679,6 +12936,12 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12760,6 +13023,12 @@ "flat-cache": "^3.0.4" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -12794,6 +13063,12 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -12874,6 +13149,12 @@ "get-intrinsic": "^1.1.1" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -14900,6 +15181,12 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -14917,12 +15204,27 @@ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node-abi": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", + "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -14982,9 +15284,9 @@ } }, "npx-import": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.2.tgz", - "integrity": "sha512-T5h3UmkdaGsLrS5rMug7PeWNMmXbe2Cz3BOdA4AorBVANRh0ZFUE+/Fcm34wFleXEx6kFJBo1BGvmsqWn6mW3Q==", + "version": "1.0.5-0", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.5-0.tgz", + "integrity": "sha512-tuERsE1gjO9xZRnoPROzEoZVoU8Xnpz8+B+yuvQNGFP8h49HviPuzPk5K2XTZATsdVTfkcLOXCIEpKrcxQa9sg==", "requires": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", @@ -15399,6 +15701,26 @@ "irregular-plurals": "^3.2.0" } }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -15851,6 +16173,40 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -16113,6 +16469,31 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -16224,6 +16605,15 @@ "tslib": "^1.8.1" } }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/packages/d1/package.json b/packages/d1/package.json index c1d191aa0..4e9ba95cf 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -41,6 +41,7 @@ "@types/better-sqlite3": "^7.6.0" }, "devDependencies": { - "@miniflare/shared-test": "2.6.0" + "@miniflare/shared-test": "2.6.0", + "better-sqlite3": "^7.6.2" } } diff --git a/packages/shared/package.json b/packages/shared/package.json index 0981d8976..466828a08 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -37,7 +37,7 @@ "dependencies": { "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.2" + "npx-import": "^1.0.5-0" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" From 0acbdf864577cefd09176ad2ab407feb5ef3affe Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Mon, 12 Sep 2022 12:12:05 +0100 Subject: [PATCH 12/16] bumping to npx-import v1.1.0 which should work on windows --- package-lock.json | 410 +---------------------------------- packages/d1/package.json | 3 +- packages/shared/package.json | 2 +- 3 files changed, 12 insertions(+), 403 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2611d474e..489938d1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2445,17 +2445,6 @@ } ] }, - "node_modules/better-sqlite3": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", - "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.0" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2465,15 +2454,6 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2780,12 +2760,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -3239,15 +3213,6 @@ "node": ">=6" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3970,15 +3935,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4073,12 +4029,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4122,12 +4072,6 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -4242,12 +4186,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -5914,12 +5852,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -5943,30 +5875,12 @@ "mustache": "bin/mustache" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/node-abi": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", - "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -6039,9 +5953,9 @@ } }, "node_modules/npx-import": { - "version": "1.0.5-0", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.5-0.tgz", - "integrity": "sha512-tuERsE1gjO9xZRnoPROzEoZVoU8Xnpz8+B+yuvQNGFP8h49HviPuzPk5K2XTZATsdVTfkcLOXCIEpKrcxQa9sg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.0.tgz", + "integrity": "sha512-Duo36DvOrkb7H+tHzdoKnrjM3WI4+XEt35pcQ87LXxKWxQK3yOnKRCyskTO28ReYKRtqyfAKROs4GkYzwED/uA==", "dependencies": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", @@ -6637,32 +6551,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7286,78 +7174,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -7703,34 +7519,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -7875,18 +7663,6 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8413,8 +8189,7 @@ "@types/better-sqlite3": "^7.6.0" }, "devDependencies": { - "@miniflare/shared-test": "2.6.0", - "better-sqlite3": "^7.6.2" + "@miniflare/shared-test": "2.6.0" }, "engines": { "node": ">=16.7" @@ -9616,7 +9391,7 @@ "dependencies": { "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.5-0" + "npx-import": "^1.1.0" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" @@ -10874,8 +10649,7 @@ "@miniflare/core": "2.6.0", "@miniflare/shared": "2.6.0", "@miniflare/shared-test": "2.6.0", - "@types/better-sqlite3": "^7.6.0", - "better-sqlite3": "*" + "@types/better-sqlite3": "^7.6.0" } }, "@miniflare/durable-objects": { @@ -10952,7 +10726,7 @@ "@miniflare/shared-test": "2.6.0", "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.5-0" + "npx-import": "^1.1.0" } }, "@miniflare/shared-test": { @@ -11779,31 +11553,12 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "better-sqlite3": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", - "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", - "dev": true, - "requires": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.0" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -12027,12 +11782,6 @@ "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -12386,12 +12135,6 @@ "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", "dev": true }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -12936,12 +12679,6 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -13023,12 +12760,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -13063,12 +12794,6 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -13149,12 +12874,6 @@ "get-intrinsic": "^1.1.1" } }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -15181,12 +14900,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -15204,27 +14917,12 @@ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node-abi": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", - "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -15284,9 +14982,9 @@ } }, "npx-import": { - "version": "1.0.5-0", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.0.5-0.tgz", - "integrity": "sha512-tuERsE1gjO9xZRnoPROzEoZVoU8Xnpz8+B+yuvQNGFP8h49HviPuzPk5K2XTZATsdVTfkcLOXCIEpKrcxQa9sg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.0.tgz", + "integrity": "sha512-Duo36DvOrkb7H+tHzdoKnrjM3WI4+XEt35pcQ87LXxKWxQK3yOnKRCyskTO28ReYKRtqyfAKROs4GkYzwED/uA==", "requires": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", @@ -15701,26 +15399,6 @@ "irregular-plurals": "^3.2.0" } }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16173,40 +15851,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -16469,31 +16113,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -16605,15 +16224,6 @@ "tslib": "^1.8.1" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/packages/d1/package.json b/packages/d1/package.json index 4e9ba95cf..c1d191aa0 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -41,7 +41,6 @@ "@types/better-sqlite3": "^7.6.0" }, "devDependencies": { - "@miniflare/shared-test": "2.6.0", - "better-sqlite3": "^7.6.2" + "@miniflare/shared-test": "2.6.0" } } diff --git a/packages/shared/package.json b/packages/shared/package.json index 466828a08..34ad748a9 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -37,7 +37,7 @@ "dependencies": { "ignore": "^5.1.8", "kleur": "^4.1.4", - "npx-import": "^1.0.5-0" + "npx-import": "^1.1.0" }, "devDependencies": { "@miniflare/shared-test": "2.6.0" From 0252dd0d44973e1aed4659ec6a7ced0b78456d1c Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Mon, 12 Sep 2022 12:47:16 +0100 Subject: [PATCH 13/16] npx import v1.1.2 --- package-lock.json | 341 ++++++++++++++++++++++++++++++----- packages/d1/package.json | 8 +- packages/shared/package.json | 4 +- 3 files changed, 302 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc83195bf..69afe6d8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1306,6 +1306,10 @@ "resolved": "packages/core", "link": true }, + "node_modules/@miniflare/d1": { + "resolved": "packages/d1", + "link": true + }, "node_modules/@miniflare/durable-objects": { "resolved": "packages/durable-objects", "link": true @@ -1574,6 +1578,14 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.0.tgz", + "integrity": "sha512-rnSP9vY+fVsF3iJja5yRGBJV63PNBiezJlYrCkqUmQWFoB16cxAHwOkjsAYEu317miOfKaJpa65cbp0P4XJ/jw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/busboy": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.0.tgz", @@ -1683,8 +1695,7 @@ "node_modules/@types/node": { "version": "18.7.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz", - "integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==", - "dev": true + "integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==" }, "node_modules/@types/node-forge": { "version": "0.10.9", @@ -2643,6 +2654,14 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dependencies": { + "semver": "^7.0.0" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -3139,7 +3158,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4845,7 +4863,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -5811,8 +5828,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -6969,7 +6985,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7065,8 +7080,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -7292,6 +7306,119 @@ "node": ">=8" } }, + "node_modules/npx-import": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.2.tgz", + "integrity": "sha512-W/DCVEA7FQSK8vyphTLmT7LtGsZ8RJ85kRtAqhYediFCls9asiAebiKC9Y4S45u5e711fvDArC8UkbmX8nTwyg==", + "dependencies": { + "execa": "^6.1.0", + "parse-package-name": "^1.0.0", + "semver": "^7.3.7", + "validate-npm-package-name": "^4.0.0" + } + }, + "node_modules/npx-import/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/npx-import/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/npx-import/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nwsapi": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", @@ -7603,6 +7730,11 @@ "node": ">=6" } }, + "node_modules/parse-package-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -7633,7 +7765,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -8400,10 +8531,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8471,7 +8601,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -8483,7 +8612,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -8505,8 +8633,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sinon": { "version": "14.0.0", @@ -9343,6 +9470,17 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -9604,7 +9742,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -9777,8 +9914,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", @@ -9916,6 +10052,22 @@ "node": ">=16.13" } }, + "packages/d1": { + "name": "@miniflare/d1", + "version": "2.8.2", + "license": "MIT", + "dependencies": { + "@miniflare/core": "2.8.2", + "@miniflare/shared": "2.8.2", + "@types/better-sqlite3": "^7.6.0" + }, + "devDependencies": { + "@miniflare/shared-test": "2.8.2" + }, + "engines": { + "node": ">=16.7" + } + }, "packages/durable-objects": { "name": "@miniflare/durable-objects", "version": "2.8.2", @@ -10055,6 +10207,7 @@ "@miniflare/cache": "2.8.2", "@miniflare/cli-parser": "2.8.2", "@miniflare/core": "2.8.2", + "@miniflare/d1": "2.8.2", "@miniflare/durable-objects": "2.8.2", "@miniflare/html-rewriter": "2.8.2", "@miniflare/http-server": "2.8.2", @@ -10166,6 +10319,7 @@ "license": "MIT", "dependencies": { "kleur": "^4.1.4", + "npx-import": "^1.1.2", "picomatch": "^2.3.1" }, "devDependencies": { @@ -11353,6 +11507,15 @@ "urlpattern-polyfill": "^4.0.3" } }, + "@miniflare/d1": { + "version": "file:packages/d1", + "requires": { + "@miniflare/core": "2.8.2", + "@miniflare/shared": "2.8.2", + "@miniflare/shared-test": "2.8.2", + "@types/better-sqlite3": "^7.6.0" + } + }, "@miniflare/durable-objects": { "version": "file:packages/durable-objects", "requires": { @@ -11434,6 +11597,7 @@ "@miniflare/shared-test": "2.8.2", "@types/picomatch": "^2.3.0", "kleur": "^4.1.4", + "npx-import": "^1.1.2", "picomatch": "^2.3.1" } }, @@ -11702,6 +11866,14 @@ "@babel/types": "^7.3.0" } }, + "@types/better-sqlite3": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.0.tgz", + "integrity": "sha512-rnSP9vY+fVsF3iJja5yRGBJV63PNBiezJlYrCkqUmQWFoB16cxAHwOkjsAYEu317miOfKaJpa65cbp0P4XJ/jw==", + "requires": { + "@types/node": "*" + } + }, "@types/busboy": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.0.tgz", @@ -11811,8 +11983,7 @@ "@types/node": { "version": "18.7.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz", - "integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==", - "dev": true + "integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==" }, "@types/node-forge": { "version": "0.10.9", @@ -12510,6 +12681,14 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "requires": { + "semver": "^7.0.0" + } + }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -12886,7 +13065,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -14093,8 +14271,7 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-symbol-description": { "version": "1.0.0", @@ -14766,8 +14943,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -15689,7 +15865,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -15760,8 +15935,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -15822,6 +15996,7 @@ "@miniflare/cache": "2.8.2", "@miniflare/cli-parser": "2.8.2", "@miniflare/core": "2.8.2", + "@miniflare/d1": "2.8.2", "@miniflare/durable-objects": "2.8.2", "@miniflare/html-rewriter": "2.8.2", "@miniflare/http-server": "2.8.2", @@ -15959,6 +16134,76 @@ "path-key": "^3.0.0" } }, + "npx-import": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.2.tgz", + "integrity": "sha512-W/DCVEA7FQSK8vyphTLmT7LtGsZ8RJ85kRtAqhYediFCls9asiAebiKC9Y4S45u5e711fvDArC8UkbmX8nTwyg==", + "requires": { + "execa": "^6.1.0", + "parse-package-name": "^1.0.0", + "semver": "^7.3.7", + "validate-npm-package-name": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==" + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + } + } + }, "nwsapi": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", @@ -16184,6 +16429,11 @@ "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", "dev": true }, + "parse-package-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -16207,8 +16457,7 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -16760,10 +17009,9 @@ "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -16811,7 +17059,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -16819,8 +17066,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { "version": "1.0.4", @@ -16836,8 +17082,7 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sinon": { "version": "14.0.0", @@ -17472,6 +17717,14 @@ "spdx-expression-parse": "^3.0.0" } }, + "validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "requires": { + "builtins": "^5.0.0" + } + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -17655,7 +17908,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -17780,8 +18032,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "16.2.0", diff --git a/packages/d1/package.json b/packages/d1/package.json index c1d191aa0..f4dc73a9b 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -1,6 +1,6 @@ { "name": "@miniflare/d1", - "version": "2.6.0", + "version": "2.8.2", "description": "Workers D1 module for Miniflare: a fun, full-featured, fully-local simulator for Cloudflare Workers", "keywords": [ "cloudflare", @@ -36,11 +36,11 @@ "extends": "../../package.json" }, "dependencies": { - "@miniflare/core": "2.6.0", - "@miniflare/shared": "2.6.0", + "@miniflare/core": "2.8.2", + "@miniflare/shared": "2.8.2", "@types/better-sqlite3": "^7.6.0" }, "devDependencies": { - "@miniflare/shared-test": "2.6.0" + "@miniflare/shared-test": "2.8.2" } } diff --git a/packages/shared/package.json b/packages/shared/package.json index 43ac4c58c..649b8b232 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -36,8 +36,8 @@ }, "dependencies": { "kleur": "^4.1.4", - "picomatch": "^2.3.1", - "npx-import": "^1.1.0" + "npx-import": "^1.1.2", + "picomatch": "^2.3.1" }, "devDependencies": { "@miniflare/shared-test": "2.8.2", From 75a08f37c6565847457cf3db6c612884ead1fd70 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Thu, 15 Sep 2022 16:22:27 +0100 Subject: [PATCH 14/16] Refactored Storage to now provide getSqliteDatabase() --- packages/d1/README.md | 6 +- packages/d1/package.json | 3 +- packages/d1/src/database.ts | 170 +----------------- packages/d1/src/index.ts | 1 + packages/d1/src/plugin.ts | 7 +- packages/d1/src/statement.ts | 137 ++++++++++++++ packages/d1/test/database.spec.ts | 3 +- packages/shared-test-environment/package.json | 1 + packages/shared-test-environment/src/index.ts | 1 + .../shared-test-environment/src/plugins.ts | 2 + packages/shared/package.json | 5 +- packages/shared/src/index.ts | 1 + packages/shared/src/sqlite.ts | 28 +++ packages/shared/src/storage.ts | 3 +- packages/storage-file/src/index.ts | 7 +- packages/storage-memory/src/local.ts | 6 +- 16 files changed, 198 insertions(+), 183 deletions(-) create mode 100644 packages/d1/src/statement.ts create mode 100644 packages/shared/src/sqlite.ts diff --git a/packages/d1/README.md b/packages/d1/README.md index 9dd8cd021..195fa0c42 100644 --- a/packages/d1/README.md +++ b/packages/d1/README.md @@ -13,18 +13,18 @@ const db = new BetaDatabase(new MemoryStorage()); // BetaDatabase only supports .fetch(), once D1 is out of beta the full API will be available here: await db.fetch("/execute", { - method: 'POST', + method: "POST", body: JSON.stringify({ sql: `CREATE TABLE my_table (cid INTEGER PRIMARY KEY, name TEXT NOT NULL);`, }), }); const response = await db.fetch("/query", { - method: 'POST', + method: "POST", body: JSON.stringify({ sql: `SELECT * FROM sqlite_schema`, }), }); -console.log(await response.json()) +console.log(await response.json()); /* { "success": true, diff --git a/packages/d1/package.json b/packages/d1/package.json index f4dc73a9b..b4e21ed86 100644 --- a/packages/d1/package.json +++ b/packages/d1/package.json @@ -37,8 +37,7 @@ }, "dependencies": { "@miniflare/core": "2.8.2", - "@miniflare/shared": "2.8.2", - "@types/better-sqlite3": "^7.6.0" + "@miniflare/shared": "2.8.2" }, "devDependencies": { "@miniflare/shared-test": "2.8.2" diff --git a/packages/d1/src/database.ts b/packages/d1/src/database.ts index a43eb5d32..d03e18e4a 100644 --- a/packages/d1/src/database.ts +++ b/packages/d1/src/database.ts @@ -1,158 +1,15 @@ -import path from "node:path"; import { performance } from "node:perf_hooks"; -import { Storage } from "@miniflare/shared"; -import type { - Database as SqliteDB, - Options as SqliteOptions, - Statement as SqliteStatement, -} from "better-sqlite3"; -import { npxImport, npxResolve } from "npx-import"; - -// Can't export typeof import(), so reproducing BetterSqlite3.DatabaseConstructor here -export interface DBConstructor { - new (filename: string | Buffer, options?: SqliteOptions): SqliteDB; -} -export type BindParams = any[] | [Record]; - -function errorWithCause(message: string, e: unknown) { - // @ts-ignore Errors have causes now, why don't you know this Typescript? - return new Error(message, { cause: e }); -} - -export class Statement { - readonly #db: SqliteDB; - readonly #query: string; - readonly #bindings: BindParams | undefined; - - constructor(db: SqliteDB, query: string, bindings?: BindParams) { - this.#db = db; - this.#query = query; - this.#bindings = bindings; - } - - // Lazily accumulate binding instructions, because ".bind" in better-sqlite3 - // is a real action that means the query must be valid when it's written, - // not when it's about to be executed (i.e. in a batch). - bind(...params: BindParams) { - return new Statement(this.#db, this.#query, params); - } - private prepareAndBind() { - const prepared = this.#db.prepare(this.#query); - if (this.#bindings === undefined) return prepared; - try { - return prepared.bind(this.#bindings); - } catch (e) { - // For statements using ?1 ?2, etc, we want to pass them as varargs but - // "better" sqlite3 wants them as an object of {1: params[0], 2: params[1], ...} - if (this.#bindings.length > 0 && typeof this.#bindings[0] !== "object") { - return prepared.bind( - Object.fromEntries(this.#bindings.map((v, i) => [i + 1, v])) - ); - } else { - throw e; - } - } - } - - async all() { - const start = performance.now(); - const statementWithBindings = this.prepareAndBind(); - try { - const results = Statement._all(statementWithBindings); - return { - results, - duration: performance.now() - start, - lastRowId: null, - changes: null, - success: true, - served_by: "x-miniflare.db3", - }; - } catch (e) { - throw errorWithCause("D1_ALL_ERROR", e); - } - } - private static _all(statementWithBindings: SqliteStatement) { - try { - return statementWithBindings.all(); - } catch (e: unknown) { - // This is the quickest/simplest way I could find to return results by - // default, falling back to .run() - if ( - /This statement does not return data\. Use run\(\) instead/.exec( - (e as Error).message - ) - ) { - return Statement._run(statementWithBindings); - } - throw e; - } - } - - async first(col?: string) { - const statementWithBindings = this.prepareAndBind(); - try { - const data = Statement._first(statementWithBindings); - return typeof col === "string" ? data[col] : data; - } catch (e) { - throw errorWithCause("D1_FIRST_ERROR", e); - } - } - private static _first(statementWithBindings: SqliteStatement) { - return statementWithBindings.get(); - } - - async run() { - const start = performance.now(); - const statementWithBindings = this.prepareAndBind(); - try { - const { changes, lastInsertRowid } = Statement._run( - statementWithBindings - ); - return { - results: null, - duration: performance.now() - start, - lastRowId: lastInsertRowid, - changes, - success: true, - served_by: "x-miniflare.db3", - }; - } catch (e) { - throw errorWithCause("D1_RUN_ERROR", e); - } - } - private static _run(statementWithBindings: SqliteStatement) { - return statementWithBindings.run(); - } - - async raw() { - const statementWithBindings = this.prepareAndBind(); - return Statement._raw(statementWithBindings); - } - private static _raw(statementWithBindings: SqliteStatement) { - return statementWithBindings.raw() as any; - } -} - -function assert(db: T | undefined): asserts db is T { - if (typeof db === "undefined") - throw new Error("D1 BetaDatabase must have `await init()` called!"); -} +import type { SqliteDB } from "@miniflare/shared"; +import { Statement } from "./statement"; export class BetaDatabase { - readonly #storage: Storage; - #db?: SqliteDB; - - constructor(storage: Storage) { - this.#storage = storage; - } + #db: SqliteDB; - async init() { - const dbPath = this.#storage.getSqliteDatabasePath(); - this.#db = await createSQLiteDB(dbPath); + constructor(db: SqliteDB) { + this.#db = db; } prepare(source: string) { - assert(this.#db); return new Statement(this.#db, source); } @@ -161,7 +18,6 @@ export class BetaDatabase { } async exec(multiLineStatements: string) { - assert(this.#db); const statements = multiLineStatements .split("\n") .map((line) => line.trim()) @@ -180,19 +36,3 @@ export class BetaDatabase { throw new Error("DB.dump() not implemented locally!"); } } - -export async function createSQLiteDB(dbPath: string): Promise { - const { default: DatabaseConstructor } = await npxImport<{ - default: DBConstructor; - }>("better-sqlite3@7.6.2"); - return new DatabaseConstructor(dbPath, { - nativeBinding: getSQLiteNativeBindingLocation(npxResolve("better-sqlite3")), - }); -} - -export function getSQLiteNativeBindingLocation(sqliteResolvePath: string) { - return path.resolve( - path.dirname(sqliteResolvePath), - "../build/Release/better_sqlite3.node" - ); -} diff --git a/packages/d1/src/index.ts b/packages/d1/src/index.ts index 8d6fcc5f3..0c3fb15ee 100644 --- a/packages/d1/src/index.ts +++ b/packages/d1/src/index.ts @@ -1,2 +1,3 @@ export * from "./database"; export * from "./plugin"; +export * from "./statement"; diff --git a/packages/d1/src/plugin.ts b/packages/d1/src/plugin.ts index b48003948..50c15bb45 100644 --- a/packages/d1/src/plugin.ts +++ b/packages/d1/src/plugin.ts @@ -43,12 +43,11 @@ export class D1Plugin extends Plugin implements D1Options { } async getBetaDatabase( - storage: StorageFactory, + storageFactory: StorageFactory, dbName: string ): Promise { - const db = new BetaDatabase(await storage.storage(dbName, this.#persist)); - await db.init(); - return db; + const storage = await storageFactory.storage(dbName, this.#persist); + return new BetaDatabase(await storage.getSqliteDatabase()); } async setup(storageFactory: StorageFactory): Promise { diff --git a/packages/d1/src/statement.ts b/packages/d1/src/statement.ts new file mode 100644 index 000000000..ba1e96249 --- /dev/null +++ b/packages/d1/src/statement.ts @@ -0,0 +1,137 @@ +import { performance } from "node:perf_hooks"; +import type { + Database as SqliteDB, + Statement as SqliteStatement, +} from "better-sqlite3"; + +export type BindParams = any[] | [Record]; + +function errorWithCause(message: string, e: unknown) { + // @ts-ignore Errors have causes now, why don't you know this Typescript? + return new Error(message, { cause: e }); +} + +export class Statement { + readonly #db: SqliteDB; + readonly #query: string; + readonly #bindings: BindParams | undefined; + + constructor(db: SqliteDB, query: string, bindings?: BindParams) { + this.#db = db; + this.#query = query; + this.#bindings = bindings; + } + + // Lazily accumulate binding instructions, because ".bind" in better-sqlite3 + // is a real action that means the query must be valid when it's written, + // not when it's about to be executed (i.e. in a batch). + bind(...params: BindParams) { + // Adopting better-sqlite3 behaviour—once bound, a statement cannot be bound again + if (this.#bindings !== undefined) { + throw new TypeError( + "The bind() method can only be invoked once per statement object" + ); + } + return new Statement(this.#db, this.#query, params); + } + + private prepareAndBind() { + const prepared = this.#db.prepare(this.#query); + if (this.#bindings === undefined) return prepared; + try { + return prepared.bind(this.#bindings); + } catch (e) { + // For statements using ?1 ?2, etc, we want to pass them as varargs but + // "better" sqlite3 wants them as an object of {1: params[0], 2: params[1], ...} + if (this.#bindings.length > 0 && typeof this.#bindings[0] !== "object") { + return prepared.bind( + Object.fromEntries(this.#bindings.map((v, i) => [i + 1, v])) + ); + } else { + throw e; + } + } + } + + async all() { + const start = performance.now(); + const statementWithBindings = this.prepareAndBind(); + try { + const results = Statement.#all(statementWithBindings); + return { + results, + duration: performance.now() - start, + lastRowId: null, + changes: null, + success: true, + served_by: "x-miniflare.db3", + }; + } catch (e) { + throw errorWithCause("D1_ALL_ERROR", e); + } + } + + static #all(statementWithBindings: SqliteStatement) { + try { + return statementWithBindings.all(); + } catch (e: unknown) { + // This is the quickest/simplest way I could find to return results by + // default, falling back to .run() + if ( + /This statement does not return data\. Use run\(\) instead/.exec( + (e as Error).message + ) + ) { + return Statement.#run(statementWithBindings); + } + throw e; + } + } + + async first(col?: string) { + const statementWithBindings = this.prepareAndBind(); + try { + const data = Statement.#first(statementWithBindings); + return typeof col === "string" ? data[col] : data; + } catch (e) { + throw errorWithCause("D1_FIRST_ERROR", e); + } + } + + static #first(statementWithBindings: SqliteStatement) { + return statementWithBindings.get(); + } + + async run() { + const start = performance.now(); + const statementWithBindings = this.prepareAndBind(); + try { + const { changes, lastInsertRowid } = Statement.#run( + statementWithBindings + ); + return { + results: null, + duration: performance.now() - start, + lastRowId: lastInsertRowid, + changes, + success: true, + served_by: "x-miniflare.db3", + }; + } catch (e) { + throw errorWithCause("D1_RUN_ERROR", e); + } + } + + static #run(statementWithBindings: SqliteStatement) { + return statementWithBindings.run(); + } + + async raw() { + const statementWithBindings = this.prepareAndBind(); + return Statement.#raw(statementWithBindings); + } + + static #raw(statementWithBindings: SqliteStatement) { + return statementWithBindings.raw() as any; + } +} diff --git a/packages/d1/test/database.spec.ts b/packages/d1/test/database.spec.ts index 26f02e693..cade96f8b 100644 --- a/packages/d1/test/database.spec.ts +++ b/packages/d1/test/database.spec.ts @@ -13,8 +13,7 @@ const test = anyTest as TestInterface; test.beforeEach(async (t) => { const storage = new MemoryStorage(undefined, testClock); - const db = new BetaDatabase(storage); - await db.init(); + const db = new BetaDatabase(await storage.getSqliteDatabase()); t.context = { storage, db }; }); diff --git a/packages/shared-test-environment/package.json b/packages/shared-test-environment/package.json index cd5993ade..5fdcf06ba 100644 --- a/packages/shared-test-environment/package.json +++ b/packages/shared-test-environment/package.json @@ -37,6 +37,7 @@ "dependencies": { "@miniflare/cache": "2.8.2", "@miniflare/core": "2.8.2", + "@miniflare/d1": "2.8.2", "@miniflare/durable-objects": "2.8.2", "@miniflare/html-rewriter": "2.8.2", "@miniflare/kv": "2.8.2", diff --git a/packages/shared-test-environment/src/index.ts b/packages/shared-test-environment/src/index.ts index 41ecd8e95..ddbb74c8e 100644 --- a/packages/shared-test-environment/src/index.ts +++ b/packages/shared-test-environment/src/index.ts @@ -57,6 +57,7 @@ export async function createMiniflareEnvironment( watch: false, // - Persistence must be disabled for stacked storage to work kvPersist: false, + d1Persist: false, cachePersist: false, durableObjectsPersist: false, // - Allow all global operations, tests will be outside of a request diff --git a/packages/shared-test-environment/src/plugins.ts b/packages/shared-test-environment/src/plugins.ts index 0ea3bf975..8cf06e19d 100644 --- a/packages/shared-test-environment/src/plugins.ts +++ b/packages/shared-test-environment/src/plugins.ts @@ -1,5 +1,6 @@ import { CachePlugin } from "@miniflare/cache"; import { BindingsPlugin, CorePlugin } from "@miniflare/core"; +import { D1Plugin } from "@miniflare/d1"; import { DurableObjectsPlugin } from "@miniflare/durable-objects"; import { HTMLRewriterPlugin } from "@miniflare/html-rewriter"; import { KVPlugin } from "@miniflare/kv"; @@ -15,6 +16,7 @@ import { WebSocketPlugin } from "@miniflare/web-sockets"; export const PLUGINS = { CorePlugin, KVPlugin, + D1Plugin, R2Plugin, DurableObjectsPlugin, CachePlugin, diff --git a/packages/shared/package.json b/packages/shared/package.json index 649b8b232..56552829c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -35,12 +35,13 @@ "extends": "../../package.json" }, "dependencies": { + "@types/better-sqlite3": "^7.6.0", "kleur": "^4.1.4", - "npx-import": "^1.1.2", "picomatch": "^2.3.1" }, "devDependencies": { "@miniflare/shared-test": "2.8.2", - "@types/picomatch": "^2.3.0" + "@types/picomatch": "^2.3.0", + "npx-import": "^1.1.2" } } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 6f0e4afb0..4ad9efd88 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -10,3 +10,4 @@ export * from "./runner"; export * from "./storage"; export * from "./sync/"; export * from "./wrangler"; +export * from "./sqlite"; diff --git a/packages/shared/src/sqlite.ts b/packages/shared/src/sqlite.ts new file mode 100644 index 000000000..ecb010437 --- /dev/null +++ b/packages/shared/src/sqlite.ts @@ -0,0 +1,28 @@ +import path from "node:path"; +import type { + Database as SqliteDB, + Options as SqliteOptions, +} from "better-sqlite3"; +export type { SqliteDB, SqliteOptions }; +import { npxImport, npxResolve } from "npx-import"; + +// Can't use typeof import(), so reproducing BetterSqlite3.DatabaseConstructor here +export interface DBConstructor { + new (filename: string | Buffer, options?: SqliteOptions): SqliteDB; +} + +export async function createSQLiteDB(dbPath: string): Promise { + const { default: DatabaseConstructor } = await npxImport<{ + default: DBConstructor; + }>("better-sqlite3@7.6.2"); + return new DatabaseConstructor(dbPath, { + nativeBinding: getSQLiteNativeBindingLocation(npxResolve("better-sqlite3")), + }); +} + +export function getSQLiteNativeBindingLocation(sqliteResolvePath: string) { + return path.resolve( + path.dirname(sqliteResolvePath), + "../build/Release/better_sqlite3.node" + ); +} diff --git a/packages/shared/src/storage.ts b/packages/shared/src/storage.ts index 284971c43..8b096ee49 100644 --- a/packages/shared/src/storage.ts +++ b/packages/shared/src/storage.ts @@ -1,3 +1,4 @@ +import type { SqliteDB } from "./sqlite"; import { Awaitable } from "./sync"; export interface StoredMeta { @@ -116,7 +117,7 @@ export abstract class Storage { options: StorageListOptions, skipMetadata: true ): Awaitable>; - getSqliteDatabasePath(): string { + getSqliteDatabase(): Awaitable { throw new Error("D1 not implemented for this Storage class"); } diff --git a/packages/storage-file/src/index.ts b/packages/storage-file/src/index.ts index 7ab8a2bbd..b3356deaf 100644 --- a/packages/storage-file/src/index.ts +++ b/packages/storage-file/src/index.ts @@ -1,17 +1,20 @@ import fs, { existsSync } from "fs"; import path from "path"; import { + Awaitable, MiniflareError, Range, RangeStoredValueMeta, StoredKeyMeta, StoredMeta, StoredValueMeta, + createSQLiteDB, defaultClock, sanitisePath, viewToArray, } from "@miniflare/shared"; import { LocalStorage } from "@miniflare/storage-memory"; +import { Database as SqliteDB } from "better-sqlite3"; import { deleteFile, readFile, @@ -104,9 +107,9 @@ export class FileStorage extends LocalStorage { } } - getSqliteDatabasePath(): string { + getSqliteDatabase(): Awaitable { fs.mkdirSync(path.dirname(this.root), { recursive: true }); - return this.root + ".sqlite3"; + return createSQLiteDB(this.root + ".sqlite3"); } async getRangeMaybeExpired( diff --git a/packages/storage-memory/src/local.ts b/packages/storage-memory/src/local.ts index 919ebbcc1..b7554e567 100644 --- a/packages/storage-memory/src/local.ts +++ b/packages/storage-memory/src/local.ts @@ -8,9 +8,11 @@ import { StoredKeyMeta, StoredMeta, StoredValueMeta, + createSQLiteDB, defaultClock, millisToSeconds, } from "@miniflare/shared"; +import { Database as SqliteDB } from "better-sqlite3"; import { listFilterMatch, listPaginate } from "./helpers"; export abstract class LocalStorage extends Storage { @@ -117,7 +119,7 @@ export abstract class LocalStorage extends Storage { return res; } - getSqliteDatabasePath(): string { - return ":memory:"; + getSqliteDatabase(): Awaitable { + return createSQLiteDB(":memory:"); } } From 24094f6b8230b599e0e08cf97e0319af5f1c460d Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Thu, 15 Sep 2022 18:11:10 +0100 Subject: [PATCH 15/16] Added Jest integration test for D1 with push/pop & caching DB in storage --- package-lock.json | 110 +++++++++++++----- .../test/fixtures/d1.worker.spec.js | 67 +++++++++++ .../test/index.spec.ts | 3 +- .../shared-test-environment/src/storage.ts | 17 +++ packages/shared/package.json | 2 +- packages/shared/src/storage.ts | 2 +- packages/storage-file/src/index.ts | 11 +- packages/storage-memory/src/local.ts | 6 - packages/storage-memory/src/memory.ts | 17 ++- types/env.d.ts | 1 + 10 files changed, 192 insertions(+), 44 deletions(-) create mode 100644 packages/jest-environment-miniflare/test/fixtures/d1.worker.spec.js diff --git a/package-lock.json b/package-lock.json index 69afe6d8c..aaec3860d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2658,6 +2658,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, "dependencies": { "semver": "^7.0.0" } @@ -3158,6 +3159,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4863,6 +4865,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { "node": ">=10" }, @@ -5828,7 +5831,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -6985,6 +6989,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7080,7 +7085,8 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -7307,9 +7313,10 @@ } }, "node_modules/npx-import": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.2.tgz", - "integrity": "sha512-W/DCVEA7FQSK8vyphTLmT7LtGsZ8RJ85kRtAqhYediFCls9asiAebiKC9Y4S45u5e711fvDArC8UkbmX8nTwyg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.3.tgz", + "integrity": "sha512-zy6249FJ81OtPsvz2y0+rgis31EN5wbdwBG2umtEh65W/4onYArHuoUSZ+W+T7BQYK7YF+h9G4CuGPusMCcLOw==", + "dev": true, "dependencies": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", @@ -7321,6 +7328,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -7343,6 +7351,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, "engines": { "node": ">=12.20.0" } @@ -7351,6 +7360,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7362,6 +7372,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { "node": ">=12" }, @@ -7373,6 +7384,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, "dependencies": { "path-key": "^4.0.0" }, @@ -7387,6 +7399,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { "mimic-fn": "^4.0.0" }, @@ -7401,6 +7414,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -7412,6 +7426,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { "node": ">=12" }, @@ -7733,7 +7748,8 @@ "node_modules/parse-package-name": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", - "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==", + "dev": true }, "node_modules/parse5": { "version": "6.0.1", @@ -7765,6 +7781,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -8534,6 +8551,7 @@ "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -8601,6 +8619,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -8612,6 +8631,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -8633,7 +8653,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/sinon": { "version": "14.0.0", @@ -9474,6 +9495,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, "dependencies": { "builtins": "^5.0.0" }, @@ -9742,6 +9764,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -9914,7 +9937,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yargs": { "version": "16.2.0", @@ -10058,8 +10082,7 @@ "license": "MIT", "dependencies": { "@miniflare/core": "2.8.2", - "@miniflare/shared": "2.8.2", - "@types/better-sqlite3": "^7.6.0" + "@miniflare/shared": "2.8.2" }, "devDependencies": { "@miniflare/shared-test": "2.8.2" @@ -10318,13 +10341,14 @@ "version": "2.8.2", "license": "MIT", "dependencies": { + "@types/better-sqlite3": "^7.6.0", "kleur": "^4.1.4", - "npx-import": "^1.1.2", "picomatch": "^2.3.1" }, "devDependencies": { "@miniflare/shared-test": "2.8.2", - "@types/picomatch": "^2.3.0" + "@types/picomatch": "^2.3.0", + "npx-import": "^1.1.3" }, "engines": { "node": ">=16.13" @@ -10354,6 +10378,7 @@ "dependencies": { "@miniflare/cache": "2.8.2", "@miniflare/core": "2.8.2", + "@miniflare/d1": "2.8.2", "@miniflare/durable-objects": "2.8.2", "@miniflare/html-rewriter": "2.8.2", "@miniflare/kv": "2.8.2", @@ -11512,8 +11537,7 @@ "requires": { "@miniflare/core": "2.8.2", "@miniflare/shared": "2.8.2", - "@miniflare/shared-test": "2.8.2", - "@types/better-sqlite3": "^7.6.0" + "@miniflare/shared-test": "2.8.2" } }, "@miniflare/durable-objects": { @@ -11595,6 +11619,7 @@ "version": "file:packages/shared", "requires": { "@miniflare/shared-test": "2.8.2", + "@types/better-sqlite3": "^7.6.0", "@types/picomatch": "^2.3.0", "kleur": "^4.1.4", "npx-import": "^1.1.2", @@ -11618,6 +11643,7 @@ "requires": { "@miniflare/cache": "2.8.2", "@miniflare/core": "2.8.2", + "@miniflare/d1": "2.8.2", "@miniflare/durable-objects": "2.8.2", "@miniflare/html-rewriter": "2.8.2", "@miniflare/kv": "2.8.2", @@ -12685,6 +12711,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, "requires": { "semver": "^7.0.0" } @@ -13065,6 +13092,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -14271,7 +14299,8 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true }, "get-symbol-description": { "version": "1.0.0", @@ -14943,7 +14972,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -15865,6 +15895,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -15935,7 +15966,8 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "merge2": { "version": "1.4.1", @@ -16135,9 +16167,10 @@ } }, "npx-import": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.2.tgz", - "integrity": "sha512-W/DCVEA7FQSK8vyphTLmT7LtGsZ8RJ85kRtAqhYediFCls9asiAebiKC9Y4S45u5e711fvDArC8UkbmX8nTwyg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.3.tgz", + "integrity": "sha512-zy6249FJ81OtPsvz2y0+rgis31EN5wbdwBG2umtEh65W/4onYArHuoUSZ+W+T7BQYK7YF+h9G4CuGPusMCcLOw==", + "dev": true, "requires": { "execa": "^6.1.0", "parse-package-name": "^1.0.0", @@ -16149,6 +16182,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -16164,22 +16198,26 @@ "human-signals": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==" + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true }, "is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true }, "mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true }, "npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, "requires": { "path-key": "^4.0.0" } @@ -16188,6 +16226,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "requires": { "mimic-fn": "^4.0.0" } @@ -16195,12 +16234,14 @@ "path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true } } }, @@ -16432,7 +16473,8 @@ "parse-package-name": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", - "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==", + "dev": true }, "parse5": { "version": "6.0.1", @@ -16457,7 +16499,8 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "path-parse": { "version": "1.0.7", @@ -17012,6 +17055,7 @@ "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -17059,6 +17103,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -17066,7 +17111,8 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "side-channel": { "version": "1.0.4", @@ -17082,7 +17128,8 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "sinon": { "version": "14.0.0", @@ -17721,6 +17768,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, "requires": { "builtins": "^5.0.0" } @@ -17908,6 +17956,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -18032,7 +18081,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yargs": { "version": "16.2.0", diff --git a/packages/jest-environment-miniflare/test/fixtures/d1.worker.spec.js b/packages/jest-environment-miniflare/test/fixtures/d1.worker.spec.js new file mode 100644 index 000000000..e337e14a1 --- /dev/null +++ b/packages/jest-environment-miniflare/test/fixtures/d1.worker.spec.js @@ -0,0 +1,67 @@ +// This would normally be provided by the Wrangler shim +// (in local mode, it does nothing but rename the binding) +const DB_1 = __D1_BETA__DB_1; + +async function get() { + const result = await DB_1.prepare(`SELECT value FROM entries LIMIT 1;`).all(); + return result.results[0]?.value ?? ""; +} + +async function append(str) { + const value = await get(); + await DB_1.prepare(`UPDATE entries SET value = ?`) + .bind(value + str) + .run(); +} + +beforeAll(async () => { + await DB_1.exec(`CREATE TABLE entries (id INTEGER PRIMARY KEY, value TEXT)`); + await DB_1.exec(`INSERT INTO entries (value) VALUES ('a')`); +}); +beforeEach(() => append("b")); + +test("D1 test 1", async () => { + await append("c"); + expect(await get()).toBe("abc"); +}); +test("D1 test 2", async () => { + await append("d"); + expect(await get()).toBe("abd"); +}); + +describe("more D1 tests", () => { + beforeAll(() => append("e")); + beforeEach(() => append("f")); + + test("D1 test 3", async () => { + await append("g"); + expect(await get()).toBe("aebfg"); + }); + test("D1 test 4", async () => { + await append("h"); + expect(await get()).toBe("aebfh"); + }); + + describe("even more D1 tests", () => { + beforeAll(() => append("i")); + beforeEach(() => append("j")); + + test("D1 test 5", async () => { + await append("k"); + expect(await get()).toBe("aeibfjk"); + }); + test("D1 test 6", async () => { + await append("l"); + expect(await get()).toBe("aeibfjl"); + }); + }); +}); + +test("D1 test 7", async () => { + await append("m"); + expect(await get()).toBe("abm"); +}); +test("D1 test 8", async () => { + await append("n"); + expect(await get()).toBe("abn"); +}); diff --git a/packages/jest-environment-miniflare/test/index.spec.ts b/packages/jest-environment-miniflare/test/index.spec.ts index 6431d622d..c697259ba 100644 --- a/packages/jest-environment-miniflare/test/index.spec.ts +++ b/packages/jest-environment-miniflare/test/index.spec.ts @@ -39,7 +39,7 @@ async function runJest( "--testEnvironmentOptions", JSON.stringify(options), ], - { cwd } + { cwd, env: { ...process.env, NPX_IMPORT_QUIET: "true" } } ); let output = ""; jest.stdout.on("data", (data) => (output += data)); @@ -53,6 +53,7 @@ test.serial( async (t) => { const [exitCode, output] = await runJest(".worker.spec.js", { kvNamespaces: ["TEST_NAMESPACE"], + d1Databases: ["__D1_BETA__DB_1"], sitePath: fixturesPath, globals: { KEY: "value" }, // Check persistence options ignored diff --git a/packages/shared-test-environment/src/storage.ts b/packages/shared-test-environment/src/storage.ts index d7631ec46..d1e70f0a1 100644 --- a/packages/shared-test-environment/src/storage.ts +++ b/packages/shared-test-environment/src/storage.ts @@ -4,10 +4,18 @@ import { MemoryStorage } from "@miniflare/storage-memory"; export class StackedMemoryStorage extends MemoryStorage { private readonly stack: Map[] = []; + private readonly transactionStack: string[] = []; push(): void { this.stack.push(this.map); this.map = new Map(this.map); + + if (this.sqliteDB) { + const transactionName = `STACK_${this.transactionStack.length + 1}`; + this.transactionStack.push(transactionName); + + this.sqliteDB.exec(`SAVEPOINT ${transactionName}`); + } } pop(): void { @@ -16,6 +24,15 @@ export class StackedMemoryStorage extends MemoryStorage { // If this happens, default to an empty map, since the storage didn't exist // at the new stack level. this.map = this.stack.pop() ?? new Map(); + + if (this.sqliteDB) { + const transactionToRollback = this.transactionStack.pop(); + // This may be undefined if we popped too many times + if (transactionToRollback) { + this.sqliteDB.exec(`ROLLBACK TO ${transactionToRollback}`); + this.sqliteDB.exec(`RELEASE ${transactionToRollback}`); + } + } } } diff --git a/packages/shared/package.json b/packages/shared/package.json index 56552829c..ee703d4ec 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -42,6 +42,6 @@ "devDependencies": { "@miniflare/shared-test": "2.8.2", "@types/picomatch": "^2.3.0", - "npx-import": "^1.1.2" + "npx-import": "^1.1.3" } } diff --git a/packages/shared/src/storage.ts b/packages/shared/src/storage.ts index 8b096ee49..596f0cbf7 100644 --- a/packages/shared/src/storage.ts +++ b/packages/shared/src/storage.ts @@ -117,7 +117,7 @@ export abstract class Storage { options: StorageListOptions, skipMetadata: true ): Awaitable>; - getSqliteDatabase(): Awaitable { + async getSqliteDatabase(): Promise { throw new Error("D1 not implemented for this Storage class"); } diff --git a/packages/storage-file/src/index.ts b/packages/storage-file/src/index.ts index b3356deaf..88e0074a6 100644 --- a/packages/storage-file/src/index.ts +++ b/packages/storage-file/src/index.ts @@ -1,10 +1,10 @@ import fs, { existsSync } from "fs"; import path from "path"; import { - Awaitable, MiniflareError, Range, RangeStoredValueMeta, + SqliteDB, StoredKeyMeta, StoredMeta, StoredValueMeta, @@ -14,7 +14,6 @@ import { viewToArray, } from "@miniflare/shared"; import { LocalStorage } from "@miniflare/storage-memory"; -import { Database as SqliteDB } from "better-sqlite3"; import { deleteFile, readFile, @@ -37,6 +36,7 @@ export interface FileMeta extends StoredMeta { export class FileStorage extends LocalStorage { protected readonly root: string; + private sqliteDB?: SqliteDB; constructor( root: string, @@ -107,9 +107,12 @@ export class FileStorage extends LocalStorage { } } - getSqliteDatabase(): Awaitable { + async getSqliteDatabase(): Promise { + if (this.sqliteDB) return this.sqliteDB; + fs.mkdirSync(path.dirname(this.root), { recursive: true }); - return createSQLiteDB(this.root + ".sqlite3"); + this.sqliteDB = await createSQLiteDB(this.root + ".sqlite3"); + return this.sqliteDB; } async getRangeMaybeExpired( diff --git a/packages/storage-memory/src/local.ts b/packages/storage-memory/src/local.ts index b7554e567..f8640660d 100644 --- a/packages/storage-memory/src/local.ts +++ b/packages/storage-memory/src/local.ts @@ -8,11 +8,9 @@ import { StoredKeyMeta, StoredMeta, StoredValueMeta, - createSQLiteDB, defaultClock, millisToSeconds, } from "@miniflare/shared"; -import { Database as SqliteDB } from "better-sqlite3"; import { listFilterMatch, listPaginate } from "./helpers"; export abstract class LocalStorage extends Storage { @@ -118,8 +116,4 @@ export abstract class LocalStorage extends Storage { await Promise.all(deletePromises); return res; } - - getSqliteDatabase(): Awaitable { - return createSQLiteDB(":memory:"); - } } diff --git a/packages/storage-memory/src/memory.ts b/packages/storage-memory/src/memory.ts index cf943dbee..7976e6358 100644 --- a/packages/storage-memory/src/memory.ts +++ b/packages/storage-memory/src/memory.ts @@ -1,9 +1,17 @@ -import { Range, RangeStoredValueMeta, defaultClock } from "@miniflare/shared"; +import { + Range, + RangeStoredValueMeta, + SqliteDB, + createSQLiteDB, + defaultClock, +} from "@miniflare/shared"; import { StoredKeyMeta, StoredMeta, StoredValueMeta } from "@miniflare/shared"; import { cloneMetadata } from "./helpers"; import { LocalStorage } from "./local"; export class MemoryStorage extends LocalStorage { + protected sqliteDB?: SqliteDB; + constructor( protected map = new Map(), clock = defaultClock @@ -114,4 +122,11 @@ export class MemoryStorage extends LocalStorage { MemoryStorage.entryToStoredKey ) as StoredKeyMeta[]; } + + async getSqliteDatabase(): Promise { + if (this.sqliteDB) return this.sqliteDB; + + this.sqliteDB = await createSQLiteDB(":memory:"); + return await this.sqliteDB; + } } diff --git a/types/env.d.ts b/types/env.d.ts index 03fa2ac75..b68ae158b 100644 --- a/types/env.d.ts +++ b/types/env.d.ts @@ -5,6 +5,7 @@ declare namespace NodeJS { MINIFLARE_SUBREQUEST_LIMIT?: string; MINIFLARE_INTERNAL_SUBREQUEST_LIMIT?: string; MINIFLARE_TEST_REDIS_URL?: string; + NPX_IMPORT_QUIET?: string; // REPL options: https://nodejs.org/api/repl.html#environment-variable-options MINIFLARE_REPL_HISTORY?: string; From fc1d13655648da0389e91ce1fa04893e4b189a8a Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Thu, 15 Sep 2022 18:15:08 +0100 Subject: [PATCH 16/16] Added vitest integration test for D1 as well --- .../fixtures/service-worker/d1.worker.spec.js | 70 +++++++++++++++++++ .../fixtures/service-worker/vitest.config.js | 1 + .../test/index.spec.ts | 1 + 3 files changed, 72 insertions(+) create mode 100644 packages/vitest-environment-miniflare/test/fixtures/service-worker/d1.worker.spec.js diff --git a/packages/vitest-environment-miniflare/test/fixtures/service-worker/d1.worker.spec.js b/packages/vitest-environment-miniflare/test/fixtures/service-worker/d1.worker.spec.js new file mode 100644 index 000000000..64de23a74 --- /dev/null +++ b/packages/vitest-environment-miniflare/test/fixtures/service-worker/d1.worker.spec.js @@ -0,0 +1,70 @@ +import { beforeAll, beforeEach, expect, test } from "vitest"; +const describe = setupMiniflareIsolatedStorage(); + +// This would normally be provided by the Wrangler shim +// (in local mode, it does nothing but rename the binding) +const DB_1 = __D1_BETA__DB_1; + +async function get() { + const result = await DB_1.prepare(`SELECT value FROM entries LIMIT 1;`).all(); + return result.results[0]?.value ?? ""; +} + +async function append(str) { + const value = await get(); + await DB_1.prepare(`UPDATE entries SET value = ?`) + .bind(value + str) + .run(); +} + +beforeAll(async () => { + await DB_1.exec(`CREATE TABLE entries (id INTEGER PRIMARY KEY, value TEXT)`); + await DB_1.exec(`INSERT INTO entries (value) VALUES ('a')`); +}); +beforeEach(() => append("b")); + +test("D1 test 1", async () => { + await append("c"); + expect(await get()).toBe("abc"); +}); +test("D1 test 2", async () => { + await append("d"); + expect(await get()).toBe("abd"); +}); + +describe("more D1 tests", () => { + beforeAll(() => append("e")); + beforeEach(() => append("f")); + + test("D1 test 3", async () => { + await append("g"); + expect(await get()).toBe("aebfg"); + }); + test("D1 test 4", async () => { + await append("h"); + expect(await get()).toBe("aebfh"); + }); + + describe("even more D1 tests", () => { + beforeAll(() => append("i")); + beforeEach(() => append("j")); + + test("D1 test 5", async () => { + await append("k"); + expect(await get()).toBe("aeibfjk"); + }); + test("D1 test 6", async () => { + await append("l"); + expect(await get()).toBe("aeibfjl"); + }); + }); +}); + +test("D1 test 7", async () => { + await append("m"); + expect(await get()).toBe("abm"); +}); +test("D1 test 8", async () => { + await append("n"); + expect(await get()).toBe("abn"); +}); diff --git a/packages/vitest-environment-miniflare/test/fixtures/service-worker/vitest.config.js b/packages/vitest-environment-miniflare/test/fixtures/service-worker/vitest.config.js index 9d7224f05..79f17a6b4 100644 --- a/packages/vitest-environment-miniflare/test/fixtures/service-worker/vitest.config.js +++ b/packages/vitest-environment-miniflare/test/fixtures/service-worker/vitest.config.js @@ -14,6 +14,7 @@ export default defineConfig({ environment: "miniflare", environmentOptions: { kvNamespaces: ["TEST_NAMESPACE"], + d1Databases: ["__D1_BETA__DB_1"], sitePath: __dirname, globals: { KEY: "value" }, // Check persistence options ignored diff --git a/packages/vitest-environment-miniflare/test/index.spec.ts b/packages/vitest-environment-miniflare/test/index.spec.ts index 8ed39a39a..bfd8d38f6 100644 --- a/packages/vitest-environment-miniflare/test/index.spec.ts +++ b/packages/vitest-environment-miniflare/test/index.spec.ts @@ -48,6 +48,7 @@ async function runVitest( env: { ...process.env, NODE_OPTIONS: "--experimental-vm-modules --no-warnings", + NPX_IMPORT_QUIET: "true", }, } );