on-zero 0.1.47 → 0.1.49
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 +4 -2
- package/dist/cjs/createZeroClient.js +3 -3
- package/dist/cjs/createZeroClient.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js +5 -2
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroServer.cjs +7 -1
- package/dist/cjs/createZeroServer.js +13 -8
- package/dist/cjs/createZeroServer.js.map +1 -1
- package/dist/cjs/createZeroServer.native.js +9 -3
- package/dist/cjs/createZeroServer.native.js.map +1 -1
- package/dist/cjs/serverWhere.test.cjs +106 -0
- package/dist/cjs/serverWhere.test.js +52 -0
- package/dist/cjs/serverWhere.test.js.map +6 -0
- package/dist/cjs/serverWhere.test.native.js +125 -0
- package/dist/cjs/serverWhere.test.native.js.map +1 -0
- package/dist/cjs/state.cjs +21 -11
- package/dist/cjs/state.js +15 -8
- package/dist/cjs/state.js.map +1 -1
- package/dist/cjs/state.native.js +23 -9
- package/dist/cjs/state.native.js.map +1 -1
- package/dist/cjs/usePermission.test.cjs +67 -0
- package/dist/cjs/usePermission.test.js +29 -0
- package/dist/cjs/usePermission.test.js.map +6 -0
- package/dist/cjs/usePermission.test.native.js +74 -0
- package/dist/cjs/usePermission.test.native.js.map +1 -0
- package/dist/esm/createZeroClient.js +4 -4
- package/dist/esm/createZeroClient.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +5 -3
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +6 -3
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroServer.js +13 -7
- package/dist/esm/createZeroServer.js.map +1 -1
- package/dist/esm/createZeroServer.mjs +7 -1
- package/dist/esm/createZeroServer.mjs.map +1 -1
- package/dist/esm/createZeroServer.native.js +9 -3
- package/dist/esm/createZeroServer.native.js.map +1 -1
- package/dist/esm/serverWhere.test.js +55 -0
- package/dist/esm/serverWhere.test.js.map +6 -0
- package/dist/esm/serverWhere.test.mjs +107 -0
- package/dist/esm/serverWhere.test.mjs.map +1 -0
- package/dist/esm/serverWhere.test.native.js +123 -0
- package/dist/esm/serverWhere.test.native.js.map +1 -0
- package/dist/esm/state.js +15 -7
- package/dist/esm/state.js.map +1 -1
- package/dist/esm/state.mjs +20 -10
- package/dist/esm/state.mjs.map +1 -1
- package/dist/esm/state.native.js +23 -9
- package/dist/esm/state.native.js.map +1 -1
- package/dist/esm/usePermission.test.js +33 -0
- package/dist/esm/usePermission.test.js.map +6 -0
- package/dist/esm/usePermission.test.mjs +68 -0
- package/dist/esm/usePermission.test.mjs.map +1 -0
- package/dist/esm/usePermission.test.native.js +72 -0
- package/dist/esm/usePermission.test.native.js.map +1 -0
- package/package.json +2 -2
- package/src/createZeroClient.tsx +13 -3
- package/src/createZeroServer.ts +19 -11
- package/src/serverWhere.test.ts +130 -0
- package/src/state.ts +24 -10
- package/src/usePermission.test.ts +84 -0
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/createZeroServer.d.ts.map +1 -1
- package/types/serverWhere.test.d.ts +2 -0
- package/types/serverWhere.test.d.ts.map +1 -0
- package/types/state.d.ts.map +1 -1
- package/types/usePermission.test.d.ts +2 -0
- package/types/usePermission.test.d.ts.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createBuilder","schema","zql","authData","environment","errMessage","getZQL","Error","getSchema","setSchema","_","
|
|
1
|
+
{"version":3,"names":["createBuilder","globalValue","getState","schema","zql","authData","environment","errMessage","getZQL","Error","getSchema","setSchema","_","state","getAuthData"],"sources":["../../src/state.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,aAAA,QAAkC;AAC3C,SAASC,WAAA,QAAmB;AAW5B,IAAAC,QAAM,YAAAA,CAAA,EACJ;IACE,OAAAD,WAAQ;MACR,OAAK;QACLE,MAAU;QACVC,GAAA,MAAa;QAGXC,QAAA,OAAa;QAGjBC,WAAY,EAAI;MAChB;IACA;EACF;EAEaC,UAAA,GAAY,0DAAM;EAAAC,MAAA,YAAAA,CAAA;IAC7B;MAAMJ;IAAE,IAAAF,QAAW;IACnB,IAAI,CAACE,GAAA,QAAQ,IAAMK,KAAI,CAAAF,UAAM;IAC7B,OAAOH,GAAA;EACT;EAEaM,SAAA,GAAY,SAAAA,CAAA,EAAe;IACtC;MAAMP;IAAA,CAAQ,GAAAD,QAAS;IACvB,KAAAC,MAAM,QACN,IAAAM,KAAM,CAAAF,UAAM;IACd,OAEaJ,MAAA;EAKX;EAAAQ,SAAS,GAAE,SAAAA,CAAWC,CAAA;IACxB,IAEaC,KAAA,GAAAX,QAAiB;IAG5BW,KAAA,CAAAV,MAAW,GAAAS,CAAA,EAAAC,KAAA,CAAAT,GAAc,GAAAJ,aAAA,CAAAY,CAAA;EAC3B;EAAAE,WAAA,YAAAA,CAAA","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { boolean, string, table } from "@rocicorp/zero";
|
|
2
|
+
import { describe, expect, test } from "vitest";
|
|
3
|
+
import { getMutationsPermissions, setMutationsPermissions } from "./modelRegistry";
|
|
4
|
+
import { registerQuery, getQueryName } from "./queryRegistry";
|
|
5
|
+
import { setEnvironment, setSchema } from "./state";
|
|
6
|
+
describe("usePermission _uid query identity", () => {
|
|
7
|
+
test("permission check fn ignores extra _uid in args", () => {
|
|
8
|
+
const testTable = table("testEntity").columns({
|
|
9
|
+
id: string(),
|
|
10
|
+
ownerId: string(),
|
|
11
|
+
active: boolean()
|
|
12
|
+
}).primaryKey("id");
|
|
13
|
+
setSchema({ tables: { testEntity: testTable }, version: 1 }), setEnvironment("client");
|
|
14
|
+
const fn = (args) => ({ objOrId: args.objOrId }), result1 = fn({ objOrId: "test-id", _uid: "user-A" }), result2 = fn({ objOrId: "test-id", _uid: "user-B" }), result3 = fn({ objOrId: "test-id" });
|
|
15
|
+
expect(result1.objOrId).toBe("test-id"), expect(result2.objOrId).toBe("test-id"), expect(result3.objOrId).toBe("test-id");
|
|
16
|
+
}), test("different _uid values produce different serialized args", () => {
|
|
17
|
+
const args1 = JSON.stringify({ objOrId: "server-1", _uid: "user-A" }), args2 = JSON.stringify({ objOrId: "server-1", _uid: "user-B" }), args3 = JSON.stringify({ objOrId: "server-1", _uid: "anon" });
|
|
18
|
+
expect(args1).not.toBe(args2), expect(args1).not.toBe(args3), expect(args2).not.toBe(args3);
|
|
19
|
+
}), test("same _uid produces stable query identity", () => {
|
|
20
|
+
const args1 = JSON.stringify({ objOrId: "server-1", _uid: "user-A" }), args2 = JSON.stringify({ objOrId: "server-1", _uid: "user-A" });
|
|
21
|
+
expect(args1).toBe(args2);
|
|
22
|
+
}), test("permission registration works for query lookup", () => {
|
|
23
|
+
const mockWhere = (eb, auth) => eb.cmp("ownerId", auth?.id || "");
|
|
24
|
+
setMutationsPermissions("testEntity", mockWhere);
|
|
25
|
+
const perm = getMutationsPermissions("testEntity");
|
|
26
|
+
expect(perm).toBeDefined(), expect(perm).toBe(mockWhere);
|
|
27
|
+
}), test("query name registration preserves permission namespace", () => {
|
|
28
|
+
const fn = () => {
|
|
29
|
+
};
|
|
30
|
+
registerQuery(fn, "permission.testEntity"), expect(getQueryName(fn)).toBe("permission.testEntity");
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=usePermission.test.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/usePermission.test.ts"],
|
|
4
|
+
"mappings": "AAAA,SAAS,SAAS,QAAQ,aAAa;AACvC,SAAS,UAAU,QAAQ,YAAY;AAEvC,SAAS,yBAAyB,+BAA+B;AACjE,SAAS,eAAe,oBAAoB;AAC5C,SAAS,gBAAgB,iBAAiB;AAE1C,SAAS,qCAAqC,MAAM;AAUlD,OAAK,kDAAkD,MAAM;AAE3D,UAAM,YAAY,MAAM,YAAY,EACjC,QAAQ;AAAA,MACP,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,QAAQ,QAAQ;AAAA,IAClB,CAAC,EACA,WAAW,IAAI;AAElB,cAAU,EAAE,QAAQ,EAAE,YAAY,UAAU,GAAG,SAAS,EAAE,CAAQ,GAClE,eAAe,QAAQ;AAIvB,UAAM,KAAK,CAAC,UAEH,EAAE,SAAS,KAAK,QAAQ,IAG3B,UAAU,GAAG,EAAE,SAAS,WAAW,MAAM,SAAS,CAAC,GACnD,UAAU,GAAG,EAAE,SAAS,WAAW,MAAM,SAAS,CAAC,GACnD,UAAU,GAAG,EAAE,SAAS,UAAU,CAAC;AAGzC,WAAO,QAAQ,OAAO,EAAE,KAAK,SAAS,GACtC,OAAO,QAAQ,OAAO,EAAE,KAAK,SAAS,GACtC,OAAO,QAAQ,OAAO,EAAE,KAAK,SAAS;AAAA,EACxC,CAAC,GAED,KAAK,2DAA2D,MAAM;AAGpE,UAAM,QAAQ,KAAK,UAAU,EAAE,SAAS,YAAY,MAAM,SAAS,CAAC,GAC9D,QAAQ,KAAK,UAAU,EAAE,SAAS,YAAY,MAAM,SAAS,CAAC,GAC9D,QAAQ,KAAK,UAAU,EAAE,SAAS,YAAY,MAAM,OAAO,CAAC;AAElE,WAAO,KAAK,EAAE,IAAI,KAAK,KAAK,GAC5B,OAAO,KAAK,EAAE,IAAI,KAAK,KAAK,GAC5B,OAAO,KAAK,EAAE,IAAI,KAAK,KAAK;AAAA,EAC9B,CAAC,GAED,KAAK,4CAA4C,MAAM;AAErD,UAAM,QAAQ,KAAK,UAAU,EAAE,SAAS,YAAY,MAAM,SAAS,CAAC,GAC9D,QAAQ,KAAK,UAAU,EAAE,SAAS,YAAY,MAAM,SAAS,CAAC;AAEpE,WAAO,KAAK,EAAE,KAAK,KAAK;AAAA,EAC1B,CAAC,GAED,KAAK,kDAAkD,MAAM;AAE3D,UAAM,YAAY,CAAC,IAAS,SAAc,GAAG,IAAI,WAAW,MAAM,MAAM,EAAE;AAC1E,4BAAwB,cAAc,SAAgB;AAEtD,UAAM,OAAO,wBAAwB,YAAY;AACjD,WAAO,IAAI,EAAE,YAAY,GACzB,OAAO,IAAI,EAAE,KAAK,SAAS;AAAA,EAC7B,CAAC,GAED,KAAK,0DAA0D,MAAM;AACnE,UAAM,KAAK,MAAM;AAAA,IAAC;AAClB,kBAAc,IAAI,uBAAuB,GAEzC,OAAO,aAAa,EAAE,CAAC,EAAE,KAAK,uBAAuB;AAAA,EACvD,CAAC;AACH,CAAC;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { boolean, string, table } from "@rocicorp/zero";
|
|
2
|
+
import { describe, expect, test } from "vitest";
|
|
3
|
+
import { getMutationsPermissions, setMutationsPermissions } from "./modelRegistry.mjs";
|
|
4
|
+
import { registerQuery, getQueryName } from "./queryRegistry.mjs";
|
|
5
|
+
import { setEnvironment, setSchema } from "./state.mjs";
|
|
6
|
+
describe("usePermission _uid query identity", () => {
|
|
7
|
+
test("permission check fn ignores extra _uid in args", () => {
|
|
8
|
+
const testTable = table("testEntity").columns({
|
|
9
|
+
id: string(),
|
|
10
|
+
ownerId: string(),
|
|
11
|
+
active: boolean()
|
|
12
|
+
}).primaryKey("id");
|
|
13
|
+
setSchema({
|
|
14
|
+
tables: {
|
|
15
|
+
testEntity: testTable
|
|
16
|
+
},
|
|
17
|
+
version: 1
|
|
18
|
+
}), setEnvironment("client");
|
|
19
|
+
const fn = args => ({
|
|
20
|
+
objOrId: args.objOrId
|
|
21
|
+
}),
|
|
22
|
+
result1 = fn({
|
|
23
|
+
objOrId: "test-id",
|
|
24
|
+
_uid: "user-A"
|
|
25
|
+
}),
|
|
26
|
+
result2 = fn({
|
|
27
|
+
objOrId: "test-id",
|
|
28
|
+
_uid: "user-B"
|
|
29
|
+
}),
|
|
30
|
+
result3 = fn({
|
|
31
|
+
objOrId: "test-id"
|
|
32
|
+
});
|
|
33
|
+
expect(result1.objOrId).toBe("test-id"), expect(result2.objOrId).toBe("test-id"), expect(result3.objOrId).toBe("test-id");
|
|
34
|
+
}), test("different _uid values produce different serialized args", () => {
|
|
35
|
+
const args1 = JSON.stringify({
|
|
36
|
+
objOrId: "server-1",
|
|
37
|
+
_uid: "user-A"
|
|
38
|
+
}),
|
|
39
|
+
args2 = JSON.stringify({
|
|
40
|
+
objOrId: "server-1",
|
|
41
|
+
_uid: "user-B"
|
|
42
|
+
}),
|
|
43
|
+
args3 = JSON.stringify({
|
|
44
|
+
objOrId: "server-1",
|
|
45
|
+
_uid: "anon"
|
|
46
|
+
});
|
|
47
|
+
expect(args1).not.toBe(args2), expect(args1).not.toBe(args3), expect(args2).not.toBe(args3);
|
|
48
|
+
}), test("same _uid produces stable query identity", () => {
|
|
49
|
+
const args1 = JSON.stringify({
|
|
50
|
+
objOrId: "server-1",
|
|
51
|
+
_uid: "user-A"
|
|
52
|
+
}),
|
|
53
|
+
args2 = JSON.stringify({
|
|
54
|
+
objOrId: "server-1",
|
|
55
|
+
_uid: "user-A"
|
|
56
|
+
});
|
|
57
|
+
expect(args1).toBe(args2);
|
|
58
|
+
}), test("permission registration works for query lookup", () => {
|
|
59
|
+
const mockWhere = (eb, auth) => eb.cmp("ownerId", auth?.id || "");
|
|
60
|
+
setMutationsPermissions("testEntity", mockWhere);
|
|
61
|
+
const perm = getMutationsPermissions("testEntity");
|
|
62
|
+
expect(perm).toBeDefined(), expect(perm).toBe(mockWhere);
|
|
63
|
+
}), test("query name registration preserves permission namespace", () => {
|
|
64
|
+
const fn = () => {};
|
|
65
|
+
registerQuery(fn, "permission.testEntity"), expect(getQueryName(fn)).toBe("permission.testEntity");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=usePermission.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["boolean","string","table","describe","expect","test","getMutationsPermissions","setMutationsPermissions","registerQuery","getQueryName","setEnvironment","setSchema","testTable","columns","id","ownerId","active","primaryKey","tables","testEntity","version","fn","args","objOrId","result1","_uid","result2","result3","toBe","args1","JSON","stringify","args2","args3","not","mockWhere","eb","auth","cmp","perm","toBeDefined"],"sources":["../../src/usePermission.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { boolean, string, table } from "@rocicorp/zero";
|
|
2
|
+
import { describe, expect, test } from "vitest";
|
|
3
|
+
import { getMutationsPermissions, setMutationsPermissions } from "./modelRegistry.native.js";
|
|
4
|
+
import { registerQuery, getQueryName } from "./queryRegistry.native.js";
|
|
5
|
+
import { setEnvironment, setSchema } from "./state.native.js";
|
|
6
|
+
describe("usePermission _uid query identity", function () {
|
|
7
|
+
test("permission check fn ignores extra _uid in args", function () {
|
|
8
|
+
var testTable = table("testEntity").columns({
|
|
9
|
+
id: string(),
|
|
10
|
+
ownerId: string(),
|
|
11
|
+
active: boolean()
|
|
12
|
+
}).primaryKey("id");
|
|
13
|
+
setSchema({
|
|
14
|
+
tables: {
|
|
15
|
+
testEntity: testTable
|
|
16
|
+
},
|
|
17
|
+
version: 1
|
|
18
|
+
}), setEnvironment("client");
|
|
19
|
+
var fn = function (args) {
|
|
20
|
+
return {
|
|
21
|
+
objOrId: args.objOrId
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
result1 = fn({
|
|
25
|
+
objOrId: "test-id",
|
|
26
|
+
_uid: "user-A"
|
|
27
|
+
}),
|
|
28
|
+
result2 = fn({
|
|
29
|
+
objOrId: "test-id",
|
|
30
|
+
_uid: "user-B"
|
|
31
|
+
}),
|
|
32
|
+
result3 = fn({
|
|
33
|
+
objOrId: "test-id"
|
|
34
|
+
});
|
|
35
|
+
expect(result1.objOrId).toBe("test-id"), expect(result2.objOrId).toBe("test-id"), expect(result3.objOrId).toBe("test-id");
|
|
36
|
+
}), test("different _uid values produce different serialized args", function () {
|
|
37
|
+
var args1 = JSON.stringify({
|
|
38
|
+
objOrId: "server-1",
|
|
39
|
+
_uid: "user-A"
|
|
40
|
+
}),
|
|
41
|
+
args2 = JSON.stringify({
|
|
42
|
+
objOrId: "server-1",
|
|
43
|
+
_uid: "user-B"
|
|
44
|
+
}),
|
|
45
|
+
args3 = JSON.stringify({
|
|
46
|
+
objOrId: "server-1",
|
|
47
|
+
_uid: "anon"
|
|
48
|
+
});
|
|
49
|
+
expect(args1).not.toBe(args2), expect(args1).not.toBe(args3), expect(args2).not.toBe(args3);
|
|
50
|
+
}), test("same _uid produces stable query identity", function () {
|
|
51
|
+
var args1 = JSON.stringify({
|
|
52
|
+
objOrId: "server-1",
|
|
53
|
+
_uid: "user-A"
|
|
54
|
+
}),
|
|
55
|
+
args2 = JSON.stringify({
|
|
56
|
+
objOrId: "server-1",
|
|
57
|
+
_uid: "user-A"
|
|
58
|
+
});
|
|
59
|
+
expect(args1).toBe(args2);
|
|
60
|
+
}), test("permission registration works for query lookup", function () {
|
|
61
|
+
var mockWhere = function (eb, auth) {
|
|
62
|
+
return eb.cmp("ownerId", auth?.id || "");
|
|
63
|
+
};
|
|
64
|
+
setMutationsPermissions("testEntity", mockWhere);
|
|
65
|
+
var perm = getMutationsPermissions("testEntity");
|
|
66
|
+
expect(perm).toBeDefined(), expect(perm).toBe(mockWhere);
|
|
67
|
+
}), test("query name registration preserves permission namespace", function () {
|
|
68
|
+
var fn = function () {};
|
|
69
|
+
registerQuery(fn, "permission.testEntity"), expect(getQueryName(fn)).toBe("permission.testEntity");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=usePermission.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["boolean","string","table","describe","expect","test","getMutationsPermissions","setMutationsPermissions","registerQuery","getQueryName","setEnvironment","setSchema","testTable","columns","id","ownerId","active","primaryKey","tables","testEntity","version","fn","args","objOrId","result1","_uid","result2","result3","toBe"],"sources":["../../src/usePermission.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAA,EAASC,MAAA,EAAQC,KAAA,QAAa;AACvC,SAASC,QAAA,EAAUC,MAAA,EAAQC,IAAA,QAAY;AAEvC,SAASC,uBAAA,EAAyBC,uBAAA,QAA+B;AACjE,SAASC,aAAA,EAAeC,YAAA,QAAoB;AAC5C,SAASC,cAAA,EAAgBC,SAAA,QAAiB;AAE1CR,QAAA,CAAS,qCAAqC,YAAM;EAUlDE,IAAA,CAAK,kDAAkD,YAAM;IAE3D,IAAAO,SAAM,GAAAV,KAAY,aAAM,EAAYW,OACjC;MACCC,EAAA,EAAIb,MAAA,CAAO;MACXc,OAAA,EAASd,MAAA,CAAO;MAChBe,MAAA,EAAQhB,OAAA,CAAQ;IAClB,CAAC,EACAiB,UAAA,CAAW,IAAI;IAElBN,SAAA,CAAU;MAKVO,MAAM;QAUNC,UAAO,EAAQP;MAKjB;MAGEQ,OAAM;IAIN,IAAAV,cAAkB,SAAK,CAAK;IAG7B,IAEDW,EAAA,GAAK,SAAAA,CAAAC,IAAA;QAEH,OAAM;UAGNC,OAAO,EAAKD,IAAE,CAAAC;QAGhB;MAEE;MAAAC,OAAM,GAAAH,EAAA;QACNE,OAAA;QAEAE,IAAM;MACN;MAAAC,OAAW,GAAEL,EAAA;QAIfE,OAAK;QACHE,IAAM;MAAY;MAAAE,OAAA,GAAAN,EAAA;QAClBE,OAAA;MAGD;IACFnB,MAAA,CAAAoB,OAAA,CAAAD,OAAA,EAAAK,IAAA,aAAAxB,MAAA,CAAAsB,OAAA,CAAAH,OAAA,EAAAK,IAAA,aAAAxB,MAAA,CAAAuB,OAAA,CAAAJ,OAAA,EAAAK,IAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "on-zero",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.49",
|
|
4
4
|
"description": "A typed layer over @rocicorp/zero with queries, mutations, and permissions",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@take-out/helpers": "0.1.
|
|
74
|
+
"@take-out/helpers": "0.1.49",
|
|
75
75
|
"@sinclair/typebox-codegen": "^0.11.1",
|
|
76
76
|
"chokidar": "^4.0.3",
|
|
77
77
|
"citty": "^0.1.6",
|
package/src/createZeroClient.tsx
CHANGED
|
@@ -19,7 +19,7 @@ import { getAllMutationsPermissions, getMutationsPermissions } from './modelRegi
|
|
|
19
19
|
import { registerQuery } from './queryRegistry'
|
|
20
20
|
import { resolveQuery, type PlainQueryFn } from './resolveQuery'
|
|
21
21
|
import { setCustomQueries } from './run'
|
|
22
|
-
import { setAuthData, setEnvironment, setSchema } from './state'
|
|
22
|
+
import { getEnvironment, setAuthData, setEnvironment, setSchema } from './state'
|
|
23
23
|
import { getRawWhere, setEvaluatingPermission } from './where'
|
|
24
24
|
import { setRunner } from './zeroRunner'
|
|
25
25
|
import { zql } from './zql'
|
|
@@ -56,7 +56,12 @@ export function createZeroClient<
|
|
|
56
56
|
type TableName = keyof Schema['tables'] & string
|
|
57
57
|
|
|
58
58
|
setSchema(schema)
|
|
59
|
-
|
|
59
|
+
|
|
60
|
+
// only set environment to 'client' if server hasn't already claimed it
|
|
61
|
+
// (during SSR, createZeroServer runs first and sets 'server')
|
|
62
|
+
if (getEnvironment() === null) {
|
|
63
|
+
setEnvironment('client')
|
|
64
|
+
}
|
|
60
65
|
|
|
61
66
|
const permissionsHelpers = createPermissions<Schema>({
|
|
62
67
|
schema,
|
|
@@ -196,9 +201,14 @@ export function createZeroClient<
|
|
|
196
201
|
const tableStr = table as string
|
|
197
202
|
const checkFn = permissionCheckFns[tableStr]
|
|
198
203
|
|
|
204
|
+
// include auth user ID in query args so zero-cache creates per-user
|
|
205
|
+
// permission views (prevents dedup across different auth contexts)
|
|
206
|
+
const auth = getAuth()
|
|
207
|
+
const _uid = auth?.id || 'anon'
|
|
208
|
+
|
|
199
209
|
const [data, status] = useQuery(
|
|
200
210
|
checkFn as any,
|
|
201
|
-
{ objOrId: objOrId as any },
|
|
211
|
+
{ objOrId: objOrId as any, _uid },
|
|
202
212
|
{ enabled: Boolean(!disableMode && enabled && objOrId && checkFn) }
|
|
203
213
|
)
|
|
204
214
|
|
package/src/createZeroServer.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { runWithQueryContext } from './helpers/queryContext'
|
|
|
17
17
|
import { getMutationsPermissions } from './modelRegistry'
|
|
18
18
|
import { setCustomQueries } from './run'
|
|
19
19
|
import { getZQL, setEnvironment, setSchema } from './state'
|
|
20
|
+
import { setEvaluatingPermission } from './where'
|
|
20
21
|
import { setRunner } from './zeroRunner'
|
|
21
22
|
|
|
22
23
|
import type {
|
|
@@ -225,17 +226,24 @@ export function createZeroServer<
|
|
|
225
226
|
if (!perm) {
|
|
226
227
|
throw new Error(`[permission] no permission defined for table: ${table}`)
|
|
227
228
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
229
|
+
// wrap with setEvaluatingPermission so serverWhere evaluates
|
|
230
|
+
// even when environment is 'client' (SSR hydration)
|
|
231
|
+
setEvaluatingPermission(true)
|
|
232
|
+
try {
|
|
233
|
+
return (getZQL() as any)[table]
|
|
234
|
+
.where((eb: any) => {
|
|
235
|
+
return permissions.buildPermissionQuery(
|
|
236
|
+
authData,
|
|
237
|
+
eb,
|
|
238
|
+
perm,
|
|
239
|
+
objOrId,
|
|
240
|
+
table
|
|
241
|
+
)
|
|
242
|
+
})
|
|
243
|
+
.one()
|
|
244
|
+
} finally {
|
|
245
|
+
setEvaluatingPermission(false)
|
|
246
|
+
}
|
|
239
247
|
}
|
|
240
248
|
|
|
241
249
|
// run validation hook if provided (must be sync - throw to reject)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { describe, expect, test, beforeEach } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { serverWhere } from './serverWhere'
|
|
4
|
+
import { getEnvironment, setEnvironment } from './state'
|
|
5
|
+
import { setEvaluatingPermission } from './where'
|
|
6
|
+
|
|
7
|
+
// mock expression builder that tracks what was called
|
|
8
|
+
function createMockEB() {
|
|
9
|
+
const calls: string[] = []
|
|
10
|
+
return {
|
|
11
|
+
calls,
|
|
12
|
+
and: () => {
|
|
13
|
+
calls.push('and()')
|
|
14
|
+
return { type: 'noop' }
|
|
15
|
+
},
|
|
16
|
+
cmp: (field: string, value: any) => {
|
|
17
|
+
calls.push(`cmp(${field}, ${value})`)
|
|
18
|
+
return { type: 'condition', field, value }
|
|
19
|
+
},
|
|
20
|
+
cmpLit: (a: any, op: string, b: any) => {
|
|
21
|
+
calls.push(`cmpLit(${a}, ${op}, ${b})`)
|
|
22
|
+
return { type: 'literal', a, op, b }
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe('serverWhere SSR behavior', () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
// reset state before each test
|
|
30
|
+
;(globalThis as any)[Symbol.for('on-zero:state')] = null
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test('serverWhere returns no-op on client environment', () => {
|
|
34
|
+
setEnvironment('client')
|
|
35
|
+
|
|
36
|
+
const whereFn = serverWhere('post', (eb) => eb.cmp('ownerId', 'user-123'))
|
|
37
|
+
const eb = createMockEB()
|
|
38
|
+
const result = whereFn(eb as any, { id: 'user-123' })
|
|
39
|
+
|
|
40
|
+
// on client, should return no-op (and())
|
|
41
|
+
expect(eb.calls).toContain('and()')
|
|
42
|
+
expect(result).toEqual({ type: 'noop' })
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test('serverWhere evaluates condition on server environment', () => {
|
|
46
|
+
setEnvironment('server')
|
|
47
|
+
|
|
48
|
+
const whereFn = serverWhere('post', (eb) => eb.cmp('ownerId', 'user-123'))
|
|
49
|
+
const eb = createMockEB()
|
|
50
|
+
const result = whereFn(eb as any, { id: 'user-123' })
|
|
51
|
+
|
|
52
|
+
// on server, should evaluate the actual condition
|
|
53
|
+
expect(eb.calls).toContain('cmp(ownerId, user-123)')
|
|
54
|
+
expect(result).toEqual({ type: 'condition', field: 'ownerId', value: 'user-123' })
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('serverWhere evaluates when _evaluatingPermission is true (even on client)', () => {
|
|
58
|
+
setEnvironment('client')
|
|
59
|
+
|
|
60
|
+
const whereFn = serverWhere('post', (eb) => eb.cmp('ownerId', 'user-123'))
|
|
61
|
+
const eb = createMockEB()
|
|
62
|
+
|
|
63
|
+
setEvaluatingPermission(true)
|
|
64
|
+
try {
|
|
65
|
+
const result = whereFn(eb as any, { id: 'user-123' })
|
|
66
|
+
|
|
67
|
+
// even on client, should evaluate when evaluating permission
|
|
68
|
+
expect(eb.calls).toContain('cmp(ownerId, user-123)')
|
|
69
|
+
expect(result).toEqual({ type: 'condition', field: 'ownerId', value: 'user-123' })
|
|
70
|
+
} finally {
|
|
71
|
+
setEvaluatingPermission(false)
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
test('environment stays server when already set (SSR scenario)', () => {
|
|
76
|
+
// simulate SSR: server sets environment first
|
|
77
|
+
setEnvironment('server')
|
|
78
|
+
expect(getEnvironment()).toBe('server')
|
|
79
|
+
|
|
80
|
+
// simulate createZeroClient being called during SSR
|
|
81
|
+
// (it should NOT overwrite to 'client' when environment is already set)
|
|
82
|
+
if (getEnvironment() === null) {
|
|
83
|
+
setEnvironment('client')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// environment should still be 'server'
|
|
87
|
+
expect(getEnvironment()).toBe('server')
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
test('environment defaults to client when not set by server', () => {
|
|
91
|
+
// simulate pure client: no server ran first
|
|
92
|
+
expect(getEnvironment()).toBe(null)
|
|
93
|
+
|
|
94
|
+
// createZeroClient sets environment when null
|
|
95
|
+
if (getEnvironment() === null) {
|
|
96
|
+
setEnvironment('client')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
expect(getEnvironment()).toBe('client')
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
test('nested serverWhere calls evaluate during permission check', () => {
|
|
103
|
+
setEnvironment('client')
|
|
104
|
+
|
|
105
|
+
// outer permission check uses serverWhere
|
|
106
|
+
const outerWhere = serverWhere('post', (eb) => eb.cmp('ownerId', 'user-123'))
|
|
107
|
+
// nested serverWhere inside (simulates complex permission logic)
|
|
108
|
+
const nestedWhere = serverWhere('comment', (eb) => eb.cmp('postId', 'post-456'))
|
|
109
|
+
|
|
110
|
+
const eb = createMockEB()
|
|
111
|
+
|
|
112
|
+
// without evaluating permission flag, both return no-op
|
|
113
|
+
const result1 = outerWhere(eb as any, { id: 'user-123' })
|
|
114
|
+
expect(result1).toEqual({ type: 'noop' })
|
|
115
|
+
|
|
116
|
+
const eb2 = createMockEB()
|
|
117
|
+
// with evaluating permission flag, both should evaluate
|
|
118
|
+
setEvaluatingPermission(true)
|
|
119
|
+
try {
|
|
120
|
+
const result2 = outerWhere(eb2 as any, { id: 'user-123' })
|
|
121
|
+
expect(result2).toEqual({ type: 'condition', field: 'ownerId', value: 'user-123' })
|
|
122
|
+
|
|
123
|
+
const eb3 = createMockEB()
|
|
124
|
+
const result3 = nestedWhere(eb3 as any, { id: 'user-123' })
|
|
125
|
+
expect(result3).toEqual({ type: 'condition', field: 'postId', value: 'post-456' })
|
|
126
|
+
} finally {
|
|
127
|
+
setEvaluatingPermission(false)
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
})
|
package/src/state.ts
CHANGED
|
@@ -1,39 +1,53 @@
|
|
|
1
1
|
import { createBuilder, type Schema } from '@rocicorp/zero'
|
|
2
|
+
import { globalValue } from '@take-out/helpers'
|
|
2
3
|
|
|
3
4
|
import type { AuthData, QueryBuilder } from './types'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
type State = {
|
|
7
|
+
schema: Schema | null
|
|
8
|
+
zql: QueryBuilder | null
|
|
9
|
+
authData: AuthData | null | undefined
|
|
10
|
+
environment: 'client' | 'server' | null
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const getState = () =>
|
|
14
|
+
globalValue<State>('on-zero:state', () => ({
|
|
15
|
+
schema: null,
|
|
16
|
+
zql: null,
|
|
17
|
+
authData: undefined,
|
|
18
|
+
environment: null,
|
|
19
|
+
}))
|
|
9
20
|
|
|
10
21
|
const errMessage = `Haven't called createZeroClient or createZeroServer yet!`
|
|
11
22
|
|
|
12
23
|
export const getZQL = () => {
|
|
24
|
+
const { zql } = getState()
|
|
13
25
|
if (!zql) throw new Error(errMessage)
|
|
14
26
|
return zql
|
|
15
27
|
}
|
|
16
28
|
|
|
17
29
|
export const getSchema = () => {
|
|
30
|
+
const { schema } = getState()
|
|
18
31
|
if (!schema) throw new Error(errMessage)
|
|
19
32
|
return schema
|
|
20
33
|
}
|
|
21
34
|
|
|
22
35
|
export const setSchema = (_: Schema) => {
|
|
23
|
-
|
|
24
|
-
|
|
36
|
+
const state = getState()
|
|
37
|
+
state.schema = _
|
|
38
|
+
state.zql = createBuilder(_) as QueryBuilder
|
|
25
39
|
}
|
|
26
40
|
|
|
27
41
|
export const getAuthData = () => {
|
|
28
|
-
return authData || null
|
|
42
|
+
return getState().authData || null
|
|
29
43
|
}
|
|
30
44
|
|
|
31
45
|
export const setAuthData = (_: AuthData) => {
|
|
32
|
-
authData = _
|
|
46
|
+
getState().authData = _
|
|
33
47
|
}
|
|
34
48
|
|
|
35
|
-
export const getEnvironment = () => environment
|
|
49
|
+
export const getEnvironment = () => getState().environment
|
|
36
50
|
|
|
37
51
|
export const setEnvironment = (env: 'client' | 'server') => {
|
|
38
|
-
environment = env
|
|
52
|
+
getState().environment = env
|
|
39
53
|
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { boolean, string, table } from '@rocicorp/zero'
|
|
2
|
+
import { describe, expect, test } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import { getMutationsPermissions, setMutationsPermissions } from './modelRegistry'
|
|
5
|
+
import { registerQuery, getQueryName } from './queryRegistry'
|
|
6
|
+
import { setEnvironment, setSchema } from './state'
|
|
7
|
+
|
|
8
|
+
describe('usePermission _uid query identity', () => {
|
|
9
|
+
// the core bug: zero-cache deduplicates custom queries by name+args.
|
|
10
|
+
// without _uid in the args, permission queries for different users share
|
|
11
|
+
// the same identity and zero-cache returns stale results from a previous
|
|
12
|
+
// auth context (often anonymous/null).
|
|
13
|
+
//
|
|
14
|
+
// the fix adds _uid (auth user ID) to the query args in usePermission so
|
|
15
|
+
// each user gets a unique query identity. the _uid is ignored by both the
|
|
16
|
+
// client-side and server-side permission evaluation (they only read objOrId).
|
|
17
|
+
|
|
18
|
+
test('permission check fn ignores extra _uid in args', () => {
|
|
19
|
+
// setup minimal state for permission check
|
|
20
|
+
const testTable = table('testEntity')
|
|
21
|
+
.columns({
|
|
22
|
+
id: string(),
|
|
23
|
+
ownerId: string(),
|
|
24
|
+
active: boolean(),
|
|
25
|
+
})
|
|
26
|
+
.primaryKey('id')
|
|
27
|
+
|
|
28
|
+
setSchema({ tables: { testEntity: testTable }, version: 1 } as any)
|
|
29
|
+
setEnvironment('client')
|
|
30
|
+
|
|
31
|
+
// simulate what createPermissionCheckFn does:
|
|
32
|
+
// it reads args.objOrId and ignores anything else
|
|
33
|
+
const fn = (args: { objOrId: string | Record<string, any>; _uid?: string }) => {
|
|
34
|
+
// this mirrors the real fn - only objOrId is used
|
|
35
|
+
return { objOrId: args.objOrId }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const result1 = fn({ objOrId: 'test-id', _uid: 'user-A' })
|
|
39
|
+
const result2 = fn({ objOrId: 'test-id', _uid: 'user-B' })
|
|
40
|
+
const result3 = fn({ objOrId: 'test-id' })
|
|
41
|
+
|
|
42
|
+
// all return the same objOrId regardless of _uid
|
|
43
|
+
expect(result1.objOrId).toBe('test-id')
|
|
44
|
+
expect(result2.objOrId).toBe('test-id')
|
|
45
|
+
expect(result3.objOrId).toBe('test-id')
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test('different _uid values produce different serialized args', () => {
|
|
49
|
+
// zero-cache uses JSON-serialized args as part of the query identity
|
|
50
|
+
// different _uid values must produce different serialized forms
|
|
51
|
+
const args1 = JSON.stringify({ objOrId: 'server-1', _uid: 'user-A' })
|
|
52
|
+
const args2 = JSON.stringify({ objOrId: 'server-1', _uid: 'user-B' })
|
|
53
|
+
const args3 = JSON.stringify({ objOrId: 'server-1', _uid: 'anon' })
|
|
54
|
+
|
|
55
|
+
expect(args1).not.toBe(args2)
|
|
56
|
+
expect(args1).not.toBe(args3)
|
|
57
|
+
expect(args2).not.toBe(args3)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
test('same _uid produces stable query identity', () => {
|
|
61
|
+
// ensure the same user gets the same query identity (no re-fetching)
|
|
62
|
+
const args1 = JSON.stringify({ objOrId: 'server-1', _uid: 'user-A' })
|
|
63
|
+
const args2 = JSON.stringify({ objOrId: 'server-1', _uid: 'user-A' })
|
|
64
|
+
|
|
65
|
+
expect(args1).toBe(args2)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test('permission registration works for query lookup', () => {
|
|
69
|
+
// verify that permission where functions register correctly
|
|
70
|
+
const mockWhere = (eb: any, auth: any) => eb.cmp('ownerId', auth?.id || '')
|
|
71
|
+
setMutationsPermissions('testEntity', mockWhere as any)
|
|
72
|
+
|
|
73
|
+
const perm = getMutationsPermissions('testEntity')
|
|
74
|
+
expect(perm).toBeDefined()
|
|
75
|
+
expect(perm).toBe(mockWhere)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
test('query name registration preserves permission namespace', () => {
|
|
79
|
+
const fn = () => {}
|
|
80
|
+
registerQuery(fn, 'permission.testEntity')
|
|
81
|
+
|
|
82
|
+
expect(getQueryName(fn)).toBe('permission.testEntity')
|
|
83
|
+
})
|
|
84
|
+
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAQd,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAOhE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAClF,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEzF,KAAK,cAAc,GAAG;IAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAEvE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;AAMpF,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CAAA;AAEtF,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,EACA,MAAM,EACN,MAAM,EACN,cAAc,EACd,kBAAiC,GAClC,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,cAAc,CAAA;IAC9B,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC;;
|
|
1
|
+
{"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAQd,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAOhE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAClF,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEzF,KAAK,cAAc,GAAG;IAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAEvE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;AAMpF,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CAAA;AAEtF,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,EACA,MAAM,EACN,MAAM,EACN,cAAc,EACd,kBAAiC,GAClC,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,cAAc,CAAA;IAC9B,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC;;yEA4LI,IAAI,CAAC,WAAW,CAAC,MAAM,0BAAe,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG;QAClE,QAAQ,EAAE,SAAS,CAAA;QACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;QAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB;0DAgIE;QACD,QAAQ,EAAE,SAAS,CAAA;QACnB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;QAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;KACtC;;2BAvLQ,oCAAY,CAAC,MAAM,GAAG,EAAE,CAAC,WACvB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,yCAG9C,OAAO,GAAG,IAAI;;;SAyIA,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,MACxE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,UAC9C,IAAI,YACF,cAAc,GACvB;YAAE,OAAO,EAAE,MAAM,IAAI,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE;SAClC,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,MAClE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,YAC5C,cAAc,GACvB;YAAE,OAAO,EAAE,MAAM,IAAI,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE;;;SAejC,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,MACzE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,UAC9C,IAAI,GACX,UAAU,CAAC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;SACxB,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,MACnE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,GACrD,UAAU,CAAC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;;EA4B3C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverWhere.test.d.ts","sourceRoot":"","sources":["../src/serverWhere.test.ts"],"names":[],"mappings":""}
|
package/types/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAG3D,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAmBrD,eAAO,MAAM,MAAM,oBAIlB,CAAA;AAED,eAAO,MAAM,SAAS,cAIrB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,SAIlC,CAAA;AAED,eAAO,MAAM,WAAW,iBAEvB,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,GAAG,QAAQ,SAEtC,CAAA;AAED,eAAO,MAAM,cAAc,kCAA+B,CAAA;AAE1D,eAAO,MAAM,cAAc,GAAI,KAAK,QAAQ,GAAG,QAAQ,SAEtD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePermission.test.d.ts","sourceRoot":"","sources":["../src/usePermission.test.ts"],"names":[],"mappings":""}
|