@evolu/common 4.0.4 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/src/Config.d.ts +18 -0
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Config.js +1 -0
- package/dist/src/Crdt.d.ts +4 -4
- package/dist/src/Crdt.d.ts.map +1 -1
- package/dist/src/Crypto.d.ts +2 -2
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Db.d.ts +19 -29
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +111 -34
- package/dist/src/DbWorker.d.ts +3 -4
- package/dist/src/DbWorker.d.ts.map +1 -1
- package/dist/src/DbWorker.js +42 -22
- package/dist/src/Evolu.d.ts +4 -2
- package/dist/src/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu.js +18 -6
- package/dist/src/Model.d.ts +17 -21
- package/dist/src/Model.d.ts.map +1 -1
- package/dist/src/Model.js +2 -5
- package/dist/src/Public.d.ts +2 -0
- package/dist/src/Public.d.ts.map +1 -1
- package/dist/src/Public.js +2 -0
- package/dist/src/Sql.d.ts +11 -12
- package/dist/src/Sql.d.ts.map +1 -1
- package/dist/src/Sql.js +30 -106
- package/dist/src/Sqlite.d.ts +29 -3
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +25 -5
- package/package.json +13 -13
- package/src/Config.ts +20 -0
- package/src/Crdt.ts +2 -2
- package/src/Crypto.ts +1 -1
- package/src/Db.ts +160 -84
- package/src/DbWorker.ts +57 -38
- package/src/Evolu.ts +36 -9
- package/src/Model.ts +10 -14
- package/src/Public.ts +2 -0
- package/src/Sql.ts +41 -123
- package/src/Sqlite.ts +65 -7
package/dist/src/Evolu.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { EvoluError } from "./ErrorStore.js";
|
|
|
10
10
|
import { SqliteBoolean, SqliteDate } from "./Model.js";
|
|
11
11
|
import { Owner } from "./Owner.js";
|
|
12
12
|
import { AppState, FlushSync } from "./Platform.js";
|
|
13
|
+
import { Index, SqliteQueryOptions } from "./Sqlite.js";
|
|
13
14
|
import { Store } from "./Store.js";
|
|
14
15
|
import { SyncState } from "./SyncWorker.js";
|
|
15
16
|
export interface Evolu<S extends DatabaseSchema = DatabaseSchema> {
|
|
@@ -253,7 +254,7 @@ export interface Evolu<S extends DatabaseSchema = DatabaseSchema> {
|
|
|
253
254
|
* Ensure tables and columns defined in {@link DatabaseSchema} exist in the
|
|
254
255
|
* database.
|
|
255
256
|
*/
|
|
256
|
-
readonly ensureSchema: <From, To extends S>(schema: S.Schema<To, From>) => void;
|
|
257
|
+
readonly ensureSchema: <From, To extends S>(schema: S.Schema<To, From>, indexes?: ReadonlyArray<Index>) => void;
|
|
257
258
|
/**
|
|
258
259
|
* Force sync with Evolu Server.
|
|
259
260
|
*
|
|
@@ -264,7 +265,7 @@ export interface Evolu<S extends DatabaseSchema = DatabaseSchema> {
|
|
|
264
265
|
readonly sync: () => void;
|
|
265
266
|
}
|
|
266
267
|
export declare const Evolu: Context.Tag<Evolu<DatabaseSchema>, Evolu<DatabaseSchema>>;
|
|
267
|
-
type CreateQuery<S extends DatabaseSchema> = <R extends Row>(queryCallback: QueryCallback<S, R
|
|
268
|
+
type CreateQuery<S extends DatabaseSchema> = <R extends Row>(queryCallback: QueryCallback<S, R>, options?: SqliteQueryOptions) => Query<R>;
|
|
268
269
|
type QueryCallback<S extends DatabaseSchema, R extends Row> = (db: Pick<Kysely.Kysely<QuerySchema<S>>, "selectFrom" | "fn" | "with" | "withRecursive">) => Kysely.SelectQueryBuilder<any, any, R>;
|
|
269
270
|
type QuerySchema<S extends DatabaseSchema> = {
|
|
270
271
|
readonly [Table in keyof S]: NullableExceptForIdAndAutomaticColumns<{
|
|
@@ -274,6 +275,7 @@ type QuerySchema<S extends DatabaseSchema> = {
|
|
|
274
275
|
type NullableExceptForIdAndAutomaticColumns<T> = {
|
|
275
276
|
readonly [K in keyof T]: K extends "id" | "createdAt" | "updatedAt" ? T[K] : T[K] | null;
|
|
276
277
|
};
|
|
278
|
+
export declare const createIndex: (indexName: string) => Kysely.CreateIndexBuilder<never>;
|
|
277
279
|
export declare const makeCreateQuery: <S extends DatabaseSchema = DatabaseSchema>() => CreateQuery<S>;
|
|
278
280
|
export interface LoadingPromises {
|
|
279
281
|
readonly get: <R extends Row>(query: Query<R>) => {
|
package/dist/src/Evolu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../src/Evolu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAK1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAItC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAwC,MAAM,aAAa,CAAC;AAC7E,OAAO,EACL,cAAc,EACd,OAAO,EACP,KAAK,EACL,WAAW,EACX,+BAA+B,EAC/B,GAAG,EACH,SAAS,EAMV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAmC,MAAM,eAAe,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAkB,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
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,9 +16,10 @@ 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 } from "./Platform.js";
|
|
19
|
-
import { isSqlMutation } from "./Sqlite.js";
|
|
19
|
+
import { isSqlMutation, } from "./Sqlite.js";
|
|
20
20
|
import { makeStore } from "./Store.js";
|
|
21
21
|
export const Evolu = Context.GenericTag("@services/Evolu");
|
|
22
|
+
// https://kysely.dev/docs/recipes/splitting-query-building-and-execution
|
|
22
23
|
const kysely = new Kysely.Kysely({
|
|
23
24
|
dialect: {
|
|
24
25
|
createAdapter: () => new Kysely.SqliteAdapter(),
|
|
@@ -29,10 +30,16 @@ const kysely = new Kysely.Kysely({
|
|
|
29
30
|
createQueryCompiler: () => new Kysely.SqliteQueryCompiler(),
|
|
30
31
|
},
|
|
31
32
|
});
|
|
32
|
-
export const
|
|
33
|
-
|
|
33
|
+
export const createIndex = kysely.schema.createIndex.bind(kysely.schema);
|
|
34
|
+
export const makeCreateQuery = () => (queryCallback, options) => pipe(queryCallback(kysely).compile(), (compiledQuery) => {
|
|
35
|
+
if (isSqlMutation(compiledQuery.sql))
|
|
34
36
|
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
|
-
|
|
37
|
+
const parameters = compiledQuery.parameters;
|
|
38
|
+
return {
|
|
39
|
+
sql: compiledQuery.sql,
|
|
40
|
+
parameters,
|
|
41
|
+
...(options && { options }),
|
|
42
|
+
};
|
|
36
43
|
}, (query) => serializeQuery(query));
|
|
37
44
|
export const LoadingPromises = Context.GenericTag("@services/LoadingPromises");
|
|
38
45
|
export const LoadingPromiseLive = Layer.effect(LoadingPromises, Effect.gen(function* (_) {
|
|
@@ -243,9 +250,10 @@ const EvoluCommon = Layer.effect(Evolu, Effect.gen(function* (_) {
|
|
|
243
250
|
createOrUpdate: mutate,
|
|
244
251
|
resetOwner: () => dbWorker.postMessage({ _tag: "reset" }),
|
|
245
252
|
restoreOwner: (mnemonic) => dbWorker.postMessage({ _tag: "reset", mnemonic }),
|
|
246
|
-
ensureSchema: (schema) => dbWorker.postMessage({
|
|
253
|
+
ensureSchema: (schema, indexes = []) => dbWorker.postMessage({
|
|
247
254
|
_tag: "ensureSchema",
|
|
248
255
|
tables: schemaToTables(schema),
|
|
256
|
+
indexes,
|
|
249
257
|
}),
|
|
250
258
|
sync,
|
|
251
259
|
});
|
|
@@ -264,6 +272,10 @@ export const EvoluCommonLive = EvoluCommon.pipe(Layer.provide(NanoIdGeneratorLiv
|
|
|
264
272
|
export const makeCreateEvolu = (EvoluLive) => (schema, config) => {
|
|
265
273
|
// For https://nextjs.org/docs/architecture/fast-refresh etc.
|
|
266
274
|
const evolu = GlobalValue.globalValue("@evolu/common", () => Evolu.pipe(Effect.provide(EvoluLive), Effect.provide(ConfigLive(config)), Effect.runSync));
|
|
267
|
-
|
|
275
|
+
const indexes = config?.indexes?.map((index) => ({
|
|
276
|
+
name: index.toOperationNode().name.name,
|
|
277
|
+
sql: index.compile().sql,
|
|
278
|
+
}));
|
|
279
|
+
evolu.ensureSchema(schema, indexes);
|
|
268
280
|
return evolu;
|
|
269
281
|
};
|
package/dist/src/Model.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import * as S from "@effect/schema/Schema";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* use {@link id}.
|
|
6
|
-
*/
|
|
7
|
-
export declare const Id: S.BrandSchema<string & Brand.Brand<"Id">, string, never>;
|
|
8
|
-
export type Id = S.Schema.To<typeof Id>;
|
|
2
|
+
/** Branded Id Schema. To create Id Schema for a specific table, use {@link id}. */
|
|
3
|
+
export declare const Id: S.brand<S.Schema<string, string, never>, "Id">;
|
|
4
|
+
export type Id = S.Schema.Type<typeof Id>;
|
|
9
5
|
/**
|
|
10
6
|
* A factory function to create {@link Id} Schema for a specific table.
|
|
11
7
|
*
|
|
@@ -14,23 +10,23 @@ export type Id = S.Schema.To<typeof Id>;
|
|
|
14
10
|
* import { id } from "@evolu/react";
|
|
15
11
|
*
|
|
16
12
|
* const TodoId = id("Todo");
|
|
17
|
-
* type TodoId = S.Schema.
|
|
13
|
+
* type TodoId = S.Schema.Type<typeof TodoId>;
|
|
18
14
|
*/
|
|
19
|
-
export declare const id: <T extends string>(table: T) => S.
|
|
15
|
+
export declare const id: <T extends string>(table: T) => S.brand<S.brand<S.Schema<string, string, never>, "Id">, T>;
|
|
20
16
|
/**
|
|
21
17
|
* SQLite doesn't support the Date type, so Evolu uses SqliteDate instead. Use
|
|
22
18
|
* the {@link cast} helper to cast SqliteDate from Date and back.
|
|
23
19
|
* https://www.sqlite.org/quirks.html#no_separate_datetime_datatype
|
|
24
20
|
*/
|
|
25
|
-
export declare const SqliteDate: S.
|
|
26
|
-
export type SqliteDate = S.Schema.
|
|
21
|
+
export declare const SqliteDate: S.brand<S.Schema<string, string, never>, "SqliteDate">;
|
|
22
|
+
export type SqliteDate = S.Schema.Type<typeof SqliteDate>;
|
|
27
23
|
/**
|
|
28
24
|
* SQLite doesn't support the boolean type, so Evolu uses SqliteBoolean instead.
|
|
29
25
|
* Use the {@link cast} helper to cast SqliteBoolean from boolean and back.
|
|
30
26
|
* https://www.sqlite.org/quirks.html#no_separate_boolean_datatype
|
|
31
27
|
*/
|
|
32
|
-
export declare const SqliteBoolean: S.
|
|
33
|
-
export type SqliteBoolean = S.Schema.
|
|
28
|
+
export declare const SqliteBoolean: S.brand<S.Schema<number, number, never>, "SqliteBoolean">;
|
|
29
|
+
export type SqliteBoolean = S.Schema.Type<typeof SqliteBoolean>;
|
|
34
30
|
/**
|
|
35
31
|
* A helper for casting types not supported by SQLite. SQLite doesn't support
|
|
36
32
|
* Date nor Boolean types, so Evolu emulates them with {@link SqliteBoolean} and
|
|
@@ -55,8 +51,8 @@ export declare function cast(value: SqliteDate): Date;
|
|
|
55
51
|
* not automatically parsed to a JSON object or array when retrieved. Use String
|
|
56
52
|
* schema for all string-based schemas.
|
|
57
53
|
*/
|
|
58
|
-
export declare const String: S.
|
|
59
|
-
export type String = S.Schema.
|
|
54
|
+
export declare const String: S.brand<S.Schema<string, string, never>, "String">;
|
|
55
|
+
export type String = S.Schema.Type<typeof String>;
|
|
60
56
|
/**
|
|
61
57
|
* A string with a maximum length of 1000 characters.
|
|
62
58
|
*
|
|
@@ -66,8 +62,8 @@ export type String = S.Schema.To<typeof String>;
|
|
|
66
62
|
*
|
|
67
63
|
* S.decode(String1000)(value);
|
|
68
64
|
*/
|
|
69
|
-
export declare const String1000: S.
|
|
70
|
-
export type String1000 = S.Schema.
|
|
65
|
+
export declare const String1000: S.brand<S.Schema<string & import("effect/Brand").Brand<"String">, string, never>, "String1000">;
|
|
66
|
+
export type String1000 = S.Schema.Type<typeof String1000>;
|
|
71
67
|
/**
|
|
72
68
|
* A nonempty string with a maximum length of 1000 characters.
|
|
73
69
|
*
|
|
@@ -77,8 +73,8 @@ export type String1000 = S.Schema.To<typeof String1000>;
|
|
|
77
73
|
*
|
|
78
74
|
* S.decode(NonEmptyString1000)(value);
|
|
79
75
|
*/
|
|
80
|
-
export declare const NonEmptyString1000: S.
|
|
81
|
-
export type NonEmptyString1000 = S.Schema.
|
|
76
|
+
export declare const NonEmptyString1000: S.brand<S.Schema<string & import("effect/Brand").Brand<"String">, string, never>, "NonEmptyString1000">;
|
|
77
|
+
export type NonEmptyString1000 = S.Schema.Type<typeof NonEmptyString1000>;
|
|
82
78
|
/**
|
|
83
79
|
* A positive integer.
|
|
84
80
|
*
|
|
@@ -88,6 +84,6 @@ export type NonEmptyString1000 = S.Schema.To<typeof NonEmptyString1000>;
|
|
|
88
84
|
*
|
|
89
85
|
* S.decode(PositiveInt)(value);
|
|
90
86
|
*/
|
|
91
|
-
export declare const PositiveInt: S.
|
|
92
|
-
export type PositiveInt = S.Schema.
|
|
87
|
+
export declare const PositiveInt: S.brand<S.Schema<number, number, never>, "PositiveInt">;
|
|
88
|
+
export type PositiveInt = S.Schema.Type<typeof PositiveInt>;
|
|
93
89
|
//# sourceMappingURL=Model.d.ts.map
|
package/dist/src/Model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/Model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/Model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAG3C,mFAAmF;AACnF,eAAO,MAAM,EAAE,gDAAyD,CAAC;AACzE,MAAM,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAE1C;;;;;;;;;GASG;AACH,eAAO,MAAM,EAAE,4BACN,CAAC,KACP,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CACnC,CAAC;AAE1B;;;;GAIG;AACH,eAAO,MAAM,UAAU,wDAGtB,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,aAAa,2DAIzB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAAC;AACpD,wBAAgB,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;AACpD,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,UAAU,CAAC;AAC9C,wBAAgB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;AAW9C;;;;;GAKG;AACH,eAAO,MAAM,MAAM,oDAclB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,iGAAwD,CAAC;AAChF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,CAAC;AAE1D;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,yGAI9B,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE1E;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,yDAIvB,CAAC;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC"}
|
package/dist/src/Model.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import * as S from "@effect/schema/Schema";
|
|
2
2
|
import { maybeJson } from "./Sqlite.js";
|
|
3
|
-
/**
|
|
4
|
-
* Branded Id Schema for any table Id. To create Id Schema for a specific table,
|
|
5
|
-
* use {@link id}.
|
|
6
|
-
*/
|
|
3
|
+
/** Branded Id Schema. To create Id Schema for a specific table, use {@link id}. */
|
|
7
4
|
export const Id = S.string.pipe(S.pattern(/^[\w-]{21}$/), S.brand("Id"));
|
|
8
5
|
/**
|
|
9
6
|
* A factory function to create {@link Id} Schema for a specific table.
|
|
@@ -13,7 +10,7 @@ export const Id = S.string.pipe(S.pattern(/^[\w-]{21}$/), S.brand("Id"));
|
|
|
13
10
|
* import { id } from "@evolu/react";
|
|
14
11
|
*
|
|
15
12
|
* const TodoId = id("Todo");
|
|
16
|
-
* type TodoId = S.Schema.
|
|
13
|
+
* type TodoId = S.Schema.Type<typeof TodoId>;
|
|
17
14
|
*/
|
|
18
15
|
export const id = (table) => Id.pipe(S.brand(table));
|
|
19
16
|
/**
|
package/dist/src/Public.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { sql } from "kysely";
|
|
1
2
|
export type { NotNull } from "kysely";
|
|
2
3
|
export { jsonArrayFrom, jsonObjectFrom } from "kysely/helpers/sqlite";
|
|
3
4
|
export type { Timestamp, TimestampError } from "./Crdt.js";
|
|
@@ -5,6 +6,7 @@ export type { InvalidMnemonicError, Mnemonic } from "./Crypto.js";
|
|
|
5
6
|
export { database, table } from "./Db.js";
|
|
6
7
|
export type { ExtractRow, QueryResult } from "./Db.js";
|
|
7
8
|
export type { EvoluError, UnexpectedError } from "./ErrorStore.js";
|
|
9
|
+
export { createIndex } from "./Evolu.js";
|
|
8
10
|
export * from "./Model.js";
|
|
9
11
|
export type { Owner, OwnerId } from "./Owner.js";
|
|
10
12
|
export { canUseDom } from "./Platform.js";
|
package/dist/src/Public.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Public.d.ts","sourceRoot":"","sources":["../../src/Public.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"Public.d.ts","sourceRoot":"","sources":["../../src/Public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/src/Public.js
CHANGED
package/dist/src/Sql.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
10
|
-
export declare const
|
|
11
|
-
export declare const
|
|
12
|
-
export declare const selectMessagesToSync: string;
|
|
1
|
+
import { SqliteQuery } from "./Sqlite.js";
|
|
2
|
+
export declare const selectOwner: SqliteQuery;
|
|
3
|
+
export declare const createMessageTable: SqliteQuery;
|
|
4
|
+
export declare const createMessageTableIndex: SqliteQuery;
|
|
5
|
+
export declare const createOwnerTable: SqliteQuery;
|
|
6
|
+
export declare const insertOwner: SqliteQuery;
|
|
7
|
+
export declare const selectOwnerTimestampAndMerkleTree: SqliteQuery;
|
|
8
|
+
export declare const selectLastTimestampForTableRowColumn: SqliteQuery;
|
|
9
|
+
export declare const insertIntoMessagesIfNew: SqliteQuery;
|
|
10
|
+
export declare const updateOwnerTimestampAndMerkleTree: SqliteQuery;
|
|
11
|
+
export declare const selectMessagesToSync: SqliteQuery;
|
|
13
12
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"Sql.d.ts","sourceRoot":"","sources":["../../src/Sql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,eAAO,MAAM,WAAW,EAAE,WAEzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAEhC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,WAErC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAE9B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,WAEzB,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,WAE/C,CAAC;AAEF,eAAO,MAAM,oCAAoC,EAAE,WAElD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,WAErC,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,WAE/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,WAElC,CAAC"}
|
package/dist/src/Sql.js
CHANGED
|
@@ -1,106 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"mnemonic" blob,
|
|
32
|
-
"encryptionKey" blob,
|
|
33
|
-
"timestamp" blob,
|
|
34
|
-
"merkleTree" blob
|
|
35
|
-
);
|
|
36
|
-
`.trim();
|
|
37
|
-
export const insertOwner = `
|
|
38
|
-
insert into
|
|
39
|
-
"evolu_owner" (
|
|
40
|
-
"id",
|
|
41
|
-
"mnemonic",
|
|
42
|
-
"encryptionKey",
|
|
43
|
-
"timestamp",
|
|
44
|
-
"merkleTree"
|
|
45
|
-
)
|
|
46
|
-
values
|
|
47
|
-
(?, ?, ?, ?, ?);
|
|
48
|
-
`.trim();
|
|
49
|
-
export const selectOwnerTimestampAndMerkleTree = `
|
|
50
|
-
select
|
|
51
|
-
"timestamp",
|
|
52
|
-
"merkleTree"
|
|
53
|
-
from
|
|
54
|
-
"evolu_owner"
|
|
55
|
-
`.trim();
|
|
56
|
-
export const selectLastTimestampForTableRowColumn = `
|
|
57
|
-
select
|
|
58
|
-
"timestamp"
|
|
59
|
-
from
|
|
60
|
-
"evolu_message"
|
|
61
|
-
where
|
|
62
|
-
"table" = ?
|
|
63
|
-
and "row" = ?
|
|
64
|
-
and "column" = ?
|
|
65
|
-
order by
|
|
66
|
-
"timestamp" desc
|
|
67
|
-
limit
|
|
68
|
-
1
|
|
69
|
-
`.trim();
|
|
70
|
-
export const upsertValueIntoTableRowColumn = (table, column) => `
|
|
71
|
-
insert into
|
|
72
|
-
"${table}" ("id", "${column}", "createdAt", "updatedAt")
|
|
73
|
-
values
|
|
74
|
-
(?, ?, ?, ?)
|
|
75
|
-
on conflict do update set
|
|
76
|
-
"${column}" = ?,
|
|
77
|
-
"updatedAt" = ?
|
|
78
|
-
`.trim();
|
|
79
|
-
export const deleteTableRow = (table) => `
|
|
80
|
-
delete from "${table}"
|
|
81
|
-
where
|
|
82
|
-
"id" = ?;
|
|
83
|
-
`.trim();
|
|
84
|
-
export const insertIntoMessagesIfNew = `
|
|
85
|
-
insert into
|
|
86
|
-
"evolu_message" ("timestamp", "table", "row", "column", "value")
|
|
87
|
-
values
|
|
88
|
-
(?, ?, ?, ?, ?)
|
|
89
|
-
on conflict do nothing
|
|
90
|
-
`.trim();
|
|
91
|
-
export const updateOwnerTimestampAndMerkleTree = `
|
|
92
|
-
update "evolu_owner"
|
|
93
|
-
set
|
|
94
|
-
"timestamp" = ?,
|
|
95
|
-
"merkleTree" = ?
|
|
96
|
-
`.trim();
|
|
97
|
-
export const selectMessagesToSync = `
|
|
98
|
-
select
|
|
99
|
-
*
|
|
100
|
-
from
|
|
101
|
-
"evolu_message"
|
|
102
|
-
where
|
|
103
|
-
"timestamp" >= ?
|
|
104
|
-
order by
|
|
105
|
-
"timestamp"
|
|
106
|
-
`.trim();
|
|
1
|
+
export const selectOwner = {
|
|
2
|
+
sql: `select "id", "mnemonic", "encryptionKey" from "evolu_owner"`,
|
|
3
|
+
};
|
|
4
|
+
export const createMessageTable = {
|
|
5
|
+
sql: `create table "evolu_message" ("timestamp" blob primary key, "table" blob, "row" blob, "column" blob, "value" blob)`,
|
|
6
|
+
};
|
|
7
|
+
export const createMessageTableIndex = {
|
|
8
|
+
sql: `create index "index_evolu_message" on "evolu_message" ("table", "row", "column", "timestamp" desc)`,
|
|
9
|
+
};
|
|
10
|
+
export const createOwnerTable = {
|
|
11
|
+
sql: `create table "evolu_owner" ("id" blob, "mnemonic" blob, "encryptionKey" blob, "timestamp" blob, "merkleTree" blob)`,
|
|
12
|
+
};
|
|
13
|
+
export const insertOwner = {
|
|
14
|
+
sql: `insert into "evolu_owner" ("id", "mnemonic", "encryptionKey", "timestamp", "merkleTree") values (?, ?, ?, ?, ?)`,
|
|
15
|
+
};
|
|
16
|
+
export const selectOwnerTimestampAndMerkleTree = {
|
|
17
|
+
sql: `select "timestamp", "merkleTree" from "evolu_owner"`,
|
|
18
|
+
};
|
|
19
|
+
export const selectLastTimestampForTableRowColumn = {
|
|
20
|
+
sql: `select "timestamp" from "evolu_message" where "table" = ? and "row" = ? and "column" = ? order by "timestamp" desc limit ?`,
|
|
21
|
+
};
|
|
22
|
+
export const insertIntoMessagesIfNew = {
|
|
23
|
+
sql: `insert into "evolu_message" ("timestamp", "table", "row", "column", "value") values (?, ?, ?, ?, ?) on conflict do nothing`,
|
|
24
|
+
};
|
|
25
|
+
export const updateOwnerTimestampAndMerkleTree = {
|
|
26
|
+
sql: `update "evolu_owner" set "merkleTree" = ?, "timestamp" = ?`,
|
|
27
|
+
};
|
|
28
|
+
export const selectMessagesToSync = {
|
|
29
|
+
sql: `select * from "evolu_message" where "timestamp" >= ? order by "timestamp"`,
|
|
30
|
+
};
|
package/dist/src/Sqlite.d.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import * as Context from "effect/Context";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
+
import { Equivalence } from "effect/Equivalence";
|
|
3
4
|
import * as Predicate from "effect/Predicate";
|
|
4
5
|
export interface Sqlite {
|
|
5
|
-
readonly exec: (
|
|
6
|
+
readonly exec: (query: SqliteQuery) => Effect.Effect<SqliteExecResult>;
|
|
6
7
|
}
|
|
7
8
|
export declare const Sqlite: Context.Tag<Sqlite, Sqlite>;
|
|
8
9
|
export interface SqliteQuery {
|
|
9
10
|
readonly sql: string;
|
|
10
|
-
readonly parameters
|
|
11
|
+
readonly parameters?: Value[];
|
|
12
|
+
readonly options?: SqliteQueryOptions;
|
|
13
|
+
}
|
|
14
|
+
export interface SqliteQueryOptions {
|
|
15
|
+
readonly logQueryExecutionTime?: boolean;
|
|
16
|
+
/** https://www.sqlite.org/eqp.html */
|
|
17
|
+
readonly logExplainQueryPlan?: boolean;
|
|
11
18
|
}
|
|
12
19
|
export type Value = SqliteValue | JsonObjectOrArray;
|
|
13
20
|
export type SqliteValue = null | string | number | Uint8Array;
|
|
@@ -25,9 +32,28 @@ export interface SqliteExecResult {
|
|
|
25
32
|
export type SqliteRow = Record<string, SqliteValue>;
|
|
26
33
|
export declare const isJsonObjectOrArray: Predicate.Refinement<Value, JsonObjectOrArray>;
|
|
27
34
|
export declare const valuesToSqliteValues: (values: ReadonlyArray<Value>) => SqliteValue[];
|
|
28
|
-
export declare const ensureSqliteQuery: (arg: string | SqliteQuery) => SqliteQuery;
|
|
29
35
|
export declare const maybeParseJson: (rows: SqliteRow[]) => SqliteRow[];
|
|
30
36
|
export declare const maybeJson: Predicate.Predicate<string>;
|
|
31
37
|
export declare const isSqlMutation: (sql: string) => boolean;
|
|
38
|
+
export declare const maybeLogSqliteQueryExecutionTime: (query: SqliteQuery) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
39
|
+
export type SqliteQueryPlanRow = {
|
|
40
|
+
id: number;
|
|
41
|
+
parent: number;
|
|
42
|
+
detail: string;
|
|
43
|
+
};
|
|
44
|
+
export declare const drawSqliteQueryPlan: (rows: SqliteQueryPlanRow[]) => string;
|
|
45
|
+
export interface SqliteSchema {
|
|
46
|
+
readonly tables: ReadonlyArray<Table>;
|
|
47
|
+
readonly indexes: ReadonlyArray<Index>;
|
|
48
|
+
}
|
|
49
|
+
export interface Table {
|
|
50
|
+
readonly name: string;
|
|
51
|
+
readonly columns: ReadonlyArray<string>;
|
|
52
|
+
}
|
|
53
|
+
export interface Index {
|
|
54
|
+
readonly name: string;
|
|
55
|
+
readonly sql: string;
|
|
56
|
+
}
|
|
57
|
+
export declare const indexEquivalence: Equivalence<Index>;
|
|
32
58
|
export {};
|
|
33
59
|
//# 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,
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Sqlite.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
2
3
|
import * as Predicate from "effect/Predicate";
|
|
3
4
|
export const Sqlite = Context.GenericTag("@services/Sqlite");
|
|
4
5
|
export const isJsonObjectOrArray = (value) => value !== null && typeof value === "object" && !Predicate.isUint8Array(value);
|
|
5
6
|
export const valuesToSqliteValues = (values) => values.map((value) => isJsonObjectOrArray(value) ? JSON.stringify(value) : value);
|
|
6
|
-
export const ensureSqliteQuery = (arg) => {
|
|
7
|
-
if (typeof arg !== "string")
|
|
8
|
-
return arg;
|
|
9
|
-
return { sql: arg, parameters: [] };
|
|
10
|
-
};
|
|
11
7
|
export const maybeParseJson = (rows) => parseArray(rows);
|
|
12
8
|
const parseArray = (a) => {
|
|
13
9
|
for (let i = 0; i < a.length; ++i)
|
|
@@ -51,3 +47,27 @@ const isSqlMutationRegEx = new RegExp(`\\b(${[
|
|
|
51
47
|
"update",
|
|
52
48
|
].join("|")})\\b`);
|
|
53
49
|
export const isSqlMutation = (sql) => isSqlMutationRegEx.test(sql);
|
|
50
|
+
export const maybeLogSqliteQueryExecutionTime = (query) => (effect) => {
|
|
51
|
+
if (!query.options?.logQueryExecutionTime)
|
|
52
|
+
return effect;
|
|
53
|
+
return effect.pipe(Effect.tap(() => Effect.log("QueryExecutionTime")),
|
|
54
|
+
// Not using Effect.log because of formating
|
|
55
|
+
// eslint-disable-next-line no-console
|
|
56
|
+
Effect.tap(() => console.log(query.sql)), Effect.withLogSpan("duration"));
|
|
57
|
+
};
|
|
58
|
+
export const drawSqliteQueryPlan = (rows) => rows
|
|
59
|
+
.map((row) => {
|
|
60
|
+
let parentId = row.parent;
|
|
61
|
+
let indent = 0;
|
|
62
|
+
do {
|
|
63
|
+
const parent = rows.find((r) => r.id === parentId);
|
|
64
|
+
if (!parent)
|
|
65
|
+
break;
|
|
66
|
+
parentId = parent.parent;
|
|
67
|
+
indent++;
|
|
68
|
+
// eslint-disable-next-line no-constant-condition
|
|
69
|
+
} while (true);
|
|
70
|
+
return `${" ".repeat(indent)}${row.detail}`;
|
|
71
|
+
})
|
|
72
|
+
.join("\n");
|
|
73
|
+
export const indexEquivalence = (self, that) => self.name === that.name && self.sql === that.sql;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@evolu/common",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
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",
|
|
@@ -45,27 +45,27 @@
|
|
|
45
45
|
],
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@noble/ciphers": "^0.5.1",
|
|
48
|
-
"@noble/hashes": "^1.
|
|
49
|
-
"@protobuf-ts/runtime": "^2.9.
|
|
48
|
+
"@noble/hashes": "^1.4.0",
|
|
49
|
+
"@protobuf-ts/runtime": "^2.9.4",
|
|
50
50
|
"@scure/bip39": "^1.2.2",
|
|
51
51
|
"kysely": "^0.27.3",
|
|
52
52
|
"nanoid": "^5.0.6"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@effect/schema": "^0.
|
|
56
|
-
"@protobuf-ts/plugin": "^2.9.
|
|
57
|
-
"@protobuf-ts/protoc": "^2.9.
|
|
55
|
+
"@effect/schema": "^0.64.9",
|
|
56
|
+
"@protobuf-ts/plugin": "^2.9.4",
|
|
57
|
+
"@protobuf-ts/protoc": "^2.9.4",
|
|
58
58
|
"array-shuffle": "^3.0.0",
|
|
59
|
-
"effect": "2.4.
|
|
59
|
+
"effect": "2.4.9",
|
|
60
60
|
"eslint": "^8.57.0",
|
|
61
|
-
"typescript": "^5.4.
|
|
62
|
-
"vitest": "^1.
|
|
63
|
-
"
|
|
64
|
-
"
|
|
61
|
+
"typescript": "^5.4.3",
|
|
62
|
+
"vitest": "^1.4.0",
|
|
63
|
+
"@evolu/tsconfig": "0.0.2",
|
|
64
|
+
"eslint-config-evolu": "1.0.0"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@effect/schema": "^0.
|
|
68
|
-
"effect": "2.4.
|
|
67
|
+
"@effect/schema": "^0.64.9",
|
|
68
|
+
"effect": "2.4.9"
|
|
69
69
|
},
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|