on-zero 0.7.2-1784530701923 → 0.7.2

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 (260) hide show
  1. package/dist/cjs/asyncTasks.cjs +51 -0
  2. package/dist/cjs/asyncTasks.native.js +84 -0
  3. package/dist/cjs/asyncTasks.native.js.map +1 -0
  4. package/dist/cjs/createZeroDirectServer.cjs +269 -0
  5. package/dist/cjs/createZeroDirectServer.native.js +287 -0
  6. package/dist/cjs/createZeroDirectServer.native.js.map +1 -0
  7. package/dist/cjs/createZeroSQLiteServer.cjs +50 -0
  8. package/dist/cjs/createZeroSQLiteServer.native.js +58 -0
  9. package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -0
  10. package/dist/cjs/createZeroSQLiteServer.test.cjs +595 -0
  11. package/dist/cjs/createZeroSQLiteServer.test.native.js +647 -0
  12. package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -0
  13. package/dist/cjs/createZeroServer.cjs +82 -0
  14. package/dist/cjs/createZeroServer.native.js +93 -0
  15. package/dist/cjs/createZeroServer.native.js.map +1 -0
  16. package/dist/cjs/createZeroServer.test.cjs +378 -0
  17. package/dist/cjs/createZeroServer.test.native.js +448 -0
  18. package/dist/cjs/createZeroServer.test.native.js.map +1 -0
  19. package/dist/cjs/createZeroServerCore.cjs +211 -0
  20. package/dist/cjs/createZeroServerCore.native.js +355 -0
  21. package/dist/cjs/createZeroServerCore.native.js.map +1 -0
  22. package/dist/cjs/helpers/createMutators.cjs +3 -4
  23. package/dist/cjs/helpers/createMutators.native.js +3 -6
  24. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  25. package/dist/cjs/httpPull/auth.test.cjs +197 -0
  26. package/dist/cjs/httpPull/auth.test.native.js +279 -0
  27. package/dist/cjs/httpPull/auth.test.native.js.map +1 -0
  28. package/dist/cjs/httpPull/churn.test.cjs +132 -0
  29. package/dist/cjs/httpPull/churn.test.native.js +155 -0
  30. package/dist/cjs/httpPull/churn.test.native.js.map +1 -0
  31. package/dist/cjs/httpPull/completeAck.test.cjs +69 -0
  32. package/dist/cjs/httpPull/completeAck.test.native.js +76 -0
  33. package/dist/cjs/httpPull/completeAck.test.native.js.map +1 -0
  34. package/dist/cjs/httpPull/fixtureServer.cjs +340 -0
  35. package/dist/cjs/httpPull/fixtureServer.native.js +534 -0
  36. package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -0
  37. package/dist/cjs/httpPull/integration.test.cjs +53 -0
  38. package/dist/cjs/httpPull/integration.test.native.js +60 -0
  39. package/dist/cjs/httpPull/integration.test.native.js.map +1 -0
  40. package/dist/cjs/httpPull/rebase.test.cjs +360 -0
  41. package/dist/cjs/httpPull/rebase.test.native.js +420 -0
  42. package/dist/cjs/httpPull/rebase.test.native.js.map +1 -0
  43. package/dist/cjs/httpPull/relations.test.cjs +107 -0
  44. package/dist/cjs/httpPull/relations.test.native.js +119 -0
  45. package/dist/cjs/httpPull/relations.test.native.js.map +1 -0
  46. package/dist/cjs/httpPull/testHarness.cjs +100 -0
  47. package/dist/cjs/httpPull/testHarness.native.js +112 -0
  48. package/dist/cjs/httpPull/testHarness.native.js.map +1 -0
  49. package/dist/cjs/index.cjs +1 -0
  50. package/dist/cjs/index.native.js +1 -0
  51. package/dist/cjs/index.native.js.map +1 -1
  52. package/dist/cjs/run.cjs +1 -1
  53. package/dist/cjs/run.native.js +1 -1
  54. package/dist/cjs/server.cjs +22 -0
  55. package/dist/cjs/server.native.js +4 -0
  56. package/dist/cjs/server.native.js.map +1 -0
  57. package/dist/cjs/sqliteRuntime.cjs +318 -0
  58. package/dist/cjs/sqliteRuntime.native.js +438 -0
  59. package/dist/cjs/sqliteRuntime.native.js.map +1 -0
  60. package/dist/cjs/state.cjs +1 -1
  61. package/dist/cjs/state.native.js +1 -1
  62. package/dist/cjs/syncHost.cjs +179 -0
  63. package/dist/cjs/syncHost.native.js +388 -0
  64. package/dist/cjs/syncHost.native.js.map +1 -0
  65. package/dist/cjs/syncHost.test.cjs +240 -0
  66. package/dist/cjs/syncHost.test.native.js +290 -0
  67. package/dist/cjs/syncHost.test.native.js.map +1 -0
  68. package/dist/cjs/zeroRunner.cjs +1 -1
  69. package/dist/cjs/zeroRunner.native.js +1 -1
  70. package/dist/esm/asyncTasks.mjs +26 -0
  71. package/dist/esm/asyncTasks.mjs.map +1 -0
  72. package/dist/esm/asyncTasks.native.js +56 -0
  73. package/dist/esm/asyncTasks.native.js.map +1 -0
  74. package/dist/esm/createZeroDirectServer.mjs +241 -0
  75. package/dist/esm/createZeroDirectServer.mjs.map +1 -0
  76. package/dist/esm/createZeroDirectServer.native.js +256 -0
  77. package/dist/esm/createZeroDirectServer.native.js.map +1 -0
  78. package/dist/esm/createZeroSQLiteServer.mjs +24 -0
  79. package/dist/esm/createZeroSQLiteServer.mjs.map +1 -0
  80. package/dist/esm/createZeroSQLiteServer.native.js +29 -0
  81. package/dist/esm/createZeroSQLiteServer.native.js.map +1 -0
  82. package/dist/esm/createZeroSQLiteServer.test.mjs +596 -0
  83. package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -0
  84. package/dist/esm/createZeroSQLiteServer.test.native.js +645 -0
  85. package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -0
  86. package/dist/esm/createZeroServer.mjs +57 -0
  87. package/dist/esm/createZeroServer.mjs.map +1 -0
  88. package/dist/esm/createZeroServer.native.js +65 -0
  89. package/dist/esm/createZeroServer.native.js.map +1 -0
  90. package/dist/esm/createZeroServer.test.mjs +379 -0
  91. package/dist/esm/createZeroServer.test.mjs.map +1 -0
  92. package/dist/esm/createZeroServer.test.native.js +446 -0
  93. package/dist/esm/createZeroServer.test.native.js.map +1 -0
  94. package/dist/esm/createZeroServerCore.mjs +186 -0
  95. package/dist/esm/createZeroServerCore.mjs.map +1 -0
  96. package/dist/esm/createZeroServerCore.native.js +327 -0
  97. package/dist/esm/createZeroServerCore.native.js.map +1 -0
  98. package/dist/esm/helpers/createMutators.mjs +3 -4
  99. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  100. package/dist/esm/helpers/createMutators.native.js +3 -6
  101. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  102. package/dist/esm/httpPull/auth.test.mjs +198 -0
  103. package/dist/esm/httpPull/auth.test.mjs.map +1 -0
  104. package/dist/esm/httpPull/auth.test.native.js +277 -0
  105. package/dist/esm/httpPull/auth.test.native.js.map +1 -0
  106. package/dist/esm/httpPull/churn.test.mjs +133 -0
  107. package/dist/esm/httpPull/churn.test.mjs.map +1 -0
  108. package/dist/esm/httpPull/churn.test.native.js +153 -0
  109. package/dist/esm/httpPull/churn.test.native.js.map +1 -0
  110. package/dist/esm/httpPull/completeAck.test.mjs +70 -0
  111. package/dist/esm/httpPull/completeAck.test.mjs.map +1 -0
  112. package/dist/esm/httpPull/completeAck.test.native.js +74 -0
  113. package/dist/esm/httpPull/completeAck.test.native.js.map +1 -0
  114. package/dist/esm/httpPull/fixtureServer.mjs +315 -0
  115. package/dist/esm/httpPull/fixtureServer.mjs.map +1 -0
  116. package/dist/esm/httpPull/fixtureServer.native.js +506 -0
  117. package/dist/esm/httpPull/fixtureServer.native.js.map +1 -0
  118. package/dist/esm/httpPull/integration.test.mjs +54 -0
  119. package/dist/esm/httpPull/integration.test.mjs.map +1 -0
  120. package/dist/esm/httpPull/integration.test.native.js +58 -0
  121. package/dist/esm/httpPull/integration.test.native.js.map +1 -0
  122. package/dist/esm/httpPull/rebase.test.mjs +361 -0
  123. package/dist/esm/httpPull/rebase.test.mjs.map +1 -0
  124. package/dist/esm/httpPull/rebase.test.native.js +418 -0
  125. package/dist/esm/httpPull/rebase.test.native.js.map +1 -0
  126. package/dist/esm/httpPull/relations.test.mjs +108 -0
  127. package/dist/esm/httpPull/relations.test.mjs.map +1 -0
  128. package/dist/esm/httpPull/relations.test.native.js +117 -0
  129. package/dist/esm/httpPull/relations.test.native.js.map +1 -0
  130. package/dist/esm/httpPull/testHarness.mjs +72 -0
  131. package/dist/esm/httpPull/testHarness.mjs.map +1 -0
  132. package/dist/esm/httpPull/testHarness.native.js +81 -0
  133. package/dist/esm/httpPull/testHarness.native.js.map +1 -0
  134. package/dist/esm/index.js +1 -0
  135. package/dist/esm/index.js.map +1 -1
  136. package/dist/esm/index.mjs +1 -0
  137. package/dist/esm/index.mjs.map +1 -1
  138. package/dist/esm/index.native.js +1 -0
  139. package/dist/esm/index.native.js.map +1 -1
  140. package/dist/esm/run.mjs +1 -1
  141. package/dist/esm/run.mjs.map +1 -1
  142. package/dist/esm/run.native.js +1 -1
  143. package/dist/esm/server.mjs +4 -0
  144. package/dist/esm/server.mjs.map +1 -0
  145. package/dist/esm/server.native.js +2 -0
  146. package/dist/esm/server.native.js.map +1 -0
  147. package/dist/esm/sqliteRuntime.mjs +289 -0
  148. package/dist/esm/sqliteRuntime.mjs.map +1 -0
  149. package/dist/esm/sqliteRuntime.native.js +406 -0
  150. package/dist/esm/sqliteRuntime.native.js.map +1 -0
  151. package/dist/esm/state.mjs +1 -1
  152. package/dist/esm/state.native.js +1 -1
  153. package/dist/esm/syncHost.mjs +153 -0
  154. package/dist/esm/syncHost.mjs.map +1 -0
  155. package/dist/esm/syncHost.native.js +359 -0
  156. package/dist/esm/syncHost.native.js.map +1 -0
  157. package/dist/esm/syncHost.test.mjs +217 -0
  158. package/dist/esm/syncHost.test.mjs.map +1 -0
  159. package/dist/esm/syncHost.test.native.js +264 -0
  160. package/dist/esm/syncHost.test.native.js.map +1 -0
  161. package/dist/esm/zeroRunner.mjs +1 -1
  162. package/dist/esm/zeroRunner.mjs.map +1 -1
  163. package/dist/esm/zeroRunner.native.js +1 -1
  164. package/package.json +23 -8
  165. package/readme.md +65 -40
  166. package/src/asyncTasks.ts +36 -0
  167. package/src/createZeroClient.tsx +1 -1
  168. package/src/createZeroDirectServer.ts +411 -0
  169. package/src/createZeroSQLiteServer.test.ts +614 -0
  170. package/src/createZeroSQLiteServer.ts +56 -0
  171. package/src/createZeroServer.test.ts +421 -0
  172. package/src/createZeroServer.ts +105 -0
  173. package/src/createZeroServerCore.ts +296 -0
  174. package/src/helpers/createMutators.ts +2 -6
  175. package/src/httpPull/auth.test.ts +208 -0
  176. package/src/httpPull/churn.test.ts +147 -0
  177. package/src/httpPull/completeAck.test.ts +80 -0
  178. package/src/httpPull/fixtureServer.ts +391 -0
  179. package/src/httpPull/integration.test.ts +57 -0
  180. package/src/httpPull/rebase.test.ts +368 -0
  181. package/src/httpPull/relations.test.ts +135 -0
  182. package/src/httpPull/testHarness.ts +95 -0
  183. package/src/index.ts +1 -0
  184. package/src/run.ts +1 -1
  185. package/src/server.native.ts +3 -0
  186. package/src/server.ts +4 -0
  187. package/src/sqliteRuntime.ts +512 -0
  188. package/src/state.ts +1 -1
  189. package/src/syncHost.test.ts +223 -0
  190. package/src/syncHost.ts +294 -0
  191. package/src/types.ts +5 -0
  192. package/src/zeroRunner.ts +1 -1
  193. package/test-fixtures/server-return-types.ts +58 -21
  194. package/types/asyncTasks.d.ts +11 -0
  195. package/types/asyncTasks.d.ts.map +1 -0
  196. package/types/createZeroDirectServer.d.ts +80 -0
  197. package/types/createZeroDirectServer.d.ts.map +1 -0
  198. package/types/createZeroSQLiteServer.d.ts +12 -0
  199. package/types/createZeroSQLiteServer.d.ts.map +1 -0
  200. package/types/createZeroSQLiteServer.test.d.ts +2 -0
  201. package/types/createZeroSQLiteServer.test.d.ts.map +1 -0
  202. package/types/createZeroServer.d.ts +18 -0
  203. package/types/createZeroServer.d.ts.map +1 -0
  204. package/types/createZeroServer.test.d.ts +2 -0
  205. package/types/createZeroServer.test.d.ts.map +1 -0
  206. package/types/createZeroServerCore.d.ts +256 -0
  207. package/types/createZeroServerCore.d.ts.map +1 -0
  208. package/types/helpers/createMutators.d.ts +1 -2
  209. package/types/helpers/createMutators.d.ts.map +1 -1
  210. package/types/httpPull/auth.test.d.ts +2 -0
  211. package/types/httpPull/auth.test.d.ts.map +1 -0
  212. package/types/httpPull/churn.test.d.ts +2 -0
  213. package/types/httpPull/churn.test.d.ts.map +1 -0
  214. package/types/httpPull/completeAck.test.d.ts +2 -0
  215. package/types/httpPull/completeAck.test.d.ts.map +1 -0
  216. package/types/httpPull/fixtureSchema.d.ts +1 -1
  217. package/types/httpPull/fixtureServer.d.ts +14 -0
  218. package/types/httpPull/fixtureServer.d.ts.map +1 -0
  219. package/types/httpPull/integration.test.d.ts +2 -0
  220. package/types/httpPull/integration.test.d.ts.map +1 -0
  221. package/types/httpPull/rebase.test.d.ts +2 -0
  222. package/types/httpPull/rebase.test.d.ts.map +1 -0
  223. package/types/httpPull/relations.test.d.ts +2 -0
  224. package/types/httpPull/relations.test.d.ts.map +1 -0
  225. package/types/httpPull/testHarness.d.ts +32 -0
  226. package/types/httpPull/testHarness.d.ts.map +1 -0
  227. package/types/index.d.ts +1 -0
  228. package/types/index.d.ts.map +1 -1
  229. package/types/server.d.ts +5 -0
  230. package/types/server.d.ts.map +1 -0
  231. package/types/server.native.d.ts +1 -0
  232. package/types/server.native.d.ts.map +1 -0
  233. package/types/sqliteRuntime.d.ts +71 -0
  234. package/types/sqliteRuntime.d.ts.map +1 -0
  235. package/types/syncHost.d.ts +42 -0
  236. package/types/syncHost.d.ts.map +1 -0
  237. package/types/syncHost.test.d.ts +2 -0
  238. package/types/syncHost.test.d.ts.map +1 -0
  239. package/types/types.d.ts +4 -0
  240. package/types/types.d.ts.map +1 -1
  241. package/dist/cjs/orez.cjs +0 -227
  242. package/dist/cjs/orez.native.js +0 -314
  243. package/dist/cjs/orez.native.js.map +0 -1
  244. package/dist/cjs/orez.test.cjs +0 -211
  245. package/dist/cjs/orez.test.native.js +0 -226
  246. package/dist/cjs/orez.test.native.js.map +0 -1
  247. package/dist/esm/orez.mjs +0 -202
  248. package/dist/esm/orez.mjs.map +0 -1
  249. package/dist/esm/orez.native.js +0 -286
  250. package/dist/esm/orez.native.js.map +0 -1
  251. package/dist/esm/orez.test.mjs +0 -188
  252. package/dist/esm/orez.test.mjs.map +0 -1
  253. package/dist/esm/orez.test.native.js +0 -200
  254. package/dist/esm/orez.test.native.js.map +0 -1
  255. package/src/orez.test.ts +0 -195
  256. package/src/orez.ts +0 -331
  257. package/types/orez.d.ts +0 -53
  258. package/types/orez.d.ts.map +0 -1
  259. package/types/orez.test.d.ts +0 -2
  260. package/types/orez.test.d.ts.map +0 -1
@@ -0,0 +1,645 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { boolean, createSchema, json, relationships, string, table } from "@rocicorp/zero";
3
+ import { asQueryInternals } from "@rocicorp/zero/bindings";
4
+ import { afterEach, beforeEach, describe, expect, test } from "vitest";
5
+ import { createZeroSQLiteServer } from "./createZeroSQLiteServer.native.js";
6
+ import { zeroHttpFixtureSchema } from "./httpPull/fixtureSchema.native.js";
7
+ import { mutations } from "./mutations.native.js";
8
+ import { serverWhere } from "./serverWhere.native.js";
9
+ var note = table("note").from("note_records").columns({
10
+ id: string().from("note_id"),
11
+ done: boolean(),
12
+ data: json().optional()
13
+ }).primaryKey("id");
14
+ var sqliteTypesSchema = createSchema({
15
+ tables: [note],
16
+ relationships: [],
17
+ enableLegacyQueries: true
18
+ });
19
+ var person = table("person").columns({
20
+ id: string()
21
+ }).primaryKey("id");
22
+ var membership = table("membership").columns({
23
+ personId: string(),
24
+ teamId: string()
25
+ }).primaryKey("personId", "teamId");
26
+ var team = table("team").from("team_records").columns({
27
+ id: string().from("team_id"),
28
+ active: boolean().from("is_active"),
29
+ metadata: json().from("metadata_json")
30
+ }).primaryKey("id");
31
+ var twoHopSchema = createSchema({
32
+ tables: [person, membership, team],
33
+ relationships: [relationships(person, function (param) {
34
+ var {
35
+ many
36
+ } = param;
37
+ return {
38
+ teams: many({
39
+ sourceField: ["id"],
40
+ destSchema: membership,
41
+ destField: ["personId"]
42
+ }, {
43
+ sourceField: ["teamId"],
44
+ destSchema: team,
45
+ destField: ["id"]
46
+ })
47
+ };
48
+ })]
49
+ });
50
+ function pushRequest(id, name, args) {
51
+ return new Request("http://localhost/push?schema=zero_0&appID=zero", {
52
+ method: "POST",
53
+ headers: {
54
+ "content-type": "application/json"
55
+ },
56
+ body: JSON.stringify({
57
+ clientGroupID: "cg1",
58
+ mutations: [{
59
+ type: "custom",
60
+ id,
61
+ clientID: "client-a",
62
+ name,
63
+ args: [args],
64
+ timestamp: 1
65
+ }],
66
+ pushVersion: 1,
67
+ timestamp: 1,
68
+ requestID: "req-" + id
69
+ })
70
+ });
71
+ }
72
+ function cleanupRequest() {
73
+ return new Request("http://localhost/push?schema=zero_0&appID=zero", {
74
+ method: "POST",
75
+ headers: {
76
+ "content-type": "application/json"
77
+ },
78
+ body: JSON.stringify({
79
+ clientGroupID: "cg1",
80
+ mutations: [{
81
+ type: "custom",
82
+ id: 2,
83
+ clientID: "client-a",
84
+ name: "_zero_cleanupResults",
85
+ args: [{
86
+ clientGroupID: "cg1",
87
+ clientID: "client-a",
88
+ upToMutationID: 1
89
+ }],
90
+ timestamp: 1
91
+ }],
92
+ pushVersion: 1,
93
+ timestamp: 1,
94
+ requestID: "cleanup"
95
+ })
96
+ });
97
+ }
98
+ describe("createZeroSQLiteServer", function () {
99
+ var db;
100
+ var retryNextTransaction;
101
+ var transactionProvider;
102
+ var statements;
103
+ beforeEach(function () {
104
+ db = new DatabaseSync(":memory:");
105
+ db.exec(["CREATE TABLE project (id TEXT PRIMARY KEY, ownerId TEXT NOT NULL, name TEXT NOT NULL);", "CREATE TABLE note_records (note_id TEXT PRIMARY KEY, done INTEGER NOT NULL, data TEXT);"].join("\n"));
106
+ retryNextTransaction = false;
107
+ statements = [];
108
+ var executor = {
109
+ async exec(sql) {
110
+ var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [],
111
+ metadata = arguments.length > 2 ? arguments[2] : void 0;
112
+ if (metadata) statements.push(metadata);
113
+ var result = db.prepare(sql).run(...params);
114
+ return {
115
+ changes: Number(result.changes)
116
+ };
117
+ },
118
+ async query(sql) {
119
+ var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
120
+ return db.prepare(sql).all(...params);
121
+ },
122
+ async queryAst(ast, format) {
123
+ var rows;
124
+ if (ast.table === "project") {
125
+ rows = db.prepare("SELECT * FROM project ORDER BY id").all();
126
+ } else if (ast.table === "note") {
127
+ rows = db.prepare("SELECT note_id, done, data FROM note_records ORDER BY note_id").all().map(function (row) {
128
+ return {
129
+ id: row.note_id,
130
+ done: row.done !== 0,
131
+ data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
132
+ };
133
+ });
134
+ } else if (ast.table === "person") {
135
+ rows = [{
136
+ id: "p1",
137
+ teams: [{
138
+ id: "t1",
139
+ active: true,
140
+ metadata: {
141
+ label: "core"
142
+ }
143
+ }]
144
+ }];
145
+ } else {
146
+ throw new Error("unexpected table " + ast.table);
147
+ }
148
+ return format.singular ? rows[0] : rows;
149
+ }
150
+ };
151
+ var run = async function (callback) {
152
+ db.exec("BEGIN");
153
+ try {
154
+ var value = await callback(executor);
155
+ db.exec("COMMIT");
156
+ return value;
157
+ } catch (error) {
158
+ db.exec("ROLLBACK");
159
+ throw error;
160
+ }
161
+ };
162
+ transactionProvider = async function (callback) {
163
+ if (retryNextTransaction) {
164
+ retryNextTransaction = false;
165
+ db.exec("BEGIN");
166
+ await callback(executor);
167
+ db.exec("ROLLBACK");
168
+ }
169
+ return run(callback);
170
+ };
171
+ });
172
+ afterEach(function () {
173
+ db.close();
174
+ });
175
+ test("commits CRUD, the mutation ledger, and one retry-safe async task", async function () {
176
+ var effectRuns = 0;
177
+ var server = createZeroSQLiteServer({
178
+ schema: zeroHttpFixtureSchema,
179
+ models: {
180
+ project: {
181
+ mutate: {
182
+ create: async function (param, value) {
183
+ var {
184
+ tx,
185
+ server: server2
186
+ } = param;
187
+ await tx.mutate.project.insert(value);
188
+ server2 === null || server2 === void 0 ? void 0 : server2.enqueueTask(async function () {
189
+ effectRuns++;
190
+ }, {
191
+ barrier: true
192
+ });
193
+ }
194
+ }
195
+ }
196
+ },
197
+ createServerActions: function () {
198
+ return {};
199
+ },
200
+ transactionProvider
201
+ });
202
+ retryNextTransaction = true;
203
+ var result = await server.handleMutationRequest({
204
+ authData: null,
205
+ request: pushRequest(1, "project.create", {
206
+ id: "p1",
207
+ ownerId: "u1",
208
+ name: "first"
209
+ }),
210
+ skipAsyncTasks: true
211
+ });
212
+ expect(result.response.mutations[0].result).toEqual({});
213
+ expect(db.prepare("SELECT * FROM project").all()).toEqual([{
214
+ id: "p1",
215
+ ownerId: "u1",
216
+ name: "first"
217
+ }]);
218
+ expect(db.prepare("SELECT * FROM zero_0_clients").all()).toEqual([{
219
+ clientGroupID: "cg1",
220
+ clientID: "client-a",
221
+ lastMutationID: 1
222
+ }]);
223
+ expect(result.asyncTasks).toHaveLength(1);
224
+ expect(result.asyncTasks[0].barrier).toBe(true);
225
+ await result.asyncTasks[0].task();
226
+ expect(effectRuns).toBe(1);
227
+ });
228
+ test("keeps later writes after inserting an existing primary key", async function () {
229
+ db.prepare("INSERT INTO project (id, ownerId, name) VALUES (?, ?, ?)").run("p1", "u1", "original");
230
+ db.prepare("INSERT INTO project (id, ownerId, name) VALUES (?, ?, ?)").run("p2", "u1", "before");
231
+ var server = createZeroSQLiteServer({
232
+ schema: zeroHttpFixtureSchema,
233
+ models: {
234
+ project: {
235
+ mutate: {
236
+ converge: async function (param) {
237
+ var {
238
+ tx
239
+ } = param;
240
+ await tx.mutate.project.insert({
241
+ id: "p1",
242
+ ownerId: "u2",
243
+ name: "replacement"
244
+ });
245
+ await tx.mutate.project.update({
246
+ id: "p2",
247
+ name: "after"
248
+ });
249
+ }
250
+ }
251
+ }
252
+ },
253
+ createServerActions: function () {
254
+ return {};
255
+ },
256
+ transactionProvider
257
+ });
258
+ var result = await server.handleMutationRequest({
259
+ authData: null,
260
+ request: pushRequest(1, "project.converge", {})
261
+ });
262
+ expect(result.response.mutations[0].result).toEqual({});
263
+ expect(db.prepare("SELECT * FROM project ORDER BY id").all()).toEqual([{
264
+ id: "p1",
265
+ ownerId: "u1",
266
+ name: "original"
267
+ }, {
268
+ id: "p2",
269
+ ownerId: "u1",
270
+ name: "after"
271
+ }]);
272
+ });
273
+ test("rolls back row writes and persists an application error with its LMID", async function () {
274
+ var server = createZeroSQLiteServer({
275
+ schema: zeroHttpFixtureSchema,
276
+ models: {
277
+ project: {
278
+ mutate: {
279
+ fail: async function (param, value) {
280
+ var {
281
+ tx
282
+ } = param;
283
+ await tx.mutate.project.insert(value);
284
+ throw new Error("rejected");
285
+ }
286
+ }
287
+ }
288
+ },
289
+ createServerActions: function () {
290
+ return {};
291
+ },
292
+ transactionProvider
293
+ });
294
+ var result = await server.handleMutationRequest({
295
+ authData: null,
296
+ request: pushRequest(1, "project.fail", {
297
+ id: "p1",
298
+ ownerId: "u1",
299
+ name: "first"
300
+ })
301
+ });
302
+ expect(result.response.mutations[0].result).toMatchObject({
303
+ error: "app",
304
+ message: "rejected"
305
+ });
306
+ expect(db.prepare("SELECT * FROM project").all()).toEqual([]);
307
+ expect(db.prepare("SELECT lastMutationID FROM zero_0_clients").get()).toEqual({
308
+ lastMutationID: 1
309
+ });
310
+ var stored = db.prepare("SELECT result FROM zero_0_mutations").get();
311
+ expect(JSON.parse(stored.result)).toMatchObject({
312
+ error: "app",
313
+ message: "rejected"
314
+ });
315
+ });
316
+ test("allows a custom CRUD mutation to no-op without an automatic permission check", async function () {
317
+ var projectPermission = serverWhere("project", function (q) {
318
+ return q.cmp("ownerId", "u1");
319
+ });
320
+ var projectMutations = mutations("project", projectPermission, {
321
+ insert: async function () {}
322
+ });
323
+ var server = createZeroSQLiteServer({
324
+ schema: zeroHttpFixtureSchema,
325
+ models: {
326
+ project: {
327
+ mutate: projectMutations
328
+ }
329
+ },
330
+ createServerActions: function () {
331
+ return {};
332
+ },
333
+ transactionProvider
334
+ });
335
+ var result = await server.handleMutationRequest({
336
+ authData: {
337
+ id: "u1",
338
+ role: "user"
339
+ },
340
+ request: pushRequest(1, "project.insert", {
341
+ id: "p1",
342
+ ownerId: "u1",
343
+ name: "skip"
344
+ })
345
+ });
346
+ expect(result.response.mutations[0].result).toEqual({});
347
+ expect(db.prepare("SELECT * FROM project").all()).toEqual([]);
348
+ });
349
+ test("rolls back when a custom CRUD mutation throws", async function () {
350
+ var projectPermission = serverWhere("project", function (q) {
351
+ return q.cmp("ownerId", "u1");
352
+ });
353
+ var projectMutations = mutations("project", projectPermission, {
354
+ insert: async function (param, value) {
355
+ var {
356
+ tx
357
+ } = param;
358
+ await tx.mutate.project.insert(value);
359
+ throw new Error("denied by custom validation");
360
+ }
361
+ });
362
+ var server = createZeroSQLiteServer({
363
+ schema: zeroHttpFixtureSchema,
364
+ models: {
365
+ project: {
366
+ mutate: projectMutations
367
+ }
368
+ },
369
+ createServerActions: function () {
370
+ return {};
371
+ },
372
+ transactionProvider
373
+ });
374
+ var result = await server.handleMutationRequest({
375
+ authData: {
376
+ id: "u2",
377
+ role: "user"
378
+ },
379
+ request: pushRequest(1, "project.insert", {
380
+ id: "p2",
381
+ ownerId: "u2",
382
+ name: "unauthorized"
383
+ })
384
+ });
385
+ expect(result.response.mutations[0].result).toMatchObject({
386
+ error: "app",
387
+ message: "denied by custom validation"
388
+ });
389
+ expect(db.prepare("SELECT * FROM project").all()).toEqual([]);
390
+ });
391
+ test("permission-checks generated CRUD mutations", async function () {
392
+ var inserted;
393
+ var permissionChecks = 0;
394
+ var projectPermission = serverWhere("project", function (q) {
395
+ return q.cmp("ownerId", "u1");
396
+ });
397
+ var projectMutations = mutations("project", projectPermission);
398
+ var value = {
399
+ id: "p3",
400
+ ownerId: "u2",
401
+ name: "unauthorized"
402
+ };
403
+ await expect(projectMutations.insert({
404
+ tx: {
405
+ mutate: {
406
+ project: {
407
+ insert: async function (row) {
408
+ inserted = row;
409
+ }
410
+ }
411
+ }
412
+ },
413
+ can: async function (_where, row) {
414
+ permissionChecks++;
415
+ expect(row).toEqual(value);
416
+ throw new Error("denied");
417
+ }
418
+ }, value)).rejects.toThrow("denied");
419
+ expect(inserted).toEqual(value);
420
+ expect(permissionChecks).toBe(1);
421
+ });
422
+ test("recovers duplicate results and deletes them through the cleanup mutation", async function () {
423
+ var server = createZeroSQLiteServer({
424
+ schema: zeroHttpFixtureSchema,
425
+ models: {
426
+ project: {
427
+ mutate: {
428
+ create: async function (param, value2) {
429
+ var {
430
+ tx
431
+ } = param;
432
+ await tx.mutate.project.insert(value2);
433
+ }
434
+ }
435
+ }
436
+ },
437
+ createServerActions: function () {
438
+ return {};
439
+ },
440
+ transactionProvider
441
+ });
442
+ var value = {
443
+ id: "p1",
444
+ ownerId: "u1",
445
+ name: "first"
446
+ };
447
+ await server.handleMutationRequest({
448
+ authData: null,
449
+ request: pushRequest(1, "project.create", value)
450
+ });
451
+ var duplicate = await server.handleMutationRequest({
452
+ authData: null,
453
+ request: pushRequest(1, "project.create", value)
454
+ });
455
+ expect(duplicate.response.mutations[0].result).toMatchObject({
456
+ error: "alreadyProcessed"
457
+ });
458
+ expect(db.prepare("SELECT lastMutationID FROM zero_0_clients").get()).toEqual({
459
+ lastMutationID: 1
460
+ });
461
+ expect(db.prepare("SELECT COUNT(*) AS count FROM zero_0_mutations").get()).toEqual({
462
+ count: 1
463
+ });
464
+ await server.handleMutationRequest({
465
+ authData: null,
466
+ request: cleanupRequest()
467
+ });
468
+ expect(db.prepare("SELECT COUNT(*) AS count FROM zero_0_mutations").get()).toEqual({
469
+ count: 0
470
+ });
471
+ });
472
+ test("supports direct CRUD, server names, value codecs, and query AST execution", async function () {
473
+ var server = createZeroSQLiteServer({
474
+ schema: sqliteTypesSchema,
475
+ models: {
476
+ note: {
477
+ mutate: {
478
+ insert: async function (param, value) {
479
+ var {
480
+ tx
481
+ } = param;
482
+ await tx.mutate.note.insert(value);
483
+ },
484
+ upsert: async function (param, value) {
485
+ var {
486
+ tx
487
+ } = param;
488
+ await tx.mutate.note.upsert(value);
489
+ },
490
+ update: async function (param, value) {
491
+ var {
492
+ tx
493
+ } = param;
494
+ await tx.mutate.note.update(value);
495
+ },
496
+ delete: async function (param, value) {
497
+ var {
498
+ tx
499
+ } = param;
500
+ await tx.mutate.note.delete(value);
501
+ }
502
+ }
503
+ }
504
+ },
505
+ createServerActions: function () {
506
+ return {};
507
+ },
508
+ transactionProvider
509
+ });
510
+ await server.mutate.note.insert({
511
+ id: "n1",
512
+ done: false,
513
+ data: {
514
+ label: "first"
515
+ }
516
+ });
517
+ await server.mutate.note.upsert({
518
+ id: "n1",
519
+ done: true,
520
+ data: {
521
+ label: "second"
522
+ }
523
+ });
524
+ await server.mutate.note.update({
525
+ id: "n1",
526
+ done: false
527
+ });
528
+ expect(db.prepare("SELECT * FROM note_records").get()).toEqual({
529
+ note_id: "n1",
530
+ done: 0,
531
+ data: JSON.stringify({
532
+ label: "second"
533
+ })
534
+ });
535
+ await expect(server.query(function (q) {
536
+ return q.note;
537
+ })).resolves.toEqual([{
538
+ id: "n1",
539
+ done: false,
540
+ data: {
541
+ label: "second"
542
+ }
543
+ }]);
544
+ await server.transaction(async function (tx) {
545
+ if (tx.location !== "server") throw new Error("expected server transaction");
546
+ await expect(tx.query.note.one().run()).resolves.toEqual({
547
+ id: "n1",
548
+ done: false,
549
+ data: {
550
+ label: "second"
551
+ }
552
+ });
553
+ await expect(tx.dbTransaction.query("SELECT * FROM note_records", [])).resolves.toEqual([{
554
+ note_id: "n1",
555
+ done: 0,
556
+ data: JSON.stringify({
557
+ label: "second"
558
+ })
559
+ }]);
560
+ });
561
+ await server.mutate.note.delete({
562
+ id: "n1"
563
+ });
564
+ expect(db.prepare("SELECT * FROM note_records").all()).toEqual([]);
565
+ expect(statements).toEqual([{
566
+ table: "note_records",
567
+ publicTable: "note",
568
+ kind: "insert"
569
+ }, {
570
+ table: "note_records",
571
+ publicTable: "note",
572
+ kind: "upsert"
573
+ }, {
574
+ table: "note_records",
575
+ publicTable: "note",
576
+ kind: "update"
577
+ }, {
578
+ table: "note_records",
579
+ publicTable: "note",
580
+ kind: "delete"
581
+ }]);
582
+ });
583
+ test("decodes destination rows through a hidden two-hop junction", async function () {
584
+ var server = createZeroSQLiteServer({
585
+ schema: twoHopSchema,
586
+ models: {},
587
+ createServerActions: function () {
588
+ return {};
589
+ },
590
+ transactionProvider
591
+ });
592
+ await expect(server.query(function (q) {
593
+ return q.person.related("teams");
594
+ })).resolves.toEqual([{
595
+ id: "p1",
596
+ teams: [{
597
+ id: "t1",
598
+ active: true,
599
+ metadata: {
600
+ label: "core"
601
+ }
602
+ }]
603
+ }]);
604
+ });
605
+ test("accepts a hydrated singular query result from the transaction executor", async function () {
606
+ var hydrated = {
607
+ id: "n1",
608
+ done: false,
609
+ data: {
610
+ label: "already decoded"
611
+ }
612
+ };
613
+ var receivedQueryName;
614
+ var hydratedExecutor = {
615
+ async exec() {
616
+ return {
617
+ changes: 0
618
+ };
619
+ },
620
+ async query() {
621
+ return [];
622
+ },
623
+ async queryAst(_ast, _format, queryName) {
624
+ receivedQueryName = queryName;
625
+ return hydrated;
626
+ }
627
+ };
628
+ var hydratedProvider = async function (callback) {
629
+ return callback(hydratedExecutor);
630
+ };
631
+ var server = createZeroSQLiteServer({
632
+ schema: sqliteTypesSchema,
633
+ models: {},
634
+ createServerActions: function () {
635
+ return {};
636
+ },
637
+ transactionProvider: hydratedProvider
638
+ });
639
+ await expect(server.query(function (q) {
640
+ return asQueryInternals(q.note.one()).nameAndArgs("noteByID", ["n1"]);
641
+ })).resolves.toEqual(hydrated);
642
+ expect(receivedQueryName).toBe("noteByID");
643
+ });
644
+ });
645
+ //# sourceMappingURL=createZeroSQLiteServer.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DatabaseSync","boolean","createSchema","json","relationships","string","table","asQueryInternals","afterEach","beforeEach","describe","expect","test","createZeroSQLiteServer","zeroHttpFixtureSchema","mutations","serverWhere","note","from","columns","id","done","data","optional","primaryKey","sqliteTypesSchema","tables","enableLegacyQueries","person","membership","personId","teamId","team","active","metadata","twoHopSchema","param","many","teams","sourceField","destSchema","destField","pushRequest","name","args","Request","method","headers","body","JSON","stringify","clientGroupID","type","clientID","timestamp","pushVersion","requestID","cleanupRequest","upToMutationID","db","retryNextTransaction","transactionProvider","statements","exec","join","executor","sql","params","arguments","length","push","result","prepare","run","changes","Number","query","all","queryAst","ast","format","rows","map","row","note_id","parse","label","Error","singular","callback","value","error","close","effectRuns","server","schema","models","project","mutate","create","tx","server2","insert","enqueueTask","barrier","createServerActions","handleMutationRequest","authData","request","ownerId","skipAsyncTasks","response","toEqual","lastMutationID","asyncTasks","toHaveLength","toBe","task","converge","update","fail","toMatchObject","message","get","stored","projectPermission","q","cmp","projectMutations","role","inserted","permissionChecks","can","_where","rejects","toThrow","value2","duplicate","count","upsert","delete"],"sources":["../../src/createZeroSQLiteServer.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}