diff --git a/bindings/wasm/.gitignore b/bindings/wasm/.gitignore index 0f8678b46..ec93f4157 100644 --- a/bindings/wasm/.gitignore +++ b/bindings/wasm/.gitignore @@ -1,2 +1,3 @@ node_modules/ *.wasm +dist/ diff --git a/bindings/wasm/integration-tests/package-lock.json b/bindings/wasm/integration-tests/package-lock.json index fc1a73fdc..b7327e9d0 100644 --- a/bindings/wasm/integration-tests/package-lock.json +++ b/bindings/wasm/integration-tests/package-lock.json @@ -7,15 +7,30 @@ "name": "limbo-wasm-integration-tests", "dependencies": { "better-sqlite3": "^11.7.0", - "limbo-wasm": "../pkg" + "limbo-wasm": "../dist/" }, "devDependencies": { "ava": "^6.2.0" } }, + "../dist": { + "version": "0.0.11", + "license": "MIT", + "devDependencies": { + "@playwright/test": "^1.49.1", + "@vitest/ui": "^2.1.8", + "happy-dom": "^16.3.0", + "playwright": "^1.49.1", + "vite": "^6.0.7", + "vite-plugin-wasm": "^3.4.1", + "vitest": "^2.1.8", + "wasm-pack": "^0.13.1" + } + }, "../pkg": { "name": "limbo-wasm", "version": "0.0.10", + "extraneous": true, "license": "MIT" }, "node_modules/@isaacs/cliui": { @@ -1363,7 +1378,7 @@ } }, "node_modules/limbo-wasm": { - "resolved": "../pkg", + "resolved": "../dist", "link": true }, "node_modules/load-json-file": { diff --git a/bindings/wasm/integration-tests/package.json b/bindings/wasm/integration-tests/package.json index 7337e9b67..ec52f8434 100644 --- a/bindings/wasm/integration-tests/package.json +++ b/bindings/wasm/integration-tests/package.json @@ -3,13 +3,13 @@ "type": "module", "private": true, "scripts": { - "test": "PROVIDER=better-sqlite3 ava tests/test.js && PROVIDER=limbo-wasm ava tests/test.js && rm *.db *.db-wal" + "test": "PROVIDER=better-sqlite3 npx ava tests/test.js && PROVIDER=limbo-wasm npx ava tests/test.js && rm *.db *.db-wal" }, "devDependencies": { "ava": "^6.2.0" }, "dependencies": { "better-sqlite3": "^11.7.0", - "limbo-wasm": "../pkg" + "limbo-wasm": "../dist/" } } diff --git a/bindings/wasm/integration-tests/tests/test.js b/bindings/wasm/integration-tests/tests/test.js index 220fe076f..1bab9f7c7 100644 --- a/bindings/wasm/integration-tests/tests/test.js +++ b/bindings/wasm/integration-tests/tests/test.js @@ -7,15 +7,15 @@ test.beforeEach(async (t) => { CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT) `); db.exec( - "INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'alice@example.org')" + "INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'alice@example.org')", ); db.exec( - "INSERT INTO users (id, name, email) VALUES (2, 'Bob', 'bob@example.com')" + "INSERT INTO users (id, name, email) VALUES (2, 'Bob', 'bob@example.com')", ); t.context = { db, errorType, - provider + provider, }; }); @@ -35,7 +35,9 @@ test.serial("Statement.raw().get()", async (t) => { const stmt = db.prepare("SELECT * FROM users"); const expected = [ - 1, "Alice", "alice@example.org" + 1, + "Alice", + "alice@example.org", ]; t.deepEqual(stmt.raw().get(), expected); @@ -54,13 +56,13 @@ test.serial("Statement.raw().iterate()", async (t) => { ]; let iter = stmt.raw().iterate(); - t.is(typeof iter[Symbol.iterator], 'function'); - t.deepEqual(iter.next(), expected[0]) - t.deepEqual(iter.next(), expected[1]) - t.deepEqual(iter.next(), expected[2]) + t.is(typeof iter[Symbol.iterator], "function"); + t.deepEqual(iter.next(), expected[0]); + t.deepEqual(iter.next(), expected[1]); + t.deepEqual(iter.next(), expected[2]); const emptyStmt = db.prepare("SELECT * FROM users WHERE id = -1"); - t.is(typeof emptyStmt[Symbol.iterator], 'undefined'); + t.is(typeof emptyStmt[Symbol.iterator], "undefined"); t.throws(() => emptyStmt.next(), { instanceOf: TypeError }); }); @@ -69,7 +71,7 @@ const connect = async (path_opt) => { const provider = process.env.PROVIDER; if (provider === "limbo-wasm") { const database = process.env.LIBSQL_DATABASE ?? path; - const x = await import("limbo-wasm"); + const x = await import("limbo-wasm/node"); const options = {}; const db = new x.Database(database, options); return [db, x.SqliteError, provider]; @@ -81,4 +83,5 @@ const connect = async (path_opt) => { return [db, x.SqliteError, provider]; } throw new Error("Unknown provider: " + provider); -}; \ No newline at end of file +}; + diff --git a/bindings/wasm/package.json b/bindings/wasm/package.json index 4107b052d..c9687169f 100644 --- a/bindings/wasm/package.json +++ b/bindings/wasm/package.json @@ -9,14 +9,15 @@ "type": "git", "url": "https://github.com/penberg/limbo" }, - "files": [ - "snippets", - "limbo_wasm_bg.wasm", - "limbo_wasm.js", - "limbo_wasm.d.ts" - ], - "main": "limbo_wasm.js", - "types": "limbo_wasm.d.ts", + "files": ["dist"], + "exports": { + ".": { + "import": "./dist/web/index.js", + "require": "./dist/node/index.cjs" + } + }, + "main": "./dist/node/index.cjs", + "types": "./dist/node/index.d.ts", "type": "module", "scripts": { "dev": "vite", diff --git a/bindings/wasm/scripts/build b/bindings/wasm/scripts/build index 4cd7a48d2..f2400b3f5 100755 --- a/bindings/wasm/scripts/build +++ b/bindings/wasm/scripts/build @@ -1,12 +1,30 @@ #!/bin/bash +set -e -# get target as argument from cli, defaults to nodejs if no argument is supplied -TARGET=${1:-nodejs} -FEATURE="nodejs" +# Define final output directories +NODE_DIR="dist/node" +WEB_DIR="dist/web" +rm -rf dist +rm -rf pkg -if [ "$TARGET" = "web" ]; then - FEATURE="web" -fi +mkdir -p $NODE_DIR $WEB_DIR pkg -npx wasm-pack build --no-pack --target $TARGET --no-default-features --features $FEATURE -cp package.json pkg/package.json +# Build Node.js target +npx wasm-pack build \ + --target nodejs \ + --out-name index \ + --no-default-features \ + --features nodejs +mv pkg/* $NODE_DIR/ +mv $NODE_DIR/index.js $NODE_DIR/index.cjs +rm -r pkg + +# Build web target +npx wasm-pack build \ + --target web \ + --out-name index \ + --no-default-features \ + --features web +mv pkg/* $WEB_DIR/ +cp src/opfs.js $WEB_DIR/ +rm -r pkg diff --git a/bindings/wasm/test-limbo-pkg/.gitignore b/bindings/wasm/test-limbo-pkg/.gitignore new file mode 100644 index 000000000..c370cb644 --- /dev/null +++ b/bindings/wasm/test-limbo-pkg/.gitignore @@ -0,0 +1 @@ +test.db diff --git a/bindings/wasm/test-limbo-pkg/index.js b/bindings/wasm/test-limbo-pkg/index.js new file mode 100644 index 000000000..01f653da3 --- /dev/null +++ b/bindings/wasm/test-limbo-pkg/index.js @@ -0,0 +1,11 @@ +// import { Database } from "limbo-wasm/node"; + +const { Database } = require("limbo-wasm"); +// Rest of your code... + +const db = new Database("test.db"); +db.exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"); +db.exec("INSERT INTO users (name) VALUES ('test')"); + +const stmt = db.prepare("SELECT * FROM users"); +console.log(stmt.all()); diff --git a/bindings/wasm/test-limbo-pkg/package-lock.json b/bindings/wasm/test-limbo-pkg/package-lock.json new file mode 100644 index 000000000..d33f12244 --- /dev/null +++ b/bindings/wasm/test-limbo-pkg/package-lock.json @@ -0,0 +1,50 @@ +{ + "name": "test-limbo", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "test-limbo", + "dependencies": { + "limbo-wasm": "file:../" + } + }, + "..": { + "version": "0.0.11", + "license": "MIT", + "devDependencies": { + "@playwright/test": "^1.49.1", + "@vitest/ui": "^2.1.8", + "happy-dom": "^16.3.0", + "playwright": "^1.49.1", + "vite": "^6.0.7", + "vite-plugin-wasm": "^3.4.1", + "vitest": "^2.1.8", + "wasm-pack": "^0.13.1" + } + }, + "../dist": { + "name": "limbo-wasm", + "version": "0.0.11", + "extraneous": true, + "license": "MIT", + "devDependencies": { + "@playwright/test": "^1.49.1", + "@vitest/ui": "^2.1.8", + "happy-dom": "^16.3.0", + "playwright": "^1.49.1", + "vite": "^6.0.7", + "vite-plugin-wasm": "^3.4.1", + "vitest": "^2.1.8", + "wasm-pack": "^0.13.1" + } + }, + "../limbo-wasm": { + "extraneous": true + }, + "node_modules/limbo-wasm": { + "resolved": "..", + "link": true + } + } +} diff --git a/bindings/wasm/test-limbo-pkg/package.json b/bindings/wasm/test-limbo-pkg/package.json new file mode 100644 index 000000000..92e7dfc9e --- /dev/null +++ b/bindings/wasm/test-limbo-pkg/package.json @@ -0,0 +1,8 @@ +{ + "name": "test-limbo", + "private": true, + "type": "commonjs", + "dependencies": { + "limbo-wasm": "file:../" + } +}