@evolu/common 7.4.0 → 8.0.0-next.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 +4 -61
- package/dist/src/Array.d.ts +343 -102
- package/dist/src/Array.d.ts.map +1 -1
- package/dist/src/Array.js +181 -85
- package/dist/src/Assert.d.ts +57 -11
- package/dist/src/Assert.d.ts.map +1 -1
- package/dist/src/Assert.js +47 -11
- package/dist/src/BigInt.d.ts +6 -1
- package/dist/src/BigInt.d.ts.map +1 -1
- package/dist/src/BigInt.js +5 -0
- package/dist/src/Brand.d.ts +40 -12
- package/dist/src/Brand.d.ts.map +1 -1
- package/dist/src/Brand.js +5 -0
- package/dist/src/Buffer.d.ts +6 -1
- package/dist/src/Buffer.d.ts.map +1 -1
- package/dist/src/Buffer.js +7 -2
- package/dist/src/Cache.d.ts +10 -2
- package/dist/src/Cache.d.ts.map +1 -1
- package/dist/src/Cache.js +6 -0
- package/dist/src/Callbacks.d.ts +10 -7
- package/dist/src/Callbacks.d.ts.map +1 -1
- package/dist/src/Callbacks.js +23 -13
- package/dist/src/Console.d.ts +361 -69
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +217 -117
- package/dist/src/Crypto.d.ts +70 -21
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +72 -27
- package/dist/src/Eq.d.ts +22 -2
- package/dist/src/Eq.d.ts.map +1 -1
- package/dist/src/Eq.js +21 -1
- package/dist/src/Error.d.ts +23 -12
- package/dist/src/Error.d.ts.map +1 -1
- package/dist/src/Error.js +27 -11
- package/dist/src/Function.d.ts +128 -56
- package/dist/src/Function.d.ts.map +1 -1
- package/dist/src/Function.js +118 -14
- package/dist/src/Identicon.d.ts +5 -0
- package/dist/src/Identicon.d.ts.map +1 -1
- package/dist/src/Identicon.js +6 -1
- package/dist/src/Lookup.d.ts +160 -0
- package/dist/src/Lookup.d.ts.map +1 -0
- package/dist/src/Lookup.js +192 -0
- package/dist/src/Microtask.d.ts +21 -0
- package/dist/src/Microtask.d.ts.map +1 -0
- package/dist/src/Microtask.js +37 -0
- package/dist/src/Number.d.ts +18 -4
- package/dist/src/Number.d.ts.map +1 -1
- package/dist/src/Number.js +23 -1
- package/dist/src/Object.d.ts +110 -5
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +108 -5
- package/dist/src/Option.d.ts +58 -0
- package/dist/src/Option.d.ts.map +1 -0
- package/dist/src/Option.js +43 -0
- package/dist/src/Order.d.ts +5 -0
- package/dist/src/Order.d.ts.map +1 -1
- package/dist/src/Order.js +8 -3
- package/dist/src/Platform.d.ts +36 -2
- package/dist/src/Platform.d.ts.map +1 -1
- package/dist/src/Platform.js +10 -6
- package/dist/src/Polyfills.d.ts +27 -0
- package/dist/src/Polyfills.d.ts.map +1 -0
- package/dist/src/Polyfills.js +299 -0
- package/dist/src/Random.d.ts +18 -7
- package/dist/src/Random.d.ts.map +1 -1
- package/dist/src/Random.js +9 -7
- package/dist/src/Redacted.d.ts +7 -4
- package/dist/src/Redacted.d.ts.map +1 -1
- package/dist/src/Redacted.js +5 -0
- package/dist/src/Ref.d.ts +31 -16
- package/dist/src/Ref.d.ts.map +1 -1
- package/dist/src/Ref.js +35 -7
- package/dist/src/RefCount.d.ts +62 -0
- package/dist/src/RefCount.d.ts.map +1 -0
- package/dist/src/RefCount.js +83 -0
- package/dist/src/Relation.d.ts +84 -29
- package/dist/src/Relation.d.ts.map +1 -1
- package/dist/src/Relation.js +83 -105
- package/dist/src/Resource.d.ts +263 -0
- package/dist/src/Resource.d.ts.map +1 -0
- package/dist/src/Resource.js +389 -0
- package/dist/src/Result.d.ts +390 -374
- package/dist/src/Result.d.ts.map +1 -1
- package/dist/src/Result.js +142 -70
- package/dist/src/Schedule.d.ts +953 -0
- package/dist/src/Schedule.d.ts.map +1 -0
- package/dist/src/Schedule.js +1199 -0
- package/dist/src/Set.d.ts +181 -0
- package/dist/src/Set.d.ts.map +1 -0
- package/dist/src/Set.js +137 -0
- package/dist/src/Skiplist.d.ts +6 -1
- package/dist/src/Skiplist.d.ts.map +1 -1
- package/dist/src/Skiplist.js +5 -0
- package/dist/src/Sqlite.d.ts +160 -60
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +290 -190
- package/dist/src/Store.d.ts +36 -28
- package/dist/src/Store.d.ts.map +1 -1
- package/dist/src/Store.js +55 -15
- package/dist/src/String.d.ts +5 -0
- package/dist/src/String.d.ts.map +1 -1
- package/dist/src/String.js +5 -0
- package/dist/src/Task.d.ts +2263 -423
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +1488 -348
- package/dist/src/Test.d.ts +122 -0
- package/dist/src/Test.d.ts.map +1 -0
- package/dist/src/Test.js +66 -0
- package/dist/src/Time.d.ts +201 -48
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +190 -86
- package/dist/src/Tracer.d.ts +48 -0
- package/dist/src/Tracer.d.ts.map +1 -0
- package/dist/src/Tracer.js +6 -0
- package/dist/src/Type.d.ts +582 -209
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +362 -240
- package/dist/src/Types.d.ts +160 -6
- package/dist/src/Types.d.ts.map +1 -1
- package/dist/src/Types.js +22 -2
- package/dist/src/WebSocket.d.ts +113 -58
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +210 -118
- package/dist/src/Worker.d.ts +245 -60
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +220 -64
- package/dist/src/index.d.ts +25 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +19 -3
- package/dist/src/local-first/Db.d.ts +24 -213
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +622 -293
- package/dist/src/local-first/Error.d.ts +12 -0
- package/dist/src/local-first/Error.d.ts.map +1 -0
- package/dist/src/local-first/Error.js +6 -0
- package/dist/src/local-first/Evolu.d.ts +330 -285
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +472 -402
- package/dist/src/local-first/LocalAuth.d.ts +10 -10
- package/dist/src/local-first/LocalAuth.d.ts.map +1 -1
- package/dist/src/local-first/LocalAuth.js +6 -1
- package/dist/src/local-first/Owner.d.ts +70 -27
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Owner.js +27 -14
- package/dist/src/local-first/Protocol.d.ts +58 -50
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +253 -155
- package/dist/src/local-first/Query.d.ts +133 -43
- package/dist/src/local-first/Query.d.ts.map +1 -1
- package/dist/src/local-first/Query.js +139 -90
- package/dist/src/local-first/Relay.d.ts +18 -38
- package/dist/src/local-first/Relay.d.ts.map +1 -1
- package/dist/src/local-first/Relay.js +59 -171
- package/dist/src/local-first/Schema.d.ts +139 -144
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Schema.js +78 -163
- package/dist/src/local-first/Shared.d.ts +125 -0
- package/dist/src/local-first/Shared.d.ts.map +1 -0
- package/dist/src/local-first/Shared.js +569 -0
- package/dist/src/local-first/Storage.d.ts +50 -53
- package/dist/src/local-first/Storage.d.ts.map +1 -1
- package/dist/src/local-first/Storage.js +121 -173
- package/dist/src/local-first/Timestamp.d.ts +28 -35
- package/dist/src/local-first/Timestamp.d.ts.map +1 -1
- package/dist/src/local-first/Timestamp.js +24 -25
- package/dist/src/local-first/index.d.ts +2 -15
- package/dist/src/local-first/index.d.ts.map +1 -1
- package/dist/src/local-first/index.js +2 -15
- package/package.json +36 -26
- package/src/Array.ts +467 -106
- package/src/Assert.ts +87 -12
- package/src/BigInt.ts +7 -1
- package/src/Brand.ts +41 -12
- package/src/Buffer.ts +10 -4
- package/src/Cache.ts +11 -2
- package/src/Callbacks.ts +33 -23
- package/src/Console.ts +567 -178
- package/src/Crypto.ts +111 -62
- package/src/Eq.ts +30 -3
- package/src/Error.ts +50 -34
- package/src/Function.ts +140 -68
- package/src/Identicon.ts +7 -1
- package/src/Lookup.ts +415 -0
- package/src/Microtask.ts +58 -0
- package/src/Number.ts +40 -7
- package/src/Object.ts +155 -16
- package/src/Option.ts +74 -0
- package/src/Order.ts +11 -3
- package/src/Platform.ts +43 -7
- package/src/Polyfills.ts +465 -0
- package/src/Random.ts +25 -11
- package/src/Redacted.ts +8 -4
- package/src/Ref.ts +72 -21
- package/src/RefCount.ts +170 -0
- package/src/Relation.ts +188 -136
- package/src/Resource.ts +864 -0
- package/src/Result.ts +548 -381
- package/src/Schedule.ts +1471 -0
- package/src/Set.ts +247 -0
- package/src/Skiplist.ts +7 -1
- package/src/Sqlite.ts +409 -304
- package/src/Store.ts +94 -48
- package/src/String.ts +6 -0
- package/src/Task.ts +3685 -740
- package/src/Test.ts +162 -0
- package/src/Time.ts +348 -145
- package/src/Tracer.ts +54 -0
- package/src/Type.ts +1064 -630
- package/src/Types.ts +202 -7
- package/src/WebSocket.ts +311 -178
- package/src/Worker.ts +527 -147
- package/src/index.ts +74 -3
- package/src/local-first/Db.ts +871 -597
- package/src/local-first/Error.ts +17 -0
- package/src/local-first/Evolu.ts +884 -823
- package/src/local-first/LocalAuth.ts +10 -10
- package/src/local-first/Owner.ts +94 -42
- package/src/local-first/Protocol.ts +440 -303
- package/src/local-first/Query.ts +243 -194
- package/src/local-first/Relay.ts +91 -252
- package/src/local-first/Schema.ts +284 -394
- package/src/local-first/Shared.ts +932 -0
- package/src/local-first/Storage.ts +209 -282
- package/src/local-first/Timestamp.ts +38 -45
- package/src/local-first/index.ts +2 -16
- package/LICENSE +0 -21
- package/dist/src/Instances.d.ts +0 -34
- package/dist/src/Instances.d.ts.map +0 -1
- package/dist/src/Instances.js +0 -44
- package/dist/src/Resources.d.ts +0 -118
- package/dist/src/Resources.d.ts.map +0 -1
- package/dist/src/Resources.js +0 -197
- package/dist/src/local-first/Platform.d.ts +0 -25
- package/dist/src/local-first/Platform.d.ts.map +0 -1
- package/dist/src/local-first/Platform.js +0 -1
- package/dist/src/local-first/Public.d.ts +0 -22
- package/dist/src/local-first/Public.d.ts.map +0 -1
- package/dist/src/local-first/Public.js +0 -15
- package/dist/src/local-first/PublicKysely.d.ts +0 -148
- package/dist/src/local-first/PublicKysely.d.ts.map +0 -1
- package/dist/src/local-first/PublicKysely.js +0 -184
- package/dist/src/local-first/Sync.d.ts +0 -112
- package/dist/src/local-first/Sync.d.ts.map +0 -1
- package/dist/src/local-first/Sync.js +0 -529
- package/src/Instances.ts +0 -90
- package/src/Resources.ts +0 -367
- package/src/local-first/Platform.ts +0 -27
- package/src/local-first/Public.ts +0 -42
- package/src/local-first/PublicKysely.ts +0 -239
- package/src/local-first/Sync.ts +0 -960
package/dist/src/Sqlite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Sqlite.js
CHANGED
|
@@ -1,112 +1,231 @@
|
|
|
1
|
-
import { createLruCache } from "./Cache.js";
|
|
2
|
-
import { eqArrayNumber } from "./Eq.js";
|
|
3
|
-
import { createTransferableError } from "./Error.js";
|
|
4
|
-
import { err, ok, tryAsync, trySync } from "./Result.js";
|
|
5
|
-
import { Null, Number, PositiveInt, String, Uint8Array, union, } from "./Type.js";
|
|
6
1
|
/**
|
|
7
|
-
*
|
|
2
|
+
* SQLite database abstraction and query execution.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
7
|
+
if (value !== null && value !== void 0) {
|
|
8
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
9
|
+
var dispose, inner;
|
|
10
|
+
if (async) {
|
|
11
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
12
|
+
dispose = value[Symbol.asyncDispose];
|
|
13
|
+
}
|
|
14
|
+
if (dispose === void 0) {
|
|
15
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
16
|
+
dispose = value[Symbol.dispose];
|
|
17
|
+
if (async) inner = dispose;
|
|
18
|
+
}
|
|
19
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
20
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
21
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
22
|
+
}
|
|
23
|
+
else if (async) {
|
|
24
|
+
env.stack.push({ async: true });
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
};
|
|
28
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
29
|
+
return function (env) {
|
|
30
|
+
function fail(e) {
|
|
31
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
32
|
+
env.hasError = true;
|
|
33
|
+
}
|
|
34
|
+
var r, s = 0;
|
|
35
|
+
function next() {
|
|
36
|
+
while (r = env.stack.pop()) {
|
|
37
|
+
try {
|
|
38
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
39
|
+
if (r.dispose) {
|
|
40
|
+
var result = r.dispose.call(r.value);
|
|
41
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
42
|
+
}
|
|
43
|
+
else s |= 1;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
fail(e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
50
|
+
if (env.hasError) throw env.error;
|
|
51
|
+
}
|
|
52
|
+
return next();
|
|
53
|
+
};
|
|
54
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
55
|
+
var e = new Error(message);
|
|
56
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
57
|
+
});
|
|
58
|
+
import { assertNotDisposed } from "./Assert.js";
|
|
59
|
+
import { bytesToHex, hexToBytes } from "./Buffer.js";
|
|
60
|
+
import { createEqObject, eqArrayNumber, eqString } from "./Eq.js";
|
|
61
|
+
import { createRecord, objectToEntries } from "./Object.js";
|
|
62
|
+
import { ok } from "./Result.js";
|
|
63
|
+
import { testCreateRun } from "./Test.js";
|
|
64
|
+
import { array, Null, Number, object, record, set, String, testName, Uint8Array, union, } from "./Type.js";
|
|
65
|
+
/**
|
|
66
|
+
* A value that can be stored in {@link Sqlite}.
|
|
8
67
|
*
|
|
9
68
|
* Note that Evolu can't support Int64 because expo-sqlite (and some others) do
|
|
10
69
|
* not support it.
|
|
11
70
|
*/
|
|
12
|
-
export const SqliteValue = union(Null, String, Number, Uint8Array);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
71
|
+
export const SqliteValue = /*#__PURE__*/ union(Null, String, Number, Uint8Array);
|
|
72
|
+
/** Equality comparison for {@link SqliteValue}. */
|
|
73
|
+
export const eqSqliteValue = (x, y) => Uint8Array.is(x) && Uint8Array.is(y) ? eqArrayNumber(x, y) : x === y;
|
|
74
|
+
/** Converts a {@link SqliteQuery} into a stable {@link SqliteQueryString}. */
|
|
75
|
+
export const sqliteQueryToSqliteQueryString = (query) => {
|
|
76
|
+
const params = query.parameters.map((value) => value instanceof globalThis.Uint8Array
|
|
77
|
+
? ["b", bytesToHex(value)]
|
|
78
|
+
: ["j", value]);
|
|
79
|
+
const options = query.options
|
|
80
|
+
? objectToEntries(query.options).toSorted(([a], [b]) => a.localeCompare(b))
|
|
81
|
+
: [];
|
|
82
|
+
return JSON.stringify([query.sql, params, options]);
|
|
83
|
+
};
|
|
84
|
+
/** Converts a {@link SqliteQueryString} back into a {@link SqliteQuery}. */
|
|
85
|
+
export const sqliteQueryStringToSqliteQuery = (query) => {
|
|
86
|
+
const [sql, paramsArr, optionsArr] = JSON.parse(query);
|
|
87
|
+
const parameters = paramsArr.map(([type, value]) => type === "b" ? hexToBytes(value) : value);
|
|
88
|
+
const options = optionsArr.length
|
|
89
|
+
? Object.fromEntries(optionsArr)
|
|
90
|
+
: undefined;
|
|
91
|
+
return {
|
|
92
|
+
sql,
|
|
93
|
+
parameters,
|
|
94
|
+
...(options !== undefined && { options }),
|
|
95
|
+
};
|
|
19
96
|
};
|
|
20
97
|
/**
|
|
21
|
-
* Creates a
|
|
22
|
-
*
|
|
98
|
+
* Creates a {@link Sqlite} instance backed by a platform-specific driver.
|
|
99
|
+
*
|
|
100
|
+
* The driver is created via {@link CreateSqliteDriver} and wrapped with logging,
|
|
101
|
+
* error handling, and transaction helpers.
|
|
23
102
|
*/
|
|
24
|
-
export const createSqlite = (
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
deps.console
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
driver.exec(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}, createSqliteError);
|
|
52
|
-
// There was an SqliteError during begin, callback, or commit
|
|
53
|
-
if (!transactionResult.ok) {
|
|
54
|
-
const rollback = doRollback();
|
|
55
|
-
if (!rollback.ok) {
|
|
56
|
-
deps.console?.log("[sql] rollback failed", rollback.error);
|
|
57
|
-
return err({
|
|
58
|
-
type: "SqliteError",
|
|
59
|
-
error: transactionResult.error.error,
|
|
60
|
-
rollbackError: rollback.error.error,
|
|
103
|
+
export const createSqlite = (name, options) => async (run) => {
|
|
104
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
105
|
+
try {
|
|
106
|
+
const { createSqliteDriver } = run.deps;
|
|
107
|
+
const console = run.deps.console.child("sql");
|
|
108
|
+
const stack = __addDisposableResource(env_1, new AsyncDisposableStack(), true);
|
|
109
|
+
const driverResult = await run(createSqliteDriver(name, options));
|
|
110
|
+
if (!driverResult.ok)
|
|
111
|
+
return driverResult;
|
|
112
|
+
const driver = stack.use(driverResult.value);
|
|
113
|
+
console.debug("SQLite driver created");
|
|
114
|
+
const moved = stack.move();
|
|
115
|
+
const sqlite = {
|
|
116
|
+
exec: (query) => {
|
|
117
|
+
assertNotDisposed(moved);
|
|
118
|
+
console.debug({ query });
|
|
119
|
+
const label = query.options?.logQueryExecutionTime &&
|
|
120
|
+
`SqliteQueryExecutionTime ${query.sql}`;
|
|
121
|
+
if (label)
|
|
122
|
+
console.time(label);
|
|
123
|
+
const result = driver.exec(query);
|
|
124
|
+
if (label)
|
|
125
|
+
console.timeEnd(label);
|
|
126
|
+
if (query.options?.logExplainQueryPlan) {
|
|
127
|
+
const result = driver.exec({
|
|
128
|
+
...query,
|
|
129
|
+
sql: `EXPLAIN QUERY PLAN ${query.sql}`,
|
|
61
130
|
});
|
|
131
|
+
console.log("[logExplainQueryPlan]", query);
|
|
132
|
+
console.log(drawSqliteQueryPlan(result.rows));
|
|
62
133
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
134
|
+
console.debug({ result });
|
|
135
|
+
return result;
|
|
136
|
+
},
|
|
137
|
+
transaction: ((callback) => {
|
|
138
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
139
|
+
try {
|
|
140
|
+
assertNotDisposed(moved);
|
|
141
|
+
console.debug("begin");
|
|
142
|
+
driver.exec(sql `begin;`);
|
|
143
|
+
let shouldRollback = true;
|
|
144
|
+
const _rollback = __addDisposableResource(env_2, {
|
|
145
|
+
[Symbol.dispose]: () => {
|
|
146
|
+
if (!shouldRollback)
|
|
147
|
+
return;
|
|
148
|
+
console.debug("rollback");
|
|
149
|
+
driver.exec(sql `rollback;`);
|
|
150
|
+
},
|
|
151
|
+
}, false);
|
|
152
|
+
const result = callback();
|
|
153
|
+
if (result != null && !result.ok)
|
|
154
|
+
return result;
|
|
155
|
+
console.debug("commit");
|
|
156
|
+
driver.exec(sql `commit;`);
|
|
157
|
+
shouldRollback = false;
|
|
158
|
+
return result;
|
|
75
159
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
160
|
+
catch (e_2) {
|
|
161
|
+
env_2.error = e_2;
|
|
162
|
+
env_2.hasError = true;
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
__disposeResources(env_2);
|
|
166
|
+
}
|
|
167
|
+
}),
|
|
168
|
+
export: () => {
|
|
169
|
+
assertNotDisposed(moved);
|
|
170
|
+
return driver.export();
|
|
171
|
+
},
|
|
172
|
+
[Symbol.asyncDispose]: () => moved.disposeAsync(),
|
|
173
|
+
};
|
|
174
|
+
return ok(sqlite);
|
|
175
|
+
}
|
|
176
|
+
catch (e_1) {
|
|
177
|
+
env_1.error = e_1;
|
|
178
|
+
env_1.hasError = true;
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
const result_1 = __disposeResources(env_1);
|
|
182
|
+
if (result_1)
|
|
183
|
+
await result_1;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
/** Creates a test setup with a in-memory {@link Sqlite}. */
|
|
187
|
+
export const testSetupSqlite = async (deps) => {
|
|
188
|
+
const env_3 = { stack: [], error: void 0, hasError: false };
|
|
189
|
+
try {
|
|
190
|
+
const stack = __addDisposableResource(env_3, new AsyncDisposableStack(), true);
|
|
191
|
+
const run = stack.use(testCreateRun(deps));
|
|
192
|
+
const sqlite = stack.use(await run.orThrow(createSqlite(testName, { mode: "memory" })));
|
|
193
|
+
const moved = stack.move();
|
|
194
|
+
return {
|
|
195
|
+
run: run.addDeps({ sqlite }),
|
|
196
|
+
sqlite,
|
|
197
|
+
[Symbol.asyncDispose]: () => moved.disposeAsync(),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (e_3) {
|
|
201
|
+
env_3.error = e_3;
|
|
202
|
+
env_3.hasError = true;
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
const result_2 = __disposeResources(env_3);
|
|
206
|
+
if (result_2)
|
|
207
|
+
await result_2;
|
|
102
208
|
}
|
|
103
|
-
const start = performance.now();
|
|
104
|
-
const result = callback();
|
|
105
|
-
const elapsed = performance.now() - start;
|
|
106
|
-
// eslint-disable-next-line no-console
|
|
107
|
-
console.log(`SqliteQueryExecutionTime: ${elapsed.toString()}ms`, query);
|
|
108
|
-
return result;
|
|
109
209
|
};
|
|
210
|
+
const drawSqliteQueryPlan = (rows) => rows
|
|
211
|
+
.map((row) => {
|
|
212
|
+
let parentId = row.parent;
|
|
213
|
+
let indent = 0;
|
|
214
|
+
do {
|
|
215
|
+
const parent = rows.find((r) => r.id === parentId);
|
|
216
|
+
if (!parent)
|
|
217
|
+
break;
|
|
218
|
+
parentId = parent.parent;
|
|
219
|
+
indent++;
|
|
220
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition
|
|
221
|
+
} while (true);
|
|
222
|
+
return `${" ".repeat(indent)}${row.detail}`;
|
|
223
|
+
})
|
|
224
|
+
.join("\n");
|
|
225
|
+
/**
|
|
226
|
+
* Creates a {@link PreparedStatements} cache backed by the given factory and
|
|
227
|
+
* dispose function.
|
|
228
|
+
*/
|
|
110
229
|
export const createPreparedStatementsCache = (factory, disposeFn) => {
|
|
111
230
|
let isDisposed = false;
|
|
112
231
|
const cache = new Map();
|
|
@@ -162,7 +281,7 @@ export const createPreparedStatementsCache = (factory, disposeFn) => {
|
|
|
162
281
|
* sqlite.exec(sql`select * from users order by ${sql.raw(orderBy)};`);
|
|
163
282
|
* ```
|
|
164
283
|
*
|
|
165
|
-
*
|
|
284
|
+
* ## TIP
|
|
166
285
|
*
|
|
167
286
|
* Use `prettier-plugin-sql-cst` for SQL formatting. Like Prettier for
|
|
168
287
|
* JavaScript, this plugin formats SQL expressions differently depending on
|
|
@@ -184,7 +303,7 @@ export const sql = (strings, ...parameters) => {
|
|
|
184
303
|
}
|
|
185
304
|
}
|
|
186
305
|
}
|
|
187
|
-
return { sql: sql, parameters: values };
|
|
306
|
+
return { sql: sql.trim(), parameters: values };
|
|
188
307
|
};
|
|
189
308
|
sql.identifier = (identifier) => ({
|
|
190
309
|
type: "SqlIdentifier",
|
|
@@ -192,124 +311,105 @@ sql.identifier = (identifier) => ({
|
|
|
192
311
|
sql: `"${identifier.replace(/"/g, '""')}"`,
|
|
193
312
|
});
|
|
194
313
|
/**
|
|
195
|
-
* Insert any string.
|
|
314
|
+
* Insert any string verbatim.
|
|
196
315
|
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
* **Warning**: This is not escaped.
|
|
316
|
+
* **Warning**: This is not escaped. Use only with trusted, constant SQL
|
|
317
|
+
* fragments to avoid SQL injection.
|
|
201
318
|
*/
|
|
202
319
|
sql.raw = (raw) => ({ type: "RawSql", sql: raw });
|
|
320
|
+
/** Tagged template that creates a {@link SqliteQuery} with `prepare: true`. */
|
|
203
321
|
sql.prepared = (strings, ...parameters) => {
|
|
204
322
|
const query = sql(strings, ...parameters);
|
|
205
323
|
return { ...query, options: { prepare: true } };
|
|
206
324
|
};
|
|
325
|
+
/** Index metadata stored in `sqlite_master` for a {@link Sqlite} database. */
|
|
326
|
+
export const SqliteIndex = /*#__PURE__*/ object({ name: String, sql: String });
|
|
327
|
+
/** {@link Eq} instance for {@link SqliteIndex}. */
|
|
328
|
+
export const eqSqliteIndex = /*#__PURE__*/ createEqObject({
|
|
329
|
+
name: eqString,
|
|
330
|
+
sql: eqString,
|
|
331
|
+
});
|
|
207
332
|
/**
|
|
208
|
-
*
|
|
209
|
-
*
|
|
333
|
+
* Full schema metadata for a {@link Sqlite} database.
|
|
334
|
+
*
|
|
335
|
+
* Includes table-column mappings and user-visible indexes.
|
|
210
336
|
*/
|
|
211
|
-
export const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
337
|
+
export const SqliteSchema = /*#__PURE__*/ object({
|
|
338
|
+
tables: /*#__PURE__*/ record(String, /*#__PURE__*/ set(String)),
|
|
339
|
+
indexes: /*#__PURE__*/ array(SqliteIndex),
|
|
340
|
+
});
|
|
341
|
+
/** Get the current SQLite schema by reading SQLite metadata. */
|
|
342
|
+
export const getSqliteSchema = (deps) => ({ excludeIndexNamePrefix, } = {}) => {
|
|
343
|
+
const tables = createRecord();
|
|
344
|
+
const tableAndColumnInfoRows = deps.sqlite.exec(sql `
|
|
345
|
+
select
|
|
346
|
+
sqlite_master.name as tableName,
|
|
347
|
+
table_info.name as columnName
|
|
348
|
+
from
|
|
349
|
+
sqlite_master
|
|
350
|
+
join pragma_table_info(sqlite_master.name) as table_info;
|
|
351
|
+
`);
|
|
352
|
+
tableAndColumnInfoRows.rows.forEach(({ tableName, columnName }) => {
|
|
353
|
+
(tables[tableName] ??= new Set()).add(columnName);
|
|
354
|
+
});
|
|
355
|
+
const indexNamePrefixFilter = excludeIndexNamePrefix != null
|
|
356
|
+
? ` and name not like '${excludeIndexNamePrefix.replaceAll("'", "''")}%'`
|
|
357
|
+
: "";
|
|
358
|
+
const indexesRows = deps.sqlite.exec(sql `
|
|
359
|
+
select name, sql
|
|
360
|
+
from sqlite_master
|
|
361
|
+
where
|
|
362
|
+
type = 'index'
|
|
363
|
+
and name not like 'sqlite_%'
|
|
364
|
+
${sql.raw(indexNamePrefixFilter)};
|
|
365
|
+
`);
|
|
366
|
+
const indexes = indexesRows.rows.map((row) => ({
|
|
367
|
+
name: row.name,
|
|
368
|
+
/**
|
|
369
|
+
* SQLite returns "CREATE INDEX" for "create index" for some reason.
|
|
370
|
+
* Other keywords remain unchanged. We have to normalize the casing for
|
|
371
|
+
* schema comparison manually.
|
|
372
|
+
*/
|
|
373
|
+
sql: row.sql
|
|
374
|
+
.replace("CREATE INDEX", "create index")
|
|
375
|
+
.replace("CREATE UNIQUE INDEX", "create unique index"),
|
|
376
|
+
}));
|
|
377
|
+
return { tables, indexes };
|
|
224
378
|
};
|
|
225
|
-
const isSqlMutationCache = createLruCache(PositiveInt.orThrow(10_000));
|
|
226
|
-
const isSqlMutationRegEx = new RegExp(`\\b(${[
|
|
227
|
-
"alter",
|
|
228
|
-
"create",
|
|
229
|
-
"delete",
|
|
230
|
-
"drop",
|
|
231
|
-
"insert",
|
|
232
|
-
"replace",
|
|
233
|
-
"update",
|
|
234
|
-
"begin",
|
|
235
|
-
"commit",
|
|
236
|
-
"rollback",
|
|
237
|
-
"pragma",
|
|
238
|
-
"vacuum",
|
|
239
|
-
].join("|")})\\b`, "i");
|
|
240
379
|
/**
|
|
241
|
-
*
|
|
242
|
-
*
|
|
380
|
+
* Captures a full {@link SqliteSnapshot} for testing and diagnostics.
|
|
381
|
+
*
|
|
382
|
+
* The snapshot includes current {@link SqliteSchema} and all rows from every
|
|
383
|
+
* discovered table. Table order follows `schema.tables` iteration order.
|
|
243
384
|
*/
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
while (i < sql.length && sql[i] !== "\n") {
|
|
256
|
-
i++;
|
|
257
|
-
}
|
|
258
|
-
// Keep the newline if present
|
|
259
|
-
if (i < sql.length && sql[i] === "\n") {
|
|
260
|
-
result += "\n";
|
|
261
|
-
i++;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
result += sql[i];
|
|
266
|
-
i++;
|
|
267
|
-
}
|
|
385
|
+
export const getSqliteSnapshot = (deps) => {
|
|
386
|
+
const schema = getSqliteSchema(deps)();
|
|
387
|
+
const tables = [];
|
|
388
|
+
for (const tableName in schema.tables) {
|
|
389
|
+
const result = deps.sqlite.exec(sql `
|
|
390
|
+
select * from ${sql.identifier(tableName)};
|
|
391
|
+
`);
|
|
392
|
+
tables.push({
|
|
393
|
+
name: tableName,
|
|
394
|
+
rows: result.rows,
|
|
395
|
+
});
|
|
268
396
|
}
|
|
269
|
-
return
|
|
397
|
+
return { schema, tables };
|
|
270
398
|
};
|
|
271
|
-
export const explainSqliteQueryPlan = (deps) => (query) => {
|
|
272
|
-
const result = deps.sqlite.exec({
|
|
273
|
-
...query,
|
|
274
|
-
sql: `EXPLAIN QUERY PLAN ${query.sql}`,
|
|
275
|
-
});
|
|
276
|
-
if (!result.ok)
|
|
277
|
-
return result;
|
|
278
|
-
// eslint-disable-next-line no-console
|
|
279
|
-
console.log("[explainSqliteQueryPlan]", query);
|
|
280
|
-
// eslint-disable-next-line no-console
|
|
281
|
-
console.log(drawSqliteQueryPlan(result.value.rows));
|
|
282
|
-
return ok();
|
|
283
|
-
};
|
|
284
|
-
const drawSqliteQueryPlan = (rows) => rows
|
|
285
|
-
.map((row) => {
|
|
286
|
-
let parentId = row.parent;
|
|
287
|
-
let indent = 0;
|
|
288
|
-
do {
|
|
289
|
-
const parent = rows.find((r) => r.id === parentId);
|
|
290
|
-
if (!parent)
|
|
291
|
-
break;
|
|
292
|
-
parentId = parent.parent;
|
|
293
|
-
indent++;
|
|
294
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition
|
|
295
|
-
} while (true);
|
|
296
|
-
return `${" ".repeat(indent)}${row.detail}`;
|
|
297
|
-
})
|
|
298
|
-
.join("\n");
|
|
299
399
|
/**
|
|
300
400
|
* SQLite represents boolean values using `0` (false) and `1` (true) instead of
|
|
301
401
|
* a dedicated boolean type.
|
|
302
402
|
*
|
|
303
403
|
* See: https://www.sqlite.org/quirks.html#no_separate_boolean_datatype
|
|
304
404
|
*
|
|
305
|
-
*
|
|
405
|
+
* ## Tips
|
|
306
406
|
*
|
|
307
407
|
* - Use {@link sqliteTrue} and {@link sqliteFalse} constants for better
|
|
308
408
|
* readability.
|
|
309
409
|
* - Use {@link booleanToSqliteBoolean} and {@link sqliteBooleanToBoolean} for
|
|
310
410
|
* converting between JavaScript booleans and SQLite boolean values.
|
|
311
411
|
*/
|
|
312
|
-
export const SqliteBoolean = union(0, 1);
|
|
412
|
+
export const SqliteBoolean = /*#__PURE__*/ union(0, 1);
|
|
313
413
|
/**
|
|
314
414
|
* Represents the {@link SqliteBoolean} value for `true`.
|
|
315
415
|
*
|
package/dist/src/Store.d.ts
CHANGED
|
@@ -1,42 +1,50 @@
|
|
|
1
|
-
import { Eq } from "./Eq.js";
|
|
2
|
-
import { Ref } from "./Ref.js";
|
|
3
1
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Observable state container with change notifications.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
7
5
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
import type { Eq } from "./Eq.js";
|
|
7
|
+
import type { Ref } from "./Ref.js";
|
|
8
|
+
/**
|
|
9
|
+
* A store for managing state with change notifications. Like a {@link Ref} with
|
|
10
|
+
* subscriptions.
|
|
11
|
+
*
|
|
12
|
+
* Store is a valid dependency in Evolu's [Dependency
|
|
13
|
+
* Injection](https://evolu.dev/docs/dependency-injection) pattern—use it when
|
|
14
|
+
* functions need shared mutable state with subscriptions.
|
|
15
|
+
*/
|
|
16
|
+
export interface Store<T> extends ReadonlyStore<T>, Ref<T> {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A read-only view of a {@link Store} that provides state access and change
|
|
20
|
+
* notifications without allowing modifications.
|
|
21
|
+
*
|
|
22
|
+
* Use {@link ReadonlyStore} in public APIs where consumers should observe state
|
|
23
|
+
* but not modify it directly.
|
|
24
|
+
*/
|
|
25
|
+
export interface ReadonlyStore<T> extends Disposable {
|
|
14
26
|
/** Returns the current state of the store. */
|
|
15
27
|
readonly get: () => T;
|
|
16
28
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*/
|
|
20
|
-
readonly set: (state: T) => void;
|
|
21
|
-
/**
|
|
22
|
-
* Modifies the store's state by applying a callback function to the current
|
|
23
|
-
* state and notifies listeners if the state changes.
|
|
29
|
+
* Registers a listener to be called on state changes and returns a function
|
|
30
|
+
* to unsubscribe.
|
|
24
31
|
*/
|
|
25
|
-
readonly
|
|
32
|
+
readonly subscribe: (listener: Listener) => Unsubscribe;
|
|
26
33
|
}
|
|
27
|
-
/**
|
|
28
|
-
export type
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
/** Callback used by {@link ReadonlyStore.subscribe} to observe changes. */
|
|
35
|
+
export type Listener = () => void;
|
|
36
|
+
/**
|
|
37
|
+
* Function returned by {@link ReadonlyStore.subscribe} to stop observing
|
|
38
|
+
* changes.
|
|
39
|
+
*/
|
|
40
|
+
export type Unsubscribe = () => void;
|
|
33
41
|
/**
|
|
34
42
|
* Creates a store with the given initial state. The store encapsulates its
|
|
35
|
-
* state, which can be read with `get` and updated with `set` or `
|
|
43
|
+
* state, which can be read with `get` and updated with `set` or `update`. All
|
|
36
44
|
* changes are broadcast to subscribers.
|
|
37
45
|
*
|
|
38
|
-
* By default, state changes are detected using
|
|
39
|
-
*
|
|
46
|
+
* By default, state changes are detected using strict equality (`===`). You can
|
|
47
|
+
* provide a custom equality function as the second argument.
|
|
40
48
|
*/
|
|
41
49
|
export declare const createStore: <T>(initialState: T, eq?: Eq<T>) => Store<T>;
|
|
42
50
|
//# sourceMappingURL=Store.d.ts.map
|