on-zero 0.16.16 → 0.16.17
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.httpAuth.test.cjs +5 -3
- package/dist/cjs/createZeroClient.httpAuth.test.native.js +3 -3
- package/dist/cjs/createZeroClient.httpAuth.test.native.js.map +1 -1
- package/dist/cjs/generate-helpers.cjs +21 -14
- package/dist/cjs/generate-helpers.native.js +50 -27
- package/dist/cjs/generate-helpers.native.js.map +1 -1
- package/dist/cjs/generate-helpers.test.cjs +146 -0
- package/dist/cjs/generate-helpers.test.native.js +149 -0
- package/dist/cjs/generate-helpers.test.native.js.map +1 -1
- package/dist/cjs/generate-lite.cjs +3 -3
- package/dist/cjs/generate-lite.native.js +5 -3
- package/dist/cjs/generate-lite.native.js.map +1 -1
- package/dist/cjs/generate-lite.test.cjs +56 -0
- package/dist/cjs/generate-lite.test.native.js +60 -0
- package/dist/cjs/generate-lite.test.native.js.map +1 -1
- package/dist/cjs/generate.cjs +37 -26
- package/dist/cjs/generate.native.js +58 -26
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/cjs/generate.test.cjs +109 -0
- package/dist/cjs/generate.test.native.js +115 -0
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/mutations.cjs +22 -11
- package/dist/cjs/mutations.native.js +42 -10
- package/dist/cjs/mutations.native.js.map +1 -1
- package/dist/cjs/mutations.test.cjs +228 -0
- package/dist/cjs/mutations.test.native.js +259 -0
- package/dist/cjs/mutations.test.native.js.map +1 -1
- package/dist/esm/createZeroClient.httpAuth.test.mjs +5 -3
- package/dist/esm/createZeroClient.httpAuth.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.httpAuth.test.native.js +3 -3
- package/dist/esm/createZeroClient.httpAuth.test.native.js.map +1 -1
- package/dist/esm/generate-helpers.mjs +21 -15
- package/dist/esm/generate-helpers.mjs.map +1 -1
- package/dist/esm/generate-helpers.native.js +50 -28
- package/dist/esm/generate-helpers.native.js.map +1 -1
- package/dist/esm/generate-helpers.test.mjs +122 -0
- package/dist/esm/generate-helpers.test.mjs.map +1 -1
- package/dist/esm/generate-helpers.test.native.js +125 -0
- package/dist/esm/generate-helpers.test.native.js.map +1 -1
- package/dist/esm/generate-lite.mjs +4 -4
- package/dist/esm/generate-lite.mjs.map +1 -1
- package/dist/esm/generate-lite.native.js +6 -4
- package/dist/esm/generate-lite.native.js.map +1 -1
- package/dist/esm/generate-lite.test.mjs +56 -0
- package/dist/esm/generate-lite.test.mjs.map +1 -1
- package/dist/esm/generate-lite.test.native.js +60 -0
- package/dist/esm/generate-lite.test.native.js.map +1 -1
- package/dist/esm/generate.mjs +38 -27
- package/dist/esm/generate.mjs.map +1 -1
- package/dist/esm/generate.native.js +59 -27
- package/dist/esm/generate.native.js.map +1 -1
- package/dist/esm/generate.test.mjs +86 -1
- package/dist/esm/generate.test.mjs.map +1 -1
- package/dist/esm/generate.test.native.js +92 -1
- package/dist/esm/generate.test.native.js.map +1 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/mutations.mjs +22 -11
- package/dist/esm/mutations.mjs.map +1 -1
- package/dist/esm/mutations.native.js +42 -10
- package/dist/esm/mutations.native.js.map +1 -1
- package/dist/esm/mutations.test.mjs +229 -1
- package/dist/esm/mutations.test.mjs.map +1 -1
- package/dist/esm/mutations.test.native.js +260 -1
- package/dist/esm/mutations.test.native.js.map +1 -1
- package/package.json +2 -2
- package/src/createZeroClient.httpAuth.test.ts +4 -5
- package/src/generate-helpers.test.ts +124 -0
- package/src/generate-helpers.ts +43 -27
- package/src/generate-lite.test.ts +53 -0
- package/src/generate-lite.ts +16 -9
- package/src/generate.test.ts +92 -0
- package/src/generate.ts +60 -33
- package/src/mutations.test.ts +216 -1
- package/src/mutations.ts +39 -39
- package/types/generate-helpers.d.ts +3 -1
- package/types/generate-helpers.d.ts.map +1 -1
- package/types/generate-lite.d.ts +1 -0
- package/types/generate-lite.d.ts.map +1 -1
- package/types/generate.d.ts.map +1 -1
- package/types/mutations.d.ts +5 -2
- package/types/mutations.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["setMutationsPermissions","getSchema","getZQL","mutationRegistry","global","globalThis","__onZeroMutationRegistry__","Map","proxyRegistry","__onZeroProxyRegistry__","getOrCreateMutationProxy","tableName","implementations","crud","prior","get","action","set","existing","proxy","Proxy","_","key","ownKeys","current","Object","keys","getOwnPropertyDescriptor","enumerable","configurable","value","has","mutations","table","permissions","mutations2","options","schema","name","createCRUDMutation","customMutation","ctx","obj","environment","tables","primaryKey","where","tx","run","one","can","mutate","crudMutations","insert","update","delete","upsert","finalMutations"],"sources":["../../src/mutations.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,uBAAA,QAA+B;AACxC,SAASC,SAAA,EAAWC,MAAA,QAAc;AAoBlC,SAASC,iBAAA,EAA0D;EACjE,MAAMC,MAAA,GAASC,UAAA;EAGf,OAAQD,MAAA,CAAOE,0BAAA,KAA+B,mBAAIC,GAAA,CAAI;AACxD;AAEA,SAASC,cAAA,EAAkC;EACzC,MAAMJ,MAAA,GAASC,UAAA;EAGf,OAAQD,MAAA,CAAOK,uBAAA,KAA4B,mBAAIF,GAAA,CAAI;AACrD;AAIA,SAASG,yBACPC,SAAA,EACAC,eAAA,EACAC,IAAA,GAAO,MACJ;EAMH,MAAMC,KAAA,GAAQX,gBAAA,CAAiB,EAAEY,GAAA,CAAIJ,SAAS;EAC9C,IAAIG,KAAA,IAAS,CAACD,IAAA,EAAM;IAClB,WAAWG,MAAA,IAAU,CAAC,UAAU,UAAU,UAAU,QAAQ,GAAG;MAC7D,IAAI,EAAEA,MAAA,IAAUJ,eAAA,GAAkB,OAAOE,KAAA,CAAME,MAAM;IACvD;EACF;EACAb,gBAAA,CAAiB,EAAEc,GAAA,CACjBN,SAAA,EACAG,KAAA,GAAQ;IAAE,GAAGA,KAAA;IAAO,GAAGF;EAAgB,IAAIA,eAC7C;EAGA,MAAMM,QAAA,GAAWV,aAAA,CAAc,EAAEO,GAAA,CAAIJ,SAAS;EAC9C,IAAIO,QAAA,EAAU;IACZ,OAAOA,QAAA;EACT;EAGA,MAAMC,KAAA,GAAQ,IAAIC,KAAA,CAAM,CAAC,GAAQ;IAC/BL,IAAIM,CAAA,EAAGC,GAAA,EAAa;MAClB,OAAOnB,gBAAA,CAAiB,EAAEY,GAAA,CAAIJ,SAAS,IAAIW,GAAG;IAChD;IACAC,QAAA,EAAU;MACR,MAAMC,OAAA,GAAUrB,gBAAA,CAAiB,EAAEY,GAAA,CAAIJ,SAAS;MAChD,OAAOa,OAAA,GAAUC,MAAA,CAAOC,IAAA,CAAKF,OAAO,IAAI,EAAC;IAC3C;IACAG,yBAAyBN,CAAA,EAAGC,GAAA,EAAa;MACvC,MAAME,OAAA,GAAUrB,gBAAA,CAAiB,EAAEY,GAAA,CAAIJ,SAAS;MAChD,IAAIa,OAAA,IAAWF,GAAA,IAAOE,OAAA,EAAS;QAC7B,OAAO;UAAEI,UAAA,EAAY;UAAMC,YAAA,EAAc;UAAMC,KAAA,EAAON,OAAA,CAAQF,GAAG;QAAE;MACrE;IACF;IACAS,IAAIV,CAAA,EAAGC,GAAA,EAAa;MAClB,MAAME,OAAA,GAAUrB,gBAAA,CAAiB,EAAEY,GAAA,CAAIJ,SAAS;MAChD,OAAOa,OAAA,GAAUF,GAAA,IAAOE,OAAA,GAAU;IACpC;EACF,CAAC;EAEDhB,aAAA,CAAc,EAAES,GAAA,CAAIN,SAAA,EAAWQ,KAAK;EACpC,OAAOA,KAAA;AACT;AA8DO,SAASa,UAIdC,KAAA,EACAC,WAAA,EACAC,UAAA,EACAC,OAAA,EACW;EACX,IAAIF,WAAA,EAAa;IACf,MAAMvB,SAAA,GACJ,OAAOsB,KAAA,KAAU,WACZA,KAAA,GACCA,KAAA,CAAgBI,MAAA,CAAOC,IAAA;IAE/BtC,uBAAA,CAAwBW,SAAA,EAAWuB,WAAW;IAC9C,IAAIE,OAAA,EAASvB,IAAA,KAAS,OAAO;MAC3B,OAAOH,wBAAA,CAAyBC,SAAA,EAAWqB,UAAA,IAAa,CAAC,GAAG,KAAK;IACnE;IAEA,MAAMO,kBAAA,GAAsBvB,MAAA,IAAsB;MAChD,MAAMwB,cAAA,GAAiBR,UAAA,GAAYhB,MAAM;MACzC,IAAIwB,cAAA,EAAgB,OAAOA,cAAA;MAE3B,OAAO,OAAOC,GAAA,EAAqBC,GAAA,KAAa;QAG9C,IAAI1B,MAAA,KAAW,YAAYyB,GAAA,CAAIE,WAAA,KAAgB,UAAU;UACvD,IAAIzB,QAAA,GAAWhB,MAAA,CAAO,EAAES,SAAS;UACjC,WAAWW,GAAA,IAAOrB,SAAA,CAAU,EAAE2C,MAAA,CAAOjC,SAAS,EAAEkC,UAAA,EAAY;YAC1D3B,QAAA,GAAWA,QAAA,CAAS4B,KAAA,CAAMxB,GAAA,EAAKoB,GAAA,CAAIpB,GAAG,CAAC;UACzC;UACA,IAAI,MAAMmB,GAAA,CAAIM,EAAA,CAAGC,GAAA,CAAI9B,QAAA,CAAS+B,GAAA,CAAI,CAAC,GAAG;YACpC,MAAMR,GAAA,CAAIS,GAAA,CAAIhB,WAAA,EAAaQ,GAAG;UAChC;QACF,WAAW1B,MAAA,KAAW,YAAYA,MAAA,KAAW,UAAU;UACrD,MAAMyB,GAAA,CAAIS,GAAA,CAAIhB,WAAA,EAAaQ,GAAG;QAChC;QAGA,MAAMD,GAAA,CAAIM,EAAA,CAAGI,MAAA,CAAOxC,SAAsB,EAAGK,MAAM,EAAE0B,GAAG;QAExD,IAAI1B,MAAA,KAAW,UAAU;UACvB,MAAMyB,GAAA,CAAIS,GAAA,CAAIhB,WAAA,EAAaQ,GAAG;QAChC;MACF;IACF;IAEA,MAAMU,aAAA,GAAoC;MACxCC,MAAA,EAAQd,kBAAA,CAAmB,QAAQ;MACnCe,MAAA,EAAQf,kBAAA,CAAmB,QAAQ;MACnCgB,MAAA,EAAQhB,kBAAA,CAAmB,QAAQ;MACnCiB,MAAA,EAAQjB,kBAAA,CAAmB,QAAQ;IACrC;IAEA,MAAMkB,cAAA,GAAiB;MACrB,GAAGzB,UAAA;MAAA;MAEH,GAAGoB;IACL;IAGA,OAAO1C,wBAAA,CAAyBC,SAAA,EAAW8C,cAAc;EAC3D;EAGA,OAAOxB,KAAA;AACT","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IS_SERVER_RUNTIME } from "./helpers/platform.native.js";
|
|
2
1
|
import { setMutationsPermissions } from "./modelRegistry.native.js";
|
|
2
|
+
import { getSchema, getZQL } from "./state.native.js";
|
|
3
3
|
function mutationRegistry() {
|
|
4
4
|
var _global;
|
|
5
5
|
var global = globalThis;
|
|
@@ -11,7 +11,14 @@ function proxyRegistry() {
|
|
|
11
11
|
return (_global = global).__onZeroProxyRegistry__ || (_global.__onZeroProxyRegistry__ = /* @__PURE__ */new Map());
|
|
12
12
|
}
|
|
13
13
|
function getOrCreateMutationProxy(tableName, implementations) {
|
|
14
|
+
var crud = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
|
|
14
15
|
var prior = mutationRegistry().get(tableName);
|
|
16
|
+
if (prior && !crud) {
|
|
17
|
+
for (var _i = 0, _iter = ["insert", "update", "delete", "upsert"]; _i < _iter.length; _i++) {
|
|
18
|
+
var action = _iter[_i];
|
|
19
|
+
if (!(action in implementations)) delete prior[action];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
15
22
|
mutationRegistry().set(tableName, prior ? {
|
|
16
23
|
...prior,
|
|
17
24
|
...implementations
|
|
@@ -47,24 +54,50 @@ function getOrCreateMutationProxy(tableName, implementations) {
|
|
|
47
54
|
proxyRegistry().set(tableName, proxy);
|
|
48
55
|
return proxy;
|
|
49
56
|
}
|
|
50
|
-
function mutations(table, permissions, mutations2) {
|
|
57
|
+
function mutations(table, permissions, mutations2, options) {
|
|
51
58
|
if (permissions) {
|
|
52
59
|
var tableName = typeof table === "string" ? table : table.schema.name;
|
|
60
|
+
setMutationsPermissions(tableName, permissions);
|
|
61
|
+
if ((options === null || options === void 0 ? void 0 : options.crud) === false) {
|
|
62
|
+
return getOrCreateMutationProxy(tableName, mutations2 !== null && mutations2 !== void 0 ? mutations2 : {}, false);
|
|
63
|
+
}
|
|
53
64
|
var createCRUDMutation = function createCRUDMutation2(action) {
|
|
54
65
|
var customMutation = mutations2 === null || mutations2 === void 0 ? void 0 : mutations2[action];
|
|
55
66
|
if (customMutation) return customMutation;
|
|
56
67
|
return async function (ctx, obj) {
|
|
57
|
-
|
|
58
|
-
|
|
68
|
+
if (action === "upsert" && ctx.environment === "server") {
|
|
69
|
+
var existing = getZQL()[tableName];
|
|
70
|
+
var _iteratorNormalCompletion = true,
|
|
71
|
+
_didIteratorError = false,
|
|
72
|
+
_iteratorError = void 0;
|
|
73
|
+
try {
|
|
74
|
+
for (var _iterator = getSchema().tables[tableName].primaryKey[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
75
|
+
var key = _step.value;
|
|
76
|
+
existing = existing.where(key, obj[key]);
|
|
77
|
+
}
|
|
78
|
+
} catch (err) {
|
|
79
|
+
_didIteratorError = true;
|
|
80
|
+
_iteratorError = err;
|
|
81
|
+
} finally {
|
|
82
|
+
try {
|
|
83
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
84
|
+
_iterator.return();
|
|
85
|
+
}
|
|
86
|
+
} finally {
|
|
87
|
+
if (_didIteratorError) {
|
|
88
|
+
throw _iteratorError;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (await ctx.tx.run(existing.one())) {
|
|
59
93
|
await ctx.can(permissions, obj);
|
|
60
94
|
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
await runServerPermissionCheck();
|
|
95
|
+
} else if (action === "update" || action === "delete") {
|
|
96
|
+
await ctx.can(permissions, obj);
|
|
64
97
|
}
|
|
65
98
|
await ctx.tx.mutate[tableName][action](obj);
|
|
66
|
-
if (action
|
|
67
|
-
await
|
|
99
|
+
if (action !== "delete") {
|
|
100
|
+
await ctx.can(permissions, obj);
|
|
68
101
|
}
|
|
69
102
|
};
|
|
70
103
|
};
|
|
@@ -79,7 +112,6 @@ function mutations(table, permissions, mutations2) {
|
|
|
79
112
|
// generated CRUD fills missing operations; custom CRUD runs as-is
|
|
80
113
|
...crudMutations
|
|
81
114
|
};
|
|
82
|
-
setMutationsPermissions(tableName, permissions);
|
|
83
115
|
return getOrCreateMutationProxy(tableName, finalMutations);
|
|
84
116
|
}
|
|
85
117
|
return table;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["setMutationsPermissions","getSchema","getZQL","mutationRegistry","_global","global","globalThis","__onZeroMutationRegistry__","Map","proxyRegistry","__onZeroProxyRegistry__","getOrCreateMutationProxy","tableName","implementations","crud","arguments","length","prior","get","_i","_iter","action","set","existing","proxy","Proxy","_","key","_mutationRegistry_get","ownKeys","current","Object","keys","getOwnPropertyDescriptor","enumerable","configurable","value","has","mutations","table","permissions","mutations2","options","schema","name","createCRUDMutation","createCRUDMutation2","customMutation","ctx","obj","environment","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","tables","primaryKey","Symbol","iterator","_step","next","done","where","err","return"],"sources":["../../src/mutations.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,63 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { DatabaseSync } from "node:sqlite";
|
|
3
|
+
import { createSchema, string, table } from "@rocicorp/zero";
|
|
4
|
+
import { createSQLiteApplicationDatabase, createSyncExecutor } from "orez-lite";
|
|
5
|
+
import { createQueryCompiler } from "orez-lite/cloudflare/query-compiler";
|
|
6
|
+
import { executeTransactionQueryPlan } from "orez-lite/cloudflare/transaction-query";
|
|
7
|
+
import { afterAll, describe, expect, test, vi } from "vitest";
|
|
8
|
+
import { createZeroServerBindings, setupAsyncLocalStorage } from "./server.mjs";
|
|
9
|
+
import { getMutationsPermissions } from "./modelRegistry.mjs";
|
|
2
10
|
import { mutations } from "./mutations.mjs";
|
|
3
11
|
import { serverWhere } from "./serverWhere.mjs";
|
|
12
|
+
const previousEnvironment = vi.hoisted(() => {
|
|
13
|
+
const previous = process.env.VITE_ENVIRONMENT;
|
|
14
|
+
process.env.VITE_ENVIRONMENT = "client";
|
|
15
|
+
return previous;
|
|
16
|
+
});
|
|
17
|
+
afterAll(() => {
|
|
18
|
+
if (previousEnvironment === void 0) delete process.env.VITE_ENVIRONMENT;else process.env.VITE_ENVIRONMENT = previousEnvironment;
|
|
19
|
+
});
|
|
4
20
|
describe("mutations registry", () => {
|
|
21
|
+
test("explicit opt-out removes generated CRUD from existing proxies and retains permissions", async () => {
|
|
22
|
+
const record = table("closedRecord").columns({
|
|
23
|
+
id: string()
|
|
24
|
+
}).primaryKey("id");
|
|
25
|
+
const permission = serverWhere("closedRecord", () => true);
|
|
26
|
+
const first = mutations(record, permission);
|
|
27
|
+
expect(Object.keys(first).sort()).toEqual(["delete", "insert", "update", "upsert"]);
|
|
28
|
+
const custom = vi.fn(async () => {});
|
|
29
|
+
const closed = mutations(record, permission, {
|
|
30
|
+
custom
|
|
31
|
+
}, {
|
|
32
|
+
crud: false
|
|
33
|
+
});
|
|
34
|
+
expect(closed).toBe(first);
|
|
35
|
+
expect(Object.keys(closed)).toEqual(["custom"]);
|
|
36
|
+
expect("insert" in closed).toBe(false);
|
|
37
|
+
expect(Reflect.get(closed, "upsert")).toBeUndefined();
|
|
38
|
+
expect(getMutationsPermissions("closedRecord")).toBe(permission);
|
|
39
|
+
await closed.custom();
|
|
40
|
+
expect(custom).toHaveBeenCalledOnce();
|
|
41
|
+
const reopened = mutations(record, permission, {}, {
|
|
42
|
+
crud: true
|
|
43
|
+
});
|
|
44
|
+
expect(Object.keys(reopened).sort()).toEqual(["custom", "delete", "insert", "update", "upsert"]);
|
|
45
|
+
});
|
|
46
|
+
test("opt-out preserves explicitly declared CRUD handlers", async () => {
|
|
47
|
+
const record = table("customRecord").columns({
|
|
48
|
+
id: string()
|
|
49
|
+
}).primaryKey("id");
|
|
50
|
+
const permission = serverWhere("customRecord", () => true);
|
|
51
|
+
const insert = vi.fn(async () => {});
|
|
52
|
+
const custom = mutations(record, permission, {
|
|
53
|
+
insert
|
|
54
|
+
}, {
|
|
55
|
+
crud: false
|
|
56
|
+
});
|
|
57
|
+
expect(Object.keys(custom)).toEqual(["insert"]);
|
|
58
|
+
await custom.insert();
|
|
59
|
+
expect(insert).toHaveBeenCalledOnce();
|
|
60
|
+
});
|
|
5
61
|
test("re-registering a handler replaces it per key (HMR)", () => {
|
|
6
62
|
const permissions = serverWhere("post", () => true);
|
|
7
63
|
const v1 = async () => {};
|
|
@@ -15,4 +71,176 @@ describe("mutations registry", () => {
|
|
|
15
71
|
expect(proxy.custom).toBe(v2);
|
|
16
72
|
});
|
|
17
73
|
});
|
|
74
|
+
describe("generated CRUD authorization", () => {
|
|
75
|
+
test("authorizes both sides of composite-key writes through the server executor", async () => {
|
|
76
|
+
setupAsyncLocalStorage(AsyncLocalStorage);
|
|
77
|
+
const document = table("document").columns({
|
|
78
|
+
workspace: string(),
|
|
79
|
+
id: string(),
|
|
80
|
+
ownerId: string(),
|
|
81
|
+
title: string()
|
|
82
|
+
}).primaryKey("workspace", "id");
|
|
83
|
+
const schema = createSchema({
|
|
84
|
+
tables: [document],
|
|
85
|
+
relationships: [],
|
|
86
|
+
enableLegacyQueries: true
|
|
87
|
+
});
|
|
88
|
+
const sqlite = new DatabaseSync(":memory:");
|
|
89
|
+
sqlite.exec("CREATE TABLE document (workspace TEXT, id TEXT, ownerId TEXT, title TEXT, PRIMARY KEY (workspace, id))");
|
|
90
|
+
const compile = createQueryCompiler(schema);
|
|
91
|
+
const query = async (sql, params = []) => sqlite.prepare(sql).all(...params.map(value => value));
|
|
92
|
+
const tx = {
|
|
93
|
+
query,
|
|
94
|
+
exec: async (sql, params = []) => ({
|
|
95
|
+
changes: Number(sqlite.prepare(sql).run(...params.map(value => value)).changes)
|
|
96
|
+
}),
|
|
97
|
+
queryAst: async (ast, format, queryName) => executeTransactionQueryPlan(compile(ast, format), (sql, params) => sqlite.prepare(sql).all(...params.map(value => value)), {
|
|
98
|
+
queryName
|
|
99
|
+
})
|
|
100
|
+
};
|
|
101
|
+
const database = createSQLiteApplicationDatabase({
|
|
102
|
+
query,
|
|
103
|
+
transaction: async work => {
|
|
104
|
+
sqlite.exec("BEGIN");
|
|
105
|
+
try {
|
|
106
|
+
const result = await work(tx);
|
|
107
|
+
sqlite.exec("COMMIT");
|
|
108
|
+
return result;
|
|
109
|
+
} catch (error) {
|
|
110
|
+
sqlite.exec("ROLLBACK");
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const permission = serverWhere("document", (eb, auth2) => eb.cmp("ownerId", auth2 && "id" in auth2 && typeof auth2.id === "string" ? auth2.id : ""));
|
|
116
|
+
const bindings = createZeroServerBindings({
|
|
117
|
+
schema,
|
|
118
|
+
models: {
|
|
119
|
+
document: {
|
|
120
|
+
mutate: mutations(document, permission)
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
createServerActions: () => ({})
|
|
124
|
+
});
|
|
125
|
+
const executor = createSyncExecutor({
|
|
126
|
+
database,
|
|
127
|
+
schema,
|
|
128
|
+
mutators: bindings.mutators,
|
|
129
|
+
effects: {
|
|
130
|
+
runBackground: promise => promise,
|
|
131
|
+
report: error => {
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
const server = bindings.server(executor);
|
|
137
|
+
const auth = {
|
|
138
|
+
authData: {
|
|
139
|
+
id: "alice"
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const own = {
|
|
143
|
+
workspace: "a",
|
|
144
|
+
id: "same",
|
|
145
|
+
ownerId: "alice",
|
|
146
|
+
title: "own"
|
|
147
|
+
};
|
|
148
|
+
const foreign = {
|
|
149
|
+
workspace: "b",
|
|
150
|
+
id: "same",
|
|
151
|
+
ownerId: "bob",
|
|
152
|
+
title: "foreign"
|
|
153
|
+
};
|
|
154
|
+
try {
|
|
155
|
+
await server.mutate.document.insert(own, auth);
|
|
156
|
+
await server.mutate.document.insert(foreign, {
|
|
157
|
+
authData: {
|
|
158
|
+
id: "bob"
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
await expect(server.mutate.document.insert({
|
|
162
|
+
...foreign,
|
|
163
|
+
id: "forbidden"
|
|
164
|
+
}, auth)).rejects.toThrow();
|
|
165
|
+
await expect(server.mutate.document.upsert({
|
|
166
|
+
...foreign,
|
|
167
|
+
ownerId: "alice"
|
|
168
|
+
}, auth)).rejects.toThrow();
|
|
169
|
+
await expect(server.mutate.document.update({
|
|
170
|
+
...own,
|
|
171
|
+
ownerId: "bob"
|
|
172
|
+
}, auth)).rejects.toThrow();
|
|
173
|
+
await expect(server.mutate.document.upsert({
|
|
174
|
+
...own,
|
|
175
|
+
ownerId: "bob"
|
|
176
|
+
}, auth)).rejects.toThrow();
|
|
177
|
+
await expect(server.mutate.document.upsert({
|
|
178
|
+
...foreign,
|
|
179
|
+
id: "missing"
|
|
180
|
+
}, auth)).rejects.toThrow();
|
|
181
|
+
await server.mutate.document.upsert({
|
|
182
|
+
...own,
|
|
183
|
+
title: "updated"
|
|
184
|
+
}, auth);
|
|
185
|
+
await server.mutate.document.upsert({
|
|
186
|
+
...own,
|
|
187
|
+
title: "updated"
|
|
188
|
+
}, auth);
|
|
189
|
+
await server.mutate.document.upsert({
|
|
190
|
+
...own,
|
|
191
|
+
id: "new"
|
|
192
|
+
}, auth);
|
|
193
|
+
expect(sqlite.prepare("SELECT * FROM document ORDER BY workspace, id").all()).toEqual([{
|
|
194
|
+
...own,
|
|
195
|
+
id: "new"
|
|
196
|
+
}, {
|
|
197
|
+
...own,
|
|
198
|
+
title: "updated"
|
|
199
|
+
}, foreign]);
|
|
200
|
+
const closedBindings = createZeroServerBindings({
|
|
201
|
+
schema,
|
|
202
|
+
models: {
|
|
203
|
+
document: {
|
|
204
|
+
mutate: mutations(document, permission, {
|
|
205
|
+
rename: async (ctx, input) => {
|
|
206
|
+
await ctx.can(permission, input);
|
|
207
|
+
await ctx.tx.mutate.document.update(input);
|
|
208
|
+
}
|
|
209
|
+
}, {
|
|
210
|
+
crud: false
|
|
211
|
+
})
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
createServerActions: () => ({})
|
|
215
|
+
});
|
|
216
|
+
expect(Object.keys(closedBindings.mutators)).toEqual(["document|rename"]);
|
|
217
|
+
const closedExecutor = createSyncExecutor({
|
|
218
|
+
database,
|
|
219
|
+
schema,
|
|
220
|
+
mutators: closedBindings.mutators,
|
|
221
|
+
effects: {
|
|
222
|
+
runBackground: promise => promise,
|
|
223
|
+
report: error => {
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
for (const action of ["insert", "update", "delete", "upsert"]) {
|
|
229
|
+
await expect(closedExecutor.execute(`document|${action}`, own, {
|
|
230
|
+
userID: "alice"
|
|
231
|
+
})).rejects.toThrow(`unknown mutator: document|${action}`);
|
|
232
|
+
}
|
|
233
|
+
await closedBindings.server(closedExecutor).mutate.document.rename({
|
|
234
|
+
workspace: "a",
|
|
235
|
+
id: "same",
|
|
236
|
+
title: "renamed"
|
|
237
|
+
}, auth);
|
|
238
|
+
expect(sqlite.prepare("SELECT title FROM document WHERE workspace = ? AND id = ?").get("a", "same")).toEqual({
|
|
239
|
+
title: "renamed"
|
|
240
|
+
});
|
|
241
|
+
} finally {
|
|
242
|
+
sqlite.close();
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
});
|
|
18
246
|
//# sourceMappingURL=mutations.test.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","expect","test","mutations","serverWhere","permissions","v1","v2","
|
|
1
|
+
{"version":3,"names":["AsyncLocalStorage","DatabaseSync","createSchema","string","table","createSQLiteApplicationDatabase","createSyncExecutor","createQueryCompiler","executeTransactionQueryPlan","afterAll","describe","expect","test","vi","createZeroServerBindings","setupAsyncLocalStorage","getMutationsPermissions","mutations","serverWhere","previousEnvironment","hoisted","previous","process","env","VITE_ENVIRONMENT","record","columns","id","primaryKey","permission","first","Object","keys","sort","toEqual","custom","fn","closed","crud","toBe","Reflect","get","toBeUndefined","toHaveBeenCalledOnce","reopened","insert","permissions","v1","v2","proxy","document","workspace","ownerId","title","schema","tables","relationships","enableLegacyQueries","sqlite","exec","compile","query","sql","params","prepare","all","map","value","tx","changes","Number","run","queryAst","ast","format","queryName","database","transaction","work","result","error","eb","auth2","cmp","auth","bindings","models","mutate","createServerActions","executor","mutators","effects","runBackground","promise","report","server","authData","own","foreign","rejects","toThrow","upsert","update","closedBindings","rename","ctx","input","can","closedExecutor","action","execute","userID","close"],"sources":["../../src/mutations.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|