@evolu/common 4.1.0 → 4.1.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/Config.d.ts +20 -18
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Config.js +7 -6
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +21 -21
- package/dist/src/DbWorker.js +8 -8
- package/dist/src/Sqlite.d.ts +1 -0
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +13 -0
- package/package.json +5 -5
- package/src/Config.ts +35 -33
- package/src/Db.ts +30 -28
- package/src/DbWorker.ts +8 -8
- package/src/Sqlite.ts +17 -0
package/dist/src/Config.d.ts
CHANGED
|
@@ -2,24 +2,6 @@ import * as Context from "effect/Context";
|
|
|
2
2
|
import * as Layer from "effect/Layer";
|
|
3
3
|
import { CreateIndexBuilder } from "kysely";
|
|
4
4
|
export interface Config {
|
|
5
|
-
/** Alternate URL to Evolu sync and backup server. */
|
|
6
|
-
readonly syncUrl: string;
|
|
7
|
-
/**
|
|
8
|
-
* Alternate URL to reload browser tabs after {@link Owner} reset or restore.
|
|
9
|
-
* The default value is `/`.
|
|
10
|
-
*/
|
|
11
|
-
readonly reloadUrl: string;
|
|
12
|
-
/**
|
|
13
|
-
* Maximum physical clock drift allowed in ms. The default value is 5 * 60 *
|
|
14
|
-
* 1000 (5 minutes).
|
|
15
|
-
*/
|
|
16
|
-
readonly maxDrift: number;
|
|
17
|
-
/**
|
|
18
|
-
* Evolu application name. For now, this is only useful for localhost
|
|
19
|
-
* development, where we want each application to have its own database. The
|
|
20
|
-
* default value is: "Evolu".
|
|
21
|
-
*/
|
|
22
|
-
readonly name: string;
|
|
23
5
|
/**
|
|
24
6
|
* Use the `indexes` property to define SQLite indexes.
|
|
25
7
|
*
|
|
@@ -37,6 +19,26 @@ export interface Config {
|
|
|
37
19
|
* ];
|
|
38
20
|
*/
|
|
39
21
|
readonly indexes: ReadonlyArray<CreateIndexBuilder<any>>;
|
|
22
|
+
/** Log SQL. */
|
|
23
|
+
readonly logSql: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Alternate URL to reload browser tabs after {@link Owner} reset or restore.
|
|
26
|
+
* The default value is `/`.
|
|
27
|
+
*/
|
|
28
|
+
readonly reloadUrl: string;
|
|
29
|
+
/** Alternate URL for Evolu sync and backup server. */
|
|
30
|
+
readonly syncUrl: string;
|
|
31
|
+
/**
|
|
32
|
+
* Evolu application name. For now, this is only useful for localhost
|
|
33
|
+
* development, where we want each application to have its own database. The
|
|
34
|
+
* default value is: "Evolu".
|
|
35
|
+
*/
|
|
36
|
+
readonly name: string;
|
|
37
|
+
/**
|
|
38
|
+
* Maximum physical clock drift allowed in ms. The default value is 5 * 60 *
|
|
39
|
+
* 1000 (5 minutes).
|
|
40
|
+
*/
|
|
41
|
+
readonly maxDrift: number;
|
|
40
42
|
}
|
|
41
43
|
export declare const Config: Context.Tag<Config, Config>;
|
|
42
44
|
export declare const ConfigLive: (config?: Partial<Config>) => Layer.Layer<Config>;
|
package/dist/src/Config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzD,eAAe;IACf,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,MAAM,6BAAiD,CAAC;AAWrE,eAAO,MAAM,UAAU,YAAa,QAAQ,MAAM,CAAC,KAAG,WAAW,CAAC,MAAM,CACL,CAAC"}
|
package/dist/src/Config.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import * as Context from "effect/Context";
|
|
2
2
|
import * as Layer from "effect/Layer";
|
|
3
3
|
export const Config = Context.GenericTag("@services/Config");
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const defaultConfig = {
|
|
5
|
+
indexes: [],
|
|
6
|
+
logSql: false,
|
|
7
7
|
reloadUrl: "/",
|
|
8
|
+
syncUrl: "https://evolu.world",
|
|
8
9
|
name: "Evolu",
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}));
|
|
10
|
+
maxDrift: 5 * 60 * 1000,
|
|
11
|
+
};
|
|
12
|
+
export const ConfigLive = (config) => Layer.succeed(Config, Config.of({ ...defaultConfig, ...config }));
|
package/dist/src/Db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Db.d.ts","sourceRoot":"","sources":["../../src/Db.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Db.js
CHANGED
|
@@ -147,13 +147,13 @@ const getSchema = Effect.gen(function* (_) {
|
|
|
147
147
|
const tables = yield* _(sqlite.exec({
|
|
148
148
|
// https://til.simonwillison.net/sqlite/list-all-columns-in-a-database
|
|
149
149
|
sql: `
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
150
|
+
select
|
|
151
|
+
sqlite_master.name as tableName,
|
|
152
|
+
table_info.name as columnName
|
|
153
|
+
from
|
|
154
|
+
sqlite_master
|
|
155
|
+
join pragma_table_info(sqlite_master.name) as table_info
|
|
156
|
+
`.trim(),
|
|
157
157
|
}), Effect.map(({ rows }) => {
|
|
158
158
|
const map = new Map();
|
|
159
159
|
rows.forEach((row) => {
|
|
@@ -169,14 +169,15 @@ const getSchema = Effect.gen(function* (_) {
|
|
|
169
169
|
}));
|
|
170
170
|
const indexes = yield* _(sqlite.exec({
|
|
171
171
|
sql: `
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
172
|
+
select
|
|
173
|
+
name, sql
|
|
174
|
+
from
|
|
175
|
+
sqlite_master
|
|
176
|
+
where
|
|
177
|
+
type='index' and
|
|
178
|
+
name not like 'sqlite_%' and
|
|
179
|
+
name not like 'index_evolu_%'
|
|
180
|
+
`.trim(),
|
|
180
181
|
}), Effect.map((result) => ReadonlyArray.map(result.rows, (row) => ({
|
|
181
182
|
name: row.name,
|
|
182
183
|
/**
|
|
@@ -196,17 +197,16 @@ export const ensureSchema = (schema) => Effect.gen(function* (_) {
|
|
|
196
197
|
const currentTable = currentSchema.tables.find((t) => t.name === table.name);
|
|
197
198
|
if (!currentTable) {
|
|
198
199
|
sql.push(`
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
create table ${table.name} (
|
|
201
|
+
"id" text primary key,
|
|
202
|
+
${table.columns
|
|
202
203
|
.filter((c) => c !== "id")
|
|
203
204
|
// "A column with affinity BLOB does not prefer one storage class over another
|
|
204
205
|
// and no attempt is made to coerce data from one storage class into another."
|
|
205
206
|
// https://www.sqlite.org/datatype3.html
|
|
206
207
|
.map((name) => `"${name}" blob`)
|
|
207
208
|
.join(", ")}
|
|
208
|
-
|
|
209
|
-
`);
|
|
209
|
+
);`.trim());
|
|
210
210
|
}
|
|
211
211
|
else {
|
|
212
212
|
ReadonlyArray.differenceWith(String.Equivalence)(table.columns, currentTable.columns).forEach((newColumn) => {
|
|
@@ -224,7 +224,7 @@ export const ensureSchema = (schema) => Effect.gen(function* (_) {
|
|
|
224
224
|
});
|
|
225
225
|
if (sql.length > 0)
|
|
226
226
|
yield* _(sqlite.exec({
|
|
227
|
-
sql: sql.join(""),
|
|
227
|
+
sql: sql.join("\n"),
|
|
228
228
|
}));
|
|
229
229
|
});
|
|
230
230
|
export const dropAllTables = Effect.gen(function* (_) {
|
package/dist/src/DbWorker.js
CHANGED
|
@@ -109,14 +109,14 @@ export const upsertValueIntoTableRowColumn = (message, messages, millis) => Effe
|
|
|
109
109
|
const createdAtOrUpdatedAt = cast(new Date(millis));
|
|
110
110
|
const insert = sqlite.exec({
|
|
111
111
|
sql: `
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
112
|
+
insert into
|
|
113
|
+
"${message.table}" ("id", "${message.column}", "createdAt", "updatedAt")
|
|
114
|
+
values
|
|
115
|
+
(?, ?, ?, ?)
|
|
116
|
+
on conflict do update set
|
|
117
|
+
"${message.column}" = ?,
|
|
118
|
+
"updatedAt" = ?
|
|
119
|
+
`.trim(),
|
|
120
120
|
parameters: [
|
|
121
121
|
message.row,
|
|
122
122
|
message.value,
|
package/dist/src/Sqlite.d.ts
CHANGED
|
@@ -55,5 +55,6 @@ export interface Index {
|
|
|
55
55
|
readonly sql: string;
|
|
56
56
|
}
|
|
57
57
|
export declare const indexEquivalence: Equivalence<Index>;
|
|
58
|
+
export declare const maybeLogSql: (query: SqliteQuery, logSql: boolean) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
58
59
|
export {};
|
|
59
60
|
//# 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":"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"}
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Sqlite.js
CHANGED
|
@@ -71,3 +71,16 @@ export const drawSqliteQueryPlan = (rows) => rows
|
|
|
71
71
|
})
|
|
72
72
|
.join("\n");
|
|
73
73
|
export const indexEquivalence = (self, that) => self.name === that.name && self.sql === that.sql;
|
|
74
|
+
export const maybeLogSql = (query, logSql) => (effect) => {
|
|
75
|
+
if (!logSql)
|
|
76
|
+
return effect;
|
|
77
|
+
return effect.pipe(Effect.tap(() => Effect.log("SQL")),
|
|
78
|
+
// Not using Effect.log because of formating
|
|
79
|
+
Effect.tap(() => {
|
|
80
|
+
// eslint-disable-next-line no-console
|
|
81
|
+
console.log(query.sql);
|
|
82
|
+
if (query.parameters && query.parameters.length > 0)
|
|
83
|
+
// eslint-disable-next-line no-console
|
|
84
|
+
console.log(query.parameters);
|
|
85
|
+
}));
|
|
86
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@evolu/common",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.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",
|
|
@@ -52,11 +52,11 @@
|
|
|
52
52
|
"nanoid": "^5.0.6"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@effect/schema": "^0.64.
|
|
55
|
+
"@effect/schema": "^0.64.10",
|
|
56
56
|
"@protobuf-ts/plugin": "^2.9.4",
|
|
57
57
|
"@protobuf-ts/protoc": "^2.9.4",
|
|
58
58
|
"array-shuffle": "^3.0.0",
|
|
59
|
-
"effect": "2.4.
|
|
59
|
+
"effect": "2.4.10",
|
|
60
60
|
"eslint": "^8.57.0",
|
|
61
61
|
"typescript": "^5.4.3",
|
|
62
62
|
"vitest": "^1.4.0",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"eslint-config-evolu": "1.0.0"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@effect/schema": "^0.64.
|
|
68
|
-
"effect": "2.4.
|
|
67
|
+
"@effect/schema": "^0.64.10",
|
|
68
|
+
"effect": "2.4.10"
|
|
69
69
|
},
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|
package/src/Config.ts
CHANGED
|
@@ -3,28 +3,6 @@ import * as Layer from "effect/Layer";
|
|
|
3
3
|
import { CreateIndexBuilder } from "kysely";
|
|
4
4
|
|
|
5
5
|
export interface Config {
|
|
6
|
-
/** Alternate URL to Evolu sync and backup server. */
|
|
7
|
-
readonly syncUrl: string;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Alternate URL to reload browser tabs after {@link Owner} reset or restore.
|
|
11
|
-
* The default value is `/`.
|
|
12
|
-
*/
|
|
13
|
-
readonly reloadUrl: string;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Maximum physical clock drift allowed in ms. The default value is 5 * 60 *
|
|
17
|
-
* 1000 (5 minutes).
|
|
18
|
-
*/
|
|
19
|
-
readonly maxDrift: number;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Evolu application name. For now, this is only useful for localhost
|
|
23
|
-
* development, where we want each application to have its own database. The
|
|
24
|
-
* default value is: "Evolu".
|
|
25
|
-
*/
|
|
26
|
-
readonly name: string;
|
|
27
|
-
|
|
28
6
|
/**
|
|
29
7
|
* Use the `indexes` property to define SQLite indexes.
|
|
30
8
|
*
|
|
@@ -42,19 +20,43 @@ export interface Config {
|
|
|
42
20
|
* ];
|
|
43
21
|
*/
|
|
44
22
|
readonly indexes: ReadonlyArray<CreateIndexBuilder<any>>;
|
|
23
|
+
|
|
24
|
+
/** Log SQL. */
|
|
25
|
+
readonly logSql: boolean;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Alternate URL to reload browser tabs after {@link Owner} reset or restore.
|
|
29
|
+
* The default value is `/`.
|
|
30
|
+
*/
|
|
31
|
+
readonly reloadUrl: string;
|
|
32
|
+
|
|
33
|
+
/** Alternate URL for Evolu sync and backup server. */
|
|
34
|
+
readonly syncUrl: string;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Evolu application name. For now, this is only useful for localhost
|
|
38
|
+
* development, where we want each application to have its own database. The
|
|
39
|
+
* default value is: "Evolu".
|
|
40
|
+
*/
|
|
41
|
+
readonly name: string;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Maximum physical clock drift allowed in ms. The default value is 5 * 60 *
|
|
45
|
+
* 1000 (5 minutes).
|
|
46
|
+
*/
|
|
47
|
+
readonly maxDrift: number;
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
export const Config = Context.GenericTag<Config>("@services/Config");
|
|
48
51
|
|
|
52
|
+
const defaultConfig: Config = {
|
|
53
|
+
indexes: [],
|
|
54
|
+
logSql: false,
|
|
55
|
+
reloadUrl: "/",
|
|
56
|
+
syncUrl: "https://evolu.world",
|
|
57
|
+
name: "Evolu",
|
|
58
|
+
maxDrift: 5 * 60 * 1000,
|
|
59
|
+
};
|
|
60
|
+
|
|
49
61
|
export const ConfigLive = (config?: Partial<Config>): Layer.Layer<Config> =>
|
|
50
|
-
Layer.succeed(
|
|
51
|
-
Config,
|
|
52
|
-
Config.of({
|
|
53
|
-
syncUrl: "https://evolu.world",
|
|
54
|
-
maxDrift: 5 * 60 * 1000,
|
|
55
|
-
reloadUrl: "/",
|
|
56
|
-
name: "Evolu",
|
|
57
|
-
indexes: [],
|
|
58
|
-
...config,
|
|
59
|
-
}),
|
|
60
|
-
);
|
|
62
|
+
Layer.succeed(Config, Config.of({ ...defaultConfig, ...config }));
|
package/src/Db.ts
CHANGED
|
@@ -363,13 +363,13 @@ const getSchema: Effect.Effect<SqliteSchema, never, Sqlite> = Effect.gen(
|
|
|
363
363
|
sqlite.exec({
|
|
364
364
|
// https://til.simonwillison.net/sqlite/list-all-columns-in-a-database
|
|
365
365
|
sql: `
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
366
|
+
select
|
|
367
|
+
sqlite_master.name as tableName,
|
|
368
|
+
table_info.name as columnName
|
|
369
|
+
from
|
|
370
|
+
sqlite_master
|
|
371
|
+
join pragma_table_info(sqlite_master.name) as table_info
|
|
372
|
+
`.trim(),
|
|
373
373
|
}),
|
|
374
374
|
Effect.map(({ rows }) => {
|
|
375
375
|
const map = new Map<string, string[]>();
|
|
@@ -391,14 +391,15 @@ const getSchema: Effect.Effect<SqliteSchema, never, Sqlite> = Effect.gen(
|
|
|
391
391
|
const indexes = yield* _(
|
|
392
392
|
sqlite.exec({
|
|
393
393
|
sql: `
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
394
|
+
select
|
|
395
|
+
name, sql
|
|
396
|
+
from
|
|
397
|
+
sqlite_master
|
|
398
|
+
where
|
|
399
|
+
type='index' and
|
|
400
|
+
name not like 'sqlite_%' and
|
|
401
|
+
name not like 'index_evolu_%'
|
|
402
|
+
`.trim(),
|
|
402
403
|
}),
|
|
403
404
|
Effect.map((result) =>
|
|
404
405
|
ReadonlyArray.map(
|
|
@@ -434,18 +435,19 @@ export const ensureSchema = (
|
|
|
434
435
|
(t) => t.name === table.name,
|
|
435
436
|
);
|
|
436
437
|
if (!currentTable) {
|
|
437
|
-
sql.push(
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
438
|
+
sql.push(
|
|
439
|
+
`
|
|
440
|
+
create table ${table.name} (
|
|
441
|
+
"id" text primary key,
|
|
442
|
+
${table.columns
|
|
443
|
+
.filter((c) => c !== "id")
|
|
444
|
+
// "A column with affinity BLOB does not prefer one storage class over another
|
|
445
|
+
// and no attempt is made to coerce data from one storage class into another."
|
|
446
|
+
// https://www.sqlite.org/datatype3.html
|
|
447
|
+
.map((name) => `"${name}" blob`)
|
|
448
|
+
.join(", ")}
|
|
449
|
+
);`.trim(),
|
|
450
|
+
);
|
|
449
451
|
} else {
|
|
450
452
|
ReadonlyArray.differenceWith(String.Equivalence)(
|
|
451
453
|
table.columns,
|
|
@@ -480,7 +482,7 @@ export const ensureSchema = (
|
|
|
480
482
|
if (sql.length > 0)
|
|
481
483
|
yield* _(
|
|
482
484
|
sqlite.exec({
|
|
483
|
-
sql: sql.join(""),
|
|
485
|
+
sql: sql.join("\n"),
|
|
484
486
|
}),
|
|
485
487
|
);
|
|
486
488
|
});
|
package/src/DbWorker.ts
CHANGED
|
@@ -326,14 +326,14 @@ export const upsertValueIntoTableRowColumn = (
|
|
|
326
326
|
const createdAtOrUpdatedAt = cast(new Date(millis));
|
|
327
327
|
const insert = sqlite.exec({
|
|
328
328
|
sql: `
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
329
|
+
insert into
|
|
330
|
+
"${message.table}" ("id", "${message.column}", "createdAt", "updatedAt")
|
|
331
|
+
values
|
|
332
|
+
(?, ?, ?, ?)
|
|
333
|
+
on conflict do update set
|
|
334
|
+
"${message.column}" = ?,
|
|
335
|
+
"updatedAt" = ?
|
|
336
|
+
`.trim(),
|
|
337
337
|
parameters: [
|
|
338
338
|
message.row,
|
|
339
339
|
message.value,
|
package/src/Sqlite.ts
CHANGED
|
@@ -154,3 +154,20 @@ export interface Index {
|
|
|
154
154
|
|
|
155
155
|
export const indexEquivalence: Equivalence<Index> = (self, that) =>
|
|
156
156
|
self.name === that.name && self.sql === that.sql;
|
|
157
|
+
|
|
158
|
+
export const maybeLogSql =
|
|
159
|
+
(query: SqliteQuery, logSql: boolean) =>
|
|
160
|
+
<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => {
|
|
161
|
+
if (!logSql) return effect;
|
|
162
|
+
return effect.pipe(
|
|
163
|
+
Effect.tap(() => Effect.log("SQL")),
|
|
164
|
+
// Not using Effect.log because of formating
|
|
165
|
+
Effect.tap(() => {
|
|
166
|
+
// eslint-disable-next-line no-console
|
|
167
|
+
console.log(query.sql);
|
|
168
|
+
if (query.parameters && query.parameters.length > 0)
|
|
169
|
+
// eslint-disable-next-line no-console
|
|
170
|
+
console.log(query.parameters);
|
|
171
|
+
}),
|
|
172
|
+
);
|
|
173
|
+
};
|