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.
Files changed (68) hide show
  1. package/dist/cjs/createZeroClient.cjs +4 -2
  2. package/dist/cjs/createZeroClient.js +3 -3
  3. package/dist/cjs/createZeroClient.js.map +1 -1
  4. package/dist/cjs/createZeroClient.native.js +5 -2
  5. package/dist/cjs/createZeroClient.native.js.map +1 -1
  6. package/dist/cjs/createZeroServer.cjs +7 -1
  7. package/dist/cjs/createZeroServer.js +13 -8
  8. package/dist/cjs/createZeroServer.js.map +1 -1
  9. package/dist/cjs/createZeroServer.native.js +9 -3
  10. package/dist/cjs/createZeroServer.native.js.map +1 -1
  11. package/dist/cjs/serverWhere.test.cjs +106 -0
  12. package/dist/cjs/serverWhere.test.js +52 -0
  13. package/dist/cjs/serverWhere.test.js.map +6 -0
  14. package/dist/cjs/serverWhere.test.native.js +125 -0
  15. package/dist/cjs/serverWhere.test.native.js.map +1 -0
  16. package/dist/cjs/state.cjs +21 -11
  17. package/dist/cjs/state.js +15 -8
  18. package/dist/cjs/state.js.map +1 -1
  19. package/dist/cjs/state.native.js +23 -9
  20. package/dist/cjs/state.native.js.map +1 -1
  21. package/dist/cjs/usePermission.test.cjs +67 -0
  22. package/dist/cjs/usePermission.test.js +29 -0
  23. package/dist/cjs/usePermission.test.js.map +6 -0
  24. package/dist/cjs/usePermission.test.native.js +74 -0
  25. package/dist/cjs/usePermission.test.native.js.map +1 -0
  26. package/dist/esm/createZeroClient.js +4 -4
  27. package/dist/esm/createZeroClient.js.map +1 -1
  28. package/dist/esm/createZeroClient.mjs +5 -3
  29. package/dist/esm/createZeroClient.mjs.map +1 -1
  30. package/dist/esm/createZeroClient.native.js +6 -3
  31. package/dist/esm/createZeroClient.native.js.map +1 -1
  32. package/dist/esm/createZeroServer.js +13 -7
  33. package/dist/esm/createZeroServer.js.map +1 -1
  34. package/dist/esm/createZeroServer.mjs +7 -1
  35. package/dist/esm/createZeroServer.mjs.map +1 -1
  36. package/dist/esm/createZeroServer.native.js +9 -3
  37. package/dist/esm/createZeroServer.native.js.map +1 -1
  38. package/dist/esm/serverWhere.test.js +55 -0
  39. package/dist/esm/serverWhere.test.js.map +6 -0
  40. package/dist/esm/serverWhere.test.mjs +107 -0
  41. package/dist/esm/serverWhere.test.mjs.map +1 -0
  42. package/dist/esm/serverWhere.test.native.js +123 -0
  43. package/dist/esm/serverWhere.test.native.js.map +1 -0
  44. package/dist/esm/state.js +15 -7
  45. package/dist/esm/state.js.map +1 -1
  46. package/dist/esm/state.mjs +20 -10
  47. package/dist/esm/state.mjs.map +1 -1
  48. package/dist/esm/state.native.js +23 -9
  49. package/dist/esm/state.native.js.map +1 -1
  50. package/dist/esm/usePermission.test.js +33 -0
  51. package/dist/esm/usePermission.test.js.map +6 -0
  52. package/dist/esm/usePermission.test.mjs +68 -0
  53. package/dist/esm/usePermission.test.mjs.map +1 -0
  54. package/dist/esm/usePermission.test.native.js +72 -0
  55. package/dist/esm/usePermission.test.native.js.map +1 -0
  56. package/package.json +2 -2
  57. package/src/createZeroClient.tsx +13 -3
  58. package/src/createZeroServer.ts +19 -11
  59. package/src/serverWhere.test.ts +130 -0
  60. package/src/state.ts +24 -10
  61. package/src/usePermission.test.ts +84 -0
  62. package/types/createZeroClient.d.ts.map +1 -1
  63. package/types/createZeroServer.d.ts.map +1 -1
  64. package/types/serverWhere.test.d.ts +2 -0
  65. package/types/serverWhere.test.d.ts.map +1 -0
  66. package/types/state.d.ts.map +1 -1
  67. package/types/usePermission.test.d.ts +2 -0
  68. 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","_","getAuthData","setAuthData","getEnvironment"],"sources":["../../src/state.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,aAAA,QAAkC;AAI3C,IAAIC,MAAA,GAAwB;EACxBC,GAAA,GAA2B;EAC3BC,QAAA;EACAC,WAAA,GAA0C;EAAAC,UAAA;EAAAC,MAAA,YAAAA,CAAA;IAE9C,IAAM,CAAAJ,GAAA,YAAaK,KAAA,CAAAF,UAAA;IAGjB,OAAKH,GAAK;EACV;EAAAM,SAAO,YAAAA,CAAA;IACT,IAEa,CAAAP,MAAA,EAAY,MAAM,IAAAM,KAAA,CAAAF,UAAA;IAC7B,OAAKJ,MAAQ;EACb;EAAAQ,SAAO,YAAAA,CAAAC,CAAA;IACTT,MAEa,GAAAS,CAAA,EAAAR,GAAa,GAAAF,aAAc,CAAAU,CAAA;EACtC;EAAAC,WACA,YAAAA,CAAA,EAAM;IACR,OAEaR,QAAc,QAClB;EAIP;EAAAS,WAAW,YAAAA,CAAAF,CAAA;IACbP,QAEa,GAAAO,CAAA;EAGX;EAAAG,cAAc,YAAAA,CAAA;IAChB,OAAAT,WAAA","ignoreList":[]}
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.47",
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.47",
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",
@@ -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
- setEnvironment('client')
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
 
@@ -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
- return (getZQL() as any)[table]
229
- .where((eb: any) => {
230
- return permissions.buildPermissionQuery(
231
- authData,
232
- eb,
233
- perm,
234
- objOrId,
235
- table
236
- )
237
- })
238
- .one()
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
- let schema: Schema | null = null
6
- let zql: QueryBuilder | null = null
7
- let authData: AuthData | null | undefined
8
- let environment: 'client' | 'server' | null = null
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
- schema = _
24
- zql = createBuilder(_) as QueryBuilder
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":"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"}
1
+ {"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serverWhere.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverWhere.test.d.ts","sourceRoot":"","sources":["../src/serverWhere.test.ts"],"names":[],"mappings":""}
@@ -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;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AASrD,eAAO,MAAM,MAAM,oBAGlB,CAAA;AAED,eAAO,MAAM,SAAS,cAGrB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,SAGlC,CAAA;AAED,eAAO,MAAM,WAAW,iBAEvB,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,GAAG,QAAQ,SAEtC,CAAA;AAED,eAAO,MAAM,cAAc,kCAAoB,CAAA;AAE/C,eAAO,MAAM,cAAc,GAAI,KAAK,QAAQ,GAAG,QAAQ,SAEtD,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=usePermission.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePermission.test.d.ts","sourceRoot":"","sources":["../src/usePermission.test.ts"],"names":[],"mappings":""}