bundle browser packages too in order to easily consume them without bundlers

This commit is contained in:
Nikita Sivukhin
2025-09-12 15:27:40 +04:00
parent 1c38344f4f
commit 8c48a1dc47
14 changed files with 3531 additions and 1343 deletions

View File

@@ -0,0 +1,33 @@
import { setupMainThread } from "@tursodatabase/database-browser-common";
//@ts-ignore
import TursoWorker from "./worker.js?worker&inline";
export let MainWorker = null;
const __wasmUrl = new URL('./sync.wasm32-wasi.wasm', import.meta.url).href;
const __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())
const napiModule = await setupMainThread(__wasmFile, () => {
const worker = new TursoWorker({
name: 'turso-database-sync',
type: 'module',
})
MainWorker = worker;
return worker
});
export default napiModule.exports
export const Database = napiModule.exports.Database
export const Statement = napiModule.exports.Statement
export const Opfs = napiModule.exports.Opfs
export const OpfsFile = napiModule.exports.OpfsFile
export const connect = napiModule.exports.connect
export const initThreadPool = napiModule.exports.initThreadPool
export const GeneratorHolder = napiModule.exports.GeneratorHolder
export const JsDataCompletion = napiModule.exports.JsDataCompletion
export const JsProtocolIo = napiModule.exports.JsProtocolIo
export const JsProtocolRequestBytes = napiModule.exports.JsProtocolRequestBytes
export const SyncEngine = napiModule.exports.SyncEngine
export const DatabaseChangeTypeJs = napiModule.exports.DatabaseChangeTypeJs
export const SyncEngineProtocolVersion = napiModule.exports.SyncEngineProtocolVersion

View File

@@ -11,12 +11,16 @@
"packageManager": "yarn@4.9.2",
"files": [
"dist/**",
"bundle/**",
"README.md"
],
"exports": {
".": {
"default": "./dist/promise-default.js"
},
"./bundle": {
"default": "./bundle/main.es.js"
},
"./vite": {
"development": "./dist/promise-vite-dev-hack.js",
"default": "./dist/promise-default.js"
@@ -30,12 +34,14 @@
"@vitest/browser": "^3.2.4",
"playwright": "^1.55.0",
"typescript": "^5.9.2",
"vite": "^7.1.5",
"vitest": "^3.2.4"
},
"scripts": {
"napi-build": "napi build --features browser --release --platform --target wasm32-wasip1-threads --no-js --manifest-path ../../Cargo.toml --output-dir . && rm index.d.ts sync.wasi* wasi* browser.js",
"tsc-build": "npm exec tsc && cp sync.wasm32-wasi.wasm ./dist/sync.wasm32-wasi.wasm && WASM_FILE=sync.wasm32-wasi.wasm JS_FILE=./dist/wasm-inline.js node ../../../scripts/inline-wasm-base64.js",
"build": "npm run napi-build && npm run tsc-build",
"bundle": "vite build",
"build": "npm run napi-build && npm run tsc-build && npm run bundle",
"test": "VITE_TURSO_DB_URL=http://b--a--a.localhost:10000 CI=1 vitest --browser=chromium --run && VITE_TURSO_DB_URL=http://b--a--a.localhost:10000 CI=1 vitest --browser=firefox --run"
},
"napi": {

View File

@@ -0,0 +1,23 @@
import { SyncOpts, DatabaseRowMutation, DatabaseRowStatement, DatabaseRowTransformResult } from "@tursodatabase/sync-common";
import { connect as promiseConnect, Database } from "./promise.js";
import { SyncEngine, initThreadPool, MainWorker } from "./index-bundle.js";
/**
* Creates a new database connection asynchronously.
*
* @param {string} path - Path to the database file.
* @param {Object} opts - Options for database behavior.
* @returns {Promise<Database>} - A promise that resolves to a Database instance.
*/
async function connect(opts: SyncOpts): Promise<Database> {
return await promiseConnect(opts, x => new SyncEngine(x), async () => {
await initThreadPool();
if (MainWorker == null) {
throw new Error("panic: MainWorker is not initialized");
}
return MainWorker;
});
}
export { connect, Database, }
export type { DatabaseRowMutation, DatabaseRowStatement, DatabaseRowTransformResult }

View File

@@ -1,6 +1,6 @@
import { SyncOpts, DatabaseRowMutation, DatabaseRowStatement, DatabaseRowTransformResult } from "@tursodatabase/sync-common";
import { SyncEngine, initThreadPool, MainWorker } from "./index-default.js";
import { connect as promiseConnect, Database } from "./promise.js";
import { SyncEngine, initThreadPool, MainWorker } from "./index-default.js";
/**
* Creates a new database connection asynchronously.

View File

@@ -1,6 +1,6 @@
import { SyncOpts, DatabaseRowMutation, DatabaseRowStatement, DatabaseRowTransformResult } from "@tursodatabase/sync-common";
import { SyncEngine, initThreadPool, MainWorker } from "./index-turbopack-hack.js";
import { connect as promiseConnect, Database } from "./promise.js";
import { SyncEngine, initThreadPool, MainWorker } from "./index-turbopack-hack.js";
/**
* Creates a new database connection asynchronously.

View File

@@ -1,6 +1,6 @@
import { SyncOpts, DatabaseRowMutation, DatabaseRowStatement, DatabaseRowTransformResult } from "@tursodatabase/sync-common";
import { SyncEngine, initThreadPool, MainWorker } from "./index-vite-dev-hack.js";
import { connect as promiseConnect, Database } from "./promise.js";
import { SyncEngine, initThreadPool, MainWorker } from "./index-vite-dev-hack.js";
/**
* Creates a new database connection asynchronously.

View File

@@ -0,0 +1,19 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
export default defineConfig({
base: './',
build: {
lib: {
entry: resolve(__dirname, 'promise-bundle.ts'),
name: 'sync-browser',
fileName: format => `main.${format}.js`,
formats: ['es'],
},
rollupOptions: {
output: {
dir: 'bundle',
}
},
},
});