equipped 5.2.9 → 5.3.0
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 +95 -0
- package/README.md +362 -34
- package/dist/cjs/cache/adapters/in-memory/index.cjs +824 -0
- package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -0
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs +4 -0
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -0
- package/dist/cjs/cache/adapters/redis/index.cjs +844 -0
- package/dist/cjs/cache/adapters/redis/index.cjs.map +1 -0
- package/dist/cjs/cache/adapters/redis/index.min.cjs +4 -0
- package/dist/cjs/cache/adapters/redis/index.min.cjs.map +1 -0
- package/dist/cjs/cache/index.cjs +602 -4
- package/dist/cjs/cache/index.cjs.map +1 -1
- package/dist/cjs/cache/index.min.cjs +3 -1
- package/dist/cjs/cache/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.cjs +1314 -0
- package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -0
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +4 -0
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -0
- package/dist/cjs/dbs/index.cjs +965 -6
- package/dist/cjs/dbs/index.cjs.map +1 -1
- package/dist/cjs/dbs/index.min.cjs +3 -1
- package/dist/cjs/dbs/index.min.cjs.map +1 -1
- package/dist/cjs/errors/index.cjs +127 -8
- 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 +845 -0
- package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -0
- package/dist/cjs/events/adapters/kafka/index.min.cjs +4 -0
- package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -0
- package/dist/cjs/events/adapters/rabbitmq/index.cjs +836 -0
- package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -0
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +4 -0
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -0
- package/dist/cjs/events/index.cjs +33 -4
- package/dist/cjs/events/index.cjs.map +1 -1
- package/dist/cjs/events/index.min.cjs +1 -1
- package/dist/cjs/events/index.min.cjs.map +1 -1
- package/dist/cjs/index.cjs +588 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.min.cjs +3 -1
- package/dist/cjs/index.min.cjs.map +1 -1
- package/dist/cjs/instance/index.cjs +514 -64
- package/dist/cjs/instance/index.cjs.map +1 -1
- package/dist/cjs/instance/index.min.cjs +3 -3
- package/dist/cjs/instance/index.min.cjs.map +1 -1
- package/dist/cjs/jobs/adapters/redis/index.cjs +979 -0
- package/dist/cjs/jobs/adapters/redis/index.cjs.map +1 -0
- package/dist/cjs/jobs/adapters/redis/index.min.cjs +4 -0
- package/dist/cjs/jobs/adapters/redis/index.min.cjs.map +1 -0
- package/dist/cjs/jobs/index.cjs +55 -2
- package/dist/cjs/jobs/index.cjs.map +1 -1
- package/dist/cjs/jobs/index.min.cjs +1 -1
- package/dist/cjs/jobs/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/in-memory/index.cjs +2551 -0
- package/dist/cjs/orm/adapters/in-memory/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/in-memory/index.min.cjs +4 -0
- package/dist/cjs/orm/adapters/in-memory/index.min.cjs.map +1 -0
- package/dist/cjs/orm/adapters/json/index.cjs +3518 -0
- package/dist/cjs/orm/adapters/json/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/json/index.min.cjs +4 -0
- package/dist/cjs/orm/adapters/json/index.min.cjs.map +1 -0
- package/dist/cjs/orm/adapters/mongodb/index.cjs +3299 -0
- package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs +4 -0
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -0
- package/dist/cjs/orm/adapters/postgresql/index.cjs +4114 -0
- package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs +49 -0
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -0
- package/dist/cjs/orm/index.cjs +9216 -0
- package/dist/cjs/orm/index.cjs.map +1 -0
- package/dist/cjs/orm/index.min.cjs +4 -0
- package/dist/cjs/orm/index.min.cjs.map +1 -0
- package/dist/cjs/server/adapters/express/index.cjs +1967 -0
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -0
- package/dist/cjs/server/adapters/express/index.min.cjs +32 -0
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -0
- package/dist/cjs/server/adapters/fastify/index.cjs +1974 -0
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -0
- package/dist/cjs/server/adapters/fastify/index.min.cjs +32 -0
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -0
- package/dist/cjs/server/index.cjs +1811 -9
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +31 -1
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/types/index.cjs +18 -1
- package/dist/cjs/types/index.cjs.map +1 -1
- package/dist/cjs/types/index.min.cjs +1 -1
- package/dist/cjs/types/index.min.cjs.map +1 -1
- package/dist/cjs/utilities/index.cjs +862 -7
- package/dist/cjs/utilities/index.cjs.map +1 -1
- package/dist/cjs/utilities/index.min.cjs +3 -1
- package/dist/cjs/utilities/index.min.cjs.map +1 -1
- package/dist/cjs/validations/index.cjs +679 -10
- package/dist/cjs/validations/index.cjs.map +1 -1
- package/dist/cjs/validations/index.min.cjs +3 -1
- package/dist/cjs/validations/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +2 -0
- package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -0
- package/dist/esm/cache/adapters/in-memory/index.mjs +93 -0
- package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -0
- package/dist/esm/cache/adapters/redis/index.min.mjs +2 -0
- package/dist/esm/cache/adapters/redis/index.mjs +13 -0
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.min.mjs.map +1 -1
- package/dist/esm/cache/index.mjs +9 -4
- package/dist/esm/cache/index.mjs.map +1 -1
- package/dist/esm/chunk-4JLDXF7T.min.mjs +2 -0
- package/dist/esm/chunk-4JLDXF7T.min.mjs.map +1 -0
- package/dist/{types/events/types/kafka.js → esm/chunk-4MXYZS5R.mjs} +60 -37
- package/dist/esm/chunk-4MXYZS5R.mjs.map +1 -0
- package/dist/esm/chunk-5VW3JAFR.min.mjs +2 -0
- package/dist/esm/chunk-5VW3JAFR.min.mjs.map +1 -0
- package/dist/esm/chunk-AKQBDYUO.mjs +126 -0
- package/dist/esm/chunk-AKQBDYUO.mjs.map +1 -0
- package/dist/esm/chunk-AQY7QVYI.min.mjs +2 -0
- package/dist/esm/chunk-B5QQ32YY.min.mjs +2 -0
- package/dist/esm/chunk-B5QQ32YY.min.mjs.map +1 -0
- package/dist/esm/chunk-BJNIUCPT.min.mjs +2 -0
- package/dist/esm/chunk-BJNIUCPT.min.mjs.map +1 -0
- package/dist/esm/chunk-DKPZJIIR.mjs +29 -0
- package/dist/esm/chunk-DKPZJIIR.mjs.map +1 -0
- package/dist/esm/chunk-DSUJ5FUL.min.mjs +2 -0
- package/dist/esm/chunk-DSUJ5FUL.min.mjs.map +1 -0
- package/dist/esm/chunk-FLAPYQUT.min.mjs +32 -0
- package/dist/esm/chunk-FLAPYQUT.min.mjs.map +1 -0
- package/dist/esm/chunk-J5LGTIGS.mjs +10 -0
- package/dist/esm/chunk-JH6EBXY4.mjs +53 -0
- package/dist/esm/chunk-JH6EBXY4.mjs.map +1 -0
- package/dist/esm/chunk-MDQKODYQ.mjs +2035 -0
- package/dist/esm/chunk-MDQKODYQ.mjs.map +1 -0
- package/dist/esm/chunk-PCAUXBAG.min.mjs +2 -0
- package/dist/esm/chunk-PCAUXBAG.min.mjs.map +1 -0
- package/dist/esm/chunk-PNZNNUMN.mjs +113 -0
- package/dist/esm/chunk-PNZNNUMN.mjs.map +1 -0
- package/dist/esm/chunk-PQCBVQL6.mjs +1280 -0
- package/dist/esm/chunk-PQCBVQL6.mjs.map +1 -0
- package/dist/esm/chunk-QHLKB47N.min.mjs +2 -0
- package/dist/esm/chunk-QHLKB47N.min.mjs.map +1 -0
- package/dist/esm/chunk-SGZNOYC3.min.mjs +2 -0
- package/dist/esm/chunk-SGZNOYC3.min.mjs.map +1 -0
- package/dist/esm/chunk-TVTYDU2D.mjs +795 -0
- package/dist/esm/chunk-TVTYDU2D.mjs.map +1 -0
- package/dist/esm/chunk-VCCS7CAI.mjs +8 -0
- package/dist/esm/chunk-VCCS7CAI.mjs.map +1 -0
- package/dist/esm/chunk-Z2TZ3KR7.mjs +22 -0
- package/dist/esm/chunk-Z2TZ3KR7.mjs.map +1 -0
- package/dist/esm/chunk-ZGMFFK6Y.min.mjs +2 -0
- package/dist/esm/chunk-ZGMFFK6Y.min.mjs.map +1 -0
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +2 -0
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -0
- package/dist/esm/dbs/adapters/mongodb/index.mjs +419 -0
- package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -0
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.min.mjs.map +1 -1
- package/dist/esm/dbs/index.mjs +22 -6
- package/dist/esm/dbs/index.mjs.map +1 -1
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.min.mjs.map +1 -1
- package/dist/esm/errors/index.mjs +22 -8
- package/dist/esm/errors/index.mjs.map +1 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +2 -0
- package/dist/esm/events/adapters/kafka/index.min.mjs.map +1 -0
- package/dist/esm/events/adapters/kafka/index.mjs +12 -0
- package/dist/esm/events/adapters/kafka/index.mjs.map +1 -0
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +2 -0
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -0
- package/dist/esm/events/adapters/rabbitmq/index.mjs +92 -0
- package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -0
- package/dist/esm/events/index.min.mjs +1 -1
- package/dist/esm/events/index.min.mjs.map +1 -1
- package/dist/esm/events/index.mjs +7 -4
- package/dist/esm/events/index.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.min.mjs.map +1 -1
- package/dist/esm/index.mjs +8 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/instance/index.min.mjs +1 -3
- package/dist/esm/instance/index.min.mjs.map +1 -1
- package/dist/esm/instance/index.mjs +4 -132
- package/dist/esm/instance/index.mjs.map +1 -1
- package/dist/esm/introspection-32BRYKYY.mjs +10 -0
- package/dist/esm/introspection-32BRYKYY.mjs.map +1 -0
- package/dist/esm/introspection-A72WMWE3.min.mjs +2 -0
- package/dist/esm/introspection-A72WMWE3.min.mjs.map +1 -0
- package/dist/esm/jobs/adapters/redis/index.min.mjs +2 -0
- package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -0
- package/dist/esm/jobs/{types/redis.mjs → adapters/redis/index.mjs} +71 -56
- package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -0
- package/dist/esm/jobs/index.min.mjs +1 -1
- package/dist/esm/jobs/index.min.mjs.map +1 -1
- package/dist/esm/jobs/index.mjs +9 -2
- package/dist/esm/jobs/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +2 -0
- package/dist/esm/orm/adapters/in-memory/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/in-memory/index.mjs +11 -0
- package/dist/esm/orm/adapters/in-memory/index.mjs.map +1 -0
- package/dist/esm/orm/adapters/json/index.min.mjs +2 -0
- package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/json/index.mjs +980 -0
- package/dist/esm/orm/adapters/json/index.mjs.map +1 -0
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +2 -0
- package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/mongodb/index.mjs +1539 -0
- package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -0
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +47 -0
- package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/postgresql/index.mjs +2070 -0
- package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -0
- package/dist/esm/orm/index.min.mjs +2 -0
- package/dist/esm/orm/index.min.mjs.map +1 -0
- package/dist/esm/orm/index.mjs +7326 -0
- package/dist/esm/orm/index.mjs.map +1 -0
- package/dist/esm/server/adapters/express/index.min.mjs +2 -0
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -0
- package/dist/esm/server/adapters/express/index.mjs +177 -0
- package/dist/esm/server/adapters/express/index.mjs.map +1 -0
- package/dist/esm/server/adapters/fastify/index.min.mjs +2 -0
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -0
- package/dist/esm/server/adapters/fastify/index.mjs +185 -0
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -0
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.min.mjs.map +1 -1
- package/dist/esm/server/index.mjs +38 -9
- package/dist/esm/server/index.mjs.map +1 -1
- package/dist/esm/types/index.min.mjs +0 -1
- package/dist/esm/types/index.min.mjs.map +1 -1
- package/dist/esm/types/index.mjs +0 -1
- package/dist/esm/types/index.mjs.map +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs.map +1 -1
- package/dist/esm/utilities/index.mjs +22 -9
- package/dist/esm/utilities/index.mjs.map +1 -1
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.min.mjs.map +1 -1
- package/dist/esm/validations/index.mjs +8 -18
- package/dist/esm/validations/index.mjs.map +1 -1
- package/dist/types/adapter-Coap9ISX.d.ts +1435 -0
- package/dist/types/{fastify-DLPUK3vD.d.ts → base-DVr0fHil.d.ts} +76 -143
- package/dist/types/cache/adapters/in-memory/index.d.ts +21 -0
- package/dist/types/cache/adapters/in-memory/index.js +92 -0
- package/dist/types/cache/adapters/redis/index.d.ts +73 -0
- package/dist/types/cache/adapters/redis/index.js +12 -0
- package/dist/types/cache/index.d.ts +2 -42
- package/dist/types/cache/index.js +9 -4
- package/dist/types/chunk-3M4PBZAQ.js +125 -0
- package/dist/types/chunk-3TKJGSCZ.js +21 -0
- package/dist/types/chunk-65EHKCDZ.js +112 -0
- package/dist/types/chunk-JQ2FWX4W.js +1279 -0
- package/dist/types/chunk-KZKFYO4V.js +7 -0
- package/dist/types/chunk-LN3A6R4Y.js +28 -0
- package/dist/types/chunk-MLKGABMK.js +9 -0
- package/dist/types/chunk-NJ2FHI3U.js +794 -0
- package/dist/types/chunk-OHFTQGQG.js +52 -0
- package/dist/{esm/events/types/kafka.mjs → types/chunk-XGGGAEET.js} +59 -38
- package/dist/types/chunk-YTY3EFNB.js +2034 -0
- package/dist/types/{core-BrkNSwvc.d.ts → core-tNlIMH9Y.d.ts} +48 -38
- package/dist/types/dbs/adapters/mongodb/index.d.ts +43 -0
- package/dist/types/dbs/adapters/mongodb/index.js +418 -0
- package/dist/types/dbs/index.d.ts +14 -12
- package/dist/types/dbs/index.js +22 -6
- package/dist/types/equippedError-Cmo60Kn-.d.ts +8 -0
- package/dist/types/errors/index.d.ts +3 -3
- package/dist/types/errors/index.js +22 -8
- package/dist/types/events/adapters/kafka/index.d.ts +83 -0
- package/dist/types/events/adapters/kafka/index.js +11 -0
- package/dist/types/events/adapters/rabbitmq/index.d.ts +41 -0
- package/dist/types/events/adapters/rabbitmq/index.js +91 -0
- package/dist/types/events/index.d.ts +11 -11
- package/dist/types/events/index.js +7 -4
- package/dist/types/index.d.ts +2 -25
- package/dist/types/index.js +8 -1
- package/dist/types/instance/index.d.ts +12 -179
- package/dist/types/instance/index.js +4 -132
- package/dist/types/introspection-VOIU3XE6.js +9 -0
- package/dist/types/jobs/adapters/redis/index.d.ts +93 -0
- package/dist/types/jobs/{types/redis.js → adapters/redis/index.js} +70 -55
- package/dist/types/jobs/index.d.ts +19 -35
- package/dist/types/jobs/index.js +9 -2
- package/dist/types/orm/adapters/in-memory/index.d.ts +92 -0
- package/dist/types/orm/adapters/in-memory/index.js +10 -0
- package/dist/types/orm/adapters/json/index.d.ts +72 -0
- package/dist/types/orm/adapters/json/index.js +979 -0
- package/dist/types/orm/adapters/mongodb/index.d.ts +74 -0
- package/dist/types/orm/adapters/mongodb/index.js +1538 -0
- package/dist/types/orm/adapters/postgresql/index.d.ts +112 -0
- package/dist/types/orm/adapters/postgresql/index.js +2069 -0
- package/dist/types/orm/index.d.ts +160 -0
- package/dist/types/orm/index.js +7325 -0
- package/dist/types/{requestError-C2PNWUrt.d.ts → requestError-DdaL8hc3.d.ts} +2 -8
- package/dist/types/server/adapters/express/index.d.ts +196 -0
- package/dist/types/server/adapters/express/index.js +176 -0
- package/dist/types/server/adapters/fastify/index.d.ts +221 -0
- package/dist/types/server/adapters/fastify/index.js +184 -0
- package/dist/types/server/index.d.ts +10 -11
- package/dist/types/server/index.js +38 -9
- package/dist/types/types/index.js +0 -1
- package/dist/types/utilities/index.d.ts +22 -9
- package/dist/types/utilities/index.js +22 -9
- package/dist/types/{validationError-Bw8OYv5s.d.ts → validationError-oigtHqBi.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +3 -2
- package/dist/types/validations/index.js +8 -18
- package/package.json +155 -18
- package/dist/cjs/audit/events.cjs +0 -101
- package/dist/cjs/audit/events.cjs.map +0 -1
- package/dist/cjs/audit/events.min.cjs +0 -2
- package/dist/cjs/audit/events.min.cjs.map +0 -1
- package/dist/cjs/audit/index.cjs +0 -2
- package/dist/cjs/audit/index.cjs.map +0 -1
- package/dist/cjs/audit/index.min.cjs +0 -2
- package/dist/cjs/audit/index.min.cjs.map +0 -1
- package/dist/cjs/cache/base.cjs +0 -6
- package/dist/cjs/cache/base.cjs.map +0 -1
- package/dist/cjs/cache/base.min.cjs +0 -2
- package/dist/cjs/cache/base.min.cjs.map +0 -1
- package/dist/cjs/cache/pipes.cjs +0 -16
- package/dist/cjs/cache/pipes.cjs.map +0 -1
- package/dist/cjs/cache/pipes.min.cjs +0 -2
- package/dist/cjs/cache/pipes.min.cjs.map +0 -1
- package/dist/cjs/cache/types/in-memory.cjs +0 -47
- package/dist/cjs/cache/types/in-memory.cjs.map +0 -1
- package/dist/cjs/cache/types/in-memory.min.cjs +0 -2
- package/dist/cjs/cache/types/in-memory.min.cjs.map +0 -1
- package/dist/cjs/cache/types/redis.cjs +0 -55
- package/dist/cjs/cache/types/redis.cjs.map +0 -1
- package/dist/cjs/cache/types/redis.min.cjs +0 -2
- package/dist/cjs/cache/types/redis.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/changes.cjs +0 -36
- package/dist/cjs/dbs/base/changes.cjs.map +0 -1
- package/dist/cjs/dbs/base/changes.min.cjs +0 -2
- package/dist/cjs/dbs/base/changes.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/core.cjs +0 -1
- package/dist/cjs/dbs/base/core.cjs.map +0 -1
- package/dist/cjs/dbs/base/core.min.cjs +0 -1
- package/dist/cjs/dbs/base/core.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/db.cjs +0 -14
- package/dist/cjs/dbs/base/db.cjs.map +0 -1
- package/dist/cjs/dbs/base/db.min.cjs +0 -2
- package/dist/cjs/dbs/base/db.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/types.cjs +0 -2
- package/dist/cjs/dbs/base/types.cjs.map +0 -1
- package/dist/cjs/dbs/base/types.min.cjs +0 -2
- package/dist/cjs/dbs/base/types.min.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/changes.cjs +0 -81
- package/dist/cjs/dbs/mongo/changes.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/changes.min.cjs +0 -2
- package/dist/cjs/dbs/mongo/changes.min.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/db.cjs +0 -225
- package/dist/cjs/dbs/mongo/db.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/db.min.cjs +0 -2
- package/dist/cjs/dbs/mongo/db.min.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/query.cjs +0 -66
- package/dist/cjs/dbs/mongo/query.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/query.min.cjs +0 -2
- package/dist/cjs/dbs/mongo/query.min.cjs.map +0 -1
- package/dist/cjs/dbs/pipes.cjs +0 -104
- package/dist/cjs/dbs/pipes.cjs.map +0 -1
- package/dist/cjs/dbs/pipes.min.cjs +0 -2
- package/dist/cjs/dbs/pipes.min.cjs.map +0 -1
- package/dist/cjs/errors/equippedError.cjs +0 -12
- package/dist/cjs/errors/equippedError.cjs.map +0 -1
- package/dist/cjs/errors/equippedError.min.cjs +0 -2
- package/dist/cjs/errors/equippedError.min.cjs.map +0 -1
- package/dist/cjs/errors/requestError.cjs +0 -12
- package/dist/cjs/errors/requestError.cjs.map +0 -1
- package/dist/cjs/errors/requestError.min.cjs +0 -2
- package/dist/cjs/errors/requestError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/badRequestError.cjs +0 -12
- package/dist/cjs/errors/types/badRequestError.cjs.map +0 -1
- package/dist/cjs/errors/types/badRequestError.min.cjs +0 -2
- package/dist/cjs/errors/types/badRequestError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthenticatedError.cjs +0 -12
- package/dist/cjs/errors/types/notAuthenticatedError.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthenticatedError.min.cjs +0 -2
- package/dist/cjs/errors/types/notAuthenticatedError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthorizedError.cjs +0 -12
- package/dist/cjs/errors/types/notAuthorizedError.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthorizedError.min.cjs +0 -2
- package/dist/cjs/errors/types/notAuthorizedError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/notFoundError.cjs +0 -12
- package/dist/cjs/errors/types/notFoundError.cjs.map +0 -1
- package/dist/cjs/errors/types/notFoundError.min.cjs +0 -2
- package/dist/cjs/errors/types/notFoundError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/tokenExpired.cjs +0 -12
- package/dist/cjs/errors/types/tokenExpired.cjs.map +0 -1
- package/dist/cjs/errors/types/tokenExpired.min.cjs +0 -2
- package/dist/cjs/errors/types/tokenExpired.min.cjs.map +0 -1
- package/dist/cjs/errors/types/validationError.cjs +0 -16
- package/dist/cjs/errors/types/validationError.cjs.map +0 -1
- package/dist/cjs/errors/types/validationError.min.cjs +0 -2
- package/dist/cjs/errors/types/validationError.min.cjs.map +0 -1
- package/dist/cjs/events/base.cjs +0 -6
- package/dist/cjs/events/base.cjs.map +0 -1
- package/dist/cjs/events/base.min.cjs +0 -2
- package/dist/cjs/events/base.min.cjs.map +0 -1
- package/dist/cjs/events/pipes.cjs +0 -28
- package/dist/cjs/events/pipes.cjs.map +0 -1
- package/dist/cjs/events/pipes.min.cjs +0 -2
- package/dist/cjs/events/pipes.min.cjs.map +0 -1
- package/dist/cjs/events/types/kafka.cjs +0 -80
- package/dist/cjs/events/types/kafka.cjs.map +0 -1
- package/dist/cjs/events/types/kafka.min.cjs +0 -2
- package/dist/cjs/events/types/kafka.min.cjs.map +0 -1
- package/dist/cjs/events/types/rabbitmq.cjs +0 -54
- package/dist/cjs/events/types/rabbitmq.cjs.map +0 -1
- package/dist/cjs/events/types/rabbitmq.min.cjs +0 -2
- package/dist/cjs/events/types/rabbitmq.min.cjs.map +0 -1
- package/dist/cjs/instance/hooks.cjs +0 -26
- package/dist/cjs/instance/hooks.cjs.map +0 -1
- package/dist/cjs/instance/hooks.min.cjs +0 -2
- package/dist/cjs/instance/hooks.min.cjs.map +0 -1
- package/dist/cjs/instance/settings.cjs +0 -57
- package/dist/cjs/instance/settings.cjs.map +0 -1
- package/dist/cjs/instance/settings.min.cjs +0 -2
- package/dist/cjs/instance/settings.min.cjs.map +0 -1
- package/dist/cjs/jobs/pipes.cjs +0 -13
- package/dist/cjs/jobs/pipes.cjs.map +0 -1
- package/dist/cjs/jobs/pipes.min.cjs +0 -2
- package/dist/cjs/jobs/pipes.min.cjs.map +0 -1
- package/dist/cjs/jobs/types/redis.cjs +0 -106
- package/dist/cjs/jobs/types/redis.cjs.map +0 -1
- package/dist/cjs/jobs/types/redis.min.cjs +0 -2
- package/dist/cjs/jobs/types/redis.min.cjs.map +0 -1
- package/dist/cjs/server/impls/base.cjs +0 -211
- package/dist/cjs/server/impls/base.cjs.map +0 -1
- package/dist/cjs/server/impls/base.min.cjs +0 -2
- package/dist/cjs/server/impls/base.min.cjs.map +0 -1
- package/dist/cjs/server/impls/express.cjs +0 -111
- package/dist/cjs/server/impls/express.cjs.map +0 -1
- package/dist/cjs/server/impls/express.min.cjs +0 -2
- package/dist/cjs/server/impls/express.min.cjs.map +0 -1
- package/dist/cjs/server/impls/fastify.cjs +0 -121
- package/dist/cjs/server/impls/fastify.cjs.map +0 -1
- package/dist/cjs/server/impls/fastify.min.cjs +0 -2
- package/dist/cjs/server/impls/fastify.min.cjs.map +0 -1
- package/dist/cjs/server/middlewares/index.cjs +0 -2
- package/dist/cjs/server/middlewares/index.cjs.map +0 -1
- package/dist/cjs/server/middlewares/index.min.cjs +0 -2
- package/dist/cjs/server/middlewares/index.min.cjs.map +0 -1
- package/dist/cjs/server/middlewares/requireAuthUser.cjs +0 -22
- package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +0 -1
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +0 -2
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +0 -1
- package/dist/cjs/server/openapi.cjs +0 -191
- package/dist/cjs/server/openapi.cjs.map +0 -1
- package/dist/cjs/server/openapi.min.cjs +0 -30
- package/dist/cjs/server/openapi.min.cjs.map +0 -1
- package/dist/cjs/server/pipes.cjs +0 -67
- package/dist/cjs/server/pipes.cjs.map +0 -1
- package/dist/cjs/server/pipes.min.cjs +0 -2
- package/dist/cjs/server/pipes.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +0 -21
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/base.cjs +0 -20
- package/dist/cjs/server/requests-auth-methods/base.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/base.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/index.cjs +0 -4
- package/dist/cjs/server/requests-auth-methods/index.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/index.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/jwt.cjs +0 -78
- package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +0 -1
- package/dist/cjs/server/requests.cjs +0 -80
- package/dist/cjs/server/requests.cjs.map +0 -1
- package/dist/cjs/server/requests.min.cjs +0 -2
- package/dist/cjs/server/requests.min.cjs.map +0 -1
- package/dist/cjs/server/routes.cjs +0 -74
- package/dist/cjs/server/routes.cjs.map +0 -1
- package/dist/cjs/server/routes.min.cjs +0 -2
- package/dist/cjs/server/routes.min.cjs.map +0 -1
- package/dist/cjs/server/sockets.cjs +0 -126
- package/dist/cjs/server/sockets.cjs.map +0 -1
- package/dist/cjs/server/sockets.min.cjs +0 -2
- package/dist/cjs/server/sockets.min.cjs.map +0 -1
- package/dist/cjs/server/types.cjs +0 -34
- package/dist/cjs/server/types.cjs.map +0 -1
- package/dist/cjs/server/types.min.cjs +0 -2
- package/dist/cjs/server/types.min.cjs.map +0 -1
- package/dist/cjs/types/overrides.cjs +0 -1
- package/dist/cjs/types/overrides.cjs.map +0 -1
- package/dist/cjs/types/overrides.min.cjs +0 -1
- package/dist/cjs/types/overrides.min.cjs.map +0 -1
- package/dist/cjs/utilities/authProviders.cjs +0 -53
- package/dist/cjs/utilities/authProviders.cjs.map +0 -1
- package/dist/cjs/utilities/authProviders.min.cjs +0 -2
- package/dist/cjs/utilities/authProviders.min.cjs.map +0 -1
- package/dist/cjs/utilities/hash.cjs +0 -17
- package/dist/cjs/utilities/hash.cjs.map +0 -1
- package/dist/cjs/utilities/hash.min.cjs +0 -2
- package/dist/cjs/utilities/hash.min.cjs.map +0 -1
- package/dist/cjs/utilities/json.cjs +0 -16
- package/dist/cjs/utilities/json.cjs.map +0 -1
- package/dist/cjs/utilities/json.min.cjs +0 -2
- package/dist/cjs/utilities/json.min.cjs.map +0 -1
- package/dist/cjs/utilities/media.cjs +0 -13
- package/dist/cjs/utilities/media.cjs.map +0 -1
- package/dist/cjs/utilities/media.min.cjs +0 -2
- package/dist/cjs/utilities/media.min.cjs.map +0 -1
- package/dist/cjs/utilities/random.cjs +0 -12
- package/dist/cjs/utilities/random.cjs.map +0 -1
- package/dist/cjs/utilities/random.min.cjs +0 -2
- package/dist/cjs/utilities/random.min.cjs.map +0 -1
- package/dist/cjs/utilities/retry.cjs +0 -14
- package/dist/cjs/utilities/retry.cjs.map +0 -1
- package/dist/cjs/utilities/retry.min.cjs +0 -2
- package/dist/cjs/utilities/retry.min.cjs.map +0 -1
- package/dist/cjs/validations/valleyed.cjs +0 -43
- package/dist/cjs/validations/valleyed.cjs.map +0 -1
- package/dist/cjs/validations/valleyed.min.cjs +0 -2
- package/dist/cjs/validations/valleyed.min.cjs.map +0 -1
- package/dist/esm/audit/events.min.mjs +0 -2
- package/dist/esm/audit/events.min.mjs.map +0 -1
- package/dist/esm/audit/events.mjs +0 -101
- package/dist/esm/audit/events.mjs.map +0 -1
- package/dist/esm/audit/index.min.mjs +0 -2
- package/dist/esm/audit/index.min.mjs.map +0 -1
- package/dist/esm/audit/index.mjs +0 -2
- package/dist/esm/audit/index.mjs.map +0 -1
- package/dist/esm/cache/base.min.mjs +0 -2
- package/dist/esm/cache/base.min.mjs.map +0 -1
- package/dist/esm/cache/base.mjs +0 -6
- package/dist/esm/cache/base.mjs.map +0 -1
- package/dist/esm/cache/pipes.min.mjs +0 -2
- package/dist/esm/cache/pipes.min.mjs.map +0 -1
- package/dist/esm/cache/pipes.mjs +0 -16
- package/dist/esm/cache/pipes.mjs.map +0 -1
- package/dist/esm/cache/types/in-memory.min.mjs +0 -2
- package/dist/esm/cache/types/in-memory.min.mjs.map +0 -1
- package/dist/esm/cache/types/in-memory.mjs +0 -47
- package/dist/esm/cache/types/in-memory.mjs.map +0 -1
- package/dist/esm/cache/types/redis.min.mjs +0 -2
- package/dist/esm/cache/types/redis.min.mjs.map +0 -1
- package/dist/esm/cache/types/redis.mjs +0 -55
- package/dist/esm/cache/types/redis.mjs.map +0 -1
- package/dist/esm/dbs/base/changes.min.mjs +0 -2
- package/dist/esm/dbs/base/changes.min.mjs.map +0 -1
- package/dist/esm/dbs/base/changes.mjs +0 -36
- package/dist/esm/dbs/base/changes.mjs.map +0 -1
- package/dist/esm/dbs/base/core.min.mjs +0 -1
- package/dist/esm/dbs/base/core.mjs +0 -1
- package/dist/esm/dbs/base/db.min.mjs +0 -2
- package/dist/esm/dbs/base/db.min.mjs.map +0 -1
- package/dist/esm/dbs/base/db.mjs +0 -14
- package/dist/esm/dbs/base/db.mjs.map +0 -1
- package/dist/esm/dbs/base/types.min.mjs +0 -2
- package/dist/esm/dbs/base/types.min.mjs.map +0 -1
- package/dist/esm/dbs/base/types.mjs +0 -2
- package/dist/esm/dbs/base/types.mjs.map +0 -1
- package/dist/esm/dbs/mongo/changes.min.mjs +0 -2
- package/dist/esm/dbs/mongo/changes.min.mjs.map +0 -1
- package/dist/esm/dbs/mongo/changes.mjs +0 -81
- package/dist/esm/dbs/mongo/changes.mjs.map +0 -1
- package/dist/esm/dbs/mongo/db.min.mjs +0 -2
- package/dist/esm/dbs/mongo/db.min.mjs.map +0 -1
- package/dist/esm/dbs/mongo/db.mjs +0 -225
- package/dist/esm/dbs/mongo/db.mjs.map +0 -1
- package/dist/esm/dbs/mongo/query.min.mjs +0 -2
- package/dist/esm/dbs/mongo/query.min.mjs.map +0 -1
- package/dist/esm/dbs/mongo/query.mjs +0 -66
- package/dist/esm/dbs/mongo/query.mjs.map +0 -1
- package/dist/esm/dbs/pipes.min.mjs +0 -2
- package/dist/esm/dbs/pipes.min.mjs.map +0 -1
- package/dist/esm/dbs/pipes.mjs +0 -104
- package/dist/esm/dbs/pipes.mjs.map +0 -1
- package/dist/esm/errors/equippedError.min.mjs +0 -2
- package/dist/esm/errors/equippedError.min.mjs.map +0 -1
- package/dist/esm/errors/equippedError.mjs +0 -12
- package/dist/esm/errors/equippedError.mjs.map +0 -1
- package/dist/esm/errors/requestError.min.mjs +0 -2
- package/dist/esm/errors/requestError.min.mjs.map +0 -1
- package/dist/esm/errors/requestError.mjs +0 -12
- package/dist/esm/errors/requestError.mjs.map +0 -1
- package/dist/esm/errors/types/badRequestError.min.mjs +0 -2
- package/dist/esm/errors/types/badRequestError.min.mjs.map +0 -1
- package/dist/esm/errors/types/badRequestError.mjs +0 -12
- package/dist/esm/errors/types/badRequestError.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthenticatedError.min.mjs +0 -2
- package/dist/esm/errors/types/notAuthenticatedError.min.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthenticatedError.mjs +0 -12
- package/dist/esm/errors/types/notAuthenticatedError.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthorizedError.min.mjs +0 -2
- package/dist/esm/errors/types/notAuthorizedError.min.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthorizedError.mjs +0 -12
- package/dist/esm/errors/types/notAuthorizedError.mjs.map +0 -1
- package/dist/esm/errors/types/notFoundError.min.mjs +0 -2
- package/dist/esm/errors/types/notFoundError.min.mjs.map +0 -1
- package/dist/esm/errors/types/notFoundError.mjs +0 -12
- package/dist/esm/errors/types/notFoundError.mjs.map +0 -1
- package/dist/esm/errors/types/tokenExpired.min.mjs +0 -2
- package/dist/esm/errors/types/tokenExpired.min.mjs.map +0 -1
- package/dist/esm/errors/types/tokenExpired.mjs +0 -12
- package/dist/esm/errors/types/tokenExpired.mjs.map +0 -1
- package/dist/esm/errors/types/validationError.min.mjs +0 -2
- package/dist/esm/errors/types/validationError.min.mjs.map +0 -1
- package/dist/esm/errors/types/validationError.mjs +0 -16
- package/dist/esm/errors/types/validationError.mjs.map +0 -1
- package/dist/esm/events/base.min.mjs +0 -2
- package/dist/esm/events/base.min.mjs.map +0 -1
- package/dist/esm/events/base.mjs +0 -6
- package/dist/esm/events/base.mjs.map +0 -1
- package/dist/esm/events/pipes.min.mjs +0 -2
- package/dist/esm/events/pipes.min.mjs.map +0 -1
- package/dist/esm/events/pipes.mjs +0 -28
- package/dist/esm/events/pipes.mjs.map +0 -1
- package/dist/esm/events/types/kafka.min.mjs +0 -2
- package/dist/esm/events/types/kafka.min.mjs.map +0 -1
- package/dist/esm/events/types/kafka.mjs.map +0 -1
- package/dist/esm/events/types/rabbitmq.min.mjs +0 -2
- package/dist/esm/events/types/rabbitmq.min.mjs.map +0 -1
- package/dist/esm/events/types/rabbitmq.mjs +0 -54
- package/dist/esm/events/types/rabbitmq.mjs.map +0 -1
- package/dist/esm/instance/hooks.min.mjs +0 -2
- package/dist/esm/instance/hooks.min.mjs.map +0 -1
- package/dist/esm/instance/hooks.mjs +0 -26
- package/dist/esm/instance/hooks.mjs.map +0 -1
- package/dist/esm/instance/settings.min.mjs +0 -2
- package/dist/esm/instance/settings.min.mjs.map +0 -1
- package/dist/esm/instance/settings.mjs +0 -57
- package/dist/esm/instance/settings.mjs.map +0 -1
- package/dist/esm/jobs/pipes.min.mjs +0 -2
- package/dist/esm/jobs/pipes.min.mjs.map +0 -1
- package/dist/esm/jobs/pipes.mjs +0 -13
- package/dist/esm/jobs/pipes.mjs.map +0 -1
- package/dist/esm/jobs/types/redis.min.mjs +0 -2
- package/dist/esm/jobs/types/redis.min.mjs.map +0 -1
- package/dist/esm/jobs/types/redis.mjs.map +0 -1
- package/dist/esm/server/impls/base.min.mjs +0 -2
- package/dist/esm/server/impls/base.min.mjs.map +0 -1
- package/dist/esm/server/impls/base.mjs +0 -211
- package/dist/esm/server/impls/base.mjs.map +0 -1
- package/dist/esm/server/impls/express.min.mjs +0 -2
- package/dist/esm/server/impls/express.min.mjs.map +0 -1
- package/dist/esm/server/impls/express.mjs +0 -111
- package/dist/esm/server/impls/express.mjs.map +0 -1
- package/dist/esm/server/impls/fastify.min.mjs +0 -2
- package/dist/esm/server/impls/fastify.min.mjs.map +0 -1
- package/dist/esm/server/impls/fastify.mjs +0 -121
- package/dist/esm/server/impls/fastify.mjs.map +0 -1
- package/dist/esm/server/middlewares/index.min.mjs +0 -2
- package/dist/esm/server/middlewares/index.min.mjs.map +0 -1
- package/dist/esm/server/middlewares/index.mjs +0 -2
- package/dist/esm/server/middlewares/index.mjs.map +0 -1
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs +0 -2
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +0 -1
- package/dist/esm/server/middlewares/requireAuthUser.mjs +0 -22
- package/dist/esm/server/middlewares/requireAuthUser.mjs.map +0 -1
- package/dist/esm/server/openapi.min.mjs +0 -30
- package/dist/esm/server/openapi.min.mjs.map +0 -1
- package/dist/esm/server/openapi.mjs +0 -191
- package/dist/esm/server/openapi.mjs.map +0 -1
- package/dist/esm/server/pipes.min.mjs +0 -2
- package/dist/esm/server/pipes.min.mjs.map +0 -1
- package/dist/esm/server/pipes.mjs +0 -67
- package/dist/esm/server/pipes.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs +0 -21
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/base.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/base.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/base.mjs +0 -20
- package/dist/esm/server/requests-auth-methods/base.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/index.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/index.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/index.mjs +0 -4
- package/dist/esm/server/requests-auth-methods/index.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/jwt.mjs +0 -78
- package/dist/esm/server/requests-auth-methods/jwt.mjs.map +0 -1
- package/dist/esm/server/requests.min.mjs +0 -2
- package/dist/esm/server/requests.min.mjs.map +0 -1
- package/dist/esm/server/requests.mjs +0 -80
- package/dist/esm/server/requests.mjs.map +0 -1
- package/dist/esm/server/routes.min.mjs +0 -2
- package/dist/esm/server/routes.min.mjs.map +0 -1
- package/dist/esm/server/routes.mjs +0 -74
- package/dist/esm/server/routes.mjs.map +0 -1
- package/dist/esm/server/sockets.min.mjs +0 -2
- package/dist/esm/server/sockets.min.mjs.map +0 -1
- package/dist/esm/server/sockets.mjs +0 -126
- package/dist/esm/server/sockets.mjs.map +0 -1
- package/dist/esm/server/types.min.mjs +0 -2
- package/dist/esm/server/types.min.mjs.map +0 -1
- package/dist/esm/server/types.mjs +0 -34
- package/dist/esm/server/types.mjs.map +0 -1
- package/dist/esm/types/overrides.min.mjs +0 -1
- package/dist/esm/types/overrides.mjs +0 -1
- package/dist/esm/utilities/authProviders.min.mjs +0 -2
- package/dist/esm/utilities/authProviders.min.mjs.map +0 -1
- package/dist/esm/utilities/authProviders.mjs +0 -53
- package/dist/esm/utilities/authProviders.mjs.map +0 -1
- package/dist/esm/utilities/hash.min.mjs +0 -2
- package/dist/esm/utilities/hash.min.mjs.map +0 -1
- package/dist/esm/utilities/hash.mjs +0 -17
- package/dist/esm/utilities/hash.mjs.map +0 -1
- package/dist/esm/utilities/json.min.mjs +0 -2
- package/dist/esm/utilities/json.min.mjs.map +0 -1
- package/dist/esm/utilities/json.mjs +0 -16
- package/dist/esm/utilities/json.mjs.map +0 -1
- package/dist/esm/utilities/media.min.mjs +0 -2
- package/dist/esm/utilities/media.min.mjs.map +0 -1
- package/dist/esm/utilities/media.mjs +0 -13
- package/dist/esm/utilities/media.mjs.map +0 -1
- package/dist/esm/utilities/random.min.mjs +0 -2
- package/dist/esm/utilities/random.min.mjs.map +0 -1
- package/dist/esm/utilities/random.mjs +0 -12
- package/dist/esm/utilities/random.mjs.map +0 -1
- package/dist/esm/utilities/retry.min.mjs +0 -2
- package/dist/esm/utilities/retry.min.mjs.map +0 -1
- package/dist/esm/utilities/retry.mjs +0 -14
- package/dist/esm/utilities/retry.mjs.map +0 -1
- package/dist/esm/validations/valleyed.min.mjs +0 -2
- package/dist/esm/validations/valleyed.min.mjs.map +0 -1
- package/dist/esm/validations/valleyed.mjs +0 -43
- package/dist/esm/validations/valleyed.mjs.map +0 -1
- package/dist/types/audit/events.js +0 -100
- package/dist/types/audit/index.d.ts +0 -44
- package/dist/types/audit/index.js +0 -1
- package/dist/types/cache/base.js +0 -5
- package/dist/types/cache/pipes.js +0 -15
- package/dist/types/cache/types/in-memory.js +0 -46
- package/dist/types/cache/types/redis.js +0 -54
- package/dist/types/db-C8YY1yTO.d.ts +0 -14
- package/dist/types/db-Dj1SGto0.d.ts +0 -24
- package/dist/types/dbs/base/changes.js +0 -35
- package/dist/types/dbs/base/core.js +0 -0
- package/dist/types/dbs/base/db.js +0 -13
- package/dist/types/dbs/base/types.js +0 -1
- package/dist/types/dbs/mongo/changes.js +0 -80
- package/dist/types/dbs/mongo/db.js +0 -224
- package/dist/types/dbs/mongo/query.js +0 -65
- package/dist/types/dbs/pipes.js +0 -103
- package/dist/types/errors/equippedError.js +0 -11
- package/dist/types/errors/requestError.js +0 -11
- package/dist/types/errors/types/badRequestError.js +0 -11
- package/dist/types/errors/types/notAuthenticatedError.js +0 -11
- package/dist/types/errors/types/notAuthorizedError.js +0 -11
- package/dist/types/errors/types/notFoundError.js +0 -11
- package/dist/types/errors/types/tokenExpired.js +0 -11
- package/dist/types/errors/types/validationError.js +0 -15
- package/dist/types/events/base.js +0 -5
- package/dist/types/events/pipes.js +0 -27
- package/dist/types/events/types/rabbitmq.js +0 -53
- package/dist/types/instance/hooks.js +0 -25
- package/dist/types/instance/settings.js +0 -56
- package/dist/types/jobs/pipes.js +0 -12
- package/dist/types/kafka-Cf-TUJgv.d.ts +0 -54
- package/dist/types/server/impls/base.js +0 -210
- package/dist/types/server/impls/express.js +0 -110
- package/dist/types/server/impls/fastify.js +0 -120
- package/dist/types/server/middlewares/index.js +0 -1
- package/dist/types/server/middlewares/requireAuthUser.js +0 -21
- package/dist/types/server/openapi.js +0 -190
- package/dist/types/server/pipes.js +0 -66
- package/dist/types/server/requests-auth-methods/apiKeys.js +0 -20
- package/dist/types/server/requests-auth-methods/base.js +0 -19
- package/dist/types/server/requests-auth-methods/index.js +0 -3
- package/dist/types/server/requests-auth-methods/jwt.js +0 -77
- package/dist/types/server/requests.js +0 -79
- package/dist/types/server/routes.js +0 -73
- package/dist/types/server/sockets.js +0 -125
- package/dist/types/server/types.js +0 -33
- package/dist/types/types/overrides.js +0 -0
- package/dist/types/utilities/authProviders.js +0 -52
- package/dist/types/utilities/hash.js +0 -16
- package/dist/types/utilities/json.js +0 -15
- package/dist/types/utilities/media.js +0 -12
- package/dist/types/utilities/random.js +0 -11
- package/dist/types/utilities/retry.js +0 -13
- package/dist/types/validations/valleyed.js +0 -42
- /package/dist/esm/{dbs/base/core.min.mjs.map → cache/adapters/redis/index.min.mjs.map} +0 -0
- /package/dist/esm/{dbs/base/core.mjs.map → cache/adapters/redis/index.mjs.map} +0 -0
- /package/dist/esm/{types/overrides.min.mjs.map → chunk-AQY7QVYI.min.mjs.map} +0 -0
- /package/dist/esm/{types/overrides.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/orm/adapters/json/index.ts"],"sourcesContent":["import { open, readFile, rename, unlink, writeFile } from 'node:fs/promises'\n\nimport { v } from 'valleyed'\n\nimport { configurable } from '../../../utilities/configurable'\nimport type { FilterGroup } from '../../filter'\nimport type { DiscoveredSchema } from '../../migrations/introspection-types'\nimport type { AddFieldChange, AddForeignKeyChange, AddIndexChange, AnyFieldSpec, CreateTableChange, DropFieldChange, DropForeignKeyChange, DropIndexChange, DropTableChange, ModifyFieldChange, RenameFieldChange, RenameTableChange } 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'\nimport { InMemoryAdapter, type InMemoryRepoConfig } from '../in-memory'\n\nexport type JsonAdapterConfig = InMemoryRepoConfig\n\nconst jsonConnectionPipe = () =>\n\tv.object({\n\t\tfilePath: v.string(),\n\t})\n\nexport class JsonAdapter extends configurable(jsonConnectionPipe, OrmAdapter) {\n\treadonly schemaConfigPipe = v.object({ table: v.string() })\n\n\treadonly #inMemory = InMemoryAdapter.create({})\n\n\treadonly supportedFieldTypes = this.#inMemory.supportedFieldTypes\n\treadonly queryableOps = this.#inMemory.queryableOps\n\treadonly updateOps = this.#inMemory.updateOps\n\treadonly aggregateOps = this.#inMemory.aggregateOps\n\n\t#writeQueue: Promise<void> = Promise.resolve()\n\n\tprotected constructor(config: typeof JsonAdapter.Config) {\n\t\tsuper(config)\n\t}\n\n\tget stores() {\n\t\treturn this.#inMemory.stores\n\t}\n\n\t#serialize(): string {\n\t\tconst obj: Record<string, unknown> = {}\n\n\t\tconst migrations = [...this.#inMemory.migrations.values()]\n\t\tif (migrations.length > 0) obj['__migrations'] = migrations\n\n\t\tconst tables: Record<string, unknown> = {}\n\t\tfor (const [name, meta] of this.#inMemory.tables.entries()) {\n\t\t\ttables[name] = { pk: meta.pk, fields: Object.fromEntries(meta.fields.entries()) }\n\t\t}\n\t\tif (Object.keys(tables).length > 0) obj['__tables'] = tables\n\n\t\tconst indexes: Record<string, unknown> = {}\n\t\tfor (const [name, meta] of this.#inMemory.indexes.entries()) {\n\t\t\tindexes[name] = { table: meta.table, on: [...meta.on], unique: meta.unique }\n\t\t}\n\t\tif (Object.keys(indexes).length > 0) obj['__indexes'] = indexes\n\n\t\tconst foreignKeys: Record<string, unknown> = {}\n\t\tfor (const [name, meta] of this.#inMemory.foreignKeys.entries()) {\n\t\t\tforeignKeys[name] = {\n\t\t\t\ttable: meta.table,\n\t\t\t\ton: meta.on,\n\t\t\t\treferences: meta.references,\n\t\t\t\t...(meta.onDelete ? { onDelete: meta.onDelete } : {}),\n\t\t\t\t...(meta.onUpdate ? { onUpdate: meta.onUpdate } : {}),\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(foreignKeys).length > 0) obj['__foreignKeys'] = foreignKeys\n\n\t\tfor (const [name, store] of this.stores.entries()) {\n\t\t\tconst records: Record<string, Record<string, unknown>> = {}\n\t\t\tfor (const [pk, doc] of store.entries()) {\n\t\t\t\trecords[pk] = doc\n\t\t\t}\n\t\t\tobj[name] = records\n\t\t}\n\n\t\treturn JSON.stringify(obj)\n\t}\n\n\tasync #atomicWrite(): Promise<void> {\n\t\tconst data = this.#serialize()\n\t\tconst tmpPath = this.config.filePath + '.tmp.' + process.pid + '.' + Date.now()\n\t\tawait writeFile(tmpPath, data, 'utf-8')\n\t\tawait rename(tmpPath, this.config.filePath)\n\t}\n\n\t#persistToDisk(): Promise<void> {\n\t\tconst next = this.#writeQueue.then(() => this.#atomicWrite())\n\t\tthis.#writeQueue = next.catch(() => {})\n\t\treturn next\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tlet raw: string\n\t\ttry {\n\t\t\traw = await readFile(this.config.filePath, 'utf-8')\n\t\t} catch {\n\t\t\treturn\n\t\t}\n\t\tconst data = JSON.parse(raw) as Record<string, unknown>\n\n\t\tthis.#inMemory.migrations.clear()\n\t\tif (Array.isArray(data['__migrations'])) {\n\t\t\tfor (const m of data['__migrations'] as Array<{ id: string; appliedAt: number }>) {\n\t\t\t\tthis.#inMemory.migrations.set(m.id, { id: m.id, appliedAt: m.appliedAt })\n\t\t\t}\n\t\t}\n\n\t\tthis.#inMemory.tables.clear()\n\t\tif (data['__tables'] && typeof data['__tables'] === 'object') {\n\t\t\tfor (const [name, meta] of Object.entries(data['__tables'] as Record<string, any>)) {\n\t\t\t\tconst fields = new Map<string, AnyFieldSpec>()\n\t\t\t\tif (meta.fields) {\n\t\t\t\t\tfor (const [fieldName, fspec] of Object.entries(meta.fields as Record<string, AnyFieldSpec>)) {\n\t\t\t\t\t\tfields.set(fieldName, fspec)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.#inMemory.tables.set(name, { pk: meta.pk, fields })\n\t\t\t}\n\t\t}\n\n\t\tthis.#inMemory.indexes.clear()\n\t\tif (data['__indexes'] && typeof data['__indexes'] === 'object') {\n\t\t\tfor (const [name, meta] of Object.entries(data['__indexes'] as Record<string, any>)) {\n\t\t\t\tthis.#inMemory.indexes.set(name, { table: meta.table, on: meta.on, unique: meta.unique })\n\t\t\t}\n\t\t}\n\n\t\tthis.#inMemory.foreignKeys.clear()\n\t\tif (data['__foreignKeys'] && typeof data['__foreignKeys'] === 'object') {\n\t\t\tfor (const [name, meta] of Object.entries(data['__foreignKeys'] as Record<string, any>)) {\n\t\t\t\tthis.#inMemory.foreignKeys.set(name, meta)\n\t\t\t}\n\t\t}\n\n\t\tthis.stores.clear()\n\t\tfor (const [name, records] of Object.entries(data)) {\n\t\t\tif (name.startsWith('__')) continue\n\t\t\tconst store = new Map<string, Record<string, unknown>>()\n\t\t\tfor (const [pk, doc] of Object.entries(records as Record<string, Record<string, unknown>>)) {\n\t\t\t\tstore.set(pk, doc)\n\t\t\t}\n\t\t\tthis.stores.set(name, store)\n\t\t}\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync findByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\treturn this.#inMemory.findByPk(schema, config, pk)\n\t}\n\n\tasync createMany(schema: AnySchema, config: unknown, data: Record<string, unknown>[]) {\n\t\tconst result = await this.#inMemory.createMany(schema, config, data)\n\t\tawait this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync updateByPk(schema: AnySchema, config: unknown, pk: unknown, ops: AnyUpdateOp[]) {\n\t\tconst result = await this.#inMemory.updateByPk(schema, config, pk, ops)\n\t\tif (result) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync deleteByPk(schema: AnySchema, config: unknown, pk: unknown) {\n\t\tconst result = await this.#inMemory.deleteByPk(schema, config, pk)\n\t\tif (result) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync findMany(schema: AnySchema, config: unknown, group: FilterGroup, options?: QueryOptions) {\n\t\treturn this.#inMemory.findMany(schema, config, group, options)\n\t}\n\n\tasync count(schema: AnySchema, config: unknown, group: FilterGroup) {\n\t\treturn this.#inMemory.count(schema, config, group)\n\t}\n\n\titerateMany(schema: AnySchema, config: unknown, group: FilterGroup, options?: IterationQueryOptions) {\n\t\treturn this.#inMemory.iterateMany(schema, config, group, options)\n\t}\n\n\tasync updateMany(schema: AnySchema, config: unknown, group: FilterGroup, data: Record<string, unknown>) {\n\t\tconst result = await this.#inMemory.updateMany(schema, config, group, data)\n\t\tif (result.length) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync deleteMany(schema: AnySchema, config: unknown, filter: FilterGroup) {\n\t\tconst result = await this.#inMemory.deleteMany(schema, config, filter)\n\t\tif (result.length) await this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync upsertOne(schema: AnySchema, config: unknown, filter: FilterGroup, create: Record<string, unknown>, ops: AnyUpdateOp[]) {\n\t\tconst result = await this.#inMemory.upsertOne(schema, config, filter, create, ops)\n\t\tawait this.#persistToDisk()\n\t\treturn result\n\t}\n\n\tasync aggregate(schema: AnySchema, config: unknown, spec: AggregateSpec) {\n\t\treturn this.#inMemory.aggregate(schema, config, spec)\n\t}\n\n\tasync session<T>(fn: () => Promise<T>): Promise<T> {\n\t\treturn this.#inMemory.session(async () => {\n\t\t\tconst result = await fn()\n\t\t\tawait this.#persistToDisk()\n\t\t\treturn result\n\t\t})\n\t}\n\n\tasync loadMigrations(): Promise<{ id: string; appliedAt: number }[]> {\n\t\tawait this.connect()\n\t\treturn this.#inMemory.loadMigrations()\n\t}\n\n\tasync recordMigration(id: string, appliedAt: number): Promise<void> {\n\t\tawait this.#inMemory.recordMigration(id, appliedAt)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync acquireMigrationLock<T>(fn: () => Promise<T>): Promise<T> {\n\t\tconst lockPath = this.config.filePath + '.lock'\n\t\tconst deadline = Date.now() + 30_000\n\t\twhile (true) {\n\t\t\ttry {\n\t\t\t\tconst handle = await open(lockPath, 'wx')\n\t\t\t\tawait handle.close()\n\t\t\t\tbreak\n\t\t\t} catch (err: any) {\n\t\t\t\tif (err.code !== 'EEXIST') throw err\n\t\t\t\tif (Date.now() > deadline) throw new Error('Timed out waiting for migration lock')\n\t\t\t\tawait new Promise((r) => setTimeout(r, 50))\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\treturn await fn()\n\t\t} finally {\n\t\t\tawait unlink(lockPath).catch(() => {})\n\t\t}\n\t}\n\n\tasync applyCreateTable(change: CreateTableChange<any>): Promise<void> {\n\t\tawait this.#inMemory.applyCreateTable(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropTable(change: DropTableChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropTable(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyAddField(change: AddFieldChange<any>): Promise<void> {\n\t\tawait this.#inMemory.applyAddField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropField(change: DropFieldChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyModifyField(change: ModifyFieldChange<any>): Promise<void> {\n\t\tawait this.#inMemory.applyModifyField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyRenameTable(change: RenameTableChange): Promise<void> {\n\t\tawait this.#inMemory.applyRenameTable(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyRenameField(change: RenameFieldChange): Promise<void> {\n\t\tawait this.#inMemory.applyRenameField(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyAddIndex(change: AddIndexChange): Promise<void> {\n\t\tawait this.#inMemory.applyAddIndex(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropIndex(change: DropIndexChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropIndex(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyAddForeignKey(change: AddForeignKeyChange): Promise<void> {\n\t\tawait this.#inMemory.applyAddForeignKey(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync applyDropForeignKey(change: DropForeignKeyChange): Promise<void> {\n\t\tawait this.#inMemory.applyDropForeignKey(change)\n\t\tawait this.#persistToDisk()\n\t}\n\n\tasync introspect(): Promise<DiscoveredSchema[]> {\n\t\treturn this.#inMemory.introspect()\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, beforeEach, afterEach } = import.meta.vitest\n\tconst { FilterGroup } = await import('../../filter')\n\tconst { OrderBy } = await import('../../query-options')\n\tconst { Schema } = await import('../../schema')\n\tconst { IncOp, PatchOp, PullOp, PushOp } = await import('../../updates')\n\tconst { v } = await import('valleyed')\n\tconst { mkdtemp, rm } = await import('node:fs/promises')\n\tconst { tmpdir } = await import('node:os')\n\tconst { join } = await import('node:path')\n\tconst { Migrator } = await import('../../migrations/migrator')\n\tconst { Repo } = await import('../../repo/repo')\n\tconst { OrmMigrationError } = await import('../../errors/migration')\n\ttype Migration<A extends import('../base').OrmAdapterLike<any>> = import('../../migrations/types').Migration<A>\n\n\tlet tmpDir: string\n\tlet filePath: string\n\n\tbeforeEach(async () => {\n\t\ttmpDir = await mkdtemp(join(tmpdir(), 'json-adapter-'))\n\t\tfilePath = join(tmpDir, 'test.json')\n\t})\n\n\tafterEach(async () => {\n\t\tawait rm(tmpDir, { recursive: true, force: true })\n\t})\n\n\tdescribe('json adapter — class construction', () => {\n\t\ttest('JsonAdapter.create({ filePath }) produces a working adapter', () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\texpect(adapter).toBeInstanceOf(JsonAdapter)\n\t\t\texpect(adapter.schemaConfigPipe).toBeDefined()\n\t\t\texpect(adapter.supportedFieldTypes).toEqual(['string', 'number', 'boolean', 'null', 'object', 'array', 'date'])\n\t\t})\n\n\t\ttest('auto-wired Instance hooks register connect/disconnect keyed by class', async () => {\n\t\t\tconst { Instance: Inst } = await import('../../../instance')\n\t\t\tconst onSpy = (await import('vitest')).vi.spyOn(Inst, 'on').mockImplementation(() => {})\n\n\t\t\tJsonAdapter.create({ filePath })\n\n\t\t\texpect(onSpy).toHaveBeenCalledWith('start', expect.any(Function), expect.objectContaining({ class: JsonAdapter }))\n\t\t\texpect(onSpy).toHaveBeenCalledWith('close', expect.any(Function), expect.objectContaining({ class: JsonAdapter }))\n\n\t\t\tonSpy.mockRestore()\n\t\t})\n\t})\n\n\tdescribe('json adapter — surface parity with in-memory', () => {\n\t\ttest('CRUD: create, find, update, delete round-trip', async () => {\n\t\t\tconst schema = Schema.from('users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.field('age', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tconst use = adapter.use(schema, { table: 'users' })\n\n\t\t\tconst created = await use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t])\n\t\t\texpect(created).toHaveLength(2)\n\n\t\t\tconst found = await use.findOne(FilterGroup.create().eq('id', 'u1'))\n\t\t\texpect(found).toEqual({ id: 'u1', name: 'Alice', age: 30 })\n\n\t\t\tconst many = await use.findMany(FilterGroup.create().gt('age', 19), {\n\t\t\t\torderBy: [new OrderBy('age', 'asc')],\n\t\t\t})\n\t\t\texpect(many).toEqual([\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t])\n\n\t\t\tawait use.updateOne(FilterGroup.create().eq('id', 'u1'), { age: 31 })\n\t\t\tconst updated = await use.findOne(FilterGroup.create().eq('id', 'u1'))\n\t\t\texpect(updated?.age).toBe(31)\n\n\t\t\tconst deleted = await use.deleteOne(FilterGroup.create().eq('id', 'u2'))\n\t\t\texpect(deleted).toEqual({ id: 'u2', name: 'Bob', age: 20 })\n\n\t\t\tconst remaining = await use.findMany(FilterGroup.create())\n\t\t\texpect(remaining).toHaveLength(1)\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('supports nested filters, ordering, select, offset and limit', async () => {\n\t\t\tconst schema = Schema.from('users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.field('age', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'users' })\n\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t\t{ id: 'u3', name: 'Carol', age: 40 },\n\t\t\t])\n\n\t\t\tconst builtGroup = FilterGroup.create().and([\n\t\t\t\t(q) => q.gt('age', 19),\n\t\t\t\t(q) => q.or([(g) => g.eq('name', 'Alice'), (g) => g.eq('name', 'Carol')]),\n\t\t\t])\n\t\t\tconst options = { orderBy: [new OrderBy('age', 'desc')], offset: 1, limit: 1, select: ['id', 'name'] as const }\n\t\t\tconst rows = await use.findMany(builtGroup, options)\n\t\t\texpect(rows).toEqual([{ id: 'u1', name: 'Alice' }])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('count delegates to the in-memory store and persists separately from query options', async () => {\n\t\t\tconst schema = Schema.from('count_users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'count_users' })\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice' },\n\t\t\t\t{ id: 'u2', name: 'Bob' },\n\t\t\t\t{ id: 'u3', name: 'Alice' },\n\t\t\t])\n\n\t\t\tawait expect(use.count(FilterGroup.create().eq('name', 'Alice'))).resolves.toBe(2)\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('iterateMany with batchSize matches findMany through in-memory delegation', async () => {\n\t\t\tconst schema = Schema.from('json_iter_users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.field('age', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'json_iter_users' })\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice', age: 30 },\n\t\t\t\t{ id: 'u2', name: 'Bob', age: 20 },\n\t\t\t\t{ id: 'u3', name: 'Carol', age: 40 },\n\t\t\t\t{ id: 'u4', name: 'Dan', age: 50 },\n\t\t\t])\n\n\t\t\tconst filter = FilterGroup.create().gt('age', 19)\n\t\t\tconst options = {\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\tselect: ['id', 'name'],\n\t\t\t}\n\t\t\tconst expected = await use.findMany(filter, options)\n\t\t\tconst rows: Record<string, unknown>[] = []\n\t\t\tfor await (const row of use.iterateMany(filter, { ...options, batchSize: 2 })) {\n\t\t\t\trows.push(row)\n\t\t\t}\n\t\t\texpect(rows).toEqual(expected)\n\t\t\texpect(rows).toEqual([\n\t\t\t\t{ id: 'u3', name: 'Carol' },\n\t\t\t\t{ id: 'u1', name: 'Alice' },\n\t\t\t])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('supports update operators and rollback on failed session', async () => {\n\t\t\tconst schema = Schema.from('docs')\n\t\t\t\t.pk('id', v.string(), () => 'd1')\n\t\t\t\t.field('count', v.number())\n\t\t\t\t.field('tags', v.array(v.string()))\n\t\t\t\t.field('meta', v.object({ a: v.number() }))\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'docs' })\n\n\t\t\tawait use.createOne({ id: 'd1', count: 1, tags: ['x'], meta: { a: 1 } })\n\n\t\t\tawait adapter.session(async () => {\n\t\t\t\tawait use.updateOne(FilterGroup.create().eq('id', 'd1'), {\n\t\t\t\t\tcount: new IncOp('count', 2),\n\t\t\t\t\ttags: new PushOp('tags', 'y'),\n\t\t\t\t\tmeta: new PatchOp('meta', { a: 9 }),\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tawait expect(\n\t\t\t\tadapter.session(async () => {\n\t\t\t\t\tawait use.updateOne(FilterGroup.create().eq('id', 'd1'), { tags: new PullOp('tags', 'x') })\n\t\t\t\t\tthrow new Error('boom')\n\t\t\t\t}),\n\t\t\t).rejects.toThrow('boom')\n\n\t\t\tconst row = await use.findOne(FilterGroup.create().eq('id', 'd1'))\n\t\t\texpect(row).toEqual({ id: 'd1', count: 3, tags: ['x', 'y'], meta: { a: 9 } })\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('upsertOne inserts when missing and updates when existing', async () => {\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tconst inserted = await use.upsertOne(FilterGroup.create().eq('id', 'i1'), { id: 'i1', val: 10 }, [])\n\t\t\texpect(inserted).toEqual({ id: 'i1', val: 10 })\n\n\t\t\tconst updated = await use.upsertOne(FilterGroup.create().eq('id', 'i1'), { id: 'i1', val: 10 }, [new IncOp('val', 5)])\n\t\t\texpect(updated).toEqual({ id: 'i1', val: 15 })\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — persistence', () => {\n\t\ttest('state persists across adapter restarts', async () => {\n\t\t\tconst schema = Schema.from('users')\n\t\t\t\t.pk('id', v.string(), () => 'u')\n\t\t\t\t.field('name', v.string())\n\t\t\t\t.build()\n\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tconst use1 = a1.use(schema, { table: 'users' })\n\t\t\tawait use1.createMany([\n\t\t\t\t{ id: 'u1', name: 'Alice' },\n\t\t\t\t{ id: 'u2', name: 'Bob' },\n\t\t\t])\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst use2 = a2.use(schema, { table: 'users' })\n\t\t\tconst rows = await use2.findMany(FilterGroup.create())\n\t\t\texpect(rows).toHaveLength(2)\n\t\t\texpect(rows.map((r) => r.name).sort()).toEqual(['Alice', 'Bob'])\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('failed session does not persist rolled-back state to disk', async () => {\n\t\t\tconst schema = Schema.from('docs')\n\t\t\t\t.pk('id', v.string(), () => 'd')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tconst use1 = a1.use(schema, { table: 'docs' })\n\t\t\tawait use1.createOne({ id: 'd1', val: 1 })\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst use2 = a2.use(schema, { table: 'docs' })\n\t\t\tawait expect(\n\t\t\t\ta2.session(async () => {\n\t\t\t\t\tawait use2.updateOne(FilterGroup.create().eq('id', 'd1'), { val: 999 })\n\t\t\t\t\tthrow new Error('rollback')\n\t\t\t\t}),\n\t\t\t).rejects.toThrow('rollback')\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst a3 = JsonAdapter.create({ filePath })\n\t\t\tawait a3.connect()\n\t\t\tconst use3 = a3.use(schema, { table: 'docs' })\n\t\t\tconst row = await use3.findOne(FilterGroup.create().eq('id', 'd1'))\n\t\t\texpect(row?.val).toBe(1)\n\t\t\tawait a3.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — atomic writes', () => {\n\t\ttest('file is valid JSON after every write', async () => {\n\t\t\tconst { readFile: rf } = await import('node:fs/promises')\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tawait use.createOne({ id: `i${i}`, val: i })\n\t\t\t\tconst raw = await rf(filePath, 'utf-8')\n\t\t\t\texpect(() => JSON.parse(raw)).not.toThrow()\n\t\t\t}\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('no .tmp files remain after writes complete', async () => {\n\t\t\tconst { readdir } = await import('node:fs/promises')\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tawait use.createOne({ id: `i${i}`, val: i })\n\t\t\t}\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst files = await readdir(tmpDir)\n\t\t\tconst tmpFiles = files.filter((f) => f.includes('.tmp.'))\n\t\t\texpect(tmpFiles).toHaveLength(0)\n\t\t})\n\t})\n\n\tdescribe('json adapter — aggregate delegation', () => {\n\t\tconst orderSchema = Schema.from('orders')\n\t\t\t.pk('id', v.string(), () => 'o')\n\t\t\t.field('amount', v.number())\n\t\t\t.field('region', v.string())\n\t\t\t.build()\n\n\t\tconst orderSeed = [\n\t\t\t{ id: 'o1', amount: 100, region: 'us' },\n\t\t\t{ id: 'o2', amount: 200, region: 'eu' },\n\t\t\t{ id: 'o3', amount: 150, region: 'us' },\n\t\t]\n\n\t\tasync function makeSeededAdapter() {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(orderSchema, { table: 'orders' })\n\t\t\tawait use.createMany(orderSeed)\n\t\t\treturn adapter\n\t\t}\n\n\t\ttest('aggregateOps matches in-memory adapter', () => {\n\t\t\tconst json = JsonAdapter.create({ filePath })\n\t\t\tconst inMem = InMemoryAdapter.create({})\n\t\t\texpect(json.aggregateOps).toEqual(inMem.aggregateOps)\n\t\t\texpect(json.aggregateOps).toEqual(['count', 'countDistinct', 'sum', 'avg', 'min', 'max'])\n\t\t})\n\n\t\ttest('count returns identical result to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ total: 3 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('countDistinct returns identical result to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [{ fn: 'countDistinct', field: 'region', alias: 'uniqueRegions' }],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ uniqueRegions: 2 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('sum, avg, min, max return identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [\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: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ totalAmount: 450, avgAmount: 150, minAmount: 100, maxAmount: 200 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('groupBy returns identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [\n\t\t\t\t\t{ fn: 'count', alias: 'cnt' },\n\t\t\t\t\t{ fn: 'sum', field: 'amount', alias: 'total' },\n\t\t\t\t],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t})\n\t\t\tconst sorted = result.sort((a, b) => String(a.region).localeCompare(String(b.region)))\n\t\t\texpect(sorted).toEqual([\n\t\t\t\t{ region: 'eu', cnt: 1, total: 200 },\n\t\t\t\t{ region: 'us', cnt: 2, total: 250 },\n\t\t\t])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('where pre-filter returns identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\twhere: FilterGroup.create().gt('amount', 100),\n\t\t\t\taggregates: [{ fn: 'count', alias: 'cnt' }],\n\t\t\t\tgroupBy: [],\n\t\t\t})\n\t\t\texpect(result).toEqual([{ cnt: 2 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('having post-filter returns identical results to in-memory', async () => {\n\t\t\tconst adapter = await makeSeededAdapter()\n\t\t\tconst result = await adapter.aggregate(orderSchema, { table: 'orders' }, {\n\t\t\t\taggregates: [{ fn: 'count', alias: 'cnt' }],\n\t\t\t\tgroupBy: ['region'],\n\t\t\t\thaving: FilterGroup.create().gt('cnt', 1),\n\t\t\t})\n\t\t\texpect(result).toEqual([{ region: 'us', cnt: 2 }])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('aggregate delegates to same in-memory instance used by CRUD', async () => {\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tawait use.createMany([\n\t\t\t\t{ id: 'i1', val: 10 },\n\t\t\t\t{ id: 'i2', val: 20 },\n\t\t\t])\n\n\t\t\tconst spec: AggregateSpec = {\n\t\t\t\taggregates: [{ fn: 'sum', field: 'val', alias: 'total' }],\n\t\t\t\tgroupBy: [],\n\t\t\t}\n\t\t\tconst result = await adapter.aggregate(schema, { table: 'items' }, spec)\n\t\t\texpect(result).toEqual([{ total: 30 }])\n\n\t\t\tawait use.createOne({ id: 'i3', val: 30 })\n\t\t\tconst result2 = await adapter.aggregate(schema, { table: 'items' }, spec)\n\t\t\texpect(result2).toEqual([{ total: 60 }])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — concurrent writes serialize', () => {\n\t\ttest('parallel writes from same process all persist', async () => {\n\t\t\tconst schema = Schema.from('items')\n\t\t\t\t.pk('id', v.string(), () => 'i')\n\t\t\t\t.field('val', v.number())\n\t\t\t\t.build()\n\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tconst use = adapter.use(schema, { table: 'items' })\n\n\t\t\tawait Promise.all(Array.from({ length: 20 }, (_, i) => use.createOne({ id: `i${i}`, val: i })))\n\n\t\t\tconst rows = await use.findMany(FilterGroup.create())\n\t\t\texpect(rows).toHaveLength(20)\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst use2 = a2.use(schema, { table: 'items' })\n\t\t\tconst reloaded = await use2.findMany(FilterGroup.create())\n\t\t\texpect(reloaded).toHaveLength(20)\n\t\t\tawait a2.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — migration storage', () => {\n\t\ttest('recordMigration + loadMigrations round-trip', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.recordMigration('m-001', 1000)\n\t\t\tawait adapter.recordMigration('m-002', 2000)\n\n\t\t\tconst loaded = await adapter.loadMigrations()\n\t\t\texpect(loaded).toHaveLength(2)\n\t\t\texpect(loaded).toEqual([\n\t\t\t\t{ id: 'm-001', appliedAt: 1000 },\n\t\t\t\t{ id: 'm-002', appliedAt: 2000 },\n\t\t\t])\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('migration tracker persists across adapter restarts', async () => {\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tawait a1.recordMigration('m-001', 1000)\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst loaded = await a2.loadMigrations()\n\t\t\texpect(loaded).toEqual([{ id: 'm-001', appliedAt: 1000 }])\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('__migrations key in JSON file stores tracker data', async () => {\n\t\t\tconst { readFile: rf } = await import('node:fs/promises')\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tawait adapter.recordMigration('m-001', 1000)\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst raw = JSON.parse(await rf(filePath, 'utf-8'))\n\t\t\texpect(raw['__migrations']).toEqual([{ id: 'm-001', appliedAt: 1000 }])\n\t\t})\n\t})\n\n\tdescribe('json adapter — apply* methods', () => {\n\t\ttest('applyCreateTable persists table metadata', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tawait adapter.applyCreateTable({\n\t\t\t\tkind: 'createTable',\n\t\t\t\tname: 'users',\n\t\t\t\tpk: { name: 'id', type: 'string' },\n\t\t\t\tfields: [{ name: 'email', type: 'string', unique: true }],\n\t\t\t})\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\t\t\texpect(schemas).toHaveLength(1)\n\t\t\texpect(schemas[0].name).toBe('users')\n\t\t\texpect(schemas[0].pk).toEqual({ name: 'id', type: 'string' })\n\t\t\texpect(schemas[0].fields).toEqual([{ name: 'email', type: 'string', nullable: false, unique: true }])\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('applyAddIndex and applyDropIndex persist across restarts', async () => {\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tawait a1.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait a1.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'], unique: true })\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\t\t\texpect(schemas[0].indexes).toEqual([{ name: 'users_email_idx', on: ['email'], unique: true }])\n\t\t\tawait a2.applyDropIndex({ kind: 'dropIndex', name: 'users_email_idx' })\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst a3 = JsonAdapter.create({ filePath })\n\t\t\tawait a3.connect()\n\t\t\tconst schemas2 = await a3.introspect()\n\t\t\texpect(schemas2[0].indexes).toEqual([])\n\t\t\tawait a3.disconnect()\n\t\t})\n\n\t\ttest('applyAddForeignKey and applyDropForeignKey persist across restarts', async () => {\n\t\t\tconst a1 = JsonAdapter.create({ filePath })\n\t\t\tawait a1.connect()\n\t\t\tawait a1.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait a1.applyCreateTable({ kind: 'createTable', name: 'posts', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait a1.applyAddForeignKey({ kind: 'addForeignKey', table: 'posts', on: 'authorId', references: { table: 'users', column: 'id' }, onDelete: 'cascade' })\n\t\t\tawait a1.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\t\t\tconst posts = schemas.find((s) => s.name === 'posts')!\n\t\t\texpect(posts.foreignKeys).toEqual([{\n\t\t\t\tname: 'posts_authorId_fk',\n\t\t\t\ton: 'authorId',\n\t\t\t\treferences: { table: 'users', column: 'id' },\n\t\t\t\tonDelete: 'cascade',\n\t\t\t}])\n\t\t\tawait a2.applyDropForeignKey({ kind: 'dropForeignKey', table: 'posts', name: 'posts_authorId_fk' })\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst a3 = JsonAdapter.create({ filePath })\n\t\t\tawait a3.connect()\n\t\t\tconst schemas2 = await a3.introspect()\n\t\t\tconst posts2 = schemas2.find((s) => s.name === 'posts')!\n\t\t\texpect(posts2.foreignKeys).toEqual([])\n\t\t\tawait a3.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — acquireMigrationLock', () => {\n\t\ttest('file lock serialises concurrent calls', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tconst order: string[] = []\n\t\t\tlet resolveGate!: () => void\n\t\t\tconst gate = new Promise<void>((r) => { resolveGate = r })\n\n\t\t\tconst p1 = adapter.acquireMigrationLock(async () => {\n\t\t\t\torder.push('p1-start')\n\t\t\t\tawait gate\n\t\t\t\torder.push('p1-end')\n\t\t\t})\n\t\t\tawait new Promise((r) => setTimeout(r, 100))\n\t\t\tconst p2 = adapter.acquireMigrationLock(async () => {\n\t\t\t\torder.push('p2')\n\t\t\t})\n\n\t\t\tawait new Promise((r) => setTimeout(r, 100))\n\t\t\texpect(order).toEqual(['p1-start'])\n\n\t\t\tresolveGate()\n\t\t\tawait Promise.all([p1, p2])\n\t\t\texpect(order).toEqual(['p1-start', 'p1-end', 'p2'])\n\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('lock file is cleaned up after successful execution', async () => {\n\t\t\tconst { access } = await import('node:fs/promises')\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.acquireMigrationLock(async () => { /* no-op */ })\n\n\t\t\tawait expect(access(filePath + '.lock')).rejects.toThrow()\n\t\t\tawait adapter.disconnect()\n\t\t})\n\n\t\ttest('lock file is cleaned up after failed execution', async () => {\n\t\t\tconst { access } = await import('node:fs/promises')\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait expect(\n\t\t\t\tadapter.acquireMigrationLock(async () => { throw new Error('boom') }),\n\t\t\t).rejects.toThrow('boom')\n\n\t\t\tawait expect(access(filePath + '.lock')).rejects.toThrow()\n\t\t\tawait adapter.disconnect()\n\t\t})\n\t})\n\n\tdescribe('json adapter — end-to-end migrations via Migrator', () => {\n\t\tconst UserSchema = Schema.from('users')\n\t\t\t.pk('id', v.string(), () => `u-${Math.random().toString(36).slice(2)}`)\n\t\t\t.field('email', v.string())\n\t\t\t.build()\n\n\t\tfunction makeEnv() {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tconst repo = new Repo({ adapter, resolve: (s) => ({ table: s.name }) })\n\t\t\treturn { adapter, repo }\n\t\t}\n\n\t\ttest('end-to-end migration run covering every declarative variant + execute', async () => {\n\t\t\tconst { adapter, repo } = makeEnv()\n\t\t\tawait adapter.connect()\n\n\t\t\tconst migrations: Migration<typeof adapter>[] = [\n\t\t\t\t{\n\t\t\t\t\tid: '0001-create',\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [{ name: 'email', type: 'string' }] },\n\t\t\t\t\t\t{ kind: 'createTable', name: 'posts', pk: { name: 'id', type: 'string' }, fields: [{ name: 'title', type: 'string' }, { name: 'authorId', type: 'string' }] },\n\t\t\t\t\t\t{ kind: 'addIndex', table: 'users', on: ['email'], unique: true },\n\t\t\t\t\t\t{ kind: 'addForeignKey', table: 'posts', on: 'authorId', references: { table: 'users', column: 'id' } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0002-evolve',\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'addField', table: 'users', field: { name: 'age', type: 'number', nullable: true } },\n\t\t\t\t\t\t{ kind: 'modifyField', table: 'users', name: 'email', to: { name: 'email', type: 'string', unique: true, nullable: true } },\n\t\t\t\t\t\t{ kind: 'renameField', table: 'posts', from: 'title', to: 'headline' },\n\t\t\t\t\t\t{ kind: 'renameTable', from: 'posts', to: 'articles' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0003-cleanup',\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{ kind: 'dropField', table: 'users', name: 'age' },\n\t\t\t\t\t\t{ kind: 'dropForeignKey', table: 'posts', name: 'posts_authorId_fk' },\n\t\t\t\t\t\t{ kind: 'dropIndex', name: 'users_email_idx' },\n\t\t\t\t\t\t{ kind: 'dropTable', name: 'articles' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0004-seed',\n\t\t\t\t\tchanges: [{\n\t\t\t\t\t\tkind: 'execute',\n\t\t\t\t\t\tup: async (r) => {\n\t\t\t\t\t\t\tawait r.on(UserSchema).one().create({ id: 'seed-1', email: 'test@example.com' })\n\t\t\t\t\t\t},\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\t\t\texpect(result.ran).toEqual(['0001-create', '0002-evolve', '0003-cleanup', '0004-seed'])\n\n\t\t\tconst recorded = await adapter.loadMigrations()\n\t\t\texpect(recorded).toHaveLength(4)\n\n\t\t\tconst row = await repo.on(UserSchema).one().id('seed-1').find()\n\t\t\texpect(row).not.toBeNull()\n\t\t\texpect(row!.email).toBe('test@example.com')\n\n\t\t\t// Verify via re-reading the file\n\t\t\tawait adapter.disconnect()\n\t\t\tconst { adapter: a2, repo: r2 } = makeEnv()\n\t\t\tawait a2.connect()\n\t\t\tconst recorded2 = await a2.loadMigrations()\n\t\t\texpect(recorded2).toHaveLength(4)\n\n\t\t\tconst row2 = await r2.on(UserSchema).one().id('seed-1').find()\n\t\t\texpect(row2!.email).toBe('test@example.com')\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('file lock serialises concurrent migrator.up() runs', async () => {\n\t\t\tconst order: string[] = []\n\t\t\tlet resolveGate!: () => void\n\t\t\tconst gate = new Promise<void>((r) => { resolveGate = r })\n\n\t\t\tconst migrations: Migration<JsonAdapter>[] = [\n\t\t\t\t{\n\t\t\t\t\tid: '0001',\n\t\t\t\t\tchanges: [{\n\t\t\t\t\t\tkind: 'execute',\n\t\t\t\t\t\tup: async () => {\n\t\t\t\t\t\t\torder.push('0001-start')\n\t\t\t\t\t\t\tawait gate\n\t\t\t\t\t\t\torder.push('0001-end')\n\t\t\t\t\t\t},\n\t\t\t\t\t}],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: '0002',\n\t\t\t\t\tchanges: [{ kind: 'execute', up: async () => { order.push('0002') } }],\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tconst adapter1 = JsonAdapter.create({ filePath })\n\t\t\tawait adapter1.connect()\n\t\t\tconst repo1 = new Repo({ adapter: adapter1, resolve: (s) => ({ table: s.name }) })\n\t\t\tconst migrator1 = Migrator.from(repo1, adapter1).migrations(migrations).build()\n\n\t\t\tconst adapter2 = JsonAdapter.create({ filePath })\n\t\t\tawait adapter2.connect()\n\t\t\tconst repo2 = new Repo({ adapter: adapter2, resolve: (s) => ({ table: s.name }) })\n\t\t\tconst migrator2 = Migrator.from(repo2, adapter2).migrations(migrations).build()\n\n\t\t\tconst p1 = migrator1.up()\n\t\t\tconst p2 = migrator2.up()\n\n\t\t\tawait new Promise((r) => setTimeout(r, 200))\n\t\t\texpect(order).toEqual(['0001-start'])\n\n\t\t\tresolveGate()\n\t\t\tawait Promise.all([p1, p2])\n\n\t\t\texpect(order).toEqual(['0001-start', '0001-end', '0002'])\n\n\t\t\tawait adapter1.disconnect()\n\t\t\tawait adapter2.disconnect()\n\t\t})\n\n\t\ttest('tx:true rollback leaves file unchanged on failure', async () => {\n\t\t\tconst { adapter } = makeEnv()\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst { adapter: a2, repo: r2 } = makeEnv()\n\t\t\tawait a2.connect()\n\n\t\t\tconst m: Migration<typeof a2> = {\n\t\t\t\tid: '0001-will-fail',\n\t\t\t\tchanges: [\n\t\t\t\t\t{ kind: 'addIndex', table: 'users', on: ['email'] },\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: 'execute',\n\t\t\t\t\t\tup: async (r) => {\n\t\t\t\t\t\t\tawait r.on(UserSchema).one().create({ id: 'partial', email: 'fail@test.com' })\n\t\t\t\t\t\t\tthrow new Error('mid-migration boom')\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}\n\t\t\tconst migrator = Migrator.from(r2, a2).migrations([m]).build()\n\t\t\tawait expect(migrator.up()).rejects.toThrow(OrmMigrationError)\n\t\t\tawait a2.disconnect()\n\n\t\t\tconst { adapter: a3, repo: r3 } = makeEnv()\n\t\t\tawait a3.connect()\n\t\t\tconst recorded = await a3.loadMigrations()\n\t\t\texpect(recorded).toHaveLength(0)\n\t\t\tconst schemas = await a3.introspect()\n\t\t\tconst users = schemas.find((s) => s.name === 'users')!\n\t\t\texpect(users.indexes).toEqual([])\n\t\t\tconst row = await r3.on(UserSchema).one().id('partial').find()\n\t\t\texpect(row).toBeNull()\n\t\t\tawait a3.disconnect()\n\t\t})\n\n\t\ttest('introspect() round-trip: apply* then introspect returns matching descriptors', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\n\t\t\tawait adapter.applyCreateTable({\n\t\t\t\tkind: 'createTable',\n\t\t\t\tname: 'users',\n\t\t\t\tpk: { name: 'id', type: 'string' },\n\t\t\t\tfields: [\n\t\t\t\t\t{ name: 'email', type: 'string', unique: true },\n\t\t\t\t\t{ name: 'age', type: 'number', nullable: true },\n\t\t\t\t],\n\t\t\t})\n\t\t\tawait adapter.applyAddIndex({ kind: 'addIndex', table: 'users', on: ['email'], unique: true })\n\t\t\tawait adapter.applyCreateTable({\n\t\t\t\tkind: 'createTable',\n\t\t\t\tname: 'posts',\n\t\t\t\tpk: { name: 'id', type: 'string' },\n\t\t\t\tfields: [{ name: 'authorId', type: 'string' }],\n\t\t\t})\n\t\t\tawait adapter.applyAddForeignKey({\n\t\t\t\tkind: 'addForeignKey',\n\t\t\t\ttable: 'posts',\n\t\t\t\ton: 'authorId',\n\t\t\t\treferences: { table: 'users', column: 'id' },\n\t\t\t\tonDelete: 'cascade',\n\t\t\t})\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\tconst schemas = await a2.introspect()\n\n\t\t\tconst users = schemas.find((s) => s.name === 'users')!\n\t\t\texpect(users.pk).toEqual({ name: 'id', type: 'string' })\n\t\t\texpect(users.fields).toEqual([\n\t\t\t\t{ name: 'email', type: 'string', nullable: false, unique: true },\n\t\t\t\t{ name: 'age', type: 'number', nullable: true },\n\t\t\t])\n\t\t\texpect(users.indexes).toEqual([{ name: 'users_email_idx', on: ['email'], unique: true }])\n\n\t\t\tconst posts = schemas.find((s) => s.name === 'posts')!\n\t\t\texpect(posts.pk).toEqual({ name: 'id', type: 'string' })\n\t\t\texpect(posts.fields).toEqual([{ name: 'authorId', type: 'string', nullable: false }])\n\t\t\texpect(posts.foreignKeys).toEqual([{\n\t\t\t\tname: 'posts_authorId_fk',\n\t\t\t\ton: 'authorId',\n\t\t\t\treferences: { table: 'users', column: 'id' },\n\t\t\t\tonDelete: 'cascade',\n\t\t\t}])\n\n\t\t\tawait a2.disconnect()\n\t\t})\n\n\t\ttest('metadata keys do not leak into data stores', async () => {\n\t\t\tconst adapter = JsonAdapter.create({ filePath })\n\t\t\tawait adapter.connect()\n\t\t\tawait adapter.recordMigration('m-001', 1000)\n\t\t\tawait adapter.applyCreateTable({ kind: 'createTable', name: 'users', pk: { name: 'id', type: 'string' }, fields: [] })\n\n\t\t\texpect(adapter.stores.has('__migrations')).toBe(false)\n\t\t\texpect(adapter.stores.has('__tables')).toBe(false)\n\t\t\tawait adapter.disconnect()\n\n\t\t\tconst a2 = JsonAdapter.create({ filePath })\n\t\t\tawait a2.connect()\n\t\t\texpect(a2.stores.has('__migrations')).toBe(false)\n\t\t\texpect(a2.stores.has('__tables')).toBe(false)\n\t\t\tawait a2.disconnect()\n\t\t})\n\t})\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,MAAM,UAAU,QAAQ,QAAQ,iBAAiB;AAE1D,SAAS,SAAS;AAclB,IAAM,qBAAqB,MAC1B,EAAE,OAAO;AAAA,EACR,UAAU,EAAE,OAAO;AACpB,CAAC;AAEK,IAAM,cAAN,cAA0B,aAAa,oBAAoB,UAAU,EAAE;AAAA,EACpE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAAA,EAEjD,YAAY,gBAAgB,OAAO,CAAC,CAAC;AAAA,EAErC,sBAAsB,KAAK,UAAU;AAAA,EACrC,eAAe,KAAK,UAAU;AAAA,EAC9B,YAAY,KAAK,UAAU;AAAA,EAC3B,eAAe,KAAK,UAAU;AAAA,EAEvC,cAA6B,QAAQ,QAAQ;AAAA,EAEnC,YAAY,QAAmC;AACxD,UAAM,MAAM;AAAA,EACb;AAAA,EAEA,IAAI,SAAS;AACZ,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,aAAqB;AACpB,UAAM,MAA+B,CAAC;AAEtC,UAAM,aAAa,CAAC,GAAG,KAAK,UAAU,WAAW,OAAO,CAAC;AACzD,QAAI,WAAW,SAAS,EAAG,KAAI,cAAc,IAAI;AAEjD,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,UAAU,OAAO,QAAQ,GAAG;AAC3D,aAAO,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,QAAQ,OAAO,YAAY,KAAK,OAAO,QAAQ,CAAC,EAAE;AAAA,IACjF;AACA,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,EAAG,KAAI,UAAU,IAAI;AAEtD,UAAM,UAAmC,CAAC;AAC1C,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,UAAU,QAAQ,QAAQ,GAAG;AAC5D,cAAQ,IAAI,IAAI,EAAE,OAAO,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,QAAQ,KAAK,OAAO;AAAA,IAC5E;AACA,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,KAAI,WAAW,IAAI;AAExD,UAAM,cAAuC,CAAC;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,UAAU,YAAY,QAAQ,GAAG;AAChE,kBAAY,IAAI,IAAI;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,IAAI,KAAK;AAAA,QACT,YAAY,KAAK;AAAA,QACjB,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACnD,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,MACpD;AAAA,IACD;AACA,QAAI,OAAO,KAAK,WAAW,EAAE,SAAS,EAAG,KAAI,eAAe,IAAI;AAEhE,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAClD,YAAM,UAAmD,CAAC;AAC1D,iBAAW,CAAC,IAAI,GAAG,KAAK,MAAM,QAAQ,GAAG;AACxC,gBAAQ,EAAE,IAAI;AAAA,MACf;AACA,UAAI,IAAI,IAAI;AAAA,IACb;AAEA,WAAO,KAAK,UAAU,GAAG;AAAA,EAC1B;AAAA,EAEA,MAAM,eAA8B;AACnC,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,UAAU,KAAK,OAAO,WAAW,UAAU,QAAQ,MAAM,MAAM,KAAK,IAAI;AAC9E,UAAM,UAAU,SAAS,MAAM,OAAO;AACtC,UAAM,OAAO,SAAS,KAAK,OAAO,QAAQ;AAAA,EAC3C;AAAA,EAEA,iBAAgC;AAC/B,UAAM,OAAO,KAAK,YAAY,KAAK,MAAM,KAAK,aAAa,CAAC;AAC5D,SAAK,cAAc,KAAK,MAAM,MAAM;AAAA,IAAC,CAAC;AACtC,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,UAAyB;AAC9B,QAAI;AACJ,QAAI;AACH,YAAM,MAAM,SAAS,KAAK,OAAO,UAAU,OAAO;AAAA,IACnD,QAAQ;AACP;AAAA,IACD;AACA,UAAM,OAAO,KAAK,MAAM,GAAG;AAE3B,SAAK,UAAU,WAAW,MAAM;AAChC,QAAI,MAAM,QAAQ,KAAK,cAAc,CAAC,GAAG;AACxC,iBAAW,KAAK,KAAK,cAAc,GAA+C;AACjF,aAAK,UAAU,WAAW,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,UAAU,CAAC;AAAA,MACzE;AAAA,IACD;AAEA,SAAK,UAAU,OAAO,MAAM;AAC5B,QAAI,KAAK,UAAU,KAAK,OAAO,KAAK,UAAU,MAAM,UAAU;AAC7D,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,UAAU,CAAwB,GAAG;AACnF,cAAM,SAAS,oBAAI,IAA0B;AAC7C,YAAI,KAAK,QAAQ;AAChB,qBAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAsC,GAAG;AAC7F,mBAAO,IAAI,WAAW,KAAK;AAAA,UAC5B;AAAA,QACD;AACA,aAAK,UAAU,OAAO,IAAI,MAAM,EAAE,IAAI,KAAK,IAAI,OAAO,CAAC;AAAA,MACxD;AAAA,IACD;AAEA,SAAK,UAAU,QAAQ,MAAM;AAC7B,QAAI,KAAK,WAAW,KAAK,OAAO,KAAK,WAAW,MAAM,UAAU;AAC/D,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,WAAW,CAAwB,GAAG;AACpF,aAAK,UAAU,QAAQ,IAAI,MAAM,EAAE,OAAO,KAAK,OAAO,IAAI,KAAK,IAAI,QAAQ,KAAK,OAAO,CAAC;AAAA,MACzF;AAAA,IACD;AAEA,SAAK,UAAU,YAAY,MAAM;AACjC,QAAI,KAAK,eAAe,KAAK,OAAO,KAAK,eAAe,MAAM,UAAU;AACvE,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,eAAe,CAAwB,GAAG;AACxF,aAAK,UAAU,YAAY,IAAI,MAAM,IAAI;AAAA,MAC1C;AAAA,IACD;AAEA,SAAK,OAAO,MAAM;AAClB,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,IAAI,GAAG;AACnD,UAAI,KAAK,WAAW,IAAI,EAAG;AAC3B,YAAM,QAAQ,oBAAI,IAAqC;AACvD,iBAAW,CAAC,IAAI,GAAG,KAAK,OAAO,QAAQ,OAAkD,GAAG;AAC3F,cAAM,IAAI,IAAI,GAAG;AAAA,MAClB;AACA,WAAK,OAAO,IAAI,MAAM,KAAK;AAAA,IAC5B;AAAA,EACD;AAAA,EAEA,MAAM,aAA4B;AACjC,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,SAAS,QAAmB,QAAiB,IAAa;AAC/D,WAAO,KAAK,UAAU,SAAS,QAAQ,QAAQ,EAAE;AAAA,EAClD;AAAA,EAEA,MAAM,WAAW,QAAmB,QAAiB,MAAiC;AACrF,UAAM,SAAS,MAAM,KAAK,UAAU,WAAW,QAAQ,QAAQ,IAAI;AACnE,UAAM,KAAK,eAAe;AAC1B,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,WAAW,QAAmB,QAAiB,IAAa,KAAoB;AACrF,UAAM,SAAS,MAAM,KAAK,UAAU,WAAW,QAAQ,QAAQ,IAAI,GAAG;AACtE,QAAI,OAAQ,OAAM,KAAK,eAAe;AACtC,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,WAAW,QAAmB,QAAiB,IAAa;AACjE,UAAM,SAAS,MAAM,KAAK,UAAU,WAAW,QAAQ,QAAQ,EAAE;AACjE,QAAI,OAAQ,OAAM,KAAK,eAAe;AACtC,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,SAAS,QAAmB,QAAiB,OAAoB,SAAwB;AAC9F,WAAO,KAAK,UAAU,SAAS,QAAQ,QAAQ,OAAO,OAAO;AAAA,EAC9D;AAAA,EAEA,MAAM,MAAM,QAAmB,QAAiB,OAAoB;AACnE,WAAO,KAAK,UAAU,MAAM,QAAQ,QAAQ,KAAK;AAAA,EAClD;AAAA,EAEA,YAAY,QAAmB,QAAiB,OAAoB,SAAiC;AACpG,WAAO,KAAK,UAAU,YAAY,QAAQ,QAAQ,OAAO,OAAO;AAAA,EACjE;AAAA,EAEA,MAAM,WAAW,QAAmB,QAAiB,OAAoB,MAA+B;AACvG,UAAM,SAAS,MAAM,KAAK,UAAU,WAAW,QAAQ,QAAQ,OAAO,IAAI;AAC1E,QAAI,OAAO,OAAQ,OAAM,KAAK,eAAe;AAC7C,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,WAAW,QAAmB,QAAiB,QAAqB;AACzE,UAAM,SAAS,MAAM,KAAK,UAAU,WAAW,QAAQ,QAAQ,MAAM;AACrE,QAAI,OAAO,OAAQ,OAAM,KAAK,eAAe;AAC7C,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,UAAU,QAAmB,QAAiB,QAAqB,QAAiC,KAAoB;AAC7H,UAAM,SAAS,MAAM,KAAK,UAAU,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,GAAG;AACjF,UAAM,KAAK,eAAe;AAC1B,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,UAAU,QAAmB,QAAiB,MAAqB;AACxE,WAAO,KAAK,UAAU,UAAU,QAAQ,QAAQ,IAAI;AAAA,EACrD;AAAA,EAEA,MAAM,QAAW,IAAkC;AAClD,WAAO,KAAK,UAAU,QAAQ,YAAY;AACzC,YAAM,SAAS,MAAM,GAAG;AACxB,YAAM,KAAK,eAAe;AAC1B,aAAO;AAAA,IACR,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,iBAA+D;AACpE,UAAM,KAAK,QAAQ;AACnB,WAAO,KAAK,UAAU,eAAe;AAAA,EACtC;AAAA,EAEA,MAAM,gBAAgB,IAAY,WAAkC;AACnE,UAAM,KAAK,UAAU,gBAAgB,IAAI,SAAS;AAClD,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,qBAAwB,IAAkC;AAC/D,UAAM,WAAW,KAAK,OAAO,WAAW;AACxC,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,MAAM;AACZ,UAAI;AACH,cAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AACxC,cAAM,OAAO,MAAM;AACnB;AAAA,MACD,SAAS,KAAU;AAClB,YAAI,IAAI,SAAS,SAAU,OAAM;AACjC,YAAI,KAAK,IAAI,IAAI,SAAU,OAAM,IAAI,MAAM,sCAAsC;AACjF,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAAA,MAC3C;AAAA,IACD;AACA,QAAI;AACH,aAAO,MAAM,GAAG;AAAA,IACjB,UAAE;AACD,YAAM,OAAO,QAAQ,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACtC;AAAA,EACD;AAAA,EAEA,MAAM,iBAAiB,QAA+C;AACrE,UAAM,KAAK,UAAU,iBAAiB,MAAM;AAC5C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,QAAwC;AAC5D,UAAM,KAAK,UAAU,eAAe,MAAM;AAC1C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAc,QAA4C;AAC/D,UAAM,KAAK,UAAU,cAAc,MAAM;AACzC,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,QAAwC;AAC5D,UAAM,KAAK,UAAU,eAAe,MAAM;AAC1C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,iBAAiB,QAA+C;AACrE,UAAM,KAAK,UAAU,iBAAiB,MAAM;AAC5C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,iBAAiB,QAA0C;AAChE,UAAM,KAAK,UAAU,iBAAiB,MAAM;AAC5C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,iBAAiB,QAA0C;AAChE,UAAM,KAAK,UAAU,iBAAiB,MAAM;AAC5C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAc,QAAuC;AAC1D,UAAM,KAAK,UAAU,cAAc,MAAM;AACzC,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,QAAwC;AAC5D,UAAM,KAAK,UAAU,eAAe,MAAM;AAC1C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,mBAAmB,QAA4C;AACpE,UAAM,KAAK,UAAU,mBAAmB,MAAM;AAC9C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,oBAAoB,QAA6C;AACtE,UAAM,KAAK,UAAU,oBAAoB,MAAM;AAC/C,UAAM,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,aAA0C;AAC/C,WAAO,KAAK,UAAU,WAAW;AAAA,EAClC;AACD;AAEA,IAAI,QAAoB;AACvB,QAAM,EAAE,UAAU,MAAM,QAAQ,YAAY,UAAU,IAAI;AAC1D,QAAM,EAAE,YAAY,IAAI,MAAa;AACrC,QAAM,EAAE,QAAQ,IAAI,MAAa;AACjC,QAAM,EAAE,OAAO,IAAI,MAAa;AAChC,QAAM,EAAE,OAAO,SAAS,QAAQ,OAAO,IAAI,MAAa;AACxD,QAAM,EAAE,GAAAA,GAAE,IAAI,MAAa;AAC3B,QAAM,EAAE,SAAS,GAAG,IAAI,MAAa;AACrC,QAAM,EAAE,OAAO,IAAI,MAAa;AAChC,QAAM,EAAE,KAAK,IAAI,MAAa;AAC9B,QAAM,EAAE,SAAS,IAAI,MAAa;AAClC,QAAM,EAAE,KAAK,IAAI,MAAa;AAC9B,QAAM,EAAE,kBAAkB,IAAI,MAAa;AAG3C,MAAI;AACJ,MAAI;AAEJ,aAAW,YAAY;AACtB,aAAS,MAAM,QAAQ,KAAK,OAAO,GAAG,eAAe,CAAC;AACtD,eAAW,KAAK,QAAQ,WAAW;AAAA,EACpC,CAAC;AAED,YAAU,YAAY;AACrB,UAAM,GAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAClD,CAAC;AAED,WAAS,0CAAqC,MAAM;AACnD,SAAK,+DAA+D,MAAM;AACzE,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,aAAO,OAAO,EAAE,eAAe,WAAW;AAC1C,aAAO,QAAQ,gBAAgB,EAAE,YAAY;AAC7C,aAAO,QAAQ,mBAAmB,EAAE,QAAQ,CAAC,UAAU,UAAU,WAAW,QAAQ,UAAU,SAAS,MAAM,CAAC;AAAA,IAC/G,CAAC;AAED,SAAK,wEAAwE,YAAY;AACxF,YAAM,EAAE,UAAU,KAAK,IAAI,MAAa;AACxC,YAAM,SAAS,MAAa,MAAW,GAAG,MAAM,MAAM,IAAI,EAAE,mBAAmB,MAAM;AAAA,MAAC,CAAC;AAEvF,kBAAY,OAAO,EAAE,SAAS,CAAC;AAE/B,aAAO,KAAK,EAAE,qBAAqB,SAAS,OAAO,IAAI,QAAQ,GAAG,OAAO,iBAAiB,EAAE,OAAO,YAAY,CAAC,CAAC;AACjH,aAAO,KAAK,EAAE,qBAAqB,SAAS,OAAO,IAAI,QAAQ,GAAG,OAAO,iBAAiB,EAAE,OAAO,YAAY,CAAC,CAAC;AAEjH,YAAM,YAAY;AAAA,IACnB,CAAC;AAAA,EACF,CAAC;AAED,WAAS,qDAAgD,MAAM;AAC9D,SAAK,iDAAiD,YAAY;AACjE,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,QAAQA,GAAE,OAAO,CAAC,EACxB,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AAEtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAElD,YAAM,UAAU,MAAM,IAAI,WAAW;AAAA,QACpC,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG;AAAA,QACnC,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG;AAAA,MAClC,CAAC;AACD,aAAO,OAAO,EAAE,aAAa,CAAC;AAE9B,YAAM,QAAQ,MAAM,IAAI,QAAQ,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC;AACnE,aAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG,CAAC;AAE1D,YAAM,OAAO,MAAM,IAAI,SAAS,YAAY,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG;AAAA,QACnE,SAAS,CAAC,IAAI,QAAQ,OAAO,KAAK,CAAC;AAAA,MACpC,CAAC;AACD,aAAO,IAAI,EAAE,QAAQ;AAAA,QACpB,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG;AAAA,QACjC,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG;AAAA,MACpC,CAAC;AAED,YAAM,IAAI,UAAU,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC;AACpE,YAAM,UAAU,MAAM,IAAI,QAAQ,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC;AACrE,aAAO,SAAS,GAAG,EAAE,KAAK,EAAE;AAE5B,YAAM,UAAU,MAAM,IAAI,UAAU,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC;AACvE,aAAO,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG,CAAC;AAE1D,YAAM,YAAY,MAAM,IAAI,SAAS,YAAY,OAAO,CAAC;AACzD,aAAO,SAAS,EAAE,aAAa,CAAC;AAEhC,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,+DAA+D,YAAY;AAC/E,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,QAAQA,GAAE,OAAO,CAAC,EACxB,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAElD,YAAM,IAAI,WAAW;AAAA,QACpB,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG;AAAA,QACnC,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG;AAAA,QACjC,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG;AAAA,MACpC,CAAC;AAED,YAAM,aAAa,YAAY,OAAO,EAAE,IAAI;AAAA,QAC3C,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE;AAAA,QACrB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,QAAQ,OAAO,GAAG,CAAC,MAAM,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;AAAA,MACzE,CAAC;AACD,YAAM,UAAU,EAAE,SAAS,CAAC,IAAI,QAAQ,OAAO,MAAM,CAAC,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC,MAAM,MAAM,EAAW;AAC9G,YAAM,OAAO,MAAM,IAAI,SAAS,YAAY,OAAO;AACnD,aAAO,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,MAAM,MAAM,QAAQ,CAAC,CAAC;AAElD,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,qFAAqF,YAAY;AACrG,YAAM,SAAS,OAAO,KAAK,aAAa,EACtC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,QAAQA,GAAE,OAAO,CAAC,EACxB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,cAAc,CAAC;AACxD,YAAM,IAAI,WAAW;AAAA,QACpB,EAAE,IAAI,MAAM,MAAM,QAAQ;AAAA,QAC1B,EAAE,IAAI,MAAM,MAAM,MAAM;AAAA,QACxB,EAAE,IAAI,MAAM,MAAM,QAAQ;AAAA,MAC3B,CAAC;AAED,YAAM,OAAO,IAAI,MAAM,YAAY,OAAO,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC,EAAE,SAAS,KAAK,CAAC;AACjF,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,4EAA4E,YAAY;AAC5F,YAAM,SAAS,OAAO,KAAK,iBAAiB,EAC1C,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,QAAQA,GAAE,OAAO,CAAC,EACxB,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,kBAAkB,CAAC;AAC5D,YAAM,IAAI,WAAW;AAAA,QACpB,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG;AAAA,QACnC,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG;AAAA,QACjC,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK,GAAG;AAAA,QACnC,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG;AAAA,MAClC,CAAC;AAED,YAAM,SAAS,YAAY,OAAO,EAAE,GAAG,OAAO,EAAE;AAChD,YAAM,UAAU;AAAA,QACf,SAAS,CAAC,IAAI,QAAQ,OAAO,MAAM,CAAC;AAAA,QACpC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ,CAAC,MAAM,MAAM;AAAA,MACtB;AACA,YAAM,WAAW,MAAM,IAAI,SAAS,QAAQ,OAAO;AACnD,YAAM,OAAkC,CAAC;AACzC,uBAAiB,OAAO,IAAI,YAAY,QAAQ,EAAE,GAAG,SAAS,WAAW,EAAE,CAAC,GAAG;AAC9E,aAAK,KAAK,GAAG;AAAA,MACd;AACA,aAAO,IAAI,EAAE,QAAQ,QAAQ;AAC7B,aAAO,IAAI,EAAE,QAAQ;AAAA,QACpB,EAAE,IAAI,MAAM,MAAM,QAAQ;AAAA,QAC1B,EAAE,IAAI,MAAM,MAAM,QAAQ;AAAA,MAC3B,CAAC;AAED,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,4DAA4D,YAAY;AAC5E,YAAM,SAAS,OAAO,KAAK,MAAM,EAC/B,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,IAAI,EAC/B,MAAM,SAASA,GAAE,OAAO,CAAC,EACzB,MAAM,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,EACjC,MAAM,QAAQA,GAAE,OAAO,EAAE,GAAGA,GAAE,OAAO,EAAE,CAAC,CAAC,EACzC,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,OAAO,CAAC;AAEjD,YAAM,IAAI,UAAU,EAAE,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;AAEvE,YAAM,QAAQ,QAAQ,YAAY;AACjC,cAAM,IAAI,UAAU,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,GAAG;AAAA,UACxD,OAAO,IAAI,MAAM,SAAS,CAAC;AAAA,UAC3B,MAAM,IAAI,OAAO,QAAQ,GAAG;AAAA,UAC5B,MAAM,IAAI,QAAQ,QAAQ,EAAE,GAAG,EAAE,CAAC;AAAA,QACnC,CAAC;AAAA,MACF,CAAC;AAED,YAAM;AAAA,QACL,QAAQ,QAAQ,YAAY;AAC3B,gBAAM,IAAI,UAAU,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,MAAM,IAAI,OAAO,QAAQ,GAAG,EAAE,CAAC;AAC1F,gBAAM,IAAI,MAAM,MAAM;AAAA,QACvB,CAAC;AAAA,MACF,EAAE,QAAQ,QAAQ,MAAM;AAExB,YAAM,MAAM,MAAM,IAAI,QAAQ,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC;AACjE,aAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;AAE5E,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,4DAA4D,YAAY;AAC5E,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAElD,YAAM,WAAW,MAAM,IAAI,UAAU,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC;AACnG,aAAO,QAAQ,EAAE,QAAQ,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC;AAE9C,YAAM,UAAU,MAAM,IAAI,UAAU,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AACrH,aAAO,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC;AAE7C,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAAA,EACF,CAAC;AAED,WAAS,mCAA8B,MAAM;AAC5C,SAAK,0CAA0C,YAAY;AAC1D,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,QAAQA,GAAE,OAAO,CAAC,EACxB,MAAM;AAER,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAC9C,YAAM,KAAK,WAAW;AAAA,QACrB,EAAE,IAAI,MAAM,MAAM,QAAQ;AAAA,QAC1B,EAAE,IAAI,MAAM,MAAM,MAAM;AAAA,MACzB,CAAC;AACD,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAC9C,YAAM,OAAO,MAAM,KAAK,SAAS,YAAY,OAAO,CAAC;AACrD,aAAO,IAAI,EAAE,aAAa,CAAC;AAC3B,aAAO,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,SAAS,KAAK,CAAC;AAC/D,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAED,SAAK,6DAA6D,YAAY;AAC7E,YAAM,SAAS,OAAO,KAAK,MAAM,EAC/B,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,OAAO,OAAO,CAAC;AAC7C,YAAM,KAAK,UAAU,EAAE,IAAI,MAAM,KAAK,EAAE,CAAC;AACzC,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,OAAO,OAAO,CAAC;AAC7C,YAAM;AAAA,QACL,GAAG,QAAQ,YAAY;AACtB,gBAAM,KAAK,UAAU,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AACtE,gBAAM,IAAI,MAAM,UAAU;AAAA,QAC3B,CAAC;AAAA,MACF,EAAE,QAAQ,QAAQ,UAAU;AAC5B,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,OAAO,OAAO,CAAC;AAC7C,YAAM,MAAM,MAAM,KAAK,QAAQ,YAAY,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC;AAClE,aAAO,KAAK,GAAG,EAAE,KAAK,CAAC;AACvB,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAAA,EACF,CAAC;AAED,WAAS,qCAAgC,MAAM;AAC9C,SAAK,wCAAwC,YAAY;AACxD,YAAM,EAAE,UAAU,GAAG,IAAI,MAAa;AACtC,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAElD,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC5B,cAAM,IAAI,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AAC3C,cAAM,MAAM,MAAM,GAAG,UAAU,OAAO;AACtC,eAAO,MAAM,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,QAAQ;AAAA,MAC3C;AACA,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,8CAA8C,YAAY;AAC9D,YAAM,EAAE,QAAQ,IAAI,MAAa;AACjC,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAElD,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,cAAM,IAAI,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AAAA,MAC5C;AACA,YAAM,QAAQ,WAAW;AAEzB,YAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,YAAM,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AACxD,aAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,IAChC,CAAC;AAAA,EACF,CAAC;AAED,WAAS,4CAAuC,MAAM;AACrD,UAAM,cAAc,OAAO,KAAK,QAAQ,EACtC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,UAAUA,GAAE,OAAO,CAAC,EAC1B,MAAM,UAAUA,GAAE,OAAO,CAAC,EAC1B,MAAM;AAER,UAAM,YAAY;AAAA,MACjB,EAAE,IAAI,MAAM,QAAQ,KAAK,QAAQ,KAAK;AAAA,MACtC,EAAE,IAAI,MAAM,QAAQ,KAAK,QAAQ,KAAK;AAAA,MACtC,EAAE,IAAI,MAAM,QAAQ,KAAK,QAAQ,KAAK;AAAA,IACvC;AAEA,mBAAe,oBAAoB;AAClC,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,aAAa,EAAE,OAAO,SAAS,CAAC;AACxD,YAAM,IAAI,WAAW,SAAS;AAC9B,aAAO;AAAA,IACR;AAEA,SAAK,0CAA0C,MAAM;AACpD,YAAM,OAAO,YAAY,OAAO,EAAE,SAAS,CAAC;AAC5C,YAAM,QAAQ,gBAAgB,OAAO,CAAC,CAAC;AACvC,aAAO,KAAK,YAAY,EAAE,QAAQ,MAAM,YAAY;AACpD,aAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,SAAS,iBAAiB,OAAO,OAAO,OAAO,KAAK,CAAC;AAAA,IACzF,CAAC;AAED,SAAK,+CAA+C,YAAY;AAC/D,YAAM,UAAU,MAAM,kBAAkB;AACxC,YAAM,SAAS,MAAM,QAAQ,UAAU,aAAa,EAAE,OAAO,SAAS,GAAG;AAAA,QACxE,YAAY,CAAC,EAAE,IAAI,SAAS,OAAO,QAAQ,CAAC;AAAA,QAC5C,SAAS,CAAC;AAAA,MACX,CAAC;AACD,aAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACrC,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,uDAAuD,YAAY;AACvE,YAAM,UAAU,MAAM,kBAAkB;AACxC,YAAM,SAAS,MAAM,QAAQ,UAAU,aAAa,EAAE,OAAO,SAAS,GAAG;AAAA,QACxE,YAAY,CAAC,EAAE,IAAI,iBAAiB,OAAO,UAAU,OAAO,gBAAgB,CAAC;AAAA,QAC7E,SAAS,CAAC;AAAA,MACX,CAAC;AACD,aAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;AAC7C,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,4DAA4D,YAAY;AAC5E,YAAM,UAAU,MAAM,kBAAkB;AACxC,YAAM,SAAS,MAAM,QAAQ,UAAU,aAAa,EAAE,OAAO,SAAS,GAAG;AAAA,QACxE,YAAY;AAAA,UACX,EAAE,IAAI,OAAO,OAAO,UAAU,OAAO,cAAc;AAAA,UACnD,EAAE,IAAI,OAAO,OAAO,UAAU,OAAO,YAAY;AAAA,UACjD,EAAE,IAAI,OAAO,OAAO,UAAU,OAAO,YAAY;AAAA,UACjD,EAAE,IAAI,OAAO,OAAO,UAAU,OAAO,YAAY;AAAA,QAClD;AAAA,QACA,SAAS,CAAC;AAAA,MACX,CAAC;AACD,aAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,WAAW,KAAK,WAAW,KAAK,WAAW,IAAI,CAAC,CAAC;AAC7F,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,kDAAkD,YAAY;AAClE,YAAM,UAAU,MAAM,kBAAkB;AACxC,YAAM,SAAS,MAAM,QAAQ,UAAU,aAAa,EAAE,OAAO,SAAS,GAAG;AAAA,QACxE,YAAY;AAAA,UACX,EAAE,IAAI,SAAS,OAAO,MAAM;AAAA,UAC5B,EAAE,IAAI,OAAO,OAAO,UAAU,OAAO,QAAQ;AAAA,QAC9C;AAAA,QACA,SAAS,CAAC,QAAQ;AAAA,MACnB,CAAC;AACD,YAAM,SAAS,OAAO,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,MAAM,EAAE,cAAc,OAAO,EAAE,MAAM,CAAC,CAAC;AACrF,aAAO,MAAM,EAAE,QAAQ;AAAA,QACtB,EAAE,QAAQ,MAAM,KAAK,GAAG,OAAO,IAAI;AAAA,QACnC,EAAE,QAAQ,MAAM,KAAK,GAAG,OAAO,IAAI;AAAA,MACpC,CAAC;AACD,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,2DAA2D,YAAY;AAC3E,YAAM,UAAU,MAAM,kBAAkB;AACxC,YAAM,SAAS,MAAM,QAAQ,UAAU,aAAa,EAAE,OAAO,SAAS,GAAG;AAAA,QACxE,OAAO,YAAY,OAAO,EAAE,GAAG,UAAU,GAAG;AAAA,QAC5C,YAAY,CAAC,EAAE,IAAI,SAAS,OAAO,MAAM,CAAC;AAAA,QAC1C,SAAS,CAAC;AAAA,MACX,CAAC;AACD,aAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACnC,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,6DAA6D,YAAY;AAC7E,YAAM,UAAU,MAAM,kBAAkB;AACxC,YAAM,SAAS,MAAM,QAAQ,UAAU,aAAa,EAAE,OAAO,SAAS,GAAG;AAAA,QACxE,YAAY,CAAC,EAAE,IAAI,SAAS,OAAO,MAAM,CAAC;AAAA,QAC1C,SAAS,CAAC,QAAQ;AAAA,QAClB,QAAQ,YAAY,OAAO,EAAE,GAAG,OAAO,CAAC;AAAA,MACzC,CAAC;AACD,aAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,MAAM,KAAK,EAAE,CAAC,CAAC;AACjD,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,+DAA+D,YAAY;AAC/E,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAElD,YAAM,IAAI,WAAW;AAAA,QACpB,EAAE,IAAI,MAAM,KAAK,GAAG;AAAA,QACpB,EAAE,IAAI,MAAM,KAAK,GAAG;AAAA,MACrB,CAAC;AAED,YAAM,OAAsB;AAAA,QAC3B,YAAY,CAAC,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,QAAQ,CAAC;AAAA,QACxD,SAAS,CAAC;AAAA,MACX;AACA,YAAM,SAAS,MAAM,QAAQ,UAAU,QAAQ,EAAE,OAAO,QAAQ,GAAG,IAAI;AACvE,aAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;AAEtC,YAAM,IAAI,UAAU,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC;AACzC,YAAM,UAAU,MAAM,QAAQ,UAAU,QAAQ,EAAE,OAAO,QAAQ,GAAG,IAAI;AACxE,aAAO,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;AAEvC,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAAA,EACF,CAAC;AAED,WAAS,mDAA8C,MAAM;AAC5D,SAAK,iDAAiD,YAAY;AACjE,YAAM,SAAS,OAAO,KAAK,OAAO,EAChC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,GAAG,EAC9B,MAAM,OAAOA,GAAE,OAAO,CAAC,EACvB,MAAM;AAER,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAElD,YAAM,QAAQ,IAAI,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,IAAI,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;AAE9F,YAAM,OAAO,MAAM,IAAI,SAAS,YAAY,OAAO,CAAC;AACpD,aAAO,IAAI,EAAE,aAAa,EAAE;AAC5B,YAAM,QAAQ,WAAW;AAEzB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,OAAO,GAAG,IAAI,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAC9C,YAAM,WAAW,MAAM,KAAK,SAAS,YAAY,OAAO,CAAC;AACzD,aAAO,QAAQ,EAAE,aAAa,EAAE;AAChC,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAAA,EACF,CAAC;AAED,WAAS,yCAAoC,MAAM;AAClD,SAAK,+CAA+C,YAAY;AAC/D,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AAEtB,YAAM,QAAQ,gBAAgB,SAAS,GAAI;AAC3C,YAAM,QAAQ,gBAAgB,SAAS,GAAI;AAE3C,YAAM,SAAS,MAAM,QAAQ,eAAe;AAC5C,aAAO,MAAM,EAAE,aAAa,CAAC;AAC7B,aAAO,MAAM,EAAE,QAAQ;AAAA,QACtB,EAAE,IAAI,SAAS,WAAW,IAAK;AAAA,QAC/B,EAAE,IAAI,SAAS,WAAW,IAAK;AAAA,MAChC,CAAC;AACD,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,sDAAsD,YAAY;AACtE,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,GAAG,gBAAgB,SAAS,GAAI;AACtC,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,SAAS,MAAM,GAAG,eAAe;AACvC,aAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,SAAS,WAAW,IAAK,CAAC,CAAC;AACzD,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAED,SAAK,qDAAqD,YAAY;AACrE,YAAM,EAAE,UAAU,GAAG,IAAI,MAAa;AACtC,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,QAAQ,gBAAgB,SAAS,GAAI;AAC3C,YAAM,QAAQ,WAAW;AAEzB,YAAM,MAAM,KAAK,MAAM,MAAM,GAAG,UAAU,OAAO,CAAC;AAClD,aAAO,IAAI,cAAc,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,SAAS,WAAW,IAAK,CAAC,CAAC;AAAA,IACvE,CAAC;AAAA,EACF,CAAC;AAED,WAAS,sCAAiC,MAAM;AAC/C,SAAK,4CAA4C,YAAY;AAC5D,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,QAAQ,iBAAiB;AAAA,QAC9B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,QACjC,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,QAAQ,KAAK,CAAC;AAAA,MACzD,CAAC;AACD,YAAM,QAAQ,WAAW;AAEzB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,UAAU,MAAM,GAAG,WAAW;AACpC,aAAO,OAAO,EAAE,aAAa,CAAC;AAC9B,aAAO,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,OAAO;AACpC,aAAO,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,MAAM,MAAM,SAAS,CAAC;AAC5D,aAAO,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,UAAU,OAAO,QAAQ,KAAK,CAAC,CAAC;AACpG,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAED,SAAK,4DAA4D,YAAY;AAC5E,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,GAAG,iBAAiB,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;AAChH,YAAM,GAAG,cAAc,EAAE,MAAM,YAAY,OAAO,SAAS,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK,CAAC;AACxF,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,UAAU,MAAM,GAAG,WAAW;AACpC,aAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,mBAAmB,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC;AAC7F,YAAM,GAAG,eAAe,EAAE,MAAM,aAAa,MAAM,kBAAkB,CAAC;AACtE,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,WAAW,MAAM,GAAG,WAAW;AACrC,aAAO,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACtC,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAED,SAAK,sEAAsE,YAAY;AACtF,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,GAAG,iBAAiB,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;AAChH,YAAM,GAAG,iBAAiB,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;AAChH,YAAM,GAAG,mBAAmB,EAAE,MAAM,iBAAiB,OAAO,SAAS,IAAI,YAAY,YAAY,EAAE,OAAO,SAAS,QAAQ,KAAK,GAAG,UAAU,UAAU,CAAC;AACxJ,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,UAAU,MAAM,GAAG,WAAW;AACpC,YAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACpD,aAAO,MAAM,WAAW,EAAE,QAAQ,CAAC;AAAA,QAClC,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,YAAY,EAAE,OAAO,SAAS,QAAQ,KAAK;AAAA,QAC3C,UAAU;AAAA,MACX,CAAC,CAAC;AACF,YAAM,GAAG,oBAAoB,EAAE,MAAM,kBAAkB,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAClG,YAAM,GAAG,WAAW;AAEpB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,WAAW,MAAM,GAAG,WAAW;AACrC,YAAM,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACtD,aAAO,OAAO,WAAW,EAAE,QAAQ,CAAC,CAAC;AACrC,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAAA,EACF,CAAC;AAED,WAAS,4CAAuC,MAAM;AACrD,SAAK,yCAAyC,YAAY;AACzD,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AAEtB,YAAM,QAAkB,CAAC;AACzB,UAAI;AACJ,YAAM,OAAO,IAAI,QAAc,CAAC,MAAM;AAAE,sBAAc;AAAA,MAAE,CAAC;AAEzD,YAAM,KAAK,QAAQ,qBAAqB,YAAY;AACnD,cAAM,KAAK,UAAU;AACrB,cAAM;AACN,cAAM,KAAK,QAAQ;AAAA,MACpB,CAAC;AACD,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,YAAM,KAAK,QAAQ,qBAAqB,YAAY;AACnD,cAAM,KAAK,IAAI;AAAA,MAChB,CAAC;AAED,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,aAAO,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;AAElC,kBAAY;AACZ,YAAM,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1B,aAAO,KAAK,EAAE,QAAQ,CAAC,YAAY,UAAU,IAAI,CAAC;AAElD,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,sDAAsD,YAAY;AACtE,YAAM,EAAE,OAAO,IAAI,MAAa;AAChC,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AAEtB,YAAM,QAAQ,qBAAqB,YAAY;AAAA,MAAc,CAAC;AAE9D,YAAM,OAAO,OAAO,WAAW,OAAO,CAAC,EAAE,QAAQ,QAAQ;AACzD,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAED,SAAK,kDAAkD,YAAY;AAClE,YAAM,EAAE,OAAO,IAAI,MAAa;AAChC,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AAEtB,YAAM;AAAA,QACL,QAAQ,qBAAqB,YAAY;AAAE,gBAAM,IAAI,MAAM,MAAM;AAAA,QAAE,CAAC;AAAA,MACrE,EAAE,QAAQ,QAAQ,MAAM;AAExB,YAAM,OAAO,OAAO,WAAW,OAAO,CAAC,EAAE,QAAQ,QAAQ;AACzD,YAAM,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAAA,EACF,CAAC;AAED,WAAS,0DAAqD,MAAM;AACnE,UAAM,aAAa,OAAO,KAAK,OAAO,EACpC,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,EACrE,MAAM,SAASA,GAAE,OAAO,CAAC,EACzB,MAAM;AAER,aAAS,UAAU;AAClB,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,OAAO,IAAI,KAAK,EAAE,SAAS,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC;AACtE,aAAO,EAAE,SAAS,KAAK;AAAA,IACxB;AAEA,SAAK,yEAAyE,YAAY;AACzF,YAAM,EAAE,SAAS,KAAK,IAAI,QAAQ;AAClC,YAAM,QAAQ,QAAQ;AAEtB,YAAM,aAA0C;AAAA,QAC/C;AAAA,UACC,IAAI;AAAA,UACJ,SAAS;AAAA,YACR,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,SAAS,CAAC,EAAE;AAAA,YACtH,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,SAAS,GAAG,EAAE,MAAM,YAAY,MAAM,SAAS,CAAC,EAAE;AAAA,YAC5J,EAAE,MAAM,YAAY,OAAO,SAAS,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK;AAAA,YAChE,EAAE,MAAM,iBAAiB,OAAO,SAAS,IAAI,YAAY,YAAY,EAAE,OAAO,SAAS,QAAQ,KAAK,EAAE;AAAA,UACvG;AAAA,QACD;AAAA,QACA;AAAA,UACC,IAAI;AAAA,UACJ,SAAS;AAAA,YACR,EAAE,MAAM,YAAY,OAAO,SAAS,OAAO,EAAE,MAAM,OAAO,MAAM,UAAU,UAAU,KAAK,EAAE;AAAA,YAC3F,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,SAAS,IAAI,EAAE,MAAM,SAAS,MAAM,UAAU,QAAQ,MAAM,UAAU,KAAK,EAAE;AAAA,YAC1H,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,SAAS,IAAI,WAAW;AAAA,YACrE,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,WAAW;AAAA,UACtD;AAAA,QACD;AAAA,QACA;AAAA,UACC,IAAI;AAAA,UACJ,SAAS;AAAA,YACR,EAAE,MAAM,aAAa,OAAO,SAAS,MAAM,MAAM;AAAA,YACjD,EAAE,MAAM,kBAAkB,OAAO,SAAS,MAAM,oBAAoB;AAAA,YACpE,EAAE,MAAM,aAAa,MAAM,kBAAkB;AAAA,YAC7C,EAAE,MAAM,aAAa,MAAM,WAAW;AAAA,UACvC;AAAA,QACD;AAAA,QACA;AAAA,UACC,IAAI;AAAA,UACJ,SAAS,CAAC;AAAA,YACT,MAAM;AAAA,YACN,IAAI,OAAO,MAAM;AAChB,oBAAM,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,UAAU,OAAO,mBAAmB,CAAC;AAAA,YAChF;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD;AAEA,YAAM,WAAW,SAAS,KAAK,MAAM,OAAO,EAAE,WAAW,UAAU,EAAE,MAAM;AAC3E,YAAM,SAAS,MAAM,SAAS,GAAG;AACjC,aAAO,OAAO,GAAG,EAAE,QAAQ,CAAC,eAAe,eAAe,gBAAgB,WAAW,CAAC;AAEtF,YAAM,WAAW,MAAM,QAAQ,eAAe;AAC9C,aAAO,QAAQ,EAAE,aAAa,CAAC;AAE/B,YAAM,MAAM,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,KAAK;AAC9D,aAAO,GAAG,EAAE,IAAI,SAAS;AACzB,aAAO,IAAK,KAAK,EAAE,KAAK,kBAAkB;AAG1C,YAAM,QAAQ,WAAW;AACzB,YAAM,EAAE,SAAS,IAAI,MAAM,GAAG,IAAI,QAAQ;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,YAAY,MAAM,GAAG,eAAe;AAC1C,aAAO,SAAS,EAAE,aAAa,CAAC;AAEhC,YAAM,OAAO,MAAM,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,KAAK;AAC7D,aAAO,KAAM,KAAK,EAAE,KAAK,kBAAkB;AAC3C,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAED,SAAK,sDAAsD,YAAY;AACtE,YAAM,QAAkB,CAAC;AACzB,UAAI;AACJ,YAAM,OAAO,IAAI,QAAc,CAAC,MAAM;AAAE,sBAAc;AAAA,MAAE,CAAC;AAEzD,YAAM,aAAuC;AAAA,QAC5C;AAAA,UACC,IAAI;AAAA,UACJ,SAAS,CAAC;AAAA,YACT,MAAM;AAAA,YACN,IAAI,YAAY;AACf,oBAAM,KAAK,YAAY;AACvB,oBAAM;AACN,oBAAM,KAAK,UAAU;AAAA,YACtB;AAAA,UACD,CAAC;AAAA,QACF;AAAA,QACA;AAAA,UACC,IAAI;AAAA,UACJ,SAAS,CAAC,EAAE,MAAM,WAAW,IAAI,YAAY;AAAE,kBAAM,KAAK,MAAM;AAAA,UAAE,EAAE,CAAC;AAAA,QACtE;AAAA,MACD;AAEA,YAAM,WAAW,YAAY,OAAO,EAAE,SAAS,CAAC;AAChD,YAAM,SAAS,QAAQ;AACvB,YAAM,QAAQ,IAAI,KAAK,EAAE,SAAS,UAAU,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC;AACjF,YAAM,YAAY,SAAS,KAAK,OAAO,QAAQ,EAAE,WAAW,UAAU,EAAE,MAAM;AAE9E,YAAM,WAAW,YAAY,OAAO,EAAE,SAAS,CAAC;AAChD,YAAM,SAAS,QAAQ;AACvB,YAAM,QAAQ,IAAI,KAAK,EAAE,SAAS,UAAU,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC;AACjF,YAAM,YAAY,SAAS,KAAK,OAAO,QAAQ,EAAE,WAAW,UAAU,EAAE,MAAM;AAE9E,YAAM,KAAK,UAAU,GAAG;AACxB,YAAM,KAAK,UAAU,GAAG;AAExB,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,aAAO,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC;AAEpC,kBAAY;AACZ,YAAM,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;AAE1B,aAAO,KAAK,EAAE,QAAQ,CAAC,cAAc,YAAY,MAAM,CAAC;AAExD,YAAM,SAAS,WAAW;AAC1B,YAAM,SAAS,WAAW;AAAA,IAC3B,CAAC;AAED,SAAK,qDAAqD,YAAY;AACrE,YAAM,EAAE,QAAQ,IAAI,QAAQ;AAC5B,YAAM,QAAQ,QAAQ;AAEtB,YAAM,QAAQ,iBAAiB,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;AACrH,YAAM,QAAQ,WAAW;AAEzB,YAAM,EAAE,SAAS,IAAI,MAAM,GAAG,IAAI,QAAQ;AAC1C,YAAM,GAAG,QAAQ;AAEjB,YAAM,IAA0B;AAAA,QAC/B,IAAI;AAAA,QACJ,SAAS;AAAA,UACR,EAAE,MAAM,YAAY,OAAO,SAAS,IAAI,CAAC,OAAO,EAAE;AAAA,UAClD;AAAA,YACC,MAAM;AAAA,YACN,IAAI,OAAO,MAAM;AAChB,oBAAM,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,WAAW,OAAO,gBAAgB,CAAC;AAC7E,oBAAM,IAAI,MAAM,oBAAoB;AAAA,YACrC;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA,YAAM,WAAW,SAAS,KAAK,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM;AAC7D,YAAM,OAAO,SAAS,GAAG,CAAC,EAAE,QAAQ,QAAQ,iBAAiB;AAC7D,YAAM,GAAG,WAAW;AAEpB,YAAM,EAAE,SAAS,IAAI,MAAM,GAAG,IAAI,QAAQ;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,WAAW,MAAM,GAAG,eAAe;AACzC,aAAO,QAAQ,EAAE,aAAa,CAAC;AAC/B,YAAM,UAAU,MAAM,GAAG,WAAW;AACpC,YAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACpD,aAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,CAAC;AAChC,YAAM,MAAM,MAAM,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,KAAK;AAC7D,aAAO,GAAG,EAAE,SAAS;AACrB,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAED,SAAK,gFAAgF,YAAY;AAChG,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AAEtB,YAAM,QAAQ,iBAAiB;AAAA,QAC9B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,QACjC,QAAQ;AAAA,UACP,EAAE,MAAM,SAAS,MAAM,UAAU,QAAQ,KAAK;AAAA,UAC9C,EAAE,MAAM,OAAO,MAAM,UAAU,UAAU,KAAK;AAAA,QAC/C;AAAA,MACD,CAAC;AACD,YAAM,QAAQ,cAAc,EAAE,MAAM,YAAY,OAAO,SAAS,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK,CAAC;AAC7F,YAAM,QAAQ,iBAAiB;AAAA,QAC9B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,QACjC,QAAQ,CAAC,EAAE,MAAM,YAAY,MAAM,SAAS,CAAC;AAAA,MAC9C,CAAC;AACD,YAAM,QAAQ,mBAAmB;AAAA,QAChC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,YAAY,EAAE,OAAO,SAAS,QAAQ,KAAK;AAAA,QAC3C,UAAU;AAAA,MACX,CAAC;AACD,YAAM,QAAQ,WAAW;AAEzB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,YAAM,UAAU,MAAM,GAAG,WAAW;AAEpC,YAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACpD,aAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,MAAM,MAAM,SAAS,CAAC;AACvD,aAAO,MAAM,MAAM,EAAE,QAAQ;AAAA,QAC5B,EAAE,MAAM,SAAS,MAAM,UAAU,UAAU,OAAO,QAAQ,KAAK;AAAA,QAC/D,EAAE,MAAM,OAAO,MAAM,UAAU,UAAU,KAAK;AAAA,MAC/C,CAAC;AACD,aAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,mBAAmB,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC;AAExF,YAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACpD,aAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,MAAM,MAAM,SAAS,CAAC;AACvD,aAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,YAAY,MAAM,UAAU,UAAU,MAAM,CAAC,CAAC;AACpF,aAAO,MAAM,WAAW,EAAE,QAAQ,CAAC;AAAA,QAClC,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,YAAY,EAAE,OAAO,SAAS,QAAQ,KAAK;AAAA,QAC3C,UAAU;AAAA,MACX,CAAC,CAAC;AAEF,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAED,SAAK,8CAA8C,YAAY;AAC9D,YAAM,UAAU,YAAY,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAM,QAAQ,QAAQ;AACtB,YAAM,QAAQ,gBAAgB,SAAS,GAAI;AAC3C,YAAM,QAAQ,iBAAiB,EAAE,MAAM,eAAe,MAAM,SAAS,IAAI,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;AAErH,aAAO,QAAQ,OAAO,IAAI,cAAc,CAAC,EAAE,KAAK,KAAK;AACrD,aAAO,QAAQ,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,KAAK;AACjD,YAAM,QAAQ,WAAW;AAEzB,YAAM,KAAK,YAAY,OAAO,EAAE,SAAS,CAAC;AAC1C,YAAM,GAAG,QAAQ;AACjB,aAAO,GAAG,OAAO,IAAI,cAAc,CAAC,EAAE,KAAK,KAAK;AAChD,aAAO,GAAG,OAAO,IAAI,UAAU,CAAC,EAAE,KAAK,KAAK;AAC5C,YAAM,GAAG,WAAW;AAAA,IACrB,CAAC;AAAA,EACF,CAAC;AACF;","names":["v"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{E as C,f as A,g as _,j as v,l as O,m as q,n as D,o as F,p as B,q as S,r as E,s as R}from "../../../chunk-4JLDXF7T.min.mjs";import{a as d,m as k}from "../../../chunk-FLAPYQUT.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import{AsyncLocalStorage as U}from"async_hooks";import{MongoClient as L}from"mongodb";import{v as x}from"valleyed";function m(s,o){let e=[];for(let r of s.children){let a=T(r,o);a&&e.push(a)}return e.length===0?{}:e.length===1?e[0]:{$and:e}}function b(s,o,e){let r=m(s,e),a=o?.orderBy??[],n=a.length>0?Object.fromEntries(a.map(c=>[h(c.field,e),c.direction==="desc"?-1:1])):void 0,t=o?.select??[],i=t.length>0?Object.fromEntries(t.map(c=>[h(c,e),1])):void 0;return{filter:r,sort:n,limit:o?.limit,skip:o?.offset,projection:i}}function h(s,o){return s==="id"&&o==="_id"?"_id":s}function P(s,o){let e=h(s.field,o);switch(s.op){case"eq":return{[e]:{$eq:s.value}};case"ne":return{[e]:{$ne:s.value}};case"gt":return{[e]:{$gt:s.value}};case"gte":return{[e]:{$gte:s.value}};case"lt":return{[e]:{$lt:s.value}};case"lte":return{[e]:{$lte:s.value}};case"in":return{[e]:{$in:s.value}};case"notIn":return{[e]:{$nin:s.value}};case"like":return{[e]:{$regex:new RegExp(String(s.value),"i")}};case"exists":return{[e]:{$exists:!0,$ne:null}};case"notExists":return{[e]:{$eq:null}};case"contains":return{[e]:{$all:Array.isArray(s.value)?s.value:[s.value]}};case"notContains":return{[e]:{$not:{$all:Array.isArray(s.value)?s.value:[s.value]}}};default:return{[e]:{$eq:s.value}}}}function T(s,o){return s instanceof A?P(s,o):s instanceof _?G(s,o):null}function G(s,o){let e=s.children.map(r=>T(r,o)).filter(r=>r!==null);return e.length===0?null:e.length===1?e[0]:{[s.op==="or"?"$or":"$and"]:e}}function w(s){let o={},e={},r={},a={},n={},t={},i={},c={};for(let[u,p]of Object.entries(s))if(p instanceof O)e[u]=p.value;else if(p instanceof q)r[u]=p.value;else if(p instanceof D)a[u]=p.value;else if(p instanceof F)n[u]=p.value;else if(p instanceof B)t[u]="";else if(p instanceof S)i[u]=p.value;else if(p instanceof E)c[u]=p.value;else if(p instanceof R){let y=p.value;for(let[g,f]of Object.entries(y))o[`${u}.${g}`]=f}else o[u]=p;let l={};return Object.keys(o).length&&(l.$set=o),Object.keys(e).length&&(l.$inc=e),Object.keys(r).length&&(l.$mul=r),Object.keys(a).length&&(l.$min=a),Object.keys(n).length&&(l.$max=n),Object.keys(t).length&&(l.$unset=t),Object.keys(i).length&&(l.$push=i),Object.keys(c).length&&(l.$pull=c),l}function M(s){return w(C(s))}function I(s,o){let e=[];if(s.where){let t=m(s.where,o);Object.keys(t).length>0&&e.push({$match:t})}let r=s.groupBy.length>0?Object.fromEntries(s.groupBy.map(t=>[t,`$${h(t,o)}`])):null,a={};for(let t of s.aggregates){let i=t.field?`$${h(t.field,o)}`:void 0;switch(t.fn){case"count":a[t.alias]={$sum:1};break;case"countDistinct":a[t.alias]={$addToSet:i};break;case"sum":case"avg":case"min":case"max":a[t.alias]={[`$${t.fn}`]:i};break}}e.push({$group:{_id:r,...a}});let n={_id:0};for(let t of s.groupBy)n[t]=`$_id.${t}`;for(let t of s.aggregates)t.fn==="countDistinct"?n[t.alias]={$size:`$${t.alias}`}:n[t.alias]=1;if(e.push({$project:n}),s.having){let t=m(s.having,"");Object.keys(t).length>0&&e.push({$match:t})}return e}var N=()=>x.object({db:x.string(),col:x.string()}),z=()=>x.object({uri:x.string()}),$="equipped_migrations",j=class extends k(z,v){schemaConfigPipe=N();queryableOps=["eq","ne","gt","gte","lt","lte","in","notIn","like","exists","notExists","contains","notContains"];updateOps=["set","inc","mul","min","max","unset","push","pull","patch"];aggregateOps=["count","countDistinct","sum","avg","min","max"];supportedFieldTypes=["string","number","boolean","null","object","array","date"];client;#e=new U;constructor(o,e){super(o),this.client=new L(o.uri,{...e,ignoreUndefined:!0})}#t(o){return this.client.db(o.db).collection(o.col)}async connect(){try{await this.client.connect()}catch(o){throw new d("Failed to connect MongoDB client",{adapter:"mongodb"},o)}}async disconnect(){try{await this.client.close()}catch(o){throw new d("Failed to disconnect MongoDB client",{adapter:"mongodb"},o)}}async findByPk(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).findOne({[n]:r},{session:this.#e.getStore()})}catch(n){throw new d("MongoDB findByPk failed",{adapter:"mongodb",operation:"findByPk",collection:a.col},n)}}async createMany(o,e,r){let a=e;try{let n=this.#t(a),t=r.map(i=>i);return await n.insertMany(t,{session:this.#e.getStore()}),r}catch(n){throw new d("MongoDB createMany failed",{adapter:"mongodb",operation:"createMany",collection:a.col},n)}}async updateByPk(o,e,r,a){let n=e;try{let t=o.pkField.name,i=this.#t(n),c=M(a);return Object.keys(c).length===0?await i.findOne({[t]:r},{session:this.#e.getStore()}):await i.findOneAndUpdate({[t]:r},c,{returnDocument:"after",session:this.#e.getStore()})}catch(t){throw new d("MongoDB updateByPk failed",{adapter:"mongodb",operation:"updateByPk",collection:n.col},t)}}async deleteByPk(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).findOneAndDelete({[n]:r},{session:this.#e.getStore()})}catch(n){throw new d("MongoDB deleteByPk failed",{adapter:"mongodb",operation:"deleteByPk",collection:a.col},n)}}async raw(o,e,r){let a=e;try{return await this.#t(a).aggregate(r,{session:this.#e.getStore()}).toArray()}catch(n){throw n instanceof d?n:new d("MongoDB raw failed",{adapter:"mongodb",operation:"raw",collection:a.col},n)}}async aggregate(o,e,r){let a=e;try{let n=o.pkField.name,t=this.#t(a),i=I(r,n);return await t.aggregate(i,{session:this.#e.getStore()}).toArray()}catch(n){throw n instanceof d?n:new d("MongoDB aggregate failed",{adapter:"mongodb",operation:"aggregate",collection:a.col},n)}}async findMany(o,e,r,a){let n=e;try{let t=o.pkField.name,{filter:i,sort:c,limit:l,skip:u,projection:p}=b(r,a,t),g=this.#t(n).find(i,{session:this.#e.getStore(),projection:p});return c&&(g=g.sort(c)),l&&(g=g.limit(l)),u&&(g=g.skip(u)),await g.toArray()}catch(t){throw new d("MongoDB findMany failed",{adapter:"mongodb",operation:"findMany",collection:n.col},t)}}async count(o,e,r){let a=e;try{let n=o.pkField.name;return await this.#t(a).countDocuments(m(r,n),{session:this.#e.getStore()})}catch(n){throw new d("MongoDB count failed",{adapter:"mongodb",operation:"count",collection:a.col},n)}}async*iterateMany(o,e,r,a){let n=e,t;try{let i=o.pkField.name,{filter:c,sort:l,limit:u,skip:p,projection:y}=b(r,a,i);t=this.#t(n).find(c,{session:this.#e.getStore(),projection:y}),l&&(t=t.sort(l)),u&&(t=t.limit(u)),p&&(t=t.skip(p)),a?.batchSize!==void 0&&(t=t.batchSize(a.batchSize));for await(let f of t)yield f}catch(i){throw new d("MongoDB iterateMany failed",{adapter:"mongodb",operation:"iterateMany",collection:n.col},i)}finally{await t?.close()}}async updateMany(o,e,r,a){let n=e;try{let t=o.pkField.name,i=this.#t(n),c=this.#e.getStore(),l=m(r,t),p=(await i.find(l,{session:c,projection:{[t]:1}}).toArray()).map(f=>f[t]),y={[t]:{$in:p}},g=w(a);return Object.keys(g).length>0&&await i.updateMany(y,g,{session:c}),await i.find({[t]:{$in:p}},{session:c}).toArray()}catch(t){throw new d("MongoDB updateMany failed",{adapter:"mongodb",operation:"updateMany",collection:n.col},t)}}async deleteMany(o,e,r){let a=e;try{let n=o.pkField.name,t=this.#t(a),i=this.#e.getStore(),c=m(r,n),l=await t.find(c,{session:i}).toArray();return l.length>0&&await t.deleteMany(c,{session:i}),l}catch(n){throw new d("MongoDB deleteMany failed",{adapter:"mongodb",operation:"deleteMany",collection:a.col},n)}}async upsertOne(o,e,r,a,n){let t=e;try{let i=o.pkField.name,c=this.#t(t),l=m(r,i),u=M(n);return await c.findOneAndUpdate(l,{...u,$setOnInsert:a},{returnDocument:"after",session:this.#e.getStore(),upsert:!0})}catch(i){throw new d("MongoDB upsertOne failed",{adapter:"mongodb",operation:"upsertOne",collection:t.col},i)}}async session(o){if(this.#e.getStore())return o();try{let e=await this.client.startSession();try{return await e.withTransaction(async()=>this.#e.run(e,o))}finally{await e.endSession()}}catch(e){throw e instanceof d?e:new d("MongoDB session failed",{adapter:"mongodb",operation:"session"},e)}}async loadMigrations(){return(await this.client.db().collection($).find({}).toArray()).map(r=>({id:String(r._id),appliedAt:r.appliedAt}))}async recordMigration(o,e){await this.client.db().collection($).insertOne({_id:o,appliedAt:e})}async applyAddIndex(o){let e=this.client.db(),r={};for(let n of o.on)r[n]=1;let a=o.name??`${o.table}_${o.on.join("_")}_idx`;await e.collection(o.table).createIndex(r,{unique:o.unique??!1,name:a})}async applyDropIndex(o){let e=this.client.db(),r=await e.listCollections().toArray();for(let a of r)if((await e.collection(a.name).listIndexes().toArray()).some(t=>t.name===o.name)){await e.collection(a.name).dropIndex(o.name);return}}async introspect(){let o=this.client.db(),e=await o.listCollections().toArray(),r=[];for(let a of e){if(a.name===$)continue;let t=(await o.collection(a.name).listIndexes().toArray()).filter(i=>i.name!=="_id_").map(i=>({name:i.name,on:Object.keys(i.key),unique:!!i.unique}));r.push({name:a.name,pk:void 0,fields:[],indexes:t,foreignKeys:[]})}return r}};export{j as MongoDbAdapter};
|
|
2
|
+
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -0,0 +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":["AsyncLocalStorage","MongoClient","v","compileMongoFilter","group","primaryKey","clauses","child","compiled","compileChild","compileMongoQuery","options","mongoFilter","orderBys","sort","o","mapField","selects","projection","f","field","compileFilter","Filter","FilterGroup","compileGroup","c","compileMongoUpdate","data","$set","$inc","$mul","$min","$max","$unset","$push","$pull","key","value","IncOp","MulOp","MinOp","MaxOp","UnsetOp","PushOp","PullOp","PatchOp","patchVal","subKey","subVal","result","compileMongoOps","ops","flattenOps","compileMongoAggregate","spec","pipeline","match","groupId","accumulators","agg","fieldRef","project","havingMatch","mongoSchemaConfigPipe","v","mongoConnectionPipe","MIGRATION_TRACKER_COLLECTION","MongoDbAdapter","configurable","OrmAdapter","#sessionStore","AsyncLocalStorage","config","options","MongoClient","#getCollection","schemaCfg","error","EquippedError","schema","pk","pkName","_schema","data","collection","docs","d","ops","update","compileMongoOps","pipeline","spec","compileMongoAggregate","filter","mongoFilter","sort","limit","skip","projection","compileMongoQuery","cursor","compileMongoFilter","row","session","ids","idFilter","compileMongoUpdate","create","updateDoc","fn","id","appliedAt","change","db","fields","f","name","collections","col","idx","schemas","indexes"]}
|