on-zero 0.6.2 → 0.6.4
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/cjs/createZeroClient.cjs +91 -12
- package/dist/cjs/createZeroClient.connection.test.cjs +163 -0
- package/dist/cjs/createZeroClient.connection.test.native.js +242 -0
- package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -0
- package/dist/cjs/createZeroClient.native.js +99 -12
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroClient.recovery.test.cjs +52 -0
- package/dist/cjs/createZeroClient.recovery.test.native.js +52 -0
- package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.cjs +197 -14
- package/dist/cjs/helpers/recoverZeroClient.native.js +220 -24
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.test.cjs +241 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js +269 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.native.js +2 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/multi.cjs +13 -0
- package/dist/cjs/multi.native.js +35 -0
- package/dist/cjs/multi.native.js.map +1 -1
- package/dist/cjs/multiPartition.test.cjs +42 -0
- package/dist/cjs/multiPartition.test.native.js +51 -0
- package/dist/cjs/multiPartition.test.native.js.map +1 -0
- package/dist/esm/createZeroClient.connection.test.mjs +164 -0
- package/dist/esm/createZeroClient.connection.test.mjs.map +1 -0
- package/dist/esm/createZeroClient.connection.test.native.js +240 -0
- package/dist/esm/createZeroClient.connection.test.native.js.map +1 -0
- package/dist/esm/createZeroClient.mjs +92 -13
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +100 -13
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.mjs +52 -0
- package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.native.js +52 -0
- package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.mjs +196 -15
- package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.native.js +219 -25
- package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs +242 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.native.js +270 -1
- package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -2
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/multi.mjs +13 -1
- package/dist/esm/multi.mjs.map +1 -1
- package/dist/esm/multi.native.js +35 -1
- package/dist/esm/multi.native.js.map +1 -1
- package/dist/esm/multiPartition.test.mjs +43 -0
- package/dist/esm/multiPartition.test.mjs.map +1 -0
- package/dist/esm/multiPartition.test.native.js +49 -0
- package/dist/esm/multiPartition.test.native.js.map +1 -0
- package/lint/ssr-guards.js +164 -0
- package/package.json +2 -2
- package/readme.md +126 -0
- package/src/createZeroClient.connection.test.tsx +162 -0
- package/src/createZeroClient.recovery.test.tsx +68 -0
- package/src/createZeroClient.tsx +159 -13
- package/src/helpers/recoverZeroClient.test.ts +270 -1
- package/src/helpers/recoverZeroClient.ts +347 -50
- package/src/index.ts +6 -0
- package/src/multi.ts +33 -0
- package/src/multiPartition.test.ts +38 -0
- package/types/createZeroClient.connection.test.d.ts +5 -0
- package/types/createZeroClient.connection.test.d.ts.map +1 -0
- package/types/createZeroClient.d.ts +17 -0
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/createZeroServer.d.ts +4 -4
- package/types/helpers/recoverZeroClient.d.ts +23 -1
- package/types/helpers/recoverZeroClient.d.ts.map +1 -1
- package/types/index.d.ts +1 -1
- package/types/index.d.ts.map +1 -1
- package/types/multi.d.ts +1 -0
- package/types/multi.d.ts.map +1 -1
- package/types/multiPartition.test.d.ts +2 -0
- package/types/multiPartition.test.d.ts.map +1 -0
package/dist/cjs/multi.cjs
CHANGED
|
@@ -23,6 +23,7 @@ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
|
23
23
|
}), mod);
|
|
24
24
|
var multi_exports = {};
|
|
25
25
|
__export(multi_exports, {
|
|
26
|
+
assertZeroInstancePartition: () => assertZeroInstancePartition,
|
|
26
27
|
createZeroClientWithDirectQueries: () => createZeroClientWithDirectQueries
|
|
27
28
|
});
|
|
28
29
|
module.exports = __toCommonJS(multi_exports);
|
|
@@ -35,4 +36,16 @@ function createZeroClientWithDirectQueries(options) {
|
|
|
35
36
|
...options,
|
|
36
37
|
createDirectUseQuery
|
|
37
38
|
});
|
|
39
|
+
}
|
|
40
|
+
function assertZeroInstancePartition(kind, entries, partitions) {
|
|
41
|
+
const labels = Object.keys(partitions);
|
|
42
|
+
for (const name of Object.keys(entries)) {
|
|
43
|
+
const owners = labels.filter(label => name in partitions[label]);
|
|
44
|
+
if (owners.length === 0) {
|
|
45
|
+
throw new Error(`[on-zero] generated ${kind} "${name}" is missing from the instance partition (${labels.join(" / ")}) \u2014 add it to exactly one partition table.`);
|
|
46
|
+
}
|
|
47
|
+
if (owners.length > 1) {
|
|
48
|
+
throw new Error(`[on-zero] generated ${kind} "${name}" is claimed by more than one instance partition (${owners.join(", ")}) \u2014 it must belong to exactly one.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
38
51
|
}
|
package/dist/cjs/multi.native.js
CHANGED
|
@@ -25,6 +25,7 @@ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
|
25
25
|
}), mod);
|
|
26
26
|
var multi_exports = {};
|
|
27
27
|
__export(multi_exports, {
|
|
28
|
+
assertZeroInstancePartition: () => assertZeroInstancePartition,
|
|
28
29
|
createZeroClientWithDirectQueries: () => createZeroClientWithDirectQueries
|
|
29
30
|
});
|
|
30
31
|
module.exports = __toCommonJS(multi_exports);
|
|
@@ -38,4 +39,38 @@ function createZeroClientWithDirectQueries(options) {
|
|
|
38
39
|
createDirectUseQuery
|
|
39
40
|
});
|
|
40
41
|
}
|
|
42
|
+
function assertZeroInstancePartition(kind, entries, partitions) {
|
|
43
|
+
var labels = Object.keys(partitions);
|
|
44
|
+
var _iteratorNormalCompletion = true,
|
|
45
|
+
_didIteratorError = false,
|
|
46
|
+
_iteratorError = void 0;
|
|
47
|
+
try {
|
|
48
|
+
var _loop = function () {
|
|
49
|
+
var name = _step.value;
|
|
50
|
+
var owners = labels.filter(function (label) {
|
|
51
|
+
return name in partitions[label];
|
|
52
|
+
});
|
|
53
|
+
if (owners.length === 0) {
|
|
54
|
+
throw new Error(`[on-zero] generated ${kind} "${name}" is missing from the instance partition (${labels.join(" / ")}) \u2014 add it to exactly one partition table.`);
|
|
55
|
+
}
|
|
56
|
+
if (owners.length > 1) {
|
|
57
|
+
throw new Error(`[on-zero] generated ${kind} "${name}" is claimed by more than one instance partition (${owners.join(", ")}) \u2014 it must belong to exactly one.`);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
for (var _iterator = Object.keys(entries)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) _loop();
|
|
61
|
+
} catch (err) {
|
|
62
|
+
_didIteratorError = true;
|
|
63
|
+
_iteratorError = err;
|
|
64
|
+
} finally {
|
|
65
|
+
try {
|
|
66
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
67
|
+
_iterator.return();
|
|
68
|
+
}
|
|
69
|
+
} finally {
|
|
70
|
+
if (_didIteratorError) {
|
|
71
|
+
throw _iteratorError;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
41
76
|
//# sourceMappingURL=multi.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","multi_exports","__export","createZeroClientWithDirectQueries","module","exports","import_createZeroClient","require","import_createUseQueryDirect","__reExport","options","createDirectUseQuery","createUseQueryDirect","createZeroClientInternal"],"sources":["../../src/multi.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,aAAA;AAAAC,QAAA,CAAAD,aAAA;EAAAE,iCAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","multi_exports","__export","assertZeroInstancePartition","createZeroClientWithDirectQueries","module","exports","import_createZeroClient","require","import_createUseQueryDirect","__reExport","options","createDirectUseQuery","createUseQueryDirect","createZeroClientInternal","kind","entries","partitions","labels","Object","keys","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_loop","name","_step","owners","filter","label","length","Error","join"],"sources":["../../src/multi.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,aAAA;AAAAC,QAAA,CAAAD,aAAA;EAAAE,2BAAA,EAAAA,CAAA,KAAAA,2BAAA;EAAAC,iCAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAAAV,YAAA,CAIOK,aAAA;AACP,IAAAM,uBAAA,GAAAC,OAAqC;AAKrC,IAAAC,2BAAc,GAAAD,OAAA,mCAVd;AAYOE,UAAS,CAAAT,aAAA,EAAAO,OAAA,iCAK+C,GAAAH,MAAA,CAAAC,OAAA;AAC7D,SAAMF,iCAAmDA,CAAAO,OAAA;EACzD,IAAAC,oBAAO,GAAAH,2BAAA,CAAAI,oBAAyC;EAAA,OAC3C,IAAAN,uBAAA,CAAAO,wBAAA;IACH,GAAAH,OAAA;IACDC;EACH;AAYO;AAKL,SAAMT,2BAAqBA,CAAAY,IAAU,EAAAC,OAAA,EAAAC,UAAA;EACrC,IAAAC,MAAA,GAAWC,MAAQ,CAAAC,IAAA,CAAAH,UAAY;EAC7B,IAAAI,yBAAsB,GAAQ;IAAAC,iBAAkB,QAAW;IAAAC,cAAM;EACjE;IACE,IAAAC,KAAM,GAAI,SAAAA,CAAA;MAAA,IACRC,IAAA,GAAAC,KAAA,CAAA1B,KAAA;MAEF,IAAA2B,MAAA,GAAAT,MAAA,CAAAU,MAAA,WAAAC,KAAA;QACF,OAAAJ,IAAA,IAAAR,UAAA,CAAAY,KAAA;MACA,EAAI;MACF,IAAAF,MAAU,CAAAG,MAAA;QACR,UAAAC,KAAA,wBAAoChB,IAAA,KAAAU,IAAA,6CACvBP,MAAK,CAAAc,IAAK;MACzB;MACF,IAAAL,MAAA,CAAAG,MAAA;QACF,UAAAC,KAAA,wBAAAhB,IAAA,KAAAU,IAAA,qDAAAE,MAAA,CAAAK,IAAA;MACF","ignoreList":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var import_vitest = require("vitest");
|
|
2
|
+
var import_multi = require("./multi.cjs");
|
|
3
|
+
(0, import_vitest.describe)("assertZeroInstancePartition", () => {
|
|
4
|
+
const control = {
|
|
5
|
+
user: 1,
|
|
6
|
+
workspace: 1
|
|
7
|
+
};
|
|
8
|
+
const project = {
|
|
9
|
+
message: 1,
|
|
10
|
+
thread: 1
|
|
11
|
+
};
|
|
12
|
+
(0, import_vitest.test)("passes when every namespace belongs to exactly one partition", () => {
|
|
13
|
+
(0, import_vitest.expect)(() => (0, import_multi.assertZeroInstancePartition)("query namespace", {
|
|
14
|
+
user: {},
|
|
15
|
+
workspace: {},
|
|
16
|
+
message: {},
|
|
17
|
+
thread: {}
|
|
18
|
+
}, {
|
|
19
|
+
control,
|
|
20
|
+
project
|
|
21
|
+
})).not.toThrow();
|
|
22
|
+
});
|
|
23
|
+
(0, import_vitest.test)("throws on a namespace missing from every partition (the planGrant drift)", () => {
|
|
24
|
+
(0, import_vitest.expect)(() => (0, import_multi.assertZeroInstancePartition)("query namespace", {
|
|
25
|
+
user: {},
|
|
26
|
+
planGrant: {}
|
|
27
|
+
}, {
|
|
28
|
+
control,
|
|
29
|
+
project
|
|
30
|
+
})).toThrow(/planGrant.*missing from the instance partition/);
|
|
31
|
+
});
|
|
32
|
+
(0, import_vitest.test)("throws on a namespace claimed by more than one partition", () => {
|
|
33
|
+
(0, import_vitest.expect)(() => (0, import_multi.assertZeroInstancePartition)("query namespace", {
|
|
34
|
+
user: {}
|
|
35
|
+
}, {
|
|
36
|
+
control,
|
|
37
|
+
project: {
|
|
38
|
+
user: 1
|
|
39
|
+
}
|
|
40
|
+
})).toThrow(/user.*more than one instance partition/);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var import_vitest = require("vitest");
|
|
4
|
+
var import_multi = require("./multi.native.js");
|
|
5
|
+
(0, import_vitest.describe)("assertZeroInstancePartition", function () {
|
|
6
|
+
var control = {
|
|
7
|
+
user: 1,
|
|
8
|
+
workspace: 1
|
|
9
|
+
};
|
|
10
|
+
var project = {
|
|
11
|
+
message: 1,
|
|
12
|
+
thread: 1
|
|
13
|
+
};
|
|
14
|
+
(0, import_vitest.test)("passes when every namespace belongs to exactly one partition", function () {
|
|
15
|
+
(0, import_vitest.expect)(function () {
|
|
16
|
+
return (0, import_multi.assertZeroInstancePartition)("query namespace", {
|
|
17
|
+
user: {},
|
|
18
|
+
workspace: {},
|
|
19
|
+
message: {},
|
|
20
|
+
thread: {}
|
|
21
|
+
}, {
|
|
22
|
+
control,
|
|
23
|
+
project
|
|
24
|
+
});
|
|
25
|
+
}).not.toThrow();
|
|
26
|
+
});
|
|
27
|
+
(0, import_vitest.test)("throws on a namespace missing from every partition (the planGrant drift)", function () {
|
|
28
|
+
(0, import_vitest.expect)(function () {
|
|
29
|
+
return (0, import_multi.assertZeroInstancePartition)("query namespace", {
|
|
30
|
+
user: {},
|
|
31
|
+
planGrant: {}
|
|
32
|
+
}, {
|
|
33
|
+
control,
|
|
34
|
+
project
|
|
35
|
+
});
|
|
36
|
+
}).toThrow(/planGrant.*missing from the instance partition/);
|
|
37
|
+
});
|
|
38
|
+
(0, import_vitest.test)("throws on a namespace claimed by more than one partition", function () {
|
|
39
|
+
(0, import_vitest.expect)(function () {
|
|
40
|
+
return (0, import_multi.assertZeroInstancePartition)("query namespace", {
|
|
41
|
+
user: {}
|
|
42
|
+
}, {
|
|
43
|
+
control,
|
|
44
|
+
project: {
|
|
45
|
+
user: 1
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}).toThrow(/user.*more than one instance partition/);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=multiPartition.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["import_vitest","require","import_multi","describe","control","user","workspace","project","message","thread","test","expect","assertZeroInstancePartition","not","toThrow","planGrant"],"sources":["../../src/multiPartition.test.ts"],"sourcesContent":[null],"mappings":"AAAA;;AAEA,IAAAA,aAAA,GAA4CC,OAAA;AAAA,IAE5CC,YAAA,GAAAD,OAAA,oBAAS;AACP,IAAAD,aAAM,CAAUG,QAAQ,+BAAgB;EACxC,IAAAC,OAAM;IAENC,IAAA;IACEC,SAAA;EAAA;EACE,IAAAC,OACE;IAAAC,OACE;IAAiDC,MACjD;EAAiB;EACrB,EACF,EAAET,aAAY,CAAAU,IAAA;IACf,IAAAV,aAAA,CAAAW,MAAA;MAED,WAAAT,YAAK,CAAAU,2BAAA;QACHP,IAAA;QAAOC,SACL;QACEE,OAAA;QACAC,MAAE,EAAM,CAAC;MAAiB,GAC1B;QACFL,OAAA;QACAG;MACH;IAED,GAAAM,GAAA,CAAAC,OAAA;EACE;EAAA,IAAOd,aACL,CAAAU,IAAA;IAAA,IACEV,aAAA,CAAAW,MAAA;MAAA,OACE,IAAOT,YAAE,CAAAU,2BAAA;QACXP,IAAE;QACJU,SAAA;MACA;QACHX,OAAA;QACFG","ignoreList":[]}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { createSchema, string, table } from "@rocicorp/zero";
|
|
2
|
+
import { act } from "react";
|
|
3
|
+
import { createRoot } from "react-dom/client";
|
|
4
|
+
import { afterEach, beforeEach, expect, test, vi } from "vitest";
|
|
5
|
+
import { createZeroClient } from "./createZeroClient.mjs";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
const fakeZero = vi.hoisted(() => {
|
|
8
|
+
class FakeConnectionState {
|
|
9
|
+
current;
|
|
10
|
+
listeners = /* @__PURE__ */new Set();
|
|
11
|
+
constructor(initial) {
|
|
12
|
+
this.current = initial;
|
|
13
|
+
}
|
|
14
|
+
subscribe = cb => {
|
|
15
|
+
this.listeners.add(cb);
|
|
16
|
+
return () => {
|
|
17
|
+
this.listeners.delete(cb);
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
set(next) {
|
|
21
|
+
this.current = next;
|
|
22
|
+
for (const cb of this.listeners) cb();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
class FakeZero {
|
|
26
|
+
context = {};
|
|
27
|
+
connection = {
|
|
28
|
+
state: new FakeConnectionState({
|
|
29
|
+
name: "connecting"
|
|
30
|
+
}),
|
|
31
|
+
connect: vi.fn(async () => {})
|
|
32
|
+
};
|
|
33
|
+
delete = vi.fn(async () => ({
|
|
34
|
+
errors: []
|
|
35
|
+
}));
|
|
36
|
+
close = vi.fn();
|
|
37
|
+
run = vi.fn(async () => []);
|
|
38
|
+
preload = vi.fn(() => ({
|
|
39
|
+
cleanup: () => {},
|
|
40
|
+
complete: Promise.resolve()
|
|
41
|
+
}));
|
|
42
|
+
constructor() {
|
|
43
|
+
instances.push(this);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const instances = [];
|
|
47
|
+
return {
|
|
48
|
+
FakeZero,
|
|
49
|
+
FakeConnectionState,
|
|
50
|
+
instances
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
vi.mock("@rocicorp/zero", async importOriginal => {
|
|
54
|
+
const actual = await importOriginal();
|
|
55
|
+
return {
|
|
56
|
+
...actual,
|
|
57
|
+
Zero: fakeZero.FakeZero
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
61
|
+
const noteTable = table("note").columns({
|
|
62
|
+
id: string(),
|
|
63
|
+
body: string()
|
|
64
|
+
}).primaryKey("id");
|
|
65
|
+
const schema = createSchema({
|
|
66
|
+
tables: [noteTable]
|
|
67
|
+
});
|
|
68
|
+
const client = createZeroClient({
|
|
69
|
+
schema,
|
|
70
|
+
models: {},
|
|
71
|
+
groupedQueries: {},
|
|
72
|
+
instanceName: "connection-test"
|
|
73
|
+
});
|
|
74
|
+
let container;
|
|
75
|
+
let root;
|
|
76
|
+
beforeEach(() => {
|
|
77
|
+
fakeZero.instances.length = 0;
|
|
78
|
+
container = document.createElement("div");
|
|
79
|
+
root = null;
|
|
80
|
+
delete document.body.dataset.zeroState;
|
|
81
|
+
delete document.body.dataset.zeroConnected;
|
|
82
|
+
delete document.body.dataset.zeroReason;
|
|
83
|
+
});
|
|
84
|
+
afterEach(() => {
|
|
85
|
+
if (root) act(() => root?.unmount());
|
|
86
|
+
});
|
|
87
|
+
async function mount(extraProps = {}, userID = "conn") {
|
|
88
|
+
root = createRoot(container);
|
|
89
|
+
await act(async () => {
|
|
90
|
+
root?.render(/* @__PURE__ */jsx(client.ProvideZero, {
|
|
91
|
+
cacheURL: "http://127.0.0.1:7788/zero",
|
|
92
|
+
userID,
|
|
93
|
+
...extraProps,
|
|
94
|
+
children: /* @__PURE__ */jsx("span", {
|
|
95
|
+
children: "ok"
|
|
96
|
+
})
|
|
97
|
+
}));
|
|
98
|
+
await Promise.resolve();
|
|
99
|
+
});
|
|
100
|
+
return fakeZero.instances.at(-1);
|
|
101
|
+
}
|
|
102
|
+
test("refreshAuth reconnects in place on needs-auth, once per transition", async () => {
|
|
103
|
+
const refreshAuth = vi.fn(async () => "fresh-token");
|
|
104
|
+
const instance = await mount({
|
|
105
|
+
refreshAuth
|
|
106
|
+
}, "conn-auth");
|
|
107
|
+
await act(async () => {
|
|
108
|
+
instance.connection.state.set({
|
|
109
|
+
name: "needs-auth",
|
|
110
|
+
reason: "token expired"
|
|
111
|
+
});
|
|
112
|
+
await Promise.resolve();
|
|
113
|
+
});
|
|
114
|
+
expect(refreshAuth).toHaveBeenCalledTimes(1);
|
|
115
|
+
await act(async () => {
|
|
116
|
+
await Promise.resolve();
|
|
117
|
+
});
|
|
118
|
+
expect(instance.connection.connect).toHaveBeenCalledWith({
|
|
119
|
+
auth: "fresh-token"
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
test("stale-poke error reconnects instead of surfacing a fatal error", async () => {
|
|
123
|
+
const events = [];
|
|
124
|
+
const off = client.zeroEvents.listen(event => {
|
|
125
|
+
if (event) events.push(event);
|
|
126
|
+
});
|
|
127
|
+
const instance = await mount({}, "conn-stale");
|
|
128
|
+
await act(async () => {
|
|
129
|
+
instance.connection.state.set({
|
|
130
|
+
name: "error",
|
|
131
|
+
reason: "Server returned unexpected base cookie during sync"
|
|
132
|
+
});
|
|
133
|
+
await Promise.resolve();
|
|
134
|
+
});
|
|
135
|
+
expect(instance.connection.connect).toHaveBeenCalledTimes(1);
|
|
136
|
+
expect(instance.connection.connect).toHaveBeenCalledWith();
|
|
137
|
+
expect(events.some(event => event.type === "error")).toBe(false);
|
|
138
|
+
off();
|
|
139
|
+
});
|
|
140
|
+
test("connectionDataset mirrors connection state onto the body dataset", async () => {
|
|
141
|
+
const instance = await mount({
|
|
142
|
+
connectionDataset: true
|
|
143
|
+
}, "conn-dataset");
|
|
144
|
+
await act(async () => {
|
|
145
|
+
instance.connection.state.set({
|
|
146
|
+
name: "connected"
|
|
147
|
+
});
|
|
148
|
+
await Promise.resolve();
|
|
149
|
+
});
|
|
150
|
+
expect(document.body.dataset.zeroState).toBe("connected");
|
|
151
|
+
expect(document.body.dataset.zeroConnected).toBe("true");
|
|
152
|
+
expect(document.body.dataset.zeroCacheUrl).toBe("http://127.0.0.1:7788/zero");
|
|
153
|
+
await act(async () => {
|
|
154
|
+
instance.connection.state.set({
|
|
155
|
+
name: "error",
|
|
156
|
+
reason: "boom"
|
|
157
|
+
});
|
|
158
|
+
await Promise.resolve();
|
|
159
|
+
});
|
|
160
|
+
expect(document.body.dataset.zeroState).toBe("error");
|
|
161
|
+
expect(document.body.dataset.zeroConnected).toBeUndefined();
|
|
162
|
+
expect(document.body.dataset.zeroReason).toBe("boom");
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=createZeroClient.connection.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createSchema","string","table","act","createRoot","afterEach","beforeEach","expect","test","vi","createZeroClient","jsx","fakeZero","hoisted","FakeConnectionState","current","listeners","Set","constructor","initial","subscribe","cb","add","delete","set","next","FakeZero","context","connection","state","name","connect","fn","errors","close","run","preload","cleanup","complete","Promise","resolve","instances","push","mock","importOriginal","actual","Zero","globalThis","IS_REACT_ACT_ENVIRONMENT","noteTable","columns","id","body","primaryKey","schema","tables","client","models","groupedQueries","instanceName","container","root","length","document","createElement","dataset","zeroState","zeroConnected","zeroReason","unmount","mount","extraProps","userID","render","ProvideZero","cacheURL","children","at","refreshAuth","instance","reason","toHaveBeenCalledTimes","toHaveBeenCalledWith","auth","events","off","zeroEvents","listen","event","some","type","toBe","connectionDataset","zeroCacheUrl","toBeUndefined"],"sources":["../../src/createZeroClient.connection.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createSchema, string, table } from "@rocicorp/zero";
|
|
3
|
+
import { act } from "react";
|
|
4
|
+
import { createRoot } from "react-dom/client";
|
|
5
|
+
import { afterEach, beforeEach, expect, test, vi } from "vitest";
|
|
6
|
+
import { createZeroClient } from "./createZeroClient.native.js";
|
|
7
|
+
function _class_call_check(instance, Constructor) {
|
|
8
|
+
if (!(instance instanceof Constructor)) {
|
|
9
|
+
throw new TypeError("Cannot call a class as a function");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function _defineProperties(target, props) {
|
|
13
|
+
for (var i = 0; i < props.length; i++) {
|
|
14
|
+
var descriptor = props[i];
|
|
15
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
16
|
+
descriptor.configurable = true;
|
|
17
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
18
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
22
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
23
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
24
|
+
return Constructor;
|
|
25
|
+
}
|
|
26
|
+
function _define_property(obj, key, value) {
|
|
27
|
+
if (key in obj) {
|
|
28
|
+
Object.defineProperty(obj, key, {
|
|
29
|
+
value,
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
obj[key] = value;
|
|
36
|
+
}
|
|
37
|
+
return obj;
|
|
38
|
+
}
|
|
39
|
+
var fakeZero = vi.hoisted(function () {
|
|
40
|
+
var FakeConnectionState = /* @__PURE__ */function () {
|
|
41
|
+
"use strict";
|
|
42
|
+
|
|
43
|
+
function FakeConnectionState2(initial) {
|
|
44
|
+
var _this = this;
|
|
45
|
+
_class_call_check(this, FakeConnectionState2);
|
|
46
|
+
_define_property(this, "current", void 0);
|
|
47
|
+
_define_property(this, "listeners", /* @__PURE__ */new Set());
|
|
48
|
+
_define_property(this, "subscribe", function (cb) {
|
|
49
|
+
_this.listeners.add(cb);
|
|
50
|
+
return function () {
|
|
51
|
+
_this.listeners.delete(cb);
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
this.current = initial;
|
|
55
|
+
}
|
|
56
|
+
_create_class(FakeConnectionState2, [{
|
|
57
|
+
key: "set",
|
|
58
|
+
value: function set(next) {
|
|
59
|
+
this.current = next;
|
|
60
|
+
var _iteratorNormalCompletion = true,
|
|
61
|
+
_didIteratorError = false,
|
|
62
|
+
_iteratorError = void 0;
|
|
63
|
+
try {
|
|
64
|
+
for (var _iterator = this.listeners[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
65
|
+
var cb = _step.value;
|
|
66
|
+
cb();
|
|
67
|
+
}
|
|
68
|
+
} catch (err) {
|
|
69
|
+
_didIteratorError = true;
|
|
70
|
+
_iteratorError = err;
|
|
71
|
+
} finally {
|
|
72
|
+
try {
|
|
73
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
74
|
+
_iterator.return();
|
|
75
|
+
}
|
|
76
|
+
} finally {
|
|
77
|
+
if (_didIteratorError) {
|
|
78
|
+
throw _iteratorError;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}]);
|
|
84
|
+
return FakeConnectionState2;
|
|
85
|
+
}();
|
|
86
|
+
var FakeZero = function FakeZero2() {
|
|
87
|
+
"use strict";
|
|
88
|
+
|
|
89
|
+
_class_call_check(this, FakeZero2);
|
|
90
|
+
_define_property(this, "context", {});
|
|
91
|
+
_define_property(this, "connection", {
|
|
92
|
+
state: new FakeConnectionState({
|
|
93
|
+
name: "connecting"
|
|
94
|
+
}),
|
|
95
|
+
connect: vi.fn(async function () {})
|
|
96
|
+
});
|
|
97
|
+
_define_property(this, "delete", vi.fn(async function () {
|
|
98
|
+
return {
|
|
99
|
+
errors: []
|
|
100
|
+
};
|
|
101
|
+
}));
|
|
102
|
+
_define_property(this, "close", vi.fn());
|
|
103
|
+
_define_property(this, "run", vi.fn(async function () {
|
|
104
|
+
return [];
|
|
105
|
+
}));
|
|
106
|
+
_define_property(this, "preload", vi.fn(function () {
|
|
107
|
+
return {
|
|
108
|
+
cleanup: function () {},
|
|
109
|
+
complete: Promise.resolve()
|
|
110
|
+
};
|
|
111
|
+
}));
|
|
112
|
+
instances.push(this);
|
|
113
|
+
};
|
|
114
|
+
var instances = [];
|
|
115
|
+
return {
|
|
116
|
+
FakeZero,
|
|
117
|
+
FakeConnectionState,
|
|
118
|
+
instances
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
vi.mock("@rocicorp/zero", async function (importOriginal) {
|
|
122
|
+
var actual = await importOriginal();
|
|
123
|
+
return {
|
|
124
|
+
...actual,
|
|
125
|
+
Zero: fakeZero.FakeZero
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
129
|
+
var noteTable = table("note").columns({
|
|
130
|
+
id: string(),
|
|
131
|
+
body: string()
|
|
132
|
+
}).primaryKey("id");
|
|
133
|
+
var schema = createSchema({
|
|
134
|
+
tables: [noteTable]
|
|
135
|
+
});
|
|
136
|
+
var client = createZeroClient({
|
|
137
|
+
schema,
|
|
138
|
+
models: {},
|
|
139
|
+
groupedQueries: {},
|
|
140
|
+
instanceName: "connection-test"
|
|
141
|
+
});
|
|
142
|
+
var container;
|
|
143
|
+
var root;
|
|
144
|
+
beforeEach(function () {
|
|
145
|
+
fakeZero.instances.length = 0;
|
|
146
|
+
container = document.createElement("div");
|
|
147
|
+
root = null;
|
|
148
|
+
delete document.body.dataset.zeroState;
|
|
149
|
+
delete document.body.dataset.zeroConnected;
|
|
150
|
+
delete document.body.dataset.zeroReason;
|
|
151
|
+
});
|
|
152
|
+
afterEach(function () {
|
|
153
|
+
if (root) act(function () {
|
|
154
|
+
return root === null || root === void 0 ? void 0 : root.unmount();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
async function mount() {
|
|
158
|
+
var extraProps = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {},
|
|
159
|
+
userID = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "conn";
|
|
160
|
+
root = createRoot(container);
|
|
161
|
+
await act(async function () {
|
|
162
|
+
root === null || root === void 0 ? void 0 : root.render(/* @__PURE__ */_jsx(client.ProvideZero, {
|
|
163
|
+
cacheURL: "http://127.0.0.1:7788/zero",
|
|
164
|
+
userID,
|
|
165
|
+
...extraProps,
|
|
166
|
+
children: /* @__PURE__ */_jsx("span", {
|
|
167
|
+
children: "ok"
|
|
168
|
+
})
|
|
169
|
+
}));
|
|
170
|
+
await Promise.resolve();
|
|
171
|
+
});
|
|
172
|
+
return fakeZero.instances.at(-1);
|
|
173
|
+
}
|
|
174
|
+
test("refreshAuth reconnects in place on needs-auth, once per transition", async function () {
|
|
175
|
+
var refreshAuth = vi.fn(async function () {
|
|
176
|
+
return "fresh-token";
|
|
177
|
+
});
|
|
178
|
+
var instance = await mount({
|
|
179
|
+
refreshAuth
|
|
180
|
+
}, "conn-auth");
|
|
181
|
+
await act(async function () {
|
|
182
|
+
instance.connection.state.set({
|
|
183
|
+
name: "needs-auth",
|
|
184
|
+
reason: "token expired"
|
|
185
|
+
});
|
|
186
|
+
await Promise.resolve();
|
|
187
|
+
});
|
|
188
|
+
expect(refreshAuth).toHaveBeenCalledTimes(1);
|
|
189
|
+
await act(async function () {
|
|
190
|
+
await Promise.resolve();
|
|
191
|
+
});
|
|
192
|
+
expect(instance.connection.connect).toHaveBeenCalledWith({
|
|
193
|
+
auth: "fresh-token"
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
test("stale-poke error reconnects instead of surfacing a fatal error", async function () {
|
|
197
|
+
var events = [];
|
|
198
|
+
var off = client.zeroEvents.listen(function (event) {
|
|
199
|
+
if (event) events.push(event);
|
|
200
|
+
});
|
|
201
|
+
var instance = await mount({}, "conn-stale");
|
|
202
|
+
await act(async function () {
|
|
203
|
+
instance.connection.state.set({
|
|
204
|
+
name: "error",
|
|
205
|
+
reason: "Server returned unexpected base cookie during sync"
|
|
206
|
+
});
|
|
207
|
+
await Promise.resolve();
|
|
208
|
+
});
|
|
209
|
+
expect(instance.connection.connect).toHaveBeenCalledTimes(1);
|
|
210
|
+
expect(instance.connection.connect).toHaveBeenCalledWith();
|
|
211
|
+
expect(events.some(function (event) {
|
|
212
|
+
return event.type === "error";
|
|
213
|
+
})).toBe(false);
|
|
214
|
+
off();
|
|
215
|
+
});
|
|
216
|
+
test("connectionDataset mirrors connection state onto the body dataset", async function () {
|
|
217
|
+
var instance = await mount({
|
|
218
|
+
connectionDataset: true
|
|
219
|
+
}, "conn-dataset");
|
|
220
|
+
await act(async function () {
|
|
221
|
+
instance.connection.state.set({
|
|
222
|
+
name: "connected"
|
|
223
|
+
});
|
|
224
|
+
await Promise.resolve();
|
|
225
|
+
});
|
|
226
|
+
expect(document.body.dataset.zeroState).toBe("connected");
|
|
227
|
+
expect(document.body.dataset.zeroConnected).toBe("true");
|
|
228
|
+
expect(document.body.dataset.zeroCacheUrl).toBe("http://127.0.0.1:7788/zero");
|
|
229
|
+
await act(async function () {
|
|
230
|
+
instance.connection.state.set({
|
|
231
|
+
name: "error",
|
|
232
|
+
reason: "boom"
|
|
233
|
+
});
|
|
234
|
+
await Promise.resolve();
|
|
235
|
+
});
|
|
236
|
+
expect(document.body.dataset.zeroState).toBe("error");
|
|
237
|
+
expect(document.body.dataset.zeroConnected).toBeUndefined();
|
|
238
|
+
expect(document.body.dataset.zeroReason).toBe("boom");
|
|
239
|
+
});
|
|
240
|
+
//# sourceMappingURL=createZeroClient.connection.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","createSchema","string","table","act","createRoot","afterEach","beforeEach","expect","test","vi","createZeroClient","_class_call_check","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","prototype","_define_property","obj","value","fakeZero","hoisted","FakeConnectionState","FakeConnectionState2","initial","_this","Set","cb","listeners","add","delete","current","set","next","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","err","return","FakeZero","FakeZero2","state","name","connect","fn","errors","cleanup","complete","Promise","resolve","instances","push","mock","importOriginal","actual","Zero","globalThis","IS_REACT_ACT_ENVIRONMENT","noteTable","columns","id","body","primaryKey","schema","tables"],"sources":["../../src/createZeroClient.connection.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|