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