Begin adding nodejs/web to a single npm package

Update build script to build both
Update package.json

Add basic test of node variant of npm package.
This commit is contained in:
Elijah Morgan
2025-01-09 18:03:53 -05:00
parent 20ea8fb941
commit 6bd40430bf
10 changed files with 139 additions and 31 deletions

View File

@@ -1,2 +1,3 @@
node_modules/
*.wasm
dist/

View File

@@ -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": {

View File

@@ -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/"
}
}

View File

@@ -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);
};
};

View File

@@ -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",

View File

@@ -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

View File

@@ -0,0 +1 @@
test.db

View File

@@ -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());

View File

@@ -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
}
}
}

View File

@@ -0,0 +1,8 @@
{
"name": "test-limbo",
"private": true,
"type": "commonjs",
"dependencies": {
"limbo-wasm": "file:../"
}
}