@weapp-sqlite/wasm 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/dist/index.cjs +74 -0
- package/dist/index.d.cts +35 -0
- package/dist/index.d.mts +35 -0
- package/dist/index.mjs +72 -0
- package/package.json +69 -0
package/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# @weapp-sqlite/wasm
|
|
2
|
+
|
|
3
|
+
可注入 SQLite WASM 引擎和持久化回调的宿主无关 adapter。
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pnpm add @weapp-sqlite/wasm @weapp-sqlite/core
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { openSqliteWasmDatabase } from '@weapp-sqlite/wasm'
|
|
11
|
+
|
|
12
|
+
const database = await openSqliteWasmDatabase(
|
|
13
|
+
initializer,
|
|
14
|
+
'app.sqlite',
|
|
15
|
+
{
|
|
16
|
+
storage,
|
|
17
|
+
},
|
|
18
|
+
)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
本包不直接访问 IndexedDB、小程序文件系统或平台 runtime。Web 使用 `@weapp-sqlite/web`,小程序使用 `@weapp-sqlite/miniprogram`,weapp-vite 项目优先使用 `@weapp-sqlite/weapp-vite`。
|
|
22
|
+
|
|
23
|
+
完整文档与支持矩阵见 [weapp-sqlite 仓库](https://github.com/weapp-sqlite/weapp-sqlite)。
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let _weapp_sqlite_core = require("@weapp-sqlite/core");
|
|
3
|
+
//#region src/driver.ts
|
|
4
|
+
function normalizeScalar(value) {
|
|
5
|
+
if (typeof value === "bigint") return Number(value);
|
|
6
|
+
if (typeof value === "boolean") return value ? 1 : 0;
|
|
7
|
+
if (value instanceof ArrayBuffer) return new Uint8Array(value);
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
function normalizeParameters(parameters) {
|
|
11
|
+
if (parameters === void 0) return;
|
|
12
|
+
if (Array.isArray(parameters)) return parameters.map(normalizeScalar);
|
|
13
|
+
return Object.fromEntries(Object.entries(parameters).map(([key, value]) => [key, normalizeScalar(value)]));
|
|
14
|
+
}
|
|
15
|
+
function rowsFromResult(result) {
|
|
16
|
+
return {
|
|
17
|
+
columns: result.columns,
|
|
18
|
+
rows: result.values.map((values) => {
|
|
19
|
+
const row = {};
|
|
20
|
+
result.columns.forEach((column, index) => {
|
|
21
|
+
row[column] = values[index];
|
|
22
|
+
});
|
|
23
|
+
return row;
|
|
24
|
+
})
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function createConnection(database, name, storage) {
|
|
28
|
+
let dirty = false;
|
|
29
|
+
return {
|
|
30
|
+
async exec(sql, parameters) {
|
|
31
|
+
database.run(sql, normalizeParameters(parameters));
|
|
32
|
+
dirty = true;
|
|
33
|
+
const row = database.exec("SELECT changes() AS changes, last_insert_rowid() AS lastInsertRowid")[0]?.values[0];
|
|
34
|
+
return {
|
|
35
|
+
changes: Number(row?.[0] ?? 0),
|
|
36
|
+
lastInsertRowid: Number(row?.[1] ?? 0)
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
async query(sql, parameters) {
|
|
40
|
+
const result = database.exec(sql, normalizeParameters(parameters))[0];
|
|
41
|
+
return result ? rowsFromResult(result) : {
|
|
42
|
+
columns: [],
|
|
43
|
+
rows: []
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
async flush() {
|
|
47
|
+
if (!dirty) return;
|
|
48
|
+
await storage.save(name, database.export());
|
|
49
|
+
dirty = false;
|
|
50
|
+
},
|
|
51
|
+
async close() {
|
|
52
|
+
database.close();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function createSqliteWasmDriver(initializer, options) {
|
|
57
|
+
let modulePromise;
|
|
58
|
+
return {
|
|
59
|
+
kind: "wasm",
|
|
60
|
+
async open(name) {
|
|
61
|
+
modulePromise ??= initializer(options.locateFile ? { locateFile: options.locateFile } : void 0);
|
|
62
|
+
const module = await modulePromise;
|
|
63
|
+
const data = await options.storage.load(name);
|
|
64
|
+
return createConnection(new module.Database(data), name, options.storage);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function openSqliteWasmDatabase(initializer, name, options) {
|
|
69
|
+
const connection = await createSqliteWasmDriver(initializer, options).open(name);
|
|
70
|
+
return (0, _weapp_sqlite_core.createSqliteDatabase)(name, connection);
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
exports.createSqliteWasmDriver = createSqliteWasmDriver;
|
|
74
|
+
exports.openSqliteWasmDatabase = openSqliteWasmDatabase;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SqliteDatabase, SqliteDriver, SqliteParameters, SqliteScalar } from "@weapp-sqlite/core";
|
|
2
|
+
//#region src/types.d.ts
|
|
3
|
+
type SqlJsScalar = Exclude<SqliteScalar, bigint | boolean | ArrayBuffer>;
|
|
4
|
+
type SqlJsParameters = SqlJsScalar[] | Record<string, SqlJsScalar> | null;
|
|
5
|
+
interface SqlJsResult {
|
|
6
|
+
readonly columns: readonly string[];
|
|
7
|
+
readonly values: readonly (readonly unknown[])[];
|
|
8
|
+
}
|
|
9
|
+
interface SqlJsDatabase {
|
|
10
|
+
run: (sql: string, parameters?: SqlJsParameters) => SqlJsDatabase;
|
|
11
|
+
exec: (sql: string, parameters?: SqlJsParameters) => readonly SqlJsResult[];
|
|
12
|
+
export: () => Uint8Array;
|
|
13
|
+
close: () => void;
|
|
14
|
+
}
|
|
15
|
+
interface SqlJsModule {
|
|
16
|
+
readonly Database: new (data?: ArrayLike<number> | null) => SqlJsDatabase;
|
|
17
|
+
}
|
|
18
|
+
type SqlJsInitializer = (options?: {
|
|
19
|
+
locateFile?: (file: string) => string;
|
|
20
|
+
}) => Promise<SqlJsModule>;
|
|
21
|
+
interface SqliteWasmStorage {
|
|
22
|
+
load: (name: string) => Promise<Uint8Array | undefined>;
|
|
23
|
+
save: (name: string, data: Uint8Array) => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
interface SqliteWasmDriverOptions {
|
|
26
|
+
readonly storage: SqliteWasmStorage;
|
|
27
|
+
readonly locateFile?: (file: string) => string;
|
|
28
|
+
}
|
|
29
|
+
type SqliteWasmParameters = SqliteParameters;
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/driver.d.ts
|
|
32
|
+
declare function createSqliteWasmDriver(initializer: SqlJsInitializer, options: SqliteWasmDriverOptions): SqliteDriver;
|
|
33
|
+
declare function openSqliteWasmDatabase(initializer: SqlJsInitializer, name: string, options: SqliteWasmDriverOptions): Promise<SqliteDatabase>;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { type SqlJsDatabase, type SqlJsInitializer, type SqlJsModule, type SqlJsParameters, type SqlJsResult, type SqlJsScalar, type SqliteWasmDriverOptions, type SqliteWasmParameters, type SqliteWasmStorage, createSqliteWasmDriver, openSqliteWasmDatabase };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SqliteDatabase, SqliteDriver, SqliteParameters, SqliteScalar } from "@weapp-sqlite/core";
|
|
2
|
+
//#region src/types.d.ts
|
|
3
|
+
type SqlJsScalar = Exclude<SqliteScalar, bigint | boolean | ArrayBuffer>;
|
|
4
|
+
type SqlJsParameters = SqlJsScalar[] | Record<string, SqlJsScalar> | null;
|
|
5
|
+
interface SqlJsResult {
|
|
6
|
+
readonly columns: readonly string[];
|
|
7
|
+
readonly values: readonly (readonly unknown[])[];
|
|
8
|
+
}
|
|
9
|
+
interface SqlJsDatabase {
|
|
10
|
+
run: (sql: string, parameters?: SqlJsParameters) => SqlJsDatabase;
|
|
11
|
+
exec: (sql: string, parameters?: SqlJsParameters) => readonly SqlJsResult[];
|
|
12
|
+
export: () => Uint8Array;
|
|
13
|
+
close: () => void;
|
|
14
|
+
}
|
|
15
|
+
interface SqlJsModule {
|
|
16
|
+
readonly Database: new (data?: ArrayLike<number> | null) => SqlJsDatabase;
|
|
17
|
+
}
|
|
18
|
+
type SqlJsInitializer = (options?: {
|
|
19
|
+
locateFile?: (file: string) => string;
|
|
20
|
+
}) => Promise<SqlJsModule>;
|
|
21
|
+
interface SqliteWasmStorage {
|
|
22
|
+
load: (name: string) => Promise<Uint8Array | undefined>;
|
|
23
|
+
save: (name: string, data: Uint8Array) => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
interface SqliteWasmDriverOptions {
|
|
26
|
+
readonly storage: SqliteWasmStorage;
|
|
27
|
+
readonly locateFile?: (file: string) => string;
|
|
28
|
+
}
|
|
29
|
+
type SqliteWasmParameters = SqliteParameters;
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/driver.d.ts
|
|
32
|
+
declare function createSqliteWasmDriver(initializer: SqlJsInitializer, options: SqliteWasmDriverOptions): SqliteDriver;
|
|
33
|
+
declare function openSqliteWasmDatabase(initializer: SqlJsInitializer, name: string, options: SqliteWasmDriverOptions): Promise<SqliteDatabase>;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { type SqlJsDatabase, type SqlJsInitializer, type SqlJsModule, type SqlJsParameters, type SqlJsResult, type SqlJsScalar, type SqliteWasmDriverOptions, type SqliteWasmParameters, type SqliteWasmStorage, createSqliteWasmDriver, openSqliteWasmDatabase };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createSqliteDatabase } from "@weapp-sqlite/core";
|
|
2
|
+
//#region src/driver.ts
|
|
3
|
+
function normalizeScalar(value) {
|
|
4
|
+
if (typeof value === "bigint") return Number(value);
|
|
5
|
+
if (typeof value === "boolean") return value ? 1 : 0;
|
|
6
|
+
if (value instanceof ArrayBuffer) return new Uint8Array(value);
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function normalizeParameters(parameters) {
|
|
10
|
+
if (parameters === void 0) return;
|
|
11
|
+
if (Array.isArray(parameters)) return parameters.map(normalizeScalar);
|
|
12
|
+
return Object.fromEntries(Object.entries(parameters).map(([key, value]) => [key, normalizeScalar(value)]));
|
|
13
|
+
}
|
|
14
|
+
function rowsFromResult(result) {
|
|
15
|
+
return {
|
|
16
|
+
columns: result.columns,
|
|
17
|
+
rows: result.values.map((values) => {
|
|
18
|
+
const row = {};
|
|
19
|
+
result.columns.forEach((column, index) => {
|
|
20
|
+
row[column] = values[index];
|
|
21
|
+
});
|
|
22
|
+
return row;
|
|
23
|
+
})
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function createConnection(database, name, storage) {
|
|
27
|
+
let dirty = false;
|
|
28
|
+
return {
|
|
29
|
+
async exec(sql, parameters) {
|
|
30
|
+
database.run(sql, normalizeParameters(parameters));
|
|
31
|
+
dirty = true;
|
|
32
|
+
const row = database.exec("SELECT changes() AS changes, last_insert_rowid() AS lastInsertRowid")[0]?.values[0];
|
|
33
|
+
return {
|
|
34
|
+
changes: Number(row?.[0] ?? 0),
|
|
35
|
+
lastInsertRowid: Number(row?.[1] ?? 0)
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
async query(sql, parameters) {
|
|
39
|
+
const result = database.exec(sql, normalizeParameters(parameters))[0];
|
|
40
|
+
return result ? rowsFromResult(result) : {
|
|
41
|
+
columns: [],
|
|
42
|
+
rows: []
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
async flush() {
|
|
46
|
+
if (!dirty) return;
|
|
47
|
+
await storage.save(name, database.export());
|
|
48
|
+
dirty = false;
|
|
49
|
+
},
|
|
50
|
+
async close() {
|
|
51
|
+
database.close();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function createSqliteWasmDriver(initializer, options) {
|
|
56
|
+
let modulePromise;
|
|
57
|
+
return {
|
|
58
|
+
kind: "wasm",
|
|
59
|
+
async open(name) {
|
|
60
|
+
modulePromise ??= initializer(options.locateFile ? { locateFile: options.locateFile } : void 0);
|
|
61
|
+
const module = await modulePromise;
|
|
62
|
+
const data = await options.storage.load(name);
|
|
63
|
+
return createConnection(new module.Database(data), name, options.storage);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async function openSqliteWasmDatabase(initializer, name, options) {
|
|
68
|
+
const connection = await createSqliteWasmDriver(initializer, options).open(name);
|
|
69
|
+
return createSqliteDatabase(name, connection);
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { createSqliteWasmDriver, openSqliteWasmDatabase };
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@weapp-sqlite/wasm",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "基于可注入 WASM SQLite 引擎的跨宿主 adapter",
|
|
6
|
+
"author": "weapp-sqlite contributors",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"homepage": "https://github.com/weapp-sqlite/weapp-sqlite#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/weapp-sqlite/weapp-sqlite.git",
|
|
12
|
+
"directory": "packages/wasm"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/weapp-sqlite/weapp-sqlite/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"sqlite",
|
|
19
|
+
"wasm",
|
|
20
|
+
"weapp",
|
|
21
|
+
"weapp-sqlite",
|
|
22
|
+
"miniprogram"
|
|
23
|
+
],
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.mts",
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/index.d.mts",
|
|
30
|
+
"default": "./dist/index.mjs"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"types": "./dist/index.d.cts",
|
|
34
|
+
"default": "./dist/index.cjs"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"main": "./dist/index.cjs",
|
|
39
|
+
"module": "./dist/index.mjs",
|
|
40
|
+
"types": "./dist/index.d.mts",
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
],
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18.0.0"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"dev": "tsdown -w",
|
|
49
|
+
"build": "tsdown",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:dev": "vitest",
|
|
52
|
+
"release": "pnpm publish",
|
|
53
|
+
"lint": "eslint .",
|
|
54
|
+
"lint:fix": "eslint . --fix",
|
|
55
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
56
|
+
"tsd": "pnpm build && tsd --files test-d/**/*.test-d.ts"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@weapp-sqlite/core": "workspace:*"
|
|
60
|
+
},
|
|
61
|
+
"publishConfig": {
|
|
62
|
+
"access": "public",
|
|
63
|
+
"registry": "https://registry.npmjs.org/"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/sql.js": "^1.4.11",
|
|
67
|
+
"sql.js": "^1.14.2"
|
|
68
|
+
}
|
|
69
|
+
}
|