@rocicorp/zero 0.6.2024112102 → 0.7.2024120100

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 (243) hide show
  1. package/out/advanced.js +1 -1
  2. package/out/{chunk-QB7G63C6.js → chunk-4XX2NVJ7.js} +737 -738
  3. package/out/{chunk-QB7G63C6.js.map → chunk-4XX2NVJ7.js.map} +4 -4
  4. package/out/{chunk-5UY46OAF.js → chunk-C7M3BJ3Z.js} +16 -8
  5. package/out/chunk-C7M3BJ3Z.js.map +7 -0
  6. package/out/shared/src/expand.js +2 -0
  7. package/out/shared/src/expand.js.map +1 -0
  8. package/out/shared/src/immutable.js +2 -0
  9. package/out/shared/src/immutable.js.map +1 -0
  10. package/out/{zero-cache/src/config/config.d.ts → shared/src/options.d.ts} +3 -5
  11. package/out/shared/src/options.d.ts.map +1 -0
  12. package/out/{zero-cache/src/config/config.js → shared/src/options.js} +26 -26
  13. package/out/shared/src/options.js.map +1 -0
  14. package/out/shared/src/sorted-entries.js +6 -0
  15. package/out/shared/src/sorted-entries.js.map +1 -0
  16. package/out/shared/src/writable.js +2 -0
  17. package/out/shared/src/writable.js.map +1 -0
  18. package/out/solid.js +2 -2
  19. package/out/zero/src/build-schema.d.ts +3 -0
  20. package/out/zero/src/build-schema.d.ts.map +1 -0
  21. package/out/zero/src/build-schema.js +3 -0
  22. package/out/zero/src/build-schema.js.map +1 -0
  23. package/out/zero-cache/src/auth/load-schema.d.ts +8 -0
  24. package/out/zero-cache/src/auth/load-schema.d.ts.map +1 -0
  25. package/out/zero-cache/src/auth/load-schema.js +35 -0
  26. package/out/zero-cache/src/auth/load-schema.js.map +1 -0
  27. package/out/zero-cache/src/auth/read-authorizer.d.ts +25 -0
  28. package/out/zero-cache/src/auth/read-authorizer.d.ts.map +1 -0
  29. package/out/zero-cache/src/auth/read-authorizer.js +126 -0
  30. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -0
  31. package/out/zero-cache/src/auth/write-authorizer.d.ts +20 -0
  32. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -0
  33. package/out/zero-cache/src/auth/write-authorizer.js +320 -0
  34. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -0
  35. package/out/zero-cache/src/config/zero-config.d.ts +14 -4
  36. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  37. package/out/zero-cache/src/config/zero-config.js +27 -14
  38. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  39. package/out/zero-cache/src/server/main.js +7 -0
  40. package/out/zero-cache/src/server/main.js.map +1 -1
  41. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  42. package/out/zero-cache/src/server/replicator.js +4 -3
  43. package/out/zero-cache/src/server/replicator.js.map +1 -1
  44. package/out/zero-cache/src/server/runtime.d.ts +3 -0
  45. package/out/zero-cache/src/server/runtime.d.ts.map +1 -0
  46. package/out/zero-cache/src/server/runtime.js +19 -0
  47. package/out/zero-cache/src/server/runtime.js.map +1 -0
  48. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  49. package/out/zero-cache/src/server/syncer.js +7 -6
  50. package/out/zero-cache/src/server/syncer.js.map +1 -1
  51. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +1 -1
  52. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  53. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +7 -6
  54. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  55. package/out/zero-cache/src/services/mutagen/mutagen.js +19 -33
  56. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  57. package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
  58. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  59. package/out/zero-cache/src/services/replicator/replicator.js +2 -2
  60. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  61. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +1 -1
  62. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  63. package/out/zero-cache/src/services/view-syncer/client-handler.js +11 -8
  64. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  65. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +17 -8
  66. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  67. package/out/zero-cache/src/services/view-syncer/cvr-store.js +357 -94
  68. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  69. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +15 -10
  70. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  71. package/out/zero-cache/src/services/view-syncer/cvr.js +42 -23
  72. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  73. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  74. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +2 -2
  75. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  76. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +22 -0
  77. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
  78. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +33 -7
  79. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  80. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
  81. package/out/zero-cache/src/services/view-syncer/schema/init.js +44 -5
  82. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  83. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +1 -0
  84. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  85. package/out/zero-cache/src/services/view-syncer/schema/types.js +3 -0
  86. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  87. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  88. package/out/zero-cache/src/services/view-syncer/snapshotter.js +5 -0
  89. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  90. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +9 -1
  91. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  92. package/out/zero-cache/src/services/view-syncer/view-syncer.js +167 -50
  93. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  94. package/out/zero-cache/src/types/row-key.d.ts +6 -0
  95. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  96. package/out/zero-cache/src/types/row-key.js +16 -1
  97. package/out/zero-cache/src/types/row-key.js.map +1 -1
  98. package/out/zero-cache/src/workers/connection.d.ts +2 -3
  99. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  100. package/out/zero-cache/src/workers/connection.js +4 -3
  101. package/out/zero-cache/src/workers/connection.js.map +1 -1
  102. package/out/zero-cache/src/workers/replicator.d.ts +3 -1
  103. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  104. package/out/zero-cache/src/workers/replicator.js +2 -0
  105. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  106. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  107. package/out/zero-cache/src/workers/syncer.js +13 -3
  108. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  109. package/out/zero-client/src/client/options.d.ts +37 -8
  110. package/out/zero-client/src/client/options.d.ts.map +1 -1
  111. package/out/zero-client/src/client/reload-error-handler.d.ts +16 -1
  112. package/out/zero-client/src/client/reload-error-handler.d.ts.map +1 -1
  113. package/out/zero-client/src/client/zero.d.ts +7 -55
  114. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  115. package/out/zero-client/src/mod.d.ts +2 -2
  116. package/out/zero-client/src/mod.d.ts.map +1 -1
  117. package/out/zero-protocol/src/ast-hash.js +14 -0
  118. package/out/zero-protocol/src/ast-hash.js.map +1 -0
  119. package/out/zero-protocol/src/ast.d.ts +9 -9
  120. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  121. package/out/zero-protocol/src/ast.js +11 -12
  122. package/out/zero-protocol/src/ast.js.map +1 -1
  123. package/out/zero-protocol/src/down.d.ts +4 -4
  124. package/out/zero-protocol/src/poke.d.ts +16 -8
  125. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  126. package/out/zero-protocol/src/poke.js +8 -2
  127. package/out/zero-protocol/src/poke.js.map +1 -1
  128. package/out/zero-schema/src/build-schema.d.ts +14 -0
  129. package/out/zero-schema/src/build-schema.d.ts.map +1 -0
  130. package/out/zero-schema/src/build-schema.js +55 -0
  131. package/out/zero-schema/src/build-schema.js.map +1 -0
  132. package/out/zero-schema/src/compiled-permissions.d.ts +480 -0
  133. package/out/zero-schema/src/compiled-permissions.d.ts.map +1 -0
  134. package/out/zero-schema/src/compiled-permissions.js +20 -0
  135. package/out/zero-schema/src/compiled-permissions.js.map +1 -0
  136. package/out/zero-schema/src/mod.d.ts +1 -1
  137. package/out/zero-schema/src/mod.d.ts.map +1 -1
  138. package/out/zero-schema/src/normalize-table-schema.d.ts +19 -17
  139. package/out/zero-schema/src/normalize-table-schema.d.ts.map +1 -1
  140. package/out/zero-schema/src/normalize-table-schema.js +92 -0
  141. package/out/zero-schema/src/normalize-table-schema.js.map +1 -0
  142. package/out/zero-schema/src/normalized-schema.d.ts +6 -1
  143. package/out/zero-schema/src/normalized-schema.d.ts.map +1 -1
  144. package/out/zero-schema/src/normalized-schema.js +31 -0
  145. package/out/zero-schema/src/normalized-schema.js.map +1 -0
  146. package/out/zero-schema/src/permissions.d.ts +32 -0
  147. package/out/zero-schema/src/permissions.d.ts.map +1 -0
  148. package/out/zero-schema/src/schema-config.d.ts +43 -0
  149. package/out/zero-schema/src/schema-config.d.ts.map +1 -0
  150. package/out/zero-schema/src/schema-config.js +79 -0
  151. package/out/zero-schema/src/schema-config.js.map +1 -0
  152. package/out/zero-schema/src/schema.js +4 -0
  153. package/out/zero-schema/src/schema.js.map +1 -0
  154. package/out/zero-schema/src/table-schema.d.ts +15 -20
  155. package/out/zero-schema/src/table-schema.d.ts.map +1 -1
  156. package/out/zero-schema/src/table-schema.js +15 -2
  157. package/out/zero-schema/src/table-schema.js.map +1 -1
  158. package/out/zero.js +4 -4
  159. package/out/zql/src/builder/builder.d.ts +2 -2
  160. package/out/zql/src/builder/builder.d.ts.map +1 -1
  161. package/out/zql/src/builder/builder.js +15 -17
  162. package/out/zql/src/builder/builder.js.map +1 -1
  163. package/out/zql/src/builder/filter.d.ts +25 -2
  164. package/out/zql/src/builder/filter.d.ts.map +1 -1
  165. package/out/zql/src/builder/filter.js +91 -1
  166. package/out/zql/src/builder/filter.js.map +1 -1
  167. package/out/zql/src/ivm/array-view.js +70 -0
  168. package/out/zql/src/ivm/array-view.js.map +1 -0
  169. package/out/zql/src/ivm/change.d.ts +18 -6
  170. package/out/zql/src/ivm/change.d.ts.map +1 -1
  171. package/out/zql/src/ivm/change.js +1 -1
  172. package/out/zql/src/ivm/change.js.map +1 -1
  173. package/out/zql/src/ivm/constraint.d.ts +14 -0
  174. package/out/zql/src/ivm/constraint.d.ts.map +1 -0
  175. package/out/zql/src/ivm/constraint.js +60 -0
  176. package/out/zql/src/ivm/constraint.js.map +1 -0
  177. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  178. package/out/zql/src/ivm/exists.js +19 -2
  179. package/out/zql/src/ivm/exists.js.map +1 -1
  180. package/out/zql/src/ivm/join.d.ts +11 -5
  181. package/out/zql/src/ivm/join.d.ts.map +1 -1
  182. package/out/zql/src/ivm/join.js +49 -95
  183. package/out/zql/src/ivm/join.js.map +1 -1
  184. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  185. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +4 -13
  186. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  187. package/out/zql/src/ivm/memory-source.d.ts +5 -22
  188. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  189. package/out/zql/src/ivm/memory-source.js +61 -83
  190. package/out/zql/src/ivm/memory-source.js.map +1 -1
  191. package/out/zql/src/ivm/operator.d.ts +7 -10
  192. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  193. package/out/zql/src/ivm/operator.js +1 -1
  194. package/out/zql/src/ivm/operator.js.map +1 -1
  195. package/out/zql/src/ivm/take.d.ts +3 -1
  196. package/out/zql/src/ivm/take.d.ts.map +1 -1
  197. package/out/zql/src/ivm/take.js +95 -95
  198. package/out/zql/src/ivm/take.js.map +1 -1
  199. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  200. package/out/zql/src/ivm/view-apply-change.js +168 -0
  201. package/out/zql/src/ivm/view-apply-change.js.map +1 -0
  202. package/out/zql/src/ivm/view.js +2 -0
  203. package/out/zql/src/ivm/view.js.map +1 -0
  204. package/out/zql/src/query/auth-query.d.ts +3 -5
  205. package/out/zql/src/query/auth-query.d.ts.map +1 -1
  206. package/out/zql/src/query/auth-query.js +30 -0
  207. package/out/zql/src/query/auth-query.js.map +1 -0
  208. package/out/zql/src/query/dnf.js +57 -0
  209. package/out/zql/src/query/dnf.js.map +1 -0
  210. package/out/zql/src/query/expression.js +155 -0
  211. package/out/zql/src/query/expression.js.map +1 -0
  212. package/out/zql/src/query/query-impl.d.ts +4 -1
  213. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  214. package/out/zql/src/query/query-impl.js +353 -0
  215. package/out/zql/src/query/query-impl.js.map +1 -0
  216. package/out/zql/src/query/query-internal.js +2 -0
  217. package/out/zql/src/query/query-internal.js.map +1 -0
  218. package/out/zql/src/query/query.js +3 -0
  219. package/out/zql/src/query/query.js.map +1 -0
  220. package/out/zql/src/query/typed-view.js +2 -0
  221. package/out/zql/src/query/typed-view.js.map +1 -0
  222. package/out/zqlite/src/table-source.d.ts +2 -11
  223. package/out/zqlite/src/table-source.d.ts.map +1 -1
  224. package/out/zqlite/src/table-source.js +33 -82
  225. package/out/zqlite/src/table-source.js.map +1 -1
  226. package/package.json +5 -3
  227. package/out/chunk-5UY46OAF.js.map +0 -7
  228. package/out/zero-cache/src/auth/load-authorization.d.ts +0 -4
  229. package/out/zero-cache/src/auth/load-authorization.d.ts.map +0 -1
  230. package/out/zero-cache/src/auth/load-authorization.js +0 -20
  231. package/out/zero-cache/src/auth/load-authorization.js.map +0 -1
  232. package/out/zero-cache/src/config/config.d.ts.map +0 -1
  233. package/out/zero-cache/src/config/config.js.map +0 -1
  234. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts +0 -21
  235. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +0 -1
  236. package/out/zero-cache/src/services/mutagen/write-authorizer.js +0 -168
  237. package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +0 -1
  238. package/out/zero-schema/src/authorization.d.ts +0 -25
  239. package/out/zero-schema/src/authorization.d.ts.map +0 -1
  240. package/out/zero-schema/src/compiled-authorization.d.ts +0 -561
  241. package/out/zero-schema/src/compiled-authorization.d.ts.map +0 -1
  242. package/out/zero-schema/src/compiled-authorization.js +0 -15
  243. package/out/zero-schema/src/compiled-authorization.js.map +0 -1
@@ -164,6 +164,7 @@ function applyChange(parentEntry, change, schema, relationship, format) {
164
164
  assert(found, "node does not exist");
165
165
  view.splice(pos, 1);
166
166
  }
167
+ drainStreams(change.node);
167
168
  break;
168
169
  }
169
170
  case "child": {
@@ -198,27 +199,27 @@ function applyChange(parentEntry, change, schema, relationship, format) {
198
199
  assertObject(parentEntry[relationship]);
199
200
  parentEntry[relationship] = {
200
201
  ...parentEntry[relationship],
201
- ...change.row
202
+ ...change.node.row
202
203
  };
203
204
  } else {
204
205
  assertArray(parentEntry[relationship]);
205
206
  const view = parentEntry[relationship];
206
- if (schema.compareRows(change.oldRow, change.row) === 0) {
207
+ if (schema.compareRows(change.oldNode.row, change.node.row) === 0) {
207
208
  const { pos, found } = binarySearch(
208
209
  view,
209
- change.oldRow,
210
+ change.oldNode.row,
210
211
  schema.compareRows
211
212
  );
212
213
  assert(found, "node does not exists");
213
214
  view[pos] = makeEntryPreserveRelationships(
214
- change.row,
215
+ change.node.row,
215
216
  view[pos],
216
217
  schema.relationships
217
218
  );
218
219
  } else {
219
220
  const { pos, found } = binarySearch(
220
221
  view,
221
- change.oldRow,
222
+ change.oldNode.row,
222
223
  schema.compareRows
223
224
  );
224
225
  assert(found, "node does not exists");
@@ -227,7 +228,7 @@ function applyChange(parentEntry, change, schema, relationship, format) {
227
228
  {
228
229
  const { pos: pos2, found: found2 } = binarySearch(
229
230
  view,
230
- change.row,
231
+ change.node.row,
231
232
  schema.compareRows
232
233
  );
233
234
  assert(!found2, "node already exists");
@@ -235,7 +236,7 @@ function applyChange(parentEntry, change, schema, relationship, format) {
235
236
  pos2,
236
237
  0,
237
238
  makeEntryPreserveRelationships(
238
- change.row,
239
+ change.node.row,
239
240
  oldEntry,
240
241
  schema.relationships
241
242
  )
@@ -273,6 +274,13 @@ function makeEntryPreserveRelationships(row, entry, relationships) {
273
274
  }
274
275
  return result;
275
276
  }
277
+ function drainStreams(node) {
278
+ for (const stream of Object.values(node.relationships)) {
279
+ for (const node2 of stream) {
280
+ drainStreams(node2);
281
+ }
282
+ }
283
+ }
276
284
 
277
285
  export {
278
286
  assert,
@@ -288,4 +296,4 @@ export {
288
296
  must,
289
297
  applyChange
290
298
  };
291
- //# sourceMappingURL=chunk-5UY46OAF.js.map
299
+ //# sourceMappingURL=chunk-C7M3BJ3Z.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../shared/src/asserts.ts", "../../shared/src/must.ts", "../../zql/src/ivm/view-apply-change.ts"],
4
+ "sourcesContent": ["export function assert(b: unknown, msg = 'Assertion failed'): asserts b {\n if (!b) {\n throw new Error(msg);\n }\n}\n\nexport function assertString(v: unknown): asserts v is string {\n assertType(v, 'string');\n}\n\nexport function assertNumber(v: unknown): asserts v is number {\n assertType(v, 'number');\n}\n\nexport function assertBoolean(v: unknown): asserts v is boolean {\n assertType(v, 'boolean');\n}\n\nfunction assertType(v: unknown, t: string) {\n if (typeof v !== t) {\n throwInvalidType(v, t);\n }\n}\n\nexport function assertObject(v: unknown): asserts v is Record<string, unknown> {\n if (v === null) {\n throwInvalidType(v, 'object');\n }\n assertType(v, 'object');\n}\n\nexport function assertArray(v: unknown): asserts v is unknown[] {\n if (!Array.isArray(v)) {\n throwInvalidType(v, 'array');\n }\n}\n\nexport function invalidType(v: unknown, t: string): string {\n let s = 'Invalid type: ';\n if (v === null || v === undefined) {\n s += v;\n } else {\n s += `${typeof v} \\`${v}\\``;\n }\n return s + `, expected ${t}`;\n}\n\nexport function throwInvalidType(v: unknown, t: string): never {\n throw new Error(invalidType(v, t));\n}\n\nexport function assertNotNull<T>(v: T | null): asserts v is T {\n if (v === null) {\n throw new Error('Expected non-null value');\n }\n}\n\nexport function assertUndefined<T>(\n v: T | undefined,\n msg = 'Expected undefined value',\n): asserts v is T {\n if (v !== undefined) {\n throw new Error(msg);\n }\n}\n\nexport function assertNotUndefined<T>(\n v: T | undefined,\n msg = 'Expected non undefined value',\n): asserts v is T {\n if (v === undefined) {\n throw new Error(msg);\n }\n}\n\nexport function assertInstanceof<T>(\n v: unknown,\n t: new (...args: unknown[]) => T,\n): asserts v is T {\n if (!(v instanceof t)) {\n throw new Error(`Expected instanceof ${t.name}`);\n }\n}\n\nexport function assertUint8Array(v: unknown): asserts v is Uint8Array {\n assertInstanceof(v, Uint8Array);\n}\n\nexport function unreachable(): never;\nexport function unreachable(v: never): never;\nexport function unreachable(_?: never): never {\n throw new Error('Unreachable');\n}\n\nexport function notImplemented(): never {\n throw new Error('Not implemented');\n}\n", "export function must<T>(v: T | undefined | null, msg?: string): T {\n // eslint-disable-next-line eqeqeq\n if (v == null) {\n throw new Error(msg ?? `Unexpected ${v} value`);\n }\n return v;\n}\n", "import {\n assert,\n assertArray,\n assertObject,\n assertUndefined,\n unreachable,\n} from '../../../shared/src/asserts.js';\nimport {must} from '../../../shared/src/must.js';\nimport type {Row} from '../../../zero-protocol/src/data.js';\nimport type {Change} from './change.js';\nimport type {Node, Comparator} from './data.js';\nimport type {SourceSchema} from './schema.js';\nimport type {Entry, EntryList, Format} from './view.js';\n\nexport function applyChange(\n parentEntry: Entry,\n change: Change,\n schema: SourceSchema,\n relationship: string,\n format: Format,\n) {\n if (schema.isHidden) {\n switch (change.type) {\n case 'add':\n case 'remove':\n for (const [relationship, children] of Object.entries(\n change.node.relationships,\n )) {\n const childSchema = must(schema.relationships[relationship]);\n for (const node of children) {\n applyChange(\n parentEntry,\n {type: change.type, node},\n childSchema,\n relationship,\n format,\n );\n }\n }\n return;\n case 'edit':\n // If hidden at this level it means that the hidden row was changed. If\n // the row was changed in such a way that it would change the\n // relationships then the edit would have been split into remove and\n // add.\n return;\n case 'child': {\n const childSchema = must(\n schema.relationships[change.child.relationshipName],\n );\n applyChange(\n parentEntry,\n change.child.change,\n childSchema,\n relationship,\n format,\n );\n return;\n }\n default:\n unreachable(change);\n }\n }\n\n const {singular, relationships: childFormats} = format;\n switch (change.type) {\n case 'add': {\n // TODO: Only create a new entry if we need to mutate the existing one.\n const newEntry: Entry = {\n ...change.node.row,\n };\n if (singular) {\n assertUndefined(\n parentEntry[relationship],\n 'single output already exists',\n );\n parentEntry[relationship] = newEntry;\n } else {\n const view = parentEntry[relationship];\n assertArray(view);\n const {pos, found} = binarySearch(view, newEntry, schema.compareRows);\n assert(!found, 'node already exists');\n view.splice(pos, 0, newEntry);\n }\n for (const [relationship, children] of Object.entries(\n change.node.relationships,\n )) {\n // TODO: Is there a flag to make TypeScript complain that dictionary access might be undefined?\n const childSchema = must(schema.relationships[relationship]);\n const childFormat = childFormats[relationship];\n if (childFormat === undefined) {\n continue;\n }\n\n const newView = childFormat.singular ? undefined : ([] as EntryList);\n newEntry[relationship] = newView;\n for (const node of children) {\n applyChange(\n newEntry,\n {type: 'add', node},\n childSchema,\n relationship,\n childFormat,\n );\n }\n }\n break;\n }\n case 'remove': {\n if (singular) {\n assertObject(parentEntry[relationship]);\n parentEntry[relationship] = undefined;\n } else {\n assertArray(parentEntry[relationship]);\n const view = parentEntry[relationship];\n const {pos, found} = binarySearch(\n view,\n change.node.row,\n schema.compareRows,\n );\n assert(found, 'node does not exist');\n view.splice(pos, 1);\n }\n // Needed to ensure cleanup of operator state is fully done.\n drainStreams(change.node);\n break;\n }\n case 'child': {\n let existing: Entry;\n if (singular) {\n assertObject(parentEntry[relationship]);\n existing = parentEntry[relationship];\n } else {\n assertArray(parentEntry[relationship]);\n const list = parentEntry[relationship];\n const {pos, found} = binarySearch(list, change.row, schema.compareRows);\n assert(found, 'node does not exist');\n existing = list[pos];\n }\n\n const childSchema = must(\n schema.relationships[change.child.relationshipName],\n );\n const childFormat = must(\n format.relationships[change.child.relationshipName],\n );\n applyChange(\n existing,\n change.child.change,\n childSchema,\n change.child.relationshipName,\n childFormat,\n );\n break;\n }\n case 'edit': {\n if (singular) {\n assertObject(parentEntry[relationship]);\n parentEntry[relationship] = {\n ...parentEntry[relationship],\n ...change.node.row,\n };\n } else {\n assertArray(parentEntry[relationship]);\n const view = parentEntry[relationship];\n // If the order changed due to the edit, we need to remove and reinsert.\n if (schema.compareRows(change.oldNode.row, change.node.row) === 0) {\n const {pos, found} = binarySearch(\n view,\n change.oldNode.row,\n schema.compareRows,\n );\n assert(found, 'node does not exists');\n view[pos] = makeEntryPreserveRelationships(\n change.node.row,\n view[pos],\n schema.relationships,\n );\n } else {\n // Remove\n const {pos, found} = binarySearch(\n view,\n change.oldNode.row,\n schema.compareRows,\n );\n assert(found, 'node does not exists');\n const oldEntry = view[pos];\n view.splice(pos, 1);\n\n // Insert\n {\n const {pos, found} = binarySearch(\n view,\n change.node.row,\n schema.compareRows,\n );\n assert(!found, 'node already exists');\n view.splice(\n pos,\n 0,\n makeEntryPreserveRelationships(\n change.node.row,\n oldEntry,\n schema.relationships,\n ),\n );\n }\n }\n }\n break;\n }\n default:\n unreachable(change);\n }\n}\n\n// TODO: Do not return an object. It puts unnecessary pressure on the GC.\nfunction binarySearch(view: EntryList, target: Entry, comparator: Comparator) {\n let low = 0;\n let high = view.length - 1;\n while (low <= high) {\n const mid = (low + high) >>> 1;\n const comparison = comparator(view[mid] as Row, target as Row);\n if (comparison < 0) {\n low = mid + 1;\n } else if (comparison > 0) {\n high = mid - 1;\n } else {\n return {pos: mid, found: true};\n }\n }\n return {pos: low, found: false};\n}\n\nfunction makeEntryPreserveRelationships(\n row: Row,\n entry: Entry,\n relationships: {[key: string]: SourceSchema},\n): Entry {\n const result: Entry = {...row};\n for (const relationship in relationships) {\n assert(!(relationship in row), 'Relationship already exists');\n result[relationship] = entry[relationship];\n }\n return result;\n}\n\nfunction drainStreams(node: Node) {\n for (const stream of Object.values(node.relationships)) {\n for (const node of stream) {\n drainStreams(node);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["relationship", "pos", "found", "node"]
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=expand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.js","sourceRoot":"","sources":["../../../../shared/src/expand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=immutable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutable.js","sourceRoot":"","sources":["../../../../shared/src/immutable.ts"],"names":[],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import type { OptionalLogger } from '@rocicorp/logger';
2
- import * as v from '../../../shared/src/valita.js';
2
+ import * as v from './valita.js';
3
3
  type RequiredOptionType = v.Type<string> | v.Type<number> | v.Type<boolean> | v.Type<string[]> | v.Type<number[]> | v.Type<boolean[]>;
4
4
  type OptionalOptionType = v.Optional<string> | v.Optional<number> | v.Optional<boolean> | v.Optional<string[]> | v.Optional<number[]> | v.Optional<boolean[]>;
5
5
  type OptionType = RequiredOptionType | OptionalOptionType;
@@ -105,8 +105,6 @@ export type Config<O extends Options> = {
105
105
  } & {
106
106
  [P in keyof O as O[P] extends Optional ? P : never]?: O[P] extends Optional ? ValueOf<O[P]> : never;
107
107
  };
108
- export declare function parseOptions<T extends Options>(options: T, argv: string[], envNamePrefix?: string, processEnv?: NodeJS.ProcessEnv, logger?: OptionalLogger): Config<T>;
109
- export declare class ExitAfterUsage extends Error {
110
- }
108
+ export declare function parseOptions<T extends Options>(options: T, argv: string[], envNamePrefix?: string, processEnv?: NodeJS.ProcessEnv, logger?: OptionalLogger, exit?: (code?: number) => never): Config<T>;
111
109
  export {};
112
- //# sourceMappingURL=config.d.ts.map
110
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../shared/src/options.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,9 @@ import kebabcase from 'lodash.kebabcase';
5
5
  import merge from 'lodash.merge';
6
6
  import snakeCase from 'lodash.snakecase';
7
7
  import stripAnsi from 'strip-ansi';
8
- import { assert } from '../../../shared/src/asserts.js';
9
- import { must } from '../../../shared/src/must.js';
10
- import * as v from '../../../shared/src/valita.js';
8
+ import { assert } from './asserts.js';
9
+ import { must } from './must.js';
10
+ import * as v from './valita.js';
11
11
  /**
12
12
  * Converts an Options instance into its corresponding {@link Config} schema.
13
13
  */
@@ -29,7 +29,7 @@ function configSchema(options) {
29
29
  }
30
30
  return makeObjectType(options);
31
31
  }
32
- export function parseOptions(options, argv, envNamePrefix = '', processEnv = process.env, logger = console) {
32
+ export function parseOptions(options, argv, envNamePrefix = '', processEnv = process.env, logger = console, exit = process.exit) {
33
33
  // The main logic for converting a valita Type spec to an Option (i.e. flag) spec.
34
34
  function addOption(name, option, group) {
35
35
  const { type, desc = [], alias, hidden } = option;
@@ -133,15 +133,13 @@ export function parseOptions(options, argv, envNamePrefix = '', processEnv = pro
133
133
  }
134
134
  }
135
135
  }
136
- const parsedArgs = merge(parseArgs(optsWithDefaults, argv, flagToField, logger), parseArgs(optsWithoutDefaults, envArgv, flagToField, logger), parseArgs(optsWithoutDefaults, argv, flagToField, logger));
136
+ const parsedArgs = merge(parseArgs(optsWithDefaults, argv, flagToField, logger, exit), parseArgs(optsWithoutDefaults, envArgv, flagToField, logger, exit), parseArgs(optsWithoutDefaults, argv, flagToField, logger, exit));
137
137
  const schema = configSchema(options);
138
138
  return v.parse(parsedArgs, schema);
139
139
  }
140
140
  catch (e) {
141
- if (!(e instanceof ExitAfterUsage)) {
142
- logger.error?.(String(e));
143
- showUsage(optsWithDefaults, logger);
144
- }
141
+ logger.error?.(String(e));
142
+ showUsage(optsWithDefaults, logger);
145
143
  throw e;
146
144
  }
147
145
  }
@@ -173,14 +171,13 @@ function valueParser(flagName, typeName) {
173
171
  }
174
172
  };
175
173
  }
176
- function parseArgs(optionDefs, argv, flagToField, logger) {
174
+ function parseArgs(optionDefs, argv, flagToField, logger, exit) {
177
175
  function normalizeFlagValue(value) {
178
176
  // A --flag without value is parsed by commandLineArgs() to `null`,
179
177
  // but this is a common convention to set a boolean flag to true.
180
178
  return value === null ? true : value;
181
179
  }
182
- const { _all, _none: ungrouped, _unknown: unknown, ...config // initially contains groups only
183
- } = commandLineArgs(optionDefs, {
180
+ const { _all, _none: ungrouped, _unknown: unknown, ...config } = commandLineArgs(optionDefs, {
184
181
  argv,
185
182
  partial: true,
186
183
  });
@@ -193,22 +190,27 @@ function parseArgs(optionDefs, argv, flagToField, logger) {
193
190
  logger.error?.('Invalid arguments:', unknown);
194
191
  }
195
192
  showUsage(optionDefs, logger);
196
- throw new ExitAfterUsage();
193
+ exit(0);
197
194
  }
198
- // Remap names for grouped flags.
199
- for (const group of Object.values(config ?? {})) {
200
- for (const [flagName, value] of Object.entries(group)) {
201
- delete group[flagName];
195
+ const result = { ...config };
196
+ // Handle ungrouped flags first
197
+ if (ungrouped) {
198
+ for (const [flagName, value] of Object.entries(ungrouped)) {
202
199
  const name = must(flagToField.get(flagName));
203
- group[name] = normalizeFlagValue(value);
200
+ result[name] = normalizeFlagValue(value);
204
201
  }
205
202
  }
206
- // Normalize and promote ungrouped flags.
207
- for (const [flagName, value] of Object.entries(ungrouped ?? {})) {
208
- const name = must(flagToField.get(flagName));
209
- config[name] = normalizeFlagValue(value);
203
+ // Then handle grouped flags
204
+ for (const [groupName, group] of Object.entries(config)) {
205
+ if (typeof group === 'object' && group !== null) {
206
+ result[groupName] = {};
207
+ for (const [flagName, value] of Object.entries(group)) {
208
+ const name = must(flagToField.get(flagName));
209
+ result[groupName][name] = normalizeFlagValue(value);
210
+ }
211
+ }
210
212
  }
211
- return config;
213
+ return result;
212
214
  }
213
215
  function showUsage(optionList, logger = console) {
214
216
  const hide = [];
@@ -241,6 +243,4 @@ function showUsage(optionList, logger = console) {
241
243
  },
242
244
  }));
243
245
  }
244
- export class ExitAfterUsage extends Error {
245
- }
246
- //# sourceMappingURL=config.js.map
246
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../shared/src/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { stringCompare } from './string-compare.js';
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ export function sortedEntries(object) {
4
+ return Object.entries(object).sort((a, b) => stringCompare(a[0], b[0]));
5
+ }
6
+ //# sourceMappingURL=sorted-entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorted-entries.js","sourceRoot":"","sources":["../../../../shared/src/sorted-entries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAElD,8DAA8D;AAC9D,MAAM,UAAU,aAAa,CAC3B,MAAS;IAET,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=writable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writable.js","sourceRoot":"","sources":["../../../../shared/src/writable.ts"],"names":[],"mappings":""}
package/out/solid.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  Zero
3
- } from "./chunk-QB7G63C6.js";
3
+ } from "./chunk-4XX2NVJ7.js";
4
4
  import "./chunk-HARIWJ2J.js";
5
5
  import "./chunk-ULOTOBTC.js";
6
6
  import {
7
7
  applyChange
8
- } from "./chunk-5UY46OAF.js";
8
+ } from "./chunk-C7M3BJ3Z.js";
9
9
  import "./chunk-F5QR3K72.js";
10
10
 
11
11
  // ../zero-solid/src/create-zero.ts
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '../../zero-schema/src/build-schema.js';
3
+ //# sourceMappingURL=build-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-schema.d.ts","sourceRoot":"","sources":["../../../src/build-schema.ts"],"names":[],"mappings":";AACA,OAAO,uCAAuC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '../../zero-schema/src/build-schema.js';
3
+ //# sourceMappingURL=build-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-schema.js","sourceRoot":"","sources":["../../../src/build-schema.ts"],"names":[],"mappings":";AACA,OAAO,uCAAuC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type PermissionsConfig } from '../../../zero-schema/src/compiled-permissions.js';
2
+ import type { Schema } from '../../../zero-schema/src/schema.js';
3
+ import type { ZeroConfig } from '../config/zero-config.js';
4
+ export declare function getSchema(config: ZeroConfig): Promise<{
5
+ schema: Schema;
6
+ permissions: PermissionsConfig;
7
+ }>;
8
+ //# sourceMappingURL=load-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-schema.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/load-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,oCAAoC,CAAC;AAG/D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAiCzD,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC,CAiBD"}
@@ -0,0 +1,35 @@
1
+ import path from 'node:path';
2
+ import { permissionsConfigSchema, } from '../../../zero-schema/src/compiled-permissions.js';
3
+ import { readFile } from 'node:fs/promises';
4
+ import * as v from '../../../shared/src/valita.js';
5
+ import { normalizeSchema } from '../../../zero-schema/src/normalized-schema.js';
6
+ import { replaceSchemaNamesWithPointers } from '../../../zero-schema/src/schema-config.js';
7
+ let loadedSchema;
8
+ function parseAuthConfig(input, source) {
9
+ try {
10
+ const config = JSON.parse(input);
11
+ const permissions = v.parse(config.permissions, permissionsConfigSchema);
12
+ const normalizedSchema = normalizeSchema(replaceSchemaNamesWithPointers(config.schema));
13
+ return {
14
+ permissions,
15
+ schema: normalizedSchema,
16
+ };
17
+ }
18
+ catch (e) {
19
+ throw new Error(`Failed to parse schema config from ${source}: ${e}`);
20
+ }
21
+ }
22
+ export function getSchema(config) {
23
+ if (loadedSchema) {
24
+ return loadedSchema;
25
+ }
26
+ loadedSchema = (async () => {
27
+ if (config.schema.json) {
28
+ return parseAuthConfig(config.schema.json, 'config.schema.json');
29
+ }
30
+ const fileContent = await readFile(path.resolve(config.schema.file), 'utf-8');
31
+ return parseAuthConfig(fileContent, config.schema.file);
32
+ })();
33
+ return loadedSchema;
34
+ }
35
+ //# sourceMappingURL=load-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-schema.js","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/load-schema.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,uBAAuB,GAExB,MAAM,kDAAkD,CAAC;AAE1D,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAC,MAAM,+CAA+C,CAAC;AAC9E,OAAO,EAAC,8BAA8B,EAAC,MAAM,2CAA2C,CAAC;AAEzF,IAAI,YAKS,CAAC;AAEd,SAAS,eAAe,CACtB,KAAa,EACb,MAAc;IAKd,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;QACzE,MAAM,gBAAgB,GAAG,eAAe,CACtC,8BAA8B,CAAC,MAAM,CAAC,MAAM,CAAC,CAC9C,CAAC;QACF,OAAO;YACL,WAAW;YACX,MAAM,EAAE,gBAAgB;SACzB,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAkB;IAI1C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAChC,OAAO,CACR,CAAC;QACF,OAAO,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { JWTPayload } from 'jose';
2
+ import type { AST } from '../../../zero-protocol/src/ast.js';
3
+ import type { PermissionsConfig } from '../../../zero-schema/src/compiled-permissions.js';
4
+ export type TransformedAndHashed = {
5
+ query: AST;
6
+ hash: string;
7
+ } | {
8
+ query: undefined;
9
+ hash: undefined;
10
+ };
11
+ /**
12
+ * Adds permission rules to the given query so it only returns rows that the
13
+ * user is allowed to read.
14
+ *
15
+ * If the returned query is `undefined` that means that user cannot run
16
+ * the query at all. This is only the case if we can infer that all rows
17
+ * would be excluded without running the query.
18
+ * E.g., the user is trying to query a table that is not readable.
19
+ */
20
+ export declare function transformAndHashQuery(query: AST, permissionRules: PermissionsConfig, authData: JWTPayload | undefined): TransformedAndHashed;
21
+ /**
22
+ * For a given AST, apply the read-auth rules and bind static auth data.
23
+ */
24
+ export declare function transformQuery(query: AST, permissionRules: PermissionsConfig, authData: JWTPayload | undefined): AST | undefined;
25
+ //# sourceMappingURL=read-authorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-authorizer.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/read-authorizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AAErC,OAAO,KAAK,EAAC,GAAG,EAAY,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,kDAAkD,CAAC;AAKxF,MAAM,MAAM,oBAAoB,GAC5B;IACE,KAAK,EAAE,GAAG,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AACN;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,GAAG,EACV,eAAe,EAAE,iBAAiB,EAClC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAC/B,oBAAoB,CAWtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,GAAG,EACV,eAAe,EAAE,iBAAiB,EAClC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAC/B,GAAG,GAAG,SAAS,CAOjB"}
@@ -0,0 +1,126 @@
1
+ import { hashOfAST } from '../../../zero-protocol/src/ast-hash.js';
2
+ import { bindStaticParameters } from '../../../zql/src/builder/builder.js';
3
+ import { dnf } from '../../../zql/src/query/dnf.js';
4
+ /**
5
+ * Adds permission rules to the given query so it only returns rows that the
6
+ * user is allowed to read.
7
+ *
8
+ * If the returned query is `undefined` that means that user cannot run
9
+ * the query at all. This is only the case if we can infer that all rows
10
+ * would be excluded without running the query.
11
+ * E.g., the user is trying to query a table that is not readable.
12
+ */
13
+ export function transformAndHashQuery(query, permissionRules, authData) {
14
+ const transformed = transformQuery(query, permissionRules, authData);
15
+ return transformed
16
+ ? {
17
+ query: transformed,
18
+ hash: hashOfAST(transformed),
19
+ }
20
+ : {
21
+ query: undefined,
22
+ hash: undefined,
23
+ };
24
+ }
25
+ /**
26
+ * For a given AST, apply the read-auth rules and bind static auth data.
27
+ */
28
+ export function transformQuery(query, permissionRules, authData) {
29
+ const queryWithPermissions = transformQueryInternal(query, permissionRules);
30
+ return queryWithPermissions !== undefined
31
+ ? bindStaticParameters(queryWithPermissions, {
32
+ authData: authData,
33
+ })
34
+ : undefined;
35
+ }
36
+ function transformQueryInternal(query, permissionRules) {
37
+ const rowSelectRules = permissionRules[query.table]?.row?.select;
38
+ if (rowSelectRules && rowSelectRules.length === 0) {
39
+ // The table cannot be read, ever. Nuke the query since
40
+ // there is nothing for it to do.
41
+ return undefined;
42
+ }
43
+ const updatedWhere = addRulesToWhere(query.where ? transformCondition(query.where, permissionRules) : undefined, rowSelectRules);
44
+ return {
45
+ ...query,
46
+ where: updatedWhere ? dnf(updatedWhere) : undefined,
47
+ related: query.related
48
+ ?.map(sq => {
49
+ const subquery = transformQueryInternal(sq.subquery, permissionRules);
50
+ if (subquery) {
51
+ return {
52
+ ...sq,
53
+ subquery,
54
+ };
55
+ }
56
+ return undefined;
57
+ })
58
+ .filter(q => q !== undefined),
59
+ };
60
+ }
61
+ function addRulesToWhere(where, rowSelectRules) {
62
+ if (rowSelectRules === undefined) {
63
+ return where;
64
+ }
65
+ return {
66
+ type: 'and',
67
+ conditions: [
68
+ ...(where ? [where] : []),
69
+ {
70
+ type: 'or',
71
+ conditions: rowSelectRules.map(([_, condition]) => condition),
72
+ },
73
+ ],
74
+ };
75
+ }
76
+ // We must augment conditions so we do not provide an oracle to users.
77
+ // E.g.,
78
+ // `issue.whereExists('secret', s => s.where('value', 'sdf'))`
79
+ // Not applying read policies to subqueries in the where position
80
+ // would allow users to infer the existence of rows, and their contents,
81
+ // that they cannot read.
82
+ function transformCondition(cond, auth) {
83
+ switch (cond.type) {
84
+ case 'simple':
85
+ return cond;
86
+ case 'and':
87
+ case 'or':
88
+ return {
89
+ ...cond,
90
+ conditions: cond.conditions.map(c => transformCondition(c, auth)),
91
+ };
92
+ case 'correlatedSubquery': {
93
+ const query = transformQueryInternal(cond.related.subquery, auth);
94
+ const replacement = query
95
+ ? {
96
+ ...cond,
97
+ related: {
98
+ ...cond.related,
99
+ subquery: query,
100
+ },
101
+ }
102
+ : undefined;
103
+ switch (cond.op) {
104
+ case 'EXISTS':
105
+ return replacement
106
+ ? replacement
107
+ : {
108
+ type: 'simple',
109
+ left: { type: 'literal', value: true },
110
+ op: '=',
111
+ right: { type: 'literal', value: false },
112
+ };
113
+ case 'NOT EXISTS':
114
+ return replacement
115
+ ? replacement
116
+ : {
117
+ type: 'simple',
118
+ left: { type: 'literal', value: true },
119
+ op: '=',
120
+ right: { type: 'literal', value: true },
121
+ };
122
+ }
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=read-authorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-authorizer.js","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/read-authorizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAC,MAAM,wCAAwC,CAAC;AAGjE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,GAAG,EAAC,MAAM,+BAA+B,CAAC;AAYlD;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAU,EACV,eAAkC,EAClC,QAAgC;IAEhC,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACrE,OAAO,WAAW;QAChB,CAAC,CAAC;YACE,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC;SAC7B;QACH,CAAC,CAAC;YACE,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;SAChB,CAAC;AACR,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAU,EACV,eAAkC,EAClC,QAAgC;IAEhC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC5E,OAAO,oBAAoB,KAAK,SAAS;QACvC,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE;YACzC,QAAQ,EAAE,QAAqC;SAChD,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAU,EACV,eAAkC;IAElC,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC;IAEjE,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,uDAAuD;QACvD,iCAAiC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAClC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,EAC1E,cAAc,CACf,CAAC;IACF,OAAO;QACL,GAAG,KAAK;QACR,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;QACnD,OAAO,EAAE,KAAK,CAAC,OAAO;YACpB,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE;YACT,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YACtE,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,GAAG,EAAE;oBACL,QAAQ;iBACT,CAAC;YACJ,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,KAA4B,EAC5B,cAAkD;IAElD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK;QACX,UAAU,EAAE;YACV,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB;gBACE,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;aAC9D;SACF;KACF,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,QAAQ;AACR,8DAA8D;AAC9D,iEAAiE;AACjE,wEAAwE;AACxE,yBAAyB;AACzB,SAAS,kBAAkB,CACzB,IAAe,EACf,IAAuB;IAEvB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;QACd,KAAK,KAAK,CAAC;QACX,KAAK,IAAI;YACP,OAAO;gBACL,GAAG,IAAI;gBACP,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;aAClE,CAAC;QACJ,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClE,MAAM,WAAW,GAAG,KAAK;gBACvB,CAAC,CAAC;oBACE,GAAG,IAAI;oBACP,OAAO,EAAE;wBACP,GAAG,IAAI,CAAC,OAAO;wBACf,QAAQ,EAAE,KAAK;qBAChB;iBACF;gBACH,CAAC,CAAC,SAAS,CAAC;YACd,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;gBAChB,KAAK,QAAQ;oBACX,OAAO,WAAW;wBAChB,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC;4BACE,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAC;4BACpC,EAAE,EAAE,GAAG;4BACP,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAC;yBACvC,CAAC;gBACR,KAAK,YAAY;oBACf,OAAO,WAAW;wBAChB,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC;4BACE,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAC;4BACpC,EAAE,EAAE,GAAG;4BACP,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAC;yBACtC,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { LogContext } from '@rocicorp/logger';
2
+ import type { JWTPayload } from 'jose';
3
+ import type { UpsertOp, CRUDOp } from '../../../zero-protocol/src/mod.js';
4
+ import { Database } from '../../../zqlite/src/db.js';
5
+ import type { ZeroConfig } from '../config/zero-config.js';
6
+ import type { PermissionsConfig } from '../../../zero-schema/src/compiled-permissions.js';
7
+ import type { Schema } from '../../../zero-schema/src/schema.js';
8
+ export interface WriteAuthorizer {
9
+ canPreMutation(authData: JWTPayload | undefined, ops: Exclude<CRUDOp, UpsertOp>[]): boolean;
10
+ canPostMutation(authData: JWTPayload | undefined, ops: Exclude<CRUDOp, UpsertOp>[]): boolean;
11
+ normalizeOps(ops: CRUDOp[]): Exclude<CRUDOp, UpsertOp>[];
12
+ }
13
+ export declare class WriteAuthorizerImpl implements WriteAuthorizer {
14
+ #private;
15
+ constructor(lc: LogContext, config: Pick<ZeroConfig, 'storageDBTmpDir'>, schema: Schema, permissions: PermissionsConfig | undefined, replica: Database, cgID: string);
16
+ canPreMutation(authData: JWTPayload | undefined, ops: Exclude<CRUDOp, UpsertOp>[]): boolean;
17
+ canPostMutation(authData: JWTPayload | undefined, ops: Exclude<CRUDOp, UpsertOp>[]): boolean;
18
+ normalizeOps(ops: CRUDOp[]): Exclude<CRUDOp, UpsertOp>[];
19
+ }
20
+ //# sourceMappingURL=write-authorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-authorizer.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/write-authorizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AAQrC,OAAO,KAAK,EAGV,QAAQ,EAER,MAAM,EACP,MAAM,mCAAmC,CAAC;AAU3C,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AAGnD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAMzD,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,kDAAkD,CAAC;AAE1D,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,oCAAoC,CAAC;AAU/D,MAAM,WAAW,eAAe;IAC9B,cAAc,CACZ,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,GAC/B,OAAO,CAAC;IACX,eAAe,CACb,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,GAC/B,OAAO,CAAC;IACX,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;CAC1D;AAED,qBAAa,mBAAoB,YAAW,eAAe;;gBAWvD,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAC3C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,iBAAiB,GAAG,SAAS,EAC1C,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,MAAM;IAsBd,cAAc,CACZ,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;IAsBlC,eAAe,CACb,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;IAyDlC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;CAgRzD"}