@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.
@@ -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>) => Query<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>) => {
@@ -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":"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;AACpD,OAAO,EACL,KAAK,EAEL,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,EAA0B,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IAC9D;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;IAE/D,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;IAExD;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,EACxD,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KACZ,CAAC,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAE7D;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAEjD;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;IAE1D;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;IAEnD;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;IAE3D;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC;IAEpD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAElC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC,wDAAwD;IACxD,QAAQ,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAEpD;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,EACxC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAC1B,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,KAC3B,IAAI,CAAC;IAEV;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,KAAK,2DAA+C,CAAC;AAElE,KAAK,WAAW,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,CAAC,SAAS,GAAG,EACzD,aAAa,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAClC,OAAO,CAAC,EAAE,kBAAkB,KACzB,KAAK,CAAC,CAAC,CAAC,CAAC;AAEd,KAAK,aAAa,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,SAAS,GAAG,IAAI,CAC5D,EAAE,EAAE,IAAI,CACN,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAC7B,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,eAAe,CAC/C,KACE,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAE5C,KAAK,WAAW,CAAC,CAAC,SAAS,cAAc,IAAI;IAC3C,QAAQ,EAAE,KAAK,IAAI,MAAM,CAAC,GAAG,sCAAsC,CAAC;QAClE,QAAQ,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;KACtD,CAAC;CACH,CAAC;AAEF,KAAK,sCAAsC,CAAC,CAAC,IAAI;IAC/C,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,WAAW,GAAG,WAAW,GAC/D,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;CAChB,CAAC;AAeF,eAAO,MAAM,WAAW,yDAAgD,CAAC;AAEzE,eAAO,MAAM,eAAe,mDACqB,YAAY,CAAC,CAsBzD,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,EAC1B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KACZ;QACH,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;KACzB,CAAC;IAEF,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,GAAG,EAC9B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,KACnB,IAAI,CAAC;IAEV;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,eAAe,+CAE3B,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG;IACpE,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,kBAAkB,wDAwD9B,CAAC;AAYF,KAAK,SAAS,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7E,QAAA,MAAM,SAAS,mCAAuD,CAAC;AAsEvE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,OAAO,CAAC;CAC9C;AAED,eAAO,MAAM,iBAAiB,mDAE7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,kDAkCjC,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,MAAM,CACpE,CAAC,EACD,QAAQ,CACT,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,MAAM,CACpE,CAAC,EACD,QAAQ,CACT,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,MAAM,CAC5E,CAAC,EACD,gBAAgB,CACjB,CAAC;AAEF,MAAM,MAAM,MAAM,CAChB,CAAC,SAAS,cAAc,GAAG,cAAc,EACzC,IAAI,SAAS,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,GAAG,QAAQ,IAC5D,CAAC,CAAC,SAAS,MAAM,CAAC,EACpB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,MAAM,CAAC,QAAQ,CACrB,IAAI,SAAS,QAAQ,GACjB,kBAAkB,CAChB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,CACrE,GACD,IAAI,SAAS,QAAQ,GACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG;IAChE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;CACzB,GACD,kBAAkB,CAChB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,CAC9D,CACR,EACD,UAAU,CAAC,EAAE,MAAM,IAAI,KACpB;IACH,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,MAAM,iFAAiD,CAAC;AAGrE,KAAK,kBAAkB,CACrB,CAAC,EACD,EAAE,SAAS,MAAM,CAAC,GAAG;KAClB,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC9C,CAAC,MAAM,CAAC,CAAC,EACV,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IACvD;KAAG,CAAC,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;CAAE,CAAC;AAE/B;;;;;;GAMG;AACH,KAAK,QAAQ,CAAC,CAAC,IAAI;IACjB,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GAC/C,OAAO,GAAG,aAAa,GACvB,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,aAAa,GAC/B,IAAI,GAAG,OAAO,GAAG,aAAa,GAC9B,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GACrB,IAAI,GAAG,UAAU,GACjB,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,UAAU,GAC5B,IAAI,GAAG,IAAI,GAAG,UAAU,GACxB,CAAC,CAAC,CAAC,CAAC;CACf,CAAC;AA8IF,eAAO,MAAM,eAAe,qFAE3B,CAAC;AAEF;;;;;;;;;GASG;AAEH,eAAO,MAAM,eAAe,cACd,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,+CAEnC,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,WACjB,QAAQ,MAAM,CAAC,KACvB,MAAM,EAAE,CAmBV,CAAC"}
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 makeCreateQuery = () => (queryCallback) => pipe(queryCallback(kysely).compile(), ({ sql, parameters }) => {
33
- if (isSqlMutation(sql))
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
- return { sql, parameters: parameters };
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
- evolu.ensureSchema(schema);
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
  };
@@ -1,11 +1,7 @@
1
1
  import * as S from "@effect/schema/Schema";
2
- import * as Brand from "effect/Brand";
3
- /**
4
- * Branded Id Schema for any table Id. To create Id Schema for a specific table,
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.To<typeof TodoId>;
13
+ * type TodoId = S.Schema.Type<typeof TodoId>;
18
14
  */
19
- export declare const id: <T extends string>(table: T) => S.BrandSchema<string & Brand.Brand<"Id"> & Brand.Brand<T>, string, never>;
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.BrandSchema<string & Brand.Brand<"SqliteDate">, string, never>;
26
- export type SqliteDate = S.Schema.To<typeof SqliteDate>;
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.BrandSchema<number & Brand.Brand<"SqliteBoolean">, number, never>;
33
- export type SqliteBoolean = S.Schema.To<typeof SqliteBoolean>;
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.BrandSchema<string & Brand.Brand<"String">, string, never>;
59
- export type String = S.Schema.To<typeof String>;
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.BrandSchema<string & Brand.Brand<"String"> & Brand.Brand<"String1000">, string, never>;
70
- export type String1000 = S.Schema.To<typeof String1000>;
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.BrandSchema<string & Brand.Brand<"String"> & Brand.Brand<"NonEmptyString1000">, string, never>;
81
- export type NonEmptyString1000 = S.Schema.To<typeof NonEmptyString1000>;
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.BrandSchema<number & Brand.Brand<"PositiveInt">, number, never>;
92
- export type PositiveInt = S.Schema.To<typeof PositiveInt>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/Model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC;;;GAGG;AACH,eAAO,MAAM,EAAE,0DAAyD,CAAC;AACzE,MAAM,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;AAExC;;;;;;;;;GASG;AACH,eAAO,MAAM,EAAE,4BACN,CAAC,KACP,EAAE,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAClD,CAAC;AAE1B;;;;GAIG;AACH,eAAO,MAAM,UAAU,kEAGtB,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,aAAa,qEAIzB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,aAAa,CAAC,CAAC;AAE9D;;;;;;;;;;;;;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,8DAclB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,CAAC;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,0FAAwD,CAAC;AAChF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC;AAExD;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,kGAI9B,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAExE;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,mEAIvB,CAAC;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,WAAW,CAAC,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.To<typeof TodoId>;
13
+ * type TodoId = S.Schema.Type<typeof TodoId>;
17
14
  */
18
15
  export const id = (table) => Id.pipe(S.brand(table));
19
16
  /**
@@ -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";
@@ -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"}
@@ -1,4 +1,6 @@
1
+ export { sql } from "kysely";
1
2
  export { jsonArrayFrom, jsonObjectFrom } from "kysely/helpers/sqlite";
2
3
  export { database, table } from "./Db.js";
4
+ export { createIndex } from "./Evolu.js";
3
5
  export * from "./Model.js";
4
6
  export { canUseDom } from "./Platform.js";
package/dist/src/Sql.d.ts CHANGED
@@ -1,13 +1,12 @@
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
- export declare const upsertValueIntoTableRowColumn: (table: string, column: string) => string;
9
- export declare const deleteTableRow: (table: string) => string;
10
- export declare const insertIntoMessagesIfNew: string;
11
- export declare const updateOwnerTimestampAndMerkleTree: string;
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
@@ -1 +1 @@
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"}
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
- // TODO: This file should be generated from a script via Kysely.
2
- // The reason for not using Kysely directly is bundle size.
3
- // [Playground Link](https://kyse.link/?p=b&i=haFkpnNxbGl0ZaF2pjAuMjYuMKFz2gFoaW1wb3J0IHsgR2VuZXJhdGVkIH0gZnJvbSAna3lzZWx5JwoKZGVjbGFyZSBnbG9iYWwgewogIGludGVyZmFjZSBEQiB7CiAgICBldm9sdV9tZXNzYWdlOiB7CiAgICAgIHRpbWVzdGFtcDogc3RyaW5nLAogICAgICB0YWJsZTogc3RyaW5nLAogICAgICByb3c6IHN0cmluZywKICAgICAgY29sdW1uOiBzdHJpbmcsCiAgICAgIHZhbHVlOiB1bmtub3duCiAgICB9LAoKICAgIGV2b2x1X293bmVyOiB7CiAgICAgIGlkOiBzdHJpbmcKICAgICAgbW5lbW9uaWM6IHN0cmluZwogICAgICBlbmNyeXB0aW9uS2V5OiBVaW50OEFycmF5LAogICAgICB0aW1lc3RhbXA6IHN0cmluZywKICAgICAgbWVya2xlVHJlZTogc3RyaW5nCiAgICB9CiAgfQp9oXHaBnhhd2FpdCBreXNlbHkuc2VsZWN0RnJvbSgiZXZvbHVfb3duZXIiKQogIC5zZWxlY3QoWyJpZCIsICJtbmVtb25pYyIsICJlbmNyeXB0aW9uS2V5Il0pCiAgLmV4ZWN1dGUoKQoKYXdhaXQga3lzZWx5LnNjaGVtYQogIC5jcmVhdGVUYWJsZSgnZXZvbHVfbWVzc2FnZScpCiAgLmFkZENvbHVtbigndGltZXN0YW1wJywgJ2Jsb2InLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSkKICAuYWRkQ29sdW1uKCd0YWJsZScsICdibG9iJykKICAuYWRkQ29sdW1uKCdyb3cnLCAnYmxvYicpCiAgLmFkZENvbHVtbignY29sdW1uJywgJ2Jsb2InKQogIC5hZGRDb2x1bW4oJ3ZhbHVlJywgJ2Jsb2InKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zY2hlbWEKICAuY3JlYXRlSW5kZXgoImluZGV4X2V2b2x1X21lc3NhZ2UiKQogIC5vbigiZXZvbHVfbWVzc2FnZSIpCiAgLmNvbHVtbnMoWyJ0YWJsZSIsICJyb3ciLCAiY29sdW1uIiwgInRpbWVzdGFtcCJdKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zY2hlbWEKICAuY3JlYXRlVGFibGUoJ2V2b2x1X19vd25lcicpCiAgLmFkZENvbHVtbignaWQnLCAnYmxvYicpCiAgLmFkZENvbHVtbignbW5lbW9uaWMnLCAnYmxvYicpCiAgLmFkZENvbHVtbignZW5jcnlwdGlvbktleScsICdibG9iJykKICAuYWRkQ29sdW1uKCd0aW1lc3RhbXAnLCAnYmxvYicpCiAgLmFkZENvbHVtbignbWVya2xlVHJlZScsICdibG9iJykKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkuaW5zZXJ0SW50bygiZXZvbHVfb3duZXIiKQogIC52YWx1ZXMoewogICAgImlkIjogImIiLAogICAgIm1uZW1vbmljIjogImEiLAogICAgImVuY3J5cHRpb25LZXkiOiBuZXcgVWludDhBcnJheSgpLAogICAgInRpbWVzdGFtcCI6ICJhIiwKICAgICJtZXJrbGVUcmVlIjogImIiCiAgfSkKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkuc2VsZWN0RnJvbSgiZXZvbHVfb3duZXIiKQogIC5zZWxlY3QoWyJ0aW1lc3RhbXAiLCAibWVya2xlVHJlZSJdKQogIC5leGVjdXRlKCkKCmF3YWl0IGt5c2VseS5zZWxlY3RGcm9tKCJldm9sdV9tZXNzYWdlIikKICAuc2VsZWN0KCJ0aW1lc3RhbXAiKQogIC53aGVyZSgndGFibGUnLCAnPScsICcxJykKICAud2hlcmUoJ3JvdycsICc9JywgJzInKQogIC53aGVyZSgnY29sdW1uJywgJz0nLCAnMycpCiAgLm9yZGVyQnkoInRpbWVzdGFtcCIsICJkZXNjIikKICAubGltaXQoMSkKICAuZXhlY3V0ZVRha2VGaXJzdCgpCgphd2FpdCBreXNlbHkuaW5zZXJ0SW50bygiZXZvbHVfbWVzc2FnZSIpCiAgLnZhbHVlcyh7CiAgICAidGltZXN0YW1wIjogJzEnLAogICAgInRhYmxlIjogJzInLAogICAgInJvdyI6ICczJywKICAgICJjb2x1bW4iOiAnNCcsCiAgICAidmFsdWUiOiAnNScsCiAgfSkKICAub25Db25mbGljdChvYyA9PiBvYy5kb05vdGhpbmcoKSkKICAuZXhlY3V0ZSgpCgphd2FpdCBreXNlbHkudXBkYXRlVGFibGUoImV2b2x1X293bmVyIikKICAuc2V0KHsKICAgICJtZXJrbGVUcmVlIjogJzEnLAogICAgInRpbWVzdGFtcCI6ICIyIgogIH0pCiAgLmV4ZWN1dGUoKQoKYXdhaXQga3lzZWx5LnNlbGVjdEZyb20oImV2b2x1X21lc3NhZ2UiKQogIC5zZWxlY3RBbGwoKQogIC53aGVyZSgidGltZXN0YW1wIiwgIj49IiwgJzEnKQogIC5vcmRlckJ5KCJ0aW1lc3RhbXAiKQogIC5leGVjdXRlKCmhY8M=)
4
- export const selectOwner = `
5
- select
6
- "id",
7
- "mnemonic",
8
- "encryptionKey"
9
- from
10
- "evolu_owner"
11
- `.trim();
12
- export const createMessageTable = `
13
- create table
14
- "evolu_message" (
15
- "timestamp" blob primary key,
16
- "table" blob,
17
- "row" blob,
18
- "column" blob,
19
- "value" blob
20
- );
21
- `.trim();
22
- export const createMessageTableIndex = `
23
- create index "index_evolu_message" on "evolu_message" (
24
- "table", "row", "column", "timestamp"
25
- );
26
- `.trim();
27
- export const createOwnerTable = `
28
- create table
29
- "evolu_owner" (
30
- "id" blob,
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
+ };
@@ -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: (arg: string | SqliteQuery) => Effect.Effect<SqliteExecResult>;
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: Value[];
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
@@ -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;AAoB/B,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,OACd,CAAC"}
1
+ {"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
@@ -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.4",
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.3.3",
49
- "@protobuf-ts/runtime": "^2.9.3",
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.63.4",
56
- "@protobuf-ts/plugin": "^2.9.3",
57
- "@protobuf-ts/protoc": "^2.9.3",
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.3",
59
+ "effect": "2.4.9",
60
60
  "eslint": "^8.57.0",
61
- "typescript": "^5.4.2",
62
- "vitest": "^1.3.1",
63
- "eslint-config-evolu": "1.0.0",
64
- "@evolu/tsconfig": "0.0.2"
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.63.4",
68
- "effect": "2.4.3"
67
+ "@effect/schema": "^0.64.9",
68
+ "effect": "2.4.9"
69
69
  },
70
70
  "publishConfig": {
71
71
  "access": "public"