equipped 5.3.1 → 5.3.3
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/CHANGELOG.md +9 -0
- package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
- package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/index.cjs +181 -179
- package/dist/cjs/dbs/index.cjs.map +1 -1
- package/dist/cjs/dbs/index.min.cjs +3 -3
- package/dist/cjs/dbs/index.min.cjs.map +1 -1
- package/dist/cjs/errors/index.cjs +11 -0
- package/dist/cjs/errors/index.cjs.map +1 -1
- package/dist/cjs/errors/index.min.cjs +1 -1
- package/dist/cjs/errors/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
- package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
- package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
- package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.cjs +152 -215
- package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.cjs +292 -225
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.cjs +277 -210
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +82 -15
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +7 -7
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/utilities/index.cjs +0 -5
- package/dist/cjs/utilities/index.cjs.map +1 -1
- package/dist/cjs/utilities/index.min.cjs +2 -2
- package/dist/cjs/utilities/index.min.cjs.map +1 -1
- package/dist/cjs/validations/index.cjs +1 -0
- package/dist/cjs/validations/index.cjs.map +1 -1
- package/dist/cjs/validations/index.min.cjs +1 -1
- package/dist/cjs/validations/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
- package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
- package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/redis/index.mjs +5 -3
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.mjs +2 -2
- package/dist/esm/{chunk-2GGMLKRP.min.mjs → chunk-4GZ43EQ2.min.mjs} +2 -2
- package/dist/esm/{chunk-IRYCN6PI.min.mjs → chunk-5FEVQT6K.min.mjs} +2 -2
- package/dist/esm/{chunk-LKS5ZE45.mjs → chunk-74GY55PM.mjs} +2 -2
- package/dist/esm/{chunk-A4P7P6BU.mjs → chunk-7N4WUZ7P.mjs} +167 -347
- package/dist/esm/chunk-7N4WUZ7P.mjs.map +1 -0
- package/dist/esm/chunk-A332TTED.mjs +135 -0
- package/dist/esm/chunk-A332TTED.mjs.map +1 -0
- package/dist/esm/{chunk-7CP7ZE2O.mjs → chunk-BONYW6LU.mjs} +9 -5
- package/dist/esm/{chunk-7CP7ZE2O.mjs.map → chunk-BONYW6LU.mjs.map} +1 -1
- package/dist/esm/{chunk-HXFNN6RI.mjs → chunk-C3G4W4ZV.mjs} +3 -3
- package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
- package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
- package/dist/esm/{chunk-676VIABN.min.mjs → chunk-LJZOS62I.min.mjs} +2 -2
- package/dist/esm/{chunk-7SQ5JQYR.min.mjs → chunk-MCX2O5IT.min.mjs} +2 -2
- package/dist/esm/{chunk-BWUFPMVG.mjs → chunk-MNKDFIVK.mjs} +2 -2
- package/dist/esm/chunk-N3OD4QL2.min.mjs +32 -0
- package/dist/esm/chunk-N3OD4QL2.min.mjs.map +1 -0
- package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
- package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
- package/dist/esm/{chunk-TSVHZZE4.mjs → chunk-RFJ5URMP.mjs} +5 -5
- package/dist/esm/chunk-RX4XPABH.min.mjs +2 -0
- package/dist/esm/{chunk-MQXTTWPS.min.mjs.map → chunk-RX4XPABH.min.mjs.map} +1 -1
- package/dist/esm/chunk-SPOVKWV3.min.mjs +2 -0
- package/dist/esm/chunk-SPOVKWV3.min.mjs.map +1 -0
- package/dist/esm/{chunk-3TP7NINX.mjs → chunk-XESM7IWM.mjs} +2 -2
- package/dist/esm/{chunk-5PZACGPI.mjs → chunk-XJKBHQWO.mjs} +7 -5
- package/dist/esm/{chunk-5PZACGPI.mjs.map → chunk-XJKBHQWO.mjs.map} +1 -1
- package/dist/esm/chunk-YC6V4HLT.min.mjs +2 -0
- package/dist/esm/{chunk-7NF7PV6S.min.mjs.map → chunk-YC6V4HLT.min.mjs.map} +1 -1
- package/dist/esm/{chunk-P4PRHHIY.min.mjs → chunk-YWQTFKNY.min.mjs} +2 -2
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
- package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.mjs +5 -3
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.mjs +3 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.mjs +4 -2
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
- package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.mjs +1 -1
- package/dist/esm/introspection-TO27QT2X.min.mjs +2 -0
- package/dist/esm/{introspection-YJF3QAUK.mjs → introspection-ZUQYVEFC.mjs} +3 -3
- package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
- package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
- package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
- package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/json/index.mjs +6 -5
- package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
- package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
- package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
- package/dist/esm/orm/index.min.mjs +1 -1
- package/dist/esm/orm/index.mjs +3 -3
- package/dist/esm/server/adapters/express/index.min.mjs +1 -1
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/express/index.mjs +7 -3
- package/dist/esm/server/adapters/express/index.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.mjs +7 -3
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.mjs +5 -4
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/types/{base-BDTBLZ9a.d.ts → base-BnwwLupM.d.ts} +3 -3
- package/dist/types/cache/adapters/in-memory/index.js +6 -3
- package/dist/types/cache/adapters/redis/index.js +5 -3
- package/dist/types/cache/index.js +2 -2
- package/dist/types/chunk-7MXHWHRV.js +134 -0
- package/dist/types/{chunk-LPB5LS7A.js → chunk-BKXNLF6X.js} +1 -1
- package/dist/types/{chunk-J3TGB5YQ.js → chunk-DZFKDZDZ.js} +8 -4
- package/dist/types/{chunk-YLJNBL6J.js → chunk-GQRSK2KP.js} +6 -4
- package/dist/types/chunk-PPD4WDG6.js +143 -0
- package/dist/types/{chunk-55CTVK7R.js → chunk-SZAA5GF6.js} +1 -1
- package/dist/types/{chunk-4DH3POYM.js → chunk-UGLZIYAR.js} +4 -4
- package/dist/types/{chunk-5Z26ZURE.js → chunk-UR7O43FC.js} +1 -1
- package/dist/types/{chunk-IZDJDGOV.js → chunk-X5ZDIXCZ.js} +2 -2
- package/dist/types/{chunk-TT5EORDK.js → chunk-YGIIUOQM.js} +166 -346
- package/dist/types/dbs/adapters/mongodb/index.js +8 -5
- package/dist/types/dbs/index.js +5 -3
- package/dist/types/errors/index.d.ts +8 -3
- package/dist/types/errors/index.js +3 -1
- package/dist/types/events/adapters/kafka/index.js +4 -2
- package/dist/types/events/adapters/rabbitmq/index.js +7 -3
- package/dist/types/index.js +1 -1
- package/dist/types/instance/index.js +1 -1
- package/dist/types/{introspection-EHGM4RMO.js → introspection-ZQMYTW6H.js} +2 -2
- package/dist/types/jobs/adapters/redis/index.js +10 -6
- package/dist/types/orm/adapters/in-memory/index.js +4 -3
- package/dist/types/orm/adapters/json/index.js +6 -5
- package/dist/types/orm/adapters/mongodb/index.js +6 -4
- package/dist/types/orm/adapters/postgresql/index.js +8 -5
- package/dist/types/orm/index.js +3 -3
- package/dist/types/{requestError-DdaL8hc3.d.ts → requestError-BmOhSuFb.d.ts} +1 -0
- package/dist/types/server/adapters/express/index.d.ts +2 -2
- package/dist/types/server/adapters/express/index.js +7 -3
- package/dist/types/server/adapters/fastify/index.d.ts +3 -3
- package/dist/types/server/adapters/fastify/index.js +7 -3
- package/dist/types/server/index.d.ts +4 -4
- package/dist/types/server/index.js +1 -1
- package/dist/types/utilities/index.d.ts +1 -2
- package/dist/types/utilities/index.js +5 -4
- package/dist/types/{validationError-oigtHqBi.d.ts → validationError-C2tVK4s7.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +4 -4
- package/dist/types/validations/index.js +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-7NF7PV6S.min.mjs +0 -2
- package/dist/esm/chunk-A4P7P6BU.mjs.map +0 -1
- package/dist/esm/chunk-IN5YKIJ7.min.mjs +0 -32
- package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +0 -1
- package/dist/esm/chunk-MQXTTWPS.min.mjs +0 -2
- package/dist/esm/introspection-THKMXV5V.min.mjs +0 -2
- /package/dist/esm/{chunk-2GGMLKRP.min.mjs.map → chunk-4GZ43EQ2.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-IRYCN6PI.min.mjs.map → chunk-5FEVQT6K.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-LKS5ZE45.mjs.map → chunk-74GY55PM.mjs.map} +0 -0
- /package/dist/esm/{chunk-HXFNN6RI.mjs.map → chunk-C3G4W4ZV.mjs.map} +0 -0
- /package/dist/esm/{chunk-676VIABN.min.mjs.map → chunk-LJZOS62I.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-7SQ5JQYR.min.mjs.map → chunk-MCX2O5IT.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-BWUFPMVG.mjs.map → chunk-MNKDFIVK.mjs.map} +0 -0
- /package/dist/esm/{chunk-TSVHZZE4.mjs.map → chunk-RFJ5URMP.mjs.map} +0 -0
- /package/dist/esm/{chunk-3TP7NINX.mjs.map → chunk-XESM7IWM.mjs.map} +0 -0
- /package/dist/esm/{chunk-P4PRHHIY.min.mjs.map → chunk-YWQTFKNY.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-THKMXV5V.min.mjs.map → introspection-TO27QT2X.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-YJF3QAUK.mjs.map → introspection-ZUQYVEFC.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/orm/adapters/mongodb/index.ts","../../../../../src/orm/adapters/mongodb/query.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { MongoClient, type ClientSession, type MongoClientOptions, type OptionalUnlessRequiredId } from 'mongodb'\nimport { v, type PipeOutput } from 'valleyed'\n\nimport { compileMongoAggregate, compileMongoFilter, compileMongoOps, compileMongoQuery, compileMongoUpdate } from './query'\nimport { EquippedError } from '../../../errors'\nimport { configurable } from '../../../utilities/configurable'\nimport type { FilterGroup } from '../../filter'\nimport type { DiscoveredSchema } from '../../migrations/introspection-types'\nimport type { AddIndexChange, DropIndexChange } from '../../migrations/types'\nimport { OrmAdapter, type AggregateSpec } from '../../orm-adapter'\nimport type { IterationQueryOptions, QueryOptions } from '../../query-options'\nimport type { AnySchema } from '../../schema'\nimport type { AnyUpdateOp } from '../../updates'\n\nconst mongoSchemaConfigPipe = () => v.object({ db: v.string(), col: v.string() })\nexport type MongoDbRepoConfig = PipeOutput<ReturnType<typeof mongoSchemaConfigPipe>>\n\nconst mongoConnectionPipe = () =>\n\tv.object({\n\t\turi: v.string(),\n\t})\n\nconst MIGRATION_TRACKER_COLLECTION = 'equipped_migrations'\n\nexport class MongoDbAdapter extends configurable(mongoConnectionPipe, OrmAdapter) {\n\treadonly schemaConfigPipe = mongoSchemaConfigPipe()\n\n\treadonly queryableOps = ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'like', 'exists', 'notExists', 'contains', 'notContains'] as const\n\treadonly updateOps = ['set', 'inc', 'mul', 'min', 'max', 'unset', 'push', 'pull', 'patch'] as const\n\treadonly aggregateOps = ['count', 'countDistinct', 'sum', 'avg', 'min', 'max'] as const\n\treadonly supportedFieldTypes = ['string', 'number', 'boolean', 'null', 'object', 'array', 'date'] as const\n\n\treadonly client: MongoClient\n\treadonly #sessionStore = new AsyncLocalStorage<ClientSession | undefined>()\n\n\tprotected constructor(config: typeof MongoDbAdapter.Config, options?: MongoClientOptions) {\n\t\tsuper(config)\n\t\tthis.client = new MongoClient(config.uri, {\n\t\t\t...options,\n\t\t\tignoreUndefined: true,\n\t\t})\n\t}\n\n\t#getCollection(schemaCfg: MongoDbRepoConfig) {\n\t\treturn this.client.db(schemaCfg.db).collection(schemaCfg.col)\n\t}\n\n\tasync connect() {\n\t\ttry {\n\t\t\tawait this.client.connect()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError('Failed to connect MongoDB client', { adapter: 'mongodb' }, error)\n\t\t}\n\t}\n\n\tasync disconnect() {\n\t\ttry {\n\t\t\tawait this.client.close()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError('Failed to disconnect MongoDB client', { adapter: 'mongodb' }, error)\n\t\t}\n\t}\n\n\tasync findByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pkName = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst doc = await collection.findOne(\n\t\t\t\t{ [pkName]: pk },\n\t\t\t\t{ session: this.#sessionStore.getStore() },\n\t\t\t)\n\t\t\treturn doc as Record<string, unknown> | null\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB findByPk failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'findByPk', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync createMany(_schema: AnySchema, config: unknown, data: Record<string, unknown>[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst docs = data.map((d) => d as OptionalUnlessRequiredId<any>)\n\t\t\tawait collection.insertMany(docs, { session: this.#sessionStore.getStore() })\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB createMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'createMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync updateByPk(schema: AnySchema, config: unknown, pk: unknown, ops: AnyUpdateOp[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pkName = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst update = compileMongoOps(ops)\n\t\t\tif (Object.keys(update).length === 0) {\n\t\t\t\treturn await collection.findOne({ [pkName]: pk }, { session: this.#sessionStore.getStore() }) as Record<string, unknown> | null\n\t\t\t}\n\t\t\treturn await collection.findOneAndUpdate(\n\t\t\t\t{ [pkName]: pk },\n\t\t\t\tupdate,\n\t\t\t\t{ returnDocument: 'after', session: this.#sessionStore.getStore() },\n\t\t\t) as Record<string, unknown> | null\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB updateByPk failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'updateByPk', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync deleteByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pkName = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\treturn await collection.findOneAndDelete(\n\t\t\t\t{ [pkName]: pk },\n\t\t\t\t{ session: this.#sessionStore.getStore() },\n\t\t\t) as Record<string, unknown> | null\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB deleteByPk failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'deleteByPk', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync raw(_schema: AnySchema, config: unknown, pipeline: Record<string, unknown>[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst result = await collection.aggregate(pipeline, { session: this.#sessionStore.getStore() }).toArray()\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tif (error instanceof EquippedError) throw error\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB raw failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'raw', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync aggregate(schema: AnySchema, config: unknown, spec: AggregateSpec): Promise<Array<Record<string, unknown>>> {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst pipeline = compileMongoAggregate(spec, pk)\n\t\t\tconst result = await collection.aggregate(pipeline, { session: this.#sessionStore.getStore() }).toArray()\n\t\t\treturn result as Array<Record<string, unknown>>\n\t\t} catch (error) {\n\t\t\tif (error instanceof EquippedError) throw error\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB aggregate failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'aggregate', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync findMany(schema: AnySchema, config: unknown, filter: FilterGroup, options?: QueryOptions) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst { filter: mongoFilter, sort, limit, skip, projection } = compileMongoQuery(filter, options, pk)\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\n\t\t\tlet cursor = collection.find(mongoFilter, {\n\t\t\t\tsession: this.#sessionStore.getStore(),\n\t\t\t\tprojection,\n\t\t\t})\n\t\t\tif (sort) cursor = cursor.sort(sort)\n\t\t\tif (limit) cursor = cursor.limit(limit)\n\t\t\tif (skip) cursor = cursor.skip(skip)\n\n\t\t\treturn await cursor.toArray()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB findMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'findMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync count(schema: AnySchema, config: unknown, filter: FilterGroup) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\treturn await collection.countDocuments(compileMongoFilter(filter, pk), { session: this.#sessionStore.getStore() })\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB count failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'count', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync *iterateMany(schema: AnySchema, config: unknown, filter: FilterGroup, options?: IterationQueryOptions) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\tlet cursor: any\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst { filter: mongoFilter, sort, limit, skip, projection } = compileMongoQuery(filter, options, pk)\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\n\t\t\tcursor = collection.find(mongoFilter, {\n\t\t\t\tsession: this.#sessionStore.getStore(),\n\t\t\t\tprojection,\n\t\t\t})\n\t\t\tif (sort) cursor = cursor.sort(sort)\n\t\t\tif (limit) cursor = cursor.limit(limit)\n\t\t\tif (skip) cursor = cursor.skip(skip)\n\t\t\tif (options?.batchSize !== undefined) cursor = cursor.batchSize(options.batchSize)\n\n\t\t\tfor await (const row of cursor) {\n\t\t\t\tyield row as Record<string, unknown>\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB iterateMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'iterateMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t} finally {\n\t\t\tawait cursor?.close()\n\t\t}\n\t}\n\n\tasync updateMany(schema: AnySchema, config: unknown, filter: FilterGroup, data: Record<string, unknown>) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst session = this.#sessionStore.getStore()\n\t\t\tconst mongoFilter = compileMongoFilter(filter, pk)\n\n\t\t\tconst matchingDocs = await collection.find(mongoFilter, { session, projection: { [pk]: 1 } }).toArray()\n\t\t\tconst ids = matchingDocs.map((d) => d[pk])\n\t\t\tconst idFilter = { [pk]: { $in: ids } }\n\n\t\t\tconst update = compileMongoUpdate(data)\n\t\t\tif (Object.keys(update).length > 0) {\n\t\t\t\tawait collection.updateMany(idFilter, update, { session })\n\t\t\t}\n\n\t\t\treturn await collection.find({ [pk]: { $in: ids } }, { session }).toArray()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB updateMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'updateMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync deleteMany(schema: AnySchema, config: unknown, filter: FilterGroup) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst session = this.#sessionStore.getStore()\n\t\t\tconst mongoFilter = compileMongoFilter(filter, pk)\n\n\t\t\tconst docs = await collection.find(mongoFilter, { session }).toArray()\n\t\t\tif (docs.length > 0) {\n\t\t\t\tawait collection.deleteMany(mongoFilter, { session })\n\t\t\t}\n\t\t\treturn docs\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB deleteMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'deleteMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync upsertOne(schema: AnySchema, config: unknown, filter: FilterGroup, create: Record<string, unknown>, ops: AnyUpdateOp[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst mongoFilter = compileMongoFilter(filter, pk)\n\n\t\t\tconst updateDoc = compileMongoOps(ops)\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tmongoFilter,\n\t\t\t\t{\n\t\t\t\t\t...updateDoc,\n\t\t\t\t\t$setOnInsert: create,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: this.#sessionStore.getStore(),\n\t\t\t\t\tupsert: true,\n\t\t\t\t},\n\t\t\t)\n\n\t\t\treturn doc as Record<string, unknown>\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB upsertOne failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'upsertOne', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync session<T>(fn: () => Promise<T>): Promise<T> {\n\t\tif (this.#sessionStore.getStore()) return fn()\n\t\ttry {\n\t\t\tconst session = await this.client.startSession()\n\t\t\ttry {\n\t\t\t\treturn await session.withTransaction(async () => this.#sessionStore.run(session, fn))\n\t\t\t} finally {\n\t\t\t\tawait session.endSession()\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof EquippedError) throw error\n\t\t\tthrow new EquippedError('MongoDB session failed', { adapter: 'mongodb', operation: 'session' }, error)\n\t\t}\n\t}\n\n\tasync loadMigrations(): Promise<{ id: string; appliedAt: number }[]> {\n\t\tconst db = this.client.db()\n\t\tconst docs = await db.collection(MIGRATION_TRACKER_COLLECTION).find({}).toArray()\n\t\treturn docs.map((d) => ({ id: String(d._id), appliedAt: d.appliedAt as number }))\n\t}\n\n\tasync recordMigration(id: string, appliedAt: number): Promise<void> {\n\t\tconst db = this.client.db()\n\t\tawait db.collection(MIGRATION_TRACKER_COLLECTION).insertOne({ _id: id as any, appliedAt })\n\t}\n\n\tasync applyAddIndex(change: AddIndexChange): Promise<void> {\n\t\tconst db = this.client.db()\n\t\tconst fields: Record<string, 1> = {}\n\t\tfor (const f of change.on) {\n\t\t\tfields[f] = 1\n\t\t}\n\t\tconst name = change.name ?? `${change.table}_${change.on.join('_')}_idx`\n\t\tawait db.collection(change.table).createIndex(fields, { unique: change.unique ?? false, name })\n\t}\n\n\tasync applyDropIndex(change: DropIndexChange): Promise<void> {\n\t\tconst db = this.client.db()\n\t\tconst collections = await db.listCollections().toArray()\n\t\tfor (const col of collections) {\n\t\t\tconst indexes = await db.collection(col.name).listIndexes().toArray()\n\t\t\tif (indexes.some((idx) => idx.name === change.name)) {\n\t\t\t\tawait db.collection(col.name).dropIndex(change.name)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tasync introspect(): Promise<DiscoveredSchema[]> {\n\t\tconst db = this.client.db()\n\t\tconst collections = await db.listCollections().toArray()\n\t\tconst schemas: DiscoveredSchema[] = []\n\t\tfor (const col of collections) {\n\t\t\tif (col.name === MIGRATION_TRACKER_COLLECTION) continue\n\t\t\tconst rawIndexes = await db.collection(col.name).listIndexes().toArray()\n\t\t\tconst indexes = rawIndexes\n\t\t\t\t.filter((idx) => idx.name !== '_id_')\n\t\t\t\t.map((idx) => ({\n\t\t\t\t\tname: idx.name as string,\n\t\t\t\t\ton: Object.keys(idx.key as Record<string, unknown>) as ReadonlyArray<string>,\n\t\t\t\t\tunique: !!(idx.unique),\n\t\t\t\t}))\n\t\t\tschemas.push({\n\t\t\t\tname: col.name,\n\t\t\t\tpk: undefined,\n\t\t\t\tfields: [],\n\t\t\t\tindexes,\n\t\t\t\tforeignKeys: [],\n\t\t\t})\n\t\t}\n\t\treturn schemas\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf } = import.meta.vitest\n\n\tdescribe('MongoDbAdapter: class-via-configurable shape', () => {\n\t\ttest('MongoDbAdapter.create validates connection config via pipe', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter).toBeInstanceOf(MongoDbAdapter)\n\t\t\texpect(adapter.client).toBeInstanceOf(MongoClient)\n\t\t})\n\n\t\ttest('MongoDbAdapter.create rejects invalid config', () => {\n\t\t\texpect(() => MongoDbAdapter.create({} as any)).toThrow()\n\t\t\texpect(() => MongoDbAdapter.create({ uri: 123 } as any)).toThrow()\n\t\t})\n\n\t\ttest('readonly schemaConfigPipe declared with { db, col } shape', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter.schemaConfigPipe).toBeDefined()\n\t\t})\n\n\t\ttest('capability declarations use as const', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\n\t\t\texpect(adapter.supportedFieldTypes).toEqual([\n\t\t\t\t'string', 'number', 'boolean', 'null', 'object', 'array', 'date',\n\t\t\t])\n\t\t\texpect(adapter.queryableOps).toEqual([\n\t\t\t\t'eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'like', 'exists', 'notExists', 'contains', 'notContains',\n\t\t\t])\n\t\t\texpect(adapter.updateOps).toEqual([\n\t\t\t\t'set', 'inc', 'mul', 'min', 'max', 'unset', 'push', 'pull', 'patch',\n\t\t\t])\n\t\t\texpect(adapter.aggregateOps).toEqual([\n\t\t\t\t'count', 'countDistinct', 'sum', 'avg', 'min', 'max',\n\t\t\t])\n\t\t})\n\n\t\ttest('underlying MongoClient exposed as readonly instance field', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter.client).toBeInstanceOf(MongoClient)\n\t\t})\n\n\t\ttest('adapter.use returns OrmUse-shaped object', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst schema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst use = adapter.use(schema, { db: 'testdb', col: 'testcol' })\n\n\t\t\texpect(use.findMany).toBeTypeOf('function')\n\t\t\texpect(use.iterateMany).toBeTypeOf('function')\n\t\t\texpect(use.findOne).toBeTypeOf('function')\n\t\t\texpect(use.count).toBeTypeOf('function')\n\t\t\texpect(use.createOne).toBeTypeOf('function')\n\t\t\texpect(use.createMany).toBeTypeOf('function')\n\t\t\texpect(use.updateMany).toBeTypeOf('function')\n\t\t\texpect(use.updateOne).toBeTypeOf('function')\n\t\t\texpect(use.upsertOne).toBeTypeOf('function')\n\t\t\texpect(use.deleteOne).toBeTypeOf('function')\n\t\t\texpect(use.deleteMany).toBeTypeOf('function')\n\t\t\texpect(use.raw).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('type-level: adapter declares all 9 canonical update ops', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Ops = typeof _adapter.updateOps\n\t\t\texpectTypeOf<Ops>().toEqualTypeOf<\n\t\t\t\treadonly ['set', 'inc', 'mul', 'min', 'max', 'unset', 'push', 'pull', 'patch']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: adapter declares all 7 field types', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Types = typeof _adapter.supportedFieldTypes\n\t\t\texpectTypeOf<Types>().toEqualTypeOf<\n\t\t\t\treadonly ['string', 'number', 'boolean', 'null', 'object', 'array', 'date']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: adapter declares all 13 queryable ops', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Ops = typeof _adapter.queryableOps\n\t\t\texpectTypeOf<Ops>().toEqualTypeOf<\n\t\t\t\treadonly ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'like', 'exists', 'notExists', 'contains', 'notContains']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: Repo.from with MongoDbAdapter enables all builder methods', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\n\t\t\tconst _one = repo.on(_TestSchema).one()\n\t\t\tconst _all = repo.on(_TestSchema).all()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\t\t\texpectTypeOf(_one.create).toBeFunction()\n\t\t\texpectTypeOf(_one.find).toBeFunction()\n\t\t\texpectTypeOf(_one.update).toBeFunction()\n\t\t\texpectTypeOf(_one.delete).toBeFunction()\n\t\t\texpectTypeOf(_one.upsert).toBeFunction()\n\t\t\texpectTypeOf(_all.create).toBeFunction()\n\t\t\texpectTypeOf(_all.find).toBeFunction()\n\t\t\texpectTypeOf(_all.count).toBeFunction()\n\t\t\texpectTypeOf(_all.update).toBeFunction()\n\t\t\texpectTypeOf(_all.delete).toBeFunction()\n\t\t\texpectTypeOf(_ref.raw).toBeFunction()\n\t\t\texpectTypeOf(repo.session).toBeFunction()\n\t\t})\n\n\t\ttest('type-level: raw arg-tuple infers (pipeline: Record<string, unknown>[]) from MongoDbAdapter', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\n\t\t\texpectTypeOf(_ref.raw).parameters.toEqualTypeOf<[pipeline: Record<string, unknown>[]]>()\n\t\t})\n\n\t\ttest('type-level: per-call <T> override narrows MongoDbAdapter raw return type', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\n\t\t\texpectTypeOf(_ref.raw<{ total: number }[]>).returns.toEqualTypeOf<Promise<{ total: number }[]>>()\n\t\t})\n\n\t\ttest('count forwards compiled filter to collection.countDocuments', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst schema = Schema.from('mongo_count').pk('_id', v.string(), () => 'x').field('name', v.string()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedFilter: unknown\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\tcountDocuments: async (filter: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedFilter = filter\n\t\t\t\t\t\treturn 7\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\tconst result = await adapter.count(schema, { db: 'testdb', col: 'things' }, FilterGroup.create().eq('name', 'Alice'))\n\t\t\texpect(capturedFilter).toEqual({ name: { $eq: 'Alice' } })\n\t\t\texpect(result).toBe(7)\n\t\t})\n\n\t\ttest('raw forwards pipeline to collection.aggregate at runtime', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst schema = Schema.from('mongo_raw').pk('id', v.string(), () => 'x').build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedPipeline: unknown\n\t\t\tconst mockResults = [{ total: 42 }]\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\taggregate: (pipeline: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedPipeline = pipeline\n\t\t\t\t\t\treturn { toArray: async () => mockResults }\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\t\t\tconst result = await adapter.use(schema, { db: 'testdb', col: 'things' }).raw([{ $count: 'total' }])\n\t\t\texpect(capturedPipeline).toEqual([{ $count: 'total' }])\n\t\t\texpect(result).toEqual(mockResults)\n\t\t})\n\n\t\ttest('iterateMany forwards batchSize and closes cursor on early return', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst { OrderBy } = await import('../../query-options')\n\t\t\tconst schema = Schema.from('mongo_iter').pk('_id', v.string(), () => 'x').field('age', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedFindFilter: unknown\n\t\t\tlet capturedFindOptions: unknown\n\t\t\tlet capturedSort: unknown\n\t\t\tlet capturedLimit: unknown\n\t\t\tlet capturedSkip: unknown\n\t\t\tlet capturedBatchSize: unknown\n\t\t\tlet closeCalls = 0\n\t\t\tconst cursor = {\n\t\t\t\tsort(sort: unknown) {\n\t\t\t\t\tcapturedSort = sort\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tlimit(limit: unknown) {\n\t\t\t\t\tcapturedLimit = limit\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tskip(skip: unknown) {\n\t\t\t\t\tcapturedSkip = skip\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tbatchSize(batchSize: unknown) {\n\t\t\t\t\tcapturedBatchSize = batchSize\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tasync close() {\n\t\t\t\t\tcloseCalls += 1\n\t\t\t\t},\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\tyield { _id: 'u4', age: 50 }\n\t\t\t\t\tyield { _id: 'u3', age: 40 }\n\t\t\t\t},\n\t\t\t}\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\tfind: (filter: unknown, options: unknown) => {\n\t\t\t\t\t\tcapturedFindFilter = filter\n\t\t\t\t\t\tcapturedFindOptions = options\n\t\t\t\t\t\treturn cursor\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\tconst rows: Record<string, unknown>[] = []\n\t\t\tfor await (const row of adapter.use(schema, { db: 'testdb', col: 'people' }).iterateMany(FilterGroup.create().gt('age', 19), {\n\t\t\t\torderBy: [new OrderBy('age', 'desc')],\n\t\t\t\toffset: 1,\n\t\t\t\tlimit: 2,\n\t\t\t\tbatchSize: 25,\n\t\t\t})) {\n\t\t\t\trows.push(row)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\texpect(capturedFindFilter).toEqual({ age: { $gt: 19 } })\n\t\t\texpect(capturedFindOptions).toEqual({ session: undefined, projection: undefined })\n\t\t\texpect(capturedSort).toEqual({ age: -1 })\n\t\t\texpect(capturedLimit).toBe(2)\n\t\t\texpect(capturedSkip).toBe(1)\n\t\t\texpect(capturedBatchSize).toBe(25)\n\t\t\texpect(rows).toEqual([{ _id: 'u4', age: 50 }])\n\t\t\texpect(closeCalls).toBe(1)\n\t\t})\n\n\t\ttest('iterateMany closes cursor on normal completion', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst schema = Schema.from('mongo_iter_complete').pk('_id', v.string(), () => 'x').field('age', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet closeCalls = 0\n\t\t\tconst cursor = {\n\t\t\t\tasync close() {\n\t\t\t\t\tcloseCalls += 1\n\t\t\t\t},\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\tyield { _id: 'u1', age: 30 }\n\t\t\t\t\tyield { _id: 'u2', age: 40 }\n\t\t\t\t},\n\t\t\t}\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\tfind: () => cursor,\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\tconst rows: Record<string, unknown>[] = []\n\t\t\tfor await (const row of adapter.use(schema, { db: 'testdb', col: 'people' }).iterateMany(FilterGroup.create())) {\n\t\t\t\trows.push(row)\n\t\t\t}\n\n\t\t\texpect(rows).toEqual([{ _id: 'u1', age: 30 }, { _id: 'u2', age: 40 }])\n\t\t\texpect(closeCalls).toBe(1)\n\t\t})\n\n\t\ttest('nested session returns callback without starting new transaction', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter.session).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('type-level: adapter declares all 6 canonical aggregate ops', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Ops = typeof _adapter.aggregateOps\n\t\t\texpectTypeOf<Ops>().toEqualTypeOf<\n\t\t\t\treadonly ['count', 'countDistinct', 'sum', 'avg', 'min', 'max']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: Repo.from with MongoDbAdapter enables aggregate method', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\t\t\texpectTypeOf(_ref.aggregate).toBeFunction()\n\t\t})\n\n\t\ttest('aggregate forwards compiled pipeline to collection.aggregate', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst schema = Schema.from('mongo_agg').pk('_id', v.string(), () => 'x').field('amount', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedPipeline: unknown\n\t\t\tconst mockResults = [{ total: 3, revenue: 150 }]\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\taggregate: (pipeline: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedPipeline = pipeline\n\t\t\t\t\t\treturn { toArray: async () => mockResults }\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\t\t\tconst result = await adapter.aggregate(schema, { db: 'testdb', col: 'orders' }, {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'total' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'revenue' },\n\t\t\t\t],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(capturedPipeline).toEqual([\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 }, revenue: { $sum: '$amount' } } },\n\t\t\t\t{ $project: { _id: 0, total: 1, revenue: 1 } },\n\t\t\t])\n\t\t\texpect(result).toEqual(mockResults)\n\t\t})\n\n\t\ttest('aggregate with where and groupBy produces correct pipeline', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst schema = Schema.from('mongo_agg2').pk('_id', v.string(), () => 'x').field('region', v.string()).field('amount', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedPipeline: unknown\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\taggregate: (pipeline: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedPipeline = pipeline\n\t\t\t\t\t\treturn { toArray: async () => [{ region: 'US', total: 2 }] }\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\t\t\tawait adapter.aggregate(schema, { db: 'testdb', col: 'orders' }, {\n\t\t\t\twhere: FilterGroup.create().gt('amount', 10),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t})\n\t\t\texpect(capturedPipeline).toEqual([\n\t\t\t\t{ $match: { amount: { $gt: 10 } } },\n\t\t\t\t{ $group: { _id: { region: '$region' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('auto-wires Instance hooks for connect/disconnect', async () => {\n\t\t\tconst { Instance: Inst } = await import('../../../instance')\n\t\t\tconst { vi } = await import('vitest')\n\t\t\tconst onSpy = vi.spyOn(Inst, 'on').mockImplementation(() => {})\n\n\t\t\tMongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\n\t\t\texpect(onSpy).toHaveBeenCalledWith('start', expect.any(Function), expect.objectContaining({ class: MongoDbAdapter }))\n\t\t\texpect(onSpy).toHaveBeenCalledWith('close', expect.any(Function), expect.objectContaining({ class: MongoDbAdapter }))\n\n\t\t\tonSpy.mockRestore()\n\t\t})\n\t})\n\n\tdescribe('MongoDbAdapter: migrations', () => {\n\t\tfunction mockMongoDb(adapter: MongoDbAdapter) {\n\t\t\tconst state = {\n\t\t\t\tmigrations: new Map<string, { _id: string; appliedAt: number }>(),\n\t\t\t\tcollections: new Map<string, { indexes: Array<{ name: string; key: Record<string, number>; unique?: boolean }> }>(),\n\t\t\t}\n\n\t\t\tconst getCol = (name: string) => {\n\t\t\t\tif (!state.collections.has(name)) {\n\t\t\t\t\tstate.collections.set(name, { indexes: [] })\n\t\t\t\t}\n\t\t\t\treturn state.collections.get(name)!\n\t\t\t}\n\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: (name: string) => {\n\t\t\t\t\tif (name === MIGRATION_TRACKER_COLLECTION) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tfind: () => ({ toArray: async () => [...state.migrations.values()] }),\n\t\t\t\t\t\t\tinsertOne: async (doc: { _id: string; appliedAt: number }) => {\n\t\t\t\t\t\t\t\tstate.migrations.set(doc._id, doc)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst col = getCol(name)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcreateIndex: async (fields: Record<string, number>, opts: { unique?: boolean; name: string }) => {\n\t\t\t\t\t\t\tcol.indexes.push({ name: opts.name, key: fields, unique: opts.unique })\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdropIndex: async (indexName: string) => {\n\t\t\t\t\t\t\tcol.indexes = col.indexes.filter((i) => i.name !== indexName)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlistIndexes: () => ({\n\t\t\t\t\t\t\ttoArray: async () => [\n\t\t\t\t\t\t\t\t{ name: '_id_', key: { _id: 1 } },\n\t\t\t\t\t\t\t\t...col.indexes,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlistCollections: () => ({\n\t\t\t\t\ttoArray: async () => [...state.collections.keys()].map((name) => ({ name })),\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\treturn state\n\t\t}\n\n\t\ttest('loadMigrations reads from equipped_migrations collection', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.migrations.set('0001', { _id: '0001', appliedAt: 1000 })\n\t\t\tstate.migrations.set('0002', { _id: '0002', appliedAt: 2000 })\n\n\t\t\tconst result = await adapter.loadMigrations()\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: '0001', appliedAt: 1000 },\n\t\t\t\t{ id: '0002', appliedAt: 2000 },\n\t\t\t])\n\t\t})\n\n\t\ttest('loadMigrations returns empty array when no migrations exist', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tmockMongoDb(adapter)\n\n\t\t\tconst result = await adapter.loadMigrations()\n\t\t\texpect(result).toEqual([])\n\t\t})\n\n\t\ttest('recordMigration inserts into equipped_migrations with _id', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.recordMigration('0001', 1234)\n\n\t\t\texpect(state.migrations.has('0001')).toBe(true)\n\t\t\texpect(state.migrations.get('0001')).toEqual({ _id: '0001', appliedAt: 1234 })\n\t\t})\n\n\t\ttest('applyAddIndex creates index with specified name and fields', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'], unique: true, name: 'users_email_unique' })\n\n\t\t\tconst col = state.collections.get('users')!\n\t\t\texpect(col.indexes).toHaveLength(1)\n\t\t\texpect(col.indexes[0]).toEqual({ name: 'users_email_unique', key: { email: 1 }, unique: true })\n\t\t})\n\n\t\ttest('applyAddIndex auto-derives name when absent', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'] })\n\n\t\t\tconst col = state.collections.get('users')!\n\t\t\texpect(col.indexes[0].name).toBe('users_email_idx')\n\t\t})\n\n\t\ttest('applyAddIndex auto-derived compound index name', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'orders', on: ['userId', 'createdAt'] })\n\n\t\t\tconst col = state.collections.get('orders')!\n\t\t\texpect(col.indexes[0].name).toBe('orders_userId_createdAt_idx')\n\t\t\texpect(col.indexes[0].key).toEqual({ userId: 1, createdAt: 1 })\n\t\t})\n\n\t\ttest('applyDropIndex finds and drops index by scanning collections', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [{ name: 'users_email_idx', key: { email: 1 }, unique: true }] })\n\n\t\t\tawait adapter.applyDropIndex({ kind: 'dropIndex', name: 'users_email_idx' })\n\n\t\t\texpect(state.collections.get('users')!.indexes).toHaveLength(0)\n\t\t})\n\n\t\ttest('applyDropIndex is a no-op when index not found', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tmockMongoDb(adapter)\n\n\t\t\tawait adapter.applyDropIndex({ kind: 'dropIndex', name: 'nonexistent_idx' })\n\t\t})\n\n\t\ttest('introspect returns DiscoveredSchema with empty fields, pk, and foreignKeys', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [] })\n\t\t\tstate.collections.set('posts', { indexes: [] })\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(2)\n\t\t\tfor (const s of schemas) {\n\t\t\t\texpect(s.pk).toBeUndefined()\n\t\t\t\texpect(s.fields).toEqual([])\n\t\t\t\texpect(s.foreignKeys).toEqual([])\n\t\t\t}\n\t\t})\n\n\t\ttest('introspect skips _id_ index', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [{ name: 'users_email_idx', key: { email: 1 }, unique: false }] })\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].indexes).toHaveLength(1)\n\t\t\texpect(schemas[0].indexes[0].name).toBe('users_email_idx')\n\t\t})\n\n\t\ttest('introspect skips tracker collection', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [] })\n\t\t\tstate.collections.set(MIGRATION_TRACKER_COLLECTION, { indexes: [] })\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].name).toBe('users')\n\t\t})\n\n\t\ttest('introspect maps index keys to on array and unique flag', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('orders', {\n\t\t\t\tindexes: [\n\t\t\t\t\t{ name: 'orders_userId_createdAt_idx', key: { userId: 1, createdAt: 1 }, unique: false },\n\t\t\t\t\t{ name: 'orders_email_unique', key: { email: 1 }, unique: true },\n\t\t\t\t],\n\t\t\t})\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas[0].indexes).toEqual([\n\t\t\t\t{ name: 'orders_userId_createdAt_idx', on: ['userId', 'createdAt'], unique: false },\n\t\t\t\t{ name: 'orders_email_unique', on: ['email'], unique: true },\n\t\t\t])\n\t\t})\n\n\t\ttest('adapter does not implement acquireMigrationLock', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\texpect((adapter as any).acquireMigrationLock).toBeUndefined()\n\t\t})\n\n\t\ttest('adapter does not implement DDL apply methods', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\texpect((adapter as any).applyCreateTable).toBeUndefined()\n\t\t\texpect((adapter as any).applyDropTable).toBeUndefined()\n\t\t\texpect((adapter as any).applyAddField).toBeUndefined()\n\t\t\texpect((adapter as any).applyDropField).toBeUndefined()\n\t\t\texpect((adapter as any).applyModifyField).toBeUndefined()\n\t\t\texpect((adapter as any).applyRenameTable).toBeUndefined()\n\t\t\texpect((adapter as any).applyRenameField).toBeUndefined()\n\t\t\texpect((adapter as any).applyAddForeignKey).toBeUndefined()\n\t\t\texpect((adapter as any).applyDropForeignKey).toBeUndefined()\n\t\t})\n\n\t\ttest('type-level: ChangeFor<MongoDbAdapter> excludes DDL variants', () => {\n\t\t\ttype Changes = import('../../migrations/types').ChangeFor<MongoDbAdapter>\n\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'addIndex' }>>().not.toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropIndex' }>>().not.toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'execute' }>>().not.toBeNever()\n\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'addField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'createTable' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropTable' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'modifyField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'renameTable' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'renameField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'addForeignKey' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropForeignKey' }>>().toBeNever()\n\t\t})\n\n\t\ttest('type-level: Migrator.from(repo, adapter).build() works without withoutLock', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst step = Migrator.from(repo, adapter).migrations([])\n\n\t\t\texpectTypeOf(step).toHaveProperty('build')\n\t\t\texpectTypeOf(step).toHaveProperty('withoutLock')\n\t\t})\n\n\t\ttest('type-level: Migrator.from(repo, adapter).withoutLock().build() also works', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst migrator = Migrator.from(repo, adapter).migrations([]).withoutLock().build()\n\t\t\texpect(migrator).toBeDefined()\n\t\t})\n\n\t\ttest('end-to-end: Migrator runs addIndex + dropIndex + execute changes', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\n\t\t\tlet executeRan = false\n\t\t\ttype M = import('../../migrations/types').Migration<typeof adapter>\n\t\t\tconst migrations: M[] = [\n\t\t\t\t{\n\t\t\t\t\tid: '0001-add-idx',\n\t\t\t\t\ttx: false,\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'addIndex', table: 'users', on: ['email'], unique: true },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0002-backfill',\n\t\t\t\t\ttx: false,\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'execute', up: async () => { executeRan = true } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0003-drop-idx',\n\t\t\t\t\ttx: false,\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'dropIndex', name: 'users_email_idx' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tconst migrator = Migrator.from(repo, adapter).migrations(migrations).build()\n\t\t\tconst result = await migrator.up()\n\n\t\t\texpect(result.ran).toEqual(['0001-add-idx', '0002-backfill', '0003-drop-idx'])\n\t\t\texpect(executeRan).toBe(true)\n\t\t\texpect(state.migrations.size).toBe(3)\n\t\t\texpect(state.collections.get('users')!.indexes).toHaveLength(0)\n\t\t})\n\n\t\ttest('introspect round-trip: addIndex then introspect sees the index', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tstate.collections.set('users', {\n\t\t\t\tindexes: [{ name: 'users_email_idx', key: { email: 1 }, unique: true }],\n\t\t\t})\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].name).toBe('users')\n\t\t\texpect(schemas[0].pk).toBeUndefined()\n\t\t\texpect(schemas[0].fields).toEqual([])\n\t\t\texpect(schemas[0].foreignKeys).toEqual([])\n\t\t\texpect(schemas[0].indexes).toEqual([\n\t\t\t\t{ name: 'users_email_idx', on: ['email'], unique: true },\n\t\t\t])\n\t\t})\n\n\t\ttest('data backfill via execute change', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tmockMongoDb(adapter)\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\n\t\t\tconst backfilledData: string[] = []\n\t\t\ttype M = import('../../migrations/types').Migration<typeof adapter>\n\t\t\tconst m: M = {\n\t\t\t\tid: '0001-backfill',\n\t\t\t\ttx: false,\n\t\t\t\tchanges: [{\n\t\t\t\t\tkind: 'execute',\n\t\t\t\t\tup: async () => {\n\t\t\t\t\t\tbackfilledData.push('user-1-normalized')\n\t\t\t\t\t\tbackfilledData.push('user-2-normalized')\n\t\t\t\t\t},\n\t\t\t\t}],\n\t\t\t}\n\n\t\t\tconst migrator = Migrator.from(repo, adapter).migrations([m]).build()\n\t\t\tawait migrator.up()\n\n\t\t\texpect(backfilledData).toEqual(['user-1-normalized', 'user-2-normalized'])\n\t\t})\n\t})\n}\n","import { Filter, FilterGroup, type FilterChild } from '../../filter'\nimport type { AggregateSpec } from '../../orm-adapter'\nimport type { QueryOptions } from '../../query-options'\nimport { flattenOps, IncOp, MaxOp, MinOp, MulOp, PatchOp, PullOp, PushOp, SetOp, UnsetOp, type AnyUpdateOp } from '../../updates'\n\ntype MongoFilter = Record<string, unknown>\n\nexport function compileMongoFilter(group: FilterGroup, primaryKey: string): MongoFilter {\n\tconst clauses: MongoFilter[] = []\n\tfor (const child of group.children) {\n\t\tconst compiled = compileChild(child, primaryKey)\n\t\tif (compiled) clauses.push(compiled)\n\t}\n\n\tif (clauses.length === 0) return {}\n\tif (clauses.length === 1) return clauses[0]\n\treturn { $and: clauses }\n}\n\nexport function compileMongoQuery(\n\tgroup: FilterGroup,\n\toptions: QueryOptions | undefined,\n\tprimaryKey: string,\n): {\n\tfilter: MongoFilter\n\tsort: Record<string, 1 | -1> | undefined\n\tlimit: number | undefined\n\tskip: number | undefined\n\tprojection: Record<string, 1> | undefined\n} {\n\tconst mongoFilter = compileMongoFilter(group, primaryKey)\n\n\tconst orderBys = options?.orderBy ?? []\n\tconst sort =\n\t\torderBys.length > 0\n\t\t\t? Object.fromEntries(orderBys.map((o) => [mapField(o.field, primaryKey), o.direction === 'desc' ? -1 : 1]))\n\t\t\t: undefined\n\n\tconst selects = options?.select ?? []\n\tconst projection = selects.length > 0 ? Object.fromEntries(selects.map((f) => [mapField(f, primaryKey), 1])) : undefined\n\n\treturn {\n\t\tfilter: mongoFilter,\n\t\tsort: sort as Record<string, 1 | -1> | undefined,\n\t\tlimit: options?.limit,\n\t\tskip: options?.offset,\n\t\tprojection: projection as Record<string, 1> | undefined,\n\t}\n}\n\nfunction mapField(field: string, primaryKey: string): string {\n\tif (field === 'id' && primaryKey === '_id') return '_id'\n\treturn field\n}\n\nfunction compileFilter(f: Filter, primaryKey: string): MongoFilter {\n\tconst field = mapField(f.field, primaryKey)\n\n\tswitch (f.op) {\n\t\tcase 'eq':\n\t\t\treturn { [field]: { $eq: f.value } }\n\t\tcase 'ne':\n\t\t\treturn { [field]: { $ne: f.value } }\n\t\tcase 'gt':\n\t\t\treturn { [field]: { $gt: f.value } }\n\t\tcase 'gte':\n\t\t\treturn { [field]: { $gte: f.value } }\n\t\tcase 'lt':\n\t\t\treturn { [field]: { $lt: f.value } }\n\t\tcase 'lte':\n\t\t\treturn { [field]: { $lte: f.value } }\n\t\tcase 'in':\n\t\t\treturn { [field]: { $in: f.value } }\n\t\tcase 'notIn':\n\t\t\treturn { [field]: { $nin: f.value } }\n\t\tcase 'like':\n\t\t\treturn { [field]: { $regex: new RegExp(String(f.value), 'i') } }\n\t\tcase 'exists':\n\t\t\treturn { [field]: { $exists: true, $ne: null } }\n\t\tcase 'notExists':\n\t\t\treturn { [field]: { $eq: null } }\n\t\tcase 'contains':\n\t\t\treturn { [field]: { $all: Array.isArray(f.value) ? f.value : [f.value] } }\n\t\tcase 'notContains':\n\t\t\treturn { [field]: { $not: { $all: Array.isArray(f.value) ? f.value : [f.value] } } }\n\t\tdefault:\n\t\t\treturn { [field]: { $eq: f.value } }\n\t}\n}\n\nfunction compileChild(child: FilterChild, primaryKey: string): MongoFilter | null {\n\tif (child instanceof Filter) return compileFilter(child, primaryKey)\n\tif (child instanceof FilterGroup) return compileGroup(child, primaryKey)\n\treturn null\n}\n\nfunction compileGroup(group: FilterGroup, primaryKey: string): MongoFilter | null {\n\tconst clauses = group.children.map((c) => compileChild(c, primaryKey)).filter((c): c is MongoFilter => c !== null)\n\tif (clauses.length === 0) return null\n\tif (clauses.length === 1) return clauses[0]\n\treturn { [group.op === 'or' ? '$or' : '$and']: clauses }\n}\n\nexport function compileMongoUpdate(data: Record<string, unknown>): Record<string, unknown> {\n\tconst $set: Record<string, unknown> = {}\n\tconst $inc: Record<string, unknown> = {}\n\tconst $mul: Record<string, unknown> = {}\n\tconst $min: Record<string, unknown> = {}\n\tconst $max: Record<string, unknown> = {}\n\tconst $unset: Record<string, ''> = {}\n\tconst $push: Record<string, unknown> = {}\n\tconst $pull: Record<string, unknown> = {}\n\n\tfor (const [key, value] of Object.entries(data)) {\n\t\tif (value instanceof IncOp) $inc[key] = value.value\n\t\telse if (value instanceof MulOp) $mul[key] = value.value\n\t\telse if (value instanceof MinOp) $min[key] = value.value\n\t\telse if (value instanceof MaxOp) $max[key] = value.value\n\t\telse if (value instanceof UnsetOp) $unset[key] = ''\n\t\telse if (value instanceof PushOp) $push[key] = value.value\n\t\telse if (value instanceof PullOp) $pull[key] = value.value\n\t\telse if (value instanceof PatchOp) {\n\t\t\tconst patchVal = value.value as Record<string, unknown>\n\t\t\tfor (const [subKey, subVal] of Object.entries(patchVal)) {\n\t\t\t\t$set[`${key}.${subKey}`] = subVal\n\t\t\t}\n\t\t} else $set[key] = value\n\t}\n\n\tconst result: Record<string, unknown> = {}\n\tif (Object.keys($set).length) result.$set = $set\n\tif (Object.keys($inc).length) result.$inc = $inc\n\tif (Object.keys($mul).length) result.$mul = $mul\n\tif (Object.keys($min).length) result.$min = $min\n\tif (Object.keys($max).length) result.$max = $max\n\tif (Object.keys($unset).length) result.$unset = $unset\n\tif (Object.keys($push).length) result.$push = $push\n\tif (Object.keys($pull).length) result.$pull = $pull\n\n\treturn result\n}\n\nexport function compileMongoOps(ops: AnyUpdateOp[]): Record<string, unknown> {\n\treturn compileMongoUpdate(flattenOps(ops))\n}\n\nexport function compileMongoAggregate(spec: AggregateSpec, primaryKey: string): Record<string, unknown>[] {\n\tconst pipeline: Record<string, unknown>[] = []\n\n\tif (spec.where) {\n\t\tconst match = compileMongoFilter(spec.where, primaryKey)\n\t\tif (Object.keys(match).length > 0) pipeline.push({ $match: match })\n\t}\n\n\tconst groupId: Record<string, string> | null =\n\t\tspec.groupBy.length > 0\n\t\t\t? Object.fromEntries(spec.groupBy.map((f) => [f, `$${mapField(f, primaryKey)}`]))\n\t\t\t: null\n\n\tconst accumulators: Record<string, unknown> = {}\n\tfor (const agg of spec.aggregates) {\n\t\tconst fieldRef = agg.field ? `$${mapField(agg.field, primaryKey)}` : undefined\n\t\tswitch (agg.fn) {\n\t\t\tcase 'count':\n\t\t\t\taccumulators[agg.alias] = { $sum: 1 }\n\t\t\t\tbreak\n\t\t\tcase 'countDistinct':\n\t\t\t\taccumulators[agg.alias] = { $addToSet: fieldRef }\n\t\t\t\tbreak\n\t\t\tcase 'sum':\n\t\t\tcase 'avg':\n\t\t\tcase 'min':\n\t\t\tcase 'max':\n\t\t\t\taccumulators[agg.alias] = { [`$${agg.fn}`]: fieldRef }\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpipeline.push({ $group: { _id: groupId, ...accumulators } })\n\n\tconst project: Record<string, unknown> = { _id: 0 }\n\tfor (const f of spec.groupBy) {\n\t\tproject[f] = `$_id.${f}`\n\t}\n\tfor (const agg of spec.aggregates) {\n\t\tif (agg.fn === 'countDistinct') {\n\t\t\tproject[agg.alias] = { $size: `$${agg.alias}` }\n\t\t} else {\n\t\t\tproject[agg.alias] = 1\n\t\t}\n\t}\n\tpipeline.push({ $project: project })\n\n\tif (spec.having) {\n\t\tconst havingMatch = compileMongoFilter(spec.having, '')\n\t\tif (Object.keys(havingMatch).length > 0) pipeline.push({ $match: havingMatch })\n\t}\n\n\treturn pipeline\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect } = import.meta.vitest\n\tconst { FilterGroup } = await import('../../filter')\n\tconst { OrderBy } = await import('../../query-options')\n\n\tdescribe('compileMongoFilter', () => {\n\t\ttest('empty filter group compiles to empty object', () => {\n\t\t\tconst group = FilterGroup.create()\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({})\n\t\t})\n\n\t\ttest('single eq filter compiles to $eq', () => {\n\t\t\tconst group = FilterGroup.create().eq('name', 'Alice')\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ name: { $eq: 'Alice' } })\n\t\t})\n\n\t\ttest('ne, gt, gte, lt, lte compile to corresponding Mongo ops', () => {\n\t\t\texpect(compileMongoFilter(FilterGroup.create().ne('age', 5), 'id')).toEqual({ age: { $ne: 5 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().gt('age', 10), 'id')).toEqual({ age: { $gt: 10 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().gte('age', 20), 'id')).toEqual({ age: { $gte: 20 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().lt('age', 30), 'id')).toEqual({ age: { $lt: 30 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().lte('age', 40), 'id')).toEqual({ age: { $lte: 40 } })\n\t\t})\n\n\t\ttest('in compiles to $in', () => {\n\t\t\tconst group = FilterGroup.create().in('status', ['a', 'b'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ status: { $in: ['a', 'b'] } })\n\t\t})\n\n\t\ttest('notIn compiles to $nin (canonical name notIn, Mongo op $nin)', () => {\n\t\t\tconst group = FilterGroup.create().notIn('status', ['x', 'y'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ status: { $nin: ['x', 'y'] } })\n\t\t})\n\n\t\ttest('like compiles to $regex with case-insensitive flag', () => {\n\t\t\tconst group = FilterGroup.create().like('name', 'ali')\n\t\t\tconst result = compileMongoFilter(group, 'id')\n\t\t\texpect(result.name).toEqual({ $regex: expect.any(RegExp) })\n\t\t\tconst regex = (result.name as any).$regex as RegExp\n\t\t\texpect(regex.flags).toBe('i')\n\t\t\texpect(regex.test('Alice')).toBe(true)\n\t\t})\n\n\t\ttest('exists compiles to $exists: true, $ne: null', () => {\n\t\t\tconst group = FilterGroup.create().exists('val')\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ val: { $exists: true, $ne: null } })\n\t\t})\n\n\t\ttest('notExists is its own op — compiles to $eq: null', () => {\n\t\t\tconst group = FilterGroup.create().notExists('val')\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ val: { $eq: null } })\n\t\t})\n\n\t\ttest('contains compiles to $all', () => {\n\t\t\tconst group = FilterGroup.create().contains('tags', ['a', 'b'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ tags: { $all: ['a', 'b'] } })\n\t\t})\n\n\t\ttest('notContains compiles to $not: { $all }', () => {\n\t\t\tconst group = FilterGroup.create().notContains('tags', ['x'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ tags: { $not: { $all: ['x'] } } })\n\t\t})\n\n\t\ttest('multiple clauses produce $and', () => {\n\t\t\tconst group = FilterGroup.create().eq('a', 1).gt('b', 2)\n\t\t\tconst result = compileMongoFilter(group, 'id')\n\t\t\texpect(result).toEqual({ $and: [{ a: { $eq: 1 } }, { b: { $gt: 2 } }] })\n\t\t})\n\n\t\ttest('nested and/or groups compile correctly', () => {\n\t\t\tconst group = FilterGroup.create().and([\n\t\t\t\t(q) => q.eq('a', 1),\n\t\t\t\t(q) => q.or([(g) => g.eq('b', 2), (g) => g.eq('c', 3)]),\n\t\t\t])\n\t\t\tconst result = compileMongoFilter(group, 'id')\n\t\t\texpect(result).toEqual({\n\t\t\t\t$and: [{ a: { $eq: 1 } }, { $or: [{ b: { $eq: 2 } }, { c: { $eq: 3 } }] }],\n\t\t\t})\n\t\t})\n\n\t\ttest('maps id field to _id when primaryKey is _id', () => {\n\t\t\tconst group = FilterGroup.create().eq('id', 'abc')\n\t\t\texpect(compileMongoFilter(group, '_id')).toEqual({ _id: { $eq: 'abc' } })\n\t\t})\n\t})\n\n\tdescribe('compileMongoQuery', () => {\n\t\ttest('options: sort, limit, skip, projection', () => {\n\t\t\tconst group = FilterGroup.create().eq('active', true)\n\t\t\tconst options = {\n\t\t\t\torderBy: [new OrderBy('name', 'asc'), new OrderBy('age', 'desc')],\n\t\t\t\tlimit: 10,\n\t\t\t\toffset: 5,\n\t\t\t\tselect: ['name', 'age'] as const,\n\t\t\t}\n\t\t\tconst result = compileMongoQuery(group, options, 'id')\n\t\t\texpect(result.filter).toEqual({ active: { $eq: true } })\n\t\t\texpect(result.sort).toEqual({ name: 1, age: -1 })\n\t\t\texpect(result.limit).toBe(10)\n\t\t\texpect(result.skip).toBe(5)\n\t\t\texpect(result.projection).toEqual({ name: 1, age: 1 })\n\t\t})\n\n\t\ttest('undefined options returns undefined for sort/limit/skip/projection', () => {\n\t\t\tconst group = FilterGroup.create().eq('x', 1)\n\t\t\tconst result = compileMongoQuery(group, undefined, 'id')\n\t\t\texpect(result.sort).toBeUndefined()\n\t\t\texpect(result.limit).toBeUndefined()\n\t\t\texpect(result.skip).toBeUndefined()\n\t\t\texpect(result.projection).toBeUndefined()\n\t\t})\n\t})\n\n\tdescribe('compileMongoUpdate', () => {\n\t\ttest('plain values go into $set', () => {\n\t\t\tconst result = compileMongoUpdate({ name: 'Alice', age: 30 })\n\t\t\texpect(result).toEqual({ $set: { name: 'Alice', age: 30 } })\n\t\t})\n\n\t\ttest('IncOp goes into $inc', () => {\n\t\t\tconst result = compileMongoUpdate({ count: new IncOp('count', 5) })\n\t\t\texpect(result).toEqual({ $inc: { count: 5 } })\n\t\t})\n\n\t\ttest('MulOp goes into $mul', () => {\n\t\t\tconst result = compileMongoUpdate({ score: new MulOp('score', 2) })\n\t\t\texpect(result).toEqual({ $mul: { score: 2 } })\n\t\t})\n\n\t\ttest('MinOp/MaxOp go into $min/$max', () => {\n\t\t\tconst result = compileMongoUpdate({\n\t\t\t\tlo: new MinOp('lo', 1),\n\t\t\t\thi: new MaxOp('hi', 99),\n\t\t\t})\n\t\t\texpect(result).toEqual({ $min: { lo: 1 }, $max: { hi: 99 } })\n\t\t})\n\n\t\ttest('UnsetOp goes into $unset', () => {\n\t\t\tconst result = compileMongoUpdate({ old: new UnsetOp('old') })\n\t\t\texpect(result).toEqual({ $unset: { old: '' } })\n\t\t})\n\n\t\ttest('PushOp/PullOp go into $push/$pull', () => {\n\t\t\tconst result = compileMongoUpdate({\n\t\t\t\ttags: new PushOp('tags', 'new'),\n\t\t\t\tremoved: new PullOp('removed', 'old'),\n\t\t\t})\n\t\t\texpect(result).toEqual({ $push: { tags: 'new' }, $pull: { removed: 'old' } })\n\t\t})\n\n\t\ttest('PatchOp produces dot-notation $set entries', () => {\n\t\t\tconst result = compileMongoUpdate({ meta: new PatchOp('meta', { a: 1, b: 2 }) })\n\t\t\texpect(result).toEqual({ $set: { 'meta.a': 1, 'meta.b': 2 } })\n\t\t})\n\n\t\ttest('empty data produces empty result', () => {\n\t\t\tconst result = compileMongoUpdate({})\n\t\t\texpect(result).toEqual({})\n\t\t})\n\t})\n\n\tdescribe('compileMongoOps', () => {\n\t\ttest('SetOp values go into $set', () => {\n\t\t\tconst result = compileMongoOps([new SetOp({ name: 'Bob', age: 25 })])\n\t\t\texpect(result).toEqual({ $set: { name: 'Bob', age: 25 } })\n\t\t})\n\n\t\ttest('mixed ops compile to separate Mongo update operators', () => {\n\t\t\tconst result = compileMongoOps([\n\t\t\t\tnew SetOp({ name: 'Alice' }),\n\t\t\t\tnew IncOp('count', 1),\n\t\t\t\tnew PushOp('tags', 'x'),\n\t\t\t])\n\t\t\texpect(result).toEqual({\n\t\t\t\t$set: { name: 'Alice' },\n\t\t\t\t$inc: { count: 1 },\n\t\t\t\t$push: { tags: 'x' },\n\t\t\t})\n\t\t})\n\n\t\ttest('empty ops produces empty result', () => {\n\t\t\texpect(compileMongoOps([])).toEqual({})\n\t\t})\n\t})\n\n\tdescribe('compileMongoAggregate', () => {\n\t\ttest('bare count produces $group with $sum:1 and $project', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('multi-aggregator produces all accumulators in $group', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'total' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'revenue' },\n\t\t\t\t\t{ fn: 'avg', field: 'price', alias: 'avgPrice' },\n\t\t\t\t],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\ttotal: { $sum: 1 },\n\t\t\t\t\t\trevenue: { $sum: '$amount' },\n\t\t\t\t\t\tavgPrice: { $avg: '$price' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $project: { _id: 0, total: 1, revenue: 1, avgPrice: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('single-column groupBy produces composite _id and $project lift', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: { region: '$region' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('multi-column groupBy via composite _id', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'sum', field: 'amount', alias: 'revenue' }],\n\t\t\t\tgroupBy: ['region', 'year'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region', year: '$year' },\n\t\t\t\t\t\trevenue: { $sum: '$amount' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$project: {\n\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\tregion: '$_id.region',\n\t\t\t\t\t\tyear: '$_id.year',\n\t\t\t\t\t\trevenue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t})\n\n\t\ttest('where-only emits $match before $group', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create().eq('active', true),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $match: { active: { $eq: true } } },\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('having-only emits $match after $project', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t\thaving: FilterGroup.create().gt('total', 5),\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: { region: '$region' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', total: 1 } },\n\t\t\t\t{ $match: { total: { $gt: 5 } } },\n\t\t\t])\n\t\t})\n\n\t\ttest('where + having produces both $match stages', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create().eq('active', true),\n\t\t\t\taggregates: [{ fn: 'sum', field: 'amount', alias: 'revenue' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t\thaving: FilterGroup.create().gte('revenue', 1000),\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $match: { active: { $eq: true } } },\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region' },\n\t\t\t\t\t\trevenue: { $sum: '$amount' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', revenue: 1 } },\n\t\t\t\t{ $match: { revenue: { $gte: 1000 } } },\n\t\t\t])\n\t\t})\n\n\t\ttest('countDistinct uses $addToSet in $group and $size in $project', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'countDistinct', field: 'userId', alias: 'uniqueUsers' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: null, uniqueUsers: { $addToSet: '$userId' } } },\n\t\t\t\t{ $project: { _id: 0, uniqueUsers: { $size: '$uniqueUsers' } } },\n\t\t\t])\n\t\t})\n\n\t\ttest('min/max produce $min/$max accumulators', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'min', field: 'price', alias: 'lowest' },\n\t\t\t\t\t{ fn: 'max', field: 'price', alias: 'highest' },\n\t\t\t\t],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\tlowest: { $min: '$price' },\n\t\t\t\t\t\thighest: { $max: '$price' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $project: { _id: 0, lowest: 1, highest: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('field-name mapping: id field maps to _id when primaryKey is _id', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create().eq('id', 'abc'),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['id'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $match: { _id: { $eq: 'abc' } } },\n\t\t\t\t{ $group: { _id: { id: '$_id' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, id: '$_id.id', total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('countDistinct with groupBy combines $addToSet, groupBy lift, and $size', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'countDistinct', field: 'category', alias: 'uniqueCats' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region' },\n\t\t\t\t\t\tuniqueCats: { $addToSet: '$category' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$project: {\n\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\tregion: '$_id.region',\n\t\t\t\t\t\tuniqueCats: { $size: '$uniqueCats' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t})\n\n\t\ttest('all six aggregators in a single pipeline', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'total' },\n\t\t\t\t\t{ fn: 'countDistinct', field: 'status', alias: 'uniqueStatuses' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'totalAmount' },\n\t\t\t\t\t{ fn: 'avg', field: 'amount', alias: 'avgAmount' },\n\t\t\t\t\t{ fn: 'min', field: 'amount', alias: 'minAmount' },\n\t\t\t\t\t{ fn: 'max', field: 'amount', alias: 'maxAmount' },\n\t\t\t\t],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t}\n\t\t\tconst pipeline = compileMongoAggregate(spec, '_id')\n\t\t\texpect(pipeline).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region' },\n\t\t\t\t\t\ttotal: { $sum: 1 },\n\t\t\t\t\t\tuniqueStatuses: { $addToSet: '$status' },\n\t\t\t\t\t\ttotalAmount: { $sum: '$amount' },\n\t\t\t\t\t\tavgAmount: { $avg: '$amount' },\n\t\t\t\t\t\tminAmount: { $min: '$amount' },\n\t\t\t\t\t\tmaxAmount: { $max: '$amount' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$project: {\n\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\tregion: '$_id.region',\n\t\t\t\t\t\ttotal: 1,\n\t\t\t\t\t\tuniqueStatuses: { $size: '$uniqueStatuses' },\n\t\t\t\t\t\ttotalAmount: 1,\n\t\t\t\t\t\tavgAmount: 1,\n\t\t\t\t\t\tminAmount: 1,\n\t\t\t\t\t\tmaxAmount: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t})\n\n\t\ttest('empty where filter is omitted from pipeline', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create(),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, total: 1 } },\n\t\t\t])\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["FilterGroup","v","FilterGroup"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/orm/adapters/mongodb/index.ts","../../../../../src/orm/adapters/mongodb/query.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { MongoClient, type ClientSession, type MongoClientOptions, type OptionalUnlessRequiredId } from 'mongodb'\nimport { v, type PipeOutput } from 'valleyed'\n\nimport { compileMongoAggregate, compileMongoFilter, compileMongoOps, compileMongoQuery, compileMongoUpdate } from './query'\nimport { EquippedError } from '../../../errors'\nimport { configurable } from '../../../utilities/configurable'\nimport type { FilterGroup } from '../../filter'\nimport type { DiscoveredSchema } from '../../migrations/introspection-types'\nimport type { AddIndexChange, DropIndexChange } from '../../migrations/types'\nimport { OrmAdapter, type AggregateSpec } from '../../orm-adapter'\nimport type { IterationQueryOptions, QueryOptions } from '../../query-options'\nimport type { AnySchema } from '../../schema'\nimport type { AnyUpdateOp } from '../../updates'\n\nconst mongoSchemaConfigPipe = () => v.object({ db: v.string(), col: v.string() })\nexport type MongoDbRepoConfig = PipeOutput<ReturnType<typeof mongoSchemaConfigPipe>>\n\nconst mongoConnectionPipe = () =>\n\tv.object({\n\t\turi: v.string(),\n\t})\n\nconst MIGRATION_TRACKER_COLLECTION = 'equipped_migrations'\n\nexport class MongoDbAdapter extends configurable(mongoConnectionPipe, OrmAdapter) {\n\treadonly schemaConfigPipe = mongoSchemaConfigPipe()\n\n\treadonly queryableOps = ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'like', 'exists', 'notExists', 'contains', 'notContains'] as const\n\treadonly updateOps = ['set', 'inc', 'mul', 'min', 'max', 'unset', 'push', 'pull', 'patch'] as const\n\treadonly aggregateOps = ['count', 'countDistinct', 'sum', 'avg', 'min', 'max'] as const\n\treadonly supportedFieldTypes = ['string', 'number', 'boolean', 'null', 'object', 'array', 'date'] as const\n\n\treadonly client: MongoClient\n\treadonly #sessionStore = new AsyncLocalStorage<ClientSession | undefined>()\n\n\tprotected constructor(config: typeof MongoDbAdapter.Config, options?: MongoClientOptions) {\n\t\tsuper(config)\n\t\tthis.client = new MongoClient(config.uri, {\n\t\t\t...options,\n\t\t\tignoreUndefined: true,\n\t\t})\n\t}\n\n\t#getCollection(schemaCfg: MongoDbRepoConfig) {\n\t\treturn this.client.db(schemaCfg.db).collection(schemaCfg.col)\n\t}\n\n\tasync connect() {\n\t\ttry {\n\t\t\tawait this.client.connect()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError('Failed to connect MongoDB client', { adapter: 'mongodb' }, error)\n\t\t}\n\t}\n\n\tasync disconnect() {\n\t\ttry {\n\t\t\tawait this.client.close()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError('Failed to disconnect MongoDB client', { adapter: 'mongodb' }, error)\n\t\t}\n\t}\n\n\tasync findByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pkName = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst doc = await collection.findOne(\n\t\t\t\t{ [pkName]: pk },\n\t\t\t\t{ session: this.#sessionStore.getStore() },\n\t\t\t)\n\t\t\treturn doc as Record<string, unknown> | null\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB findByPk failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'findByPk', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync createMany(_schema: AnySchema, config: unknown, data: Record<string, unknown>[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst docs = data.map((d) => d as OptionalUnlessRequiredId<any>)\n\t\t\tawait collection.insertMany(docs, { session: this.#sessionStore.getStore() })\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB createMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'createMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync updateByPk(schema: AnySchema, config: unknown, pk: unknown, ops: AnyUpdateOp[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pkName = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst update = compileMongoOps(ops)\n\t\t\tif (Object.keys(update).length === 0) {\n\t\t\t\treturn await collection.findOne({ [pkName]: pk }, { session: this.#sessionStore.getStore() }) as Record<string, unknown> | null\n\t\t\t}\n\t\t\treturn await collection.findOneAndUpdate(\n\t\t\t\t{ [pkName]: pk },\n\t\t\t\tupdate,\n\t\t\t\t{ returnDocument: 'after', session: this.#sessionStore.getStore() },\n\t\t\t) as Record<string, unknown> | null\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB updateByPk failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'updateByPk', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync deleteByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pkName = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\treturn await collection.findOneAndDelete(\n\t\t\t\t{ [pkName]: pk },\n\t\t\t\t{ session: this.#sessionStore.getStore() },\n\t\t\t) as Record<string, unknown> | null\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB deleteByPk failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'deleteByPk', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync raw(_schema: AnySchema, config: unknown, pipeline: Record<string, unknown>[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst result = await collection.aggregate(pipeline, { session: this.#sessionStore.getStore() }).toArray()\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tif (error instanceof EquippedError) throw error\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB raw failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'raw', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync aggregate(schema: AnySchema, config: unknown, spec: AggregateSpec): Promise<Array<Record<string, unknown>>> {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst pipeline = compileMongoAggregate(spec, pk)\n\t\t\tconst result = await collection.aggregate(pipeline, { session: this.#sessionStore.getStore() }).toArray()\n\t\t\treturn result as Array<Record<string, unknown>>\n\t\t} catch (error) {\n\t\t\tif (error instanceof EquippedError) throw error\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB aggregate failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'aggregate', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync findMany(schema: AnySchema, config: unknown, filter: FilterGroup, options?: QueryOptions) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst { filter: mongoFilter, sort, limit, skip, projection } = compileMongoQuery(filter, options, pk)\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\n\t\t\tlet cursor = collection.find(mongoFilter, {\n\t\t\t\tsession: this.#sessionStore.getStore(),\n\t\t\t\tprojection,\n\t\t\t})\n\t\t\tif (sort) cursor = cursor.sort(sort)\n\t\t\tif (limit) cursor = cursor.limit(limit)\n\t\t\tif (skip) cursor = cursor.skip(skip)\n\n\t\t\treturn await cursor.toArray()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB findMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'findMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync count(schema: AnySchema, config: unknown, filter: FilterGroup) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\treturn await collection.countDocuments(compileMongoFilter(filter, pk), { session: this.#sessionStore.getStore() })\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB count failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'count', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync *iterateMany(schema: AnySchema, config: unknown, filter: FilterGroup, options?: IterationQueryOptions) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\tlet cursor: any\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst { filter: mongoFilter, sort, limit, skip, projection } = compileMongoQuery(filter, options, pk)\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\n\t\t\tcursor = collection.find(mongoFilter, {\n\t\t\t\tsession: this.#sessionStore.getStore(),\n\t\t\t\tprojection,\n\t\t\t})\n\t\t\tif (sort) cursor = cursor.sort(sort)\n\t\t\tif (limit) cursor = cursor.limit(limit)\n\t\t\tif (skip) cursor = cursor.skip(skip)\n\t\t\tif (options?.batchSize !== undefined) cursor = cursor.batchSize(options.batchSize)\n\n\t\t\tfor await (const row of cursor) {\n\t\t\t\tyield row as Record<string, unknown>\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB iterateMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'iterateMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t} finally {\n\t\t\tawait cursor?.close()\n\t\t}\n\t}\n\n\tasync updateMany(schema: AnySchema, config: unknown, filter: FilterGroup, data: Record<string, unknown>) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst session = this.#sessionStore.getStore()\n\t\t\tconst mongoFilter = compileMongoFilter(filter, pk)\n\n\t\t\tconst matchingDocs = await collection.find(mongoFilter, { session, projection: { [pk]: 1 } }).toArray()\n\t\t\tconst ids = matchingDocs.map((d) => d[pk])\n\t\t\tconst idFilter = { [pk]: { $in: ids } }\n\n\t\t\tconst update = compileMongoUpdate(data)\n\t\t\tif (Object.keys(update).length > 0) {\n\t\t\t\tawait collection.updateMany(idFilter, update, { session })\n\t\t\t}\n\n\t\t\treturn await collection.find({ [pk]: { $in: ids } }, { session }).toArray()\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB updateMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'updateMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync deleteMany(schema: AnySchema, config: unknown, filter: FilterGroup) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst session = this.#sessionStore.getStore()\n\t\t\tconst mongoFilter = compileMongoFilter(filter, pk)\n\n\t\t\tconst docs = await collection.find(mongoFilter, { session }).toArray()\n\t\t\tif (docs.length > 0) {\n\t\t\t\tawait collection.deleteMany(mongoFilter, { session })\n\t\t\t}\n\t\t\treturn docs\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB deleteMany failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'deleteMany', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync upsertOne(schema: AnySchema, config: unknown, filter: FilterGroup, create: Record<string, unknown>, ops: AnyUpdateOp[]) {\n\t\tconst schemaCfg = config as MongoDbRepoConfig\n\t\ttry {\n\t\t\tconst pk = schema.pkField.name\n\t\t\tconst collection = this.#getCollection(schemaCfg)\n\t\t\tconst mongoFilter = compileMongoFilter(filter, pk)\n\n\t\t\tconst updateDoc = compileMongoOps(ops)\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tmongoFilter,\n\t\t\t\t{\n\t\t\t\t\t...updateDoc,\n\t\t\t\t\t$setOnInsert: create,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: this.#sessionStore.getStore(),\n\t\t\t\t\tupsert: true,\n\t\t\t\t},\n\t\t\t)\n\n\t\t\treturn doc as Record<string, unknown>\n\t\t} catch (error) {\n\t\t\tthrow new EquippedError(\n\t\t\t\t'MongoDB upsertOne failed',\n\t\t\t\t{ adapter: 'mongodb', operation: 'upsertOne', collection: schemaCfg.col },\n\t\t\t\terror,\n\t\t\t)\n\t\t}\n\t}\n\n\tasync session<T>(fn: () => Promise<T>): Promise<T> {\n\t\tif (this.#sessionStore.getStore()) return fn()\n\t\ttry {\n\t\t\tconst session = await this.client.startSession()\n\t\t\ttry {\n\t\t\t\treturn await session.withTransaction(async () => this.#sessionStore.run(session, fn))\n\t\t\t} finally {\n\t\t\t\tawait session.endSession()\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof EquippedError) throw error\n\t\t\tthrow new EquippedError('MongoDB session failed', { adapter: 'mongodb', operation: 'session' }, error)\n\t\t}\n\t}\n\n\tasync loadMigrations(): Promise<{ id: string; appliedAt: number }[]> {\n\t\tconst db = this.client.db()\n\t\tconst docs = await db.collection(MIGRATION_TRACKER_COLLECTION).find({}).toArray()\n\t\treturn docs.map((d) => ({ id: String(d._id), appliedAt: d.appliedAt as number }))\n\t}\n\n\tasync recordMigration(id: string, appliedAt: number): Promise<void> {\n\t\tconst db = this.client.db()\n\t\tawait db.collection(MIGRATION_TRACKER_COLLECTION).insertOne({ _id: id as any, appliedAt })\n\t}\n\n\tasync applyAddIndex(change: AddIndexChange): Promise<void> {\n\t\tconst db = this.client.db()\n\t\tconst fields: Record<string, 1> = {}\n\t\tfor (const f of change.on) {\n\t\t\tfields[f] = 1\n\t\t}\n\t\tconst name = change.name ?? `${change.table}_${change.on.join('_')}_idx`\n\t\tawait db.collection(change.table).createIndex(fields, { unique: change.unique ?? false, name })\n\t}\n\n\tasync applyDropIndex(change: DropIndexChange): Promise<void> {\n\t\tconst db = this.client.db()\n\t\tconst collections = await db.listCollections().toArray()\n\t\tfor (const col of collections) {\n\t\t\tconst indexes = await db.collection(col.name).listIndexes().toArray()\n\t\t\tif (indexes.some((idx) => idx.name === change.name)) {\n\t\t\t\tawait db.collection(col.name).dropIndex(change.name)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tasync introspect(): Promise<DiscoveredSchema[]> {\n\t\tconst db = this.client.db()\n\t\tconst collections = await db.listCollections().toArray()\n\t\tconst schemas: DiscoveredSchema[] = []\n\t\tfor (const col of collections) {\n\t\t\tif (col.name === MIGRATION_TRACKER_COLLECTION) continue\n\t\t\tconst rawIndexes = await db.collection(col.name).listIndexes().toArray()\n\t\t\tconst indexes = rawIndexes\n\t\t\t\t.filter((idx) => idx.name !== '_id_')\n\t\t\t\t.map((idx) => ({\n\t\t\t\t\tname: idx.name as string,\n\t\t\t\t\ton: Object.keys(idx.key as Record<string, unknown>) as ReadonlyArray<string>,\n\t\t\t\t\tunique: !!(idx.unique),\n\t\t\t\t}))\n\t\t\tschemas.push({\n\t\t\t\tname: col.name,\n\t\t\t\tpk: undefined,\n\t\t\t\tfields: [],\n\t\t\t\tindexes,\n\t\t\t\tforeignKeys: [],\n\t\t\t})\n\t\t}\n\t\treturn schemas\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf } = import.meta.vitest\n\n\tdescribe('MongoDbAdapter: class-via-configurable shape', () => {\n\t\ttest('MongoDbAdapter.create validates connection config via pipe', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter).toBeInstanceOf(MongoDbAdapter)\n\t\t\texpect(adapter.client).toBeInstanceOf(MongoClient)\n\t\t})\n\n\t\ttest('MongoDbAdapter.create rejects invalid config', () => {\n\t\t\texpect(() => MongoDbAdapter.create({} as any)).toThrow()\n\t\t\texpect(() => MongoDbAdapter.create({ uri: 123 } as any)).toThrow()\n\t\t})\n\n\t\ttest('readonly schemaConfigPipe declared with { db, col } shape', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter.schemaConfigPipe).toBeDefined()\n\t\t})\n\n\t\ttest('capability declarations use as const', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\n\t\t\texpect(adapter.supportedFieldTypes).toEqual([\n\t\t\t\t'string', 'number', 'boolean', 'null', 'object', 'array', 'date',\n\t\t\t])\n\t\t\texpect(adapter.queryableOps).toEqual([\n\t\t\t\t'eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'like', 'exists', 'notExists', 'contains', 'notContains',\n\t\t\t])\n\t\t\texpect(adapter.updateOps).toEqual([\n\t\t\t\t'set', 'inc', 'mul', 'min', 'max', 'unset', 'push', 'pull', 'patch',\n\t\t\t])\n\t\t\texpect(adapter.aggregateOps).toEqual([\n\t\t\t\t'count', 'countDistinct', 'sum', 'avg', 'min', 'max',\n\t\t\t])\n\t\t})\n\n\t\ttest('underlying MongoClient exposed as readonly instance field', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter.client).toBeInstanceOf(MongoClient)\n\t\t})\n\n\t\ttest('adapter.use returns OrmUse-shaped object', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst schema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst use = adapter.use(schema, { db: 'testdb', col: 'testcol' })\n\n\t\t\texpect(use.findMany).toBeTypeOf('function')\n\t\t\texpect(use.iterateMany).toBeTypeOf('function')\n\t\t\texpect(use.findOne).toBeTypeOf('function')\n\t\t\texpect(use.count).toBeTypeOf('function')\n\t\t\texpect(use.createOne).toBeTypeOf('function')\n\t\t\texpect(use.createMany).toBeTypeOf('function')\n\t\t\texpect(use.updateMany).toBeTypeOf('function')\n\t\t\texpect(use.updateOne).toBeTypeOf('function')\n\t\t\texpect(use.upsertOne).toBeTypeOf('function')\n\t\t\texpect(use.deleteOne).toBeTypeOf('function')\n\t\t\texpect(use.deleteMany).toBeTypeOf('function')\n\t\t\texpect(use.raw).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('type-level: adapter declares all 9 canonical update ops', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Ops = typeof _adapter.updateOps\n\t\t\texpectTypeOf<Ops>().toEqualTypeOf<\n\t\t\t\treadonly ['set', 'inc', 'mul', 'min', 'max', 'unset', 'push', 'pull', 'patch']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: adapter declares all 7 field types', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Types = typeof _adapter.supportedFieldTypes\n\t\t\texpectTypeOf<Types>().toEqualTypeOf<\n\t\t\t\treadonly ['string', 'number', 'boolean', 'null', 'object', 'array', 'date']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: adapter declares all 13 queryable ops', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Ops = typeof _adapter.queryableOps\n\t\t\texpectTypeOf<Ops>().toEqualTypeOf<\n\t\t\t\treadonly ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'like', 'exists', 'notExists', 'contains', 'notContains']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: Repo.from with MongoDbAdapter enables all builder methods', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\n\t\t\tconst _one = repo.on(_TestSchema).one()\n\t\t\tconst _all = repo.on(_TestSchema).all()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\t\t\texpectTypeOf(_one.create).toBeFunction()\n\t\t\texpectTypeOf(_one.find).toBeFunction()\n\t\t\texpectTypeOf(_one.update).toBeFunction()\n\t\t\texpectTypeOf(_one.delete).toBeFunction()\n\t\t\texpectTypeOf(_one.upsert).toBeFunction()\n\t\t\texpectTypeOf(_all.create).toBeFunction()\n\t\t\texpectTypeOf(_all.find).toBeFunction()\n\t\t\texpectTypeOf(_all.count).toBeFunction()\n\t\t\texpectTypeOf(_all.update).toBeFunction()\n\t\t\texpectTypeOf(_all.delete).toBeFunction()\n\t\t\texpectTypeOf(_ref.raw).toBeFunction()\n\t\t\texpectTypeOf(repo.session).toBeFunction()\n\t\t})\n\n\t\ttest('type-level: raw arg-tuple infers (pipeline: Record<string, unknown>[]) from MongoDbAdapter', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\n\t\t\texpectTypeOf(_ref.raw).parameters.toEqualTypeOf<[pipeline: Record<string, unknown>[]]>()\n\t\t})\n\n\t\ttest('type-level: per-call <T> override narrows MongoDbAdapter raw return type', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\n\t\t\texpectTypeOf(_ref.raw<{ total: number }[]>).returns.toEqualTypeOf<Promise<{ total: number }[]>>()\n\t\t})\n\n\t\ttest('count forwards compiled filter to collection.countDocuments', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst schema = Schema.from('mongo_count').pk('_id', v.string(), () => 'x').field('name', v.string()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedFilter: unknown\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\tcountDocuments: async (filter: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedFilter = filter\n\t\t\t\t\t\treturn 7\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\tconst result = await adapter.count(schema, { db: 'testdb', col: 'things' }, FilterGroup.create().eq('name', 'Alice'))\n\t\t\texpect(capturedFilter).toEqual({ name: { $eq: 'Alice' } })\n\t\t\texpect(result).toBe(7)\n\t\t})\n\n\t\ttest('raw forwards pipeline to collection.aggregate at runtime', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst schema = Schema.from('mongo_raw').pk('id', v.string(), () => 'x').build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedPipeline: unknown\n\t\t\tconst mockResults = [{ total: 42 }]\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\taggregate: (pipeline: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedPipeline = pipeline\n\t\t\t\t\t\treturn { toArray: async () => mockResults }\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\t\t\tconst result = await adapter.use(schema, { db: 'testdb', col: 'things' }).raw([{ $count: 'total' }])\n\t\t\texpect(capturedPipeline).toEqual([{ $count: 'total' }])\n\t\t\texpect(result).toEqual(mockResults)\n\t\t})\n\n\t\ttest('iterateMany forwards batchSize and closes cursor on early return', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst { OrderBy } = await import('../../query-options')\n\t\t\tconst schema = Schema.from('mongo_iter').pk('_id', v.string(), () => 'x').field('age', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedFindFilter: unknown\n\t\t\tlet capturedFindOptions: unknown\n\t\t\tlet capturedSort: unknown\n\t\t\tlet capturedLimit: unknown\n\t\t\tlet capturedSkip: unknown\n\t\t\tlet capturedBatchSize: unknown\n\t\t\tlet closeCalls = 0\n\t\t\tconst cursor = {\n\t\t\t\tsort(sort: unknown) {\n\t\t\t\t\tcapturedSort = sort\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tlimit(limit: unknown) {\n\t\t\t\t\tcapturedLimit = limit\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tskip(skip: unknown) {\n\t\t\t\t\tcapturedSkip = skip\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tbatchSize(batchSize: unknown) {\n\t\t\t\t\tcapturedBatchSize = batchSize\n\t\t\t\t\treturn this\n\t\t\t\t},\n\t\t\t\tasync close() {\n\t\t\t\t\tcloseCalls += 1\n\t\t\t\t},\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\tyield { _id: 'u4', age: 50 }\n\t\t\t\t\tyield { _id: 'u3', age: 40 }\n\t\t\t\t},\n\t\t\t}\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\tfind: (filter: unknown, options: unknown) => {\n\t\t\t\t\t\tcapturedFindFilter = filter\n\t\t\t\t\t\tcapturedFindOptions = options\n\t\t\t\t\t\treturn cursor\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\tconst rows: Record<string, unknown>[] = []\n\t\t\tfor await (const row of adapter.use(schema, { db: 'testdb', col: 'people' }).iterateMany(FilterGroup.create().gt('age', 19), {\n\t\t\t\torderBy: [new OrderBy('age', 'desc')],\n\t\t\t\toffset: 1,\n\t\t\t\tlimit: 2,\n\t\t\t\tbatchSize: 25,\n\t\t\t})) {\n\t\t\t\trows.push(row)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\texpect(capturedFindFilter).toEqual({ age: { $gt: 19 } })\n\t\t\texpect(capturedFindOptions).toEqual({ session: undefined, projection: undefined })\n\t\t\texpect(capturedSort).toEqual({ age: -1 })\n\t\t\texpect(capturedLimit).toBe(2)\n\t\t\texpect(capturedSkip).toBe(1)\n\t\t\texpect(capturedBatchSize).toBe(25)\n\t\t\texpect(rows).toEqual([{ _id: 'u4', age: 50 }])\n\t\t\texpect(closeCalls).toBe(1)\n\t\t})\n\n\t\ttest('iterateMany closes cursor on normal completion', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst schema = Schema.from('mongo_iter_complete').pk('_id', v.string(), () => 'x').field('age', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet closeCalls = 0\n\t\t\tconst cursor = {\n\t\t\t\tasync close() {\n\t\t\t\t\tcloseCalls += 1\n\t\t\t\t},\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\tyield { _id: 'u1', age: 30 }\n\t\t\t\t\tyield { _id: 'u2', age: 40 }\n\t\t\t\t},\n\t\t\t}\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\tfind: () => cursor,\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\tconst rows: Record<string, unknown>[] = []\n\t\t\tfor await (const row of adapter.use(schema, { db: 'testdb', col: 'people' }).iterateMany(FilterGroup.create())) {\n\t\t\t\trows.push(row)\n\t\t\t}\n\n\t\t\texpect(rows).toEqual([{ _id: 'u1', age: 30 }, { _id: 'u2', age: 40 }])\n\t\t\texpect(closeCalls).toBe(1)\n\t\t})\n\n\t\ttest('nested session returns callback without starting new transaction', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\texpect(adapter.session).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('type-level: adapter declares all 6 canonical aggregate ops', () => {\n\t\t\tconst _adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\ttype Ops = typeof _adapter.aggregateOps\n\t\t\texpectTypeOf<Ops>().toEqualTypeOf<\n\t\t\t\treadonly ['count', 'countDistinct', 'sum', 'avg', 'min', 'max']\n\t\t\t>()\n\t\t})\n\n\t\ttest('type-level: Repo.from with MongoDbAdapter enables aggregate method', async () => {\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst _TestSchema = Schema.from('test').pk('id', v.string(), () => 'x').build()\n\t\t\tconst _ref = repo.on(_TestSchema)\n\t\t\texpectTypeOf(_ref.aggregate).toBeFunction()\n\t\t})\n\n\t\ttest('aggregate forwards compiled pipeline to collection.aggregate', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst schema = Schema.from('mongo_agg').pk('_id', v.string(), () => 'x').field('amount', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedPipeline: unknown\n\t\t\tconst mockResults = [{ total: 3, revenue: 150 }]\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\taggregate: (pipeline: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedPipeline = pipeline\n\t\t\t\t\t\treturn { toArray: async () => mockResults }\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\t\t\tconst result = await adapter.aggregate(schema, { db: 'testdb', col: 'orders' }, {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'total' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'revenue' },\n\t\t\t\t],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(capturedPipeline).toEqual([\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 }, revenue: { $sum: '$amount' } } },\n\t\t\t\t{ $project: { _id: 0, total: 1, revenue: 1 } },\n\t\t\t])\n\t\t\texpect(result).toEqual(mockResults)\n\t\t})\n\n\t\ttest('aggregate with where and groupBy produces correct pipeline', async () => {\n\t\t\tconst { Schema } = await import('../../schema')\n\t\t\tconst { v } = await import('valleyed')\n\t\t\tconst { FilterGroup } = await import('../../filter')\n\t\t\tconst schema = Schema.from('mongo_agg2').pk('_id', v.string(), () => 'x').field('region', v.string()).field('amount', v.number()).build()\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\t\t\tlet capturedPipeline: unknown\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: () => ({\n\t\t\t\t\taggregate: (pipeline: unknown, _opts: unknown) => {\n\t\t\t\t\t\tcapturedPipeline = pipeline\n\t\t\t\t\t\treturn { toArray: async () => [{ region: 'US', total: 2 }] }\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t})\n\t\t\tawait adapter.aggregate(schema, { db: 'testdb', col: 'orders' }, {\n\t\t\t\twhere: FilterGroup.create().gt('amount', 10),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t})\n\t\t\texpect(capturedPipeline).toEqual([\n\t\t\t\t{ $match: { amount: { $gt: 10 } } },\n\t\t\t\t{ $group: { _id: { region: '$region' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('auto-wires Instance hooks for connect/disconnect', async () => {\n\t\t\tconst { Instance: Inst } = await import('../../../instance')\n\t\t\tconst { vi } = await import('vitest')\n\t\t\tconst onSpy = vi.spyOn(Inst, 'on').mockImplementation(() => {})\n\n\t\t\tMongoDbAdapter.create({ uri: 'mongodb://localhost:27017' })\n\n\t\t\texpect(onSpy).toHaveBeenCalledWith('start', expect.any(Function), expect.objectContaining({ class: MongoDbAdapter }))\n\t\t\texpect(onSpy).toHaveBeenCalledWith('close', expect.any(Function), expect.objectContaining({ class: MongoDbAdapter }))\n\n\t\t\tonSpy.mockRestore()\n\t\t})\n\t})\n\n\tdescribe('MongoDbAdapter: migrations', () => {\n\t\tfunction mockMongoDb(adapter: MongoDbAdapter) {\n\t\t\tconst state = {\n\t\t\t\tmigrations: new Map<string, { _id: string; appliedAt: number }>(),\n\t\t\t\tcollections: new Map<string, { indexes: Array<{ name: string; key: Record<string, number>; unique?: boolean }> }>(),\n\t\t\t}\n\n\t\t\tconst getCol = (name: string) => {\n\t\t\t\tif (!state.collections.has(name)) {\n\t\t\t\t\tstate.collections.set(name, { indexes: [] })\n\t\t\t\t}\n\t\t\t\treturn state.collections.get(name)!\n\t\t\t}\n\n\t\t\t;(adapter.client as any).db = () => ({\n\t\t\t\tcollection: (name: string) => {\n\t\t\t\t\tif (name === MIGRATION_TRACKER_COLLECTION) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tfind: () => ({ toArray: async () => [...state.migrations.values()] }),\n\t\t\t\t\t\t\tinsertOne: async (doc: { _id: string; appliedAt: number }) => {\n\t\t\t\t\t\t\t\tstate.migrations.set(doc._id, doc)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst col = getCol(name)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcreateIndex: async (fields: Record<string, number>, opts: { unique?: boolean; name: string }) => {\n\t\t\t\t\t\t\tcol.indexes.push({ name: opts.name, key: fields, unique: opts.unique })\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdropIndex: async (indexName: string) => {\n\t\t\t\t\t\t\tcol.indexes = col.indexes.filter((i) => i.name !== indexName)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlistIndexes: () => ({\n\t\t\t\t\t\t\ttoArray: async () => [\n\t\t\t\t\t\t\t\t{ name: '_id_', key: { _id: 1 } },\n\t\t\t\t\t\t\t\t...col.indexes,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlistCollections: () => ({\n\t\t\t\t\ttoArray: async () => [...state.collections.keys()].map((name) => ({ name })),\n\t\t\t\t}),\n\t\t\t})\n\n\t\t\treturn state\n\t\t}\n\n\t\ttest('loadMigrations reads from equipped_migrations collection', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.migrations.set('0001', { _id: '0001', appliedAt: 1000 })\n\t\t\tstate.migrations.set('0002', { _id: '0002', appliedAt: 2000 })\n\n\t\t\tconst result = await adapter.loadMigrations()\n\t\t\texpect(result).toEqual([\n\t\t\t\t{ id: '0001', appliedAt: 1000 },\n\t\t\t\t{ id: '0002', appliedAt: 2000 },\n\t\t\t])\n\t\t})\n\n\t\ttest('loadMigrations returns empty array when no migrations exist', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tmockMongoDb(adapter)\n\n\t\t\tconst result = await adapter.loadMigrations()\n\t\t\texpect(result).toEqual([])\n\t\t})\n\n\t\ttest('recordMigration inserts into equipped_migrations with _id', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.recordMigration('0001', 1234)\n\n\t\t\texpect(state.migrations.has('0001')).toBe(true)\n\t\t\texpect(state.migrations.get('0001')).toEqual({ _id: '0001', appliedAt: 1234 })\n\t\t})\n\n\t\ttest('applyAddIndex creates index with specified name and fields', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'], unique: true, name: 'users_email_unique' })\n\n\t\t\tconst col = state.collections.get('users')!\n\t\t\texpect(col.indexes).toHaveLength(1)\n\t\t\texpect(col.indexes[0]).toEqual({ name: 'users_email_unique', key: { email: 1 }, unique: true })\n\t\t})\n\n\t\ttest('applyAddIndex auto-derives name when absent', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'] })\n\n\t\t\tconst col = state.collections.get('users')!\n\t\t\texpect(col.indexes[0].name).toBe('users_email_idx')\n\t\t})\n\n\t\ttest('applyAddIndex auto-derived compound index name', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'orders', on: ['userId', 'createdAt'] })\n\n\t\t\tconst col = state.collections.get('orders')!\n\t\t\texpect(col.indexes[0].name).toBe('orders_userId_createdAt_idx')\n\t\t\texpect(col.indexes[0].key).toEqual({ userId: 1, createdAt: 1 })\n\t\t})\n\n\t\ttest('applyDropIndex finds and drops index by scanning collections', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [{ name: 'users_email_idx', key: { email: 1 }, unique: true }] })\n\n\t\t\tawait adapter.applyDropIndex({ kind: 'dropIndex', name: 'users_email_idx' })\n\n\t\t\texpect(state.collections.get('users')!.indexes).toHaveLength(0)\n\t\t})\n\n\t\ttest('applyDropIndex is a no-op when index not found', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tmockMongoDb(adapter)\n\n\t\t\tawait adapter.applyDropIndex({ kind: 'dropIndex', name: 'nonexistent_idx' })\n\t\t})\n\n\t\ttest('introspect returns DiscoveredSchema with empty fields, pk, and foreignKeys', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [] })\n\t\t\tstate.collections.set('posts', { indexes: [] })\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(2)\n\t\t\tfor (const s of schemas) {\n\t\t\t\texpect(s.pk).toBeUndefined()\n\t\t\t\texpect(s.fields).toEqual([])\n\t\t\t\texpect(s.foreignKeys).toEqual([])\n\t\t\t}\n\t\t})\n\n\t\ttest('introspect skips _id_ index', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [{ name: 'users_email_idx', key: { email: 1 }, unique: false }] })\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].indexes).toHaveLength(1)\n\t\t\texpect(schemas[0].indexes[0].name).toBe('users_email_idx')\n\t\t})\n\n\t\ttest('introspect skips tracker collection', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('users', { indexes: [] })\n\t\t\tstate.collections.set(MIGRATION_TRACKER_COLLECTION, { indexes: [] })\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].name).toBe('users')\n\t\t})\n\n\t\ttest('introspect maps index keys to on array and unique flag', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tstate.collections.set('orders', {\n\t\t\t\tindexes: [\n\t\t\t\t\t{ name: 'orders_userId_createdAt_idx', key: { userId: 1, createdAt: 1 }, unique: false },\n\t\t\t\t\t{ name: 'orders_email_unique', key: { email: 1 }, unique: true },\n\t\t\t\t],\n\t\t\t})\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas[0].indexes).toEqual([\n\t\t\t\t{ name: 'orders_userId_createdAt_idx', on: ['userId', 'createdAt'], unique: false },\n\t\t\t\t{ name: 'orders_email_unique', on: ['email'], unique: true },\n\t\t\t])\n\t\t})\n\n\t\ttest('adapter does not implement acquireMigrationLock', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\texpect((adapter as any).acquireMigrationLock).toBeUndefined()\n\t\t})\n\n\t\ttest('adapter does not implement DDL apply methods', () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\texpect((adapter as any).applyCreateTable).toBeUndefined()\n\t\t\texpect((adapter as any).applyDropTable).toBeUndefined()\n\t\t\texpect((adapter as any).applyAddField).toBeUndefined()\n\t\t\texpect((adapter as any).applyDropField).toBeUndefined()\n\t\t\texpect((adapter as any).applyModifyField).toBeUndefined()\n\t\t\texpect((adapter as any).applyRenameTable).toBeUndefined()\n\t\t\texpect((adapter as any).applyRenameField).toBeUndefined()\n\t\t\texpect((adapter as any).applyAddForeignKey).toBeUndefined()\n\t\t\texpect((adapter as any).applyDropForeignKey).toBeUndefined()\n\t\t})\n\n\t\ttest('type-level: ChangeFor<MongoDbAdapter> excludes DDL variants', () => {\n\t\t\ttype Changes = import('../../migrations/types').ChangeFor<MongoDbAdapter>\n\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'addIndex' }>>().not.toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropIndex' }>>().not.toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'execute' }>>().not.toBeNever()\n\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'addField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'createTable' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropTable' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'modifyField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'renameTable' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'renameField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropField' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'addForeignKey' }>>().toBeNever()\n\t\t\texpectTypeOf<Extract<Changes, { kind: 'dropForeignKey' }>>().toBeNever()\n\t\t})\n\n\t\ttest('type-level: Migrator.from(repo, adapter).build() works without withoutLock', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst step = Migrator.from(repo, adapter).migrations([])\n\n\t\t\texpectTypeOf(step).toHaveProperty('build')\n\t\t\texpectTypeOf(step).toHaveProperty('withoutLock')\n\t\t})\n\n\t\ttest('type-level: Migrator.from(repo, adapter).withoutLock().build() also works', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\t\t\tconst migrator = Migrator.from(repo, adapter).migrations([]).withoutLock().build()\n\t\t\texpect(migrator).toBeDefined()\n\t\t})\n\n\t\ttest('end-to-end: Migrator runs addIndex + dropIndex + execute changes', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\n\t\t\tlet executeRan = false\n\t\t\ttype M = import('../../migrations/types').Migration<typeof adapter>\n\t\t\tconst migrations: M[] = [\n\t\t\t\t{\n\t\t\t\t\tid: '0001-add-idx',\n\t\t\t\t\ttx: false,\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'addIndex', table: 'users', on: ['email'], unique: true },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0002-backfill',\n\t\t\t\t\ttx: false,\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'execute', up: async () => { executeRan = true } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0003-drop-idx',\n\t\t\t\t\ttx: false,\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'dropIndex', name: 'users_email_idx' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tconst migrator = Migrator.from(repo, adapter).migrations(migrations).build()\n\t\t\tconst result = await migrator.up()\n\n\t\t\texpect(result.ran).toEqual(['0001-add-idx', '0002-backfill', '0003-drop-idx'])\n\t\t\texpect(executeRan).toBe(true)\n\t\t\texpect(state.migrations.size).toBe(3)\n\t\t\texpect(state.collections.get('users')!.indexes).toHaveLength(0)\n\t\t})\n\n\t\ttest('introspect round-trip: addIndex then introspect sees the index', async () => {\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tconst state = mockMongoDb(adapter)\n\n\t\t\tstate.collections.set('users', {\n\t\t\t\tindexes: [{ name: 'users_email_idx', key: { email: 1 }, unique: true }],\n\t\t\t})\n\n\t\t\tconst schemas = await adapter.introspect()\n\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].name).toBe('users')\n\t\t\texpect(schemas[0].pk).toBeUndefined()\n\t\t\texpect(schemas[0].fields).toEqual([])\n\t\t\texpect(schemas[0].foreignKeys).toEqual([])\n\t\t\texpect(schemas[0].indexes).toEqual([\n\t\t\t\t{ name: 'users_email_idx', on: ['email'], unique: true },\n\t\t\t])\n\t\t})\n\n\t\ttest('data backfill via execute change', async () => {\n\t\t\tconst { Migrator } = await import('../../migrations/migrator')\n\t\t\tconst { Repo } = await import('../../repo/repo')\n\n\t\t\tconst adapter = MongoDbAdapter.create({ uri: 'mongodb://localhost:27017/testdb' })\n\t\t\tmockMongoDb(adapter)\n\t\t\tconst repo = Repo.from(adapter).resolve(() => ({ db: 'test', col: 'test' })).build()\n\n\t\t\tconst backfilledData: string[] = []\n\t\t\ttype M = import('../../migrations/types').Migration<typeof adapter>\n\t\t\tconst m: M = {\n\t\t\t\tid: '0001-backfill',\n\t\t\t\ttx: false,\n\t\t\t\tchanges: [{\n\t\t\t\t\tkind: 'execute',\n\t\t\t\t\tup: async () => {\n\t\t\t\t\t\tbackfilledData.push('user-1-normalized')\n\t\t\t\t\t\tbackfilledData.push('user-2-normalized')\n\t\t\t\t\t},\n\t\t\t\t}],\n\t\t\t}\n\n\t\t\tconst migrator = Migrator.from(repo, adapter).migrations([m]).build()\n\t\t\tawait migrator.up()\n\n\t\t\texpect(backfilledData).toEqual(['user-1-normalized', 'user-2-normalized'])\n\t\t})\n\t})\n}\n","import { Filter, FilterGroup, type FilterChild } from '../../filter'\nimport type { AggregateSpec } from '../../orm-adapter'\nimport type { QueryOptions } from '../../query-options'\nimport { flattenOps, IncOp, MaxOp, MinOp, MulOp, PatchOp, PullOp, PushOp, SetOp, UnsetOp, type AnyUpdateOp } from '../../updates'\n\ntype MongoFilter = Record<string, unknown>\n\nexport function compileMongoFilter(group: FilterGroup, primaryKey: string): MongoFilter {\n\tconst clauses: MongoFilter[] = []\n\tfor (const child of group.children) {\n\t\tconst compiled = compileChild(child, primaryKey)\n\t\tif (compiled) clauses.push(compiled)\n\t}\n\n\tif (clauses.length === 0) return {}\n\tif (clauses.length === 1) return clauses[0]\n\treturn { $and: clauses }\n}\n\nexport function compileMongoQuery(\n\tgroup: FilterGroup,\n\toptions: QueryOptions | undefined,\n\tprimaryKey: string,\n): {\n\tfilter: MongoFilter\n\tsort: Record<string, 1 | -1> | undefined\n\tlimit: number | undefined\n\tskip: number | undefined\n\tprojection: Record<string, 1> | undefined\n} {\n\tconst mongoFilter = compileMongoFilter(group, primaryKey)\n\n\tconst orderBys = options?.orderBy ?? []\n\tconst sort =\n\t\torderBys.length > 0\n\t\t\t? Object.fromEntries(orderBys.map((o) => [mapField(o.field, primaryKey), o.direction === 'desc' ? -1 : 1]))\n\t\t\t: undefined\n\n\tconst selects = options?.select ?? []\n\tconst projection = selects.length > 0 ? Object.fromEntries(selects.map((f) => [mapField(f, primaryKey), 1])) : undefined\n\n\treturn {\n\t\tfilter: mongoFilter,\n\t\tsort: sort as Record<string, 1 | -1> | undefined,\n\t\tlimit: options?.limit,\n\t\tskip: options?.offset,\n\t\tprojection: projection as Record<string, 1> | undefined,\n\t}\n}\n\nfunction mapField(field: string, primaryKey: string): string {\n\tif (field === 'id' && primaryKey === '_id') return '_id'\n\treturn field\n}\n\nfunction compileFilter(f: Filter, primaryKey: string): MongoFilter {\n\tconst field = mapField(f.field, primaryKey)\n\n\tswitch (f.op) {\n\t\tcase 'eq':\n\t\t\treturn { [field]: { $eq: f.value } }\n\t\tcase 'ne':\n\t\t\treturn { [field]: { $ne: f.value } }\n\t\tcase 'gt':\n\t\t\treturn { [field]: { $gt: f.value } }\n\t\tcase 'gte':\n\t\t\treturn { [field]: { $gte: f.value } }\n\t\tcase 'lt':\n\t\t\treturn { [field]: { $lt: f.value } }\n\t\tcase 'lte':\n\t\t\treturn { [field]: { $lte: f.value } }\n\t\tcase 'in':\n\t\t\treturn { [field]: { $in: f.value } }\n\t\tcase 'notIn':\n\t\t\treturn { [field]: { $nin: f.value } }\n\t\tcase 'like':\n\t\t\treturn { [field]: { $regex: new RegExp(String(f.value), 'i') } }\n\t\tcase 'exists':\n\t\t\treturn { [field]: { $exists: true, $ne: null } }\n\t\tcase 'notExists':\n\t\t\treturn { [field]: { $eq: null } }\n\t\tcase 'contains':\n\t\t\treturn { [field]: { $all: Array.isArray(f.value) ? f.value : [f.value] } }\n\t\tcase 'notContains':\n\t\t\treturn { [field]: { $not: { $all: Array.isArray(f.value) ? f.value : [f.value] } } }\n\t\tdefault:\n\t\t\treturn { [field]: { $eq: f.value } }\n\t}\n}\n\nfunction compileChild(child: FilterChild, primaryKey: string): MongoFilter | null {\n\tif (child instanceof Filter) return compileFilter(child, primaryKey)\n\tif (child instanceof FilterGroup) return compileGroup(child, primaryKey)\n\treturn null\n}\n\nfunction compileGroup(group: FilterGroup, primaryKey: string): MongoFilter | null {\n\tconst clauses = group.children.map((c) => compileChild(c, primaryKey)).filter((c): c is MongoFilter => c !== null)\n\tif (clauses.length === 0) return null\n\tif (clauses.length === 1) return clauses[0]\n\treturn { [group.op === 'or' ? '$or' : '$and']: clauses }\n}\n\nexport function compileMongoUpdate(data: Record<string, unknown>): Record<string, unknown> {\n\tconst $set: Record<string, unknown> = {}\n\tconst $inc: Record<string, unknown> = {}\n\tconst $mul: Record<string, unknown> = {}\n\tconst $min: Record<string, unknown> = {}\n\tconst $max: Record<string, unknown> = {}\n\tconst $unset: Record<string, ''> = {}\n\tconst $push: Record<string, unknown> = {}\n\tconst $pull: Record<string, unknown> = {}\n\n\tfor (const [key, value] of Object.entries(data)) {\n\t\tif (value instanceof IncOp) $inc[key] = value.value\n\t\telse if (value instanceof MulOp) $mul[key] = value.value\n\t\telse if (value instanceof MinOp) $min[key] = value.value\n\t\telse if (value instanceof MaxOp) $max[key] = value.value\n\t\telse if (value instanceof UnsetOp) $unset[key] = ''\n\t\telse if (value instanceof PushOp) $push[key] = value.value\n\t\telse if (value instanceof PullOp) $pull[key] = value.value\n\t\telse if (value instanceof PatchOp) {\n\t\t\tconst patchVal = value.value as Record<string, unknown>\n\t\t\tfor (const [subKey, subVal] of Object.entries(patchVal)) {\n\t\t\t\t$set[`${key}.${subKey}`] = subVal\n\t\t\t}\n\t\t} else $set[key] = value\n\t}\n\n\tconst result: Record<string, unknown> = {}\n\tif (Object.keys($set).length) result.$set = $set\n\tif (Object.keys($inc).length) result.$inc = $inc\n\tif (Object.keys($mul).length) result.$mul = $mul\n\tif (Object.keys($min).length) result.$min = $min\n\tif (Object.keys($max).length) result.$max = $max\n\tif (Object.keys($unset).length) result.$unset = $unset\n\tif (Object.keys($push).length) result.$push = $push\n\tif (Object.keys($pull).length) result.$pull = $pull\n\n\treturn result\n}\n\nexport function compileMongoOps(ops: AnyUpdateOp[]): Record<string, unknown> {\n\treturn compileMongoUpdate(flattenOps(ops))\n}\n\nexport function compileMongoAggregate(spec: AggregateSpec, primaryKey: string): Record<string, unknown>[] {\n\tconst pipeline: Record<string, unknown>[] = []\n\n\tif (spec.where) {\n\t\tconst match = compileMongoFilter(spec.where, primaryKey)\n\t\tif (Object.keys(match).length > 0) pipeline.push({ $match: match })\n\t}\n\n\tconst groupId: Record<string, string> | null =\n\t\tspec.groupBy.length > 0\n\t\t\t? Object.fromEntries(spec.groupBy.map((f) => [f, `$${mapField(f, primaryKey)}`]))\n\t\t\t: null\n\n\tconst accumulators: Record<string, unknown> = {}\n\tfor (const agg of spec.aggregates) {\n\t\tconst fieldRef = agg.field ? `$${mapField(agg.field, primaryKey)}` : undefined\n\t\tswitch (agg.fn) {\n\t\t\tcase 'count':\n\t\t\t\taccumulators[agg.alias] = { $sum: 1 }\n\t\t\t\tbreak\n\t\t\tcase 'countDistinct':\n\t\t\t\taccumulators[agg.alias] = { $addToSet: fieldRef }\n\t\t\t\tbreak\n\t\t\tcase 'sum':\n\t\t\tcase 'avg':\n\t\t\tcase 'min':\n\t\t\tcase 'max':\n\t\t\t\taccumulators[agg.alias] = { [`$${agg.fn}`]: fieldRef }\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpipeline.push({ $group: { _id: groupId, ...accumulators } })\n\n\tconst project: Record<string, unknown> = { _id: 0 }\n\tfor (const f of spec.groupBy) {\n\t\tproject[f] = `$_id.${f}`\n\t}\n\tfor (const agg of spec.aggregates) {\n\t\tif (agg.fn === 'countDistinct') {\n\t\t\tproject[agg.alias] = { $size: `$${agg.alias}` }\n\t\t} else {\n\t\t\tproject[agg.alias] = 1\n\t\t}\n\t}\n\tpipeline.push({ $project: project })\n\n\tif (spec.having) {\n\t\tconst havingMatch = compileMongoFilter(spec.having, '')\n\t\tif (Object.keys(havingMatch).length > 0) pipeline.push({ $match: havingMatch })\n\t}\n\n\treturn pipeline\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect } = import.meta.vitest\n\tconst { FilterGroup } = await import('../../filter')\n\tconst { OrderBy } = await import('../../query-options')\n\n\tdescribe('compileMongoFilter', () => {\n\t\ttest('empty filter group compiles to empty object', () => {\n\t\t\tconst group = FilterGroup.create()\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({})\n\t\t})\n\n\t\ttest('single eq filter compiles to $eq', () => {\n\t\t\tconst group = FilterGroup.create().eq('name', 'Alice')\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ name: { $eq: 'Alice' } })\n\t\t})\n\n\t\ttest('ne, gt, gte, lt, lte compile to corresponding Mongo ops', () => {\n\t\t\texpect(compileMongoFilter(FilterGroup.create().ne('age', 5), 'id')).toEqual({ age: { $ne: 5 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().gt('age', 10), 'id')).toEqual({ age: { $gt: 10 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().gte('age', 20), 'id')).toEqual({ age: { $gte: 20 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().lt('age', 30), 'id')).toEqual({ age: { $lt: 30 } })\n\t\t\texpect(compileMongoFilter(FilterGroup.create().lte('age', 40), 'id')).toEqual({ age: { $lte: 40 } })\n\t\t})\n\n\t\ttest('in compiles to $in', () => {\n\t\t\tconst group = FilterGroup.create().in('status', ['a', 'b'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ status: { $in: ['a', 'b'] } })\n\t\t})\n\n\t\ttest('notIn compiles to $nin (canonical name notIn, Mongo op $nin)', () => {\n\t\t\tconst group = FilterGroup.create().notIn('status', ['x', 'y'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ status: { $nin: ['x', 'y'] } })\n\t\t})\n\n\t\ttest('like compiles to $regex with case-insensitive flag', () => {\n\t\t\tconst group = FilterGroup.create().like('name', 'ali')\n\t\t\tconst result = compileMongoFilter(group, 'id')\n\t\t\texpect(result.name).toEqual({ $regex: expect.any(RegExp) })\n\t\t\tconst regex = (result.name as any).$regex as RegExp\n\t\t\texpect(regex.flags).toBe('i')\n\t\t\texpect(regex.test('Alice')).toBe(true)\n\t\t})\n\n\t\ttest('exists compiles to $exists: true, $ne: null', () => {\n\t\t\tconst group = FilterGroup.create().exists('val')\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ val: { $exists: true, $ne: null } })\n\t\t})\n\n\t\ttest('notExists is its own op — compiles to $eq: null', () => {\n\t\t\tconst group = FilterGroup.create().notExists('val')\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ val: { $eq: null } })\n\t\t})\n\n\t\ttest('contains compiles to $all', () => {\n\t\t\tconst group = FilterGroup.create().contains('tags', ['a', 'b'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ tags: { $all: ['a', 'b'] } })\n\t\t})\n\n\t\ttest('notContains compiles to $not: { $all }', () => {\n\t\t\tconst group = FilterGroup.create().notContains('tags', ['x'])\n\t\t\texpect(compileMongoFilter(group, 'id')).toEqual({ tags: { $not: { $all: ['x'] } } })\n\t\t})\n\n\t\ttest('multiple clauses produce $and', () => {\n\t\t\tconst group = FilterGroup.create().eq('a', 1).gt('b', 2)\n\t\t\tconst result = compileMongoFilter(group, 'id')\n\t\t\texpect(result).toEqual({ $and: [{ a: { $eq: 1 } }, { b: { $gt: 2 } }] })\n\t\t})\n\n\t\ttest('nested and/or groups compile correctly', () => {\n\t\t\tconst group = FilterGroup.create().and([\n\t\t\t\t(q) => q.eq('a', 1),\n\t\t\t\t(q) => q.or([(g) => g.eq('b', 2), (g) => g.eq('c', 3)]),\n\t\t\t])\n\t\t\tconst result = compileMongoFilter(group, 'id')\n\t\t\texpect(result).toEqual({\n\t\t\t\t$and: [{ a: { $eq: 1 } }, { $or: [{ b: { $eq: 2 } }, { c: { $eq: 3 } }] }],\n\t\t\t})\n\t\t})\n\n\t\ttest('maps id field to _id when primaryKey is _id', () => {\n\t\t\tconst group = FilterGroup.create().eq('id', 'abc')\n\t\t\texpect(compileMongoFilter(group, '_id')).toEqual({ _id: { $eq: 'abc' } })\n\t\t})\n\t})\n\n\tdescribe('compileMongoQuery', () => {\n\t\ttest('options: sort, limit, skip, projection', () => {\n\t\t\tconst group = FilterGroup.create().eq('active', true)\n\t\t\tconst options = {\n\t\t\t\torderBy: [new OrderBy('name', 'asc'), new OrderBy('age', 'desc')],\n\t\t\t\tlimit: 10,\n\t\t\t\toffset: 5,\n\t\t\t\tselect: ['name', 'age'] as const,\n\t\t\t}\n\t\t\tconst result = compileMongoQuery(group, options, 'id')\n\t\t\texpect(result.filter).toEqual({ active: { $eq: true } })\n\t\t\texpect(result.sort).toEqual({ name: 1, age: -1 })\n\t\t\texpect(result.limit).toBe(10)\n\t\t\texpect(result.skip).toBe(5)\n\t\t\texpect(result.projection).toEqual({ name: 1, age: 1 })\n\t\t})\n\n\t\ttest('undefined options returns undefined for sort/limit/skip/projection', () => {\n\t\t\tconst group = FilterGroup.create().eq('x', 1)\n\t\t\tconst result = compileMongoQuery(group, undefined, 'id')\n\t\t\texpect(result.sort).toBeUndefined()\n\t\t\texpect(result.limit).toBeUndefined()\n\t\t\texpect(result.skip).toBeUndefined()\n\t\t\texpect(result.projection).toBeUndefined()\n\t\t})\n\t})\n\n\tdescribe('compileMongoUpdate', () => {\n\t\ttest('plain values go into $set', () => {\n\t\t\tconst result = compileMongoUpdate({ name: 'Alice', age: 30 })\n\t\t\texpect(result).toEqual({ $set: { name: 'Alice', age: 30 } })\n\t\t})\n\n\t\ttest('IncOp goes into $inc', () => {\n\t\t\tconst result = compileMongoUpdate({ count: new IncOp('count', 5) })\n\t\t\texpect(result).toEqual({ $inc: { count: 5 } })\n\t\t})\n\n\t\ttest('MulOp goes into $mul', () => {\n\t\t\tconst result = compileMongoUpdate({ score: new MulOp('score', 2) })\n\t\t\texpect(result).toEqual({ $mul: { score: 2 } })\n\t\t})\n\n\t\ttest('MinOp/MaxOp go into $min/$max', () => {\n\t\t\tconst result = compileMongoUpdate({\n\t\t\t\tlo: new MinOp('lo', 1),\n\t\t\t\thi: new MaxOp('hi', 99),\n\t\t\t})\n\t\t\texpect(result).toEqual({ $min: { lo: 1 }, $max: { hi: 99 } })\n\t\t})\n\n\t\ttest('UnsetOp goes into $unset', () => {\n\t\t\tconst result = compileMongoUpdate({ old: new UnsetOp('old') })\n\t\t\texpect(result).toEqual({ $unset: { old: '' } })\n\t\t})\n\n\t\ttest('PushOp/PullOp go into $push/$pull', () => {\n\t\t\tconst result = compileMongoUpdate({\n\t\t\t\ttags: new PushOp('tags', 'new'),\n\t\t\t\tremoved: new PullOp('removed', 'old'),\n\t\t\t})\n\t\t\texpect(result).toEqual({ $push: { tags: 'new' }, $pull: { removed: 'old' } })\n\t\t})\n\n\t\ttest('PatchOp produces dot-notation $set entries', () => {\n\t\t\tconst result = compileMongoUpdate({ meta: new PatchOp('meta', { a: 1, b: 2 }) })\n\t\t\texpect(result).toEqual({ $set: { 'meta.a': 1, 'meta.b': 2 } })\n\t\t})\n\n\t\ttest('empty data produces empty result', () => {\n\t\t\tconst result = compileMongoUpdate({})\n\t\t\texpect(result).toEqual({})\n\t\t})\n\t})\n\n\tdescribe('compileMongoOps', () => {\n\t\ttest('SetOp values go into $set', () => {\n\t\t\tconst result = compileMongoOps([new SetOp({ name: 'Bob', age: 25 })])\n\t\t\texpect(result).toEqual({ $set: { name: 'Bob', age: 25 } })\n\t\t})\n\n\t\ttest('mixed ops compile to separate Mongo update operators', () => {\n\t\t\tconst result = compileMongoOps([\n\t\t\t\tnew SetOp({ name: 'Alice' }),\n\t\t\t\tnew IncOp('count', 1),\n\t\t\t\tnew PushOp('tags', 'x'),\n\t\t\t])\n\t\t\texpect(result).toEqual({\n\t\t\t\t$set: { name: 'Alice' },\n\t\t\t\t$inc: { count: 1 },\n\t\t\t\t$push: { tags: 'x' },\n\t\t\t})\n\t\t})\n\n\t\ttest('empty ops produces empty result', () => {\n\t\t\texpect(compileMongoOps([])).toEqual({})\n\t\t})\n\t})\n\n\tdescribe('compileMongoAggregate', () => {\n\t\ttest('bare count produces $group with $sum:1 and $project', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('multi-aggregator produces all accumulators in $group', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'total' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'revenue' },\n\t\t\t\t\t{ fn: 'avg', field: 'price', alias: 'avgPrice' },\n\t\t\t\t],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\ttotal: { $sum: 1 },\n\t\t\t\t\t\trevenue: { $sum: '$amount' },\n\t\t\t\t\t\tavgPrice: { $avg: '$price' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $project: { _id: 0, total: 1, revenue: 1, avgPrice: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('single-column groupBy produces composite _id and $project lift', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: { region: '$region' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('multi-column groupBy via composite _id', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'sum', field: 'amount', alias: 'revenue' }],\n\t\t\t\tgroupBy: ['region', 'year'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region', year: '$year' },\n\t\t\t\t\t\trevenue: { $sum: '$amount' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$project: {\n\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\tregion: '$_id.region',\n\t\t\t\t\t\tyear: '$_id.year',\n\t\t\t\t\t\trevenue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t})\n\n\t\ttest('where-only emits $match before $group', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create().eq('active', true),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $match: { active: { $eq: true } } },\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('having-only emits $match after $project', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t\thaving: FilterGroup.create().gt('total', 5),\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: { region: '$region' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', total: 1 } },\n\t\t\t\t{ $match: { total: { $gt: 5 } } },\n\t\t\t])\n\t\t})\n\n\t\ttest('where + having produces both $match stages', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create().eq('active', true),\n\t\t\t\taggregates: [{ fn: 'sum', field: 'amount', alias: 'revenue' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t\thaving: FilterGroup.create().gte('revenue', 1000),\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $match: { active: { $eq: true } } },\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region' },\n\t\t\t\t\t\trevenue: { $sum: '$amount' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $project: { _id: 0, region: '$_id.region', revenue: 1 } },\n\t\t\t\t{ $match: { revenue: { $gte: 1000 } } },\n\t\t\t])\n\t\t})\n\n\t\ttest('countDistinct uses $addToSet in $group and $size in $project', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'countDistinct', field: 'userId', alias: 'uniqueUsers' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: null, uniqueUsers: { $addToSet: '$userId' } } },\n\t\t\t\t{ $project: { _id: 0, uniqueUsers: { $size: '$uniqueUsers' } } },\n\t\t\t])\n\t\t})\n\n\t\ttest('min/max produce $min/$max accumulators', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'min', field: 'price', alias: 'lowest' },\n\t\t\t\t\t{ fn: 'max', field: 'price', alias: 'highest' },\n\t\t\t\t],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: null,\n\t\t\t\t\t\tlowest: { $min: '$price' },\n\t\t\t\t\t\thighest: { $max: '$price' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ $project: { _id: 0, lowest: 1, highest: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('field-name mapping: id field maps to _id when primaryKey is _id', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create().eq('id', 'abc'),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: ['id'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $match: { _id: { $eq: 'abc' } } },\n\t\t\t\t{ $group: { _id: { id: '$_id' }, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, id: '$_id.id', total: 1 } },\n\t\t\t])\n\t\t})\n\n\t\ttest('countDistinct with groupBy combines $addToSet, groupBy lift, and $size', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'countDistinct', field: 'category', alias: 'uniqueCats' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region' },\n\t\t\t\t\t\tuniqueCats: { $addToSet: '$category' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$project: {\n\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\tregion: '$_id.region',\n\t\t\t\t\t\tuniqueCats: { $size: '$uniqueCats' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t})\n\n\t\ttest('all six aggregators in a single pipeline', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'total' },\n\t\t\t\t\t{ fn: 'countDistinct', field: 'status', alias: 'uniqueStatuses' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'totalAmount' },\n\t\t\t\t\t{ fn: 'avg', field: 'amount', alias: 'avgAmount' },\n\t\t\t\t\t{ fn: 'min', field: 'amount', alias: 'minAmount' },\n\t\t\t\t\t{ fn: 'max', field: 'amount', alias: 'maxAmount' },\n\t\t\t\t],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t}\n\t\t\tconst pipeline = compileMongoAggregate(spec, '_id')\n\t\t\texpect(pipeline).toEqual([\n\t\t\t\t{\n\t\t\t\t\t$group: {\n\t\t\t\t\t\t_id: { region: '$region' },\n\t\t\t\t\t\ttotal: { $sum: 1 },\n\t\t\t\t\t\tuniqueStatuses: { $addToSet: '$status' },\n\t\t\t\t\t\ttotalAmount: { $sum: '$amount' },\n\t\t\t\t\t\tavgAmount: { $avg: '$amount' },\n\t\t\t\t\t\tminAmount: { $min: '$amount' },\n\t\t\t\t\t\tmaxAmount: { $max: '$amount' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t$project: {\n\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\tregion: '$_id.region',\n\t\t\t\t\t\ttotal: 1,\n\t\t\t\t\t\tuniqueStatuses: { $size: '$uniqueStatuses' },\n\t\t\t\t\t\ttotalAmount: 1,\n\t\t\t\t\t\tavgAmount: 1,\n\t\t\t\t\t\tminAmount: 1,\n\t\t\t\t\t\tmaxAmount: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t})\n\n\t\ttest('empty where filter is omitted from pipeline', () => {\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\twhere: FilterGroup.create(),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\texpect(compileMongoAggregate(spec, '_id')).toEqual([\n\t\t\t\t{ $group: { _id: null, total: { $sum: 1 } } },\n\t\t\t\t{ $project: { _id: 0, total: 1 } },\n\t\t\t])\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["FilterGroup","v","FilterGroup"]}
|