@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.
@@ -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>;
@@ -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,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,MAAM,6BAAiD,CAAC;AAErE,eAAO,MAAM,UAAU,YAAa,QAAQ,MAAM,CAAC,KAAG,WAAW,CAAC,MAAM,CAWrE,CAAC"}
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"}
@@ -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
- export const ConfigLive = (config) => Layer.succeed(Config, Config.of({
5
- syncUrl: "https://evolu.world",
6
- maxDrift: 5 * 60 * 1000,
4
+ const defaultConfig = {
5
+ indexes: [],
6
+ logSql: false,
7
7
  reloadUrl: "/",
8
+ syncUrl: "https://evolu.world",
8
9
  name: "Evolu",
9
- indexes: [],
10
- ...config,
11
- }));
10
+ maxDrift: 5 * 60 * 1000,
11
+ };
12
+ export const ConfigLive = (config) => Layer.succeed(Config, Config.of({ ...defaultConfig, ...config }));
@@ -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
- 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(),
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
- 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_%'`,
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
- create table ${table.name} (
200
- "id" text primary key,
201
- ${table.columns
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* (_) {
@@ -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
- 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(),
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,
@@ -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
@@ -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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"}
@@ -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.0",
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.9",
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.9",
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.9",
68
- "effect": "2.4.9"
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
- 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(),
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
- 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_%'`,
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
- create table ${table.name} (
439
- "id" text primary key,
440
- ${table.columns
441
- .filter((c) => c !== "id")
442
- // "A column with affinity BLOB does not prefer one storage class over another
443
- // and no attempt is made to coerce data from one storage class into another."
444
- // https://www.sqlite.org/datatype3.html
445
- .map((name) => `"${name}" blob`)
446
- .join(", ")}
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
- 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(),
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
+ };