@rocicorp/zero 0.6.2024112101 → 0.7.2024112700

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 (223) hide show
  1. package/out/advanced.js +1 -1
  2. package/out/{chunk-5UY46OAF.js → chunk-C7M3BJ3Z.js} +16 -8
  3. package/out/chunk-C7M3BJ3Z.js.map +7 -0
  4. package/out/{chunk-MPEWBBGZ.js → chunk-HDEKBM3G.js} +686 -660
  5. package/out/{chunk-MPEWBBGZ.js.map → chunk-HDEKBM3G.js.map} +4 -4
  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 +34 -0
  26. package/out/zero-cache/src/auth/load-schema.js.map +1 -0
  27. package/out/zero-cache/src/auth/write-authorizer.d.ts +20 -0
  28. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -0
  29. package/out/zero-cache/src/auth/write-authorizer.js +320 -0
  30. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -0
  31. package/out/zero-cache/src/config/zero-config.d.ts +14 -4
  32. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  33. package/out/zero-cache/src/config/zero-config.js +27 -14
  34. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  35. package/out/zero-cache/src/server/main.js +7 -0
  36. package/out/zero-cache/src/server/main.js.map +1 -1
  37. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  38. package/out/zero-cache/src/server/replicator.js +4 -3
  39. package/out/zero-cache/src/server/replicator.js.map +1 -1
  40. package/out/zero-cache/src/server/runtime.d.ts +3 -0
  41. package/out/zero-cache/src/server/runtime.d.ts.map +1 -0
  42. package/out/zero-cache/src/server/runtime.js +19 -0
  43. package/out/zero-cache/src/server/runtime.js.map +1 -0
  44. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  45. package/out/zero-cache/src/server/syncer.js +7 -6
  46. package/out/zero-cache/src/server/syncer.js.map +1 -1
  47. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +1 -1
  48. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  49. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +6 -5
  50. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  51. package/out/zero-cache/src/services/mutagen/mutagen.js +19 -33
  52. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  53. package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
  54. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  55. package/out/zero-cache/src/services/replicator/replicator.js +2 -2
  56. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  57. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +1 -1
  58. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  59. package/out/zero-cache/src/services/view-syncer/client-handler.js +11 -8
  60. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  61. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +17 -8
  62. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  63. package/out/zero-cache/src/services/view-syncer/cvr-store.js +357 -94
  64. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  65. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +6 -9
  66. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  67. package/out/zero-cache/src/services/view-syncer/cvr.js +36 -22
  68. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  69. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  70. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +2 -2
  71. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  72. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +22 -0
  73. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
  74. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +33 -7
  75. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  76. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
  77. package/out/zero-cache/src/services/view-syncer/schema/init.js +44 -5
  78. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  79. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +1 -0
  80. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  81. package/out/zero-cache/src/services/view-syncer/schema/types.js +3 -0
  82. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  83. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  84. package/out/zero-cache/src/services/view-syncer/snapshotter.js +5 -0
  85. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  86. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +1 -1
  87. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  88. package/out/zero-cache/src/services/view-syncer/view-syncer.js +69 -19
  89. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  90. package/out/zero-cache/src/types/row-key.d.ts +6 -0
  91. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  92. package/out/zero-cache/src/types/row-key.js +16 -1
  93. package/out/zero-cache/src/types/row-key.js.map +1 -1
  94. package/out/zero-cache/src/workers/connection.d.ts +1 -1
  95. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  96. package/out/zero-cache/src/workers/connection.js.map +1 -1
  97. package/out/zero-cache/src/workers/replicator.d.ts +3 -1
  98. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  99. package/out/zero-cache/src/workers/replicator.js +2 -0
  100. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  101. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  102. package/out/zero-cache/src/workers/syncer.js +8 -3
  103. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  104. package/out/zero-client/src/client/options.d.ts +37 -8
  105. package/out/zero-client/src/client/options.d.ts.map +1 -1
  106. package/out/zero-client/src/client/reload-error-handler.d.ts +16 -1
  107. package/out/zero-client/src/client/reload-error-handler.d.ts.map +1 -1
  108. package/out/zero-client/src/client/zero.d.ts +7 -55
  109. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  110. package/out/zero-client/src/mod.d.ts +1 -1
  111. package/out/zero-client/src/mod.d.ts.map +1 -1
  112. package/out/zero-protocol/src/ast-hash.js +14 -0
  113. package/out/zero-protocol/src/ast-hash.js.map +1 -0
  114. package/out/zero-protocol/src/down.d.ts +4 -4
  115. package/out/zero-protocol/src/poke.d.ts +16 -8
  116. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  117. package/out/zero-protocol/src/poke.js +8 -2
  118. package/out/zero-protocol/src/poke.js.map +1 -1
  119. package/out/zero-schema/src/authorization.d.ts +12 -5
  120. package/out/zero-schema/src/authorization.d.ts.map +1 -1
  121. package/out/zero-schema/src/build-schema.d.ts +14 -0
  122. package/out/zero-schema/src/build-schema.d.ts.map +1 -0
  123. package/out/zero-schema/src/build-schema.js +55 -0
  124. package/out/zero-schema/src/build-schema.js.map +1 -0
  125. package/out/zero-schema/src/compiled-authorization.d.ts +213 -294
  126. package/out/zero-schema/src/compiled-authorization.d.ts.map +1 -1
  127. package/out/zero-schema/src/compiled-authorization.js +9 -4
  128. package/out/zero-schema/src/compiled-authorization.js.map +1 -1
  129. package/out/zero-schema/src/normalize-table-schema.d.ts +2 -11
  130. package/out/zero-schema/src/normalize-table-schema.d.ts.map +1 -1
  131. package/out/zero-schema/src/normalize-table-schema.js +108 -0
  132. package/out/zero-schema/src/normalize-table-schema.js.map +1 -0
  133. package/out/zero-schema/src/normalized-schema.js +31 -0
  134. package/out/zero-schema/src/normalized-schema.js.map +1 -0
  135. package/out/zero-schema/src/schema-config.d.ts +325 -0
  136. package/out/zero-schema/src/schema-config.d.ts.map +1 -0
  137. package/out/zero-schema/src/schema-config.js +41 -0
  138. package/out/zero-schema/src/schema-config.js.map +1 -0
  139. package/out/zero-schema/src/schema.js +4 -0
  140. package/out/zero-schema/src/schema.js.map +1 -0
  141. package/out/zero-schema/src/table-schema.d.ts +6 -15
  142. package/out/zero-schema/src/table-schema.d.ts.map +1 -1
  143. package/out/zero-schema/src/table-schema.js.map +1 -1
  144. package/out/zero.js +2 -2
  145. package/out/zql/src/builder/builder.d.ts +2 -2
  146. package/out/zql/src/builder/builder.d.ts.map +1 -1
  147. package/out/zql/src/builder/builder.js +19 -20
  148. package/out/zql/src/builder/builder.js.map +1 -1
  149. package/out/zql/src/builder/filter.d.ts +25 -2
  150. package/out/zql/src/builder/filter.d.ts.map +1 -1
  151. package/out/zql/src/builder/filter.js +91 -1
  152. package/out/zql/src/builder/filter.js.map +1 -1
  153. package/out/zql/src/ivm/array-view.js +70 -0
  154. package/out/zql/src/ivm/array-view.js.map +1 -0
  155. package/out/zql/src/ivm/change.d.ts +18 -6
  156. package/out/zql/src/ivm/change.d.ts.map +1 -1
  157. package/out/zql/src/ivm/change.js +1 -1
  158. package/out/zql/src/ivm/change.js.map +1 -1
  159. package/out/zql/src/ivm/constraint.d.ts +14 -0
  160. package/out/zql/src/ivm/constraint.d.ts.map +1 -0
  161. package/out/zql/src/ivm/constraint.js +60 -0
  162. package/out/zql/src/ivm/constraint.js.map +1 -0
  163. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  164. package/out/zql/src/ivm/exists.js +19 -2
  165. package/out/zql/src/ivm/exists.js.map +1 -1
  166. package/out/zql/src/ivm/join.d.ts +11 -5
  167. package/out/zql/src/ivm/join.d.ts.map +1 -1
  168. package/out/zql/src/ivm/join.js +49 -95
  169. package/out/zql/src/ivm/join.js.map +1 -1
  170. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  171. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +4 -13
  172. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  173. package/out/zql/src/ivm/memory-source.d.ts +5 -22
  174. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  175. package/out/zql/src/ivm/memory-source.js +58 -80
  176. package/out/zql/src/ivm/memory-source.js.map +1 -1
  177. package/out/zql/src/ivm/operator.d.ts +7 -10
  178. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  179. package/out/zql/src/ivm/operator.js +1 -1
  180. package/out/zql/src/ivm/operator.js.map +1 -1
  181. package/out/zql/src/ivm/take.d.ts +3 -1
  182. package/out/zql/src/ivm/take.d.ts.map +1 -1
  183. package/out/zql/src/ivm/take.js +95 -95
  184. package/out/zql/src/ivm/take.js.map +1 -1
  185. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  186. package/out/zql/src/ivm/view-apply-change.js +168 -0
  187. package/out/zql/src/ivm/view-apply-change.js.map +1 -0
  188. package/out/zql/src/ivm/view.js +2 -0
  189. package/out/zql/src/ivm/view.js.map +1 -0
  190. package/out/zql/src/query/auth-query.d.ts +3 -1
  191. package/out/zql/src/query/auth-query.d.ts.map +1 -1
  192. package/out/zql/src/query/auth-query.js +34 -0
  193. package/out/zql/src/query/auth-query.js.map +1 -0
  194. package/out/zql/src/query/dnf.js +57 -0
  195. package/out/zql/src/query/dnf.js.map +1 -0
  196. package/out/zql/src/query/expression.js +155 -0
  197. package/out/zql/src/query/expression.js.map +1 -0
  198. package/out/zql/src/query/query-impl.d.ts +4 -1
  199. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  200. package/out/zql/src/query/query-impl.js +359 -0
  201. package/out/zql/src/query/query-impl.js.map +1 -0
  202. package/out/zql/src/query/query-internal.js +2 -0
  203. package/out/zql/src/query/query-internal.js.map +1 -0
  204. package/out/zql/src/query/query.js +3 -0
  205. package/out/zql/src/query/query.js.map +1 -0
  206. package/out/zql/src/query/typed-view.js +2 -0
  207. package/out/zql/src/query/typed-view.js.map +1 -0
  208. package/out/zqlite/src/table-source.d.ts +2 -11
  209. package/out/zqlite/src/table-source.d.ts.map +1 -1
  210. package/out/zqlite/src/table-source.js +28 -80
  211. package/out/zqlite/src/table-source.js.map +1 -1
  212. package/package.json +5 -3
  213. package/out/chunk-5UY46OAF.js.map +0 -7
  214. package/out/zero-cache/src/auth/load-authorization.d.ts +0 -4
  215. package/out/zero-cache/src/auth/load-authorization.d.ts.map +0 -1
  216. package/out/zero-cache/src/auth/load-authorization.js +0 -20
  217. package/out/zero-cache/src/auth/load-authorization.js.map +0 -1
  218. package/out/zero-cache/src/config/config.d.ts.map +0 -1
  219. package/out/zero-cache/src/config/config.js.map +0 -1
  220. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts +0 -21
  221. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +0 -1
  222. package/out/zero-cache/src/services/mutagen/write-authorizer.js +0 -168
  223. package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +0 -1
@@ -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-MPEWBBGZ.js";
3
+ } from "./chunk-HDEKBM3G.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 AuthorizationConfig } from '../../../zero-schema/src/compiled-authorization.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
+ authorization: AuthorizationConfig;
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,mBAAmB,EACzB,MAAM,oDAAoD,CAAC;AAC5D,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,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC,CAiBD"}
@@ -0,0 +1,34 @@
1
+ import path from 'node:path';
2
+ import { authorizationConfigSchema, } from '../../../zero-schema/src/compiled-authorization.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
+ let loadedSchema;
7
+ function parseAuthConfig(input, source) {
8
+ try {
9
+ const config = JSON.parse(input);
10
+ const authorization = v.parse(config.authorization, authorizationConfigSchema);
11
+ const normalizedSchema = normalizeSchema(config.schema);
12
+ return {
13
+ authorization,
14
+ schema: normalizedSchema,
15
+ };
16
+ }
17
+ catch (e) {
18
+ throw new Error(`Failed to parse schema config from ${source}: ${e}`);
19
+ }
20
+ }
21
+ export function getSchema(config) {
22
+ if (loadedSchema) {
23
+ return loadedSchema;
24
+ }
25
+ loadedSchema = (async () => {
26
+ if (config.schema.json) {
27
+ return parseAuthConfig(config.schema.json, 'config.schema.json');
28
+ }
29
+ const fileContent = await readFile(path.resolve(config.schema.file), 'utf-8');
30
+ return parseAuthConfig(fileContent, config.schema.file);
31
+ })();
32
+ return loadedSchema;
33
+ }
34
+ //# 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,yBAAyB,GAE1B,MAAM,oDAAoD,CAAC;AAE5D,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAC,MAAM,+CAA+C,CAAC;AAE9E,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,aAAa,GAAG,CAAC,CAAC,KAAK,CAC3B,MAAM,CAAC,aAAa,EACpB,yBAAyB,CAC1B,CAAC;QACF,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO;YACL,aAAa;YACb,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,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 { AuthorizationConfig } from '../../../zero-schema/src/compiled-authorization.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, authorization: AuthorizationConfig | 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,mBAAmB,EAEpB,MAAM,oDAAoD,CAAC;AAE5D,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,aAAa,EAAE,mBAAmB,GAAG,SAAS,EAC9C,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"}
@@ -0,0 +1,320 @@
1
+ import { LogContext } from '@rocicorp/logger';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { pid } from 'node:process';
5
+ import { assert } from '../../../shared/src/asserts.js';
6
+ import { randInt } from '../../../shared/src/rand.js';
7
+ import * as v from '../../../shared/src/valita.js';
8
+ import { primaryKeyValueSchema, } from '../../../zero-protocol/src/primary-key.js';
9
+ import { bindStaticParameters, buildPipeline, } from '../../../zql/src/builder/builder.js';
10
+ import { Database } from '../../../zqlite/src/db.js';
11
+ import { compile, sql } from '../../../zqlite/src/internal/sql.js';
12
+ import { TableSource } from '../../../zqlite/src/table-source.js';
13
+ import { listTables } from '../db/lite-tables.js';
14
+ import { mapLiteDataTypeToZqlSchemaValue } from '../types/lite.js';
15
+ import { DatabaseStorage } from '../services/view-syncer/database-storage.js';
16
+ import { normalize } from '../services/view-syncer/pipeline-driver.js';
17
+ import { StatementRunner } from '../db/statements.js';
18
+ import { AuthQuery, authQuery } from '../../../zql/src/query/auth-query.js';
19
+ import { must } from '../../../shared/src/must.js';
20
+ import { dnf } from '../../../zql/src/query/dnf.js';
21
+ export class WriteAuthorizerImpl {
22
+ #schema;
23
+ #authorizationConfig;
24
+ #replica;
25
+ #builderDelegate;
26
+ #tableSpecs;
27
+ #tables = new Map();
28
+ #statementRunner;
29
+ #lc;
30
+ constructor(lc, config, schema, authorization, replica, cgID) {
31
+ this.#lc = lc.withContext('class', 'WriteAuthorizerImpl');
32
+ this.#schema = schema;
33
+ this.#authorizationConfig = authorization ?? {};
34
+ this.#replica = replica;
35
+ const tmpDir = config.storageDBTmpDir ?? tmpdir();
36
+ const writeAuthzStorage = DatabaseStorage.create(lc, path.join(tmpDir, `mutagen-${pid}-${randInt(1000000, 9999999)}`));
37
+ const cgStorage = writeAuthzStorage.createClientGroupStorage(cgID);
38
+ this.#builderDelegate = {
39
+ getSource: name => this.#getSource(name),
40
+ createStorage: () => cgStorage.createStorage(),
41
+ };
42
+ this.#tableSpecs = new Map(listTables(replica).map(spec => [spec.name, normalize(spec)]));
43
+ this.#statementRunner = new StatementRunner(replica);
44
+ }
45
+ canPreMutation(authData, ops) {
46
+ for (const op of ops) {
47
+ switch (op.op) {
48
+ case 'insert':
49
+ // insert does not run pre-mutation checks
50
+ break;
51
+ case 'update':
52
+ if (!this.#canUpdate('preMutation', authData, op)) {
53
+ return false;
54
+ }
55
+ break;
56
+ case 'delete':
57
+ if (!this.#canDelete('preMutation', authData, op)) {
58
+ return false;
59
+ }
60
+ break;
61
+ }
62
+ }
63
+ return true;
64
+ }
65
+ canPostMutation(authData, ops) {
66
+ this.#statementRunner.beginConcurrent();
67
+ try {
68
+ for (const op of ops) {
69
+ const source = this.#getSource(op.tableName);
70
+ switch (op.op) {
71
+ case 'insert': {
72
+ source.push({
73
+ type: 'add',
74
+ row: op.value,
75
+ });
76
+ break;
77
+ }
78
+ // TODO (mlaw): what if someone updates the same thing twice?
79
+ case 'update': {
80
+ source.push({
81
+ type: 'edit',
82
+ oldRow: this.#getPreMutationRow(op),
83
+ row: op.value,
84
+ });
85
+ break;
86
+ }
87
+ case 'delete': {
88
+ source.push({
89
+ type: 'remove',
90
+ row: this.#getPreMutationRow(op),
91
+ });
92
+ break;
93
+ }
94
+ }
95
+ }
96
+ for (const op of ops) {
97
+ switch (op.op) {
98
+ case 'insert':
99
+ if (!this.#canInsert('postMutation', authData, op)) {
100
+ return false;
101
+ }
102
+ break;
103
+ case 'update':
104
+ if (!this.#canUpdate('postMutation', authData, op)) {
105
+ return false;
106
+ }
107
+ break;
108
+ case 'delete':
109
+ // delete does not run post-mutation checks.
110
+ break;
111
+ }
112
+ }
113
+ }
114
+ finally {
115
+ this.#statementRunner.rollback();
116
+ }
117
+ return true;
118
+ }
119
+ normalizeOps(ops) {
120
+ return ops.map(op => {
121
+ if (op.op === 'upsert') {
122
+ const preMutationRow = this.#getPreMutationRow(op);
123
+ if (preMutationRow) {
124
+ return {
125
+ op: 'update',
126
+ tableName: op.tableName,
127
+ primaryKey: op.primaryKey,
128
+ value: op.value,
129
+ };
130
+ }
131
+ return {
132
+ op: 'insert',
133
+ tableName: op.tableName,
134
+ primaryKey: op.primaryKey,
135
+ value: op.value,
136
+ };
137
+ }
138
+ return op;
139
+ });
140
+ }
141
+ #canInsert(phase, authData, op) {
142
+ return this.#timedCanDo(phase, 'insert', authData, op);
143
+ }
144
+ #canUpdate(phase, authData, op) {
145
+ return this.#timedCanDo(phase, 'update', authData, op);
146
+ }
147
+ #canDelete(phase, authData, op) {
148
+ return this.#timedCanDo(phase, 'delete', authData, op);
149
+ }
150
+ #getSource(tableName) {
151
+ let source = this.#tables.get(tableName);
152
+ if (source) {
153
+ return source;
154
+ }
155
+ const tableSpec = this.#tableSpecs.get(tableName);
156
+ if (!tableSpec) {
157
+ throw new Error(`Table ${tableName} not found`);
158
+ }
159
+ const { columns, primaryKey } = tableSpec;
160
+ assert(primaryKey.length);
161
+ source = new TableSource(this.#replica, tableName, Object.fromEntries(Object.entries(columns).map(([name, { dataType }]) => [
162
+ name,
163
+ mapLiteDataTypeToZqlSchemaValue(dataType),
164
+ ])), [primaryKey[0], ...primaryKey.slice(1)]);
165
+ this.#tables.set(tableName, source);
166
+ return source;
167
+ }
168
+ #timedCanDo(phase, action, authData, op) {
169
+ const start = performance.now();
170
+ try {
171
+ const ret = this.#canDo(phase, action, authData, op);
172
+ return ret;
173
+ }
174
+ finally {
175
+ this.#lc.info?.('action:', action, 'duration:', performance.now() - start, 'tableName:', op.tableName, 'primaryKey:', op.primaryKey);
176
+ }
177
+ }
178
+ /**
179
+ * Evaluation order is from static to dynamic, broad to specific.
180
+ * table -> column -> row -> cell.
181
+ *
182
+ * If any step fails, the entire operation is denied.
183
+ *
184
+ * That is, table rules supersede column rules, which supersede row rules,
185
+ *
186
+ * All steps must allow for the operation to be allowed.
187
+ */
188
+ #canDo(phase, action, authData, op) {
189
+ const rules = this.#authorizationConfig[op.tableName];
190
+ if (rules?.row === undefined && rules?.cell === undefined) {
191
+ return true;
192
+ }
193
+ const rowPolicies = rules.row;
194
+ let rowQuery = authQuery(must(this.#schema.tables[op.tableName], 'No schema found for table ' + op.tableName));
195
+ op.primaryKey.forEach(pk => {
196
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
197
+ rowQuery = rowQuery.where(pk, '=', op.value[pk]);
198
+ });
199
+ let applicableRowPolicy;
200
+ switch (action) {
201
+ case 'insert':
202
+ if (rowPolicies && rowPolicies.insert && phase === 'postMutation') {
203
+ applicableRowPolicy = rowPolicies.insert;
204
+ }
205
+ break;
206
+ case 'update':
207
+ if (rowPolicies && rowPolicies.update) {
208
+ if (phase === 'preMutation') {
209
+ applicableRowPolicy = rowPolicies.update.preMutation;
210
+ }
211
+ else if (phase === 'postMutation') {
212
+ applicableRowPolicy = rowPolicies.update.postProposedMutation;
213
+ }
214
+ }
215
+ break;
216
+ case 'delete':
217
+ if (rowPolicies && rowPolicies.delete && phase === 'preMutation') {
218
+ applicableRowPolicy = rowPolicies.delete;
219
+ }
220
+ break;
221
+ }
222
+ const cellPolicies = rules.cell;
223
+ const applicableCellPolicies = [];
224
+ if (cellPolicies) {
225
+ for (const [column, policy] of Object.entries(cellPolicies)) {
226
+ if (action === 'update' && op.value[column] === undefined) {
227
+ // If the cell is not being updated, we do not need to check
228
+ // the cell rules.
229
+ continue;
230
+ }
231
+ switch (action) {
232
+ case 'insert':
233
+ if (policy.insert && phase === 'postMutation') {
234
+ applicableCellPolicies.push(policy.insert);
235
+ }
236
+ break;
237
+ case 'update':
238
+ if (phase === 'preMutation' && policy.update?.preMutation) {
239
+ applicableCellPolicies.push(policy.update.preMutation);
240
+ }
241
+ if (phase === 'postMutation' &&
242
+ policy.update?.postProposedMutation) {
243
+ applicableCellPolicies.push(policy.update.postProposedMutation);
244
+ }
245
+ break;
246
+ case 'delete':
247
+ if (policy.delete && phase === 'preMutation') {
248
+ applicableCellPolicies.push(policy.delete);
249
+ }
250
+ break;
251
+ }
252
+ }
253
+ }
254
+ if (!this.#passesPolicyGroup(applicableRowPolicy, applicableCellPolicies, authData, rowQuery)) {
255
+ return false;
256
+ }
257
+ return true;
258
+ }
259
+ #getPreMutationRow(op) {
260
+ const { value } = op;
261
+ const conditions = [];
262
+ const values = [];
263
+ for (const pk of op.primaryKey) {
264
+ conditions.push(sql `${sql.ident(pk)}=?`);
265
+ values.push(v.parse(value[pk], primaryKeyValueSchema));
266
+ }
267
+ return this.#statementRunner.get(compile(sql `SELECT * FROM ${sql.ident(op.tableName)} WHERE ${sql.join(conditions, sql ` AND `)}`), ...values);
268
+ }
269
+ #passesPolicyGroup(applicableRowPolicy, applicableCellPolicies, authData, rowQuery) {
270
+ if (applicableRowPolicy === undefined &&
271
+ applicableCellPolicies.length === 0) {
272
+ return true;
273
+ }
274
+ if (applicableRowPolicy &&
275
+ !this.#passesPolicy(applicableRowPolicy, authData, rowQuery)) {
276
+ return false;
277
+ }
278
+ for (const policy of applicableCellPolicies) {
279
+ if (!this.#passesPolicy(policy, authData, rowQuery)) {
280
+ return false;
281
+ }
282
+ }
283
+ return true;
284
+ }
285
+ #passesPolicy(policy, authData, rowQuery) {
286
+ let rowQueryAst = rowQuery.ast;
287
+ rowQueryAst = bindStaticParameters({
288
+ ...rowQueryAst,
289
+ where: updateWhere(rowQueryAst.where, policy),
290
+ }, {
291
+ authData: authData,
292
+ preMutationRow: undefined,
293
+ });
294
+ const input = buildPipeline(rowQueryAst, this.#builderDelegate);
295
+ try {
296
+ const res = input.fetch({});
297
+ for (const _ of res) {
298
+ // if any row is returned at all, the
299
+ // rule passes.
300
+ return true;
301
+ }
302
+ }
303
+ finally {
304
+ input.destroy();
305
+ }
306
+ // no rows returned by any rules? The policy fails.
307
+ return false;
308
+ }
309
+ }
310
+ function updateWhere(where, policy) {
311
+ assert(where, 'A where condition must exist for RowQuery');
312
+ return dnf({
313
+ type: 'and',
314
+ conditions: [
315
+ where,
316
+ { type: 'or', conditions: policy.map(([, rule]) => rule) },
317
+ ],
318
+ });
319
+ }
320
+ //# sourceMappingURL=write-authorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-authorizer.js","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/write-authorizer.ts"],"names":[],"mappings":"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"}