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
|
@@ -27,8 +27,8 @@ __export(mutations_exports, {
|
|
|
27
27
|
mutations: () => mutations
|
|
28
28
|
});
|
|
29
29
|
module.exports = __toCommonJS(mutations_exports);
|
|
30
|
-
var import_platform = require("./helpers/platform.native.js");
|
|
31
30
|
var import_modelRegistry = require("./modelRegistry.native.js");
|
|
31
|
+
var import_state = require("./state.native.js");
|
|
32
32
|
function mutationRegistry() {
|
|
33
33
|
var _global;
|
|
34
34
|
var global = globalThis;
|
|
@@ -40,7 +40,14 @@ function proxyRegistry() {
|
|
|
40
40
|
return (_global = global).__onZeroProxyRegistry__ || (_global.__onZeroProxyRegistry__ = /* @__PURE__ */new Map());
|
|
41
41
|
}
|
|
42
42
|
function getOrCreateMutationProxy(tableName, implementations) {
|
|
43
|
+
var crud = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
|
|
43
44
|
var prior = mutationRegistry().get(tableName);
|
|
45
|
+
if (prior && !crud) {
|
|
46
|
+
for (var _i = 0, _iter = ["insert", "update", "delete", "upsert"]; _i < _iter.length; _i++) {
|
|
47
|
+
var action = _iter[_i];
|
|
48
|
+
if (!(action in implementations)) delete prior[action];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
44
51
|
mutationRegistry().set(tableName, prior ? {
|
|
45
52
|
...prior,
|
|
46
53
|
...implementations
|
|
@@ -76,24 +83,50 @@ function getOrCreateMutationProxy(tableName, implementations) {
|
|
|
76
83
|
proxyRegistry().set(tableName, proxy);
|
|
77
84
|
return proxy;
|
|
78
85
|
}
|
|
79
|
-
function mutations(table, permissions, mutations2) {
|
|
86
|
+
function mutations(table, permissions, mutations2, options) {
|
|
80
87
|
if (permissions) {
|
|
81
88
|
var tableName = typeof table === "string" ? table : table.schema.name;
|
|
89
|
+
(0, import_modelRegistry.setMutationsPermissions)(tableName, permissions);
|
|
90
|
+
if ((options === null || options === void 0 ? void 0 : options.crud) === false) {
|
|
91
|
+
return getOrCreateMutationProxy(tableName, mutations2 !== null && mutations2 !== void 0 ? mutations2 : {}, false);
|
|
92
|
+
}
|
|
82
93
|
var createCRUDMutation = function createCRUDMutation2(action) {
|
|
83
94
|
var customMutation = mutations2 === null || mutations2 === void 0 ? void 0 : mutations2[action];
|
|
84
95
|
if (customMutation) return customMutation;
|
|
85
96
|
return async function (ctx, obj) {
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
if (action === "upsert" && ctx.environment === "server") {
|
|
98
|
+
var existing = (0, import_state.getZQL)()[tableName];
|
|
99
|
+
var _iteratorNormalCompletion = true,
|
|
100
|
+
_didIteratorError = false,
|
|
101
|
+
_iteratorError = void 0;
|
|
102
|
+
try {
|
|
103
|
+
for (var _iterator = (0, import_state.getSchema)().tables[tableName].primaryKey[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
104
|
+
var key = _step.value;
|
|
105
|
+
existing = existing.where(key, obj[key]);
|
|
106
|
+
}
|
|
107
|
+
} catch (err) {
|
|
108
|
+
_didIteratorError = true;
|
|
109
|
+
_iteratorError = err;
|
|
110
|
+
} finally {
|
|
111
|
+
try {
|
|
112
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
113
|
+
_iterator.return();
|
|
114
|
+
}
|
|
115
|
+
} finally {
|
|
116
|
+
if (_didIteratorError) {
|
|
117
|
+
throw _iteratorError;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (await ctx.tx.run(existing.one())) {
|
|
88
122
|
await ctx.can(permissions, obj);
|
|
89
123
|
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
await runServerPermissionCheck();
|
|
124
|
+
} else if (action === "update" || action === "delete") {
|
|
125
|
+
await ctx.can(permissions, obj);
|
|
93
126
|
}
|
|
94
127
|
await ctx.tx.mutate[tableName][action](obj);
|
|
95
|
-
if (action
|
|
96
|
-
await
|
|
128
|
+
if (action !== "delete") {
|
|
129
|
+
await ctx.can(permissions, obj);
|
|
97
130
|
}
|
|
98
131
|
};
|
|
99
132
|
};
|
|
@@ -108,7 +141,6 @@ function mutations(table, permissions, mutations2) {
|
|
|
108
141
|
// generated CRUD fills missing operations; custom CRUD runs as-is
|
|
109
142
|
...crudMutations
|
|
110
143
|
};
|
|
111
|
-
(0, import_modelRegistry.setMutationsPermissions)(tableName, permissions);
|
|
112
144
|
return getOrCreateMutationProxy(tableName, finalMutations);
|
|
113
145
|
}
|
|
114
146
|
return table;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","mutations_exports","__export","mutations","module","exports","
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","mutations_exports","__export","mutations","module","exports","import_modelRegistry","require","import_state","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","has","table","permissions","mutations2","options","schema","name","setMutationsPermissions","createCRUDMutation","createCRUDMutation2","customMutation","ctx","obj","environment","getZQL","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","getSchema","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
|
+
var import_node_async_hooks = require("node:async_hooks");
|
|
2
|
+
var import_node_sqlite = require("node:sqlite");
|
|
3
|
+
var import_zero = require("@rocicorp/zero");
|
|
4
|
+
var import_orez_lite = require("orez-lite");
|
|
5
|
+
var import_query_compiler = require("orez-lite/cloudflare/query-compiler");
|
|
6
|
+
var import_transaction_query = require("orez-lite/cloudflare/transaction-query");
|
|
1
7
|
var import_vitest = require("vitest");
|
|
8
|
+
var import_server = require("./server.cjs");
|
|
9
|
+
var import_modelRegistry = require("./modelRegistry.cjs");
|
|
2
10
|
var import_mutations = require("./mutations.cjs");
|
|
3
11
|
var import_serverWhere = require("./serverWhere.cjs");
|
|
12
|
+
const previousEnvironment = import_vitest.vi.hoisted(() => {
|
|
13
|
+
const previous = process.env.VITE_ENVIRONMENT;
|
|
14
|
+
process.env.VITE_ENVIRONMENT = "client";
|
|
15
|
+
return previous;
|
|
16
|
+
});
|
|
17
|
+
(0, import_vitest.afterAll)(() => {
|
|
18
|
+
if (previousEnvironment === void 0) delete process.env.VITE_ENVIRONMENT;else process.env.VITE_ENVIRONMENT = previousEnvironment;
|
|
19
|
+
});
|
|
4
20
|
(0, import_vitest.describe)("mutations registry", () => {
|
|
21
|
+
(0, import_vitest.test)("explicit opt-out removes generated CRUD from existing proxies and retains permissions", async () => {
|
|
22
|
+
const record = (0, import_zero.table)("closedRecord").columns({
|
|
23
|
+
id: (0, import_zero.string)()
|
|
24
|
+
}).primaryKey("id");
|
|
25
|
+
const permission = (0, import_serverWhere.serverWhere)("closedRecord", () => true);
|
|
26
|
+
const first = (0, import_mutations.mutations)(record, permission);
|
|
27
|
+
(0, import_vitest.expect)(Object.keys(first).sort()).toEqual(["delete", "insert", "update", "upsert"]);
|
|
28
|
+
const custom = import_vitest.vi.fn(async () => {});
|
|
29
|
+
const closed = (0, import_mutations.mutations)(record, permission, {
|
|
30
|
+
custom
|
|
31
|
+
}, {
|
|
32
|
+
crud: false
|
|
33
|
+
});
|
|
34
|
+
(0, import_vitest.expect)(closed).toBe(first);
|
|
35
|
+
(0, import_vitest.expect)(Object.keys(closed)).toEqual(["custom"]);
|
|
36
|
+
(0, import_vitest.expect)("insert" in closed).toBe(false);
|
|
37
|
+
(0, import_vitest.expect)(Reflect.get(closed, "upsert")).toBeUndefined();
|
|
38
|
+
(0, import_vitest.expect)((0, import_modelRegistry.getMutationsPermissions)("closedRecord")).toBe(permission);
|
|
39
|
+
await closed.custom();
|
|
40
|
+
(0, import_vitest.expect)(custom).toHaveBeenCalledOnce();
|
|
41
|
+
const reopened = (0, import_mutations.mutations)(record, permission, {}, {
|
|
42
|
+
crud: true
|
|
43
|
+
});
|
|
44
|
+
(0, import_vitest.expect)(Object.keys(reopened).sort()).toEqual(["custom", "delete", "insert", "update", "upsert"]);
|
|
45
|
+
});
|
|
46
|
+
(0, import_vitest.test)("opt-out preserves explicitly declared CRUD handlers", async () => {
|
|
47
|
+
const record = (0, import_zero.table)("customRecord").columns({
|
|
48
|
+
id: (0, import_zero.string)()
|
|
49
|
+
}).primaryKey("id");
|
|
50
|
+
const permission = (0, import_serverWhere.serverWhere)("customRecord", () => true);
|
|
51
|
+
const insert = import_vitest.vi.fn(async () => {});
|
|
52
|
+
const custom = (0, import_mutations.mutations)(record, permission, {
|
|
53
|
+
insert
|
|
54
|
+
}, {
|
|
55
|
+
crud: false
|
|
56
|
+
});
|
|
57
|
+
(0, import_vitest.expect)(Object.keys(custom)).toEqual(["insert"]);
|
|
58
|
+
await custom.insert();
|
|
59
|
+
(0, import_vitest.expect)(insert).toHaveBeenCalledOnce();
|
|
60
|
+
});
|
|
5
61
|
(0, import_vitest.test)("re-registering a handler replaces it per key (HMR)", () => {
|
|
6
62
|
const permissions = (0, import_serverWhere.serverWhere)("post", () => true);
|
|
7
63
|
const v1 = async () => {};
|
|
@@ -14,4 +70,176 @@ var import_serverWhere = require("./serverWhere.cjs");
|
|
|
14
70
|
});
|
|
15
71
|
(0, import_vitest.expect)(proxy.custom).toBe(v2);
|
|
16
72
|
});
|
|
73
|
+
});
|
|
74
|
+
(0, import_vitest.describe)("generated CRUD authorization", () => {
|
|
75
|
+
(0, import_vitest.test)("authorizes both sides of composite-key writes through the server executor", async () => {
|
|
76
|
+
(0, import_server.setupAsyncLocalStorage)(import_node_async_hooks.AsyncLocalStorage);
|
|
77
|
+
const document = (0, import_zero.table)("document").columns({
|
|
78
|
+
workspace: (0, import_zero.string)(),
|
|
79
|
+
id: (0, import_zero.string)(),
|
|
80
|
+
ownerId: (0, import_zero.string)(),
|
|
81
|
+
title: (0, import_zero.string)()
|
|
82
|
+
}).primaryKey("workspace", "id");
|
|
83
|
+
const schema = (0, import_zero.createSchema)({
|
|
84
|
+
tables: [document],
|
|
85
|
+
relationships: [],
|
|
86
|
+
enableLegacyQueries: true
|
|
87
|
+
});
|
|
88
|
+
const sqlite = new import_node_sqlite.DatabaseSync(":memory:");
|
|
89
|
+
sqlite.exec("CREATE TABLE document (workspace TEXT, id TEXT, ownerId TEXT, title TEXT, PRIMARY KEY (workspace, id))");
|
|
90
|
+
const compile = (0, import_query_compiler.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) => (0, import_transaction_query.executeTransactionQueryPlan)(compile(ast, format), (sql, params) => sqlite.prepare(sql).all(...params.map(value => value)), {
|
|
98
|
+
queryName
|
|
99
|
+
})
|
|
100
|
+
};
|
|
101
|
+
const database = (0, import_orez_lite.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 = (0, import_serverWhere.serverWhere)("document", (eb, auth2) => eb.cmp("ownerId", auth2 && "id" in auth2 && typeof auth2.id === "string" ? auth2.id : ""));
|
|
116
|
+
const bindings = (0, import_server.createZeroServerBindings)({
|
|
117
|
+
schema,
|
|
118
|
+
models: {
|
|
119
|
+
document: {
|
|
120
|
+
mutate: (0, import_mutations.mutations)(document, permission)
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
createServerActions: () => ({})
|
|
124
|
+
});
|
|
125
|
+
const executor = (0, import_orez_lite.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 (0, import_vitest.expect)(server.mutate.document.insert({
|
|
162
|
+
...foreign,
|
|
163
|
+
id: "forbidden"
|
|
164
|
+
}, auth)).rejects.toThrow();
|
|
165
|
+
await (0, import_vitest.expect)(server.mutate.document.upsert({
|
|
166
|
+
...foreign,
|
|
167
|
+
ownerId: "alice"
|
|
168
|
+
}, auth)).rejects.toThrow();
|
|
169
|
+
await (0, import_vitest.expect)(server.mutate.document.update({
|
|
170
|
+
...own,
|
|
171
|
+
ownerId: "bob"
|
|
172
|
+
}, auth)).rejects.toThrow();
|
|
173
|
+
await (0, import_vitest.expect)(server.mutate.document.upsert({
|
|
174
|
+
...own,
|
|
175
|
+
ownerId: "bob"
|
|
176
|
+
}, auth)).rejects.toThrow();
|
|
177
|
+
await (0, import_vitest.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
|
+
(0, import_vitest.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 = (0, import_server.createZeroServerBindings)({
|
|
201
|
+
schema,
|
|
202
|
+
models: {
|
|
203
|
+
document: {
|
|
204
|
+
mutate: (0, import_mutations.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
|
+
(0, import_vitest.expect)(Object.keys(closedBindings.mutators)).toEqual(["document|rename"]);
|
|
217
|
+
const closedExecutor = (0, import_orez_lite.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 (0, import_vitest.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
|
+
(0, import_vitest.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
|
+
});
|
|
17
245
|
});
|
|
@@ -1,9 +1,69 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var import_async_hooks = require("async_hooks");
|
|
4
|
+
var import_node_sqlite = require("node:sqlite");
|
|
5
|
+
var import_zero = require("@rocicorp/zero");
|
|
6
|
+
var import_orez_lite = require("orez-lite");
|
|
7
|
+
var import_query_compiler = require("orez-lite/cloudflare/query-compiler");
|
|
8
|
+
var import_transaction_query = require("orez-lite/cloudflare/transaction-query");
|
|
3
9
|
var import_vitest = require("vitest");
|
|
10
|
+
var import_server = require("./server.native.js");
|
|
11
|
+
var import_modelRegistry = require("./modelRegistry.native.js");
|
|
4
12
|
var import_mutations = require("./mutations.native.js");
|
|
5
13
|
var import_serverWhere = require("./serverWhere.native.js");
|
|
14
|
+
var previousEnvironment = import_vitest.vi.hoisted(function () {
|
|
15
|
+
var previous = process.env.VITE_ENVIRONMENT;
|
|
16
|
+
process.env.VITE_ENVIRONMENT = "client";
|
|
17
|
+
return previous;
|
|
18
|
+
});
|
|
19
|
+
(0, import_vitest.afterAll)(function () {
|
|
20
|
+
if (previousEnvironment === void 0) delete process.env.VITE_ENVIRONMENT;else process.env.VITE_ENVIRONMENT = previousEnvironment;
|
|
21
|
+
});
|
|
6
22
|
(0, import_vitest.describe)("mutations registry", function () {
|
|
23
|
+
(0, import_vitest.test)("explicit opt-out removes generated CRUD from existing proxies and retains permissions", async function () {
|
|
24
|
+
var record = (0, import_zero.table)("closedRecord").columns({
|
|
25
|
+
id: (0, import_zero.string)()
|
|
26
|
+
}).primaryKey("id");
|
|
27
|
+
var permission = (0, import_serverWhere.serverWhere)("closedRecord", function () {
|
|
28
|
+
return true;
|
|
29
|
+
});
|
|
30
|
+
var first = (0, import_mutations.mutations)(record, permission);
|
|
31
|
+
(0, import_vitest.expect)(Object.keys(first).sort()).toEqual(["delete", "insert", "update", "upsert"]);
|
|
32
|
+
var custom = import_vitest.vi.fn(async function () {});
|
|
33
|
+
var closed = (0, import_mutations.mutations)(record, permission, {
|
|
34
|
+
custom
|
|
35
|
+
}, {
|
|
36
|
+
crud: false
|
|
37
|
+
});
|
|
38
|
+
(0, import_vitest.expect)(closed).toBe(first);
|
|
39
|
+
(0, import_vitest.expect)(Object.keys(closed)).toEqual(["custom"]);
|
|
40
|
+
(0, import_vitest.expect)("insert" in closed).toBe(false);
|
|
41
|
+
(0, import_vitest.expect)(Reflect.get(closed, "upsert")).toBeUndefined();
|
|
42
|
+
(0, import_vitest.expect)((0, import_modelRegistry.getMutationsPermissions)("closedRecord")).toBe(permission);
|
|
43
|
+
await closed.custom();
|
|
44
|
+
(0, import_vitest.expect)(custom).toHaveBeenCalledOnce();
|
|
45
|
+
var reopened = (0, import_mutations.mutations)(record, permission, {}, {
|
|
46
|
+
crud: true
|
|
47
|
+
});
|
|
48
|
+
(0, import_vitest.expect)(Object.keys(reopened).sort()).toEqual(["custom", "delete", "insert", "update", "upsert"]);
|
|
49
|
+
});
|
|
50
|
+
(0, import_vitest.test)("opt-out preserves explicitly declared CRUD handlers", async function () {
|
|
51
|
+
var record = (0, import_zero.table)("customRecord").columns({
|
|
52
|
+
id: (0, import_zero.string)()
|
|
53
|
+
}).primaryKey("id");
|
|
54
|
+
var permission = (0, import_serverWhere.serverWhere)("customRecord", function () {
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
var insert = import_vitest.vi.fn(async function () {});
|
|
58
|
+
var custom = (0, import_mutations.mutations)(record, permission, {
|
|
59
|
+
insert
|
|
60
|
+
}, {
|
|
61
|
+
crud: false
|
|
62
|
+
});
|
|
63
|
+
(0, import_vitest.expect)(Object.keys(custom)).toEqual(["insert"]);
|
|
64
|
+
await custom.insert();
|
|
65
|
+
(0, import_vitest.expect)(insert).toHaveBeenCalledOnce();
|
|
66
|
+
});
|
|
7
67
|
(0, import_vitest.test)("re-registering a handler replaces it per key (HMR)", function () {
|
|
8
68
|
var permissions = (0, import_serverWhere.serverWhere)("post", function () {
|
|
9
69
|
return true;
|
|
@@ -19,4 +79,203 @@ var import_serverWhere = require("./serverWhere.native.js");
|
|
|
19
79
|
(0, import_vitest.expect)(proxy.custom).toBe(v2);
|
|
20
80
|
});
|
|
21
81
|
});
|
|
82
|
+
(0, import_vitest.describe)("generated CRUD authorization", function () {
|
|
83
|
+
(0, import_vitest.test)("authorizes both sides of composite-key writes through the server executor", async function () {
|
|
84
|
+
(0, import_server.setupAsyncLocalStorage)(import_async_hooks.AsyncLocalStorage);
|
|
85
|
+
var document = (0, import_zero.table)("document").columns({
|
|
86
|
+
workspace: (0, import_zero.string)(),
|
|
87
|
+
id: (0, import_zero.string)(),
|
|
88
|
+
ownerId: (0, import_zero.string)(),
|
|
89
|
+
title: (0, import_zero.string)()
|
|
90
|
+
}).primaryKey("workspace", "id");
|
|
91
|
+
var schema = (0, import_zero.createSchema)({
|
|
92
|
+
tables: [document],
|
|
93
|
+
relationships: [],
|
|
94
|
+
enableLegacyQueries: true
|
|
95
|
+
});
|
|
96
|
+
var sqlite = new import_node_sqlite.DatabaseSync(":memory:");
|
|
97
|
+
sqlite.exec("CREATE TABLE document (workspace TEXT, id TEXT, ownerId TEXT, title TEXT, PRIMARY KEY (workspace, id))");
|
|
98
|
+
var compile = (0, import_query_compiler.createQueryCompiler)(schema);
|
|
99
|
+
var query = async function query2(sql) {
|
|
100
|
+
var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
|
|
101
|
+
return sqlite.prepare(sql).all(...params.map(function (value) {
|
|
102
|
+
return value;
|
|
103
|
+
}));
|
|
104
|
+
};
|
|
105
|
+
var tx = {
|
|
106
|
+
query,
|
|
107
|
+
exec: async function exec(sql) {
|
|
108
|
+
var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
|
|
109
|
+
return {
|
|
110
|
+
changes: Number(sqlite.prepare(sql).run(...params.map(function (value) {
|
|
111
|
+
return value;
|
|
112
|
+
})).changes)
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
queryAst: async function queryAst(ast, format, queryName) {
|
|
116
|
+
return (0, import_transaction_query.executeTransactionQueryPlan)(compile(ast, format), function (sql, params) {
|
|
117
|
+
return sqlite.prepare(sql).all(...params.map(function (value) {
|
|
118
|
+
return value;
|
|
119
|
+
}));
|
|
120
|
+
}, {
|
|
121
|
+
queryName
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
var database = (0, import_orez_lite.createSQLiteApplicationDatabase)({
|
|
126
|
+
query,
|
|
127
|
+
transaction: async function transaction(work) {
|
|
128
|
+
sqlite.exec("BEGIN");
|
|
129
|
+
try {
|
|
130
|
+
var result = await work(tx);
|
|
131
|
+
sqlite.exec("COMMIT");
|
|
132
|
+
return result;
|
|
133
|
+
} catch (error) {
|
|
134
|
+
sqlite.exec("ROLLBACK");
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
var permission = (0, import_serverWhere.serverWhere)("document", function (eb, auth2) {
|
|
140
|
+
return eb.cmp("ownerId", auth2 && "id" in auth2 && typeof auth2.id === "string" ? auth2.id : "");
|
|
141
|
+
});
|
|
142
|
+
var bindings = (0, import_server.createZeroServerBindings)({
|
|
143
|
+
schema,
|
|
144
|
+
models: {
|
|
145
|
+
document: {
|
|
146
|
+
mutate: (0, import_mutations.mutations)(document, permission)
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
createServerActions: function createServerActions() {
|
|
150
|
+
return {};
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
var executor = (0, import_orez_lite.createSyncExecutor)({
|
|
154
|
+
database,
|
|
155
|
+
schema,
|
|
156
|
+
mutators: bindings.mutators,
|
|
157
|
+
effects: {
|
|
158
|
+
runBackground: function runBackground(promise) {
|
|
159
|
+
return promise;
|
|
160
|
+
},
|
|
161
|
+
report: function report(error) {
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
var server = bindings.server(executor);
|
|
167
|
+
var auth = {
|
|
168
|
+
authData: {
|
|
169
|
+
id: "alice"
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
var own = {
|
|
173
|
+
workspace: "a",
|
|
174
|
+
id: "same",
|
|
175
|
+
ownerId: "alice",
|
|
176
|
+
title: "own"
|
|
177
|
+
};
|
|
178
|
+
var foreign = {
|
|
179
|
+
workspace: "b",
|
|
180
|
+
id: "same",
|
|
181
|
+
ownerId: "bob",
|
|
182
|
+
title: "foreign"
|
|
183
|
+
};
|
|
184
|
+
try {
|
|
185
|
+
await server.mutate.document.insert(own, auth);
|
|
186
|
+
await server.mutate.document.insert(foreign, {
|
|
187
|
+
authData: {
|
|
188
|
+
id: "bob"
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
await (0, import_vitest.expect)(server.mutate.document.insert({
|
|
192
|
+
...foreign,
|
|
193
|
+
id: "forbidden"
|
|
194
|
+
}, auth)).rejects.toThrow();
|
|
195
|
+
await (0, import_vitest.expect)(server.mutate.document.upsert({
|
|
196
|
+
...foreign,
|
|
197
|
+
ownerId: "alice"
|
|
198
|
+
}, auth)).rejects.toThrow();
|
|
199
|
+
await (0, import_vitest.expect)(server.mutate.document.update({
|
|
200
|
+
...own,
|
|
201
|
+
ownerId: "bob"
|
|
202
|
+
}, auth)).rejects.toThrow();
|
|
203
|
+
await (0, import_vitest.expect)(server.mutate.document.upsert({
|
|
204
|
+
...own,
|
|
205
|
+
ownerId: "bob"
|
|
206
|
+
}, auth)).rejects.toThrow();
|
|
207
|
+
await (0, import_vitest.expect)(server.mutate.document.upsert({
|
|
208
|
+
...foreign,
|
|
209
|
+
id: "missing"
|
|
210
|
+
}, auth)).rejects.toThrow();
|
|
211
|
+
await server.mutate.document.upsert({
|
|
212
|
+
...own,
|
|
213
|
+
title: "updated"
|
|
214
|
+
}, auth);
|
|
215
|
+
await server.mutate.document.upsert({
|
|
216
|
+
...own,
|
|
217
|
+
title: "updated"
|
|
218
|
+
}, auth);
|
|
219
|
+
await server.mutate.document.upsert({
|
|
220
|
+
...own,
|
|
221
|
+
id: "new"
|
|
222
|
+
}, auth);
|
|
223
|
+
(0, import_vitest.expect)(sqlite.prepare("SELECT * FROM document ORDER BY workspace, id").all()).toEqual([{
|
|
224
|
+
...own,
|
|
225
|
+
id: "new"
|
|
226
|
+
}, {
|
|
227
|
+
...own,
|
|
228
|
+
title: "updated"
|
|
229
|
+
}, foreign]);
|
|
230
|
+
var closedBindings = (0, import_server.createZeroServerBindings)({
|
|
231
|
+
schema,
|
|
232
|
+
models: {
|
|
233
|
+
document: {
|
|
234
|
+
mutate: (0, import_mutations.mutations)(document, permission, {
|
|
235
|
+
rename: async function rename(ctx, input) {
|
|
236
|
+
await ctx.can(permission, input);
|
|
237
|
+
await ctx.tx.mutate.document.update(input);
|
|
238
|
+
}
|
|
239
|
+
}, {
|
|
240
|
+
crud: false
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
createServerActions: function createServerActions() {
|
|
245
|
+
return {};
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
(0, import_vitest.expect)(Object.keys(closedBindings.mutators)).toEqual(["document|rename"]);
|
|
249
|
+
var closedExecutor = (0, import_orez_lite.createSyncExecutor)({
|
|
250
|
+
database,
|
|
251
|
+
schema,
|
|
252
|
+
mutators: closedBindings.mutators,
|
|
253
|
+
effects: {
|
|
254
|
+
runBackground: function runBackground(promise) {
|
|
255
|
+
return promise;
|
|
256
|
+
},
|
|
257
|
+
report: function report(error) {
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
for (var _i = 0, _iter = ["insert", "update", "delete", "upsert"]; _i < _iter.length; _i++) {
|
|
263
|
+
var action = _iter[_i];
|
|
264
|
+
await (0, import_vitest.expect)(closedExecutor.execute(`document|${action}`, own, {
|
|
265
|
+
userID: "alice"
|
|
266
|
+
})).rejects.toThrow(`unknown mutator: document|${action}`);
|
|
267
|
+
}
|
|
268
|
+
await closedBindings.server(closedExecutor).mutate.document.rename({
|
|
269
|
+
workspace: "a",
|
|
270
|
+
id: "same",
|
|
271
|
+
title: "renamed"
|
|
272
|
+
}, auth);
|
|
273
|
+
(0, import_vitest.expect)(sqlite.prepare("SELECT title FROM document WHERE workspace = ? AND id = ?").get("a", "same")).toEqual({
|
|
274
|
+
title: "renamed"
|
|
275
|
+
});
|
|
276
|
+
} finally {
|
|
277
|
+
sqlite.close();
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
});
|
|
22
281
|
//# sourceMappingURL=mutations.test.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["import_async_hooks","require","import_node_sqlite","import_zero","import_orez_lite","import_query_compiler","import_transaction_query","import_vitest","import_server","import_modelRegistry","import_mutations","import_serverWhere","previousEnvironment","vi","hoisted","previous","process","env","VITE_ENVIRONMENT","afterAll","describe","test","record","table","columns","id","string","primaryKey","permission","serverWhere","first","mutations","expect","Object","keys","sort","toEqual","custom","fn","closed","crud","toBe","Reflect","get","toBeUndefined","getMutationsPermissions","toHaveBeenCalledOnce","reopened","insert","permissions","v1","v12","v2","v22","proxy","setupAsyncLocalStorage","AsyncLocalStorage","document","workspace","ownerId","title","schema","createSchema","tables","relationships","enableLegacyQueries","sqlite","DatabaseSync","exec","compile","createQueryCompiler","query","query2","sql","params","arguments","length","prepare","all","map","value","tx","changes","Number","run","queryAst","ast","format","queryName","executeTransactionQueryPlan","database","createSQLiteApplicationDatabase","transaction","work","result","error","eb","auth2","cmp","bindings","createZeroServerBindings","models","mutate","createServerActions","executor","createSyncExecutor","mutators","effects","runBackground","promise","report","server","auth","authData","own","foreign"],"sources":["../../src/mutations.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -99,9 +99,11 @@ test("warm headless client refreshes an expired bearer and reconnects", async ()
|
|
|
99
99
|
refreshAuth
|
|
100
100
|
});
|
|
101
101
|
try {
|
|
102
|
-
await eventually(() =>
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
await eventually(() => {
|
|
103
|
+
expect(refreshAuth).toHaveBeenCalledTimes(1);
|
|
104
|
+
expect(authorizations).toEqual(["Bearer expired-token", "Bearer fresh-token"]);
|
|
105
|
+
expect(connection.zero.connection.state.current.name).toBe("connected");
|
|
106
|
+
});
|
|
105
107
|
} finally {
|
|
106
108
|
await connection.close();
|
|
107
109
|
}
|