on-zero 0.6.12 → 0.6.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/cjs/createZeroSQLiteServer.cjs +319 -0
  2. package/dist/cjs/createZeroSQLiteServer.native.js +440 -0
  3. package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -0
  4. package/dist/cjs/createZeroSQLiteServer.test.cjs +429 -0
  5. package/dist/cjs/createZeroSQLiteServer.test.native.js +466 -0
  6. package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -0
  7. package/dist/cjs/createZeroServer.cjs +20 -234
  8. package/dist/cjs/createZeroServer.native.js +24 -250
  9. package/dist/cjs/createZeroServer.native.js.map +1 -1
  10. package/dist/cjs/createZeroServer.test.cjs +35 -1
  11. package/dist/cjs/createZeroServer.test.native.js +38 -1
  12. package/dist/cjs/createZeroServer.test.native.js.map +1 -1
  13. package/dist/cjs/createZeroServerCore.cjs +362 -0
  14. package/dist/cjs/createZeroServerCore.native.js +389 -0
  15. package/dist/cjs/createZeroServerCore.native.js.map +1 -0
  16. package/dist/cjs/generate-lite.cjs +1 -0
  17. package/dist/cjs/generate-lite.native.js +1 -0
  18. package/dist/cjs/generate-lite.native.js.map +1 -1
  19. package/dist/cjs/generate-lite.test.cjs +5 -1
  20. package/dist/cjs/generate-lite.test.native.js +5 -1
  21. package/dist/cjs/generate-lite.test.native.js.map +1 -1
  22. package/dist/cjs/generate.cjs +20 -11
  23. package/dist/cjs/generate.native.js +29 -21
  24. package/dist/cjs/generate.native.js.map +1 -1
  25. package/dist/cjs/generate.test.cjs +110 -0
  26. package/dist/cjs/generate.test.native.js +110 -0
  27. package/dist/cjs/generate.test.native.js.map +1 -1
  28. package/dist/cjs/httpPull/transport.test.cjs +5 -4
  29. package/dist/cjs/httpPull/transport.test.native.js +6 -5
  30. package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
  31. package/dist/cjs/httpPullTransport.cjs +2 -1
  32. package/dist/cjs/httpPullTransport.native.js +3 -2
  33. package/dist/cjs/httpPullTransport.native.js.map +1 -1
  34. package/dist/cjs/server.cjs +2 -1
  35. package/dist/cjs/syncHost.cjs +164 -0
  36. package/dist/cjs/syncHost.native.js +371 -0
  37. package/dist/cjs/syncHost.native.js.map +1 -0
  38. package/dist/cjs/syncHost.test.cjs +229 -0
  39. package/dist/cjs/syncHost.test.native.js +278 -0
  40. package/dist/cjs/syncHost.test.native.js.map +1 -0
  41. package/dist/esm/createZeroSQLiteServer.mjs +293 -0
  42. package/dist/esm/createZeroSQLiteServer.mjs.map +1 -0
  43. package/dist/esm/createZeroSQLiteServer.native.js +411 -0
  44. package/dist/esm/createZeroSQLiteServer.native.js.map +1 -0
  45. package/dist/esm/createZeroSQLiteServer.test.mjs +430 -0
  46. package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -0
  47. package/dist/esm/createZeroSQLiteServer.test.native.js +464 -0
  48. package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -0
  49. package/dist/esm/createZeroServer.mjs +17 -231
  50. package/dist/esm/createZeroServer.mjs.map +1 -1
  51. package/dist/esm/createZeroServer.native.js +21 -247
  52. package/dist/esm/createZeroServer.native.js.map +1 -1
  53. package/dist/esm/createZeroServer.test.mjs +35 -1
  54. package/dist/esm/createZeroServer.test.mjs.map +1 -1
  55. package/dist/esm/createZeroServer.test.native.js +38 -1
  56. package/dist/esm/createZeroServer.test.native.js.map +1 -1
  57. package/dist/esm/createZeroServerCore.mjs +336 -0
  58. package/dist/esm/createZeroServerCore.mjs.map +1 -0
  59. package/dist/esm/createZeroServerCore.native.js +360 -0
  60. package/dist/esm/createZeroServerCore.native.js.map +1 -0
  61. package/dist/esm/generate-lite.mjs +1 -0
  62. package/dist/esm/generate-lite.mjs.map +1 -1
  63. package/dist/esm/generate-lite.native.js +1 -0
  64. package/dist/esm/generate-lite.native.js.map +1 -1
  65. package/dist/esm/generate-lite.test.mjs +5 -1
  66. package/dist/esm/generate-lite.test.mjs.map +1 -1
  67. package/dist/esm/generate-lite.test.native.js +5 -1
  68. package/dist/esm/generate-lite.test.native.js.map +1 -1
  69. package/dist/esm/generate.mjs +20 -11
  70. package/dist/esm/generate.mjs.map +1 -1
  71. package/dist/esm/generate.native.js +29 -21
  72. package/dist/esm/generate.native.js.map +1 -1
  73. package/dist/esm/generate.test.mjs +87 -1
  74. package/dist/esm/generate.test.mjs.map +1 -1
  75. package/dist/esm/generate.test.native.js +87 -1
  76. package/dist/esm/generate.test.native.js.map +1 -1
  77. package/dist/esm/httpPull/transport.test.mjs +5 -4
  78. package/dist/esm/httpPull/transport.test.mjs.map +1 -1
  79. package/dist/esm/httpPull/transport.test.native.js +6 -5
  80. package/dist/esm/httpPull/transport.test.native.js.map +1 -1
  81. package/dist/esm/httpPullTransport.mjs +2 -1
  82. package/dist/esm/httpPullTransport.mjs.map +1 -1
  83. package/dist/esm/httpPullTransport.native.js +3 -2
  84. package/dist/esm/httpPullTransport.native.js.map +1 -1
  85. package/dist/esm/server.mjs +1 -0
  86. package/dist/esm/server.mjs.map +1 -1
  87. package/dist/esm/syncHost.mjs +138 -0
  88. package/dist/esm/syncHost.mjs.map +1 -0
  89. package/dist/esm/syncHost.native.js +342 -0
  90. package/dist/esm/syncHost.native.js.map +1 -0
  91. package/dist/esm/syncHost.test.mjs +206 -0
  92. package/dist/esm/syncHost.test.mjs.map +1 -0
  93. package/dist/esm/syncHost.test.native.js +252 -0
  94. package/dist/esm/syncHost.test.native.js.map +1 -0
  95. package/package.json +19 -3
  96. package/readme.md +26 -0
  97. package/src/createZeroSQLiteServer.test.ts +461 -0
  98. package/src/createZeroSQLiteServer.ts +523 -0
  99. package/src/createZeroServer.test.ts +39 -1
  100. package/src/createZeroServer.ts +35 -428
  101. package/src/createZeroServerCore.ts +557 -0
  102. package/src/generate-lite.test.ts +4 -0
  103. package/src/generate-lite.ts +1 -0
  104. package/src/generate.test.ts +87 -1
  105. package/src/generate.ts +29 -20
  106. package/src/httpPull/transport.test.ts +6 -5
  107. package/src/httpPullTransport.ts +9 -4
  108. package/src/server.ts +1 -0
  109. package/src/syncHost.test.ts +216 -0
  110. package/src/syncHost.ts +255 -0
  111. package/test-fixtures/server-return-types.ts +50 -0
  112. package/test-fixtures/tsconfig.json +13 -0
  113. package/types/createZeroSQLiteServer.d.ts +37 -0
  114. package/types/createZeroSQLiteServer.d.ts.map +1 -0
  115. package/types/createZeroSQLiteServer.test.d.ts +2 -0
  116. package/types/createZeroSQLiteServer.test.d.ts.map +1 -0
  117. package/types/createZeroServer.d.ts +11 -293
  118. package/types/createZeroServer.d.ts.map +1 -1
  119. package/types/createZeroServerCore.d.ts +310 -0
  120. package/types/createZeroServerCore.d.ts.map +1 -0
  121. package/types/generate-lite.d.ts.map +1 -1
  122. package/types/generate.d.ts +2 -1
  123. package/types/generate.d.ts.map +1 -1
  124. package/types/httpPullTransport.d.ts +1 -0
  125. package/types/httpPullTransport.d.ts.map +1 -1
  126. package/types/server.d.ts +1 -0
  127. package/types/server.d.ts.map +1 -1
  128. package/types/syncHost.d.ts +51 -0
  129. package/types/syncHost.d.ts.map +1 -0
  130. package/types/syncHost.test.d.ts +2 -0
  131. package/types/syncHost.test.d.ts.map +1 -0
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: () => from[key],
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
+ // If the importer is in node compatibility mode or this is not an ESM
20
+ // file that has been converted to a CommonJS file using a Babel-
21
+ // compatible transform (i.e. "__esModule" has not been set), then set
22
+ // "default" to the CommonJS "module.exports" for node compatibility.
23
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
24
+ value: mod,
25
+ enumerable: true
26
+ }) : target, mod));
27
+ var import_node_sqlite = require("node:sqlite");
28
+ var import_zero = require("@rocicorp/zero");
29
+ var v = __toESM(require("valibot"), 1);
30
+ var import_vitest = require("vitest");
31
+ var import_mutatorContext = require("./helpers/mutatorContext.native.js");
32
+ var import_fixtureSchema = require("./httpPull/fixtureSchema.native.js");
33
+ var import_syncHost = require("./syncHost.native.js");
34
+ var import_zql = require("./zql.native.js");
35
+ var queries = (0, import_zero.defineQueries)({
36
+ project: {
37
+ byOwner: (0, import_zero.defineQuery)(v.object({
38
+ ownerId: v.string()
39
+ }), function (param) {
40
+ var {
41
+ args
42
+ } = param;
43
+ return import_zql.zql.project.where("ownerId", args.ownerId);
44
+ })
45
+ }
46
+ });
47
+ (0, import_vitest.describe)("createZeroSyncHostAdapter", function () {
48
+ var db;
49
+ var executor;
50
+ var transaction;
51
+ var lastQueryFormat;
52
+ (0, import_vitest.beforeEach)(function () {
53
+ db = new import_node_sqlite.DatabaseSync(":memory:");
54
+ db.exec("CREATE TABLE project (id TEXT PRIMARY KEY, ownerId TEXT NOT NULL, name TEXT NOT NULL)");
55
+ executor = {
56
+ exec(sql) {
57
+ var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
58
+ db.prepare(sql).run(...params);
59
+ },
60
+ query(sql) {
61
+ var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
62
+ return db.prepare(sql).all(...params);
63
+ },
64
+ queryAst(_ast, format) {
65
+ lastQueryFormat = format;
66
+ var rows = db.prepare("SELECT * FROM project ORDER BY id").all();
67
+ return format.singular ? rows[0] : rows;
68
+ }
69
+ };
70
+ transaction = async function (work) {
71
+ var effects = [];
72
+ db.exec("BEGIN");
73
+ try {
74
+ var value = await work(executor, {
75
+ defer(effect2) {
76
+ effects.push(effect2);
77
+ }
78
+ });
79
+ db.exec("COMMIT");
80
+ var _iteratorNormalCompletion = true,
81
+ _didIteratorError = false,
82
+ _iteratorError = void 0;
83
+ try {
84
+ for (var _iterator = effects[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
85
+ var effect = _step.value;
86
+ await effect();
87
+ }
88
+ } catch (err) {
89
+ _didIteratorError = true;
90
+ _iteratorError = err;
91
+ } finally {
92
+ try {
93
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
94
+ _iterator.return();
95
+ }
96
+ } finally {
97
+ if (_didIteratorError) {
98
+ throw _iteratorError;
99
+ }
100
+ }
101
+ }
102
+ return value;
103
+ } catch (error) {
104
+ db.exec("ROLLBACK");
105
+ throw error;
106
+ }
107
+ };
108
+ });
109
+ (0, import_vitest.afterEach)(function () {
110
+ db.close();
111
+ });
112
+ (0, import_vitest.test)("adapts pipe-named mutators, auth, validation, and deferred effects", async function () {
113
+ var effectAuthID;
114
+ var validatedAuthID;
115
+ var adapter = (0, import_syncHost.createZeroSyncHostAdapter)({
116
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
117
+ models: {
118
+ project: {
119
+ mutate: {
120
+ create: async function (param, value) {
121
+ var {
122
+ authData,
123
+ server,
124
+ tx
125
+ } = param;
126
+ (0, import_vitest.expect)(authData === null || authData === void 0 ? void 0 : authData.id).toBe("u1");
127
+ await tx.mutate.project.insert(value);
128
+ server === null || server === void 0 ? void 0 : server.asyncTasks.push(async function () {
129
+ var _getScopedAuthData;
130
+ effectAuthID = (_getScopedAuthData = (0, import_mutatorContext.getScopedAuthData)()) === null || _getScopedAuthData === void 0 ? void 0 : _getScopedAuthData.id;
131
+ });
132
+ }
133
+ }
134
+ }
135
+ },
136
+ createServerActions: function () {
137
+ return {};
138
+ },
139
+ queries,
140
+ transaction,
141
+ validateMutation(param) {
142
+ var {
143
+ authData
144
+ } = param;
145
+ validatedAuthID = authData === null || authData === void 0 ? void 0 : authData.id;
146
+ }
147
+ });
148
+ (0, import_vitest.expect)(Object.keys(adapter.mutators)).toEqual(["project|create", "_zero_cleanupResults"]);
149
+ await transaction(function (tx, context) {
150
+ return adapter.mutators["project|create"](tx, {
151
+ id: "p1",
152
+ ownerId: "u1",
153
+ name: "first"
154
+ }, mutationContext(context));
155
+ });
156
+ (0, import_vitest.expect)(db.prepare("SELECT * FROM project").all()).toEqual([{
157
+ id: "p1",
158
+ ownerId: "u1",
159
+ name: "first"
160
+ }]);
161
+ (0, import_vitest.expect)(validatedAuthID).toBe("u1");
162
+ (0, import_vitest.expect)(effectAuthID).toBe("u1");
163
+ });
164
+ (0, import_vitest.test)("returns a structural application error and drops rolled-back effects", async function () {
165
+ var effectRuns = 0;
166
+ var adapter = (0, import_syncHost.createZeroSyncHostAdapter)({
167
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
168
+ models: {
169
+ project: {
170
+ mutate: {
171
+ reject: async function (param, value) {
172
+ var {
173
+ server,
174
+ tx
175
+ } = param;
176
+ await tx.mutate.project.insert(value);
177
+ server === null || server === void 0 ? void 0 : server.asyncTasks.push(async function () {
178
+ effectRuns++;
179
+ });
180
+ throw new Error("denied");
181
+ }
182
+ }
183
+ }
184
+ },
185
+ createServerActions: function () {
186
+ return {};
187
+ },
188
+ transaction
189
+ });
190
+ var error = await transaction(function (tx, context) {
191
+ return adapter.mutators["project|reject"](tx, {
192
+ id: "p1",
193
+ ownerId: "u1",
194
+ name: "must roll back"
195
+ }, mutationContext(context));
196
+ }).catch(function (caught) {
197
+ return caught;
198
+ });
199
+ (0, import_vitest.expect)(error).toMatchObject({
200
+ name: "MutationApplicationError",
201
+ message: "denied",
202
+ details: "denied"
203
+ });
204
+ (0, import_vitest.expect)(db.prepare("SELECT * FROM project").all()).toEqual([]);
205
+ (0, import_vitest.expect)(effectRuns).toBe(0);
206
+ });
207
+ (0, import_vitest.test)("uses the host queryAst compiler surface for direct server queries", async function () {
208
+ db.prepare("INSERT INTO project (id, ownerId, name) VALUES (?, ?, ?)").run("p1", "u1", "first");
209
+ var adapter = (0, import_syncHost.createZeroSyncHostAdapter)({
210
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
211
+ models: {},
212
+ createServerActions: function () {
213
+ return {};
214
+ },
215
+ transaction
216
+ });
217
+ await (0, import_vitest.expect)(adapter.server.query(function (q) {
218
+ return q.project.one();
219
+ })).resolves.toEqual({
220
+ id: "p1",
221
+ ownerId: "u1",
222
+ name: "first"
223
+ });
224
+ (0, import_vitest.expect)(lastQueryFormat).toEqual({
225
+ relationships: {},
226
+ singular: true
227
+ });
228
+ });
229
+ (0, import_vitest.test)("resolves auth-sensitive named queries and runs query validation", async function () {
230
+ var validation;
231
+ var adapter = (0, import_syncHost.createZeroSyncHostAdapter)({
232
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
233
+ models: {},
234
+ createServerActions: function () {
235
+ return {};
236
+ },
237
+ queries,
238
+ transaction,
239
+ validateQuery(args) {
240
+ validation = args;
241
+ }
242
+ });
243
+ var ast = await adapter.resolveQuery("project|byOwner", [{
244
+ ownerId: "u1"
245
+ }], {
246
+ userID: "u1",
247
+ role: "member"
248
+ });
249
+ (0, import_vitest.expect)(ast).toMatchObject({
250
+ table: "project"
251
+ });
252
+ (0, import_vitest.expect)(JSON.stringify(ast)).toContain("ownerId");
253
+ (0, import_vitest.expect)(JSON.stringify(ast)).toContain("u1");
254
+ (0, import_vitest.expect)(validation).toEqual({
255
+ authData: {
256
+ id: "u1",
257
+ role: "member",
258
+ userID: "u1"
259
+ },
260
+ queryName: "project|byOwner",
261
+ params: {
262
+ ownerId: "u1"
263
+ }
264
+ });
265
+ });
266
+ });
267
+ function mutationContext(context) {
268
+ return {
269
+ ...context,
270
+ claims: {
271
+ userID: "u1",
272
+ role: "member"
273
+ },
274
+ clientID: "client-a",
275
+ mutationID: "1"
276
+ };
277
+ }
278
+ //# sourceMappingURL=syncHost.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["import_node_sqlite","require","import_zero","v","__toESM","import_vitest","import_mutatorContext","import_fixtureSchema","import_syncHost","import_zql","queries","defineQueries","project","byOwner","defineQuery","object","ownerId","string","param","args","zql","where","describe","db","executor","transaction","lastQueryFormat","beforeEach","DatabaseSync","exec","sql","params","arguments","length","prepare","run","query","all","queryAst","_ast","format","rows","singular","work","effects","value","defer","effect2","push","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done","effect","err","return","error","afterEach","close","test","effectAuthID","validatedAuthID","adapter","createZeroSyncHostAdapter","schema","zeroHttpFixtureSchema","models","mutate","create","authData","server","tx","expect","id","toBe","insert","asyncTasks","_getScopedAuthData","getScopedAuthData","createServerActions","validateMutation","Object","keys","mutators","toEqual","context","name","mutationContext","effectRuns","reject","Error","catch","caught","toMatchObject","message","details","q","one","resolves"],"sources":["../../src/syncHost.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,293 @@
1
+ import { createBuilder } from "@rocicorp/zero";
2
+ import { asQueryInternals } from "@rocicorp/zero/bindings";
3
+ import { createZeroServerCore } from "./createZeroServerCore.mjs";
4
+ function createZeroSQLiteServer({
5
+ encodeValue = encodeSQLiteValue,
6
+ ledgerTables = defaultLedgerTables,
7
+ transactionProvider,
8
+ ...options
9
+ }) {
10
+ const databaseOptions = {
11
+ encodeValue,
12
+ initializedLedgers: /* @__PURE__ */new Set(),
13
+ ledgerTables,
14
+ schema: options.schema,
15
+ transactionProvider
16
+ };
17
+ return createZeroServerCore({
18
+ ...options,
19
+ createDatabase: () => createSQLiteDatabase(databaseOptions),
20
+ persistAlreadyProcessed: args => persistAlreadyProcessedMutationResults(databaseOptions, args)
21
+ });
22
+ }
23
+ function createSQLiteDatabase(options) {
24
+ return {
25
+ async transaction(callback, input) {
26
+ let committedLedgers = /* @__PURE__ */new Set();
27
+ const value = await options.transactionProvider(async executor => {
28
+ const attemptLedgers = /* @__PURE__ */new Set();
29
+ const ensureLedger = async upstreamSchema => {
30
+ const tables = options.ledgerTables(upstreamSchema);
31
+ const key = ledgerKey(tables);
32
+ if (options.initializedLedgers.has(key) || attemptLedgers.has(key)) {
33
+ return;
34
+ }
35
+ await createLedgerTables(executor, tables);
36
+ attemptLedgers.add(key);
37
+ };
38
+ const transaction = createZeroSQLiteTransaction(options, executor, input);
39
+ const result = await callback(transaction, createLedgerHooks(options, executor, ensureLedger, input));
40
+ committedLedgers = attemptLedgers;
41
+ return result;
42
+ });
43
+ for (const key of committedLedgers) options.initializedLedgers.add(key);
44
+ return value;
45
+ }
46
+ };
47
+ }
48
+ function createZeroSQLiteTransaction(options, executor, input) {
49
+ const transactionOptions = {
50
+ encodeValue: options.encodeValue ?? encodeSQLiteValue,
51
+ schema: options.schema
52
+ };
53
+ const clientID = input?.clientID ?? "";
54
+ const mutationID = input?.mutationID ?? 0;
55
+ const mutate = new Proxy({}, {
56
+ get(_target, tableKey) {
57
+ const tableName = String(tableKey);
58
+ if (!options.schema.tables[tableName]) {
59
+ throw new Error(`unknown SQLite mutation table ${tableName}`);
60
+ }
61
+ return new Proxy({}, {
62
+ get(_innerTarget, kindKey) {
63
+ const kind = String(kindKey);
64
+ if (!isCrudKind(kind)) return;
65
+ return value => executeCrud(transactionOptions, executor, tableName, kind, value);
66
+ }
67
+ });
68
+ }
69
+ });
70
+ const runQuery = (ast, format, queryName) => Promise.resolve(executor.queryAst(ast, format, queryName));
71
+ const dbTransaction = {
72
+ wrappedTransaction: executor,
73
+ query: (sql, args) => executor.query(sql, args),
74
+ runQuery
75
+ };
76
+ return {
77
+ clientID,
78
+ dbTransaction,
79
+ location: "server",
80
+ mutate,
81
+ mutationID,
82
+ query: transactionOptions.schema.enableLegacyQueries ? createLegacyQueryBuilder(transactionOptions.schema, query => {
83
+ const internals = asQueryInternals(query);
84
+ return runQuery(internals.ast, internals.format, internals.customQueryID?.name);
85
+ }) : void 0,
86
+ reason: "authoritative",
87
+ async run(query) {
88
+ const internals = asQueryInternals(query);
89
+ return runQuery(internals.ast, internals.format, internals.customQueryID?.name);
90
+ }
91
+ };
92
+ }
93
+ function isCrudKind(value) {
94
+ return value === "delete" || value === "insert" || value === "update" || value === "upsert";
95
+ }
96
+ async function executeCrud(options, executor, tableName, kind, raw) {
97
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
98
+ throw new Error(`${tableName}.${kind} expects an object`);
99
+ }
100
+ const table = options.schema.tables[tableName];
101
+ const values = Object.fromEntries(Object.entries(raw).filter(([, value]) => value !== void 0));
102
+ for (const columnName of Object.keys(values)) {
103
+ if (!table.columns[columnName]) {
104
+ throw new Error(`unknown SQLite column ${tableName}.${columnName}`);
105
+ }
106
+ }
107
+ const primaryValues = table.primaryKey.map(columnName => {
108
+ if (!(columnName in values)) {
109
+ throw new Error(`${tableName}.${kind} is missing primary key ${columnName}`);
110
+ }
111
+ return encodeColumn(options, tableName, columnName, values[columnName]);
112
+ });
113
+ const primaryWhere = table.primaryKey.map(columnName => `${quoteSQLiteIdentifier(serverColumn(table, columnName))} = ?`).join(" AND ");
114
+ const serverTableName = quoteSQLiteIdentifier(table.serverName ?? table.name);
115
+ if (kind === "delete") {
116
+ await executor.exec(`DELETE FROM ${serverTableName} WHERE ${primaryWhere}`, primaryValues);
117
+ return;
118
+ }
119
+ const columnNames = Object.keys(values);
120
+ if (columnNames.length === 0) {
121
+ throw new Error(`${tableName}.${kind} has no values`);
122
+ }
123
+ const serverColumns = columnNames.map(columnName => quoteSQLiteIdentifier(serverColumn(table, columnName)));
124
+ const params = columnNames.map(columnName => encodeColumn(options, tableName, columnName, values[columnName]));
125
+ const insert = `INSERT INTO ${serverTableName} (${serverColumns.join(", ")}) VALUES (${columnNames.map(() => "?").join(", ")})`;
126
+ if (kind === "insert") {
127
+ await executor.exec(insert, params);
128
+ return;
129
+ }
130
+ if (kind === "upsert") {
131
+ const mutableColumns2 = columnNames.filter(columnName => !table.primaryKey.includes(columnName));
132
+ const conflictColumns = table.primaryKey.map(columnName => quoteSQLiteIdentifier(serverColumn(table, columnName))).join(", ");
133
+ const conflictAction = mutableColumns2.length === 0 ? "DO NOTHING" : `DO UPDATE SET ${mutableColumns2.map(columnName => {
134
+ const column = quoteSQLiteIdentifier(serverColumn(table, columnName));
135
+ return `${column} = excluded.${column}`;
136
+ }).join(", ")}`;
137
+ await executor.exec(`${insert} ON CONFLICT (${conflictColumns}) ${conflictAction}`, params);
138
+ return;
139
+ }
140
+ const mutableColumns = columnNames.filter(columnName => !table.primaryKey.includes(columnName));
141
+ if (mutableColumns.length === 0) return;
142
+ 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]);
143
+ }
144
+ function serverColumn(table, columnName) {
145
+ const column = table.columns[columnName];
146
+ if (!column) throw new Error(`unknown SQLite column ${table.name}.${columnName}`);
147
+ return column.serverName ?? columnName;
148
+ }
149
+ function encodeColumn(options, tableName, columnName, value) {
150
+ return options.encodeValue(value, {
151
+ column: options.schema.tables[tableName].columns[columnName],
152
+ columnName,
153
+ tableName
154
+ });
155
+ }
156
+ function createLegacyQueryBuilder(schema, run) {
157
+ const builder = createBuilder(schema);
158
+ return new Proxy(builder, {
159
+ get(target, property) {
160
+ return makeRunnableQuery(Reflect.get(target, property, target), run);
161
+ }
162
+ });
163
+ }
164
+ function makeRunnableQuery(query, run) {
165
+ if (!isQueryBuilder(query)) return query;
166
+ return new Proxy(query, {
167
+ get(target, property) {
168
+ if (property === "run") return () => run(target);
169
+ if (property === "materialize" || property === "preload") {
170
+ return () => {
171
+ throw new Error(`${String(property)}() is not supported in server transactions`);
172
+ };
173
+ }
174
+ const value = Reflect.get(target, property, target);
175
+ if (typeof value !== "function") return value;
176
+ return (...args) => makeRunnableQuery(Reflect.apply(value, target, args), run);
177
+ }
178
+ });
179
+ }
180
+ function isQueryBuilder(value) {
181
+ if (!value || typeof value !== "object") return false;
182
+ try {
183
+ asQueryInternals(value);
184
+ return true;
185
+ } catch {
186
+ return false;
187
+ }
188
+ }
189
+ function createLedgerHooks(options, executor, ensureLedger, input) {
190
+ const upstreamSchema = input?.upstreamSchema ?? "";
191
+ const clientGroupID = input?.clientGroupID ?? "";
192
+ const clientID = input?.clientID ?? "";
193
+ const tables = options.ledgerTables(upstreamSchema);
194
+ const clientsTable = quoteSQLiteIdentifier(tables.clients);
195
+ const mutationsTable = quoteSQLiteIdentifier(tables.mutations);
196
+ return {
197
+ async updateClientMutationID() {
198
+ await ensureLedger(upstreamSchema);
199
+ const rows = await executor.query(`INSERT INTO ${clientsTable}
200
+ (clientGroupID, clientID, lastMutationID)
201
+ VALUES (?, ?, 1)
202
+ ON CONFLICT (clientGroupID, clientID)
203
+ DO UPDATE SET lastMutationID = lastMutationID + 1
204
+ RETURNING lastMutationID`, [clientGroupID, clientID]);
205
+ const lastMutationID = rows[0]?.lastMutationID;
206
+ if (typeof lastMutationID !== "number" && typeof lastMutationID !== "bigint") {
207
+ throw new Error("SQLite mutation ledger returned no lastMutationID");
208
+ }
209
+ return {
210
+ lastMutationID
211
+ };
212
+ },
213
+ async writeMutationResult(result) {
214
+ await ensureLedger(upstreamSchema);
215
+ await executor.exec(`INSERT INTO ${mutationsTable}
216
+ (clientGroupID, clientID, mutationID, result)
217
+ VALUES (?, ?, ?, ?)`, [clientGroupID, result.id.clientID, result.id.id, JSON.stringify(result.result)]);
218
+ },
219
+ async deleteMutationResults(args) {
220
+ await ensureLedger(upstreamSchema);
221
+ if ("type" in args && args.type === "bulk") {
222
+ if (args.clientIDs.length === 0) return;
223
+ await executor.exec(`DELETE FROM ${mutationsTable}
224
+ WHERE clientGroupID = ?
225
+ AND clientID IN (${args.clientIDs.map(() => "?").join(", ")})`, [args.clientGroupID, ...args.clientIDs]);
226
+ return;
227
+ }
228
+ await executor.exec(`DELETE FROM ${mutationsTable}
229
+ WHERE clientGroupID = ?
230
+ AND clientID = ?
231
+ AND mutationID <= ?`, [args.clientGroupID, args.clientID, args.upToMutationID]);
232
+ }
233
+ };
234
+ }
235
+ async function persistAlreadyProcessedMutationResults(options, {
236
+ clientGroupID,
237
+ mutations,
238
+ upstreamSchema
239
+ }) {
240
+ const tables = options.ledgerTables(upstreamSchema);
241
+ const table = quoteSQLiteIdentifier(tables.mutations);
242
+ const key = ledgerKey(tables);
243
+ await options.transactionProvider(async executor => {
244
+ if (!options.initializedLedgers.has(key)) {
245
+ await createLedgerTables(executor, tables);
246
+ }
247
+ for (const mutation of mutations) {
248
+ await executor.exec(`INSERT INTO ${table}
249
+ (clientGroupID, clientID, mutationID, result)
250
+ VALUES (?, ?, ?, ?)
251
+ ON CONFLICT (clientGroupID, clientID, mutationID) DO NOTHING`, [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)]);
252
+ }
253
+ });
254
+ options.initializedLedgers.add(key);
255
+ }
256
+ async function createLedgerTables(executor, tables) {
257
+ await executor.exec(`CREATE TABLE IF NOT EXISTS ${quoteSQLiteIdentifier(tables.clients)} (
258
+ clientGroupID TEXT NOT NULL,
259
+ clientID TEXT NOT NULL,
260
+ lastMutationID INTEGER NOT NULL,
261
+ PRIMARY KEY (clientGroupID, clientID)
262
+ )`);
263
+ await executor.exec(`CREATE TABLE IF NOT EXISTS ${quoteSQLiteIdentifier(tables.mutations)} (
264
+ clientGroupID TEXT NOT NULL,
265
+ clientID TEXT NOT NULL,
266
+ mutationID INTEGER NOT NULL,
267
+ result TEXT NOT NULL,
268
+ PRIMARY KEY (clientGroupID, clientID, mutationID)
269
+ )`);
270
+ }
271
+ function ledgerKey(tables) {
272
+ return `${tables.clients}\0${tables.mutations}`;
273
+ }
274
+ function defaultLedgerTables(upstreamSchema) {
275
+ const prefix = upstreamSchema ? `${upstreamSchema}_` : "";
276
+ return {
277
+ clients: `${prefix}clients`,
278
+ mutations: `${prefix}mutations`
279
+ };
280
+ }
281
+ function encodeSQLiteValue(value, {
282
+ column
283
+ }) {
284
+ if (value === null) return null;
285
+ if (column.type === "boolean") return value ? 1 : 0;
286
+ if (column.type === "json") return JSON.stringify(value);
287
+ return value;
288
+ }
289
+ function quoteSQLiteIdentifier(value) {
290
+ return `"${value.replaceAll('"', '""')}"`;
291
+ }
292
+ export { createZeroSQLiteServer, createZeroSQLiteTransaction };
293
+ //# sourceMappingURL=createZeroSQLiteServer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createBuilder","asQueryInternals","createZeroServerCore","createZeroSQLiteServer","encodeValue","encodeSQLiteValue","ledgerTables","defaultLedgerTables","transactionProvider","options","databaseOptions","initializedLedgers","Set","schema","createDatabase","createSQLiteDatabase","persistAlreadyProcessed","args","persistAlreadyProcessedMutationResults","transaction","callback","input","committedLedgers","value","executor","attemptLedgers","ensureLedger","upstreamSchema","tables","key","ledgerKey","has","createLedgerTables","add","createZeroSQLiteTransaction","result","createLedgerHooks","transactionOptions","clientID","mutationID","mutate","Proxy","get","_target","tableKey","tableName","String","Error","_innerTarget","kindKey","kind","isCrudKind","executeCrud","runQuery","ast","format","queryName","Promise","resolve","queryAst","dbTransaction","wrappedTransaction","query","sql","location","enableLegacyQueries","createLegacyQueryBuilder","internals","customQueryID","name","reason","run","raw","Array","isArray","table","values","Object","fromEntries","entries","filter","columnName","keys","columns","primaryValues","primaryKey","map","encodeColumn","primaryWhere","quoteSQLiteIdentifier","serverColumn","join","serverTableName","serverName","exec","columnNames","length","serverColumns","params","insert","mutableColumns2","includes","conflictColumns","conflictAction","column","mutableColumns","builder","target","property","makeRunnableQuery","Reflect","isQueryBuilder","apply","clientGroupID","clientsTable","clients","mutationsTable","mutations","updateClientMutationID","rows","lastMutationID","writeMutationResult","id","JSON","stringify","deleteMutationResults","type","clientIDs","upToMutationID","mutation","prefix","replaceAll"],"sources":["../../src/createZeroSQLiteServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}