@rocicorp/zero 0.23.2025081901 → 0.23.2025082500
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.
- package/out/{chunk-RPVWLROJ.js → chunk-3I7CRZJP.js} +19 -9
- package/out/{chunk-RPVWLROJ.js.map → chunk-3I7CRZJP.js.map} +3 -3
- package/out/{chunk-ZOMIZNT3.js → chunk-NQQYHD2U.js} +42 -51
- package/out/{chunk-ZOMIZNT3.js.map → chunk-NQQYHD2U.js.map} +2 -2
- package/out/{chunk-DYTMKRKN.js → chunk-XAUWMRGH.js} +55 -36
- package/out/chunk-XAUWMRGH.js.map +7 -0
- package/out/{inspector-NC47TWFX.js → inspector-UIWB2MYC.js} +33 -45
- package/out/inspector-UIWB2MYC.js.map +7 -0
- package/out/react.js +5 -4
- package/out/react.js.map +2 -2
- package/out/shared/src/logging.d.ts.map +1 -1
- package/out/shared/src/logging.js +1 -2
- package/out/shared/src/logging.js.map +1 -1
- package/out/shared/src/types.js +2 -0
- package/out/shared/src/types.js.map +1 -0
- package/out/solid.js +3 -3
- package/out/zero/package.json +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +1 -1
- package/out/zero-cache/src/config/zero-config.js +2 -2
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.js +1 -1
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
- package/out/zero-cache/src/db/specs.d.ts +11 -11
- package/out/zero-cache/src/server/anonymous-otel-start.d.ts +1 -0
- package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +1 -1
- package/out/zero-cache/src/server/anonymous-otel-start.js +13 -0
- package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
- package/out/zero-cache/src/server/{inspect-metrics-delegate.d.ts → inspector-delegate.d.ts} +6 -4
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -0
- package/out/zero-cache/src/server/{inspect-metrics-delegate.js → inspector-delegate.js} +18 -6
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -0
- package/out/zero-cache/src/server/syncer.js +2 -2
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +20 -20
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +8 -8
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +4 -4
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +4 -3
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js +11 -2
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +16 -16
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +24 -24
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +8 -8
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +12 -8
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +2 -2
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +5 -5
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +7 -7
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +3 -3
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +36 -22
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts +1 -1
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +14 -2
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +2 -1
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.d.ts +4 -2
- package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/types.d.ts +2 -3
- package/out/zero-client/src/client/inspector/types.d.ts.map +1 -1
- package/out/zero-client/src/client/options.d.ts +14 -0
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts +4 -3
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +6 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.d.ts +1 -1
- package/out/zero-protocol/src/connect.js +1 -1
- package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
- package/out/zero-protocol/src/inspect-down.js +2 -1
- package/out/zero-protocol/src/inspect-down.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.d.ts +2 -2
- package/out/zero-server/src/process-mutations.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.js +1 -1
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/push-processor.js +3 -3
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/queries/process-queries.d.ts +2 -1
- package/out/zero-server/src/queries/process-queries.d.ts.map +1 -1
- package/out/zero-server/src/queries/process-queries.js +1 -1
- package/out/zero-server/src/queries/process-queries.js.map +1 -1
- package/out/zero.js +3 -5
- package/out/zql/src/builder/builder.d.ts +1 -1
- package/out/zql/src/builder/builder.js +1 -1
- package/out/zql/src/query/named.d.ts +13 -35
- package/out/zql/src/query/named.d.ts.map +1 -1
- package/out/zql/src/query/named.js +40 -50
- package/out/zql/src/query/named.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +1 -1
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +2 -2
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +5 -5
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query.d.ts +5 -1
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/query.js +1 -0
- package/out/zql/src/query/query.js.map +1 -1
- package/package.json +1 -1
- package/out/chunk-DYTMKRKN.js.map +0 -7
- package/out/inspector-NC47TWFX.js.map +0 -7
- package/out/zero-cache/src/server/inspect-metrics-delegate.d.ts.map +0 -1
- package/out/zero-cache/src/server/inspect-metrics-delegate.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
clientToServer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XAUWMRGH.js";
|
|
4
4
|
import {
|
|
5
5
|
AbstractQuery,
|
|
6
6
|
ExpressionBuilder,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
newQuerySymbol,
|
|
11
11
|
staticParam,
|
|
12
12
|
toStaticParam
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-3I7CRZJP.js";
|
|
14
14
|
import {
|
|
15
15
|
assert
|
|
16
16
|
} from "./chunk-SGW2EIVJ.js";
|
|
@@ -267,61 +267,53 @@ function escapeLike(val) {
|
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
// ../zql/src/query/named.ts
|
|
270
|
-
function
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
if (maybeQueryFn === void 0) {
|
|
277
|
-
fn = validatorOrQueryFn;
|
|
278
|
-
} else {
|
|
279
|
-
fn = maybeQueryFn;
|
|
280
|
-
validator = validatorOrQueryFn;
|
|
270
|
+
function normalizeParser(parser) {
|
|
271
|
+
if (parser) {
|
|
272
|
+
if ("parse" in parser) {
|
|
273
|
+
return parser.parse.bind(parser);
|
|
274
|
+
}
|
|
275
|
+
return parser;
|
|
281
276
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
277
|
+
return void 0;
|
|
278
|
+
}
|
|
279
|
+
function syncedQuery(name, parser, fn) {
|
|
280
|
+
const impl = syncedQueryImpl(name, fn, false);
|
|
281
|
+
const ret = (...args) => impl(void 0, args);
|
|
285
282
|
ret.queryName = name;
|
|
283
|
+
ret.parse = normalizeParser(parser);
|
|
284
|
+
ret.takesContext = false;
|
|
286
285
|
return ret;
|
|
287
286
|
}
|
|
288
|
-
function syncedQueryWithContext(name,
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if (query === void 0) {
|
|
292
|
-
fn = queryOrValidator;
|
|
293
|
-
} else {
|
|
294
|
-
fn = query;
|
|
295
|
-
validator = queryOrValidator;
|
|
296
|
-
}
|
|
297
|
-
return contextualizedSyncedQuery(name, validator, fn);
|
|
298
|
-
}
|
|
299
|
-
function contextualizedSyncedQuery(name, validator, fn) {
|
|
300
|
-
const ret = (context, ...args) => fn(context, ...args).nameAndArgs(name, args);
|
|
301
|
-
ret.takesContext = true;
|
|
302
|
-
if (validator) {
|
|
303
|
-
ret.validator = validator;
|
|
304
|
-
}
|
|
287
|
+
function syncedQueryWithContext(name, parser, fn) {
|
|
288
|
+
const impl = syncedQueryImpl(name, fn, true);
|
|
289
|
+
const ret = (context, ...args) => impl(context, args);
|
|
305
290
|
ret.queryName = name;
|
|
291
|
+
ret.parse = normalizeParser(parser);
|
|
292
|
+
ret.takesContext = true;
|
|
306
293
|
return ret;
|
|
307
294
|
}
|
|
308
|
-
function
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
contextualized.takesContext = true;
|
|
314
|
-
return contextualized;
|
|
295
|
+
function syncedQueryImpl(name, fn, takesContext) {
|
|
296
|
+
return (context, args) => {
|
|
297
|
+
const q = takesContext ? fn(context, ...args) : fn(...args);
|
|
298
|
+
return q.nameAndArgs(name, args);
|
|
299
|
+
};
|
|
315
300
|
}
|
|
316
301
|
function withValidation(fn) {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
if (takesContext) {
|
|
320
|
-
return (context, ...args) => fn(context, ...validator(...args));
|
|
321
|
-
}
|
|
322
|
-
return (...args) => fn(...validator(...args));
|
|
302
|
+
if (!fn.parse) {
|
|
303
|
+
throw new Error("ret does not have a parse function defined");
|
|
323
304
|
}
|
|
324
|
-
|
|
305
|
+
const ret = (context, ...args) => {
|
|
306
|
+
const f = fn;
|
|
307
|
+
const parsed = f.parse(args);
|
|
308
|
+
return f.takesContext ? f(context, ...parsed) : f(...parsed);
|
|
309
|
+
};
|
|
310
|
+
ret.queryName = fn.queryName;
|
|
311
|
+
ret.parse = fn.parse;
|
|
312
|
+
ret.takesContext = true;
|
|
313
|
+
return ret;
|
|
314
|
+
}
|
|
315
|
+
function createBuilder(s) {
|
|
316
|
+
return makeQueryBuilders(s);
|
|
325
317
|
}
|
|
326
318
|
function makeQueryBuilders(schema) {
|
|
327
319
|
return new Proxy(
|
|
@@ -349,10 +341,9 @@ export {
|
|
|
349
341
|
NOBODY_CAN,
|
|
350
342
|
definePermissions,
|
|
351
343
|
escapeLike,
|
|
352
|
-
createBuilder,
|
|
353
344
|
syncedQuery,
|
|
354
345
|
syncedQueryWithContext,
|
|
355
|
-
|
|
356
|
-
|
|
346
|
+
withValidation,
|
|
347
|
+
createBuilder
|
|
357
348
|
};
|
|
358
|
-
//# sourceMappingURL=chunk-
|
|
349
|
+
//# sourceMappingURL=chunk-NQQYHD2U.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../zero-schema/src/builder/relationship-builder.ts", "../../zql/src/query/static-query.ts", "../../zero-schema/src/permissions.ts", "../../zql/src/query/escape-like.ts", "../../zql/src/query/named.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {Relationship, TableSchema} from '../table-schema.ts';\nimport type {TableBuilderWithColumns} from './table-builder.ts';\n\ntype ConnectArg<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TableBuilderWithColumns<TDest>;\n};\n\ntype ManyConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'many';\n};\n\ntype OneConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'one';\n};\n\ntype Prev = [-1, 0, 1, 2, 3, 4, 5, 6];\n\nexport type PreviousSchema<\n TSource extends TableSchema,\n K extends number,\n TDests extends TableSchema[],\n> = K extends 0 ? TSource : TDests[Prev[K]];\n\nexport type Relationships = {\n name: string; // table name\n relationships: Record<string, Relationship>; // relationships for that table\n};\n\nexport function relationships<\n TSource extends TableSchema,\n TRelationships extends Record<string, Relationship>,\n>(\n table: TableBuilderWithColumns<TSource>,\n cb: (connects: {\n many: <\n TDests extends TableSchema[],\n TSourceFields extends {\n [K in keyof TDests]: (keyof PreviousSchema<\n TSource,\n K & number,\n TDests\n >['columns'] &\n string)[];\n },\n TDestFields extends {\n [K in keyof TDests]: (keyof TDests[K]['columns'] & string)[];\n },\n >(\n ...args: {\n [K in keyof TDests]: ConnectArg<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n }\n ) => {\n [K in keyof TDests]: ManyConnection<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n };\n one: <\n TDests extends TableSchema[],\n TSourceFields extends {\n [K in keyof TDests]: (keyof PreviousSchema<\n TSource,\n K & number,\n TDests\n >['columns'] &\n string)[];\n },\n TDestFields extends {\n [K in keyof TDests]: (keyof TDests[K]['columns'] & string)[];\n },\n >(\n ...args: {\n [K in keyof TDests]: ConnectArg<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n }\n ) => {\n [K in keyof TDests]: OneConnection<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n };\n }) => TRelationships,\n): {name: TSource['name']; relationships: TRelationships} {\n const relationships = cb({many, one} as any);\n\n return {\n name: table.schema.name,\n relationships,\n };\n}\n\nfunction many(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): ManyConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'many',\n }));\n}\n\nfunction one(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): OneConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'one',\n }));\n}\n", "import type {AST, System} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../../zero-schema/src/builder/schema-builder.ts';\nimport type {Format} from '../ivm/view.ts';\nimport {ExpressionBuilder} from './expression.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {QueryDelegate} from './query-delegate.ts';\nimport {AbstractQuery, defaultFormat, newQuerySymbol} from './query-impl.ts';\nimport type {HumanReadable, PullRow, Query} from './query.ts';\nimport type {TypedView} from './typed-view.ts';\n\nexport function staticQuery<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(schema: TSchema, tableName: TTable): Query<TSchema, TTable> {\n return new StaticQuery<TSchema, TTable>(\n schema,\n tableName,\n {table: tableName},\n defaultFormat,\n );\n}\n\n/**\n * A query that cannot be run.\n * Only serves to generate ASTs.\n */\nexport class StaticQuery<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n TReturn = PullRow<TTable, TSchema>,\n> extends AbstractQuery<TSchema, TTable, TReturn> {\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System = 'permissions',\n customQueryID?: CustomQueryID | undefined,\n currentJunction?: string | undefined,\n ) {\n super(\n undefined,\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n );\n }\n\n expressionBuilder() {\n return new ExpressionBuilder(this._exists);\n }\n\n protected [newQuerySymbol]<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n >(\n _delegate: QueryDelegate | undefined,\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n ): StaticQuery<TSchema, TTable, TReturn> {\n return new StaticQuery(\n schema,\n tableName,\n ast,\n format,\n 'permissions',\n customQueryID,\n currentJunction,\n );\n }\n\n get ast() {\n return this._completeAst();\n }\n\n materialize(): TypedView<HumanReadable<TReturn>> {\n throw new Error('StaticQuery cannot be materialized');\n }\n\n run(): Promise<HumanReadable<TReturn>> {\n return Promise.reject(new Error('StaticQuery cannot be run'));\n }\n\n preload(): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n throw new Error('StaticQuery cannot be preloaded');\n }\n}\n", "import {assert} from '../../shared/src/asserts.ts';\nimport {\n mapCondition,\n toStaticParam,\n type Condition,\n type Parameter,\n} from '../../zero-protocol/src/ast.ts';\nimport type {ExpressionBuilder} from '../../zql/src/query/expression.ts';\nimport {defaultFormat, staticParam} from '../../zql/src/query/query-impl.ts';\nimport type {Query} from '../../zql/src/query/query.ts';\nimport {StaticQuery} from '../../zql/src/query/static-query.ts';\nimport type {Schema} from './builder/schema-builder.ts';\nimport type {\n AssetPermissions as CompiledAssetPermissions,\n PermissionsConfig as CompiledPermissionsConfig,\n} from './compiled-permissions.ts';\nimport {clientToServer, NameMapper} from './name-mapper.ts';\n\nexport const ANYONE_CAN = [\n (_: unknown, eb: ExpressionBuilder<Schema, never>) => eb.and(),\n];\n\n/**\n * @deprecated Use {@link ANYONE_CAN} instead.\n */\nexport const ANYONE_CAN_DO_ANYTHING = {\n row: {\n select: ANYONE_CAN,\n insert: ANYONE_CAN,\n update: {\n preMutation: ANYONE_CAN,\n postMutation: ANYONE_CAN,\n },\n delete: ANYONE_CAN,\n },\n};\n\nexport const NOBODY_CAN = [];\n\nexport type Anchor = 'authData' | 'preMutationRow';\n\nexport type Queries<TSchema extends Schema> = {\n [K in keyof TSchema['tables']]: Query<Schema, K & string>;\n};\n\nexport type PermissionRule<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = (\n authData: TAuthDataShape,\n eb: ExpressionBuilder<TSchema, TTable>,\n) => Condition;\n\nexport type AssetPermissions<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = {\n // Why an array of rules?: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n select?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n insert?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n update?:\n | {\n preMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n postMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n }\n | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n delete?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n};\n\nexport type PermissionsConfig<TAuthDataShape, TSchema extends Schema> = {\n [K in keyof TSchema['tables']]?: {\n row?: AssetPermissions<TAuthDataShape, TSchema, K & string> | undefined;\n cell?:\n | {\n [C in keyof TSchema['tables'][K]['columns']]?: Omit<\n AssetPermissions<TAuthDataShape, TSchema, K & string>,\n 'cell'\n >;\n }\n | undefined;\n };\n};\n\nexport async function definePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n definer: () =>\n | Promise<PermissionsConfig<TAuthDataShape, TSchema>>\n | PermissionsConfig<TAuthDataShape, TSchema>,\n): Promise<CompiledPermissionsConfig | undefined> {\n const expressionBuilders = {} as Record<\n string,\n ExpressionBuilder<Schema, string>\n >;\n for (const name of Object.keys(schema.tables)) {\n expressionBuilders[name] = new StaticQuery(\n schema,\n name,\n {table: name},\n defaultFormat,\n ).expressionBuilder();\n }\n\n const config = await definer();\n return compilePermissions(schema, config, expressionBuilders);\n}\n\nfunction compilePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n authz: PermissionsConfig<TAuthDataShape, TSchema> | undefined,\n expressionBuilders: Record<string, ExpressionBuilder<Schema, string>>,\n): CompiledPermissionsConfig | undefined {\n if (!authz) {\n return undefined;\n }\n const nameMapper = clientToServer(schema.tables);\n const ret: CompiledPermissionsConfig = {tables: {}};\n for (const [tableName, tableConfig] of Object.entries(authz)) {\n const serverName = schema.tables[tableName].serverName ?? tableName;\n ret.tables[serverName] = {\n row: compileRowConfig(\n nameMapper,\n tableName,\n tableConfig.row,\n expressionBuilders[tableName],\n ),\n cell: compileCellConfig(\n nameMapper,\n tableName,\n tableConfig.cell,\n expressionBuilders[tableName],\n ),\n };\n }\n\n return ret;\n}\n\nfunction compileRowConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rowRules: AssetPermissions<TAuthDataShape, TSchema, TTable> | undefined,\n expressionBuilder: ExpressionBuilder<TSchema, TTable>,\n): CompiledAssetPermissions | undefined {\n if (!rowRules) {\n return undefined;\n }\n return {\n select: compileRules(\n clientToServer,\n tableName,\n rowRules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rowRules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rowRules.delete,\n expressionBuilder,\n ),\n };\n}\n\n/**\n * What is this \"allow\" and why are permissions policies an array of rules?\n *\n * Please read: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n */\nfunction compileRules<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rules: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined,\n expressionBuilder: ExpressionBuilder<TSchema, TTable>,\n): ['allow', Condition][] | undefined {\n if (!rules) {\n return undefined;\n }\n\n return rules.map(rule => {\n const cond = rule(authDataRef as TAuthDataShape, expressionBuilder);\n return ['allow', mapCondition(cond, tableName, clientToServer)] as const;\n });\n}\n\nfunction compileCellConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n cellRules:\n | Record<string, AssetPermissions<TAuthDataShape, TSchema, TTable>>\n | undefined,\n expressionBuilder: ExpressionBuilder<TSchema, TTable>,\n): Record<string, CompiledAssetPermissions> | undefined {\n if (!cellRules) {\n return undefined;\n }\n const ret: Record<string, CompiledAssetPermissions> = {};\n for (const [columnName, rules] of Object.entries(cellRules)) {\n ret[columnName] = {\n select: compileRules(\n clientToServer,\n tableName,\n rules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rules.delete,\n expressionBuilder,\n ),\n };\n }\n return ret;\n}\n\nclass CallTracker {\n readonly #anchor: Anchor;\n readonly #path: string[];\n constructor(anchor: Anchor, path: string[]) {\n this.#anchor = anchor;\n this.#path = path;\n }\n\n get(target: {[toStaticParam]: () => Parameter}, prop: string | symbol) {\n if (prop === toStaticParam) {\n return target[toStaticParam];\n }\n assert(typeof prop === 'string');\n const path = [...this.#path, prop];\n return new Proxy(\n {\n [toStaticParam]: () => staticParam(this.#anchor, path),\n },\n new CallTracker(this.#anchor, path),\n );\n }\n}\n\nfunction baseTracker(anchor: Anchor) {\n return new Proxy(\n {\n [toStaticParam]: () => {\n throw new Error('no JWT field specified');\n },\n },\n new CallTracker(anchor, []),\n );\n}\n\nexport const authDataRef = baseTracker('authData');\nexport const preMutationRowRef = baseTracker('preMutationRow');\n", "export function escapeLike(val: string) {\n return val.replace(/[%_]/g, '\\\\$&');\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {Schema} from '../../../zero-schema/src/builder/schema-builder.ts';\nimport type {SchemaQuery} from '../mutate/custom.ts';\nimport {newQuery} from './query-impl.ts';\nimport type {Query} from './query.ts';\n\nexport type NamedQuery<\n TArg extends\n ReadonlyArray<ReadonlyJSONValue> = ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any> = Query<any, any, any>,\n> = {\n (...args: TArg): TReturnQuery;\n};\n\nexport type NamedQueryWithContext<\n TContext,\n TArg extends\n ReadonlyArray<ReadonlyJSONValue> = ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any> = Query<any, any, any>,\n> = {\n (context: TContext, ...args: TArg): TReturnQuery;\n};\n\nexport type SyncedQuery<\n TArg extends\n ReadonlyArray<ReadonlyJSONValue> = ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any> = Query<any, any, any>,\n> = NamedQuery<TArg, TReturnQuery> & {\n queryName: string;\n takesContext: boolean;\n validator?: Validator<TArg> | undefined;\n};\n\nexport type SyncedQueryWithContext<\n TContext,\n TArg extends\n ReadonlyArray<ReadonlyJSONValue> = ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any> = Query<any, any, any>,\n> = NamedQueryWithContext<TContext, TArg, TReturnQuery> & {\n queryName: string;\n takesContext: true;\n validator?: Validator<TArg> | undefined;\n};\n\nexport type ValidatedSyncedQuery<TReturnQuery extends Query<any, any, any>> = (\n ...args: unknown[]\n) => TReturnQuery;\nexport type ValidatedSyncedQueryWithContext<\n TContext,\n TReturnQuery extends Query<any, any, any>,\n> = (context: TContext, ...args: unknown[]) => TReturnQuery;\n\nexport type CustomQueryID = {\n name: string;\n args: ReadonlyArray<ReadonlyJSONValue>;\n};\n\nexport type Validator<T extends ReadonlyArray<ReadonlyJSONValue>> = (\n ...args: readonly unknown[]\n) => T | readonly [...T];\n\n/**\n * Returns a set of query builders for the given schema.\n */\nexport function createBuilder<S extends Schema>(s: S): SchemaQuery<S> {\n return makeQueryBuilders(s) as SchemaQuery<S>;\n}\n\n/**\n * Tags a query with a name and arguments.\n * Named queries are run on both the client and server.\n * The server will receive the name and arguments for a named query and can\n * either run the same query the client did or a completely different one.\n *\n * The main use case here is to apply permissions to the requested query or\n * to expand the scope of the query to include additional data. E.g., for preloading.\n */\nexport function syncedQuery<\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n name: string,\n validator: Validator<TArg>,\n fn: NamedQuery<TArg, TReturnQuery>,\n): SyncedQuery<TArg, TReturnQuery> & {validator: Validator<TArg>};\nexport function syncedQuery<\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n name: string,\n fn: NamedQuery<TArg, TReturnQuery>,\n): SyncedQuery<TArg, TReturnQuery>;\nexport function syncedQuery<\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n name: string,\n validatorOrQueryFn: Validator<TArg> | NamedQuery<TArg, TReturnQuery>,\n maybeQueryFn?: NamedQuery<TArg, TReturnQuery> | undefined,\n): SyncedQuery<TArg, TReturnQuery> {\n let fn: NamedQuery<TArg, TReturnQuery>;\n let validator: Validator<TArg> | undefined;\n if (maybeQueryFn === undefined) {\n fn = validatorOrQueryFn as NamedQuery<TArg, TReturnQuery>;\n } else {\n fn = maybeQueryFn;\n validator = validatorOrQueryFn as Validator<TArg>;\n }\n const ret = ((...args: TArg) =>\n fn(...args).nameAndArgs(name, args)) as SyncedQuery<TArg, TReturnQuery>;\n ret.takesContext = false;\n ret.validator = validator;\n ret.queryName = name;\n return ret;\n}\n\nexport function syncedQueryWithContext<\n TContext,\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n name: string,\n validator: Validator<TArg>,\n fn: NamedQueryWithContext<TContext, TArg, TReturnQuery>,\n): SyncedQueryWithContext<TContext, TArg, TReturnQuery> & {\n validator: Validator<TArg>;\n};\nexport function syncedQueryWithContext<\n TContext,\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n name: string,\n fn: NamedQueryWithContext<TContext, TArg, TReturnQuery>,\n): SyncedQueryWithContext<TContext, TArg, TReturnQuery>;\nexport function syncedQueryWithContext<\n TContext,\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n name: string,\n queryOrValidator:\n | NamedQueryWithContext<TContext, TArg, TReturnQuery>\n | Validator<TArg>,\n query?: NamedQueryWithContext<TContext, TArg, TReturnQuery> | undefined,\n): SyncedQueryWithContext<TContext, TArg, TReturnQuery> {\n let fn: NamedQueryWithContext<TContext, TArg, TReturnQuery>;\n let validator: Validator<TArg> | undefined;\n if (query === undefined) {\n fn = queryOrValidator as NamedQueryWithContext<\n TContext,\n TArg,\n TReturnQuery\n >;\n } else {\n fn = query;\n validator = queryOrValidator as Validator<TArg>;\n }\n\n return contextualizedSyncedQuery(name, validator, fn);\n}\n\nfunction contextualizedSyncedQuery<\n TContext,\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n name: string,\n validator: Validator<TArg> | undefined,\n fn: NamedQueryWithContext<TContext, TArg, TReturnQuery>,\n): SyncedQueryWithContext<TContext, TArg, TReturnQuery> {\n const ret = ((context: TContext, ...args: TArg) =>\n fn(context, ...args).nameAndArgs(name, args)) as SyncedQueryWithContext<\n TContext,\n TArg,\n TReturnQuery\n >;\n\n ret.takesContext = true;\n if (validator) {\n ret.validator = validator;\n }\n ret.queryName = name;\n\n return ret;\n}\n\nexport function withContext<\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n TContext,\n>(\n fn: SyncedQueryWithContext<TContext, TArg, TReturnQuery>,\n): SyncedQueryWithContext<TContext, TArg, TReturnQuery>;\nexport function withContext<\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n>(\n fn: SyncedQuery<TArg, TReturnQuery>,\n): SyncedQueryWithContext<any, TArg, TReturnQuery>;\nexport function withContext<\n TArg extends ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery extends Query<any, any, any>,\n TContext,\n>(\n fn:\n | SyncedQuery<TArg, TReturnQuery>\n | SyncedQueryWithContext<TContext, TArg, TReturnQuery>,\n): SyncedQueryWithContext<TContext, TArg, TReturnQuery> {\n if (fn.takesContext) {\n return fn as SyncedQueryWithContext<TContext, TArg, TReturnQuery>;\n }\n\n const contextualized = ((_context: TContext, ...args: TArg) =>\n fn(...args).nameAndArgs(fn.queryName, args)) as SyncedQueryWithContext<\n TContext,\n TArg,\n TReturnQuery\n >;\n contextualized.takesContext = true;\n\n return contextualized;\n}\n\nexport function withValidation<TReturnQuery extends Query<any, any, any>>(\n fn: SyncedQuery<any, TReturnQuery>,\n): ValidatedSyncedQuery<TReturnQuery>;\nexport function withValidation<\n TReturnQuery extends Query<any, any, any>,\n TContext,\n>(\n fn: SyncedQueryWithContext<TContext, any, TReturnQuery>,\n): ValidatedSyncedQueryWithContext<TContext, TReturnQuery>;\nexport function withValidation<\n TReturnQuery extends Query<any, any, any>,\n TContext = unknown,\n>(\n fn:\n | SyncedQuery<ReadonlyArray<ReadonlyJSONValue>, TReturnQuery>\n | SyncedQueryWithContext<\n TContext,\n ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery\n >,\n):\n | ValidatedSyncedQuery<TReturnQuery>\n | ValidatedSyncedQueryWithContext<TContext, TReturnQuery> {\n const {validator, takesContext} = fn;\n if (validator) {\n if (takesContext) {\n return ((context, ...args) =>\n (\n fn as SyncedQueryWithContext<\n TContext,\n ReadonlyArray<ReadonlyJSONValue>,\n TReturnQuery\n >\n )(context, ...validator(...args))) as ValidatedSyncedQueryWithContext<\n TContext,\n TReturnQuery\n >;\n }\n return ((...args) =>\n fn(...validator(...args))) as ValidatedSyncedQuery<TReturnQuery>;\n }\n\n throw new Error(fn.name + ' does not have a validator defined');\n}\n\n/**\n * This produces the query builders for a given schema.\n * For use in Zero on the server to process custom queries.\n */\nfunction makeQueryBuilders<S extends Schema>(schema: S): SchemaQuery<S> {\n return new Proxy(\n {},\n {\n get: (\n target: Record<\n string,\n Omit<Query<S, string, any>, 'materialize' | 'preload'>\n >,\n prop: string,\n ) => {\n if (prop in target) {\n return target[prop];\n }\n\n if (!(prop in schema.tables)) {\n throw new Error(`Table ${prop} does not exist in schema`);\n }\n\n const q = newQuery(undefined, schema, prop);\n target[prop] = q;\n return q;\n },\n },\n ) as SchemaQuery<S>;\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {Relationship, TableSchema} from '../table-schema.ts';\nimport type {TableBuilderWithColumns} from './table-builder.ts';\n\ntype ConnectArg<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TableBuilderWithColumns<TDest>;\n};\n\ntype ManyConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'many';\n};\n\ntype OneConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'one';\n};\n\ntype Prev = [-1, 0, 1, 2, 3, 4, 5, 6];\n\nexport type PreviousSchema<\n TSource extends TableSchema,\n K extends number,\n TDests extends TableSchema[],\n> = K extends 0 ? TSource : TDests[Prev[K]];\n\nexport type Relationships = {\n name: string; // table name\n relationships: Record<string, Relationship>; // relationships for that table\n};\n\nexport function relationships<\n TSource extends TableSchema,\n TRelationships extends Record<string, Relationship>,\n>(\n table: TableBuilderWithColumns<TSource>,\n cb: (connects: {\n many: <\n TDests extends TableSchema[],\n TSourceFields extends {\n [K in keyof TDests]: (keyof PreviousSchema<\n TSource,\n K & number,\n TDests\n >['columns'] &\n string)[];\n },\n TDestFields extends {\n [K in keyof TDests]: (keyof TDests[K]['columns'] & string)[];\n },\n >(\n ...args: {\n [K in keyof TDests]: ConnectArg<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n }\n ) => {\n [K in keyof TDests]: ManyConnection<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n };\n one: <\n TDests extends TableSchema[],\n TSourceFields extends {\n [K in keyof TDests]: (keyof PreviousSchema<\n TSource,\n K & number,\n TDests\n >['columns'] &\n string)[];\n },\n TDestFields extends {\n [K in keyof TDests]: (keyof TDests[K]['columns'] & string)[];\n },\n >(\n ...args: {\n [K in keyof TDests]: ConnectArg<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n }\n ) => {\n [K in keyof TDests]: OneConnection<\n TSourceFields[K],\n TDestFields[K],\n TDests[K]\n >;\n };\n }) => TRelationships,\n): {name: TSource['name']; relationships: TRelationships} {\n const relationships = cb({many, one} as any);\n\n return {\n name: table.schema.name,\n relationships,\n };\n}\n\nfunction many(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): ManyConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'many',\n }));\n}\n\nfunction one(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): OneConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'one',\n }));\n}\n", "import type {AST, System} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../../zero-schema/src/builder/schema-builder.ts';\nimport type {Format} from '../ivm/view.ts';\nimport {ExpressionBuilder} from './expression.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {QueryDelegate} from './query-delegate.ts';\nimport {AbstractQuery, defaultFormat, newQuerySymbol} from './query-impl.ts';\nimport type {HumanReadable, PullRow, Query} from './query.ts';\nimport type {TypedView} from './typed-view.ts';\n\nexport function staticQuery<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(schema: TSchema, tableName: TTable): Query<TSchema, TTable> {\n return new StaticQuery<TSchema, TTable>(\n schema,\n tableName,\n {table: tableName},\n defaultFormat,\n );\n}\n\n/**\n * A query that cannot be run.\n * Only serves to generate ASTs.\n */\nexport class StaticQuery<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n TReturn = PullRow<TTable, TSchema>,\n> extends AbstractQuery<TSchema, TTable, TReturn> {\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System = 'permissions',\n customQueryID?: CustomQueryID | undefined,\n currentJunction?: string | undefined,\n ) {\n super(\n undefined,\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n );\n }\n\n expressionBuilder() {\n return new ExpressionBuilder(this._exists);\n }\n\n protected [newQuerySymbol]<\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n >(\n _delegate: QueryDelegate | undefined,\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n ): StaticQuery<TSchema, TTable, TReturn> {\n return new StaticQuery(\n schema,\n tableName,\n ast,\n format,\n 'permissions',\n customQueryID,\n currentJunction,\n );\n }\n\n get ast() {\n return this._completeAst();\n }\n\n materialize(): TypedView<HumanReadable<TReturn>> {\n throw new Error('StaticQuery cannot be materialized');\n }\n\n run(): Promise<HumanReadable<TReturn>> {\n return Promise.reject(new Error('StaticQuery cannot be run'));\n }\n\n preload(): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n throw new Error('StaticQuery cannot be preloaded');\n }\n}\n", "import {assert} from '../../shared/src/asserts.ts';\nimport {\n mapCondition,\n toStaticParam,\n type Condition,\n type Parameter,\n} from '../../zero-protocol/src/ast.ts';\nimport type {ExpressionBuilder} from '../../zql/src/query/expression.ts';\nimport {defaultFormat, staticParam} from '../../zql/src/query/query-impl.ts';\nimport type {Query} from '../../zql/src/query/query.ts';\nimport {StaticQuery} from '../../zql/src/query/static-query.ts';\nimport type {Schema} from './builder/schema-builder.ts';\nimport type {\n AssetPermissions as CompiledAssetPermissions,\n PermissionsConfig as CompiledPermissionsConfig,\n} from './compiled-permissions.ts';\nimport {clientToServer, NameMapper} from './name-mapper.ts';\n\nexport const ANYONE_CAN = [\n (_: unknown, eb: ExpressionBuilder<Schema, never>) => eb.and(),\n];\n\n/**\n * @deprecated Use {@link ANYONE_CAN} instead.\n */\nexport const ANYONE_CAN_DO_ANYTHING = {\n row: {\n select: ANYONE_CAN,\n insert: ANYONE_CAN,\n update: {\n preMutation: ANYONE_CAN,\n postMutation: ANYONE_CAN,\n },\n delete: ANYONE_CAN,\n },\n};\n\nexport const NOBODY_CAN = [];\n\nexport type Anchor = 'authData' | 'preMutationRow';\n\nexport type Queries<TSchema extends Schema> = {\n [K in keyof TSchema['tables']]: Query<Schema, K & string>;\n};\n\nexport type PermissionRule<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = (\n authData: TAuthDataShape,\n eb: ExpressionBuilder<TSchema, TTable>,\n) => Condition;\n\nexport type AssetPermissions<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = {\n // Why an array of rules?: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n select?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n insert?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n update?:\n | {\n preMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n postMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n }\n | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n delete?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n};\n\nexport type PermissionsConfig<TAuthDataShape, TSchema extends Schema> = {\n [K in keyof TSchema['tables']]?: {\n row?: AssetPermissions<TAuthDataShape, TSchema, K & string> | undefined;\n cell?:\n | {\n [C in keyof TSchema['tables'][K]['columns']]?: Omit<\n AssetPermissions<TAuthDataShape, TSchema, K & string>,\n 'cell'\n >;\n }\n | undefined;\n };\n};\n\nexport async function definePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n definer: () =>\n | Promise<PermissionsConfig<TAuthDataShape, TSchema>>\n | PermissionsConfig<TAuthDataShape, TSchema>,\n): Promise<CompiledPermissionsConfig | undefined> {\n const expressionBuilders = {} as Record<\n string,\n ExpressionBuilder<Schema, string>\n >;\n for (const name of Object.keys(schema.tables)) {\n expressionBuilders[name] = new StaticQuery(\n schema,\n name,\n {table: name},\n defaultFormat,\n ).expressionBuilder();\n }\n\n const config = await definer();\n return compilePermissions(schema, config, expressionBuilders);\n}\n\nfunction compilePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n authz: PermissionsConfig<TAuthDataShape, TSchema> | undefined,\n expressionBuilders: Record<string, ExpressionBuilder<Schema, string>>,\n): CompiledPermissionsConfig | undefined {\n if (!authz) {\n return undefined;\n }\n const nameMapper = clientToServer(schema.tables);\n const ret: CompiledPermissionsConfig = {tables: {}};\n for (const [tableName, tableConfig] of Object.entries(authz)) {\n const serverName = schema.tables[tableName].serverName ?? tableName;\n ret.tables[serverName] = {\n row: compileRowConfig(\n nameMapper,\n tableName,\n tableConfig.row,\n expressionBuilders[tableName],\n ),\n cell: compileCellConfig(\n nameMapper,\n tableName,\n tableConfig.cell,\n expressionBuilders[tableName],\n ),\n };\n }\n\n return ret;\n}\n\nfunction compileRowConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rowRules: AssetPermissions<TAuthDataShape, TSchema, TTable> | undefined,\n expressionBuilder: ExpressionBuilder<TSchema, TTable>,\n): CompiledAssetPermissions | undefined {\n if (!rowRules) {\n return undefined;\n }\n return {\n select: compileRules(\n clientToServer,\n tableName,\n rowRules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rowRules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rowRules.delete,\n expressionBuilder,\n ),\n };\n}\n\n/**\n * What is this \"allow\" and why are permissions policies an array of rules?\n *\n * Please read: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n */\nfunction compileRules<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rules: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined,\n expressionBuilder: ExpressionBuilder<TSchema, TTable>,\n): ['allow', Condition][] | undefined {\n if (!rules) {\n return undefined;\n }\n\n return rules.map(rule => {\n const cond = rule(authDataRef as TAuthDataShape, expressionBuilder);\n return ['allow', mapCondition(cond, tableName, clientToServer)] as const;\n });\n}\n\nfunction compileCellConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n cellRules:\n | Record<string, AssetPermissions<TAuthDataShape, TSchema, TTable>>\n | undefined,\n expressionBuilder: ExpressionBuilder<TSchema, TTable>,\n): Record<string, CompiledAssetPermissions> | undefined {\n if (!cellRules) {\n return undefined;\n }\n const ret: Record<string, CompiledAssetPermissions> = {};\n for (const [columnName, rules] of Object.entries(cellRules)) {\n ret[columnName] = {\n select: compileRules(\n clientToServer,\n tableName,\n rules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rules.delete,\n expressionBuilder,\n ),\n };\n }\n return ret;\n}\n\nclass CallTracker {\n readonly #anchor: Anchor;\n readonly #path: string[];\n constructor(anchor: Anchor, path: string[]) {\n this.#anchor = anchor;\n this.#path = path;\n }\n\n get(target: {[toStaticParam]: () => Parameter}, prop: string | symbol) {\n if (prop === toStaticParam) {\n return target[toStaticParam];\n }\n assert(typeof prop === 'string');\n const path = [...this.#path, prop];\n return new Proxy(\n {\n [toStaticParam]: () => staticParam(this.#anchor, path),\n },\n new CallTracker(this.#anchor, path),\n );\n }\n}\n\nfunction baseTracker(anchor: Anchor) {\n return new Proxy(\n {\n [toStaticParam]: () => {\n throw new Error('no JWT field specified');\n },\n },\n new CallTracker(anchor, []),\n );\n}\n\nexport const authDataRef = baseTracker('authData');\nexport const preMutationRowRef = baseTracker('preMutationRow');\n", "export function escapeLike(val: string) {\n return val.replace(/[%_]/g, '\\\\$&');\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {Schema} from '../../../zero-schema/src/builder/schema-builder.ts';\nimport type {SchemaQuery} from '../mutate/custom.ts';\nimport {newQuery} from './query-impl.ts';\nimport type {Query} from './query.ts';\n\nexport type QueryFn<\n TContext,\n TTakesContext extends boolean,\n TArg extends ReadonlyJSONValue[],\n TReturnQuery extends Query<any, any, any>,\n> = TTakesContext extends false\n ? {(...args: TArg): TReturnQuery}\n : {(context: TContext, ...args: TArg): TReturnQuery};\n\nexport type SyncedQuery<\n TName extends string,\n TContext,\n TTakesContext extends boolean,\n TArg extends ReadonlyJSONValue[],\n TReturnQuery extends Query<any, any, any>,\n> = QueryFn<TContext, TTakesContext, TArg, TReturnQuery> & {\n queryName: TName;\n parse: ParseFn<TArg> | undefined;\n takesContext: TTakesContext;\n};\n\nfunction normalizeParser<T extends ReadonlyJSONValue[]>(\n parser: ParseFn<T> | HasParseFn<T> | undefined,\n): ParseFn<T> | undefined {\n if (parser) {\n if ('parse' in parser) {\n return parser.parse.bind(parser);\n }\n return parser;\n }\n return undefined;\n}\n\nexport function syncedQuery<\n TName extends string,\n TArg extends ReadonlyJSONValue[],\n TReturnQuery extends Query<any, any, any>,\n>(\n name: TName,\n parser: ParseFn<TArg> | HasParseFn<TArg> | undefined,\n fn: QueryFn<unknown, false, TArg, TReturnQuery>,\n): SyncedQuery<TName, unknown, false, TArg, TReturnQuery> {\n const impl = syncedQueryImpl(name, fn, false);\n const ret: any = (...args: TArg) => impl(undefined, args);\n ret.queryName = name;\n ret.parse = normalizeParser(parser);\n ret.takesContext = false;\n return ret;\n}\n\nexport function syncedQueryWithContext<\n TName extends string,\n TContext,\n TArg extends ReadonlyJSONValue[],\n TReturnQuery extends Query<any, any, any>,\n>(\n name: TName,\n parser: ParseFn<TArg> | HasParseFn<TArg> | undefined,\n fn: QueryFn<TContext, true, TArg, TReturnQuery>,\n): SyncedQuery<TName, TContext, true, TArg, TReturnQuery> {\n const impl = syncedQueryImpl(name, fn, true);\n const ret: any = (context: TContext, ...args: TArg) => impl(context, args);\n ret.queryName = name;\n ret.parse = normalizeParser(parser);\n ret.takesContext = true;\n return ret;\n}\n\nfunction syncedQueryImpl<\n TName extends string,\n TContext,\n TArg extends ReadonlyJSONValue[],\n TReturnQuery extends Query<any, any, any>,\n>(name: TName, fn: any, takesContext: boolean) {\n return (context: TContext, args: TArg) => {\n const q = takesContext ? fn(context, ...args) : fn(...args);\n return q.nameAndArgs(name, args) as TReturnQuery;\n };\n}\n\nexport function withValidation<T extends SyncedQuery<any, any, any, any, any>>(\n fn: T,\n): T extends SyncedQuery<infer N, infer C, any, any, infer R>\n ? SyncedQuery<N, C, true, ReadonlyJSONValue[], R>\n : never {\n if (!fn.parse) {\n throw new Error('ret does not have a parse function defined');\n }\n const ret: any = (context: unknown, ...args: unknown[]) => {\n const f = fn as any;\n const parsed = f.parse(args);\n return f.takesContext ? f(context, ...parsed) : f(...parsed);\n };\n ret.queryName = fn.queryName;\n ret.parse = fn.parse;\n ret.takesContext = true;\n\n return ret;\n}\n\nexport type ParseFn<T extends ReadonlyJSONValue[]> = (args: unknown[]) => T;\n\nexport type HasParseFn<T extends ReadonlyJSONValue[]> = {\n parse: ParseFn<T>;\n};\n\nexport type Parser<T extends ReadonlyJSONValue[]> = ParseFn<T> | HasParseFn<T>;\n\nexport type CustomQueryID = {\n name: string;\n args: ReadonlyArray<ReadonlyJSONValue>;\n};\n\n/**\n * Returns a set of query builders for the given schema.\n */\nexport function createBuilder<S extends Schema>(s: S): SchemaQuery<S> {\n return makeQueryBuilders(s) as SchemaQuery<S>;\n}\n\n/**\n * This produces the query builders for a given schema.\n * For use in Zero on the server to process custom queries.\n */\nfunction makeQueryBuilders<S extends Schema>(schema: S): SchemaQuery<S> {\n return new Proxy(\n {},\n {\n get: (\n target: Record<\n string,\n Omit<Query<S, string, any>, 'materialize' | 'preload'>\n >,\n prop: string,\n ) => {\n if (prop in target) {\n return target[prop];\n }\n\n if (!(prop in schema.tables)) {\n throw new Error(`Table ${prop} does not exist in schema`);\n }\n\n const q = newQuery(undefined, schema, prop);\n target[prop] = q;\n return q;\n },\n },\n ) as SchemaQuery<S>;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["table", "relationships", "clientToServer"]
|
|
7
7
|
}
|
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
createPredicate,
|
|
52
52
|
decodeIndexKey,
|
|
53
53
|
deepEqual,
|
|
54
|
+
delegateSymbol,
|
|
54
55
|
desiredQueriesPrefixForClient,
|
|
55
56
|
diff,
|
|
56
57
|
diff2,
|
|
@@ -126,7 +127,7 @@ import {
|
|
|
126
127
|
withWrite,
|
|
127
128
|
withWriteNoImplicitCommit,
|
|
128
129
|
wrapIterable
|
|
129
|
-
} from "./chunk-
|
|
130
|
+
} from "./chunk-3I7CRZJP.js";
|
|
130
131
|
import {
|
|
131
132
|
assert,
|
|
132
133
|
assertArray,
|
|
@@ -5973,7 +5974,7 @@ var userQueryMutateParamsSchema = valita_exports.object({
|
|
|
5973
5974
|
* This URL must match one of the URLs set in the zero config.
|
|
5974
5975
|
*
|
|
5975
5976
|
* E.g., Given the following environment variable:
|
|
5976
|
-
*
|
|
5977
|
+
* ZERO_GET_QUERIES_URL=[https://*.example.com/query]
|
|
5977
5978
|
*
|
|
5978
5979
|
* Then this URL could be:
|
|
5979
5980
|
* https://myapp.example.com/query
|
|
@@ -8665,7 +8666,7 @@ function makeMessage(message, context, logLevel) {
|
|
|
8665
8666
|
}
|
|
8666
8667
|
|
|
8667
8668
|
// ../zero-client/src/client/version.ts
|
|
8668
|
-
var version2 = "0.23.
|
|
8669
|
+
var version2 = "0.23.2025082500";
|
|
8669
8670
|
|
|
8670
8671
|
// ../zero-client/src/client/log-options.ts
|
|
8671
8672
|
var LevelFilterLogSink = class {
|
|
@@ -9223,6 +9224,7 @@ var Success = 1;
|
|
|
9223
9224
|
var QueryManager = class {
|
|
9224
9225
|
#clientID;
|
|
9225
9226
|
#clientToServer;
|
|
9227
|
+
#serverToClient;
|
|
9226
9228
|
#send;
|
|
9227
9229
|
#queries = /* @__PURE__ */ new Map();
|
|
9228
9230
|
#recentQueriesMaxSize;
|
|
@@ -9241,6 +9243,7 @@ var QueryManager = class {
|
|
|
9241
9243
|
this.#lc = lc.withContext("QueryManager");
|
|
9242
9244
|
this.#clientID = clientID;
|
|
9243
9245
|
this.#clientToServer = clientToServer(tables);
|
|
9246
|
+
this.#serverToClient = serverToClient(tables);
|
|
9244
9247
|
this.#recentQueriesMaxSize = recentQueriesMaxSize;
|
|
9245
9248
|
this.#send = send2;
|
|
9246
9249
|
this.#mutationTracker = mutationTracker;
|
|
@@ -9278,6 +9281,10 @@ var QueryManager = class {
|
|
|
9278
9281
|
}
|
|
9279
9282
|
);
|
|
9280
9283
|
}
|
|
9284
|
+
getAST(queryID) {
|
|
9285
|
+
const ast = this.#queries.get(queryID)?.normalized;
|
|
9286
|
+
return ast && mapAST(ast, this.#serverToClient);
|
|
9287
|
+
}
|
|
9281
9288
|
#fireGotCallbacks(queryHash, got) {
|
|
9282
9289
|
const gotCallbacks = this.#queries.get(queryHash)?.gotCallbacks ?? [];
|
|
9283
9290
|
for (const gotCallback of gotCallbacks) {
|
|
@@ -9316,7 +9323,7 @@ var QueryManager = class {
|
|
|
9316
9323
|
patch.set(hash, {
|
|
9317
9324
|
op: "put",
|
|
9318
9325
|
hash,
|
|
9319
|
-
ast: normalized,
|
|
9326
|
+
ast: name === void 0 ? normalized : void 0,
|
|
9320
9327
|
name,
|
|
9321
9328
|
args,
|
|
9322
9329
|
// We get TTL out of the DagStore so it is possible that the TTL was written
|
|
@@ -9341,17 +9348,10 @@ var QueryManager = class {
|
|
|
9341
9348
|
}
|
|
9342
9349
|
return patch;
|
|
9343
9350
|
}
|
|
9344
|
-
addCustom({ name, args }, ttl, gotCallback) {
|
|
9351
|
+
addCustom(ast, { name, args }, ttl, gotCallback) {
|
|
9352
|
+
const normalized = normalizeAST(ast);
|
|
9345
9353
|
const queryId = hashOfNameAndArgs(name, args);
|
|
9346
|
-
return this.#add(
|
|
9347
|
-
queryId,
|
|
9348
|
-
void 0,
|
|
9349
|
-
// normalized is undefined for custom queries
|
|
9350
|
-
name,
|
|
9351
|
-
args,
|
|
9352
|
-
ttl,
|
|
9353
|
-
gotCallback
|
|
9354
|
-
);
|
|
9354
|
+
return this.#add(queryId, normalized, name, args, ttl, gotCallback);
|
|
9355
9355
|
}
|
|
9356
9356
|
addLegacy(ast, ttl, gotCallback) {
|
|
9357
9357
|
const normalized = normalizeAST(ast);
|
|
@@ -9369,16 +9369,14 @@ var QueryManager = class {
|
|
|
9369
9369
|
}
|
|
9370
9370
|
#add(queryId, normalized, name, args, ttl, gotCallback) {
|
|
9371
9371
|
assert(
|
|
9372
|
-
|
|
9373
|
-
"
|
|
9372
|
+
name === void 0 === (args === void 0),
|
|
9373
|
+
"If name is defined, args must be defined"
|
|
9374
9374
|
);
|
|
9375
9375
|
ttl = clampTTL(ttl, this.#lc);
|
|
9376
9376
|
let entry = this.#queries.get(queryId);
|
|
9377
9377
|
this.#recentQueries.delete(queryId);
|
|
9378
9378
|
if (!entry) {
|
|
9379
|
-
|
|
9380
|
-
normalized = mapAST(normalized, this.#clientToServer);
|
|
9381
|
-
}
|
|
9379
|
+
normalized = mapAST(normalized, this.#clientToServer);
|
|
9382
9380
|
entry = {
|
|
9383
9381
|
normalized,
|
|
9384
9382
|
name,
|
|
@@ -9391,7 +9389,7 @@ var QueryManager = class {
|
|
|
9391
9389
|
this.#queueQueryChange({
|
|
9392
9390
|
op: "put",
|
|
9393
9391
|
hash: queryId,
|
|
9394
|
-
ast: normalized,
|
|
9392
|
+
ast: name === void 0 ? normalized : void 0,
|
|
9395
9393
|
name,
|
|
9396
9394
|
args,
|
|
9397
9395
|
ttl
|
|
@@ -9422,24 +9420,24 @@ var QueryManager = class {
|
|
|
9422
9420
|
};
|
|
9423
9421
|
}
|
|
9424
9422
|
updateCustom({ name, args }, ttl) {
|
|
9425
|
-
const
|
|
9426
|
-
const entry = must(this.#queries.get(
|
|
9427
|
-
this.#updateEntry(entry,
|
|
9423
|
+
const queryID = hashOfNameAndArgs(name, args);
|
|
9424
|
+
const entry = must(this.#queries.get(queryID));
|
|
9425
|
+
this.#updateEntry(entry, queryID, ttl);
|
|
9428
9426
|
}
|
|
9429
9427
|
updateLegacy(ast, ttl) {
|
|
9430
9428
|
const normalized = normalizeAST(ast);
|
|
9431
|
-
const
|
|
9432
|
-
const entry = must(this.#queries.get(
|
|
9433
|
-
this.#updateEntry(entry,
|
|
9429
|
+
const queryID = hashOfAST(normalized);
|
|
9430
|
+
const entry = must(this.#queries.get(queryID));
|
|
9431
|
+
this.#updateEntry(entry, queryID, ttl);
|
|
9434
9432
|
}
|
|
9435
|
-
#updateEntry(entry,
|
|
9433
|
+
#updateEntry(entry, queryID, ttl) {
|
|
9436
9434
|
ttl = clampTTL(ttl, this.#lc);
|
|
9437
9435
|
if (compareTTL(ttl, entry.ttl) > 0) {
|
|
9438
9436
|
entry.ttl = ttl;
|
|
9439
9437
|
this.#queueQueryChange({
|
|
9440
9438
|
op: "put",
|
|
9441
|
-
hash,
|
|
9442
|
-
ast: entry.normalized,
|
|
9439
|
+
hash: queryID,
|
|
9440
|
+
ast: entry.name === void 0 ? entry.normalized : void 0,
|
|
9443
9441
|
name: entry.name,
|
|
9444
9442
|
args: entry.args,
|
|
9445
9443
|
ttl
|
|
@@ -10291,8 +10289,9 @@ var Zero = class _Zero {
|
|
|
10291
10289
|
enableAnalytics: this.#enableAnalytics
|
|
10292
10290
|
});
|
|
10293
10291
|
const logOptions = this.#logOptions;
|
|
10292
|
+
const { enableLegacyMutators = true, enableLegacyQueries = true } = options;
|
|
10294
10293
|
const replicacheMutators = {
|
|
10295
|
-
[CRUD_MUTATION_NAME]: makeCRUDMutator(schema)
|
|
10294
|
+
[CRUD_MUTATION_NAME]: enableLegacyMutators ? makeCRUDMutator(schema) : () => Promise.reject(new Error("Zero CRUD mutators are not enabled."))
|
|
10296
10295
|
};
|
|
10297
10296
|
this.#ivmMain = new IVMSourceBranch(schema.tables);
|
|
10298
10297
|
function assertUnique(key) {
|
|
@@ -10379,9 +10378,20 @@ var Zero = class _Zero {
|
|
|
10379
10378
|
this.#zeroContext = new ZeroContext(
|
|
10380
10379
|
lc,
|
|
10381
10380
|
this.#ivmMain,
|
|
10382
|
-
(ast, ttl, gotCallback) =>
|
|
10383
|
-
|
|
10384
|
-
|
|
10381
|
+
(ast, ttl, gotCallback) => {
|
|
10382
|
+
if (enableLegacyQueries) {
|
|
10383
|
+
return this.#queryManager.addLegacy(ast, ttl, gotCallback);
|
|
10384
|
+
}
|
|
10385
|
+
return emptyFunction;
|
|
10386
|
+
},
|
|
10387
|
+
(ast, customQueryID, ttl, gotCallback) => this.#queryManager.addCustom(ast, customQueryID, ttl, gotCallback),
|
|
10388
|
+
(ast, ttl) => {
|
|
10389
|
+
if (enableLegacyQueries) {
|
|
10390
|
+
this.#queryManager.updateLegacy(ast, ttl);
|
|
10391
|
+
return;
|
|
10392
|
+
}
|
|
10393
|
+
this.#queryManager.updateLegacy(ast, ttl);
|
|
10394
|
+
},
|
|
10385
10395
|
(customQueryID, ttl) => this.#queryManager.updateCustom(customQueryID, ttl),
|
|
10386
10396
|
() => this.#queryManager.flushBatch(),
|
|
10387
10397
|
batchViewUpdates,
|
|
@@ -10567,7 +10577,16 @@ var Zero = class _Zero {
|
|
|
10567
10577
|
return createLogOptions(options);
|
|
10568
10578
|
}
|
|
10569
10579
|
preload(query, options) {
|
|
10570
|
-
return query
|
|
10580
|
+
return query[delegateSymbol](this.#zeroContext).preload(options);
|
|
10581
|
+
}
|
|
10582
|
+
run(query, runOptions) {
|
|
10583
|
+
return query[delegateSymbol](this.#zeroContext).run(runOptions);
|
|
10584
|
+
}
|
|
10585
|
+
materialize(query, factoryOrOptions, maybeOptions) {
|
|
10586
|
+
if (typeof factoryOrOptions === "function") {
|
|
10587
|
+
return query[delegateSymbol](this.#zeroContext).materialize(factoryOrOptions, maybeOptions?.ttl);
|
|
10588
|
+
}
|
|
10589
|
+
return query[delegateSymbol](this.#zeroContext).materialize(factoryOrOptions?.ttl);
|
|
10571
10590
|
}
|
|
10572
10591
|
/**
|
|
10573
10592
|
* The server URL that this Zero instance is configured with.
|
|
@@ -11419,7 +11438,7 @@ var Zero = class _Zero {
|
|
|
11419
11438
|
*/
|
|
11420
11439
|
async inspect() {
|
|
11421
11440
|
BUNDLE_SIZE: {
|
|
11422
|
-
const m = await import("./inspector-
|
|
11441
|
+
const m = await import("./inspector-UIWB2MYC.js");
|
|
11423
11442
|
return m.newInspector(
|
|
11424
11443
|
this.#rep,
|
|
11425
11444
|
this.#queryManager,
|
|
@@ -11586,4 +11605,4 @@ export {
|
|
|
11586
11605
|
update_needed_reason_type_enum_exports,
|
|
11587
11606
|
Zero
|
|
11588
11607
|
};
|
|
11589
|
-
//# sourceMappingURL=chunk-
|
|
11608
|
+
//# sourceMappingURL=chunk-XAUWMRGH.js.map
|