on-zero 0.6.14 → 0.6.16
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/asyncTasks.cjs +51 -0
- package/dist/cjs/asyncTasks.native.js +84 -0
- package/dist/cjs/asyncTasks.native.js.map +1 -0
- package/dist/cjs/cli.cjs +8 -1
- package/dist/cjs/cli.native.js +8 -1
- package/dist/cjs/cli.native.js.map +1 -1
- package/dist/cjs/createSchemaFromDrizzle.cjs +4 -4
- package/dist/cjs/createSchemaFromDrizzle.native.js +4 -4
- package/dist/cjs/createSchemaFromDrizzle.native.js.map +1 -1
- package/dist/cjs/createZeroDirectServer.cjs +269 -0
- package/dist/cjs/createZeroDirectServer.native.js +287 -0
- package/dist/cjs/createZeroDirectServer.native.js.map +1 -0
- package/dist/cjs/createZeroSQLiteServer.cjs +8 -277
- package/dist/cjs/createZeroSQLiteServer.native.js +8 -390
- package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -1
- package/dist/cjs/createZeroSQLiteServer.test.cjs +36 -9
- package/dist/cjs/createZeroSQLiteServer.test.native.js +37 -9
- package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -1
- package/dist/cjs/createZeroServer.test.cjs +79 -1
- package/dist/cjs/createZeroServer.test.native.js +85 -1
- package/dist/cjs/createZeroServer.test.native.js.map +1 -1
- package/dist/cjs/createZeroServerCore.cjs +28 -208
- package/dist/cjs/createZeroServerCore.native.js +33 -218
- package/dist/cjs/createZeroServerCore.native.js.map +1 -1
- package/dist/cjs/generate.cjs +15 -5
- package/dist/cjs/generate.native.js +15 -5
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/cjs/generate.test.cjs +55 -0
- package/dist/cjs/generate.test.native.js +55 -0
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.cjs +2 -2
- package/dist/cjs/helpers/createMutators.native.js +2 -2
- package/dist/cjs/helpers/createMutators.native.js.map +1 -1
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.native.js +1 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/server.cjs +2 -1
- package/dist/cjs/sqliteRuntime.cjs +318 -0
- package/dist/cjs/sqliteRuntime.native.js +438 -0
- package/dist/cjs/sqliteRuntime.native.js.map +1 -0
- package/dist/cjs/syncHost.cjs +26 -12
- package/dist/cjs/syncHost.native.js +32 -16
- package/dist/cjs/syncHost.native.js.map +1 -1
- package/dist/cjs/syncHost.test.cjs +15 -4
- package/dist/cjs/syncHost.test.native.js +16 -4
- package/dist/cjs/syncHost.test.native.js.map +1 -1
- package/dist/cjs/vite-plugin.cjs +2 -1
- package/dist/cjs/vite-plugin.native.js +2 -1
- package/dist/cjs/vite-plugin.native.js.map +1 -1
- package/dist/esm/asyncTasks.mjs +26 -0
- package/dist/esm/asyncTasks.mjs.map +1 -0
- package/dist/esm/asyncTasks.native.js +56 -0
- package/dist/esm/asyncTasks.native.js.map +1 -0
- package/dist/esm/cli.mjs +8 -1
- package/dist/esm/cli.mjs.map +1 -1
- package/dist/esm/cli.native.js +8 -1
- package/dist/esm/cli.native.js.map +1 -1
- package/dist/esm/createSchemaFromDrizzle.mjs +2 -2
- package/dist/esm/createSchemaFromDrizzle.native.js +2 -2
- package/dist/esm/createZeroDirectServer.mjs +241 -0
- package/dist/esm/createZeroDirectServer.mjs.map +1 -0
- package/dist/esm/createZeroDirectServer.native.js +256 -0
- package/dist/esm/createZeroDirectServer.native.js.map +1 -0
- package/dist/esm/createZeroSQLiteServer.mjs +3 -272
- package/dist/esm/createZeroSQLiteServer.mjs.map +1 -1
- package/dist/esm/createZeroSQLiteServer.native.js +3 -385
- package/dist/esm/createZeroSQLiteServer.native.js.map +1 -1
- package/dist/esm/createZeroSQLiteServer.test.mjs +36 -9
- package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -1
- package/dist/esm/createZeroSQLiteServer.test.native.js +37 -9
- package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -1
- package/dist/esm/createZeroServer.test.mjs +80 -2
- package/dist/esm/createZeroServer.test.mjs.map +1 -1
- package/dist/esm/createZeroServer.test.native.js +86 -2
- package/dist/esm/createZeroServer.test.native.js.map +1 -1
- package/dist/esm/createZeroServerCore.mjs +26 -205
- package/dist/esm/createZeroServerCore.mjs.map +1 -1
- package/dist/esm/createZeroServerCore.native.js +32 -216
- package/dist/esm/createZeroServerCore.native.js.map +1 -1
- package/dist/esm/generate.mjs +15 -5
- package/dist/esm/generate.mjs.map +1 -1
- package/dist/esm/generate.native.js +15 -5
- package/dist/esm/generate.native.js.map +1 -1
- package/dist/esm/generate.test.mjs +55 -1
- package/dist/esm/generate.test.mjs.map +1 -1
- package/dist/esm/generate.test.native.js +55 -1
- package/dist/esm/generate.test.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.mjs +2 -2
- package/dist/esm/helpers/createMutators.mjs.map +1 -1
- package/dist/esm/helpers/createMutators.native.js +2 -2
- package/dist/esm/helpers/createMutators.native.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +1 -0
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/server.mjs +1 -0
- package/dist/esm/server.mjs.map +1 -1
- package/dist/esm/sqliteRuntime.mjs +289 -0
- package/dist/esm/sqliteRuntime.mjs.map +1 -0
- package/dist/esm/sqliteRuntime.native.js +406 -0
- package/dist/esm/sqliteRuntime.native.js.map +1 -0
- package/dist/esm/syncHost.mjs +24 -10
- package/dist/esm/syncHost.mjs.map +1 -1
- package/dist/esm/syncHost.native.js +30 -14
- package/dist/esm/syncHost.native.js.map +1 -1
- package/dist/esm/syncHost.test.mjs +15 -4
- package/dist/esm/syncHost.test.mjs.map +1 -1
- package/dist/esm/syncHost.test.native.js +16 -4
- package/dist/esm/syncHost.test.native.js.map +1 -1
- package/dist/esm/vite-plugin.mjs +2 -1
- package/dist/esm/vite-plugin.mjs.map +1 -1
- package/dist/esm/vite-plugin.native.js +2 -1
- package/dist/esm/vite-plugin.native.js.map +1 -1
- package/lint/ssr-guards.js +8 -7
- package/package.json +5 -6
- package/readme.md +13 -4
- package/src/asyncTasks.ts +33 -0
- package/src/cli.ts +7 -1
- package/src/createSchemaFromDrizzle.ts +2 -2
- package/src/createZeroDirectServer.ts +411 -0
- package/src/createZeroSQLiteServer.test.ts +28 -12
- package/src/createZeroSQLiteServer.ts +14 -481
- package/src/createZeroServer.test.ts +86 -2
- package/src/createZeroServerCore.ts +39 -343
- package/src/generate.test.ts +75 -1
- package/src/generate.ts +30 -4
- package/src/helpers/createMutators.ts +3 -3
- package/src/helpers/mutatorContext.ts +1 -1
- package/src/index.ts +1 -0
- package/src/server.ts +2 -0
- package/src/sqliteRuntime.ts +512 -0
- package/src/syncHost.test.ts +12 -5
- package/src/syncHost.ts +55 -16
- package/src/types.ts +21 -3
- package/src/vite-plugin.ts +1 -0
- package/test-fixtures/server-return-types.ts +20 -2
- package/types/asyncTasks.d.ts +7 -0
- package/types/asyncTasks.d.ts.map +1 -0
- package/types/createSchemaFromDrizzle.d.ts +2 -2
- package/types/createSchemaFromDrizzle.d.ts.map +1 -1
- package/types/createZeroDirectServer.d.ts +80 -0
- package/types/createZeroDirectServer.d.ts.map +1 -0
- package/types/createZeroSQLiteServer.d.ts +5 -30
- package/types/createZeroSQLiteServer.d.ts.map +1 -1
- package/types/createZeroServerCore.d.ts +30 -87
- package/types/createZeroServerCore.d.ts.map +1 -1
- package/types/generate.d.ts +2 -0
- package/types/generate.d.ts.map +1 -1
- package/types/helpers/createMutators.d.ts +3 -3
- package/types/helpers/createMutators.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/server.d.ts +2 -0
- package/types/server.d.ts.map +1 -1
- package/types/sqliteRuntime.d.ts +71 -0
- package/types/sqliteRuntime.d.ts.map +1 -0
- package/types/syncHost.d.ts +10 -19
- package/types/syncHost.d.ts.map +1 -1
- package/types/types.d.ts +18 -2
- package/types/types.d.ts.map +1 -1
- package/types/vite-plugin.d.ts.map +1 -1
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all) __defProp(target, name, {
|
|
9
|
+
get: all[name],
|
|
10
|
+
enumerable: true
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
16
|
+
get: () => from[key],
|
|
17
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
23
|
+
value: true
|
|
24
|
+
}), mod);
|
|
25
|
+
var createZeroDirectServer_exports = {};
|
|
26
|
+
__export(createZeroDirectServer_exports, {
|
|
27
|
+
createAsyncTaskCollector: () => createAsyncTaskCollector,
|
|
28
|
+
createZeroDirectServer: () => createZeroDirectServer,
|
|
29
|
+
createZeroDirectServerRuntime: () => createZeroDirectServerRuntime,
|
|
30
|
+
resolveServerQuery: () => resolveServerQuery
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(createZeroDirectServer_exports);
|
|
33
|
+
var import_zero = require("@rocicorp/zero");
|
|
34
|
+
var import_asyncTasks = require("./asyncTasks.native.js");
|
|
35
|
+
var import_createPermissions = require("./createPermissions.native.js");
|
|
36
|
+
var import_createMutators = require("./helpers/createMutators.native.js");
|
|
37
|
+
var import_mutatorContext = require("./helpers/mutatorContext.native.js");
|
|
38
|
+
var import_queryContext = require("./helpers/queryContext.native.js");
|
|
39
|
+
var import_modelRegistry = require("./modelRegistry.native.js");
|
|
40
|
+
var import_run = require("./run.native.js");
|
|
41
|
+
var import_state = require("./state.native.js");
|
|
42
|
+
var import_where = require("./where.native.js");
|
|
43
|
+
var import_zeroRunner = require("./zeroRunner.native.js");
|
|
44
|
+
function resolveServerQuery(param) {
|
|
45
|
+
var {
|
|
46
|
+
authData,
|
|
47
|
+
name,
|
|
48
|
+
args,
|
|
49
|
+
queries,
|
|
50
|
+
permissions,
|
|
51
|
+
validateQuery
|
|
52
|
+
} = param;
|
|
53
|
+
if (name.startsWith("permission.")) {
|
|
54
|
+
var table = name.slice("permission.".length);
|
|
55
|
+
var {
|
|
56
|
+
objOrId
|
|
57
|
+
} = args;
|
|
58
|
+
var permission = (0, import_modelRegistry.getMutationsPermissions)(table);
|
|
59
|
+
if (!permission) {
|
|
60
|
+
throw new Error(`[permission] no permission defined for table: ${table}`);
|
|
61
|
+
}
|
|
62
|
+
(0, import_where.setEvaluatingPermission)(true);
|
|
63
|
+
try {
|
|
64
|
+
return (0, import_state.getZQL)()[table].where(function (eb) {
|
|
65
|
+
return permissions.buildPermissionQuery(authData, eb, permission, objOrId, table);
|
|
66
|
+
}).one();
|
|
67
|
+
} finally {
|
|
68
|
+
(0, import_where.setEvaluatingPermission)(false);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (validateQuery) {
|
|
72
|
+
validateQuery({
|
|
73
|
+
authData,
|
|
74
|
+
queryName: name,
|
|
75
|
+
params: args
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
var query = (0, import_zero.mustGetQuery)(queries, name);
|
|
79
|
+
return query.fn({
|
|
80
|
+
args,
|
|
81
|
+
ctx: authData
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function createAsyncTaskCollector() {
|
|
85
|
+
var committed = [];
|
|
86
|
+
var attempt;
|
|
87
|
+
var completedAttempt;
|
|
88
|
+
var enqueueTask = function (task, opts) {
|
|
89
|
+
var entries = attempt !== null && attempt !== void 0 ? attempt : committed;
|
|
90
|
+
entries.push({
|
|
91
|
+
task,
|
|
92
|
+
barrier: (opts === null || opts === void 0 ? void 0 : opts.barrier) === true
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
var lifecycle = {
|
|
96
|
+
beginAttempt() {
|
|
97
|
+
attempt = [];
|
|
98
|
+
completedAttempt = void 0;
|
|
99
|
+
},
|
|
100
|
+
completeAttempt() {
|
|
101
|
+
completedAttempt = attempt;
|
|
102
|
+
attempt = void 0;
|
|
103
|
+
},
|
|
104
|
+
rollbackAttempt() {
|
|
105
|
+
attempt = void 0;
|
|
106
|
+
completedAttempt = void 0;
|
|
107
|
+
},
|
|
108
|
+
commitTransaction() {
|
|
109
|
+
if (completedAttempt) committed.push(...completedAttempt);
|
|
110
|
+
completedAttempt = void 0;
|
|
111
|
+
},
|
|
112
|
+
rollbackTransaction() {
|
|
113
|
+
attempt = void 0;
|
|
114
|
+
completedAttempt = void 0;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
return {
|
|
118
|
+
committed,
|
|
119
|
+
enqueueTask,
|
|
120
|
+
lifecycle
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function createZeroDirectServerRuntime(param) {
|
|
124
|
+
var {
|
|
125
|
+
createDatabase,
|
|
126
|
+
createServerActions,
|
|
127
|
+
defaultAllowAdminRole = "all",
|
|
128
|
+
defaultMutateAuthData = {},
|
|
129
|
+
models,
|
|
130
|
+
mutations: mutationValidators,
|
|
131
|
+
queries,
|
|
132
|
+
schema,
|
|
133
|
+
validateMutation,
|
|
134
|
+
validateQuery
|
|
135
|
+
} = param;
|
|
136
|
+
(0, import_state.setSchema)(schema);
|
|
137
|
+
(0, import_state.setEnvironment)("server");
|
|
138
|
+
var permissions = (0, import_createPermissions.createPermissions)({
|
|
139
|
+
environment: "server",
|
|
140
|
+
schema,
|
|
141
|
+
adminRoleMode: defaultAllowAdminRole
|
|
142
|
+
});
|
|
143
|
+
async function runTransaction(database, query2) {
|
|
144
|
+
try {
|
|
145
|
+
if ((0, import_mutatorContext.isInZeroMutation)()) {
|
|
146
|
+
var {
|
|
147
|
+
tx
|
|
148
|
+
} = (0, import_mutatorContext.mutatorContext)();
|
|
149
|
+
return await query2(tx);
|
|
150
|
+
}
|
|
151
|
+
return await database.transaction(query2, dummyTransactionInput);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
if ((err === null || err === void 0 ? void 0 : err.name) !== "PermissionError") {
|
|
154
|
+
console.error(`Error running transaction(): ${err}`);
|
|
155
|
+
}
|
|
156
|
+
throw err;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function transaction(query2) {
|
|
160
|
+
return runTransaction(createDatabase(), query2);
|
|
161
|
+
}
|
|
162
|
+
async function runMutate(modelName, mutatorName, mutatorArg, options) {
|
|
163
|
+
var authData = options === null || options === void 0 ? void 0 : options.authData;
|
|
164
|
+
if (!authData) {
|
|
165
|
+
var scoped = (0, import_mutatorContext.getScopedAuthData)();
|
|
166
|
+
if (scoped) authData = scoped;
|
|
167
|
+
}
|
|
168
|
+
var tasks = createAsyncTaskCollector();
|
|
169
|
+
var mutators = (0, import_createMutators.createMutators)({
|
|
170
|
+
models,
|
|
171
|
+
environment: "server",
|
|
172
|
+
enqueueTask: tasks.enqueueTask,
|
|
173
|
+
authData: {
|
|
174
|
+
...defaultMutateAuthData,
|
|
175
|
+
...authData
|
|
176
|
+
},
|
|
177
|
+
createServerActions,
|
|
178
|
+
can: permissions.can,
|
|
179
|
+
validateMutation,
|
|
180
|
+
mutationValidators
|
|
181
|
+
});
|
|
182
|
+
var modelMutators = mutators[modelName];
|
|
183
|
+
var mutator = modelMutators[mutatorName];
|
|
184
|
+
await runTransaction(createDatabaseWithLifecycle(createDatabase(), tasks.lifecycle), async function (tx) {
|
|
185
|
+
await mutator(tx, mutatorArg);
|
|
186
|
+
});
|
|
187
|
+
if (tasks.committed.length) {
|
|
188
|
+
var resolvedAuth = authData !== null && authData !== void 0 ? authData : null;
|
|
189
|
+
var entries = tasks.committed.map(function (entry) {
|
|
190
|
+
return {
|
|
191
|
+
...entry,
|
|
192
|
+
task: function () {
|
|
193
|
+
return (0, import_mutatorContext.runWithAuthScope)(resolvedAuth, entry.task);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
if (options === null || options === void 0 ? void 0 : options.awaitEffects) {
|
|
198
|
+
await Promise.all(entries.map(function (param2) {
|
|
199
|
+
var {
|
|
200
|
+
task
|
|
201
|
+
} = param2;
|
|
202
|
+
return task();
|
|
203
|
+
}));
|
|
204
|
+
} else {
|
|
205
|
+
await (0, import_asyncTasks.runAsyncTaskEntries)(entries, {
|
|
206
|
+
background: function () {
|
|
207
|
+
return void 0;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
var mutate = new Proxy({}, {
|
|
214
|
+
get(_, modelName) {
|
|
215
|
+
return new Proxy({}, {
|
|
216
|
+
get(_2, mutatorName) {
|
|
217
|
+
return function (arg, options) {
|
|
218
|
+
return runMutate(modelName, mutatorName, arg, options);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
function query(cb, authData) {
|
|
225
|
+
var run = function () {
|
|
226
|
+
return transaction(async function (tx) {
|
|
227
|
+
return tx.run(cb((0, import_state.getZQL)()));
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
if (authData !== void 0) {
|
|
231
|
+
return (0, import_queryContext.runWithQueryContext)({
|
|
232
|
+
authData
|
|
233
|
+
}, run);
|
|
234
|
+
}
|
|
235
|
+
return run();
|
|
236
|
+
}
|
|
237
|
+
if (queries) {
|
|
238
|
+
(0, import_run.setCustomQueries)(queries);
|
|
239
|
+
}
|
|
240
|
+
(0, import_zeroRunner.setRunner)(function (queryObj) {
|
|
241
|
+
return transaction(async function (tx) {
|
|
242
|
+
return tx.run(queryObj);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
return {
|
|
246
|
+
permissions,
|
|
247
|
+
server: {
|
|
248
|
+
transaction,
|
|
249
|
+
mutate,
|
|
250
|
+
query
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function createZeroDirectServer(options) {
|
|
255
|
+
return createZeroDirectServerRuntime(options).server;
|
|
256
|
+
}
|
|
257
|
+
function createDatabaseWithLifecycle(database, lifecycle) {
|
|
258
|
+
return {
|
|
259
|
+
async transaction(callback, input) {
|
|
260
|
+
try {
|
|
261
|
+
var value = await database.transaction(async function (tx, hooks) {
|
|
262
|
+
lifecycle.beginAttempt();
|
|
263
|
+
try {
|
|
264
|
+
var result = await callback(tx, hooks);
|
|
265
|
+
lifecycle.completeAttempt();
|
|
266
|
+
return result;
|
|
267
|
+
} catch (error) {
|
|
268
|
+
lifecycle.rollbackAttempt();
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
}, input);
|
|
272
|
+
lifecycle.commitTransaction();
|
|
273
|
+
return value;
|
|
274
|
+
} catch (error) {
|
|
275
|
+
lifecycle.rollbackTransaction();
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
var dummyTransactionInput = {
|
|
282
|
+
clientGroupID: "unused",
|
|
283
|
+
clientID: "unused",
|
|
284
|
+
mutationID: 42,
|
|
285
|
+
upstreamSchema: "unused"
|
|
286
|
+
};
|
|
287
|
+
//# sourceMappingURL=createZeroDirectServer.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createZeroDirectServer_exports","__export","createAsyncTaskCollector","createZeroDirectServer","createZeroDirectServerRuntime","resolveServerQuery","module","exports","import_zero","require","import_asyncTasks","import_createPermissions","import_createMutators","import_mutatorContext","import_queryContext","import_modelRegistry","import_run","import_state","import_where","import_zeroRunner","param","authData","name","args","queries","permissions","validateQuery","startsWith","table","slice","length","objOrId","permission","getMutationsPermissions","Error","setEvaluatingPermission","getZQL","where","eb","buildPermissionQuery","one","queryName","params","query","mustGetQuery","fn","ctx","committed","attempt","completedAttempt","enqueueTask","task","opts","entries","push","barrier","lifecycle","beginAttempt","completeAttempt","rollbackAttempt","commitTransaction","rollbackTransaction","createDatabase","createServerActions","defaultAllowAdminRole","defaultMutateAuthData","models","mutations","mutationValidators","schema","validateMutation","setSchema","setEnvironment","createPermissions","environment","adminRoleMode","runTransaction","database","query2","isInZeroMutation","tx","mutatorContext","transaction","dummyTransactionInput","err","console","error","runMutate","modelName","mutatorName","mutatorArg","options","scoped","getScopedAuthData","tasks","mutators","createMutators","can","modelMutators","mutator","createDatabaseWithLifecycle","resolvedAuth","map","entry","runWithAuthScope","awaitEffects","Promise","all","param2","runAsyncTaskEntries","background","mutate","Proxy","get","_","_2","arg","cb","run","runWithQueryContext","setCustomQueries","setRunner","queryObj","server","callback","input","hooks","result","clientGroupID"],"sources":["../../src/createZeroDirectServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -17,21 +17,21 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
}
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
20
21
|
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
21
22
|
value: true
|
|
22
23
|
}), mod);
|
|
23
24
|
var createZeroSQLiteServer_exports = {};
|
|
24
25
|
__export(createZeroSQLiteServer_exports, {
|
|
25
|
-
createZeroSQLiteServer: () => createZeroSQLiteServer
|
|
26
|
-
createZeroSQLiteTransaction: () => createZeroSQLiteTransaction
|
|
26
|
+
createZeroSQLiteServer: () => createZeroSQLiteServer
|
|
27
27
|
});
|
|
28
28
|
module.exports = __toCommonJS(createZeroSQLiteServer_exports);
|
|
29
|
-
var import_zero = require("@rocicorp/zero");
|
|
30
|
-
var import_bindings = require("@rocicorp/zero/bindings");
|
|
31
29
|
var import_createZeroServerCore = require("./createZeroServerCore.cjs");
|
|
30
|
+
var import_sqliteRuntime = require("./sqliteRuntime.cjs");
|
|
31
|
+
__reExport(createZeroSQLiteServer_exports, require("./sqliteRuntime.cjs"), module.exports);
|
|
32
32
|
function createZeroSQLiteServer({
|
|
33
|
-
encodeValue = encodeSQLiteValue,
|
|
34
|
-
ledgerTables = defaultLedgerTables,
|
|
33
|
+
encodeValue = import_sqliteRuntime.encodeSQLiteValue,
|
|
34
|
+
ledgerTables = import_sqliteRuntime.defaultLedgerTables,
|
|
35
35
|
transactionProvider,
|
|
36
36
|
...options
|
|
37
37
|
}) {
|
|
@@ -44,276 +44,7 @@ function createZeroSQLiteServer({
|
|
|
44
44
|
};
|
|
45
45
|
return (0, import_createZeroServerCore.createZeroServerCore)({
|
|
46
46
|
...options,
|
|
47
|
-
createDatabase: () => createSQLiteDatabase(databaseOptions),
|
|
48
|
-
persistAlreadyProcessed: args => persistAlreadyProcessedMutationResults(databaseOptions, args)
|
|
47
|
+
createDatabase: () => (0, import_sqliteRuntime.createSQLiteDatabase)(databaseOptions),
|
|
48
|
+
persistAlreadyProcessed: args => (0, import_sqliteRuntime.persistAlreadyProcessedMutationResults)(databaseOptions, args)
|
|
49
49
|
});
|
|
50
|
-
}
|
|
51
|
-
function createSQLiteDatabase(options) {
|
|
52
|
-
return {
|
|
53
|
-
async transaction(callback, input) {
|
|
54
|
-
let committedLedgers = /* @__PURE__ */new Set();
|
|
55
|
-
const value = await options.transactionProvider(async executor => {
|
|
56
|
-
const attemptLedgers = /* @__PURE__ */new Set();
|
|
57
|
-
const ensureLedger = async upstreamSchema => {
|
|
58
|
-
const tables = options.ledgerTables(upstreamSchema);
|
|
59
|
-
const key = ledgerKey(tables);
|
|
60
|
-
if (options.initializedLedgers.has(key) || attemptLedgers.has(key)) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
await createLedgerTables(executor, tables);
|
|
64
|
-
attemptLedgers.add(key);
|
|
65
|
-
};
|
|
66
|
-
const transaction = createZeroSQLiteTransaction(options, executor, input);
|
|
67
|
-
const result = await callback(transaction, createLedgerHooks(options, executor, ensureLedger, input));
|
|
68
|
-
committedLedgers = attemptLedgers;
|
|
69
|
-
return result;
|
|
70
|
-
});
|
|
71
|
-
for (const key of committedLedgers) options.initializedLedgers.add(key);
|
|
72
|
-
return value;
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
function createZeroSQLiteTransaction(options, executor, input) {
|
|
77
|
-
const transactionOptions = {
|
|
78
|
-
encodeValue: options.encodeValue ?? encodeSQLiteValue,
|
|
79
|
-
schema: options.schema
|
|
80
|
-
};
|
|
81
|
-
const clientID = input?.clientID ?? "";
|
|
82
|
-
const mutationID = input?.mutationID ?? 0;
|
|
83
|
-
const mutate = new Proxy({}, {
|
|
84
|
-
get(_target, tableKey) {
|
|
85
|
-
const tableName = String(tableKey);
|
|
86
|
-
if (!options.schema.tables[tableName]) {
|
|
87
|
-
throw new Error(`unknown SQLite mutation table ${tableName}`);
|
|
88
|
-
}
|
|
89
|
-
return new Proxy({}, {
|
|
90
|
-
get(_innerTarget, kindKey) {
|
|
91
|
-
const kind = String(kindKey);
|
|
92
|
-
if (!isCrudKind(kind)) return;
|
|
93
|
-
return value => executeCrud(transactionOptions, executor, tableName, kind, value);
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
const runQuery = (ast, format, queryName) => Promise.resolve(executor.queryAst(ast, format, queryName));
|
|
99
|
-
const dbTransaction = {
|
|
100
|
-
wrappedTransaction: executor,
|
|
101
|
-
query: (sql, args) => executor.query(sql, args),
|
|
102
|
-
runQuery
|
|
103
|
-
};
|
|
104
|
-
return {
|
|
105
|
-
clientID,
|
|
106
|
-
dbTransaction,
|
|
107
|
-
location: "server",
|
|
108
|
-
mutate,
|
|
109
|
-
mutationID,
|
|
110
|
-
query: transactionOptions.schema.enableLegacyQueries ? createLegacyQueryBuilder(transactionOptions.schema, query => {
|
|
111
|
-
const internals = (0, import_bindings.asQueryInternals)(query);
|
|
112
|
-
return runQuery(internals.ast, internals.format, internals.customQueryID?.name);
|
|
113
|
-
}) : void 0,
|
|
114
|
-
reason: "authoritative",
|
|
115
|
-
async run(query) {
|
|
116
|
-
const internals = (0, import_bindings.asQueryInternals)(query);
|
|
117
|
-
return runQuery(internals.ast, internals.format, internals.customQueryID?.name);
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
function isCrudKind(value) {
|
|
122
|
-
return value === "delete" || value === "insert" || value === "update" || value === "upsert";
|
|
123
|
-
}
|
|
124
|
-
async function executeCrud(options, executor, tableName, kind, raw) {
|
|
125
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
126
|
-
throw new Error(`${tableName}.${kind} expects an object`);
|
|
127
|
-
}
|
|
128
|
-
const table = options.schema.tables[tableName];
|
|
129
|
-
const values = Object.fromEntries(Object.entries(raw).filter(([, value]) => value !== void 0));
|
|
130
|
-
for (const columnName of Object.keys(values)) {
|
|
131
|
-
if (!table.columns[columnName]) {
|
|
132
|
-
throw new Error(`unknown SQLite column ${tableName}.${columnName}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
const primaryValues = table.primaryKey.map(columnName => {
|
|
136
|
-
if (!(columnName in values)) {
|
|
137
|
-
throw new Error(`${tableName}.${kind} is missing primary key ${columnName}`);
|
|
138
|
-
}
|
|
139
|
-
return encodeColumn(options, tableName, columnName, values[columnName]);
|
|
140
|
-
});
|
|
141
|
-
const primaryWhere = table.primaryKey.map(columnName => `${quoteSQLiteIdentifier(serverColumn(table, columnName))} = ?`).join(" AND ");
|
|
142
|
-
const serverTableName = quoteSQLiteIdentifier(table.serverName ?? table.name);
|
|
143
|
-
if (kind === "delete") {
|
|
144
|
-
await executor.exec(`DELETE FROM ${serverTableName} WHERE ${primaryWhere}`, primaryValues);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
const columnNames = Object.keys(values);
|
|
148
|
-
if (columnNames.length === 0) {
|
|
149
|
-
throw new Error(`${tableName}.${kind} has no values`);
|
|
150
|
-
}
|
|
151
|
-
const serverColumns = columnNames.map(columnName => quoteSQLiteIdentifier(serverColumn(table, columnName)));
|
|
152
|
-
const params = columnNames.map(columnName => encodeColumn(options, tableName, columnName, values[columnName]));
|
|
153
|
-
const insert = `INSERT INTO ${serverTableName} (${serverColumns.join(", ")}) VALUES (${columnNames.map(() => "?").join(", ")})`;
|
|
154
|
-
if (kind === "insert") {
|
|
155
|
-
await executor.exec(insert, params);
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
if (kind === "upsert") {
|
|
159
|
-
const mutableColumns2 = columnNames.filter(columnName => !table.primaryKey.includes(columnName));
|
|
160
|
-
const conflictColumns = table.primaryKey.map(columnName => quoteSQLiteIdentifier(serverColumn(table, columnName))).join(", ");
|
|
161
|
-
const conflictAction = mutableColumns2.length === 0 ? "DO NOTHING" : `DO UPDATE SET ${mutableColumns2.map(columnName => {
|
|
162
|
-
const column = quoteSQLiteIdentifier(serverColumn(table, columnName));
|
|
163
|
-
return `${column} = excluded.${column}`;
|
|
164
|
-
}).join(", ")}`;
|
|
165
|
-
await executor.exec(`${insert} ON CONFLICT (${conflictColumns}) ${conflictAction}`, params);
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
const mutableColumns = columnNames.filter(columnName => !table.primaryKey.includes(columnName));
|
|
169
|
-
if (mutableColumns.length === 0) return;
|
|
170
|
-
await executor.exec(`UPDATE ${serverTableName} SET ${mutableColumns.map(columnName => `${quoteSQLiteIdentifier(serverColumn(table, columnName))} = ?`).join(", ")} WHERE ${primaryWhere}`, [...mutableColumns.map(columnName => encodeColumn(options, tableName, columnName, values[columnName])), ...primaryValues]);
|
|
171
|
-
}
|
|
172
|
-
function serverColumn(table, columnName) {
|
|
173
|
-
const column = table.columns[columnName];
|
|
174
|
-
if (!column) throw new Error(`unknown SQLite column ${table.name}.${columnName}`);
|
|
175
|
-
return column.serverName ?? columnName;
|
|
176
|
-
}
|
|
177
|
-
function encodeColumn(options, tableName, columnName, value) {
|
|
178
|
-
return options.encodeValue(value, {
|
|
179
|
-
column: options.schema.tables[tableName].columns[columnName],
|
|
180
|
-
columnName,
|
|
181
|
-
tableName
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
function createLegacyQueryBuilder(schema, run) {
|
|
185
|
-
const builder = (0, import_zero.createBuilder)(schema);
|
|
186
|
-
return new Proxy(builder, {
|
|
187
|
-
get(target, property) {
|
|
188
|
-
return makeRunnableQuery(Reflect.get(target, property, target), run);
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
function makeRunnableQuery(query, run) {
|
|
193
|
-
if (!isQueryBuilder(query)) return query;
|
|
194
|
-
return new Proxy(query, {
|
|
195
|
-
get(target, property) {
|
|
196
|
-
if (property === "run") return () => run(target);
|
|
197
|
-
if (property === "materialize" || property === "preload") {
|
|
198
|
-
return () => {
|
|
199
|
-
throw new Error(`${String(property)}() is not supported in server transactions`);
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
const value = Reflect.get(target, property, target);
|
|
203
|
-
if (typeof value !== "function") return value;
|
|
204
|
-
return (...args) => makeRunnableQuery(Reflect.apply(value, target, args), run);
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
function isQueryBuilder(value) {
|
|
209
|
-
if (!value || typeof value !== "object") return false;
|
|
210
|
-
try {
|
|
211
|
-
(0, import_bindings.asQueryInternals)(value);
|
|
212
|
-
return true;
|
|
213
|
-
} catch {
|
|
214
|
-
return false;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
function createLedgerHooks(options, executor, ensureLedger, input) {
|
|
218
|
-
const upstreamSchema = input?.upstreamSchema ?? "";
|
|
219
|
-
const clientGroupID = input?.clientGroupID ?? "";
|
|
220
|
-
const clientID = input?.clientID ?? "";
|
|
221
|
-
const tables = options.ledgerTables(upstreamSchema);
|
|
222
|
-
const clientsTable = quoteSQLiteIdentifier(tables.clients);
|
|
223
|
-
const mutationsTable = quoteSQLiteIdentifier(tables.mutations);
|
|
224
|
-
return {
|
|
225
|
-
async updateClientMutationID() {
|
|
226
|
-
await ensureLedger(upstreamSchema);
|
|
227
|
-
const rows = await executor.query(`INSERT INTO ${clientsTable}
|
|
228
|
-
(clientGroupID, clientID, lastMutationID)
|
|
229
|
-
VALUES (?, ?, 1)
|
|
230
|
-
ON CONFLICT (clientGroupID, clientID)
|
|
231
|
-
DO UPDATE SET lastMutationID = lastMutationID + 1
|
|
232
|
-
RETURNING lastMutationID`, [clientGroupID, clientID]);
|
|
233
|
-
const lastMutationID = rows[0]?.lastMutationID;
|
|
234
|
-
if (typeof lastMutationID !== "number" && typeof lastMutationID !== "bigint") {
|
|
235
|
-
throw new Error("SQLite mutation ledger returned no lastMutationID");
|
|
236
|
-
}
|
|
237
|
-
return {
|
|
238
|
-
lastMutationID
|
|
239
|
-
};
|
|
240
|
-
},
|
|
241
|
-
async writeMutationResult(result) {
|
|
242
|
-
await ensureLedger(upstreamSchema);
|
|
243
|
-
await executor.exec(`INSERT INTO ${mutationsTable}
|
|
244
|
-
(clientGroupID, clientID, mutationID, result)
|
|
245
|
-
VALUES (?, ?, ?, ?)`, [clientGroupID, result.id.clientID, result.id.id, JSON.stringify(result.result)]);
|
|
246
|
-
},
|
|
247
|
-
async deleteMutationResults(args) {
|
|
248
|
-
await ensureLedger(upstreamSchema);
|
|
249
|
-
if ("type" in args && args.type === "bulk") {
|
|
250
|
-
if (args.clientIDs.length === 0) return;
|
|
251
|
-
await executor.exec(`DELETE FROM ${mutationsTable}
|
|
252
|
-
WHERE clientGroupID = ?
|
|
253
|
-
AND clientID IN (${args.clientIDs.map(() => "?").join(", ")})`, [args.clientGroupID, ...args.clientIDs]);
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
await executor.exec(`DELETE FROM ${mutationsTable}
|
|
257
|
-
WHERE clientGroupID = ?
|
|
258
|
-
AND clientID = ?
|
|
259
|
-
AND mutationID <= ?`, [args.clientGroupID, args.clientID, args.upToMutationID]);
|
|
260
|
-
}
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
async function persistAlreadyProcessedMutationResults(options, {
|
|
264
|
-
clientGroupID,
|
|
265
|
-
mutations,
|
|
266
|
-
upstreamSchema
|
|
267
|
-
}) {
|
|
268
|
-
const tables = options.ledgerTables(upstreamSchema);
|
|
269
|
-
const table = quoteSQLiteIdentifier(tables.mutations);
|
|
270
|
-
const key = ledgerKey(tables);
|
|
271
|
-
await options.transactionProvider(async executor => {
|
|
272
|
-
if (!options.initializedLedgers.has(key)) {
|
|
273
|
-
await createLedgerTables(executor, tables);
|
|
274
|
-
}
|
|
275
|
-
for (const mutation of mutations) {
|
|
276
|
-
await executor.exec(`INSERT INTO ${table}
|
|
277
|
-
(clientGroupID, clientID, mutationID, result)
|
|
278
|
-
VALUES (?, ?, ?, ?)
|
|
279
|
-
ON CONFLICT (clientGroupID, clientID, mutationID) DO NOTHING`, [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)]);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
options.initializedLedgers.add(key);
|
|
283
|
-
}
|
|
284
|
-
async function createLedgerTables(executor, tables) {
|
|
285
|
-
await executor.exec(`CREATE TABLE IF NOT EXISTS ${quoteSQLiteIdentifier(tables.clients)} (
|
|
286
|
-
clientGroupID TEXT NOT NULL,
|
|
287
|
-
clientID TEXT NOT NULL,
|
|
288
|
-
lastMutationID INTEGER NOT NULL,
|
|
289
|
-
PRIMARY KEY (clientGroupID, clientID)
|
|
290
|
-
)`);
|
|
291
|
-
await executor.exec(`CREATE TABLE IF NOT EXISTS ${quoteSQLiteIdentifier(tables.mutations)} (
|
|
292
|
-
clientGroupID TEXT NOT NULL,
|
|
293
|
-
clientID TEXT NOT NULL,
|
|
294
|
-
mutationID INTEGER NOT NULL,
|
|
295
|
-
result TEXT NOT NULL,
|
|
296
|
-
PRIMARY KEY (clientGroupID, clientID, mutationID)
|
|
297
|
-
)`);
|
|
298
|
-
}
|
|
299
|
-
function ledgerKey(tables) {
|
|
300
|
-
return `${tables.clients}\0${tables.mutations}`;
|
|
301
|
-
}
|
|
302
|
-
function defaultLedgerTables(upstreamSchema) {
|
|
303
|
-
const prefix = upstreamSchema ? `${upstreamSchema}_` : "";
|
|
304
|
-
return {
|
|
305
|
-
clients: `${prefix}clients`,
|
|
306
|
-
mutations: `${prefix}mutations`
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
function encodeSQLiteValue(value, {
|
|
310
|
-
column
|
|
311
|
-
}) {
|
|
312
|
-
if (value === null) return null;
|
|
313
|
-
if (column.type === "boolean") return value ? 1 : 0;
|
|
314
|
-
if (column.type === "json") return JSON.stringify(value);
|
|
315
|
-
return value;
|
|
316
|
-
}
|
|
317
|
-
function quoteSQLiteIdentifier(value) {
|
|
318
|
-
return `"${value.replaceAll('"', '""')}"`;
|
|
319
50
|
}
|