@evolu/common 4.0.0 → 4.0.1
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/Db.js +4 -4
- package/dist/src/Evolu.d.ts +1 -1
- package/dist/src/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu.js +6 -4
- package/dist/src/Sql.d.ts +10 -10
- package/dist/src/Sql.d.ts.map +1 -1
- package/dist/src/Sql.js +44 -44
- package/dist/src/Sqlite.d.ts +1 -0
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +11 -0
- package/package.json +1 -1
- package/src/Db.ts +6 -6
- package/src/Evolu.ts +13 -6
- package/src/Sql.ts +48 -46
- package/src/Sqlite.ts +16 -0
package/dist/src/Db.js
CHANGED
|
@@ -110,7 +110,7 @@ export const schemaToTables = (schema) => pipe(getPropertySignatures(schema), Re
|
|
|
110
110
|
name,
|
|
111
111
|
columns: Object.keys(getPropertySignatures(schema)),
|
|
112
112
|
})));
|
|
113
|
-
export const transaction = (effect) => Effect.flatMap(Sqlite, (sqlite) => Effect.acquireUseRelease(sqlite.exec("
|
|
113
|
+
export const transaction = (effect) => Effect.flatMap(Sqlite, (sqlite) => Effect.acquireUseRelease(sqlite.exec("begin"), () => effect, (_, exit) => Exit.isFailure(exit) ? sqlite.exec("rollback") : sqlite.exec("end")));
|
|
114
114
|
export const SqliteNoSuchTableOrColumnError = S.struct({
|
|
115
115
|
message: S.union(S.string.pipe(S.includes("no such table")), S.string.pipe(S.includes("no such column")), S.string.pipe(S.includes("has no column"))),
|
|
116
116
|
});
|
|
@@ -140,15 +140,15 @@ export const lazyInit = (mnemonic) => Effect.gen(function* (_) {
|
|
|
140
140
|
]));
|
|
141
141
|
return owner;
|
|
142
142
|
});
|
|
143
|
-
const getTables = Sqlite.pipe(Effect.flatMap((sqlite) => sqlite.exec(`
|
|
143
|
+
const getTables = Sqlite.pipe(Effect.flatMap((sqlite) => sqlite.exec(`select "name" from "sqlite_schema" where "type" = 'table'`)), Effect.map((result) => result.rows), Effect.map(ReadonlyArray.map((row) => row.name + "")), Effect.map(ReadonlyArray.filter(Predicate.not(String.startsWith("__")))), Effect.map(ReadonlyArray.dedupeWith(String.Equivalence)));
|
|
144
144
|
const updateTable = ({ name, columns, }) => Effect.gen(function* (_) {
|
|
145
145
|
const sqlite = yield* _(Sqlite);
|
|
146
|
-
const sql = yield* _(sqlite.exec(`
|
|
146
|
+
const sql = yield* _(sqlite.exec(`pragma table_info (${name})`), Effect.map((result) => result.rows), Effect.map(ReadonlyArray.map((row) => row.name)), Effect.map((existingColumns) => ReadonlyArray.differenceWith(String.Equivalence)(existingColumns)(columns)), Effect.map(ReadonlyArray.map((newColumn) => `alter table "${name}" add column "${newColumn}" blob;`)), Effect.map(ReadonlyArray.join("")));
|
|
147
147
|
if (sql)
|
|
148
148
|
yield* _(sqlite.exec(sql));
|
|
149
149
|
});
|
|
150
150
|
const createTable = ({ name, columns, }) => Effect.flatMap(Sqlite, (sqlite) => sqlite.exec(`
|
|
151
|
-
|
|
151
|
+
create table ${name} (
|
|
152
152
|
"id" text primary key,
|
|
153
153
|
${columns
|
|
154
154
|
.filter((c) => c !== "id")
|
package/dist/src/Evolu.d.ts
CHANGED
|
@@ -266,7 +266,7 @@ export interface Evolu<S extends DatabaseSchema = DatabaseSchema> {
|
|
|
266
266
|
}
|
|
267
267
|
export declare const Evolu: Context.Tag<Evolu<DatabaseSchema>, Evolu<DatabaseSchema>>;
|
|
268
268
|
type CreateQuery<S extends DatabaseSchema> = <R extends Row>(queryCallback: QueryCallback<S, R>) => Query<R>;
|
|
269
|
-
type QueryCallback<S extends DatabaseSchema, R extends Row> = (db: Pick<Kysely.Kysely<QuerySchema<S>>, "selectFrom" | "fn">) => Kysely.SelectQueryBuilder<any, any, R>;
|
|
269
|
+
type QueryCallback<S extends DatabaseSchema, R extends Row> = (db: Pick<Kysely.Kysely<QuerySchema<S>>, "selectFrom" | "fn" | "with" | "withRecursive">) => Kysely.SelectQueryBuilder<any, any, R>;
|
|
270
270
|
type QuerySchema<S extends DatabaseSchema> = {
|
|
271
271
|
readonly [Table in keyof S]: NullableExceptForIdAndAutomaticColumns<{
|
|
272
272
|
readonly [Column in keyof S[Table]]: S[Table][Column];
|
package/dist/src/Evolu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../src/Evolu.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../src/Evolu.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu.js
CHANGED
|
@@ -16,6 +16,7 @@ import { applyPatches } from "./Diff.js";
|
|
|
16
16
|
import { makeErrorStore } from "./ErrorStore.js";
|
|
17
17
|
import { OnCompletes, OnCompletesLive } from "./OnCompletes.js";
|
|
18
18
|
import { AppState, FlushSync, PlatformName } from "./Platform.js";
|
|
19
|
+
import { isSqlMutation } from "./Sqlite.js";
|
|
19
20
|
import { makeStore } from "./Store.js";
|
|
20
21
|
export const Evolu = Context.GenericTag("@services/Evolu");
|
|
21
22
|
const kysely = new Kysely.Kysely({
|
|
@@ -28,10 +29,11 @@ const kysely = new Kysely.Kysely({
|
|
|
28
29
|
createQueryCompiler: () => new Kysely.SqliteQueryCompiler(),
|
|
29
30
|
},
|
|
30
31
|
});
|
|
31
|
-
export const makeCreateQuery = () => (queryCallback) => pipe(queryCallback(kysely).compile(), ({ sql, parameters }) =>
|
|
32
|
-
sql
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
export const makeCreateQuery = () => (queryCallback) => pipe(queryCallback(kysely).compile(), ({ sql, parameters }) => {
|
|
33
|
+
if (isSqlMutation(sql))
|
|
34
|
+
throw new Error("SQL mutation (INSERT, UPDATE, DELETE, etc.) isn't allowed in the Evolu `createQuery` function. Kysely suggests it because there is no read-only Kysely yet, and removing such an API is not possible. For mutations, use Evolu mutation API.");
|
|
35
|
+
return { sql, parameters: parameters };
|
|
36
|
+
}, (query) => serializeQuery(query));
|
|
35
37
|
export const LoadingPromises = Context.GenericTag("@services/LoadingPromises");
|
|
36
38
|
export const LoadingPromiseLive = Layer.effect(LoadingPromises, Effect.gen(function* (_) {
|
|
37
39
|
const subscribedQueries = yield* _(SubscribedQueries);
|
package/dist/src/Sql.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export declare const selectOwner
|
|
2
|
-
export declare const createMessageTable
|
|
3
|
-
export declare const createMessageTableIndex
|
|
4
|
-
export declare const createOwnerTable
|
|
5
|
-
export declare const insertOwner
|
|
6
|
-
export declare const selectOwnerTimestampAndMerkleTree
|
|
7
|
-
export declare const selectLastTimestampForTableRowColumn
|
|
1
|
+
export declare const selectOwner: string;
|
|
2
|
+
export declare const createMessageTable: string;
|
|
3
|
+
export declare const createMessageTableIndex: string;
|
|
4
|
+
export declare const createOwnerTable: string;
|
|
5
|
+
export declare const insertOwner: string;
|
|
6
|
+
export declare const selectOwnerTimestampAndMerkleTree: string;
|
|
7
|
+
export declare const selectLastTimestampForTableRowColumn: string;
|
|
8
8
|
export declare const upsertValueIntoTableRowColumn: (table: string, column: string) => string;
|
|
9
9
|
export declare const deleteTableRow: (table: string) => string;
|
|
10
|
-
export declare const insertIntoMessagesIfNew
|
|
11
|
-
export declare const updateOwnerTimestampAndMerkleTree
|
|
12
|
-
export declare const selectMessagesToSync
|
|
10
|
+
export declare const insertIntoMessagesIfNew: string;
|
|
11
|
+
export declare const updateOwnerTimestampAndMerkleTree: string;
|
|
12
|
+
export declare const selectMessagesToSync: string;
|
|
13
13
|
//# sourceMappingURL=Sql.d.ts.map
|
package/dist/src/Sql.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sql.d.ts","sourceRoot":"","sources":["../../src/Sql.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"Sql.d.ts","sourceRoot":"","sources":["../../src/Sql.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,QAOhB,CAAC;AAET,eAAO,MAAM,kBAAkB,QASvB,CAAC;AAET,eAAO,MAAM,uBAAuB,QAI5B,CAAC;AAET,eAAO,MAAM,gBAAgB,QASrB,CAAC;AAET,eAAO,MAAM,WAAW,QAWhB,CAAC;AAET,eAAO,MAAM,iCAAiC,QAMtC,CAAC;AAET,eAAO,MAAM,oCAAoC,QAazC,CAAC;AAET,eAAO,MAAM,6BAA6B,UACjC,MAAM,UACL,MAAM,KACb,MASK,CAAC;AAET,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,MAKvC,CAAC;AAET,eAAO,MAAM,uBAAuB,QAM5B,CAAC;AAET,eAAO,MAAM,iCAAiC,QAKtC,CAAC;AAET,eAAO,MAAM,oBAAoB,QASzB,CAAC"}
|
package/dist/src/Sql.js
CHANGED
|
@@ -2,30 +2,30 @@
|
|
|
2
2
|
// The reason for not using Kysely directly is bundle size.
|
|
3
3
|
// [Playground Link](https://kyse.link/?p=b&i=haFkpnNxbGl0ZaF2pjAuMjYuMKFz2gFoaW1wb3J0IHsgR2VuZXJhdGVkIH0gZnJvbSAna3lzZWx5JwoKZGVjbGFyZSBnbG9iYWwgewogIGludGVyZmFjZSBEQiB7CiAgICBldm9sdV9tZXNzYWdlOiB7CiAgICAgIHRpbWVzdGFtcDogc3RyaW5nLAogICAgICB0YWJsZTogc3RyaW5nLAogICAgICByb3c6IHN0cmluZywKICAgICAgY29sdW1uOiBzdHJpbmcsCiAgICAgIHZhbHVlOiB1bmtub3duCiAgICB9LAoKICAgIGV2b2x1X293bmVyOiB7CiAgICAgIGlkOiBzdHJpbmcKICAgICAgbW5lbW9uaWM6IHN0cmluZwogICAgICBlbmNyeXB0aW9uS2V5OiBVaW50OEFycmF5LAogICAgICB0aW1lc3RhbXA6IHN0cmluZywKICAgICAgbWVya2xlVHJlZTogc3RyaW5nCiAgICB9CiAgfQp9oXHaBnhhd2FpdCBreXNlbHkuc2VsZWN0RnJvbSgiZXZvbHVfb3duZXIiKQogIC5zZWxlY3QoWyJpZCIsICJtbmVtb25pYyIsICJlbmNyeXB0aW9uS2V5Il0pCiAgLmV4ZWN1dGUoKQoKYXdhaXQga3lzZWx5LnNjaGVtYQogIC5jcmVhdGVUYWJsZSgnZXZvbHVfbWVzc2FnZScpCiAgLmFkZENvbHVtbigndGltZXN0YW1wJywgJ2Jsb2InLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSkKICAuYWRkQ29sdW1uKCd0YWJsZScsICdibG9iJykKICAuYWRkQ29sdW1uKCdyb3cnLCAnYmxvYicpCiAgLmFkZENvbHVtbignY29sdW1uJywgJ2Jsb2InKQogIC5hZGRDb2x1bW4oJ3ZhbHVlJywgJ2Jsb2InKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zY2hlbWEKICAuY3JlYXRlSW5kZXgoImluZGV4X2V2b2x1X21lc3NhZ2UiKQogIC5vbigiZXZvbHVfbWVzc2FnZSIpCiAgLmNvbHVtbnMoWyJ0YWJsZSIsICJyb3ciLCAiY29sdW1uIiwgInRpbWVzdGFtcCJdKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zY2hlbWEKICAuY3JlYXRlVGFibGUoJ2V2b2x1X19vd25lcicpCiAgLmFkZENvbHVtbignaWQnLCAnYmxvYicpCiAgLmFkZENvbHVtbignbW5lbW9uaWMnLCAnYmxvYicpCiAgLmFkZENvbHVtbignZW5jcnlwdGlvbktleScsICdibG9iJykKICAuYWRkQ29sdW1uKCd0aW1lc3RhbXAnLCAnYmxvYicpCiAgLmFkZENvbHVtbignbWVya2xlVHJlZScsICdibG9iJykKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkuaW5zZXJ0SW50bygiZXZvbHVfb3duZXIiKQogIC52YWx1ZXMoewogICAgImlkIjogImIiLAogICAgIm1uZW1vbmljIjogImEiLAogICAgImVuY3J5cHRpb25LZXkiOiBuZXcgVWludDhBcnJheSgpLAogICAgInRpbWVzdGFtcCI6ICJhIiwKICAgICJtZXJrbGVUcmVlIjogImIiCiAgfSkKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkuc2VsZWN0RnJvbSgiZXZvbHVfb3duZXIiKQogIC5zZWxlY3QoWyJ0aW1lc3RhbXAiLCAibWVya2xlVHJlZSJdKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zZWxlY3RGcm9tKCJldm9sdV9tZXNzYWdlIikKICAuc2VsZWN0KCJ0aW1lc3RhbXAiKQogIC53aGVyZSgndGFibGUnLCAnPScsICcxJykKICAud2hlcmUoJ3JvdycsICc9JywgJzInKQogIC53aGVyZSgnY29sdW1uJywgJz0nLCAnMycpCiAgLm9yZGVyQnkoInRpbWVzdGFtcCIsICJkZXNjIikKICAubGltaXQoMSkKICAuZXhlY3V0ZVRha2VGaXJzdCgpCgphd2FpdCBreXNlbHkuaW5zZXJ0SW50bygiZXZvbHVfbWVzc2FnZSIpCiAgLnZhbHVlcyh7CiAgICAidGltZXN0YW1wIjogJzEnLAogICAgInRhYmxlIjogJzInLAogICAgInJvdyI6ICczJywKICAgICJjb2x1bW4iOiAnNCcsCiAgICAidmFsdWUiOiAnNScsCiAgfSkKICAub25Db25mbGljdChvYyA9PiBvYy5kb05vdGhpbmcoKSkKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkudXBkYXRlVGFibGUoImV2b2x1X293bmVyIikKICAuc2V0KHsKICAgICJtZXJrbGVUcmVlIjogJzEnLAogICAgInRpbWVzdGFtcCI6ICIyIgogIH0pCiAgLmV4ZWN1dGUoKQoKYXdhaXQga3lzZWx5LnNlbGVjdEZyb20oImV2b2x1X21lc3NhZ2UiKQogIC5zZWxlY3RBbGwoKQogIC53aGVyZSgidGltZXN0YW1wIiwgIj49IiwgJzEnKQogIC5vcmRlckJ5KCJ0aW1lc3RhbXAiKQogIC5leGVjdXRlKCmhY8M=)
|
|
4
4
|
export const selectOwner = `
|
|
5
|
-
|
|
5
|
+
select
|
|
6
6
|
"id",
|
|
7
7
|
"mnemonic",
|
|
8
8
|
"encryptionKey"
|
|
9
|
-
|
|
9
|
+
from
|
|
10
10
|
"evolu_owner"
|
|
11
|
-
|
|
11
|
+
`.trim();
|
|
12
12
|
export const createMessageTable = `
|
|
13
|
-
|
|
13
|
+
create table
|
|
14
14
|
"evolu_message" (
|
|
15
|
-
"timestamp" blob
|
|
15
|
+
"timestamp" blob primary key,
|
|
16
16
|
"table" blob,
|
|
17
17
|
"row" blob,
|
|
18
18
|
"column" blob,
|
|
19
19
|
"value" blob
|
|
20
20
|
);
|
|
21
|
-
|
|
21
|
+
`.trim();
|
|
22
22
|
export const createMessageTableIndex = `
|
|
23
|
-
|
|
23
|
+
create index "index_evolu_message" on "evolu_message" (
|
|
24
24
|
"table", "row", "column", "timestamp"
|
|
25
25
|
);
|
|
26
|
-
|
|
26
|
+
`.trim();
|
|
27
27
|
export const createOwnerTable = `
|
|
28
|
-
|
|
28
|
+
create table
|
|
29
29
|
"evolu_owner" (
|
|
30
30
|
"id" blob,
|
|
31
31
|
"mnemonic" blob,
|
|
@@ -33,9 +33,9 @@ CREATE TABLE
|
|
|
33
33
|
"timestamp" blob,
|
|
34
34
|
"merkleTree" blob
|
|
35
35
|
);
|
|
36
|
-
|
|
36
|
+
`.trim();
|
|
37
37
|
export const insertOwner = `
|
|
38
|
-
|
|
38
|
+
insert into
|
|
39
39
|
"evolu_owner" (
|
|
40
40
|
"id",
|
|
41
41
|
"mnemonic",
|
|
@@ -43,64 +43,64 @@ INSERT INTO
|
|
|
43
43
|
"timestamp",
|
|
44
44
|
"merkleTree"
|
|
45
45
|
)
|
|
46
|
-
|
|
46
|
+
values
|
|
47
47
|
(?, ?, ?, ?, ?);
|
|
48
|
-
|
|
48
|
+
`.trim();
|
|
49
49
|
export const selectOwnerTimestampAndMerkleTree = `
|
|
50
|
-
|
|
50
|
+
select
|
|
51
51
|
"timestamp",
|
|
52
52
|
"merkleTree"
|
|
53
|
-
|
|
53
|
+
from
|
|
54
54
|
"evolu_owner"
|
|
55
|
-
|
|
55
|
+
`.trim();
|
|
56
56
|
export const selectLastTimestampForTableRowColumn = `
|
|
57
|
-
|
|
57
|
+
select
|
|
58
58
|
"timestamp"
|
|
59
|
-
|
|
59
|
+
from
|
|
60
60
|
"evolu_message"
|
|
61
|
-
|
|
61
|
+
where
|
|
62
62
|
"table" = ?
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"timestamp"
|
|
67
|
-
|
|
63
|
+
and "row" = ?
|
|
64
|
+
and "column" = ?
|
|
65
|
+
order by
|
|
66
|
+
"timestamp" desc
|
|
67
|
+
limit
|
|
68
68
|
1
|
|
69
|
-
|
|
69
|
+
`.trim();
|
|
70
70
|
export const upsertValueIntoTableRowColumn = (table, column) => `
|
|
71
|
-
|
|
71
|
+
insert into
|
|
72
72
|
"${table}" ("id", "${column}", "createdAt", "updatedAt")
|
|
73
|
-
|
|
73
|
+
values
|
|
74
74
|
(?, ?, ?, ?)
|
|
75
|
-
|
|
75
|
+
on conflict do update set
|
|
76
76
|
"${column}" = ?,
|
|
77
77
|
"updatedAt" = ?
|
|
78
|
-
|
|
78
|
+
`.trim();
|
|
79
79
|
export const deleteTableRow = (table) => `
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
delete from "${table}"
|
|
81
|
+
where
|
|
82
82
|
"id" = ?;
|
|
83
|
-
|
|
83
|
+
`.trim();
|
|
84
84
|
export const insertIntoMessagesIfNew = `
|
|
85
|
-
|
|
85
|
+
insert into
|
|
86
86
|
"evolu_message" ("timestamp", "table", "row", "column", "value")
|
|
87
|
-
|
|
87
|
+
values
|
|
88
88
|
(?, ?, ?, ?, ?)
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
on conflict do nothing
|
|
90
|
+
`.trim();
|
|
91
91
|
export const updateOwnerTimestampAndMerkleTree = `
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
update "evolu_owner"
|
|
93
|
+
set
|
|
94
94
|
"timestamp" = ?,
|
|
95
95
|
"merkleTree" = ?
|
|
96
|
-
|
|
96
|
+
`.trim();
|
|
97
97
|
export const selectMessagesToSync = `
|
|
98
|
-
|
|
98
|
+
select
|
|
99
99
|
*
|
|
100
|
-
|
|
100
|
+
from
|
|
101
101
|
"evolu_message"
|
|
102
|
-
|
|
102
|
+
where
|
|
103
103
|
"timestamp" >= ?
|
|
104
|
-
|
|
104
|
+
order by
|
|
105
105
|
"timestamp"
|
|
106
|
-
|
|
106
|
+
`.trim();
|
package/dist/src/Sqlite.d.ts
CHANGED
|
@@ -28,5 +28,6 @@ export declare const valuesToSqliteValues: (values: ReadonlyArray<Value>) => Sql
|
|
|
28
28
|
export declare const ensureSqliteQuery: (arg: string | SqliteQuery) => SqliteQuery;
|
|
29
29
|
export declare const maybeParseJson: (rows: SqliteRow[]) => SqliteRow[];
|
|
30
30
|
export declare const maybeJson: Predicate.Predicate<string>;
|
|
31
|
+
export declare const isSqlMutation: (sql: string) => boolean;
|
|
31
32
|
export {};
|
|
32
33
|
//# sourceMappingURL=Sqlite.d.ts.map
|
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,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;CAC/E;AAED,eAAO,MAAM,MAAM,6BAAiD,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,iBAAiB,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAAC;AACvD,KAAK,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC1C,KAAK,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AACrC,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACtD,KAAK,IAAI,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEpD,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,UAAU,CACpD,KAAK,EACL,iBAAiB,CAE4D,CAAC;AAEhF,eAAO,MAAM,oBAAoB,WACvB,cAAc,KAAK,CAAC,KAC3B,WAAW,EAGX,CAAC;AAEJ,eAAO,MAAM,iBAAiB,QAAS,MAAM,GAAG,WAAW,KAAG,WAG7D,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,SAAS,EAAE,KAAG,SAAS,EAC1C,CAAC;AA0BnB,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CACpB,CAAC"}
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;CAC/E;AAED,eAAO,MAAM,MAAM,6BAAiD,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,iBAAiB,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAAC;AACvD,KAAK,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC1C,KAAK,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AACrC,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACtD,KAAK,IAAI,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEpD,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,UAAU,CACpD,KAAK,EACL,iBAAiB,CAE4D,CAAC;AAEhF,eAAO,MAAM,oBAAoB,WACvB,cAAc,KAAK,CAAC,KAC3B,WAAW,EAGX,CAAC;AAEJ,eAAO,MAAM,iBAAiB,QAAS,MAAM,GAAG,WAAW,KAAG,WAG7D,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,SAAS,EAAE,KAAG,SAAS,EAC1C,CAAC;AA0BnB,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CACpB,CAAC;AAoB/B,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,OACd,CAAC"}
|
package/dist/src/Sqlite.js
CHANGED
|
@@ -40,3 +40,14 @@ const parseObject = (o) => {
|
|
|
40
40
|
o[key] = parse(o[key]);
|
|
41
41
|
return o;
|
|
42
42
|
};
|
|
43
|
+
/** This is good enough detection because SQL strings in Evolu are predictable. */
|
|
44
|
+
const isSqlMutationRegEx = new RegExp(`\\b(${[
|
|
45
|
+
"alter",
|
|
46
|
+
"create",
|
|
47
|
+
"delete",
|
|
48
|
+
"drop",
|
|
49
|
+
"insert",
|
|
50
|
+
"replace",
|
|
51
|
+
"update",
|
|
52
|
+
].join("|")})\\b`);
|
|
53
|
+
export const isSqlMutation = (sql) => isSqlMutationRegEx.test(sql);
|
package/package.json
CHANGED
package/src/Db.ts
CHANGED
|
@@ -287,10 +287,10 @@ export const transaction = <R, E, A>(
|
|
|
287
287
|
): Effect.Effect<A, E, Sqlite | R> =>
|
|
288
288
|
Effect.flatMap(Sqlite, (sqlite) =>
|
|
289
289
|
Effect.acquireUseRelease(
|
|
290
|
-
sqlite.exec("
|
|
290
|
+
sqlite.exec("begin"),
|
|
291
291
|
() => effect,
|
|
292
292
|
(_, exit) =>
|
|
293
|
-
Exit.isFailure(exit) ? sqlite.exec("
|
|
293
|
+
Exit.isFailure(exit) ? sqlite.exec("rollback") : sqlite.exec("end"),
|
|
294
294
|
),
|
|
295
295
|
);
|
|
296
296
|
|
|
@@ -357,7 +357,7 @@ const getTables: Effect.Effect<
|
|
|
357
357
|
Sqlite
|
|
358
358
|
> = Sqlite.pipe(
|
|
359
359
|
Effect.flatMap((sqlite) =>
|
|
360
|
-
sqlite.exec(`
|
|
360
|
+
sqlite.exec(`select "name" from "sqlite_schema" where "type" = 'table'`),
|
|
361
361
|
),
|
|
362
362
|
Effect.map((result) => result.rows),
|
|
363
363
|
Effect.map(ReadonlyArray.map((row) => (row.name as string) + "")),
|
|
@@ -372,7 +372,7 @@ const updateTable = ({
|
|
|
372
372
|
Effect.gen(function* (_) {
|
|
373
373
|
const sqlite = yield* _(Sqlite);
|
|
374
374
|
const sql = yield* _(
|
|
375
|
-
sqlite.exec(`
|
|
375
|
+
sqlite.exec(`pragma table_info (${name})`),
|
|
376
376
|
Effect.map((result) => result.rows),
|
|
377
377
|
Effect.map(ReadonlyArray.map((row) => row.name as string)),
|
|
378
378
|
Effect.map((existingColumns) =>
|
|
@@ -383,7 +383,7 @@ const updateTable = ({
|
|
|
383
383
|
Effect.map(
|
|
384
384
|
ReadonlyArray.map(
|
|
385
385
|
(newColumn) =>
|
|
386
|
-
`
|
|
386
|
+
`alter table "${name}" add column "${newColumn}" blob;`,
|
|
387
387
|
),
|
|
388
388
|
),
|
|
389
389
|
Effect.map(ReadonlyArray.join("")),
|
|
@@ -397,7 +397,7 @@ const createTable = ({
|
|
|
397
397
|
}: Table): Effect.Effect<void, never, Sqlite> =>
|
|
398
398
|
Effect.flatMap(Sqlite, (sqlite) =>
|
|
399
399
|
sqlite.exec(`
|
|
400
|
-
|
|
400
|
+
create table ${name} (
|
|
401
401
|
"id" text primary key,
|
|
402
402
|
${columns
|
|
403
403
|
.filter((c) => c !== "id")
|
package/src/Evolu.ts
CHANGED
|
@@ -32,7 +32,7 @@ import { SqliteBoolean, SqliteDate } from "./Model.js";
|
|
|
32
32
|
import { OnCompletes, OnCompletesLive } from "./OnCompletes.js";
|
|
33
33
|
import { Owner } from "./Owner.js";
|
|
34
34
|
import { AppState, FlushSync, PlatformName } from "./Platform.js";
|
|
35
|
-
import { SqliteQuery } from "./Sqlite.js";
|
|
35
|
+
import { SqliteQuery, isSqlMutation } from "./Sqlite.js";
|
|
36
36
|
import { Store, Unsubscribe, makeStore } from "./Store.js";
|
|
37
37
|
import { SyncState } from "./SyncWorker.js";
|
|
38
38
|
|
|
@@ -318,7 +318,10 @@ type CreateQuery<S extends DatabaseSchema> = <R extends Row>(
|
|
|
318
318
|
) => Query<R>;
|
|
319
319
|
|
|
320
320
|
type QueryCallback<S extends DatabaseSchema, R extends Row> = (
|
|
321
|
-
db: Pick<
|
|
321
|
+
db: Pick<
|
|
322
|
+
Kysely.Kysely<QuerySchema<S>>,
|
|
323
|
+
"selectFrom" | "fn" | "with" | "withRecursive"
|
|
324
|
+
>,
|
|
322
325
|
) => Kysely.SelectQueryBuilder<any, any, R>;
|
|
323
326
|
|
|
324
327
|
type QuerySchema<S extends DatabaseSchema> = {
|
|
@@ -350,10 +353,14 @@ export const makeCreateQuery =
|
|
|
350
353
|
<R extends Row>(queryCallback: QueryCallback<S, R>) =>
|
|
351
354
|
pipe(
|
|
352
355
|
queryCallback(kysely as Kysely.Kysely<QuerySchema<S>>).compile(),
|
|
353
|
-
({ sql, parameters }): SqliteQuery =>
|
|
354
|
-
sql
|
|
355
|
-
|
|
356
|
-
|
|
356
|
+
({ sql, parameters }): SqliteQuery => {
|
|
357
|
+
if (isSqlMutation(sql))
|
|
358
|
+
throw new Error(
|
|
359
|
+
"SQL mutation (INSERT, UPDATE, DELETE, etc.) isn't allowed in the Evolu `createQuery` function. Kysely suggests it because there is no read-only Kysely yet, and removing such an API is not possible. For mutations, use Evolu mutation API.",
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
return { sql, parameters: parameters as SqliteQuery["parameters"] };
|
|
363
|
+
},
|
|
357
364
|
(query) => serializeQuery<R>(query),
|
|
358
365
|
);
|
|
359
366
|
|
package/src/Sql.ts
CHANGED
|
@@ -3,33 +3,33 @@
|
|
|
3
3
|
// [Playground Link](https://kyse.link/?p=b&i=haFkpnNxbGl0ZaF2pjAuMjYuMKFz2gFoaW1wb3J0IHsgR2VuZXJhdGVkIH0gZnJvbSAna3lzZWx5JwoKZGVjbGFyZSBnbG9iYWwgewogIGludGVyZmFjZSBEQiB7CiAgICBldm9sdV9tZXNzYWdlOiB7CiAgICAgIHRpbWVzdGFtcDogc3RyaW5nLAogICAgICB0YWJsZTogc3RyaW5nLAogICAgICByb3c6IHN0cmluZywKICAgICAgY29sdW1uOiBzdHJpbmcsCiAgICAgIHZhbHVlOiB1bmtub3duCiAgICB9LAoKICAgIGV2b2x1X293bmVyOiB7CiAgICAgIGlkOiBzdHJpbmcKICAgICAgbW5lbW9uaWM6IHN0cmluZwogICAgICBlbmNyeXB0aW9uS2V5OiBVaW50OEFycmF5LAogICAgICB0aW1lc3RhbXA6IHN0cmluZywKICAgICAgbWVya2xlVHJlZTogc3RyaW5nCiAgICB9CiAgfQp9oXHaBnhhd2FpdCBreXNlbHkuc2VsZWN0RnJvbSgiZXZvbHVfb3duZXIiKQogIC5zZWxlY3QoWyJpZCIsICJtbmVtb25pYyIsICJlbmNyeXB0aW9uS2V5Il0pCiAgLmV4ZWN1dGUoKQoKYXdhaXQga3lzZWx5LnNjaGVtYQogIC5jcmVhdGVUYWJsZSgnZXZvbHVfbWVzc2FnZScpCiAgLmFkZENvbHVtbigndGltZXN0YW1wJywgJ2Jsb2InLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSkKICAuYWRkQ29sdW1uKCd0YWJsZScsICdibG9iJykKICAuYWRkQ29sdW1uKCdyb3cnLCAnYmxvYicpCiAgLmFkZENvbHVtbignY29sdW1uJywgJ2Jsb2InKQogIC5hZGRDb2x1bW4oJ3ZhbHVlJywgJ2Jsb2InKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zY2hlbWEKICAuY3JlYXRlSW5kZXgoImluZGV4X2V2b2x1X21lc3NhZ2UiKQogIC5vbigiZXZvbHVfbWVzc2FnZSIpCiAgLmNvbHVtbnMoWyJ0YWJsZSIsICJyb3ciLCAiY29sdW1uIiwgInRpbWVzdGFtcCJdKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zY2hlbWEKICAuY3JlYXRlVGFibGUoJ2V2b2x1X19vd25lcicpCiAgLmFkZENvbHVtbignaWQnLCAnYmxvYicpCiAgLmFkZENvbHVtbignbW5lbW9uaWMnLCAnYmxvYicpCiAgLmFkZENvbHVtbignZW5jcnlwdGlvbktleScsICdibG9iJykKICAuYWRkQ29sdW1uKCd0aW1lc3RhbXAnLCAnYmxvYicpCiAgLmFkZENvbHVtbignbWVya2xlVHJlZScsICdibG9iJykKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkuaW5zZXJ0SW50bygiZXZvbHVfb3duZXIiKQogIC52YWx1ZXMoewogICAgImlkIjogImIiLAogICAgIm1uZW1vbmljIjogImEiLAogICAgImVuY3J5cHRpb25LZXkiOiBuZXcgVWludDhBcnJheSgpLAogICAgInRpbWVzdGFtcCI6ICJhIiwKICAgICJtZXJrbGVUcmVlIjogImIiCiAgfSkKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkuc2VsZWN0RnJvbSgiZXZvbHVfb3duZXIiKQogIC5zZWxlY3QoWyJ0aW1lc3RhbXAiLCAibWVya2xlVHJlZSJdKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zZWxlY3RGcm9tKCJldm9sdV9tZXNzYWdlIikKICAuc2VsZWN0KCJ0aW1lc3RhbXAiKQogIC53aGVyZSgndGFibGUnLCAnPScsICcxJykKICAud2hlcmUoJ3JvdycsICc9JywgJzInKQogIC53aGVyZSgnY29sdW1uJywgJz0nLCAnMycpCiAgLm9yZGVyQnkoInRpbWVzdGFtcCIsICJkZXNjIikKICAubGltaXQoMSkKICAuZXhlY3V0ZVRha2VGaXJzdCgpCgphd2FpdCBreXNlbHkuaW5zZXJ0SW50bygiZXZvbHVfbWVzc2FnZSIpCiAgLnZhbHVlcyh7CiAgICAidGltZXN0YW1wIjogJzEnLAogICAgInRhYmxlIjogJzInLAogICAgInJvdyI6ICczJywKICAgICJjb2x1bW4iOiAnNCcsCiAgICAidmFsdWUiOiAnNScsCiAgfSkKICAub25Db25mbGljdChvYyA9PiBvYy5kb05vdGhpbmcoKSkKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkudXBkYXRlVGFibGUoImV2b2x1X293bmVyIikKICAuc2V0KHsKICAgICJtZXJrbGVUcmVlIjogJzEnLAogICAgInRpbWVzdGFtcCI6ICIyIgogIH0pCiAgLmV4ZWN1dGUoKQoKYXdhaXQga3lzZWx5LnNlbGVjdEZyb20oImV2b2x1X21lc3NhZ2UiKQogIC5zZWxlY3RBbGwoKQogIC53aGVyZSgidGltZXN0YW1wIiwgIj49IiwgJzEnKQogIC5vcmRlckJ5KCJ0aW1lc3RhbXAiKQogIC5leGVjdXRlKCmhY8M=)
|
|
4
4
|
|
|
5
5
|
export const selectOwner = `
|
|
6
|
-
|
|
6
|
+
select
|
|
7
7
|
"id",
|
|
8
8
|
"mnemonic",
|
|
9
9
|
"encryptionKey"
|
|
10
|
-
|
|
10
|
+
from
|
|
11
11
|
"evolu_owner"
|
|
12
|
-
|
|
12
|
+
`.trim();
|
|
13
13
|
|
|
14
14
|
export const createMessageTable = `
|
|
15
|
-
|
|
15
|
+
create table
|
|
16
16
|
"evolu_message" (
|
|
17
|
-
"timestamp" blob
|
|
17
|
+
"timestamp" blob primary key,
|
|
18
18
|
"table" blob,
|
|
19
19
|
"row" blob,
|
|
20
20
|
"column" blob,
|
|
21
21
|
"value" blob
|
|
22
22
|
);
|
|
23
|
-
|
|
23
|
+
`.trim();
|
|
24
24
|
|
|
25
25
|
export const createMessageTableIndex = `
|
|
26
|
-
|
|
26
|
+
create index "index_evolu_message" on "evolu_message" (
|
|
27
27
|
"table", "row", "column", "timestamp"
|
|
28
28
|
);
|
|
29
|
-
|
|
29
|
+
`.trim();
|
|
30
30
|
|
|
31
31
|
export const createOwnerTable = `
|
|
32
|
-
|
|
32
|
+
create table
|
|
33
33
|
"evolu_owner" (
|
|
34
34
|
"id" blob,
|
|
35
35
|
"mnemonic" blob,
|
|
@@ -37,10 +37,10 @@ CREATE TABLE
|
|
|
37
37
|
"timestamp" blob,
|
|
38
38
|
"merkleTree" blob
|
|
39
39
|
);
|
|
40
|
-
|
|
40
|
+
`.trim();
|
|
41
41
|
|
|
42
42
|
export const insertOwner = `
|
|
43
|
-
|
|
43
|
+
insert into
|
|
44
44
|
"evolu_owner" (
|
|
45
45
|
"id",
|
|
46
46
|
"mnemonic",
|
|
@@ -48,74 +48,76 @@ INSERT INTO
|
|
|
48
48
|
"timestamp",
|
|
49
49
|
"merkleTree"
|
|
50
50
|
)
|
|
51
|
-
|
|
51
|
+
values
|
|
52
52
|
(?, ?, ?, ?, ?);
|
|
53
|
-
|
|
53
|
+
`.trim();
|
|
54
54
|
|
|
55
55
|
export const selectOwnerTimestampAndMerkleTree = `
|
|
56
|
-
|
|
56
|
+
select
|
|
57
57
|
"timestamp",
|
|
58
58
|
"merkleTree"
|
|
59
|
-
|
|
59
|
+
from
|
|
60
60
|
"evolu_owner"
|
|
61
|
-
|
|
61
|
+
`.trim();
|
|
62
62
|
|
|
63
63
|
export const selectLastTimestampForTableRowColumn = `
|
|
64
|
-
|
|
64
|
+
select
|
|
65
65
|
"timestamp"
|
|
66
|
-
|
|
66
|
+
from
|
|
67
67
|
"evolu_message"
|
|
68
|
-
|
|
68
|
+
where
|
|
69
69
|
"table" = ?
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
"timestamp"
|
|
74
|
-
|
|
70
|
+
and "row" = ?
|
|
71
|
+
and "column" = ?
|
|
72
|
+
order by
|
|
73
|
+
"timestamp" desc
|
|
74
|
+
limit
|
|
75
75
|
1
|
|
76
|
-
|
|
76
|
+
`.trim();
|
|
77
77
|
|
|
78
78
|
export const upsertValueIntoTableRowColumn = (
|
|
79
79
|
table: string,
|
|
80
80
|
column: string,
|
|
81
|
-
): string =>
|
|
82
|
-
|
|
81
|
+
): string =>
|
|
82
|
+
`
|
|
83
|
+
insert into
|
|
83
84
|
"${table}" ("id", "${column}", "createdAt", "updatedAt")
|
|
84
|
-
|
|
85
|
+
values
|
|
85
86
|
(?, ?, ?, ?)
|
|
86
|
-
|
|
87
|
+
on conflict do update set
|
|
87
88
|
"${column}" = ?,
|
|
88
89
|
"updatedAt" = ?
|
|
89
|
-
|
|
90
|
+
`.trim();
|
|
90
91
|
|
|
91
|
-
export const deleteTableRow = (table: string): string =>
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
export const deleteTableRow = (table: string): string =>
|
|
93
|
+
`
|
|
94
|
+
delete from "${table}"
|
|
95
|
+
where
|
|
94
96
|
"id" = ?;
|
|
95
|
-
|
|
97
|
+
`.trim();
|
|
96
98
|
|
|
97
99
|
export const insertIntoMessagesIfNew = `
|
|
98
|
-
|
|
100
|
+
insert into
|
|
99
101
|
"evolu_message" ("timestamp", "table", "row", "column", "value")
|
|
100
|
-
|
|
102
|
+
values
|
|
101
103
|
(?, ?, ?, ?, ?)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
on conflict do nothing
|
|
105
|
+
`.trim();
|
|
104
106
|
|
|
105
107
|
export const updateOwnerTimestampAndMerkleTree = `
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
update "evolu_owner"
|
|
109
|
+
set
|
|
108
110
|
"timestamp" = ?,
|
|
109
111
|
"merkleTree" = ?
|
|
110
|
-
|
|
112
|
+
`.trim();
|
|
111
113
|
|
|
112
114
|
export const selectMessagesToSync = `
|
|
113
|
-
|
|
115
|
+
select
|
|
114
116
|
*
|
|
115
|
-
|
|
117
|
+
from
|
|
116
118
|
"evolu_message"
|
|
117
|
-
|
|
119
|
+
where
|
|
118
120
|
"timestamp" >= ?
|
|
119
|
-
|
|
121
|
+
order by
|
|
120
122
|
"timestamp"
|
|
121
|
-
|
|
123
|
+
`.trim();
|
package/src/Sqlite.ts
CHANGED
|
@@ -80,3 +80,19 @@ const parseObject = (o: Record<string, unknown>): Record<string, unknown> => {
|
|
|
80
80
|
for (const key in o) o[key] = parse(o[key]);
|
|
81
81
|
return o;
|
|
82
82
|
};
|
|
83
|
+
|
|
84
|
+
/** This is good enough detection because SQL strings in Evolu are predictable. */
|
|
85
|
+
const isSqlMutationRegEx = new RegExp(
|
|
86
|
+
`\\b(${[
|
|
87
|
+
"alter",
|
|
88
|
+
"create",
|
|
89
|
+
"delete",
|
|
90
|
+
"drop",
|
|
91
|
+
"insert",
|
|
92
|
+
"replace",
|
|
93
|
+
"update",
|
|
94
|
+
].join("|")})\\b`,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
export const isSqlMutation = (sql: string): boolean =>
|
|
98
|
+
isSqlMutationRegEx.test(sql);
|