@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 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("BEGIN"), () => effect, (_, exit) => Exit.isFailure(exit) ? sqlite.exec("ROLLBACK") : sqlite.exec("END")));
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(`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)));
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(`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("")));
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
- CREATE TABLE ${name} (
151
+ create table ${name} (
152
152
  "id" text primary key,
153
153
  ${columns
154
154
  .filter((c) => c !== "id")
@@ -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];
@@ -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
- parameters: parameters,
34
- }), (query) => serializeQuery(query));
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 = "\nSELECT\n \"id\",\n \"mnemonic\",\n \"encryptionKey\"\nFROM\n \"evolu_owner\"\n";
2
- export declare const createMessageTable = "\nCREATE TABLE\n \"evolu_message\" (\n \"timestamp\" blob PRIMARY KEY,\n \"table\" blob,\n \"row\" blob,\n \"column\" blob,\n \"value\" blob\n );\n";
3
- export declare const createMessageTableIndex = "\nCREATE INDEX \"index_evolu_message\" ON \"evolu_message\" (\n \"table\", \"row\", \"column\", \"timestamp\"\n);\n";
4
- export declare const createOwnerTable = "\nCREATE TABLE\n \"evolu_owner\" (\n \"id\" blob,\n \"mnemonic\" blob,\n \"encryptionKey\" blob,\n \"timestamp\" blob,\n \"merkleTree\" blob\n );\n";
5
- export declare const insertOwner = "\nINSERT INTO\n \"evolu_owner\" (\n \"id\",\n \"mnemonic\",\n \"encryptionKey\",\n \"timestamp\",\n \"merkleTree\"\n )\nVALUES\n (?, ?, ?, ?, ?);\n";
6
- export declare const selectOwnerTimestampAndMerkleTree = "\nSELECT\n \"timestamp\",\n \"merkleTree\"\nFROM\n \"evolu_owner\"\n";
7
- export declare const selectLastTimestampForTableRowColumn = "\nSELECT\n \"timestamp\"\nFROM\n \"evolu_message\"\nWHERE\n \"table\" = ?\n AND \"row\" = ?\n AND \"column\" = ?\nORDER BY\n \"timestamp\" DESC\nLIMIT\n 1\n";
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 = "\nINSERT INTO\n \"evolu_message\" (\"timestamp\", \"table\", \"row\", \"column\", \"value\")\nVALUES\n (?, ?, ?, ?, ?)\nON CONFLICT DO NOTHING\n";
11
- export declare const updateOwnerTimestampAndMerkleTree = "\nUPDATE \"evolu_owner\"\nSET\n \"timestamp\" = ?,\n \"merkleTree\" = ?\n";
12
- export declare const selectMessagesToSync = "\nSELECT\n *\nFROM\n \"evolu_message\"\nWHERE\n \"timestamp\" >= ?\nORDER BY\n \"timestamp\"\n";
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
@@ -1 +1 @@
1
- {"version":3,"file":"Sql.d.ts","sourceRoot":"","sources":["../../src/Sql.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,yFAOvB,CAAC;AAEF,eAAO,MAAM,kBAAkB,yKAS9B,CAAC;AAEF,eAAO,MAAM,uBAAuB,yHAInC,CAAC;AAEF,eAAO,MAAM,gBAAgB,yKAS5B,CAAC;AAEF,eAAO,MAAM,WAAW,0KAWvB,CAAC;AAEF,eAAO,MAAM,iCAAiC,4EAM7C,CAAC;AAEF,eAAO,MAAM,oCAAoC,wKAahD,CAAC;AAEF,eAAO,MAAM,6BAA6B,UACjC,MAAM,UACL,MAAM,KACb,MAQF,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,MAI9C,CAAC;AAEF,eAAO,MAAM,uBAAuB,uJAMnC,CAAC;AAEF,eAAO,MAAM,iCAAiC,gFAK7C,CAAC;AAEF,eAAO,MAAM,oBAAoB,uGAShC,CAAC"}
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
- SELECT
5
+ select
6
6
  "id",
7
7
  "mnemonic",
8
8
  "encryptionKey"
9
- FROM
9
+ from
10
10
  "evolu_owner"
11
- `;
11
+ `.trim();
12
12
  export const createMessageTable = `
13
- CREATE TABLE
13
+ create table
14
14
  "evolu_message" (
15
- "timestamp" blob PRIMARY KEY,
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
- CREATE INDEX "index_evolu_message" ON "evolu_message" (
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
- CREATE TABLE
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
- INSERT INTO
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
- VALUES
46
+ values
47
47
  (?, ?, ?, ?, ?);
48
- `;
48
+ `.trim();
49
49
  export const selectOwnerTimestampAndMerkleTree = `
50
- SELECT
50
+ select
51
51
  "timestamp",
52
52
  "merkleTree"
53
- FROM
53
+ from
54
54
  "evolu_owner"
55
- `;
55
+ `.trim();
56
56
  export const selectLastTimestampForTableRowColumn = `
57
- SELECT
57
+ select
58
58
  "timestamp"
59
- FROM
59
+ from
60
60
  "evolu_message"
61
- WHERE
61
+ where
62
62
  "table" = ?
63
- AND "row" = ?
64
- AND "column" = ?
65
- ORDER BY
66
- "timestamp" DESC
67
- LIMIT
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
- INSERT INTO
71
+ insert into
72
72
  "${table}" ("id", "${column}", "createdAt", "updatedAt")
73
- VALUES
73
+ values
74
74
  (?, ?, ?, ?)
75
- ON CONFLICT DO UPDATE SET
75
+ on conflict do update set
76
76
  "${column}" = ?,
77
77
  "updatedAt" = ?
78
- `;
78
+ `.trim();
79
79
  export const deleteTableRow = (table) => `
80
- DELETE FROM "${table}"
81
- WHERE
80
+ delete from "${table}"
81
+ where
82
82
  "id" = ?;
83
- `;
83
+ `.trim();
84
84
  export const insertIntoMessagesIfNew = `
85
- INSERT INTO
85
+ insert into
86
86
  "evolu_message" ("timestamp", "table", "row", "column", "value")
87
- VALUES
87
+ values
88
88
  (?, ?, ?, ?, ?)
89
- ON CONFLICT DO NOTHING
90
- `;
89
+ on conflict do nothing
90
+ `.trim();
91
91
  export const updateOwnerTimestampAndMerkleTree = `
92
- UPDATE "evolu_owner"
93
- SET
92
+ update "evolu_owner"
93
+ set
94
94
  "timestamp" = ?,
95
95
  "merkleTree" = ?
96
- `;
96
+ `.trim();
97
97
  export const selectMessagesToSync = `
98
- SELECT
98
+ select
99
99
  *
100
- FROM
100
+ from
101
101
  "evolu_message"
102
- WHERE
102
+ where
103
103
  "timestamp" >= ?
104
- ORDER BY
104
+ order by
105
105
  "timestamp"
106
- `;
106
+ `.trim();
@@ -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
@@ -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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evolu/common",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Local-first platform designed for privacy, ease of use, and no vendor lock-in to sync and backup people's lifetime data",
5
5
  "keywords": [
6
6
  "evolu",
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("BEGIN"),
290
+ sqlite.exec("begin"),
291
291
  () => effect,
292
292
  (_, exit) =>
293
- Exit.isFailure(exit) ? sqlite.exec("ROLLBACK") : sqlite.exec("END"),
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(`SELECT "name" FROM "sqlite_schema" WHERE "type" = 'table'`),
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(`PRAGMA table_info (${name})`),
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
- `ALTER TABLE "${name}" ADD COLUMN "${newColumn}" blob;`,
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
- CREATE TABLE ${name} (
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<Kysely.Kysely<QuerySchema<S>>, "selectFrom" | "fn">,
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
- parameters: parameters as SqliteQuery["parameters"],
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
- SELECT
6
+ select
7
7
  "id",
8
8
  "mnemonic",
9
9
  "encryptionKey"
10
- FROM
10
+ from
11
11
  "evolu_owner"
12
- `;
12
+ `.trim();
13
13
 
14
14
  export const createMessageTable = `
15
- CREATE TABLE
15
+ create table
16
16
  "evolu_message" (
17
- "timestamp" blob PRIMARY KEY,
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
- CREATE INDEX "index_evolu_message" ON "evolu_message" (
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
- CREATE TABLE
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
- INSERT INTO
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
- VALUES
51
+ values
52
52
  (?, ?, ?, ?, ?);
53
- `;
53
+ `.trim();
54
54
 
55
55
  export const selectOwnerTimestampAndMerkleTree = `
56
- SELECT
56
+ select
57
57
  "timestamp",
58
58
  "merkleTree"
59
- FROM
59
+ from
60
60
  "evolu_owner"
61
- `;
61
+ `.trim();
62
62
 
63
63
  export const selectLastTimestampForTableRowColumn = `
64
- SELECT
64
+ select
65
65
  "timestamp"
66
- FROM
66
+ from
67
67
  "evolu_message"
68
- WHERE
68
+ where
69
69
  "table" = ?
70
- AND "row" = ?
71
- AND "column" = ?
72
- ORDER BY
73
- "timestamp" DESC
74
- LIMIT
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
- INSERT INTO
81
+ ): string =>
82
+ `
83
+ insert into
83
84
  "${table}" ("id", "${column}", "createdAt", "updatedAt")
84
- VALUES
85
+ values
85
86
  (?, ?, ?, ?)
86
- ON CONFLICT DO UPDATE SET
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
- DELETE FROM "${table}"
93
- WHERE
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
- INSERT INTO
100
+ insert into
99
101
  "evolu_message" ("timestamp", "table", "row", "column", "value")
100
- VALUES
102
+ values
101
103
  (?, ?, ?, ?, ?)
102
- ON CONFLICT DO NOTHING
103
- `;
104
+ on conflict do nothing
105
+ `.trim();
104
106
 
105
107
  export const updateOwnerTimestampAndMerkleTree = `
106
- UPDATE "evolu_owner"
107
- SET
108
+ update "evolu_owner"
109
+ set
108
110
  "timestamp" = ?,
109
111
  "merkleTree" = ?
110
- `;
112
+ `.trim();
111
113
 
112
114
  export const selectMessagesToSync = `
113
- SELECT
115
+ select
114
116
  *
115
- FROM
117
+ from
116
118
  "evolu_message"
117
- WHERE
119
+ where
118
120
  "timestamp" >= ?
119
- ORDER BY
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);