@evolu/common 8.10.0 → 8.12.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/dist/src/Bytes.d.ts +39 -2
- package/dist/src/Bytes.d.ts.map +1 -1
- package/dist/src/Bytes.js +50 -2
- package/dist/src/Config.d.ts +22 -22
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Console.d.ts +62 -7
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +20 -4
- package/dist/src/Crypto.d.ts +76 -4
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +55 -4
- package/dist/src/Error.d.ts +45 -0
- package/dist/src/Error.d.ts.map +1 -1
- package/dist/src/Error.js +69 -0
- package/dist/src/Fs.d.ts +92 -18
- package/dist/src/Fs.d.ts.map +1 -1
- package/dist/src/Fs.js +2 -0
- package/dist/src/Identicon.d.ts +2 -2
- package/dist/src/Identicon.js +2 -2
- package/dist/src/LeakDetector.d.ts +22 -3
- package/dist/src/LeakDetector.d.ts.map +1 -1
- package/dist/src/LeakDetector.js +12 -2
- package/dist/src/LockManager.d.ts +8 -0
- package/dist/src/LockManager.d.ts.map +1 -1
- package/dist/src/LockManager.js +6 -0
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +5 -0
- package/dist/src/Platform.d.ts +47 -7
- package/dist/src/Platform.d.ts.map +1 -1
- package/dist/src/Platform.js +24 -5
- package/dist/src/Random.d.ts +25 -2
- package/dist/src/Random.d.ts.map +1 -1
- package/dist/src/Random.js +14 -2
- package/dist/src/Resource.d.ts +156 -1
- package/dist/src/Resource.d.ts.map +1 -1
- package/dist/src/Resource.js +201 -72
- package/dist/src/Schedule.d.ts +11 -10
- package/dist/src/Schedule.d.ts.map +1 -1
- package/dist/src/Schedule.js +1 -1
- package/dist/src/Sqlite.d.ts +132 -16
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +63 -9
- package/dist/src/Task.d.ts +15 -4
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +41 -15
- package/dist/src/Test.d.ts +9 -0
- package/dist/src/Test.d.ts.map +1 -1
- package/dist/src/Test.js +4 -0
- package/dist/src/Time.d.ts +106 -9
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +55 -4
- package/dist/src/Type.d.ts +1455 -1310
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +1274 -517
- package/dist/src/WebSocket.d.ts +164 -13
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +133 -24
- package/dist/src/Worker.d.ts +90 -8
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +28 -2
- package/dist/src/index.d.ts +6 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -3
- package/dist/src/local-first/Db.d.ts +52 -3
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +412 -137
- package/dist/src/local-first/Evolu.d.ts +412 -213
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +181 -18
- package/dist/src/local-first/Owner.d.ts +13 -30
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Owner.js +13 -30
- package/dist/src/local-first/Protocol.d.ts +106 -19
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +162 -60
- package/dist/src/local-first/Query.d.ts +8 -15
- package/dist/src/local-first/Query.d.ts.map +1 -1
- package/dist/src/local-first/Relay.d.ts.map +1 -1
- package/dist/src/local-first/Relay.js +4 -2
- package/dist/src/local-first/Schema.d.ts +346 -23
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Schema.js +214 -17
- package/dist/src/local-first/Shared.d.ts +537 -22
- package/dist/src/local-first/Shared.d.ts.map +1 -1
- package/dist/src/local-first/Shared.js +1437 -234
- package/dist/src/local-first/Storage.d.ts +195 -17
- package/dist/src/local-first/Storage.d.ts.map +1 -1
- package/dist/src/local-first/Storage.js +85 -22
- package/dist/src/local-first/Timestamp.d.ts +392 -41
- package/dist/src/local-first/Timestamp.d.ts.map +1 -1
- package/dist/src/local-first/Timestamp.js +403 -81
- package/dist/src/local-first/index.d.ts +0 -1
- package/dist/src/local-first/index.d.ts.map +1 -1
- package/dist/src/local-first/index.js +0 -1
- package/package.json +1 -1
- package/src/Assert.test.ts +2 -5
- package/src/Bytes.test.ts +27 -0
- package/src/Bytes.ts +58 -2
- package/src/Config.test.ts +2 -6
- package/src/Config.ts +133 -133
- package/src/Console.ts +62 -7
- package/src/Crypto.ts +76 -4
- package/src/Eq.test.ts +2 -3
- package/src/Error.test.ts +76 -3
- package/src/Error.ts +71 -0
- package/src/Fs.ts +92 -18
- package/src/Identicon.ts +2 -2
- package/src/LeakDetector.ts +22 -3
- package/src/LockManager.ts +8 -0
- package/src/Object.test.ts +27 -12
- package/src/Object.ts +5 -0
- package/src/Platform.ts +50 -8
- package/src/Random.ts +25 -2
- package/src/Resource.test.ts +837 -0
- package/src/Resource.ts +235 -15
- package/src/Schedule.test.ts +50 -12
- package/src/Schedule.ts +24 -14
- package/src/Sqlite.ts +137 -17
- package/src/Task.test.ts +189 -8
- package/src/Task.ts +56 -17
- package/src/Test.ts +9 -0
- package/src/Time.ts +106 -9
- package/src/Type.test.ts +946 -1028
- package/src/Type.ts +4195 -3136
- package/src/Types.test.ts +4 -14
- package/src/WebSocket.ts +313 -40
- package/src/Worker.ts +90 -8
- package/src/index.ts +20 -6
- package/src/local-first/Db.ts +644 -339
- package/src/local-first/Evolu.test.ts +994 -22
- package/src/local-first/Evolu.ts +625 -232
- package/src/local-first/Owner.ts +13 -30
- package/src/local-first/Protocol.test.ts +634 -10
- package/src/local-first/Protocol.ts +255 -109
- package/src/local-first/Query.ts +8 -15
- package/src/local-first/Relay.ts +4 -2
- package/src/local-first/Schema.test.ts +143 -0
- package/src/local-first/Schema.ts +376 -26
- package/src/local-first/Shared.test.ts +7731 -559
- package/src/local-first/Shared.ts +2036 -267
- package/src/local-first/Storage.ts +224 -36
- package/src/local-first/Timestamp.test.ts +344 -70
- package/src/local-first/Timestamp.ts +434 -118
- package/src/local-first/index.ts +0 -1
- package/dist/src/local-first/Error.d.ts +0 -12
- package/dist/src/local-first/Error.d.ts.map +0 -1
- package/dist/src/local-first/Error.js +0 -6
- package/dist/src/local-first/LocalAuth.d.ts +0 -150
- package/dist/src/local-first/LocalAuth.d.ts.map +0 -1
- package/dist/src/local-first/LocalAuth.js +0 -179
- package/src/local-first/Error.ts +0 -17
- package/src/local-first/LocalAuth.ts +0 -457
|
@@ -7,9 +7,177 @@ import * as Kysely from "kysely";
|
|
|
7
7
|
import { assertNonNullable } from "../Assert.js";
|
|
8
8
|
import { getOwnProp, mapObject } from "../Object.js";
|
|
9
9
|
import { eqSqliteIndex, getSqliteSchema, sql, sqliteQueryToSqliteQueryString, SqliteBoolean, SqliteQueryParameters, SqliteValue, } from "../Sqlite.js";
|
|
10
|
-
import { assertType, DateIso, IdBytes, Null, nullOr, object, } from "../Type.js";
|
|
11
|
-
import { OwnerId } from "./Owner.js";
|
|
10
|
+
import { assertType, createIdFromString, DateIso, id, IdBytes, NonEmptyTrimmedString100, Null, nullOr, object, } from "../Type.js";
|
|
11
|
+
import { OwnerEncryptionKey, OwnerId, OwnerSecret, OwnerWriteKey, } from "./Owner.js";
|
|
12
12
|
import { TimestampBytes } from "./Timestamp.js";
|
|
13
|
+
/**
|
|
14
|
+
* Whether a table is local-only: its name starts with an underscore, so its
|
|
15
|
+
* changes are stored without synchronization.
|
|
16
|
+
*
|
|
17
|
+
* @group Core
|
|
18
|
+
*/
|
|
19
|
+
export const isLocalOnlyTable = (table) => table.startsWith("_");
|
|
20
|
+
/**
|
|
21
|
+
* Todo ID Type for {@link testEvoluSchema}.
|
|
22
|
+
*
|
|
23
|
+
* @group Testing
|
|
24
|
+
*/
|
|
25
|
+
export const TestTodoId = /*#__PURE__*/ id("Todo");
|
|
26
|
+
/**
|
|
27
|
+
* Deterministic {@link TestTodoId} for tests and examples.
|
|
28
|
+
*
|
|
29
|
+
* @group Testing
|
|
30
|
+
*/
|
|
31
|
+
export const testTodoId = /*#__PURE__*/ TestTodoId.orThrow(
|
|
32
|
+
/*#__PURE__*/ createIdFromString("testTodo"));
|
|
33
|
+
/**
|
|
34
|
+
* Project ID Type for {@link testEvoluSchema}.
|
|
35
|
+
*
|
|
36
|
+
* @group Testing
|
|
37
|
+
*/
|
|
38
|
+
export const TestProjectId = /*#__PURE__*/ id("Project");
|
|
39
|
+
/**
|
|
40
|
+
* Deterministic {@link TestProjectId} for tests and examples.
|
|
41
|
+
*
|
|
42
|
+
* @group Testing
|
|
43
|
+
*/
|
|
44
|
+
export const testProjectId = /*#__PURE__*/ TestProjectId.orThrow(
|
|
45
|
+
/*#__PURE__*/ createIdFromString("testProject"));
|
|
46
|
+
/**
|
|
47
|
+
* Todo and project schema for tests and examples. A todo can belong to a
|
|
48
|
+
* project or have no project. Use an explicit schema when teaching schema
|
|
49
|
+
* definition.
|
|
50
|
+
*
|
|
51
|
+
* ### Example
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* import {
|
|
55
|
+
* assertOk,
|
|
56
|
+
* testEvoluSchema,
|
|
57
|
+
* testProjectId,
|
|
58
|
+
* testTodoId,
|
|
59
|
+
* } from "@evolu/common";
|
|
60
|
+
*
|
|
61
|
+
* assertOk(testEvoluSchema.todo.id.from(testTodoId), testTodoId);
|
|
62
|
+
* assertOk(
|
|
63
|
+
* testEvoluSchema.todo.projectId.from(testProjectId),
|
|
64
|
+
* testProjectId,
|
|
65
|
+
* );
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @group Testing
|
|
69
|
+
*/
|
|
70
|
+
export const testEvoluSchema = {
|
|
71
|
+
todo: {
|
|
72
|
+
id: TestTodoId,
|
|
73
|
+
title: NonEmptyTrimmedString100,
|
|
74
|
+
isCompleted: /*#__PURE__*/ nullOr(SqliteBoolean),
|
|
75
|
+
projectId: /*#__PURE__*/ nullOr(TestProjectId),
|
|
76
|
+
},
|
|
77
|
+
project: {
|
|
78
|
+
id: TestProjectId,
|
|
79
|
+
name: NonEmptyTrimmedString100,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* App-owner registry schema with local tables for tests and examples.
|
|
84
|
+
*
|
|
85
|
+
* Stores operational keys separately from optional recovery material. A null
|
|
86
|
+
* secret represents an owner whose recovery material is managed elsewhere or
|
|
87
|
+
* unavailable. Names are optional device-local labels; identicons can be
|
|
88
|
+
* derived from the owner identity without an additional column.
|
|
89
|
+
*
|
|
90
|
+
* This fixture does not define the production registry's persistence contract.
|
|
91
|
+
*
|
|
92
|
+
* @group Testing
|
|
93
|
+
*/
|
|
94
|
+
export const testLocalOnlyEvoluSchema = {
|
|
95
|
+
_appOwner: {
|
|
96
|
+
id: OwnerId,
|
|
97
|
+
encryptionKey: OwnerEncryptionKey,
|
|
98
|
+
writeKey: OwnerWriteKey,
|
|
99
|
+
secret: /*#__PURE__*/ nullOr(OwnerSecret),
|
|
100
|
+
name: /*#__PURE__*/ nullOr(NonEmptyTrimmedString100),
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Why a message is stored in `evolu_message_quarantine` instead of being
|
|
105
|
+
* applied to its table. Persisted codes: names may change, but numbers must not
|
|
106
|
+
* be reassigned.
|
|
107
|
+
*
|
|
108
|
+
* Quarantine is queryable state, not an error. An application subscribes to a
|
|
109
|
+
* query over `evolu_message_quarantine` to tell the user what is waiting. Each
|
|
110
|
+
* row is one column of a message, so distinct `ownerId` and `timestamp` pairs
|
|
111
|
+
* count messages. `origin` records whether this database stamped the message
|
|
112
|
+
* for a local mutation or received it from sync, see {@link QuarantineOrigin}.
|
|
113
|
+
* `quarantinedAt` is the system time captured for the request that quarantined
|
|
114
|
+
* the row, in milliseconds; it is null for rows written before Evolu recorded
|
|
115
|
+
* it. The clock-drift rules are described in the Timestamp module.
|
|
116
|
+
*
|
|
117
|
+
* ### Example
|
|
118
|
+
*
|
|
119
|
+
* ```ts
|
|
120
|
+
* import {
|
|
121
|
+
* assertType,
|
|
122
|
+
* createQueryBuilder,
|
|
123
|
+
* type Millis,
|
|
124
|
+
* type OwnerIdBytes,
|
|
125
|
+
* type QuarantineOrigin,
|
|
126
|
+
* QuarantineReason,
|
|
127
|
+
* testEvoluSchema,
|
|
128
|
+
* type TimestampBytes,
|
|
129
|
+
* } from "@evolu/common";
|
|
130
|
+
*
|
|
131
|
+
* const createQuery = createQueryBuilder(testEvoluSchema);
|
|
132
|
+
*
|
|
133
|
+
* // Messages waiting in drift quarantine, one row per message.
|
|
134
|
+
* const driftQuarantineQuery = createQuery((db) =>
|
|
135
|
+
* db
|
|
136
|
+
* .selectFrom("evolu_message_quarantine")
|
|
137
|
+
* .select(["ownerId", "timestamp", "origin", "quarantinedAt"])
|
|
138
|
+
* .where("reason", "=", QuarantineReason.TimestampDrift)
|
|
139
|
+
* .distinct(),
|
|
140
|
+
* );
|
|
141
|
+
*
|
|
142
|
+
* assertType<
|
|
143
|
+
* typeof driftQuarantineQuery.Row,
|
|
144
|
+
* {
|
|
145
|
+
* ownerId: OwnerIdBytes;
|
|
146
|
+
* timestamp: TimestampBytes;
|
|
147
|
+
* origin: QuarantineOrigin;
|
|
148
|
+
* quarantinedAt: Millis | null;
|
|
149
|
+
* }
|
|
150
|
+
* >();
|
|
151
|
+
* ```
|
|
152
|
+
*
|
|
153
|
+
* @group Queries
|
|
154
|
+
*/
|
|
155
|
+
export const QuarantineReason = {
|
|
156
|
+
/**
|
|
157
|
+
* The message has a table or column the current schema does not define. It is
|
|
158
|
+
* applied automatically once a schema update defines them. A received change
|
|
159
|
+
* to a {@link isLocalOnlyTable | local-only} table is also stored here and is
|
|
160
|
+
* never applied.
|
|
161
|
+
*/
|
|
162
|
+
Schema: 0,
|
|
163
|
+
/**
|
|
164
|
+
* The message's timestamp exceeded the drift limit when it was stored. It is
|
|
165
|
+
* applied when the database worker starts, once system time comes within the
|
|
166
|
+
* limit of the timestamp.
|
|
167
|
+
*/
|
|
168
|
+
TimestampDrift: 1,
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Whether a quarantined message was stamped by this database for a local
|
|
172
|
+
* mutation or received from sync. Persisted codes: names may change, but
|
|
173
|
+
* numbers must not be reassigned.
|
|
174
|
+
*
|
|
175
|
+
* @group Queries
|
|
176
|
+
*/
|
|
177
|
+
export const QuarantineOrigin = {
|
|
178
|
+
LocalMutation: 0,
|
|
179
|
+
ReceivedMessage: 1,
|
|
180
|
+
};
|
|
13
181
|
/**
|
|
14
182
|
* System columns that are implicitly defined by Evolu.
|
|
15
183
|
*
|
|
@@ -18,6 +186,8 @@ import { TimestampBytes } from "./Timestamp.js";
|
|
|
18
186
|
* - `isDeleted`: Soft delete flag created by Evolu and used by the developer to
|
|
19
187
|
* mark rows as deleted.
|
|
20
188
|
* - `ownerId`: Represents ownership and logically partitions the database.
|
|
189
|
+
*
|
|
190
|
+
* @group Core
|
|
21
191
|
*/
|
|
22
192
|
export const SystemColumns = /*#__PURE__*/ object({
|
|
23
193
|
createdAt: DateIso,
|
|
@@ -25,12 +195,27 @@ export const SystemColumns = /*#__PURE__*/ object({
|
|
|
25
195
|
isDeleted: /*#__PURE__*/ nullOr(SqliteBoolean),
|
|
26
196
|
ownerId: OwnerId,
|
|
27
197
|
});
|
|
198
|
+
/**
|
|
199
|
+
* Names of {@link SystemColumns}.
|
|
200
|
+
*
|
|
201
|
+
* @group Core
|
|
202
|
+
*/
|
|
28
203
|
export const systemColumns = /*#__PURE__*/ new Set(
|
|
29
204
|
/*#__PURE__*/ Object.keys(SystemColumns.props));
|
|
205
|
+
/**
|
|
206
|
+
* Names of {@link SystemColumns} together with `id`.
|
|
207
|
+
*
|
|
208
|
+
* @group Core
|
|
209
|
+
*/
|
|
30
210
|
export const systemColumnsWithId = [
|
|
31
211
|
...systemColumns,
|
|
32
212
|
"id",
|
|
33
213
|
];
|
|
214
|
+
/**
|
|
215
|
+
* Derives {@link SqliteSchema} tables and indexes from an {@link EvoluSchema}.
|
|
216
|
+
*
|
|
217
|
+
* @group SQLite
|
|
218
|
+
*/
|
|
34
219
|
export const evoluSchemaToSqliteSchema = (schema, indexesConfig) => {
|
|
35
220
|
const validSchema = schema;
|
|
36
221
|
const tables = mapObject(validSchema, (table) => new Set(Object.keys(table).filter((k) => k !== "id")));
|
|
@@ -57,24 +242,14 @@ export const evoluSchemaToSqliteSchema = (schema, indexesConfig) => {
|
|
|
57
242
|
* import {
|
|
58
243
|
* assertType,
|
|
59
244
|
* createQueryBuilder,
|
|
60
|
-
*
|
|
245
|
+
* testEvoluSchema,
|
|
246
|
+
* type TestTodoId,
|
|
61
247
|
* NonEmptyTrimmedString100,
|
|
62
|
-
* nullOr,
|
|
63
248
|
* SqliteBoolean,
|
|
64
249
|
* } from "@evolu/common";
|
|
65
250
|
*
|
|
66
|
-
* const TodoId = id("Todo");
|
|
67
|
-
* type TodoId = typeof TodoId.Output;
|
|
68
|
-
* const Schema = {
|
|
69
|
-
* todo: {
|
|
70
|
-
* id: TodoId,
|
|
71
|
-
* title: NonEmptyTrimmedString100,
|
|
72
|
-
* isCompleted: nullOr(SqliteBoolean),
|
|
73
|
-
* },
|
|
74
|
-
* };
|
|
75
|
-
*
|
|
76
251
|
* // Create one typed builder per schema and reuse it for every query.
|
|
77
|
-
* const createQuery = createQueryBuilder(
|
|
252
|
+
* const createQuery = createQueryBuilder(testEvoluSchema);
|
|
78
253
|
* const todosQuery = createQuery((db) =>
|
|
79
254
|
* db.selectFrom("todo").select(["id", "title", "isCompleted"]),
|
|
80
255
|
* );
|
|
@@ -82,12 +257,14 @@ export const evoluSchemaToSqliteSchema = (schema, indexesConfig) => {
|
|
|
82
257
|
* assertType<
|
|
83
258
|
* typeof todosQuery.Row,
|
|
84
259
|
* {
|
|
85
|
-
* id:
|
|
260
|
+
* id: TestTodoId;
|
|
86
261
|
* title: NonEmptyTrimmedString100 | null;
|
|
87
262
|
* isCompleted: SqliteBoolean | null;
|
|
88
263
|
* }
|
|
89
264
|
* >();
|
|
90
265
|
* ```
|
|
266
|
+
*
|
|
267
|
+
* @group Queries
|
|
91
268
|
*/
|
|
92
269
|
export const createQueryBuilder = (_schema) => {
|
|
93
270
|
const createQuery = (queryCallback, options) => {
|
|
@@ -102,6 +279,12 @@ export const createQueryBuilder = (_schema) => {
|
|
|
102
279
|
};
|
|
103
280
|
return createQuery;
|
|
104
281
|
};
|
|
282
|
+
/**
|
|
283
|
+
* Creates missing tables, columns, and indexes, and drops indexes that the new
|
|
284
|
+
* schema no longer defines.
|
|
285
|
+
*
|
|
286
|
+
* @group SQLite
|
|
287
|
+
*/
|
|
105
288
|
export const ensureSqliteSchema = (deps) => (newSchema, currentSchema) => {
|
|
106
289
|
const queries = [];
|
|
107
290
|
currentSchema ??= getEvoluSqliteSchema(deps)();
|
|
@@ -136,8 +319,22 @@ export const ensureSqliteSchema = (deps) => (newSchema, currentSchema) => {
|
|
|
136
319
|
deps.sqlite.exec(query);
|
|
137
320
|
}
|
|
138
321
|
};
|
|
322
|
+
/**
|
|
323
|
+
* Reads the current application {@link SqliteSchema}, excluding Evolu's internal
|
|
324
|
+
* indexes.
|
|
325
|
+
*
|
|
326
|
+
* @group SQLite
|
|
327
|
+
*/
|
|
139
328
|
export const getEvoluSqliteSchema = (deps) => () => getSqliteSchema(deps)({ excludeIndexNamePrefix: "evolu_" });
|
|
140
|
-
|
|
329
|
+
/**
|
|
330
|
+
* Kysely instance that only compiles queries to SQL. It never executes them;
|
|
331
|
+
* Evolu runs the compiled SQL itself.
|
|
332
|
+
*
|
|
333
|
+
* See [Splitting query building and
|
|
334
|
+
* execution](https://kysely.dev/docs/recipes/splitting-query-building-and-execution).
|
|
335
|
+
*
|
|
336
|
+
* @group Queries
|
|
337
|
+
*/
|
|
141
338
|
export const kysely = /*#__PURE__*/ new Kysely.Kysely({
|
|
142
339
|
dialect: {
|
|
143
340
|
createAdapter: () => new Kysely.SqliteAdapter(),
|