@rocicorp/zero 0.26.1-canary.2 → 0.26.1-canary.4
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/analyze-query/src/run-ast.d.ts.map +1 -1
- package/out/analyze-query/src/run-ast.js +4 -1
- package/out/analyze-query/src/run-ast.js.map +1 -1
- package/out/replicache/src/btree/node.js +4 -4
- package/out/replicache/src/btree/node.js.map +1 -1
- package/out/replicache/src/btree/write.js +2 -2
- package/out/replicache/src/btree/write.js.map +1 -1
- package/out/replicache/src/dag/gc.js +5 -2
- package/out/replicache/src/dag/gc.js.map +1 -1
- package/out/replicache/src/db/write.d.ts.map +1 -1
- package/out/replicache/src/db/write.js +21 -6
- package/out/replicache/src/db/write.js.map +1 -1
- package/out/replicache/src/error-responses.d.ts.map +1 -1
- package/out/replicache/src/error-responses.js +4 -1
- package/out/replicache/src/error-responses.js.map +1 -1
- package/out/replicache/src/persist/clients.d.ts.map +1 -1
- package/out/replicache/src/persist/clients.js +4 -1
- package/out/replicache/src/persist/clients.js.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js +2 -1
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/idb-databases-store.d.ts.map +1 -1
- package/out/replicache/src/persist/idb-databases-store.js +4 -1
- package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
- package/out/replicache/src/process-scheduler.js +4 -1
- package/out/replicache/src/process-scheduler.js.map +1 -1
- package/out/replicache/src/replicache-impl.js +2 -2
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/subscriptions.d.ts.map +1 -1
- package/out/replicache/src/subscriptions.js +5 -2
- package/out/replicache/src/subscriptions.js.map +1 -1
- package/out/replicache/src/sync/diff.d.ts.map +1 -1
- package/out/replicache/src/sync/diff.js +4 -1
- package/out/replicache/src/sync/diff.js.map +1 -1
- package/out/replicache/src/sync/pull.d.ts.map +1 -1
- package/out/replicache/src/sync/pull.js +4 -1
- package/out/replicache/src/sync/pull.js.map +1 -1
- package/out/replicache/src/sync/push.d.ts.map +1 -1
- package/out/replicache/src/sync/push.js +5 -2
- package/out/replicache/src/sync/push.js.map +1 -1
- package/out/shared/src/asserts.d.ts +1 -1
- package/out/shared/src/asserts.d.ts.map +1 -1
- package/out/shared/src/asserts.js +1 -1
- package/out/shared/src/asserts.js.map +1 -1
- package/out/z2s/src/compiler.d.ts.map +1 -1
- package/out/z2s/src/compiler.js +8 -2
- package/out/z2s/src/compiler.js.map +1 -1
- package/out/zero/package.json.js +1 -1
- package/out/zero-cache/src/services/analyze.js +1 -0
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +6 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +12 -8
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +22 -2
- package/out/zero-cache/src/services/run-ast.js.map +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 +8 -2
- 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.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +10 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +15 -7
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-client/src/client/http-string.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-schema/src/permissions.d.ts.map +1 -1
- package/out/zero-schema/src/permissions.js +4 -1
- package/out/zero-schema/src/permissions.js.map +1 -1
- package/out/zql/src/builder/filter.d.ts.map +1 -1
- package/out/zql/src/builder/filter.js +5 -2
- package/out/zql/src/builder/filter.js.map +1 -1
- package/out/zql/src/ivm/constraint.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../zero-schema/src/permissions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../zero-schema/src/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,aAAa,EACb,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;AAC3D,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,8BAA8B,CAAC;AAExD,OAAO,KAAK,EAEV,iBAAiB,IAAI,yBAAyB,EAE/C,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,UAAU,OACjB,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,iBAClD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB;;qBAN7B,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;qBAA7C,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;;8BAA7C,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;+BAA7C,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;;qBAA7C,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;;CAgBlD,CAAC;AAEF,eAAO,MAAM,UAAU,SAAK,CAAC;AAE7B,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEnD,MAAM,MAAM,OAAO,CAAC,OAAO,SAAS,MAAM,IAAI;KAC3C,CAAC,IAAI,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,cAAc,CACxB,cAAc,EACd,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,IAC7C,CACF,QAAQ,EAAE,cAAc,EACxB,EAAE,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,KACnC,SAAS,CAAC;AAEf,MAAM,MAAM,gBAAgB,CAC1B,cAAc,EACd,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,IAC7C;IAEF,MAAM,CAAC,EAAE,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;IACvE;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;IACvE;;;OAGG;IACH,MAAM,CAAC,EACH;QACE,WAAW,CAAC,EAAE,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QAChE,YAAY,CAAC,EAAE,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;KAClE,GACD,SAAS,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,cAAc,EAAE,OAAO,SAAS,MAAM,IAAI;KACrE,CAAC,IAAI,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC;QACxE,IAAI,CAAC,EACD;aACG,CAAC,IAAI,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CACjD,gBAAgB,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,EACrD,MAAM,CACP;SACF,GACD,SAAS,CAAC;KACf;CACF,CAAC;AAEF;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,OAAO,SAAS,MAAM,EAC5E,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,MACL,OAAO,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,GACnD,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,GAC7C,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAWhD;AAuMD,eAAO,MAAM,WAAW;qBA7BQ,MAAM,SAAS;CA6BG,CAAC;AACnD,eAAO,MAAM,iBAAiB;qBA9BE,MAAM,SAAS;CA8Be,CAAC;AAC/D,wBAAgB,WAAW,CACzB,WAAW,EAAE,UAAU,GAAG,gBAAgB,EAC1C,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GACvB,SAAS,CAOX"}
|
|
@@ -152,7 +152,10 @@ class CallTracker {
|
|
|
152
152
|
if (prop === toStaticParam) {
|
|
153
153
|
return target[toStaticParam];
|
|
154
154
|
}
|
|
155
|
-
assert(
|
|
155
|
+
assert(
|
|
156
|
+
typeof prop === "string",
|
|
157
|
+
() => `Expected prop to be a string, got ${typeof prop}`
|
|
158
|
+
);
|
|
156
159
|
const path = [...this.#path, prop];
|
|
157
160
|
return new Proxy(
|
|
158
161
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sources":["../../../../zero-schema/src/permissions.ts"],"sourcesContent":["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 {Schema} from '../../zero-types/src/schema.ts';\nimport type {ExpressionBuilder} from '../../zql/src/query/expression.ts';\nimport type {Query} from '../../zql/src/query/query.ts';\nimport {newExpressionBuilder} from '../../zql/src/query/static-query.ts';\nimport type {\n AssetPermissions as CompiledAssetPermissions,\n PermissionsConfig as CompiledPermissionsConfig,\n TablePermissions,\n} from './compiled-permissions.ts';\nimport type {NameMapper} from './name-mapper.ts';\nimport {clientToServer} from './name-mapper.ts';\n\nexport const ANYONE_CAN = [\n (_: unknown, eb: ExpressionBuilder<never, Schema>) => 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<K & string, TSchema>;\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<TTable, TSchema>,\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\n/**\n * @deprecated Use {@link defineMutators} and {@link defineQueries} instead.\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<string, TSchema>\n >;\n for (const name of Object.keys(schema.tables)) {\n expressionBuilders[name] = newExpressionBuilder(schema, name);\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<string, TSchema>>,\n): CompiledPermissionsConfig | undefined {\n if (!authz) {\n return undefined;\n }\n const nameMapper = clientToServer(schema.tables);\n const ret = {tables: {} as TablePermissions};\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<TTable, TSchema>,\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<TTable, TSchema>,\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<TTable, TSchema>,\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');\nexport function staticParam(\n anchorClass: 'authData' | 'preMutationRow',\n field: string | string[],\n): Parameter {\n return {\n type: 'static',\n anchor: anchorClass,\n // for backwards compatibility\n field: field.length === 1 ? field[0] : field,\n };\n}\n"],"names":["clientToServer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"permissions.js","sources":["../../../../zero-schema/src/permissions.ts"],"sourcesContent":["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 {Schema} from '../../zero-types/src/schema.ts';\nimport type {ExpressionBuilder} from '../../zql/src/query/expression.ts';\nimport type {Query} from '../../zql/src/query/query.ts';\nimport {newExpressionBuilder} from '../../zql/src/query/static-query.ts';\nimport type {\n AssetPermissions as CompiledAssetPermissions,\n PermissionsConfig as CompiledPermissionsConfig,\n TablePermissions,\n} from './compiled-permissions.ts';\nimport type {NameMapper} from './name-mapper.ts';\nimport {clientToServer} from './name-mapper.ts';\n\nexport const ANYONE_CAN = [\n (_: unknown, eb: ExpressionBuilder<never, Schema>) => 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<K & string, TSchema>;\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<TTable, TSchema>,\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\n/**\n * @deprecated Use {@link defineMutators} and {@link defineQueries} instead.\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<string, TSchema>\n >;\n for (const name of Object.keys(schema.tables)) {\n expressionBuilders[name] = newExpressionBuilder(schema, name);\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<string, TSchema>>,\n): CompiledPermissionsConfig | undefined {\n if (!authz) {\n return undefined;\n }\n const nameMapper = clientToServer(schema.tables);\n const ret = {tables: {} as TablePermissions};\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<TTable, TSchema>,\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<TTable, TSchema>,\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<TTable, TSchema>,\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(\n typeof prop === 'string',\n () => `Expected prop to be a string, got ${typeof prop}`,\n );\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');\nexport function staticParam(\n anchorClass: 'authData' | 'preMutationRow',\n field: string | string[],\n): Parameter {\n return {\n type: 'static',\n anchor: anchorClass,\n // for backwards compatibility\n field: field.length === 1 ? field[0] : field,\n };\n}\n"],"names":["clientToServer"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../../zql/src/builder/filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAEhB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,GAAG,EAAE,KAAK,EAAC,MAAM,oCAAoC,CAAC;AAInE,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC;AAC5D,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC;AACtD,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC;AAEnE,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC5C,GACD;IACE,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC5C,CAAC;AAEN,wBAAgB,eAAe,CAC7B,SAAS,EAAE,mBAAmB,GAC7B,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAkEvB;
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../../zql/src/builder/filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAEhB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,GAAG,EAAE,KAAK,EAAC,MAAM,oCAAoC,CAAC;AAInE,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC;AAC5D,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC;AACtD,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC;AAEnE,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC5C,GACD;IACE,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC5C,CAAC;AAEN,wBAAgB,eAAe,CAC7B,SAAS,EAAE,mBAAmB,GAC7B,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAkEvB;AA8DD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG;IAChE,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACzC,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAoCA"}
|
|
@@ -91,12 +91,15 @@ function createPredicateImpl(rhs, operator) {
|
|
|
91
91
|
case "NOT ILIKE":
|
|
92
92
|
return not(getLikePredicate(rhs, "i"));
|
|
93
93
|
case "IN": {
|
|
94
|
-
assert(Array.isArray(rhs));
|
|
94
|
+
assert(Array.isArray(rhs), "Expected rhs to be an array for IN operator");
|
|
95
95
|
const set = new Set(rhs);
|
|
96
96
|
return (lhs) => set.has(lhs);
|
|
97
97
|
}
|
|
98
98
|
case "NOT IN": {
|
|
99
|
-
assert(
|
|
99
|
+
assert(
|
|
100
|
+
Array.isArray(rhs),
|
|
101
|
+
"Expected rhs to be an array for NOT IN operator"
|
|
102
|
+
);
|
|
100
103
|
const set = new Set(rhs);
|
|
101
104
|
return (lhs) => !set.has(lhs);
|
|
102
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sources":["../../../../../zql/src/builder/filter.ts"],"sourcesContent":["import {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport type {\n Condition,\n SimpleCondition,\n SimpleOperator,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../../zero-protocol/src/data.ts';\nimport {simplifyCondition} from '../query/expression.ts';\nimport {getLikePredicate} from './like.ts';\n\nexport type NonNullValue = Exclude<Value, null | undefined>;\nexport type SimplePredicate = (rhs: Value) => boolean;\nexport type SimplePredicateNoNull = (rhs: NonNullValue) => boolean;\n\nexport type NoSubqueryCondition =\n | SimpleCondition\n | {\n type: 'and';\n conditions: readonly NoSubqueryCondition[];\n }\n | {\n type: 'or';\n conditions: readonly NoSubqueryCondition[];\n };\n\nexport function createPredicate(\n condition: NoSubqueryCondition,\n): (row: Row) => boolean {\n if (condition.type !== 'simple') {\n const predicates = condition.conditions.map(c => createPredicate(c));\n return condition.type === 'and'\n ? (row: Row) => {\n // and\n for (const predicate of predicates) {\n if (!predicate(row)) {\n return false;\n }\n }\n return true;\n }\n : (row: Row) => {\n // or\n for (const predicate of predicates) {\n if (predicate(row)) {\n return true;\n }\n }\n return false;\n };\n }\n const {left} = condition;\n const {right} = condition;\n assert(\n right.type !== 'static',\n 'static values should be resolved before creating predicates',\n );\n assert(\n left.type !== 'static',\n 'static values should be resolved before creating predicates',\n );\n\n switch (condition.op) {\n case 'IS':\n case 'IS NOT': {\n const impl = createIsPredicate(right.value, condition.op);\n if (left.type === 'literal') {\n const result = impl(left.value);\n return () => result;\n }\n return (row: Row) => impl(row[left.name]);\n }\n }\n\n if (right.value === null || right.value === undefined) {\n return (_row: Row) => false;\n }\n\n const impl = createPredicateImpl(right.value, condition.op);\n if (left.type === 'literal') {\n if (left.value === null || left.value === undefined) {\n return (_row: Row) => false;\n }\n const result = impl(left.value);\n return () => result;\n }\n\n return (row: Row) => {\n const lhs = row[left.name];\n if (lhs === null || lhs === undefined) {\n return false;\n }\n return impl(lhs);\n };\n}\n\nfunction createIsPredicate(\n rhs: Value | readonly Value[],\n operator: 'IS' | 'IS NOT',\n): SimplePredicate {\n switch (operator) {\n case 'IS':\n return lhs => lhs === rhs;\n case 'IS NOT':\n return lhs => lhs !== rhs;\n }\n}\n\nfunction createPredicateImpl(\n rhs: NonNullValue | readonly NonNullValue[],\n operator: Exclude<SimpleOperator, 'IS' | 'IS NOT'>,\n): SimplePredicateNoNull {\n switch (operator) {\n case '=':\n return lhs => lhs === rhs;\n case '!=':\n return lhs => lhs !== rhs;\n case '<':\n return lhs => lhs < rhs;\n case '<=':\n return lhs => lhs <= rhs;\n case '>':\n return lhs => lhs > rhs;\n case '>=':\n return lhs => lhs >= rhs;\n case 'LIKE':\n return getLikePredicate(rhs, '');\n case 'NOT LIKE':\n return not(getLikePredicate(rhs, ''));\n case 'ILIKE':\n return getLikePredicate(rhs, 'i');\n case 'NOT ILIKE':\n return not(getLikePredicate(rhs, 'i'));\n case 'IN': {\n assert(Array.isArray(rhs));\n const set = new Set(rhs);\n return lhs => set.has(lhs);\n }\n case 'NOT IN': {\n assert(Array.isArray(rhs));\n const set = new Set(rhs);\n return lhs => !set.has(lhs);\n }\n default:\n operator satisfies never;\n throw new Error(`Unexpected operator: ${operator}`);\n }\n}\n\nfunction not<T>(f: (lhs: T) => boolean) {\n return (lhs: T) => !f(lhs);\n}\n\n/**\n * If the condition contains any CorrelatedSubqueryConditions, returns a\n * transformed condition which contains no CorrelatedSubqueryCondition(s) but\n * which will filter a subset of the rows that would be filtered by the original\n * condition, or undefined if no such transformation exists.\n *\n * If the condition does not contain any CorrelatedSubqueryConditions\n * returns the condition unmodified and `conditionsRemoved: false`.\n */\nexport function transformFilters(filters: Condition | undefined): {\n filters: NoSubqueryCondition | undefined;\n conditionsRemoved: boolean;\n} {\n if (!filters) {\n return {filters: undefined, conditionsRemoved: false};\n }\n switch (filters.type) {\n case 'simple':\n return {filters, conditionsRemoved: false};\n case 'correlatedSubquery':\n return {filters: undefined, conditionsRemoved: true};\n case 'and':\n case 'or': {\n const transformedConditions: NoSubqueryCondition[] = [];\n let conditionsRemoved = false;\n for (const cond of filters.conditions) {\n const transformed = transformFilters(cond);\n // If any branch of the OR ends up empty, the entire OR needs\n // to be removed.\n if (transformed.filters === undefined && filters.type === 'or') {\n return {filters: undefined, conditionsRemoved: true};\n }\n conditionsRemoved = conditionsRemoved || transformed.conditionsRemoved;\n if (transformed.filters) {\n transformedConditions.push(transformed.filters);\n }\n }\n return {\n filters: simplifyCondition({\n type: filters.type,\n conditions: transformedConditions,\n }) as NoSubqueryCondition,\n conditionsRemoved,\n };\n }\n default:\n unreachable(filters);\n }\n}\n"],"names":["impl"],"mappings":";;;AAyBO,SAAS,gBACd,WACuB;AACvB,MAAI,UAAU,SAAS,UAAU;AAC/B,UAAM,aAAa,UAAU,WAAW,IAAI,CAAA,MAAK,gBAAgB,CAAC,CAAC;AACnE,WAAO,UAAU,SAAS,QACtB,CAAC,QAAa;AAEZ,iBAAW,aAAa,YAAY;AAClC,YAAI,CAAC,UAAU,GAAG,GAAG;AACnB,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,IACA,CAAC,QAAa;AAEZ,iBAAW,aAAa,YAAY;AAClC,YAAI,UAAU,GAAG,GAAG;AAClB,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACN;AACA,QAAM,EAAC,SAAQ;AACf,QAAM,EAAC,UAAS;AAChB;AAAA,IACE,MAAM,SAAS;AAAA,IACf;AAAA,EAAA;AAEF;AAAA,IACE,KAAK,SAAS;AAAA,IACd;AAAA,EAAA;AAGF,UAAQ,UAAU,IAAA;AAAA,IAChB,KAAK;AAAA,IACL,KAAK,UAAU;AACb,YAAMA,QAAO,kBAAkB,MAAM,OAAO,UAAU,EAAE;AACxD,UAAI,KAAK,SAAS,WAAW;AAC3B,cAAM,SAASA,MAAK,KAAK,KAAK;AAC9B,eAAO,MAAM;AAAA,MACf;AACA,aAAO,CAAC,QAAaA,MAAK,IAAI,KAAK,IAAI,CAAC;AAAA,IAC1C;AAAA,EAAA;AAGF,MAAI,MAAM,UAAU,QAAQ,MAAM,UAAU,QAAW;AACrD,WAAO,CAAC,SAAc;AAAA,EACxB;AAEA,QAAM,OAAO,oBAAoB,MAAM,OAAO,UAAU,EAAE;AAC1D,MAAI,KAAK,SAAS,WAAW;AAC3B,QAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,QAAW;AACnD,aAAO,CAAC,SAAc;AAAA,IACxB;AACA,UAAM,SAAS,KAAK,KAAK,KAAK;AAC9B,WAAO,MAAM;AAAA,EACf;AAEA,SAAO,CAAC,QAAa;AACnB,UAAM,MAAM,IAAI,KAAK,IAAI;AACzB,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,GAAG;AAAA,EACjB;AACF;AAEA,SAAS,kBACP,KACA,UACiB;AACjB,UAAQ,UAAA;AAAA,IACN,KAAK;AACH,aAAO,SAAO,QAAQ;AAAA,IACxB,KAAK;AACH,aAAO,SAAO,QAAQ;AAAA,EAAA;AAE5B;AAEA,SAAS,oBACP,KACA,UACuB;AACvB,UAAQ,UAAA;AAAA,IACN,KAAK;AACH,aAAO,SAAO,QAAQ;AAAA,IACxB,KAAK;AACH,aAAO,SAAO,QAAQ;AAAA,IACxB,KAAK;AACH,aAAO,SAAO,MAAM;AAAA,IACtB,KAAK;AACH,aAAO,SAAO,OAAO;AAAA,IACvB,KAAK;AACH,aAAO,SAAO,MAAM;AAAA,IACtB,KAAK;AACH,aAAO,SAAO,OAAO;AAAA,IACvB,KAAK;AACH,aAAO,iBAAiB,KAAK,EAAE;AAAA,IACjC,KAAK;AACH,aAAO,IAAI,iBAAiB,KAAK,EAAE,CAAC;AAAA,IACtC,KAAK;AACH,aAAO,iBAAiB,KAAK,GAAG;AAAA,IAClC,KAAK;AACH,aAAO,IAAI,iBAAiB,KAAK,GAAG,CAAC;AAAA,IACvC,KAAK,MAAM;AACT,aAAO,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"filter.js","sources":["../../../../../zql/src/builder/filter.ts"],"sourcesContent":["import {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport type {\n Condition,\n SimpleCondition,\n SimpleOperator,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../../zero-protocol/src/data.ts';\nimport {simplifyCondition} from '../query/expression.ts';\nimport {getLikePredicate} from './like.ts';\n\nexport type NonNullValue = Exclude<Value, null | undefined>;\nexport type SimplePredicate = (rhs: Value) => boolean;\nexport type SimplePredicateNoNull = (rhs: NonNullValue) => boolean;\n\nexport type NoSubqueryCondition =\n | SimpleCondition\n | {\n type: 'and';\n conditions: readonly NoSubqueryCondition[];\n }\n | {\n type: 'or';\n conditions: readonly NoSubqueryCondition[];\n };\n\nexport function createPredicate(\n condition: NoSubqueryCondition,\n): (row: Row) => boolean {\n if (condition.type !== 'simple') {\n const predicates = condition.conditions.map(c => createPredicate(c));\n return condition.type === 'and'\n ? (row: Row) => {\n // and\n for (const predicate of predicates) {\n if (!predicate(row)) {\n return false;\n }\n }\n return true;\n }\n : (row: Row) => {\n // or\n for (const predicate of predicates) {\n if (predicate(row)) {\n return true;\n }\n }\n return false;\n };\n }\n const {left} = condition;\n const {right} = condition;\n assert(\n right.type !== 'static',\n 'static values should be resolved before creating predicates',\n );\n assert(\n left.type !== 'static',\n 'static values should be resolved before creating predicates',\n );\n\n switch (condition.op) {\n case 'IS':\n case 'IS NOT': {\n const impl = createIsPredicate(right.value, condition.op);\n if (left.type === 'literal') {\n const result = impl(left.value);\n return () => result;\n }\n return (row: Row) => impl(row[left.name]);\n }\n }\n\n if (right.value === null || right.value === undefined) {\n return (_row: Row) => false;\n }\n\n const impl = createPredicateImpl(right.value, condition.op);\n if (left.type === 'literal') {\n if (left.value === null || left.value === undefined) {\n return (_row: Row) => false;\n }\n const result = impl(left.value);\n return () => result;\n }\n\n return (row: Row) => {\n const lhs = row[left.name];\n if (lhs === null || lhs === undefined) {\n return false;\n }\n return impl(lhs);\n };\n}\n\nfunction createIsPredicate(\n rhs: Value | readonly Value[],\n operator: 'IS' | 'IS NOT',\n): SimplePredicate {\n switch (operator) {\n case 'IS':\n return lhs => lhs === rhs;\n case 'IS NOT':\n return lhs => lhs !== rhs;\n }\n}\n\nfunction createPredicateImpl(\n rhs: NonNullValue | readonly NonNullValue[],\n operator: Exclude<SimpleOperator, 'IS' | 'IS NOT'>,\n): SimplePredicateNoNull {\n switch (operator) {\n case '=':\n return lhs => lhs === rhs;\n case '!=':\n return lhs => lhs !== rhs;\n case '<':\n return lhs => lhs < rhs;\n case '<=':\n return lhs => lhs <= rhs;\n case '>':\n return lhs => lhs > rhs;\n case '>=':\n return lhs => lhs >= rhs;\n case 'LIKE':\n return getLikePredicate(rhs, '');\n case 'NOT LIKE':\n return not(getLikePredicate(rhs, ''));\n case 'ILIKE':\n return getLikePredicate(rhs, 'i');\n case 'NOT ILIKE':\n return not(getLikePredicate(rhs, 'i'));\n case 'IN': {\n assert(Array.isArray(rhs), 'Expected rhs to be an array for IN operator');\n const set = new Set(rhs);\n return lhs => set.has(lhs);\n }\n case 'NOT IN': {\n assert(\n Array.isArray(rhs),\n 'Expected rhs to be an array for NOT IN operator',\n );\n const set = new Set(rhs);\n return lhs => !set.has(lhs);\n }\n default:\n operator satisfies never;\n throw new Error(`Unexpected operator: ${operator}`);\n }\n}\n\nfunction not<T>(f: (lhs: T) => boolean) {\n return (lhs: T) => !f(lhs);\n}\n\n/**\n * If the condition contains any CorrelatedSubqueryConditions, returns a\n * transformed condition which contains no CorrelatedSubqueryCondition(s) but\n * which will filter a subset of the rows that would be filtered by the original\n * condition, or undefined if no such transformation exists.\n *\n * If the condition does not contain any CorrelatedSubqueryConditions\n * returns the condition unmodified and `conditionsRemoved: false`.\n */\nexport function transformFilters(filters: Condition | undefined): {\n filters: NoSubqueryCondition | undefined;\n conditionsRemoved: boolean;\n} {\n if (!filters) {\n return {filters: undefined, conditionsRemoved: false};\n }\n switch (filters.type) {\n case 'simple':\n return {filters, conditionsRemoved: false};\n case 'correlatedSubquery':\n return {filters: undefined, conditionsRemoved: true};\n case 'and':\n case 'or': {\n const transformedConditions: NoSubqueryCondition[] = [];\n let conditionsRemoved = false;\n for (const cond of filters.conditions) {\n const transformed = transformFilters(cond);\n // If any branch of the OR ends up empty, the entire OR needs\n // to be removed.\n if (transformed.filters === undefined && filters.type === 'or') {\n return {filters: undefined, conditionsRemoved: true};\n }\n conditionsRemoved = conditionsRemoved || transformed.conditionsRemoved;\n if (transformed.filters) {\n transformedConditions.push(transformed.filters);\n }\n }\n return {\n filters: simplifyCondition({\n type: filters.type,\n conditions: transformedConditions,\n }) as NoSubqueryCondition,\n conditionsRemoved,\n };\n }\n default:\n unreachable(filters);\n }\n}\n"],"names":["impl"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constraint.js","sources":["../../../../../zql/src/ivm/constraint.ts"],"sourcesContent":["import {assert} from '../../../shared/src/asserts.ts';\nimport {stringCompare} from '../../../shared/src/string-compare.ts';\nimport type {Writable} from '../../../shared/src/writable.ts';\nimport type {\n Condition,\n SimpleCondition,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../../zero-protocol/src/primary-key.ts';\nimport {valuesEqual} from './data.ts';\n\nexport type Constraint = {\n readonly [key: string]: Value;\n};\n\nexport function constraintMatchesRow(\n constraint: Constraint,\n row: Row,\n): boolean {\n for (const key in constraint) {\n if (!valuesEqual(row[key], constraint[key])) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Constraints are compatible if:\n * 1. They do not have any keys in common\n * 2. They have keys in common, but the values for those keys are equal\n */\nexport function constraintsAreCompatible(\n left: Constraint,\n right: Constraint,\n): boolean {\n for (const key in left) {\n if (key in right && !valuesEqual(left[key], right[key])) {\n return false;\n }\n }\n return true;\n}\n\nexport function constraintMatchesPrimaryKey(\n constraint: Constraint,\n primary: PrimaryKey,\n): boolean {\n return keyMatchesPrimaryKey(Object.keys(constraint), primary);\n}\n\nexport function keyMatchesPrimaryKey(\n key: Iterable<string>,\n primary: PrimaryKey,\n): boolean {\n const constraintKeys = [...key];\n\n if (constraintKeys.length !== primary.length) {\n return false;\n }\n\n // Primary key is always sorted\n // Constraint does not have to be sorted\n constraintKeys.sort(stringCompare);\n\n for (let i = 0; i < constraintKeys.length; i++) {\n if (constraintKeys[i] !== primary[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Pulls top level `and` components out of a condition tree.\n * The resulting array of simple conditions would match a superset of\n * values that the original condition would match.\n *\n * Examples:\n * a AND b OR c\n *\n * In this case we cannot pull anything because the `or` is at the top level.\n *\n * a AND b AND c\n * We can pull all three.\n *\n * a AND (b OR c)\n * We can only pull `a`.\n */\nexport function pullSimpleAndComponents(\n condition: Condition,\n): SimpleCondition[] {\n if (condition.type === 'and') {\n return condition.conditions.flatMap(pullSimpleAndComponents);\n }\n\n if (condition.type === 'simple') {\n return [condition];\n }\n\n if (condition.type === 'or' && condition.conditions.length === 1) {\n return pullSimpleAndComponents(condition.conditions[0]);\n }\n\n return [];\n}\n\n/**\n * Checks if the supplied filters constitute a primary key lookup.\n * If so, returns the constraint that would be used to look up the primary key.\n * If not, returns undefined.\n */\nexport function primaryKeyConstraintFromFilters(\n condition: Condition | undefined,\n primary: PrimaryKey,\n): Constraint | undefined {\n if (condition === undefined) {\n return undefined;\n }\n\n const conditions = pullSimpleAndComponents(condition);\n if (conditions.length === 0) {\n return undefined;\n }\n\n const ret: Writable<Constraint> = {};\n for (const subCondition of conditions) {\n if (subCondition.op === '=') {\n const column = extractColumn(subCondition);\n if (column !== undefined) {\n if (!primary.includes(column.name)) {\n continue;\n }\n ret[column.name] = column.value;\n }\n }\n }\n\n if (Object.keys(ret).length !== primary.length) {\n return undefined;\n }\n\n return ret;\n}\n\nfunction extractColumn(\n condition: SimpleCondition,\n): {name: string; value: Value} | undefined {\n if (condition.left.type === 'column') {\n assert(\n condition.right.type === 'literal',\n () =>\n `extractColumn: expected right side to be literal, got ${condition.right.type}`,\n );\n return {name: condition.left.name, value: condition.right.value};\n }\n\n return undefined;\n}\n\ndeclare const TESTING: boolean;\n\nexport class SetOfConstraint {\n #data: Constraint[] = [];\n\n constructor() {\n // Only used in testing\n assert(TESTING);\n }\n\n #indexOf(value: Constraint): number {\n return this.#data.findIndex(v => constraintEquals(v, value));\n }\n\n has(value: Constraint): boolean {\n return this.#indexOf(value) !== -1;\n }\n\n add(value: Constraint): this {\n if (!this.has(value)) {\n this.#data.push(value);\n }\n return this;\n }\n}\n\nfunction constraintEquals(a: Constraint, b: Constraint): boolean {\n const aEntries = Object.entries(a);\n const bEntries = Object.entries(b);\n if (aEntries.length !== bEntries.length) {\n return false;\n }\n for (let i = 0; i < aEntries.length; i++) {\n if (\n aEntries[i][0] !== bEntries[i][0] ||\n !valuesEqual(aEntries[i][1], bEntries[i][1])\n ) {\n return false;\n }\n }\n return true;\n}\n"],"names":[],"mappings":";;;AAeO,SAAS,qBACd,YACA,KACS;AACT,aAAW,OAAO,YAAY;AAC5B,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG,WAAW,GAAG,CAAC,GAAG;AAC3C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,yBACd,MACA,OACS;AACT,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,SAAS,CAAC,YAAY,KAAK,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,4BACd,YACA,SACS;AACT,SAAO,qBAAqB,OAAO,KAAK,UAAU,GAAG,OAAO;AAC9D;AAEO,SAAS,qBACd,KACA,SACS;AACT,QAAM,iBAAiB,CAAC,GAAG,GAAG;AAE9B,MAAI,eAAe,WAAW,QAAQ,QAAQ;AAC5C,WAAO;AAAA,EACT;AAIA,iBAAe,KAAK,aAAa;AAEjC,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,QAAI,eAAe,CAAC,MAAM,QAAQ,CAAC,GAAG;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAkBO,SAAS,wBACd,WACmB;AACnB,MAAI,UAAU,SAAS,OAAO;AAC5B,WAAO,UAAU,WAAW,QAAQ,uBAAuB;AAAA,EAC7D;AAEA,MAAI,UAAU,SAAS,UAAU;AAC/B,WAAO,CAAC,SAAS;AAAA,EACnB;AAEA,MAAI,UAAU,SAAS,QAAQ,UAAU,WAAW,WAAW,GAAG;AAChE,WAAO,wBAAwB,UAAU,WAAW,CAAC,CAAC;AAAA,EACxD;AAEA,SAAO,CAAA;AACT;AAOO,SAAS,gCACd,WACA,SACwB;AACxB,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,wBAAwB,SAAS;AACpD,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,MAA4B,CAAA;AAClC,aAAW,gBAAgB,YAAY;AACrC,QAAI,aAAa,OAAO,KAAK;AAC3B,YAAM,SAAS,cAAc,YAAY;AACzC,UAAI,WAAW,QAAW;AACxB,YAAI,CAAC,QAAQ,SAAS,OAAO,IAAI,GAAG;AAClC;AAAA,QACF;AACA,YAAI,OAAO,IAAI,IAAI,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,GAAG,EAAE,WAAW,QAAQ,QAAQ;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cACP,WAC0C;AAC1C,MAAI,UAAU,KAAK,SAAS,UAAU;AACpC;AAAA,MACE,UAAU,MAAM,SAAS;AAAA,MACzB,MACE,yDAAyD,UAAU,MAAM,IAAI;AAAA,IAAA;AAEjF,WAAO,EAAC,MAAM,UAAU,KAAK,MAAM,OAAO,UAAU,MAAM,MAAA;AAAA,EAC5D;AAEA,SAAO;AACT;"}
|
|
1
|
+
{"version":3,"file":"constraint.js","sources":["../../../../../zql/src/ivm/constraint.ts"],"sourcesContent":["import {assert} from '../../../shared/src/asserts.ts';\nimport {stringCompare} from '../../../shared/src/string-compare.ts';\nimport type {Writable} from '../../../shared/src/writable.ts';\nimport type {\n Condition,\n SimpleCondition,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../../zero-protocol/src/primary-key.ts';\nimport {valuesEqual} from './data.ts';\n\nexport type Constraint = {\n readonly [key: string]: Value;\n};\n\nexport function constraintMatchesRow(\n constraint: Constraint,\n row: Row,\n): boolean {\n for (const key in constraint) {\n if (!valuesEqual(row[key], constraint[key])) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Constraints are compatible if:\n * 1. They do not have any keys in common\n * 2. They have keys in common, but the values for those keys are equal\n */\nexport function constraintsAreCompatible(\n left: Constraint,\n right: Constraint,\n): boolean {\n for (const key in left) {\n if (key in right && !valuesEqual(left[key], right[key])) {\n return false;\n }\n }\n return true;\n}\n\nexport function constraintMatchesPrimaryKey(\n constraint: Constraint,\n primary: PrimaryKey,\n): boolean {\n return keyMatchesPrimaryKey(Object.keys(constraint), primary);\n}\n\nexport function keyMatchesPrimaryKey(\n key: Iterable<string>,\n primary: PrimaryKey,\n): boolean {\n const constraintKeys = [...key];\n\n if (constraintKeys.length !== primary.length) {\n return false;\n }\n\n // Primary key is always sorted\n // Constraint does not have to be sorted\n constraintKeys.sort(stringCompare);\n\n for (let i = 0; i < constraintKeys.length; i++) {\n if (constraintKeys[i] !== primary[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Pulls top level `and` components out of a condition tree.\n * The resulting array of simple conditions would match a superset of\n * values that the original condition would match.\n *\n * Examples:\n * a AND b OR c\n *\n * In this case we cannot pull anything because the `or` is at the top level.\n *\n * a AND b AND c\n * We can pull all three.\n *\n * a AND (b OR c)\n * We can only pull `a`.\n */\nexport function pullSimpleAndComponents(\n condition: Condition,\n): SimpleCondition[] {\n if (condition.type === 'and') {\n return condition.conditions.flatMap(pullSimpleAndComponents);\n }\n\n if (condition.type === 'simple') {\n return [condition];\n }\n\n if (condition.type === 'or' && condition.conditions.length === 1) {\n return pullSimpleAndComponents(condition.conditions[0]);\n }\n\n return [];\n}\n\n/**\n * Checks if the supplied filters constitute a primary key lookup.\n * If so, returns the constraint that would be used to look up the primary key.\n * If not, returns undefined.\n */\nexport function primaryKeyConstraintFromFilters(\n condition: Condition | undefined,\n primary: PrimaryKey,\n): Constraint | undefined {\n if (condition === undefined) {\n return undefined;\n }\n\n const conditions = pullSimpleAndComponents(condition);\n if (conditions.length === 0) {\n return undefined;\n }\n\n const ret: Writable<Constraint> = {};\n for (const subCondition of conditions) {\n if (subCondition.op === '=') {\n const column = extractColumn(subCondition);\n if (column !== undefined) {\n if (!primary.includes(column.name)) {\n continue;\n }\n ret[column.name] = column.value;\n }\n }\n }\n\n if (Object.keys(ret).length !== primary.length) {\n return undefined;\n }\n\n return ret;\n}\n\nfunction extractColumn(\n condition: SimpleCondition,\n): {name: string; value: Value} | undefined {\n if (condition.left.type === 'column') {\n assert(\n condition.right.type === 'literal',\n () =>\n `extractColumn: expected right side to be literal, got ${condition.right.type}`,\n );\n return {name: condition.left.name, value: condition.right.value};\n }\n\n return undefined;\n}\n\ndeclare const TESTING: boolean;\n\nexport class SetOfConstraint {\n #data: Constraint[] = [];\n\n constructor() {\n // Only used in testing\n assert(TESTING, 'SetOfConstraint is only available in testing');\n }\n\n #indexOf(value: Constraint): number {\n return this.#data.findIndex(v => constraintEquals(v, value));\n }\n\n has(value: Constraint): boolean {\n return this.#indexOf(value) !== -1;\n }\n\n add(value: Constraint): this {\n if (!this.has(value)) {\n this.#data.push(value);\n }\n return this;\n }\n}\n\nfunction constraintEquals(a: Constraint, b: Constraint): boolean {\n const aEntries = Object.entries(a);\n const bEntries = Object.entries(b);\n if (aEntries.length !== bEntries.length) {\n return false;\n }\n for (let i = 0; i < aEntries.length; i++) {\n if (\n aEntries[i][0] !== bEntries[i][0] ||\n !valuesEqual(aEntries[i][1], bEntries[i][1])\n ) {\n return false;\n }\n }\n return true;\n}\n"],"names":[],"mappings":";;;AAeO,SAAS,qBACd,YACA,KACS;AACT,aAAW,OAAO,YAAY;AAC5B,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG,WAAW,GAAG,CAAC,GAAG;AAC3C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,yBACd,MACA,OACS;AACT,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,SAAS,CAAC,YAAY,KAAK,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,4BACd,YACA,SACS;AACT,SAAO,qBAAqB,OAAO,KAAK,UAAU,GAAG,OAAO;AAC9D;AAEO,SAAS,qBACd,KACA,SACS;AACT,QAAM,iBAAiB,CAAC,GAAG,GAAG;AAE9B,MAAI,eAAe,WAAW,QAAQ,QAAQ;AAC5C,WAAO;AAAA,EACT;AAIA,iBAAe,KAAK,aAAa;AAEjC,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,QAAI,eAAe,CAAC,MAAM,QAAQ,CAAC,GAAG;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAkBO,SAAS,wBACd,WACmB;AACnB,MAAI,UAAU,SAAS,OAAO;AAC5B,WAAO,UAAU,WAAW,QAAQ,uBAAuB;AAAA,EAC7D;AAEA,MAAI,UAAU,SAAS,UAAU;AAC/B,WAAO,CAAC,SAAS;AAAA,EACnB;AAEA,MAAI,UAAU,SAAS,QAAQ,UAAU,WAAW,WAAW,GAAG;AAChE,WAAO,wBAAwB,UAAU,WAAW,CAAC,CAAC;AAAA,EACxD;AAEA,SAAO,CAAA;AACT;AAOO,SAAS,gCACd,WACA,SACwB;AACxB,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,wBAAwB,SAAS;AACpD,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,MAA4B,CAAA;AAClC,aAAW,gBAAgB,YAAY;AACrC,QAAI,aAAa,OAAO,KAAK;AAC3B,YAAM,SAAS,cAAc,YAAY;AACzC,UAAI,WAAW,QAAW;AACxB,YAAI,CAAC,QAAQ,SAAS,OAAO,IAAI,GAAG;AAClC;AAAA,QACF;AACA,YAAI,OAAO,IAAI,IAAI,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,GAAG,EAAE,WAAW,QAAQ,QAAQ;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cACP,WAC0C;AAC1C,MAAI,UAAU,KAAK,SAAS,UAAU;AACpC;AAAA,MACE,UAAU,MAAM,SAAS;AAAA,MACzB,MACE,yDAAyD,UAAU,MAAM,IAAI;AAAA,IAAA;AAEjF,WAAO,EAAC,MAAM,UAAU,KAAK,MAAM,OAAO,UAAU,MAAM,MAAA;AAAA,EAC5D;AAEA,SAAO;AACT;"}
|