@evolu/common 6.0.1-preview.2 → 6.0.1-preview.21
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/Assert.d.ts +6 -3
- package/dist/src/Assert.d.ts.map +1 -1
- package/dist/src/Assert.js +7 -4
- package/dist/src/Brand.d.ts +75 -0
- package/dist/src/Brand.d.ts.map +1 -0
- package/dist/src/Brand.js +1 -0
- package/dist/src/Buffer.d.ts +1 -1
- package/dist/src/Buffer.d.ts.map +1 -1
- package/dist/src/Buffer.js +1 -1
- package/dist/src/CallbackRegistry.d.ts +53 -0
- package/dist/src/CallbackRegistry.d.ts.map +1 -0
- package/dist/src/CallbackRegistry.js +25 -0
- package/dist/src/Console.d.ts +31 -6
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +72 -9
- package/dist/src/Crypto.d.ts +61 -34
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +29 -42
- package/dist/src/Evolu/Db.d.ts +159 -66
- package/dist/src/Evolu/Db.d.ts.map +1 -1
- package/dist/src/Evolu/Db.js +300 -705
- package/dist/src/Evolu/Diff.d.ts +3 -3
- package/dist/src/Evolu/Diff.d.ts.map +1 -1
- package/dist/src/Evolu/Diff.js +7 -5
- package/dist/src/Evolu/Evolu.d.ts +200 -115
- package/dist/src/Evolu/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu/Evolu.js +287 -157
- package/dist/src/Evolu/Internal.d.ts +0 -2
- package/dist/src/Evolu/Internal.d.ts.map +1 -1
- package/dist/src/Evolu/Internal.js +0 -2
- package/dist/src/Evolu/LocalAuth.d.ts +144 -0
- package/dist/src/Evolu/LocalAuth.d.ts.map +1 -0
- package/dist/src/Evolu/LocalAuth.js +171 -0
- package/dist/src/Evolu/Owner.d.ts +209 -124
- package/dist/src/Evolu/Owner.d.ts.map +1 -1
- package/dist/src/Evolu/Owner.js +118 -104
- package/dist/src/Evolu/Platform.d.ts +9 -7
- package/dist/src/Evolu/Platform.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.d.ts +256 -211
- package/dist/src/Evolu/Protocol.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.js +558 -359
- package/dist/src/Evolu/Public.d.ts +6 -8
- package/dist/src/Evolu/Public.d.ts.map +1 -1
- package/dist/src/Evolu/Public.js +2 -3
- package/dist/src/Evolu/PublicKysely.js +3 -3
- package/dist/src/Evolu/Query.d.ts +2 -1
- package/dist/src/Evolu/Query.d.ts.map +1 -1
- package/dist/src/Evolu/Relay.d.ts +72 -4
- package/dist/src/Evolu/Relay.d.ts.map +1 -1
- package/dist/src/Evolu/Relay.js +124 -13
- package/dist/src/Evolu/Schema.d.ts +129 -73
- package/dist/src/Evolu/Schema.d.ts.map +1 -1
- package/dist/src/Evolu/Schema.js +169 -89
- package/dist/src/Evolu/Storage.d.ts +159 -14
- package/dist/src/Evolu/Storage.d.ts.map +1 -1
- package/dist/src/Evolu/Storage.js +42 -32
- package/dist/src/Evolu/Sync.d.ts +68 -13
- package/dist/src/Evolu/Sync.d.ts.map +1 -1
- package/dist/src/Evolu/Sync.js +414 -20
- package/dist/src/Evolu/Timestamp.d.ts +35 -27
- package/dist/src/Evolu/Timestamp.d.ts.map +1 -1
- package/dist/src/Evolu/Timestamp.js +27 -18
- package/dist/src/ManyToManyMap.d.ts +74 -10
- package/dist/src/ManyToManyMap.d.ts.map +1 -1
- package/dist/src/ManyToManyMap.js +41 -6
- package/dist/src/Number.d.ts +2 -1
- package/dist/src/Number.d.ts.map +1 -1
- package/dist/src/Random.d.ts +3 -2
- package/dist/src/Random.d.ts.map +1 -1
- package/dist/src/RefCountedResourceManager.d.ts +119 -0
- package/dist/src/RefCountedResourceManager.d.ts.map +1 -0
- package/dist/src/RefCountedResourceManager.js +197 -0
- package/dist/src/Result.d.ts +176 -51
- package/dist/src/Result.d.ts.map +1 -1
- package/dist/src/Result.js +30 -241
- package/dist/src/Sqlite.d.ts +21 -4
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +50 -8
- package/dist/src/Task.d.ts +511 -0
- package/dist/src/Task.d.ts.map +1 -0
- package/dist/src/Task.js +410 -0
- package/dist/src/Time.d.ts +59 -0
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +87 -4
- package/dist/src/Type.d.ts +474 -327
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +502 -436
- package/dist/src/Types.d.ts +0 -74
- package/dist/src/Types.d.ts.map +1 -1
- package/dist/src/WebSocket.d.ts +5 -2
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +12 -13
- package/dist/src/Worker.d.ts +39 -11
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +22 -4
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -3
- package/package.json +14 -13
- package/src/Assert.ts +8 -7
- package/src/Brand.ts +75 -0
- package/src/Buffer.ts +1 -1
- package/src/CallbackRegistry.ts +84 -0
- package/src/Console.ts +91 -11
- package/src/Crypto.ts +94 -79
- package/src/Evolu/Db.ts +528 -1027
- package/src/Evolu/Diff.ts +7 -5
- package/src/Evolu/Evolu.ts +682 -329
- package/src/Evolu/Internal.ts +0 -2
- package/src/Evolu/LocalAuth.ts +422 -0
- package/src/Evolu/Owner.ts +282 -227
- package/src/Evolu/Platform.ts +9 -9
- package/src/Evolu/Protocol.ts +788 -640
- package/src/Evolu/Public.ts +7 -14
- package/src/Evolu/PublicKysely.ts +3 -3
- package/src/Evolu/Query.ts +2 -1
- package/src/Evolu/Relay.ts +238 -18
- package/src/Evolu/Schema.ts +391 -191
- package/src/Evolu/Storage.ts +275 -55
- package/src/Evolu/Sync.ts +708 -37
- package/src/Evolu/Timestamp.ts +38 -35
- package/src/ManyToManyMap.ts +127 -24
- package/src/Number.ts +2 -6
- package/src/Random.ts +3 -2
- package/src/RefCountedResourceManager.ts +368 -0
- package/src/Result.ts +183 -53
- package/src/Sqlite.ts +59 -23
- package/src/Task.ts +779 -0
- package/src/Time.ts +168 -4
- package/src/Type.ts +708 -660
- package/src/Types.ts +0 -76
- package/src/WebSocket.ts +23 -17
- package/src/Worker.ts +72 -23
- package/src/index.ts +3 -3
- package/dist/src/Callbacks.d.ts +0 -20
- package/dist/src/Callbacks.d.ts.map +0 -1
- package/dist/src/Callbacks.js +0 -18
- package/dist/src/Evolu/Config.d.ts +0 -69
- package/dist/src/Evolu/Config.d.ts.map +0 -1
- package/dist/src/Evolu/Config.js +0 -9
- package/dist/src/Evolu/Kysely.d.ts +0 -6
- package/dist/src/Evolu/Kysely.d.ts.map +0 -1
- package/dist/src/Evolu/Kysely.js +0 -21
- package/dist/src/NanoId.d.ts +0 -27
- package/dist/src/NanoId.d.ts.map +0 -1
- package/dist/src/NanoId.js +0 -6
- package/dist/src/Promise.d.ts +0 -180
- package/dist/src/Promise.d.ts.map +0 -1
- package/dist/src/Promise.js +0 -176
- package/src/Callbacks.ts +0 -43
- package/src/Evolu/Config.ts +0 -83
- package/src/Evolu/Kysely.ts +0 -38
- package/src/NanoId.ts +0 -39
- package/src/Promise.ts +0 -295
package/dist/src/Evolu/Diff.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ export declare const makePatches: (previousRows: ReadonlyArray<Row> | undefined,
|
|
|
26
26
|
* A unique identifier prepended to JSON-encoded strings. This allows safe
|
|
27
27
|
* detection and parsing of only those columns that require JSON.parse.
|
|
28
28
|
*
|
|
29
|
-
* The identifier is
|
|
30
|
-
* preventing malicious actors from inserting fake data that could be
|
|
29
|
+
* The identifier is a cryptographically random Evolu Id, ensuring uniqueness
|
|
30
|
+
* and preventing malicious actors from inserting fake data that could be
|
|
31
31
|
* misinterpreted as JSON by the application.
|
|
32
32
|
*
|
|
33
33
|
* Note: The same queries created by different browser tabs will have different
|
|
@@ -38,6 +38,6 @@ export declare const makePatches: (previousRows: ReadonlyArray<Row> | undefined,
|
|
|
38
38
|
*
|
|
39
39
|
* See: https://github.com/kysely-org/kysely/issues/1372#issuecomment-2702773948
|
|
40
40
|
*/
|
|
41
|
-
export declare const kyselyJsonIdentifier: string
|
|
41
|
+
export declare const kyselyJsonIdentifier: string & import("../Brand.js").Brand<"Id">;
|
|
42
42
|
export declare const parseSqliteJsonArray: <T>(arr: ReadonlyArray<T>) => ReadonlyArray<T>;
|
|
43
43
|
//# sourceMappingURL=Diff.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Diff.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Diff.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,KAAK,GAAG,eAAe,GAAG,cAAc,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACrB;AAED,eAAO,MAAM,YAAY,GACvB,SAAS,aAAa,CAAC,KAAK,CAAC,EAC7B,SAAS,aAAa,CAAC,GAAG,CAAC,KAC1B,aAAa,CAAC,GAAG,CAUP,CAAC;AAEd;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,cAAc,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,EAC5C,UAAU,aAAa,CAAC,GAAG,CAAC,KAC3B,aAAa,CAAC,KAAK,CA6BrB,CAAC;AAUF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"Diff.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Diff.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,KAAK,GAAG,eAAe,GAAG,cAAc,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACrB;AAED,eAAO,MAAM,YAAY,GACvB,SAAS,aAAa,CAAC,KAAK,CAAC,EAC7B,SAAS,aAAa,CAAC,GAAG,CAAC,KAC1B,aAAa,CAAC,GAAG,CAUP,CAAC;AAEd;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,cAAc,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,EAC5C,UAAU,aAAa,CAAC,GAAG,CAAC,KAC3B,aAAa,CAAC,KAAK,CA6BrB,CAAC;AAUF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,4CAE/B,CAAC;AAEH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,KAAK,aAAa,CAAC,CAAC,CAAC,KACpB,aAAa,CAAC,CAAC,CAMjB,CAAC"}
|
package/dist/src/Evolu/Diff.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createRandomBytes } from "../Crypto.js";
|
|
2
2
|
import { isPlainObject } from "../Object.js";
|
|
3
3
|
import { orderUint8Array } from "../Order.js";
|
|
4
|
-
import { String } from "../Type.js";
|
|
4
|
+
import { createId, String } from "../Type.js";
|
|
5
5
|
export const applyPatches = (patches, current) => patches.reduce((next, patch) => {
|
|
6
6
|
switch (patch.op) {
|
|
7
7
|
case "replaceAll":
|
|
@@ -54,8 +54,8 @@ const areEqual = (a, b) => {
|
|
|
54
54
|
* A unique identifier prepended to JSON-encoded strings. This allows safe
|
|
55
55
|
* detection and parsing of only those columns that require JSON.parse.
|
|
56
56
|
*
|
|
57
|
-
* The identifier is
|
|
58
|
-
* preventing malicious actors from inserting fake data that could be
|
|
57
|
+
* The identifier is a cryptographically random Evolu Id, ensuring uniqueness
|
|
58
|
+
* and preventing malicious actors from inserting fake data that could be
|
|
59
59
|
* misinterpreted as JSON by the application.
|
|
60
60
|
*
|
|
61
61
|
* Note: The same queries created by different browser tabs will have different
|
|
@@ -66,7 +66,9 @@ const areEqual = (a, b) => {
|
|
|
66
66
|
*
|
|
67
67
|
* See: https://github.com/kysely-org/kysely/issues/1372#issuecomment-2702773948
|
|
68
68
|
*/
|
|
69
|
-
export const kyselyJsonIdentifier =
|
|
69
|
+
export const kyselyJsonIdentifier = createId({
|
|
70
|
+
randomBytes: createRandomBytes(),
|
|
71
|
+
});
|
|
70
72
|
export const parseSqliteJsonArray = (arr) => {
|
|
71
73
|
const result = new Array(arr.length);
|
|
72
74
|
for (let i = 0; i < arr.length; ++i) {
|
|
@@ -1,20 +1,48 @@
|
|
|
1
1
|
import { ConsoleDep } from "../Console.js";
|
|
2
|
-
import { SymmetricCryptoDecryptError } from "../Crypto.js";
|
|
2
|
+
import { RandomBytesDep, SymmetricCryptoDecryptError } from "../Crypto.js";
|
|
3
3
|
import { TransferableError } from "../Error.js";
|
|
4
|
-
import { NanoIdLibDep } from "../NanoId.js";
|
|
5
4
|
import { SqliteError } from "../Sqlite.js";
|
|
6
5
|
import { StoreSubscribe } from "../Store.js";
|
|
7
6
|
import { TimeDep } from "../Time.js";
|
|
8
7
|
import { Mnemonic } from "../Type.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
8
|
+
import { CreateDbWorkerDep, DbConfig } from "./Db.js";
|
|
9
|
+
import { LocalAuthDep } from "./LocalAuth.js";
|
|
11
10
|
import { AppOwner } from "./Owner.js";
|
|
12
|
-
import {
|
|
11
|
+
import { FlushSyncDep, ReloadAppDep } from "./Platform.js";
|
|
13
12
|
import { ProtocolError, ProtocolUnsupportedVersionError } from "./Protocol.js";
|
|
14
13
|
import { Queries, QueriesToQueryRowsPromises, Query, QueryRows, Row } from "./Query.js";
|
|
15
|
-
import { CreateQuery, EvoluSchema, Mutation } from "./Schema.js";
|
|
16
|
-
import {
|
|
14
|
+
import { CreateQuery, EvoluSchema, IndexesConfig, Mutation, ValidateSchema } from "./Schema.js";
|
|
15
|
+
import { SyncOwner } from "./Sync.js";
|
|
17
16
|
import { TimestampError } from "./Timestamp.js";
|
|
17
|
+
export interface EvoluConfig extends Partial<DbConfig> {
|
|
18
|
+
/**
|
|
19
|
+
* Use the `indexes` option to define SQLite indexes.
|
|
20
|
+
*
|
|
21
|
+
* Table and column names are not typed because Kysely doesn't support it.
|
|
22
|
+
*
|
|
23
|
+
* https://medium.com/@JasonWyatt/squeezing-performance-from-sqlite-indexes-indexes-c4e175f3c346
|
|
24
|
+
*
|
|
25
|
+
* ### Example
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* const evolu = createEvolu(evoluReactDeps)(Schema, {
|
|
29
|
+
* indexes: (create) => [
|
|
30
|
+
* create("todoCreatedAt").on("todo").column("createdAt"),
|
|
31
|
+
* create("todoCategoryCreatedAt")
|
|
32
|
+
* .on("todoCategory")
|
|
33
|
+
* .column("createdAt"),
|
|
34
|
+
* ],
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
readonly indexes?: IndexesConfig;
|
|
39
|
+
/**
|
|
40
|
+
* URL to reload browser tabs after reset or restore.
|
|
41
|
+
*
|
|
42
|
+
* The default value is `/`.
|
|
43
|
+
*/
|
|
44
|
+
readonly reloadUrl?: string;
|
|
45
|
+
}
|
|
18
46
|
export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
19
47
|
/**
|
|
20
48
|
* Subscribe to {@link EvoluError} changes.
|
|
@@ -40,7 +68,8 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
|
40
68
|
* All this function does is compile the Kysely query and serialize it into a
|
|
41
69
|
* unique string. Both operations are fast and cheap.
|
|
42
70
|
*
|
|
43
|
-
* For mutations, use {@link Evolu
|
|
71
|
+
* For mutations, use {@link Evolu#insert}, {@link Evolu#update}, or
|
|
72
|
+
* {@link Evolu#upsert}.
|
|
44
73
|
*
|
|
45
74
|
* ### Example
|
|
46
75
|
*
|
|
@@ -59,43 +88,20 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
|
59
88
|
/**
|
|
60
89
|
* Load {@link Query} and return a promise with {@link QueryRows}.
|
|
61
90
|
*
|
|
62
|
-
*
|
|
63
|
-
* why loading should fail. All data are local, and the query is typed.
|
|
64
|
-
*
|
|
65
|
-
* {@link Evolu.subscribeError}.
|
|
91
|
+
* The returned promise always resolves successfully because there is no
|
|
92
|
+
* reason why loading should fail. All data are local, and the query is typed.
|
|
93
|
+
* Unexpected errors are handled with {@link Evolu#subscribeError}.
|
|
66
94
|
*
|
|
67
95
|
* Loading is batched, and returned promises are cached, so there is no need
|
|
68
|
-
* for an additional cache. Evolu's internal cache is invalidated on
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* With promises passed to children, we can load a query as soon as possible,
|
|
78
|
-
* but we don't have to use the returned promise immediately. That's useful
|
|
79
|
-
* for prefetching, which is generally not necessary for local-first apps but
|
|
80
|
-
* can be if a query takes a long time to load.
|
|
81
|
-
*
|
|
82
|
-
* Caching over mutation is a pattern that every developer should know. As we
|
|
83
|
-
* said, Evolu caches promise until a mutation happens. A query loaded after
|
|
84
|
-
* that will return a new pending promise. That's okay for general usage but
|
|
85
|
-
* not for UI with React Suspense because a mutation would suspend rerendered
|
|
86
|
-
* queries on a page, and that's not a good UX.
|
|
87
|
-
*
|
|
88
|
-
* We call this pattern "caching over mutation" because it has no globally
|
|
89
|
-
* accepted name yet. React RFC for React Cache does not exist yet.
|
|
90
|
-
*
|
|
91
|
-
* For better UX, a query must be subscribed for updates. This way, instead of
|
|
92
|
-
* Suspense flashes, the user sees new data immediately because Evolu replaces
|
|
93
|
-
* cached promises with fresh, already resolved new ones.
|
|
94
|
-
*
|
|
95
|
-
* If you are curious why Evolu does not do that for all queries by default,
|
|
96
|
-
* the answer is simple: performance. Tracking changes is costly and
|
|
97
|
-
* meaningful only for visible (hence subscribed) queries anyway. To subscribe
|
|
98
|
-
* to a query, use {@link Evolu.subscribeQuery}.
|
|
96
|
+
* for an additional cache. Evolu's internal cache is invalidated on mutation.
|
|
97
|
+
* Unsubscribed queries are removed from the cache, so loading them again will
|
|
98
|
+
* return a new pending promise. Subscribed queries remain in the cache to
|
|
99
|
+
* prevent unnecessary Suspense boundaries from activating. Their promises are
|
|
100
|
+
* replaced with `Promise.resolve(rows)`, allowing React to synchronously
|
|
101
|
+
* unwrap the updated data without suspending.
|
|
102
|
+
*
|
|
103
|
+
* To subscribe a query for automatic updates, use
|
|
104
|
+
* {@link Evolu#subscribeQuery}.
|
|
99
105
|
*
|
|
100
106
|
* ### Example
|
|
101
107
|
*
|
|
@@ -103,7 +109,7 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
|
103
109
|
* const allTodos = evolu.createQuery((db) =>
|
|
104
110
|
* db.selectFrom("todo").selectAll(),
|
|
105
111
|
* );
|
|
106
|
-
* evolu.loadQuery(allTodos).then((
|
|
112
|
+
* evolu.loadQuery(allTodos).then((rows) => {
|
|
107
113
|
* console.log(rows);
|
|
108
114
|
* });
|
|
109
115
|
* ```
|
|
@@ -146,80 +152,162 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
|
146
152
|
*/
|
|
147
153
|
readonly getQueryRows: <R extends Row>(query: Query<R>) => QueryRows<R>;
|
|
148
154
|
/**
|
|
149
|
-
*
|
|
155
|
+
* Promise that resolves to {@link AppOwner} when available.
|
|
150
156
|
*
|
|
151
157
|
* ### Example
|
|
152
158
|
*
|
|
153
159
|
* ```ts
|
|
154
|
-
* const
|
|
155
|
-
* const owner = evolu.getAppOwner();
|
|
156
|
-
* });
|
|
160
|
+
* const owner = await evolu.appOwner;
|
|
157
161
|
* ```
|
|
158
162
|
*/
|
|
159
|
-
readonly
|
|
163
|
+
readonly appOwner: Promise<AppOwner>;
|
|
160
164
|
/**
|
|
161
|
-
*
|
|
165
|
+
* Inserts a row into the database and returns a {@link Result} with the new
|
|
166
|
+
* {@link Id}.
|
|
162
167
|
*
|
|
163
|
-
*
|
|
168
|
+
* The first argument is the table name, and the second is an object
|
|
169
|
+
* containing the row data. An optional third argument provides mutation
|
|
170
|
+
* options including an `onComplete` callback and `onlyValidate` flag.
|
|
164
171
|
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Subscribe to {@link SyncState} changes.
|
|
172
|
+
* Returns a Result type - use `.ok` to check if the insertion succeeded, and
|
|
173
|
+
* `.value.id` to access the generated ID on success, or `.error` to handle
|
|
174
|
+
* validation errors.
|
|
175
|
+
*
|
|
176
|
+
* Evolu does not use SQL for mutations to ensure data can be safely and
|
|
177
|
+
* predictably merged without conflicts. Explicit mutations also allow Evolu
|
|
178
|
+
* to automatically add and update {@link DefaultColumns}.
|
|
174
179
|
*
|
|
175
180
|
* ### Example
|
|
176
181
|
*
|
|
177
182
|
* ```ts
|
|
178
|
-
* const
|
|
179
|
-
*
|
|
183
|
+
* const result = evolu.insert("todo", {
|
|
184
|
+
* title: "Learn Evolu",
|
|
185
|
+
* isCompleted: false,
|
|
180
186
|
* });
|
|
187
|
+
*
|
|
188
|
+
* if (result.ok) {
|
|
189
|
+
* console.log("Todo created with ID:", result.value.id);
|
|
190
|
+
* } else {
|
|
191
|
+
* console.error("Validation error:", result.error);
|
|
192
|
+
* }
|
|
193
|
+
*
|
|
194
|
+
* // With onComplete callback
|
|
195
|
+
* evolu.insert(
|
|
196
|
+
* "todo",
|
|
197
|
+
* { title: "Another todo" },
|
|
198
|
+
* {
|
|
199
|
+
* onComplete: () => {
|
|
200
|
+
* console.log("Insert completed");
|
|
201
|
+
* },
|
|
202
|
+
* },
|
|
203
|
+
* );
|
|
181
204
|
* ```
|
|
182
205
|
*/
|
|
183
|
-
|
|
206
|
+
insert: Mutation<S, "insert">;
|
|
184
207
|
/**
|
|
185
|
-
*
|
|
208
|
+
* Updates a row in the database and returns a {@link Result} with the existing
|
|
209
|
+
* {@link Id}.
|
|
210
|
+
*
|
|
211
|
+
* The first argument is the table name, and the second is an object
|
|
212
|
+
* containing the row data including the required `id` field. An optional
|
|
213
|
+
* third argument provides mutation options including an `onComplete` callback
|
|
214
|
+
* and `onlyValidate` flag.
|
|
215
|
+
*
|
|
216
|
+
* Returns a Result type - use `.ok` to check if the update succeeded, and
|
|
217
|
+
* `.value.id` to access the ID on success, or `.error` to handle validation
|
|
218
|
+
* errors.
|
|
219
|
+
*
|
|
220
|
+
* Evolu does not use SQL for mutations to ensure data can be safely and
|
|
221
|
+
* predictably merged without conflicts. Explicit mutations also allow Evolu
|
|
222
|
+
* to automatically add and update {@link DefaultColumns}.
|
|
186
223
|
*
|
|
187
224
|
* ### Example
|
|
188
225
|
*
|
|
189
226
|
* ```ts
|
|
190
|
-
* const
|
|
191
|
-
*
|
|
227
|
+
* const result = evolu.update("todo", {
|
|
228
|
+
* id: todoId,
|
|
229
|
+
* title: "Updated title",
|
|
230
|
+
* isCompleted: true,
|
|
192
231
|
* });
|
|
232
|
+
*
|
|
233
|
+
* if (result.ok) {
|
|
234
|
+
* console.log("Todo updated with ID:", result.value.id);
|
|
235
|
+
* } else {
|
|
236
|
+
* console.error("Validation error:", result.error);
|
|
237
|
+
* }
|
|
238
|
+
*
|
|
239
|
+
* // To delete a row, set isDeleted to true
|
|
240
|
+
* evolu.update("todo", { id: todoId, isDeleted: true });
|
|
241
|
+
*
|
|
242
|
+
* // With onComplete callback
|
|
243
|
+
* evolu.update(
|
|
244
|
+
* "todo",
|
|
245
|
+
* { id: todoId, title: "New title" },
|
|
246
|
+
* {
|
|
247
|
+
* onComplete: () => {
|
|
248
|
+
* console.log("Update completed");
|
|
249
|
+
* },
|
|
250
|
+
* },
|
|
251
|
+
* );
|
|
193
252
|
* ```
|
|
194
253
|
*/
|
|
195
|
-
|
|
254
|
+
update: Mutation<S, "update">;
|
|
196
255
|
/**
|
|
197
|
-
*
|
|
256
|
+
* Upserts a row in the database and returns a {@link Result} with the existing
|
|
257
|
+
* {@link Id}.
|
|
198
258
|
*
|
|
199
|
-
*
|
|
259
|
+
* The first argument is the table name, and the second is an object
|
|
260
|
+
* containing the row data including the required `id` field. An optional
|
|
261
|
+
* third argument provides mutation options including an `onComplete` callback
|
|
262
|
+
* and `onlyValidate` flag.
|
|
200
263
|
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*/
|
|
205
|
-
insert: Mutation<S, "insert">;
|
|
206
|
-
/**
|
|
207
|
-
* Updates a row.
|
|
264
|
+
* This function allows you to use custom IDs and optionally set `createdAt`,
|
|
265
|
+
* which is useful for external systems, data migrations, or when the same row
|
|
266
|
+
* may already be created on a different device.
|
|
208
267
|
*
|
|
209
|
-
*
|
|
268
|
+
* Returns a Result type - use `.ok` to check if the upsert succeeded, and
|
|
269
|
+
* `.value.id` to access the ID on success, or `.error` to handle validation
|
|
270
|
+
* errors.
|
|
210
271
|
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*/
|
|
215
|
-
update: Mutation<S, "update">;
|
|
216
|
-
/**
|
|
217
|
-
* Upserts a row.
|
|
272
|
+
* Evolu does not use SQL for mutations to ensure data can be safely and
|
|
273
|
+
* predictably merged without conflicts. Explicit mutations also allow Evolu
|
|
274
|
+
* to automatically add and update {@link DefaultColumns}.
|
|
218
275
|
*
|
|
219
276
|
* ### Example
|
|
220
277
|
*
|
|
221
278
|
* ```ts
|
|
222
|
-
* //
|
|
279
|
+
* // Use deterministic ID for stable upserts across devices
|
|
280
|
+
* const stableId = createIdFromString("my-todo-1");
|
|
281
|
+
*
|
|
282
|
+
* const result = evolu.upsert("todo", {
|
|
283
|
+
* id: stableId,
|
|
284
|
+
* title: "Learn Evolu",
|
|
285
|
+
* isCompleted: false,
|
|
286
|
+
* });
|
|
287
|
+
*
|
|
288
|
+
* if (result.ok) {
|
|
289
|
+
* console.log("Todo upserted with ID:", result.value.id);
|
|
290
|
+
* } else {
|
|
291
|
+
* console.error("Validation error:", result.error);
|
|
292
|
+
* }
|
|
293
|
+
*
|
|
294
|
+
* // Data migration with custom createdAt
|
|
295
|
+
* evolu.upsert("todo", {
|
|
296
|
+
* id: externalId,
|
|
297
|
+
* title: "Migrated todo",
|
|
298
|
+
* createdAt: new Date("2023-01-01"), // Preserve original timestamp
|
|
299
|
+
* });
|
|
300
|
+
*
|
|
301
|
+
* // With onComplete callback
|
|
302
|
+
* evolu.upsert(
|
|
303
|
+
* "todo",
|
|
304
|
+
* { id: stableId, title: "Updated title" },
|
|
305
|
+
* {
|
|
306
|
+
* onComplete: () => {
|
|
307
|
+
* console.log("Upsert completed");
|
|
308
|
+
* },
|
|
309
|
+
* },
|
|
310
|
+
* );
|
|
223
311
|
* ```
|
|
224
312
|
*/
|
|
225
313
|
upsert: Mutation<S, "upsert">;
|
|
@@ -237,7 +325,7 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
|
237
325
|
}) => Promise<void>;
|
|
238
326
|
/**
|
|
239
327
|
* Restore {@link AppOwner} with all their synced data. It uses
|
|
240
|
-
* {@link Evolu
|
|
328
|
+
* {@link Evolu#resetAppOwner}, so be careful.
|
|
241
329
|
*/
|
|
242
330
|
readonly restoreAppOwner: (mnemonic: Mnemonic, options?: {
|
|
243
331
|
readonly reload?: boolean;
|
|
@@ -248,40 +336,36 @@ export interface Evolu<S extends EvoluSchema = EvoluSchema> {
|
|
|
248
336
|
*/
|
|
249
337
|
readonly reloadApp: () => void;
|
|
250
338
|
/** Export SQLite database file as Uint8Array. */
|
|
251
|
-
readonly exportDatabase: () => Promise<Uint8Array
|
|
252
|
-
}
|
|
253
|
-
/** Represent errors that can occur in Evolu. */
|
|
254
|
-
export type EvoluError = TimestampError | ProtocolError | TransferableError | SymmetricCryptoDecryptError | ProtocolUnsupportedVersionError | SqliteError;
|
|
255
|
-
export type EvoluDeps = CreateDbWorkerDep & TimeDep & NanoIdLibDep & Partial<FlushSyncDep> & ConsoleDep & CreateAppStateDep;
|
|
256
|
-
export interface EvoluConfigWithInitialData<S extends EvoluSchema = EvoluSchema> extends Config {
|
|
339
|
+
readonly exportDatabase: () => Promise<Uint8Array<ArrayBuffer>>;
|
|
257
340
|
/**
|
|
258
|
-
* Use
|
|
341
|
+
* Use an owner. Using an owner means syncing it and subscribing to
|
|
342
|
+
* broadcasted changes. Returns a function to stop using the owner.
|
|
343
|
+
*
|
|
344
|
+
* Transport connections are automatically deduplicated and reference-counted,
|
|
345
|
+
* so multiple owners using the same transport will share a single
|
|
346
|
+
* connection.
|
|
259
347
|
*
|
|
260
348
|
* ### Example
|
|
261
349
|
*
|
|
262
350
|
* ```ts
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
272
|
-
* evolu.insert("todo", {
|
|
273
|
-
* title: "Try React Suspense",
|
|
274
|
-
* categoryId: todoCategory.value.id,
|
|
275
|
-
* });
|
|
276
|
-
* },
|
|
277
|
-
* });
|
|
351
|
+
* // Use an owner (starts syncing and subscribing to changes).
|
|
352
|
+
* const unuse = evolu.useOwner(shardOwner);
|
|
353
|
+
*
|
|
354
|
+
* // Later, stop using the owner.
|
|
355
|
+
* unuse();
|
|
356
|
+
*
|
|
357
|
+
* // Bulk operations.
|
|
358
|
+
* const unuses = owners.map((owner) => evolu.useOwner(owner));
|
|
359
|
+
* // Later: unuses.forEach(unuse => unuse());
|
|
278
360
|
* ```
|
|
361
|
+
*
|
|
362
|
+
* @experimental
|
|
279
363
|
*/
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
export interface EvoluForInitialData<S extends EvoluSchema = EvoluSchema> {
|
|
283
|
-
insert: Mutation<S, "insert">;
|
|
364
|
+
readonly useOwner: (owner: SyncOwner) => () => void;
|
|
284
365
|
}
|
|
366
|
+
/** Represents errors that can occur in Evolu. */
|
|
367
|
+
export type EvoluError = ProtocolError | ProtocolUnsupportedVersionError | SqliteError | SymmetricCryptoDecryptError | TimestampError | TransferableError;
|
|
368
|
+
export type EvoluDeps = ConsoleDep & CreateDbWorkerDep & LocalAuthDep & Partial<FlushSyncDep> & RandomBytesDep & ReloadAppDep & TimeDep;
|
|
285
369
|
/**
|
|
286
370
|
* Creates an {@link Evolu} instance configured with the specified
|
|
287
371
|
* {@link EvoluSchema} and optional configuration.
|
|
@@ -299,7 +383,8 @@ export interface EvoluForInitialData<S extends EvoluSchema = EvoluSchema> {
|
|
|
299
383
|
* and merging.
|
|
300
384
|
* - Automatic schema evolution that updates the underlying database with new
|
|
301
385
|
* columns or tables.
|
|
302
|
-
* - Managing owner data with resetAppOwner and
|
|
386
|
+
* - Managing owner data with {@link Evolu#resetAppOwner} and
|
|
387
|
+
* {@link Evolu#restoreAppOwner}.
|
|
303
388
|
*
|
|
304
389
|
* ### Example
|
|
305
390
|
*
|
|
@@ -329,6 +414,6 @@ export interface EvoluForInitialData<S extends EvoluSchema = EvoluSchema> {
|
|
|
329
414
|
* const evolu = createEvolu(evoluReactDeps)(Schema);
|
|
330
415
|
* ```
|
|
331
416
|
*/
|
|
332
|
-
export declare const createEvolu: (deps: EvoluDeps) => <S extends EvoluSchema>(schema: S
|
|
333
|
-
export declare const
|
|
417
|
+
export declare const createEvolu: (deps: EvoluDeps) => <S extends EvoluSchema>(schema: ValidateSchema<S> extends never ? S : ValidateSchema<S>, config?: EvoluConfig) => Evolu<S>;
|
|
418
|
+
export declare const createQuery: <R extends Row>(queryCallback: Parameters<CreateQuery<EvoluSchema>>[0], options?: Parameters<CreateQuery<EvoluSchema>>[1]) => Query<R>;
|
|
334
419
|
//# sourceMappingURL=Evolu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Evolu.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Evolu.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Evolu.ts"],"names":[],"mappings":"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"}
|