diff --git a/packages/metadata-protocol/src/protocol.delete-rewrap-envelope.test.ts b/packages/metadata-protocol/src/protocol.delete-rewrap-envelope.test.ts index 144c66c4bf..ee8ea711ff 100644 --- a/packages/metadata-protocol/src/protocol.delete-rewrap-envelope.test.ts +++ b/packages/metadata-protocol/src/protocol.delete-rewrap-envelope.test.ts @@ -134,6 +134,7 @@ const seedRow = (type: string, name: string): Row => ({ const matchesWhere = (row: Record, where: Record) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v === null || v === undefined) return row[k] === null || row[k] === undefined; return row[k] === v; }); diff --git a/packages/metadata-protocol/src/protocol.duplicate-package-bundle-key.test.ts b/packages/metadata-protocol/src/protocol.duplicate-package-bundle-key.test.ts index e99a199b69..35ae2e3e1f 100644 --- a/packages/metadata-protocol/src/protocol.duplicate-package-bundle-key.test.ts +++ b/packages/metadata-protocol/src/protocol.duplicate-package-bundle-key.test.ts @@ -94,6 +94,7 @@ function matches(r: Record, where: Record): boolea if (!clauses.some((c) => matches(r, c))) return false; continue; } + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if ((r[k] ?? null) !== v) return false; } return true; diff --git a/packages/metadata-protocol/src/protocol.flow-canonicalizer.test.ts b/packages/metadata-protocol/src/protocol.flow-canonicalizer.test.ts index 1f4e9c9800..d8bcaf4384 100644 --- a/packages/metadata-protocol/src/protocol.flow-canonicalizer.test.ts +++ b/packages/metadata-protocol/src/protocol.flow-canonicalizer.test.ts @@ -58,6 +58,7 @@ const canonicalizeStoredFlow = (_name: string, body: any) => { function matches(r: Record, where: Record): boolean { for (const [k, v] of Object.entries(where)) { if (v === undefined) continue; + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if ((r[k] ?? null) !== v) return false; } return true; diff --git a/packages/metadata-protocol/src/protocol.legacy-overlay-delete.test.ts b/packages/metadata-protocol/src/protocol.legacy-overlay-delete.test.ts index f2942167a4..45ec7cd641 100644 --- a/packages/metadata-protocol/src/protocol.legacy-overlay-delete.test.ts +++ b/packages/metadata-protocol/src/protocol.legacy-overlay-delete.test.ts @@ -152,6 +152,7 @@ const seedRow = (type: string, name: string): Row => ({ const matchesWhere = (row: Record, where: Record) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v === null || v === undefined) return row[k] === null || row[k] === undefined; return row[k] === v; }); diff --git a/packages/metadata-protocol/src/protocol.stored-migration.test.ts b/packages/metadata-protocol/src/protocol.stored-migration.test.ts index 4ef122a143..7dd9d2a2a7 100644 --- a/packages/metadata-protocol/src/protocol.stored-migration.test.ts +++ b/packages/metadata-protocol/src/protocol.stored-migration.test.ts @@ -43,6 +43,7 @@ interface Row { function matches(r: Record, where: Record): boolean { for (const [k, v] of Object.entries(where)) { if (v === undefined) continue; + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if ((r[k] ?? null) !== v) return false; } return true; diff --git a/packages/metadata-protocol/src/sys-metadata-repository.draft-drain.test.ts b/packages/metadata-protocol/src/sys-metadata-repository.draft-drain.test.ts index 02c903a5b4..2218f4c9fe 100644 --- a/packages/metadata-protocol/src/sys-metadata-repository.draft-drain.test.ts +++ b/packages/metadata-protocol/src/sys-metadata-repository.draft-drain.test.ts @@ -80,7 +80,10 @@ function makeFakeEngine() { }; const matchesHistory = (h: Row, where: Record): boolean => - Object.entries(where).every(([k, v]) => v === undefined || h[k] === v); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === undefined || h[k] === v; + }); return { rows, diff --git a/packages/metadata-protocol/src/sys-metadata-repository.history-counters.test.ts b/packages/metadata-protocol/src/sys-metadata-repository.history-counters.test.ts index 428f04beac..17e69696f1 100644 --- a/packages/metadata-protocol/src/sys-metadata-repository.history-counters.test.ts +++ b/packages/metadata-protocol/src/sys-metadata-repository.history-counters.test.ts @@ -94,7 +94,10 @@ function makeFakeEngine() { }; const matchesHistory = (h: Row, where: Record): boolean => - Object.entries(where).every(([k, v]) => v === undefined || h[k] === v); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === undefined || h[k] === v; + }); return { rows, diff --git a/packages/metadata-protocol/src/sys-metadata-repository.package-writability.test.ts b/packages/metadata-protocol/src/sys-metadata-repository.package-writability.test.ts index 1c423ec085..877c1c053a 100644 --- a/packages/metadata-protocol/src/sys-metadata-repository.package-writability.test.ts +++ b/packages/metadata-protocol/src/sys-metadata-repository.package-writability.test.ts @@ -105,7 +105,10 @@ function makeFakeEngine() { }; const matchesHistory = (h: Row, where: Record): boolean => - Object.entries(where).every(([k, v]) => v === undefined || h[k] === v); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === undefined || h[k] === v; + }); return { rows, diff --git a/packages/metadata-protocol/src/sys-metadata-repository.recorded-by.test.ts b/packages/metadata-protocol/src/sys-metadata-repository.recorded-by.test.ts index 3eadcc5cac..7207b528b4 100644 --- a/packages/metadata-protocol/src/sys-metadata-repository.recorded-by.test.ts +++ b/packages/metadata-protocol/src/sys-metadata-repository.recorded-by.test.ts @@ -52,7 +52,10 @@ function makeFakeEngine() { }; const matchesHistory = (h: Row, where: Record): boolean => - Object.entries(where).every(([k, v]) => v === undefined || h[k] === v); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === undefined || h[k] === v; + }); return { rows, diff --git a/packages/objectql/src/adr0104-attestation-evidence.test.ts b/packages/objectql/src/adr0104-attestation-evidence.test.ts index d380d13156..9d790254d5 100644 --- a/packages/objectql/src/adr0104-attestation-evidence.test.ts +++ b/packages/objectql/src/adr0104-attestation-evidence.test.ts @@ -50,7 +50,10 @@ function rowsOf(store: Store, object: string): Array> { function makeDriver(store: Store, stats: { created: number; existing: number }): IDataDriver { const matches = (row: Record, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]) => row[k] === v); + return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row[k] === v; + }); }; return { name: 'default', diff --git a/packages/objectql/src/adr0104-lax-deviation-marker.test.ts b/packages/objectql/src/adr0104-lax-deviation-marker.test.ts index ded5ff361a..cd26d98c81 100644 --- a/packages/objectql/src/adr0104-lax-deviation-marker.test.ts +++ b/packages/objectql/src/adr0104-lax-deviation-marker.test.ts @@ -63,7 +63,10 @@ interface DriverProbe { function makeDriver(store: Store, probe: DriverProbe): IDataDriver { const matches = (row: Record, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]) => row[k] === v); + return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row[k] === v; + }); }; return { name: 'default', diff --git a/packages/objectql/src/engine-readonly-strict-writes.test.ts b/packages/objectql/src/engine-readonly-strict-writes.test.ts index 0687f95ffc..1e8e391b8b 100644 --- a/packages/objectql/src/engine-readonly-strict-writes.test.ts +++ b/packages/objectql/src/engine-readonly-strict-writes.test.ts @@ -39,7 +39,10 @@ function makeDriver() { }; const matches = (row: any, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]: [string, any]) => row?.[k] === v); + return Object.entries(where).every(([k, v]: [string, any]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row?.[k] === v; + }); }; let n = 0; const driver: any = { diff --git a/packages/objectql/src/engine-readonly-strip-caller-values.test.ts b/packages/objectql/src/engine-readonly-strip-caller-values.test.ts index 568c1ad7be..34feb711b3 100644 --- a/packages/objectql/src/engine-readonly-strip-caller-values.test.ts +++ b/packages/objectql/src/engine-readonly-strip-caller-values.test.ts @@ -43,7 +43,10 @@ function makeDriver() { }; const matches = (row: any, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]: [string, any]) => row?.[k] === v); + return Object.entries(where).every(([k, v]: [string, any]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row?.[k] === v; + }); }; let n = 0; const driver: any = { diff --git a/packages/objectql/src/engine-readonly-strip-signal.test.ts b/packages/objectql/src/engine-readonly-strip-signal.test.ts index e7061f9d3e..811e00fa89 100644 --- a/packages/objectql/src/engine-readonly-strip-signal.test.ts +++ b/packages/objectql/src/engine-readonly-strip-signal.test.ts @@ -51,7 +51,10 @@ function makeDriver() { }; const matches = (row: any, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]: [string, any]) => row?.[k] === v); + return Object.entries(where).every(([k, v]: [string, any]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row?.[k] === v; + }); }; let n = 0; const driver: any = { diff --git a/packages/objectql/src/engine-summary-recompute-context.test.ts b/packages/objectql/src/engine-summary-recompute-context.test.ts index 0a6de2cd63..49f17447a1 100644 --- a/packages/objectql/src/engine-summary-recompute-context.test.ts +++ b/packages/objectql/src/engine-summary-recompute-context.test.ts @@ -84,6 +84,7 @@ function makeDriver() { if (!where || typeof where !== 'object') return true; return Object.entries(where).every(([k, v]) => { if (k === '$and') return (v as any[]).every((sub) => matches(row, sub)); + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); return row?.[k] === v; }); }; diff --git a/packages/objectql/src/engine-summary-retry.test.ts b/packages/objectql/src/engine-summary-retry.test.ts index 803d7df570..ec56ff2927 100644 --- a/packages/objectql/src/engine-summary-retry.test.ts +++ b/packages/objectql/src/engine-summary-retry.test.ts @@ -17,7 +17,10 @@ function makeDriver(opts: { onParentUpdate?: (parentId: string, callN: number) = }; const matches = (row: any, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]) => row?.[k] === v); + return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row?.[k] === v; + }); }; const parentCalls = new Map(); let n = 0; diff --git a/packages/objectql/src/package-disable-enforcement.test.ts b/packages/objectql/src/package-disable-enforcement.test.ts index beb735bbef..645e683f80 100644 --- a/packages/objectql/src/package-disable-enforcement.test.ts +++ b/packages/objectql/src/package-disable-enforcement.test.ts @@ -83,6 +83,7 @@ const rowKey = (w: Record) => const matchesWhere = (row: Record, where: Record) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v === null) return row[k] === null || row[k] === undefined; return row[k] === v; }); diff --git a/packages/objectql/src/protocol-delete-object-registry-heal.test.ts b/packages/objectql/src/protocol-delete-object-registry-heal.test.ts index be8706f119..e1302e373e 100644 --- a/packages/objectql/src/protocol-delete-object-registry-heal.test.ts +++ b/packages/objectql/src/protocol-delete-object-registry-heal.test.ts @@ -57,6 +57,7 @@ const rowKey = (w: Record) => const matchesWhere = (row: Record, where: Record) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v === null) return row[k] === null || row[k] === undefined; return row[k] === v; }); diff --git a/packages/objectql/src/protocol-object-overlay-layer.test.ts b/packages/objectql/src/protocol-object-overlay-layer.test.ts index c15bfee983..a032ecd3c6 100644 --- a/packages/objectql/src/protocol-object-overlay-layer.test.ts +++ b/packages/objectql/src/protocol-object-overlay-layer.test.ts @@ -82,6 +82,7 @@ const rowKey = (w: Record) => const matchesWhere = (row: Record, where: Record) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v === null) return row[k] === null || row[k] === undefined; return row[k] === v; }); diff --git a/packages/objectql/src/protocol-packaged-object-base.test.ts b/packages/objectql/src/protocol-packaged-object-base.test.ts index d13b581ac0..cc1028b967 100644 --- a/packages/objectql/src/protocol-packaged-object-base.test.ts +++ b/packages/objectql/src/protocol-packaged-object-base.test.ts @@ -41,6 +41,7 @@ const rowKey = (w: Record) => const matchesWhere = (row: Record, where: Record) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v === null) return row[k] === null || row[k] === undefined; return row[k] === v; }); diff --git a/packages/plugins/plugin-approvals/src/approval-actor-impersonation.test.ts b/packages/plugins/plugin-approvals/src/approval-actor-impersonation.test.ts index 26d2a834dc..3a99b922ca 100644 --- a/packages/plugins/plugin-approvals/src/approval-actor-impersonation.test.ts +++ b/packages/plugins/plugin-approvals/src/approval-actor-impersonation.test.ts @@ -44,6 +44,7 @@ function makeFakeEngine() { if (!(v as any[]).some(sub => matches(row, sub))) return false; continue; } + if (k.startsWith('$')) throw new Error(`fake engine: unsupported filter operator ${k}`); const rv = row[k]; if (v != null && typeof v === 'object' && '$in' in (v as any)) { if (!(v as any).$in.includes(rv)) return false; diff --git a/packages/plugins/plugin-approvals/src/approval-node.test.ts b/packages/plugins/plugin-approvals/src/approval-node.test.ts index 3edae36f16..31620a12aa 100644 --- a/packages/plugins/plugin-approvals/src/approval-node.test.ts +++ b/packages/plugins/plugin-approvals/src/approval-node.test.ts @@ -19,6 +19,7 @@ function makeFakeEngine() { const tables = new Map(); const rows = (o: string) => (tables.get(o) ?? (tables.set(o, []), tables.get(o)!)); const matches = (row: any, where: any) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake engine: unsupported filter operator ${k}`); if (v && typeof v === 'object' && '$in' in (v as any)) return (v as any).$in.includes(row[k]); if (v && typeof v === 'object' && '$ne' in (v as any)) return row[k] !== (v as any).$ne; return row[k] === v; diff --git a/packages/plugins/plugin-approvals/src/approval-override-audit.test.ts b/packages/plugins/plugin-approvals/src/approval-override-audit.test.ts index 6896f0e680..2cdec9fd0d 100644 --- a/packages/plugins/plugin-approvals/src/approval-override-audit.test.ts +++ b/packages/plugins/plugin-approvals/src/approval-override-audit.test.ts @@ -35,6 +35,7 @@ function makeFakeEngine() { if (!(v as any[]).some(sub => matches(row, sub))) return false; continue; } + if (k.startsWith('$')) throw new Error(`fake engine: unsupported filter operator ${k}`); const rv = row[k]; if (v != null && typeof v === 'object' && '$in' in (v as any)) { if (!(v as any).$in.includes(rv)) return false; diff --git a/packages/plugins/plugin-approvals/src/approval-restart-resume.test.ts b/packages/plugins/plugin-approvals/src/approval-restart-resume.test.ts index b0d3319f71..cb4ed8c46b 100644 --- a/packages/plugins/plugin-approvals/src/approval-restart-resume.test.ts +++ b/packages/plugins/plugin-approvals/src/approval-restart-resume.test.ts @@ -39,6 +39,7 @@ function makeFakeEngine() { const tables = new Map(); const rows = (o: string) => (tables.get(o) ?? (tables.set(o, []), tables.get(o)!)); const matches = (row: any, where: any) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake engine: unsupported filter operator ${k}`); if (v && typeof v === 'object' && '$in' in (v as any)) return (v as any).$in.includes(row[k]); if (v && typeof v === 'object' && '$ne' in (v as any)) return row[k] !== (v as any).$ne; return row[k] === v; diff --git a/packages/plugins/plugin-approvals/src/approval-revise.test.ts b/packages/plugins/plugin-approvals/src/approval-revise.test.ts index a975a9157e..5e2491b80a 100644 --- a/packages/plugins/plugin-approvals/src/approval-revise.test.ts +++ b/packages/plugins/plugin-approvals/src/approval-revise.test.ts @@ -37,6 +37,7 @@ function makeFakeEngine() { const tables = new Map(); const rows = (o: string) => (tables.get(o) ?? (tables.set(o, []), tables.get(o)!)); const matches = (row: any, where: any) => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake engine: unsupported filter operator ${k}`); if (v && typeof v === 'object' && '$in' in (v as any)) return (v as any).$in.includes(row[k]); if (v && typeof v === 'object' && '$ne' in (v as any)) return row[k] !== (v as any).$ne; return row[k] === v; diff --git a/packages/plugins/plugin-approvals/src/approver-cross-org.integration.test.ts b/packages/plugins/plugin-approvals/src/approver-cross-org.integration.test.ts index f85f296448..35c7772824 100644 --- a/packages/plugins/plugin-approvals/src/approver-cross-org.integration.test.ts +++ b/packages/plugins/plugin-approvals/src/approver-cross-org.integration.test.ts @@ -29,6 +29,7 @@ function makeEngine(seed: Record = {}) { if (!(v as any[]).some((sub) => matches(row, sub))) return false; continue; } + if (k.startsWith('$')) throw new Error(`fake engine: unsupported filter operator ${k}`); const rv = row[k]; if (v != null && typeof v === 'object' && '$in' in (v as any)) { if (!(v as any).$in.includes(rv)) return false; diff --git a/packages/plugins/plugin-approvals/src/stranded-request-inspection.test.ts b/packages/plugins/plugin-approvals/src/stranded-request-inspection.test.ts index 4277ff717a..3bdfba01de 100644 --- a/packages/plugins/plugin-approvals/src/stranded-request-inspection.test.ts +++ b/packages/plugins/plugin-approvals/src/stranded-request-inspection.test.ts @@ -30,6 +30,7 @@ function makeFakeEngine() { function matches(row: FakeRow, filter: any): boolean { if (!filter || typeof filter !== 'object') return true; for (const [k, v] of Object.entries(filter)) { + if (k.startsWith('$')) throw new Error(`fake engine: unsupported filter operator ${k}`); const rv = row[k]; if (v != null && typeof v === 'object' && '$in' in (v as any)) { if (!(v as any).$in.includes(rv)) return false; diff --git a/packages/plugins/plugin-auth/src/accept-invitation-adopt-membership.test.ts b/packages/plugins/plugin-auth/src/accept-invitation-adopt-membership.test.ts index 6706928781..3d0e4a1b3e 100644 --- a/packages/plugins/plugin-auth/src/accept-invitation-adopt-membership.test.ts +++ b/packages/plugins/plugin-auth/src/accept-invitation-adopt-membership.test.ts @@ -48,6 +48,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/auth-manager.jwt-eddsa-fallback.test.ts b/packages/plugins/plugin-auth/src/auth-manager.jwt-eddsa-fallback.test.ts index 727f01fb80..69a631d6fd 100644 --- a/packages/plugins/plugin-auth/src/auth-manager.jwt-eddsa-fallback.test.ts +++ b/packages/plugins/plugin-auth/src/auth-manager.jwt-eddsa-fallback.test.ts @@ -27,6 +27,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/auth-manager.optional-plugin-isolation.test.ts b/packages/plugins/plugin-auth/src/auth-manager.optional-plugin-isolation.test.ts index 5e1dc39840..1f2f533fd1 100644 --- a/packages/plugins/plugin-auth/src/auth-manager.optional-plugin-isolation.test.ts +++ b/packages/plugins/plugin-auth/src/auth-manager.optional-plugin-isolation.test.ts @@ -61,6 +61,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/auth-plugin.test.ts b/packages/plugins/plugin-auth/src/auth-plugin.test.ts index 87a16cfb57..78b8085424 100644 --- a/packages/plugins/plugin-auth/src/auth-plugin.test.ts +++ b/packages/plugins/plugin-auth/src/auth-plugin.test.ts @@ -1018,7 +1018,10 @@ describe('AuthPlugin', () => { sys_organization: [], }; const matches = (row: any, where: any) => - Object.entries(where ?? {}).every(([k, v]) => (v === null ? row[k] == null : row[k] === v)); + Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === null ? row[k] == null : row[k] === v; + }); return { tables, registerMiddleware: (mw: any) => middlewares.push(mw), @@ -1131,7 +1134,10 @@ describe('AuthPlugin', () => { sys_organization: [], }; const matches = (row: any, where: any) => - Object.entries(where ?? {}).every(([k, v]) => (v === null ? row[k] == null : row[k] === v)); + Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === null ? row[k] == null : row[k] === v; + }); return { tables, registerMiddleware: vi.fn(), diff --git a/packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.ts b/packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.ts index dc47dc7986..0de3f5b60a 100644 --- a/packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.ts +++ b/packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.ts @@ -75,6 +75,7 @@ function createMemoryEngine() { : a === b; const matches = (row: MemoryRow, where: Record = {}): boolean => Object.entries(where).every(([key, expected]) => { + if (key.startsWith('$')) throw new Error(`fake driver: unsupported operator ${key}`); const actual = row[key]; if (expected && typeof expected === 'object' && !Array.isArray(expected) && !(expected instanceof Date)) { const operators = expected as Record; diff --git a/packages/plugins/plugin-auth/src/ensure-default-organization.test.ts b/packages/plugins/plugin-auth/src/ensure-default-organization.test.ts index 52367d8f5f..5524cbea22 100644 --- a/packages/plugins/plugin-auth/src/ensure-default-organization.test.ts +++ b/packages/plugins/plugin-auth/src/ensure-default-organization.test.ts @@ -20,7 +20,10 @@ function makeQl(seed: Partial> = {}) { ...seed, }; const matches = (row: Row, where: Row) => - Object.entries(where ?? {}).every(([k, v]) => (v === null ? row[k] == null : row[k] === v)); + Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === null ? row[k] == null : row[k] === v; + }); return { tables, find: vi.fn(async (object: string, q: any) => diff --git a/packages/plugins/plugin-auth/src/impersonation-bearer-rotation.test.ts b/packages/plugins/plugin-auth/src/impersonation-bearer-rotation.test.ts index cd7844c46c..c4efabc696 100644 --- a/packages/plugins/plugin-auth/src/impersonation-bearer-rotation.test.ts +++ b/packages/plugins/plugin-auth/src/impersonation-bearer-rotation.test.ts @@ -50,6 +50,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/org-create-posture-gate.test.ts b/packages/plugins/plugin-auth/src/org-create-posture-gate.test.ts index aaab024bed..3e7803b19e 100644 --- a/packages/plugins/plugin-auth/src/org-create-posture-gate.test.ts +++ b/packages/plugins/plugin-auth/src/org-create-posture-gate.test.ts @@ -82,6 +82,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/remove-member-permission-guard.test.ts b/packages/plugins/plugin-auth/src/remove-member-permission-guard.test.ts index 3ce7307ec6..ecf92c229a 100644 --- a/packages/plugins/plugin-auth/src/remove-member-permission-guard.test.ts +++ b/packages/plugins/plugin-auth/src/remove-member-permission-guard.test.ts @@ -96,6 +96,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/remove-user-atomicity.test.ts b/packages/plugins/plugin-auth/src/remove-user-atomicity.test.ts index cfddec746f..ca4ebfa6d8 100644 --- a/packages/plugins/plugin-auth/src/remove-user-atomicity.test.ts +++ b/packages/plugins/plugin-auth/src/remove-user-atomicity.test.ts @@ -101,6 +101,7 @@ const createMemoryEngine = (vetoUserDelete?: () => Error | undefined) => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/session-of-record.test.ts b/packages/plugins/plugin-auth/src/session-of-record.test.ts index be8f357b6f..69d14a9cd8 100644 --- a/packages/plugins/plugin-auth/src/session-of-record.test.ts +++ b/packages/plugins/plugin-auth/src/session-of-record.test.ts @@ -57,6 +57,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-auth/src/session-tombstone.test.ts b/packages/plugins/plugin-auth/src/session-tombstone.test.ts index 94251cc842..bfe22c8eb8 100644 --- a/packages/plugins/plugin-auth/src/session-tombstone.test.ts +++ b/packages/plugins/plugin-auth/src/session-tombstone.test.ts @@ -62,6 +62,7 @@ const createMemoryEngine = () => { : a === b; const matches = (row: any, where: Record = {}) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const actual = row[k]; if (v && typeof v === 'object' && !Array.isArray(v) && !(v instanceof Date)) { if ('$ne' in v) return !eq(actual, v.$ne); diff --git a/packages/plugins/plugin-email/src/email-plugin.attachment-storage.test.ts b/packages/plugins/plugin-email/src/email-plugin.attachment-storage.test.ts index ec95473315..3c45ffa076 100644 --- a/packages/plugins/plugin-email/src/email-plugin.attachment-storage.test.ts +++ b/packages/plugins/plugin-email/src/email-plugin.attachment-storage.test.ts @@ -42,6 +42,7 @@ function fakeEngine() { const rowsOf = (t: string) => tables.get(t) ?? []; const matches = (row: any, where: Record) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && !Array.isArray(v)) { return Object.entries(v).every(([op, target]) => { if (op === '$lt') return row[k] < (target as any); diff --git a/packages/plugins/plugin-email/src/email-plugin.outbox-sweep.test.ts b/packages/plugins/plugin-email/src/email-plugin.outbox-sweep.test.ts index e98006df26..8f7056b9d3 100644 --- a/packages/plugins/plugin-email/src/email-plugin.outbox-sweep.test.ts +++ b/packages/plugins/plugin-email/src/email-plugin.outbox-sweep.test.ts @@ -51,6 +51,7 @@ function fakeEngine(opts: EngineOpts = {}) { const rowsOf = (t: string) => tables.get(t) ?? []; const matches = (row: any, where: Record) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && !Array.isArray(v)) { return Object.entries(v).every(([op, target]) => { if (op === '$lt') return row[k] < (target as any); diff --git a/packages/plugins/plugin-email/src/email-plugin.queue-delivery.test.ts b/packages/plugins/plugin-email/src/email-plugin.queue-delivery.test.ts index cd9254c452..f83b4a59a6 100644 --- a/packages/plugins/plugin-email/src/email-plugin.queue-delivery.test.ts +++ b/packages/plugins/plugin-email/src/email-plugin.queue-delivery.test.ts @@ -50,7 +50,10 @@ function fakeEngine() { const tables = new Map(); const rowsOf = (t: string) => tables.get(t) ?? []; const matches = (row: any, where: Record) => - Object.entries(where).every(([k, v]) => row[k] === v); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row[k] === v; + }); return { tables, rows: (t: string) => [...rowsOf(t)], diff --git a/packages/plugins/plugin-email/src/email-plugin.template-runtime-write.test.ts b/packages/plugins/plugin-email/src/email-plugin.template-runtime-write.test.ts index ba0e120e65..66c6342d84 100644 --- a/packages/plugins/plugin-email/src/email-plugin.template-runtime-write.test.ts +++ b/packages/plugins/plugin-email/src/email-plugin.template-runtime-write.test.ts @@ -43,7 +43,11 @@ type AnyRecord = Record; function fakeEngine(seed: AnyRecord[] = []) { const rows: AnyRecord[] = seed.map((r) => ({ ...r })); const matches = (row: AnyRecord, cond?: AnyRecord) => - !cond || Object.entries(cond).every(([k, v]) => row[k] === v); + !cond || + Object.entries(cond).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row[k] === v; + }); return { rows, _registry: { listItems: () => [] }, diff --git a/packages/plugins/plugin-email/src/outbox-sweep.test.ts b/packages/plugins/plugin-email/src/outbox-sweep.test.ts index a5c3138732..76d179af19 100644 --- a/packages/plugins/plugin-email/src/outbox-sweep.test.ts +++ b/packages/plugins/plugin-email/src/outbox-sweep.test.ts @@ -41,10 +41,11 @@ function fakeEngine(seed: RowSeed[]) { const rows = seed.map((r) => ({ status: 'queued', ...r }) as Record); const matches = (row: any, where: Record) => Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && !Array.isArray(v)) { return Object.entries(v).every(([op, target]) => { if (op === '$lt') return row[k] < (target as any); - throw new Error(`fakeEngine: unsupported operator ${op}`); + throw new Error(`fake driver: unsupported operator ${op}`); }); } return row[k] === v; diff --git a/packages/plugins/plugin-hono-server/src/current-user-endpoints-additive-baseline.test.ts b/packages/plugins/plugin-hono-server/src/current-user-endpoints-additive-baseline.test.ts index f1f21b3a2e..0d851de15d 100644 --- a/packages/plugins/plugin-hono-server/src/current-user-endpoints-additive-baseline.test.ts +++ b/packages/plugins/plugin-hono-server/src/current-user-endpoints-additive-baseline.test.ts @@ -61,6 +61,7 @@ type Row = Record; function matches(row: Row, where: Row | undefined): boolean { return Object.entries(where ?? {}).every(([key, cond]) => { + if (key.startsWith('$')) throw new Error(`fake driver: unsupported operator ${key}`); const value = row[key] ?? null; if (cond && typeof cond === 'object' && Array.isArray((cond as any).$in)) { return (cond as any).$in.includes(value); diff --git a/packages/plugins/plugin-hono-server/src/current-user-endpoints-position-grants.test.ts b/packages/plugins/plugin-hono-server/src/current-user-endpoints-position-grants.test.ts index 07fb75a987..d2cffc291e 100644 --- a/packages/plugins/plugin-hono-server/src/current-user-endpoints-position-grants.test.ts +++ b/packages/plugins/plugin-hono-server/src/current-user-endpoints-position-grants.test.ts @@ -46,6 +46,7 @@ type Row = Record; /** `where` matcher: scalar equality plus the `$in` form both resolvers use. */ function matches(row: Row, where: Row | undefined): boolean { return Object.entries(where ?? {}).every(([key, cond]) => { + if (key.startsWith('$')) throw new Error(`fake driver: unsupported operator ${key}`); const value = row[key] ?? null; if (cond && typeof cond === 'object' && Array.isArray((cond as any).$in)) { return (cond as any).$in.includes(value); diff --git a/packages/plugins/plugin-reports/src/report-export-axis.test.ts b/packages/plugins/plugin-reports/src/report-export-axis.test.ts index 0d801603d5..cef177423b 100644 --- a/packages/plugins/plugin-reports/src/report-export-axis.test.ts +++ b/packages/plugins/plugin-reports/src/report-export-axis.test.ts @@ -21,7 +21,10 @@ function makeFakeEngine() { const ensure = (n: string) => (tables[n] ??= []); const matches = (row: any, filter: any): boolean => { if (!filter || typeof filter !== 'object') return true; - for (const [k, v] of Object.entries(filter)) if (row[k] !== v) return false; + for (const [k, v] of Object.entries(filter)) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + if (row[k] !== v) return false; + } return true; }; return { diff --git a/packages/plugins/plugin-reports/src/report-service.test.ts b/packages/plugins/plugin-reports/src/report-service.test.ts index 3b87e83d43..70d1b8c521 100644 --- a/packages/plugins/plugin-reports/src/report-service.test.ts +++ b/packages/plugins/plugin-reports/src/report-service.test.ts @@ -14,6 +14,7 @@ function makeFakeEngine() { function matches(row: FakeRow, filter: any): boolean { if (!filter || typeof filter !== 'object') return true; for (const [k, v] of Object.entries(filter)) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (row[k] !== v) return false; } return true; diff --git a/packages/plugins/plugin-security/src/auto-org-admin-grant.test.ts b/packages/plugins/plugin-security/src/auto-org-admin-grant.test.ts index 3c85849d0a..c7ae4aff14 100644 --- a/packages/plugins/plugin-security/src/auto-org-admin-grant.test.ts +++ b/packages/plugins/plugin-security/src/auto-org-admin-grant.test.ts @@ -110,6 +110,7 @@ function makeStub(seed: { const matches = (row: any, where: any) => { for (const [k, v] of Object.entries(where ?? {})) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); // `$in` — the ADR-0105 D4 backfill sweeps BOTH org-admin variants in one read. if (v && typeof v === 'object' && Array.isArray((v as any).$in)) { if (!(v as any).$in.includes(row[k])) return false; diff --git a/packages/plugins/plugin-security/src/delegated-admin-gate.test.ts b/packages/plugins/plugin-security/src/delegated-admin-gate.test.ts index 16ca4edb9e..fdb8a27e63 100644 --- a/packages/plugins/plugin-security/src/delegated-admin-gate.test.ts +++ b/packages/plugins/plugin-security/src/delegated-admin-gate.test.ts @@ -65,6 +65,7 @@ function makeHarness() { const matches = (row: any, where: any): boolean => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && Array.isArray((v as any).$in)) { return (v as any).$in.includes(row[k]); } @@ -441,6 +442,7 @@ function makeDelegationHarness(nowMs = T0) { }; const matches = (row: any, where: any): boolean => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && Array.isArray((v as any).$in)) return (v as any).$in.includes(row[k]); return row[k] === v; }); @@ -591,6 +593,7 @@ function makeAnchoredDelegationHarness(nowMs = T0) { }; const matches = (row: any, where: any): boolean => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && Array.isArray((v as any).$in)) return (v as any).$in.includes(row[k]); return row[k] === v; }); diff --git a/packages/plugins/plugin-security/src/permission-denied-user-copy.test.ts b/packages/plugins/plugin-security/src/permission-denied-user-copy.test.ts index 6218d97486..6264aea898 100644 --- a/packages/plugins/plugin-security/src/permission-denied-user-copy.test.ts +++ b/packages/plugins/plugin-security/src/permission-denied-user-copy.test.ts @@ -107,6 +107,7 @@ function makeEngine() { const matches = (row: any, filter: any): boolean => { if (!filter || typeof filter !== 'object') return true; for (const [k, v] of Object.entries(filter)) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v != null && typeof v === 'object' && '$in' in (v as any)) { if (!(v as any).$in.includes(row[k])) return false; continue; diff --git a/packages/plugins/plugin-security/src/permission-set-projection.test.ts b/packages/plugins/plugin-security/src/permission-set-projection.test.ts index 655545d298..7c8d9deefa 100644 --- a/packages/plugins/plugin-security/src/permission-set-projection.test.ts +++ b/packages/plugins/plugin-security/src/permission-set-projection.test.ts @@ -42,7 +42,10 @@ function makeQl() { const tableFor = (object: string): any[] | null => object === 'sys_permission_set' ? permRows : object === 'sys_metadata' ? metaRows : null; const matches = (r: any, where: any) => - Object.entries(where ?? {}).every(([k, v]) => (v === null ? (r[k] ?? null) === null : r[k] === v)); + Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v === null ? (r[k] ?? null) === null : r[k] === v; + }); return { permRows, metaRows, diff --git a/packages/plugins/plugin-security/src/security-plugin.test.ts b/packages/plugins/plugin-security/src/security-plugin.test.ts index 3def7bdf11..71604c3a9d 100644 --- a/packages/plugins/plugin-security/src/security-plugin.test.ts +++ b/packages/plugins/plugin-security/src/security-plugin.test.ts @@ -3353,6 +3353,7 @@ describe('explainAccessForCaller (ADR-0090 D6/D12)', () => { }; const matches = (row: any, where: any): boolean => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && Array.isArray((v as any).$in)) return (v as any).$in.includes(row[k]); return row[k] === v; }); @@ -3472,6 +3473,7 @@ describe('SecurityPlugin — ADR-0090 D10 agent intersection', () => { } const matches = (row: any, where: any): boolean => Object.entries(where ?? {}).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && Array.isArray((v as any).$in)) return (v as any).$in.includes(row[k]); return row[k] === v; }); diff --git a/packages/plugins/plugin-security/src/share-link-tenant-wall.test.ts b/packages/plugins/plugin-security/src/share-link-tenant-wall.test.ts index 44002e747b..b979cbd782 100644 --- a/packages/plugins/plugin-security/src/share-link-tenant-wall.test.ts +++ b/packages/plugins/plugin-security/src/share-link-tenant-wall.test.ts @@ -63,6 +63,7 @@ const TENANT_OBJECTS = new Set([OBJECT]); function matches(row: any, where: Record): boolean { return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && '$in' in v) return (v as any).$in.includes(row[k]); return row[k] === v; }); diff --git a/packages/plugins/plugin-sharing/src/business-unit-graph.test.ts b/packages/plugins/plugin-sharing/src/business-unit-graph.test.ts index 1d4ec5ab3b..ca4ccd2145 100644 --- a/packages/plugins/plugin-sharing/src/business-unit-graph.test.ts +++ b/packages/plugins/plugin-sharing/src/business-unit-graph.test.ts @@ -57,6 +57,7 @@ function makeEngine(units: UnitRow[], members: MemberRow[]) { if (!(v as any[]).some((sub) => matches(row, sub))) return false; continue; } + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); const rv = row[k]; if (v && typeof v === 'object' && '$ne' in (v as any)) { if (rv === (v as any).$ne) return false; diff --git a/packages/plugins/plugin-sharing/src/federated-phantom-owner-scoping.test.ts b/packages/plugins/plugin-sharing/src/federated-phantom-owner-scoping.test.ts index be1ab9411e..76bf7f0564 100644 --- a/packages/plugins/plugin-sharing/src/federated-phantom-owner-scoping.test.ts +++ b/packages/plugins/plugin-sharing/src/federated-phantom-owner-scoping.test.ts @@ -152,6 +152,7 @@ function makeEngine( */ const matches = (row: Record, where: Record) => Object.entries(where).every(([key, cond]) => { + if (key.startsWith('$')) throw new Error(`fake engine: unsupported operator ${key}`); if (cond !== null && typeof cond === 'object' && !Array.isArray(cond)) { const ops = Object.keys(cond as object); if (ops.length !== 1 || ops[0] !== '$in') { diff --git a/packages/plugins/plugin-sharing/src/share-link-enforcement-context.test.ts b/packages/plugins/plugin-sharing/src/share-link-enforcement-context.test.ts index 89d4e461b4..4d049075b0 100644 --- a/packages/plugins/plugin-sharing/src/share-link-enforcement-context.test.ts +++ b/packages/plugins/plugin-sharing/src/share-link-enforcement-context.test.ts @@ -77,6 +77,7 @@ class MockHttp implements IHttpServer { /** `where` matching good enough for both the identity reads and the record read. */ function matches(row: any, where: Record): boolean { return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && '$in' in v) return (v as any).$in.includes(row[k]); return row[k] === v; }); diff --git a/packages/plugins/plugin-sharing/src/share-link-service.test.ts b/packages/plugins/plugin-sharing/src/share-link-service.test.ts index 0667bd7dd4..b909a7ccb7 100644 --- a/packages/plugins/plugin-sharing/src/share-link-service.test.ts +++ b/packages/plugins/plugin-sharing/src/share-link-service.test.ts @@ -12,6 +12,7 @@ function makeFakeEngine(schemas: Record) { function matches(row: FakeRow, filter: any): boolean { if (!filter || typeof filter !== 'object') return true; for (const [k, v] of Object.entries(filter)) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (row[k] !== v) return false; } return true; diff --git a/packages/plugins/plugin-sharing/src/sharing-rule-provenance.test.ts b/packages/plugins/plugin-sharing/src/sharing-rule-provenance.test.ts index c3fd86e26a..7c13b7c194 100644 --- a/packages/plugins/plugin-sharing/src/sharing-rule-provenance.test.ts +++ b/packages/plugins/plugin-sharing/src/sharing-rule-provenance.test.ts @@ -33,6 +33,7 @@ function makeEngine() { function matches(row: Row, f: any): boolean { if (!f || typeof f !== 'object') return true; for (const [k, v] of Object.entries(f)) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (row[k] !== v) return false; } return true; diff --git a/packages/rest/src/meta-object-extension-property-classes.test.ts b/packages/rest/src/meta-object-extension-property-classes.test.ts index 28a64402bc..c14bcc348b 100644 --- a/packages/rest/src/meta-object-extension-property-classes.test.ts +++ b/packages/rest/src/meta-object-extension-property-classes.test.ts @@ -257,7 +257,10 @@ async function measure(opts: { metadata: JSON.stringify(storedBody), }]; const matches = (r: Record, w: Record) => - Object.entries(w).every(([k, v]) => (r[k] ?? null) === (v ?? null)); + Object.entries(w).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return (r[k] ?? null) === (v ?? null); + }); const engine = { registry, diff --git a/packages/rest/src/meta-object-overlay-extension-fold.test.ts b/packages/rest/src/meta-object-overlay-extension-fold.test.ts index aa1dba35c3..4468f1a2a7 100644 --- a/packages/rest/src/meta-object-overlay-extension-fold.test.ts +++ b/packages/rest/src/meta-object-overlay-extension-fold.test.ts @@ -233,7 +233,10 @@ async function measure(opts: { metadata: JSON.stringify(storedBody), }]; const matches = (r: Record, w: Record) => - Object.entries(w).every(([k, v]) => (r[k] ?? null) === (v ?? null)); + Object.entries(w).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return (r[k] ?? null) === (v ?? null); + }); const engine = { registry, diff --git a/packages/services/service-analytics/src/__tests__/objectql-daterange.test.ts b/packages/services/service-analytics/src/__tests__/objectql-daterange.test.ts index 73fd7e4b78..a8b2b8b77a 100644 --- a/packages/services/service-analytics/src/__tests__/objectql-daterange.test.ts +++ b/packages/services/service-analytics/src/__tests__/objectql-daterange.test.ts @@ -59,6 +59,10 @@ type AggOpts = { function matches(row: Row, filter: Record): boolean { return Object.entries(filter).every(([key, cond]) => { if (key === '$and') return (cond as Record[]).every((sub) => matches(row, sub)); + // [#5298] `fieldLeaves` emits a NULL-safe `$ne` as `$or: [{ field: null }, { field: { $ne } }]`, + // so a real query genuinely hands this double an `$or` — it is not dormant here. + if (key === '$or') return (cond as Record[]).some((sub) => matches(row, sub)); + if (key.startsWith('$')) throw new Error(`test bridge: unhandled operator ${key}`); const v = row[key]; if (cond && typeof cond === 'object' && !Array.isArray(cond)) { return Object.entries(cond as Record).every(([op, operand]) => { diff --git a/packages/services/service-analytics/src/__tests__/objectql-read-scope.test.ts b/packages/services/service-analytics/src/__tests__/objectql-read-scope.test.ts index f5a31b2e0c..73030a7dd7 100644 --- a/packages/services/service-analytics/src/__tests__/objectql-read-scope.test.ts +++ b/packages/services/service-analytics/src/__tests__/objectql-read-scope.test.ts @@ -49,6 +49,7 @@ type AggOpts = { function matches(row: Record, filter: Record): boolean { return Object.entries(filter).every(([k, v]) => { if (k === '$and') return (v as Record[]).every((sub) => matches(row, sub)); + if (k.startsWith('$')) throw new Error(`test bridge: unhandled operator ${k}`); return row[k] === v; }); } diff --git a/packages/services/service-automation/src/builtin/crud-bulk-intent.test.ts b/packages/services/service-automation/src/builtin/crud-bulk-intent.test.ts index 09501c6ae8..7886b2740a 100644 --- a/packages/services/service-automation/src/builtin/crud-bulk-intent.test.ts +++ b/packages/services/service-automation/src/builtin/crud-bulk-intent.test.ts @@ -63,6 +63,7 @@ function seedRows() { /** Scalar-equality match — enough for these fixtures, no operator dialect. */ function matches(row: Record, where: Record | undefined): boolean { for (const [k, v] of Object.entries(where ?? {})) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (row[k] !== v) return false; } return true; diff --git a/packages/services/service-automation/src/suspended-run-store.test.ts b/packages/services/service-automation/src/suspended-run-store.test.ts index d56e50768f..f02a1a990f 100644 --- a/packages/services/service-automation/src/suspended-run-store.test.ts +++ b/packages/services/service-automation/src/suspended-run-store.test.ts @@ -32,11 +32,12 @@ function createFakeEngine(): SuspendedRunStoreEngine & { rows: Map const rows = new Map(); // Equality plus the `$lt` operator (kept for where-clause generality). const matches = (row: any, where: any) => - !where || Object.entries(where).every(([k, v]) => - v && typeof v === 'object' && '$lt' in (v as any) + !where || Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return v && typeof v === 'object' && '$lt' in (v as any) ? row[k] < (v as any).$lt - : row[k] === v, - ); + : row[k] === v; + }); return { rows, async find(_object, options) { diff --git a/packages/services/service-messaging/src/messaging-service.test.ts b/packages/services/service-messaging/src/messaging-service.test.ts index d78de5d174..fc81813456 100644 --- a/packages/services/service-messaging/src/messaging-service.test.ts +++ b/packages/services/service-messaging/src/messaging-service.test.ts @@ -449,7 +449,10 @@ function inboxEngine(seed: { inbox?: any[]; receipts?: any[] } = {}) { }; let seq = 0; const matches = (row: any, where: any = {}) => - Object.entries(where).every(([k, v]) => String(row[k]) === String(v)); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return String(row[k]) === String(v); + }); const engine = { store, async find(object: string, query: any = {}) { diff --git a/packages/services/service-messaging/src/notification-schema-conformance.test.ts b/packages/services/service-messaging/src/notification-schema-conformance.test.ts index 2a63cf4d13..ba56ef30d1 100644 --- a/packages/services/service-messaging/src/notification-schema-conformance.test.ts +++ b/packages/services/service-messaging/src/notification-schema-conformance.test.ts @@ -105,7 +105,10 @@ function inboxEngine() { const store: Record = {}; let seq = 0; const matches = (row: any, where: any = {}) => - Object.entries(where).every(([k, v]) => String(row[k]) === String(v)); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return String(row[k]) === String(v); + }); return { store, async find(object: string, query: any = {}) { diff --git a/packages/services/service-queue/src/db-queue-adapter.test.ts b/packages/services/service-queue/src/db-queue-adapter.test.ts index cc08ceb2ec..e602cfecf5 100644 --- a/packages/services/service-queue/src/db-queue-adapter.test.ts +++ b/packages/services/service-queue/src/db-queue-adapter.test.ts @@ -20,6 +20,7 @@ function makeFakeEngine() { } function matches(row: any, where: Record): boolean { for (const [k, v] of Object.entries(where)) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (row[k] !== v) return false; } return true; diff --git a/packages/services/service-queue/src/job-queue-retention.test.ts b/packages/services/service-queue/src/job-queue-retention.test.ts index 11b291c239..6b169e3f5e 100644 --- a/packages/services/service-queue/src/job-queue-retention.test.ts +++ b/packages/services/service-queue/src/job-queue-retention.test.ts @@ -51,6 +51,7 @@ function makeFakeEngine() { const tables = new Map(); function matches(row: Row, where: Record): boolean { for (const [k, v] of Object.entries(where)) { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); if (v && typeof v === 'object' && !Array.isArray(v)) { // NULL-safe like SQL: a row with no value never satisfies `$lt`. if ('$lt' in v && (row[k] == null || !(String(row[k]) < String(v.$lt)))) return false; diff --git a/packages/services/service-settings/src/config-change-audit.test.ts b/packages/services/service-settings/src/config-change-audit.test.ts index 6e36a75851..6897e2f335 100644 --- a/packages/services/service-settings/src/config-change-audit.test.ts +++ b/packages/services/service-settings/src/config-change-audit.test.ts @@ -94,7 +94,10 @@ function makeMemoryDriver() { }; const matches = (row: Record, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]) => (row[k] ?? null) === (v ?? null)); + return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return (row[k] ?? null) === (v ?? null); + }); }; const driver: any = { name: 'memory', version: '0.0.0', supports: {} as any, diff --git a/packages/services/service-settings/src/settings-crypto-fail-closed.test.ts b/packages/services/service-settings/src/settings-crypto-fail-closed.test.ts index 3876a7112e..3198fc9f35 100644 --- a/packages/services/service-settings/src/settings-crypto-fail-closed.test.ts +++ b/packages/services/service-settings/src/settings-crypto-fail-closed.test.ts @@ -93,7 +93,10 @@ function makeMemoryDriver() { }; const matches = (row: Record, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]) => (row[k] ?? null) === (v ?? null)); + return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return (row[k] ?? null) === (v ?? null); + }); }; const driver: any = { name: 'memory', version: '0.0.0', supports: {} as any, diff --git a/packages/services/service-settings/src/settings-secret-rotation.test.ts b/packages/services/service-settings/src/settings-secret-rotation.test.ts index 2e9301ccfd..00db9d9c35 100644 --- a/packages/services/service-settings/src/settings-secret-rotation.test.ts +++ b/packages/services/service-settings/src/settings-secret-rotation.test.ts @@ -113,7 +113,10 @@ function makeMemoryDriver() { }; const matches = (row: Record, where: any): boolean => { if (!where || typeof where !== 'object') return true; - return Object.entries(where).every(([k, v]) => (row[k] ?? null) === (v ?? null)); + return Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return (row[k] ?? null) === (v ?? null); + }); }; const driver: any = { name: 'memory', version: '0.0.0', supports: {} as any, diff --git a/packages/services/service-storage/src/attachment-lifecycle.test.ts b/packages/services/service-storage/src/attachment-lifecycle.test.ts index 8fda3dc27e..b2d3dba28c 100644 --- a/packages/services/service-storage/src/attachment-lifecycle.test.ts +++ b/packages/services/service-storage/src/attachment-lifecycle.test.ts @@ -27,7 +27,10 @@ function fakeEngine(seed: { const updates: Array<{ object: string; data: any }> = []; const matches = (row: Record, where: Record) => - Object.entries(where).every(([k, v]) => row[k] === v); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return row[k] === v; + }); const engine: AttachmentLifecycleEngine & { tables: typeof tables; diff --git a/packages/services/service-storage/src/file-reference-lifecycle.test.ts b/packages/services/service-storage/src/file-reference-lifecycle.test.ts index 23e4e67348..b71ba779ce 100644 --- a/packages/services/service-storage/src/file-reference-lifecycle.test.ts +++ b/packages/services/service-storage/src/file-reference-lifecycle.test.ts @@ -48,7 +48,10 @@ function fakeEngine(opts: { return actual === expected; }; const matches = (row: Record, where: Record) => - Object.entries(where).every(([k, v]) => matchValue(row[k], v)); + Object.entries(where).every(([k, v]) => { + if (k.startsWith('$')) throw new Error(`fake driver: unsupported operator ${k}`); + return matchValue(row[k], v); + }); const engine: FileReferenceEngine & { tables: typeof tables; diff --git a/packages/triggers/trigger-schedule/src/time-relative-trigger.test.ts b/packages/triggers/trigger-schedule/src/time-relative-trigger.test.ts index 7ef6174dc3..13b6e792d0 100644 --- a/packages/triggers/trigger-schedule/src/time-relative-trigger.test.ts +++ b/packages/triggers/trigger-schedule/src/time-relative-trigger.test.ts @@ -75,6 +75,7 @@ function fakeDataEngine(rows: Row[], knownObjects: string[] = ['contracts']) { /** Minimal where matcher: temporal range on the date field + scalar equality. */ function matches(row: Row, where: Record): boolean { for (const [key, cond] of Object.entries(where)) { + if (key.startsWith('$')) throw new Error(`fake driver: unsupported operator ${key}`); const val = row[key]; if (cond && typeof cond === 'object' && !Array.isArray(cond)) { const c = cond as Record; diff --git a/scripts/where-matcher-conformance.baseline.json b/scripts/where-matcher-conformance.baseline.json index b39255441c..87400a9da6 100644 --- a/scripts/where-matcher-conformance.baseline.json +++ b/scripts/where-matcher-conformance.baseline.json @@ -41,231 +41,5 @@ "precedent, #4251). There is deliberately no --update flag: a generator would let a new", "silently-wrong double in by \"just run the update command\"." ], - "files": { - "packages/metadata-protocol/src/protocol.delete-rewrap-envelope.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/protocol.duplicate-package-bundle-key.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/protocol.flow-canonicalizer.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/protocol.legacy-overlay-delete.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/protocol.stored-migration.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/sys-metadata-repository.draft-drain.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/sys-metadata-repository.history-counters.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/sys-metadata-repository.package-writability.test.ts": { - "silent": 1 - }, - "packages/metadata-protocol/src/sys-metadata-repository.recorded-by.test.ts": { - "silent": 1 - }, - "packages/objectql/src/adr0104-attestation-evidence.test.ts": { - "silent": 1 - }, - "packages/objectql/src/adr0104-lax-deviation-marker.test.ts": { - "silent": 1 - }, - "packages/objectql/src/engine-readonly-strict-writes.test.ts": { - "silent": 1 - }, - "packages/objectql/src/engine-readonly-strip-caller-values.test.ts": { - "silent": 1 - }, - "packages/objectql/src/engine-readonly-strip-signal.test.ts": { - "silent": 1 - }, - "packages/objectql/src/engine-summary-recompute-context.test.ts": { - "silent": 1 - }, - "packages/objectql/src/engine-summary-retry.test.ts": { - "silent": 1 - }, - "packages/objectql/src/package-disable-enforcement.test.ts": { - "silent": 1 - }, - "packages/objectql/src/protocol-delete-object-registry-heal.test.ts": { - "silent": 1 - }, - "packages/objectql/src/protocol-object-overlay-layer.test.ts": { - "silent": 1 - }, - "packages/objectql/src/protocol-packaged-object-base.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-approvals/src/approval-actor-impersonation.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-approvals/src/approval-node.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-approvals/src/approval-override-audit.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-approvals/src/approval-restart-resume.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-approvals/src/approval-revise.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-approvals/src/approver-cross-org.integration.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-approvals/src/stranded-request-inspection.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/accept-invitation-adopt-membership.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/auth-manager.jwt-eddsa-fallback.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/auth-manager.optional-plugin-isolation.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/auth-plugin.test.ts": { - "silent": 2 - }, - "packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/ensure-default-organization.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/impersonation-bearer-rotation.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/org-create-posture-gate.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/remove-member-permission-guard.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/remove-user-atomicity.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/session-of-record.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-auth/src/session-tombstone.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-email/src/email-plugin.attachment-storage.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-email/src/email-plugin.outbox-sweep.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-email/src/email-plugin.queue-delivery.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-email/src/email-plugin.template-runtime-write.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-email/src/outbox-sweep.test.ts": { - "unjudged": 1 - }, - "packages/plugins/plugin-hono-server/src/current-user-endpoints-additive-baseline.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-hono-server/src/current-user-endpoints-position-grants.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-reports/src/report-export-axis.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-reports/src/report-service.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-security/src/auto-org-admin-grant.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-security/src/delegated-admin-gate.test.ts": { - "silent": 3 - }, - "packages/plugins/plugin-security/src/permission-denied-user-copy.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-security/src/permission-set-projection.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-security/src/security-plugin.test.ts": { - "silent": 2 - }, - "packages/plugins/plugin-security/src/share-link-tenant-wall.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-sharing/src/business-unit-graph.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-sharing/src/federated-phantom-owner-scoping.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-sharing/src/share-link-enforcement-context.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-sharing/src/share-link-service.test.ts": { - "silent": 1 - }, - "packages/plugins/plugin-sharing/src/sharing-rule-provenance.test.ts": { - "silent": 1 - }, - "packages/rest/src/meta-object-extension-property-classes.test.ts": { - "silent": 1 - }, - "packages/rest/src/meta-object-overlay-extension-fold.test.ts": { - "silent": 1 - }, - "packages/services/service-analytics/src/__tests__/objectql-daterange.test.ts": { - "silent": 1 - }, - "packages/services/service-analytics/src/__tests__/objectql-read-scope.test.ts": { - "silent": 1 - }, - "packages/services/service-automation/src/builtin/crud-bulk-intent.test.ts": { - "silent": 1 - }, - "packages/services/service-automation/src/suspended-run-store.test.ts": { - "silent": 1 - }, - "packages/services/service-messaging/src/messaging-service.test.ts": { - "silent": 1 - }, - "packages/services/service-messaging/src/notification-schema-conformance.test.ts": { - "silent": 1 - }, - "packages/services/service-queue/src/db-queue-adapter.test.ts": { - "silent": 1 - }, - "packages/services/service-queue/src/job-queue-retention.test.ts": { - "silent": 1 - }, - "packages/services/service-settings/src/config-change-audit.test.ts": { - "silent": 1 - }, - "packages/services/service-settings/src/settings-crypto-fail-closed.test.ts": { - "silent": 1 - }, - "packages/services/service-settings/src/settings-secret-rotation.test.ts": { - "silent": 1 - }, - "packages/services/service-storage/src/attachment-lifecycle.test.ts": { - "silent": 1 - }, - "packages/services/service-storage/src/file-reference-lifecycle.test.ts": { - "silent": 1 - }, - "packages/triggers/trigger-schedule/src/time-relative-trigger.test.ts": { - "silent": 1 - } - } + "files": {} }