mongo.do 0.1.0 → 0.1.1
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/dist/cli/index.d.ts +1 -15
- package/dist/cli/index.js +4083 -196
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2740 -20
- package/dist/index.js +9375 -27
- package/dist/index.js.map +1 -1
- package/dist/worker-entrypoint-BEW23Gmp.d.ts +1331 -0
- package/dist/worker.d.ts +6 -5
- package/dist/worker.js +5477 -18
- package/dist/worker.js.map +1 -1
- package/package.json +3 -2
- package/dist/agentfs/adapters/anthropic.d.ts +0 -176
- package/dist/agentfs/adapters/anthropic.d.ts.map +0 -1
- package/dist/agentfs/adapters/anthropic.js +0 -629
- package/dist/agentfs/adapters/anthropic.js.map +0 -1
- package/dist/agentfs/adapters/index.d.ts +0 -21
- package/dist/agentfs/adapters/index.d.ts.map +0 -1
- package/dist/agentfs/adapters/index.js +0 -23
- package/dist/agentfs/adapters/index.js.map +0 -1
- package/dist/agentfs/adapters/vercel.d.ts +0 -260
- package/dist/agentfs/adapters/vercel.d.ts.map +0 -1
- package/dist/agentfs/adapters/vercel.js +0 -288
- package/dist/agentfs/adapters/vercel.js.map +0 -1
- package/dist/agentfs/glob.d.ts +0 -116
- package/dist/agentfs/glob.d.ts.map +0 -1
- package/dist/agentfs/glob.js +0 -270
- package/dist/agentfs/glob.js.map +0 -1
- package/dist/agentfs/grep.d.ts +0 -83
- package/dist/agentfs/grep.d.ts.map +0 -1
- package/dist/agentfs/grep.js +0 -193
- package/dist/agentfs/grep.js.map +0 -1
- package/dist/agentfs/index.d.ts +0 -22
- package/dist/agentfs/index.d.ts.map +0 -1
- package/dist/agentfs/index.js +0 -18
- package/dist/agentfs/index.js.map +0 -1
- package/dist/agentfs/kv-store.d.ts +0 -128
- package/dist/agentfs/kv-store.d.ts.map +0 -1
- package/dist/agentfs/kv-store.js +0 -227
- package/dist/agentfs/kv-store.js.map +0 -1
- package/dist/agentfs/mondo-agent.d.ts +0 -255
- package/dist/agentfs/mondo-agent.d.ts.map +0 -1
- package/dist/agentfs/mondo-agent.js +0 -879
- package/dist/agentfs/mondo-agent.js.map +0 -1
- package/dist/agentfs/toolcalls.d.ts +0 -130
- package/dist/agentfs/toolcalls.d.ts.map +0 -1
- package/dist/agentfs/toolcalls.js +0 -178
- package/dist/agentfs/toolcalls.js.map +0 -1
- package/dist/agentfs/types.d.ts +0 -171
- package/dist/agentfs/types.d.ts.map +0 -1
- package/dist/agentfs/types.js +0 -7
- package/dist/agentfs/types.js.map +0 -1
- package/dist/agentfs/vfs.d.ts +0 -249
- package/dist/agentfs/vfs.d.ts.map +0 -1
- package/dist/agentfs/vfs.js +0 -469
- package/dist/agentfs/vfs.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/mcp.d.ts +0 -119
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js +0 -418
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/server.d.ts +0 -179
- package/dist/cli/server.d.ts.map +0 -1
- package/dist/cli/server.js +0 -441
- package/dist/cli/server.js.map +0 -1
- package/dist/client/Collection.d.ts +0 -199
- package/dist/client/Collection.d.ts.map +0 -1
- package/dist/client/Collection.js +0 -256
- package/dist/client/Collection.js.map +0 -1
- package/dist/client/Database.d.ts +0 -68
- package/dist/client/Database.d.ts.map +0 -1
- package/dist/client/Database.js +0 -105
- package/dist/client/Database.js.map +0 -1
- package/dist/client/MongoClient.d.ts +0 -165
- package/dist/client/MongoClient.d.ts.map +0 -1
- package/dist/client/MongoClient.js +0 -307
- package/dist/client/MongoClient.js.map +0 -1
- package/dist/client/aggregation-cursor.d.ts +0 -210
- package/dist/client/aggregation-cursor.d.ts.map +0 -1
- package/dist/client/aggregation-cursor.js +0 -509
- package/dist/client/aggregation-cursor.js.map +0 -1
- package/dist/client/bulk-write.d.ts +0 -216
- package/dist/client/bulk-write.d.ts.map +0 -1
- package/dist/client/bulk-write.js +0 -63
- package/dist/client/bulk-write.js.map +0 -1
- package/dist/client/change-stream.d.ts +0 -245
- package/dist/client/change-stream.d.ts.map +0 -1
- package/dist/client/change-stream.js +0 -429
- package/dist/client/change-stream.js.map +0 -1
- package/dist/client/cursor.d.ts +0 -85
- package/dist/client/cursor.d.ts.map +0 -1
- package/dist/client/cursor.js +0 -156
- package/dist/client/cursor.js.map +0 -1
- package/dist/client/http-cursor.d.ts +0 -233
- package/dist/client/http-cursor.d.ts.map +0 -1
- package/dist/client/http-cursor.js +0 -496
- package/dist/client/http-cursor.js.map +0 -1
- package/dist/client/index.d.ts +0 -18
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -24
- package/dist/client/index.js.map +0 -1
- package/dist/client/mongo-client.d.ts +0 -60
- package/dist/client/mongo-client.d.ts.map +0 -1
- package/dist/client/mongo-client.js +0 -190
- package/dist/client/mongo-client.js.map +0 -1
- package/dist/client/mongo-collection.d.ts +0 -359
- package/dist/client/mongo-collection.d.ts.map +0 -1
- package/dist/client/mongo-collection.js +0 -1641
- package/dist/client/mongo-collection.js.map +0 -1
- package/dist/client/mongo-cursor.d.ts +0 -257
- package/dist/client/mongo-cursor.d.ts.map +0 -1
- package/dist/client/mongo-cursor.js +0 -621
- package/dist/client/mongo-cursor.js.map +0 -1
- package/dist/client/mongo-database.d.ts +0 -88
- package/dist/client/mongo-database.d.ts.map +0 -1
- package/dist/client/mongo-database.js +0 -139
- package/dist/client/mongo-database.js.map +0 -1
- package/dist/client/session.d.ts +0 -210
- package/dist/client/session.d.ts.map +0 -1
- package/dist/client/session.js +0 -326
- package/dist/client/session.js.map +0 -1
- package/dist/durable-object/index-manager.d.ts +0 -173
- package/dist/durable-object/index-manager.d.ts.map +0 -1
- package/dist/durable-object/index-manager.js +0 -764
- package/dist/durable-object/index-manager.js.map +0 -1
- package/dist/durable-object/index.d.ts +0 -12
- package/dist/durable-object/index.d.ts.map +0 -1
- package/dist/durable-object/index.js +0 -8
- package/dist/durable-object/index.js.map +0 -1
- package/dist/durable-object/mcp-handler.d.ts +0 -52
- package/dist/durable-object/mcp-handler.d.ts.map +0 -1
- package/dist/durable-object/mcp-handler.js +0 -186
- package/dist/durable-object/mcp-handler.js.map +0 -1
- package/dist/durable-object/migrations.d.ts +0 -40
- package/dist/durable-object/migrations.d.ts.map +0 -1
- package/dist/durable-object/migrations.js +0 -121
- package/dist/durable-object/migrations.js.map +0 -1
- package/dist/durable-object/mondo-database.d.ts +0 -148
- package/dist/durable-object/mondo-database.d.ts.map +0 -1
- package/dist/durable-object/mondo-database.js +0 -621
- package/dist/durable-object/mondo-database.js.map +0 -1
- package/dist/durable-object/schema.d.ts +0 -192
- package/dist/durable-object/schema.d.ts.map +0 -1
- package/dist/durable-object/schema.js +0 -186
- package/dist/durable-object/schema.js.map +0 -1
- package/dist/embedding/document-serializer.d.ts +0 -118
- package/dist/embedding/document-serializer.d.ts.map +0 -1
- package/dist/embedding/document-serializer.js +0 -339
- package/dist/embedding/document-serializer.js.map +0 -1
- package/dist/embedding/embedding-manager.d.ts +0 -136
- package/dist/embedding/embedding-manager.d.ts.map +0 -1
- package/dist/embedding/embedding-manager.js +0 -176
- package/dist/embedding/embedding-manager.js.map +0 -1
- package/dist/embedding/index.d.ts +0 -9
- package/dist/embedding/index.d.ts.map +0 -1
- package/dist/embedding/index.js +0 -9
- package/dist/embedding/index.js.map +0 -1
- package/dist/executor/aggregation-executor.d.ts +0 -93
- package/dist/executor/aggregation-executor.d.ts.map +0 -1
- package/dist/executor/aggregation-executor.js +0 -275
- package/dist/executor/aggregation-executor.js.map +0 -1
- package/dist/executor/function-executor.d.ts +0 -39
- package/dist/executor/function-executor.d.ts.map +0 -1
- package/dist/executor/function-executor.js +0 -168
- package/dist/executor/function-executor.js.map +0 -1
- package/dist/executor/index.d.ts +0 -4
- package/dist/executor/index.d.ts.map +0 -1
- package/dist/executor/index.js +0 -4
- package/dist/executor/index.js.map +0 -1
- package/dist/executor/vector-search-executor.d.ts +0 -71
- package/dist/executor/vector-search-executor.d.ts.map +0 -1
- package/dist/executor/vector-search-executor.js +0 -113
- package/dist/executor/vector-search-executor.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/mcp/adapters/anthropic-adapter.d.ts +0 -256
- package/dist/mcp/adapters/anthropic-adapter.d.ts.map +0 -1
- package/dist/mcp/adapters/anthropic-adapter.js +0 -409
- package/dist/mcp/adapters/anthropic-adapter.js.map +0 -1
- package/dist/mcp/adapters/base-adapter.d.ts +0 -164
- package/dist/mcp/adapters/base-adapter.d.ts.map +0 -1
- package/dist/mcp/adapters/base-adapter.js +0 -277
- package/dist/mcp/adapters/base-adapter.js.map +0 -1
- package/dist/mcp/adapters/errors.d.ts +0 -173
- package/dist/mcp/adapters/errors.d.ts.map +0 -1
- package/dist/mcp/adapters/errors.js +0 -305
- package/dist/mcp/adapters/errors.js.map +0 -1
- package/dist/mcp/adapters/index.d.ts +0 -65
- package/dist/mcp/adapters/index.d.ts.map +0 -1
- package/dist/mcp/adapters/index.js +0 -92
- package/dist/mcp/adapters/index.js.map +0 -1
- package/dist/mcp/adapters/streaming.d.ts +0 -200
- package/dist/mcp/adapters/streaming.d.ts.map +0 -1
- package/dist/mcp/adapters/streaming.js +0 -381
- package/dist/mcp/adapters/streaming.js.map +0 -1
- package/dist/mcp/adapters/vercel-adapter.d.ts +0 -321
- package/dist/mcp/adapters/vercel-adapter.d.ts.map +0 -1
- package/dist/mcp/adapters/vercel-adapter.js +0 -487
- package/dist/mcp/adapters/vercel-adapter.js.map +0 -1
- package/dist/mcp/agent.d.ts +0 -192
- package/dist/mcp/agent.d.ts.map +0 -1
- package/dist/mcp/agent.js +0 -338
- package/dist/mcp/agent.js.map +0 -1
- package/dist/mcp/cli.d.ts +0 -71
- package/dist/mcp/cli.d.ts.map +0 -1
- package/dist/mcp/cli.js +0 -218
- package/dist/mcp/cli.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -15
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -20
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/sandbox/database-proxy.d.ts +0 -118
- package/dist/mcp/sandbox/database-proxy.d.ts.map +0 -1
- package/dist/mcp/sandbox/database-proxy.js +0 -154
- package/dist/mcp/sandbox/database-proxy.js.map +0 -1
- package/dist/mcp/sandbox/index.d.ts +0 -8
- package/dist/mcp/sandbox/index.d.ts.map +0 -1
- package/dist/mcp/sandbox/index.js +0 -7
- package/dist/mcp/sandbox/index.js.map +0 -1
- package/dist/mcp/sandbox/miniflare-evaluator.d.ts +0 -72
- package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +0 -1
- package/dist/mcp/sandbox/miniflare-evaluator.js +0 -379
- package/dist/mcp/sandbox/miniflare-evaluator.js.map +0 -1
- package/dist/mcp/sandbox/template.d.ts +0 -48
- package/dist/mcp/sandbox/template.d.ts.map +0 -1
- package/dist/mcp/sandbox/template.js +0 -147
- package/dist/mcp/sandbox/template.js.map +0 -1
- package/dist/mcp/sandbox/worker-evaluator.d.ts +0 -160
- package/dist/mcp/sandbox/worker-evaluator.d.ts.map +0 -1
- package/dist/mcp/sandbox/worker-evaluator.js +0 -217
- package/dist/mcp/sandbox/worker-evaluator.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -75
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -278
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/tool-call-auditor.d.ts +0 -188
- package/dist/mcp/tool-call-auditor.d.ts.map +0 -1
- package/dist/mcp/tool-call-auditor.js +0 -198
- package/dist/mcp/tool-call-auditor.js.map +0 -1
- package/dist/mcp/tools/do.d.ts +0 -51
- package/dist/mcp/tools/do.d.ts.map +0 -1
- package/dist/mcp/tools/do.js +0 -113
- package/dist/mcp/tools/do.js.map +0 -1
- package/dist/mcp/tools/fetch.d.ts +0 -43
- package/dist/mcp/tools/fetch.d.ts.map +0 -1
- package/dist/mcp/tools/fetch.js +0 -127
- package/dist/mcp/tools/fetch.js.map +0 -1
- package/dist/mcp/tools/index.d.ts +0 -9
- package/dist/mcp/tools/index.d.ts.map +0 -1
- package/dist/mcp/tools/index.js +0 -9
- package/dist/mcp/tools/index.js.map +0 -1
- package/dist/mcp/tools/search.d.ts +0 -60
- package/dist/mcp/tools/search.d.ts.map +0 -1
- package/dist/mcp/tools/search.js +0 -278
- package/dist/mcp/tools/search.js.map +0 -1
- package/dist/mcp/transport/http.d.ts +0 -144
- package/dist/mcp/transport/http.d.ts.map +0 -1
- package/dist/mcp/transport/http.js +0 -545
- package/dist/mcp/transport/http.js.map +0 -1
- package/dist/mcp/transport/index.d.ts +0 -10
- package/dist/mcp/transport/index.d.ts.map +0 -1
- package/dist/mcp/transport/index.js +0 -12
- package/dist/mcp/transport/index.js.map +0 -1
- package/dist/mcp/transport/stdio.d.ts +0 -132
- package/dist/mcp/transport/stdio.d.ts.map +0 -1
- package/dist/mcp/transport/stdio.js +0 -466
- package/dist/mcp/transport/stdio.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -476
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js +0 -178
- package/dist/mcp/types.js.map +0 -1
- package/dist/olap/cdc/cdc-buffer.d.ts +0 -92
- package/dist/olap/cdc/cdc-buffer.d.ts.map +0 -1
- package/dist/olap/cdc/cdc-buffer.js +0 -146
- package/dist/olap/cdc/cdc-buffer.js.map +0 -1
- package/dist/olap/cdc/cdc-emitter.d.ts +0 -118
- package/dist/olap/cdc/cdc-emitter.d.ts.map +0 -1
- package/dist/olap/cdc/cdc-emitter.js +0 -217
- package/dist/olap/cdc/cdc-emitter.js.map +0 -1
- package/dist/olap/cdc/cdc-schema.d.ts +0 -119
- package/dist/olap/cdc/cdc-schema.d.ts.map +0 -1
- package/dist/olap/cdc/cdc-schema.js +0 -253
- package/dist/olap/cdc/cdc-schema.js.map +0 -1
- package/dist/olap/cdc/index.d.ts +0 -10
- package/dist/olap/cdc/index.d.ts.map +0 -1
- package/dist/olap/cdc/index.js +0 -10
- package/dist/olap/cdc/index.js.map +0 -1
- package/dist/olap/clickhouse/iceberg.d.ts +0 -164
- package/dist/olap/clickhouse/iceberg.d.ts.map +0 -1
- package/dist/olap/clickhouse/iceberg.js +0 -138
- package/dist/olap/clickhouse/iceberg.js.map +0 -1
- package/dist/olap/clickhouse/index.d.ts +0 -14
- package/dist/olap/clickhouse/index.d.ts.map +0 -1
- package/dist/olap/clickhouse/index.js +0 -14
- package/dist/olap/clickhouse/index.js.map +0 -1
- package/dist/olap/clickhouse/mapper.d.ts +0 -170
- package/dist/olap/clickhouse/mapper.d.ts.map +0 -1
- package/dist/olap/clickhouse/mapper.js +0 -654
- package/dist/olap/clickhouse/mapper.js.map +0 -1
- package/dist/olap/clickhouse/olap-backend.d.ts +0 -181
- package/dist/olap/clickhouse/olap-backend.d.ts.map +0 -1
- package/dist/olap/clickhouse/olap-backend.js +0 -1083
- package/dist/olap/clickhouse/olap-backend.js.map +0 -1
- package/dist/olap/clickhouse/query-executor.d.ts +0 -163
- package/dist/olap/clickhouse/query-executor.d.ts.map +0 -1
- package/dist/olap/clickhouse/query-executor.js +0 -560
- package/dist/olap/clickhouse/query-executor.js.map +0 -1
- package/dist/olap/clickhouse/query.d.ts +0 -134
- package/dist/olap/clickhouse/query.d.ts.map +0 -1
- package/dist/olap/clickhouse/query.js +0 -512
- package/dist/olap/clickhouse/query.js.map +0 -1
- package/dist/olap/stage/index.d.ts +0 -6
- package/dist/olap/stage/index.d.ts.map +0 -1
- package/dist/olap/stage/index.js +0 -6
- package/dist/olap/stage/index.js.map +0 -1
- package/dist/olap/stage/parser.d.ts +0 -68
- package/dist/olap/stage/parser.d.ts.map +0 -1
- package/dist/olap/stage/parser.js +0 -293
- package/dist/olap/stage/parser.js.map +0 -1
- package/dist/olap/stage/router.d.ts +0 -94
- package/dist/olap/stage/router.d.ts.map +0 -1
- package/dist/olap/stage/router.js +0 -390
- package/dist/olap/stage/router.js.map +0 -1
- package/dist/rpc/endpoint.d.ts +0 -52
- package/dist/rpc/endpoint.d.ts.map +0 -1
- package/dist/rpc/endpoint.js +0 -734
- package/dist/rpc/endpoint.js.map +0 -1
- package/dist/rpc/index.d.ts +0 -34
- package/dist/rpc/index.d.ts.map +0 -1
- package/dist/rpc/index.js +0 -45
- package/dist/rpc/index.js.map +0 -1
- package/dist/rpc/rpc-client.d.ts +0 -275
- package/dist/rpc/rpc-client.d.ts.map +0 -1
- package/dist/rpc/rpc-client.js +0 -735
- package/dist/rpc/rpc-client.js.map +0 -1
- package/dist/rpc/rpc-target.d.ts +0 -220
- package/dist/rpc/rpc-target.d.ts.map +0 -1
- package/dist/rpc/rpc-target.js +0 -500
- package/dist/rpc/rpc-target.js.map +0 -1
- package/dist/rpc/worker-entrypoint.d.ts +0 -159
- package/dist/rpc/worker-entrypoint.d.ts.map +0 -1
- package/dist/rpc/worker-entrypoint.js +0 -212
- package/dist/rpc/worker-entrypoint.js.map +0 -1
- package/dist/server.d.ts +0 -18
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -129
- package/dist/server.js.map +0 -1
- package/dist/studio/components/browser/CollectionItem.d.ts +0 -26
- package/dist/studio/components/browser/CollectionItem.d.ts.map +0 -1
- package/dist/studio/components/browser/CollectionItem.js +0 -143
- package/dist/studio/components/browser/CollectionItem.js.map +0 -1
- package/dist/studio/components/browser/CollectionTree.d.ts +0 -45
- package/dist/studio/components/browser/CollectionTree.d.ts.map +0 -1
- package/dist/studio/components/browser/CollectionTree.js +0 -207
- package/dist/studio/components/browser/CollectionTree.js.map +0 -1
- package/dist/studio/components/browser/ConnectedDatabaseBrowser.d.ts +0 -51
- package/dist/studio/components/browser/ConnectedDatabaseBrowser.d.ts.map +0 -1
- package/dist/studio/components/browser/ConnectedDatabaseBrowser.js +0 -185
- package/dist/studio/components/browser/ConnectedDatabaseBrowser.js.map +0 -1
- package/dist/studio/components/browser/DatabaseBrowser.d.ts +0 -46
- package/dist/studio/components/browser/DatabaseBrowser.d.ts.map +0 -1
- package/dist/studio/components/browser/DatabaseBrowser.js +0 -304
- package/dist/studio/components/browser/DatabaseBrowser.js.map +0 -1
- package/dist/studio/components/browser/__tests__/CollectionItem.test.d.ts +0 -5
- package/dist/studio/components/browser/__tests__/CollectionItem.test.d.ts.map +0 -1
- package/dist/studio/components/browser/__tests__/CollectionItem.test.js +0 -169
- package/dist/studio/components/browser/__tests__/CollectionItem.test.js.map +0 -1
- package/dist/studio/components/browser/__tests__/CollectionTree.test.d.ts +0 -5
- package/dist/studio/components/browser/__tests__/CollectionTree.test.d.ts.map +0 -1
- package/dist/studio/components/browser/__tests__/CollectionTree.test.js +0 -203
- package/dist/studio/components/browser/__tests__/CollectionTree.test.js.map +0 -1
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.d.ts +0 -8
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.d.ts.map +0 -1
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.js +0 -522
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.js.map +0 -1
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.d.ts +0 -5
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.d.ts.map +0 -1
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.js +0 -518
- package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.js.map +0 -1
- package/dist/studio/components/browser/__tests__/setup.d.ts +0 -5
- package/dist/studio/components/browser/__tests__/setup.d.ts.map +0 -1
- package/dist/studio/components/browser/__tests__/setup.js +0 -22
- package/dist/studio/components/browser/__tests__/setup.js.map +0 -1
- package/dist/studio/components/browser/index.d.ts +0 -15
- package/dist/studio/components/browser/index.d.ts.map +0 -1
- package/dist/studio/components/browser/index.js +0 -10
- package/dist/studio/components/browser/index.js.map +0 -1
- package/dist/studio/components/browser/types.d.ts +0 -33
- package/dist/studio/components/browser/types.d.ts.map +0 -1
- package/dist/studio/components/browser/types.js +0 -5
- package/dist/studio/components/browser/types.js.map +0 -1
- package/dist/studio/components/connection/ConnectionForm.d.ts +0 -59
- package/dist/studio/components/connection/ConnectionForm.d.ts.map +0 -1
- package/dist/studio/components/connection/ConnectionForm.js +0 -274
- package/dist/studio/components/connection/ConnectionForm.js.map +0 -1
- package/dist/studio/components/connection/ConnectionList.d.ts +0 -59
- package/dist/studio/components/connection/ConnectionList.d.ts.map +0 -1
- package/dist/studio/components/connection/ConnectionList.js +0 -286
- package/dist/studio/components/connection/ConnectionList.js.map +0 -1
- package/dist/studio/components/connection/ConnectionPanel.d.ts +0 -132
- package/dist/studio/components/connection/ConnectionPanel.d.ts.map +0 -1
- package/dist/studio/components/connection/ConnectionPanel.js +0 -293
- package/dist/studio/components/connection/ConnectionPanel.js.map +0 -1
- package/dist/studio/components/connection/__tests__/ConnectionPanel.test.d.ts +0 -8
- package/dist/studio/components/connection/__tests__/ConnectionPanel.test.d.ts.map +0 -1
- package/dist/studio/components/connection/__tests__/ConnectionPanel.test.js +0 -632
- package/dist/studio/components/connection/__tests__/ConnectionPanel.test.js.map +0 -1
- package/dist/studio/components/connection/__tests__/setup.d.ts +0 -5
- package/dist/studio/components/connection/__tests__/setup.d.ts.map +0 -1
- package/dist/studio/components/connection/__tests__/setup.js +0 -11
- package/dist/studio/components/connection/__tests__/setup.js.map +0 -1
- package/dist/studio/components/connection/index.d.ts +0 -10
- package/dist/studio/components/connection/index.d.ts.map +0 -1
- package/dist/studio/components/connection/index.js +0 -7
- package/dist/studio/components/connection/index.js.map +0 -1
- package/dist/studio/components/crud/DeleteDocumentDialog.d.ts +0 -91
- package/dist/studio/components/crud/DeleteDocumentDialog.d.ts.map +0 -1
- package/dist/studio/components/crud/DeleteDocumentDialog.js +0 -273
- package/dist/studio/components/crud/DeleteDocumentDialog.js.map +0 -1
- package/dist/studio/components/crud/DocumentEditor.d.ts +0 -32
- package/dist/studio/components/crud/DocumentEditor.d.ts.map +0 -1
- package/dist/studio/components/crud/DocumentEditor.js +0 -546
- package/dist/studio/components/crud/DocumentEditor.js.map +0 -1
- package/dist/studio/components/crud/InsertDocumentDialog.d.ts +0 -78
- package/dist/studio/components/crud/InsertDocumentDialog.d.ts.map +0 -1
- package/dist/studio/components/crud/InsertDocumentDialog.js +0 -323
- package/dist/studio/components/crud/InsertDocumentDialog.js.map +0 -1
- package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.d.ts +0 -5
- package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.d.ts.map +0 -1
- package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.js +0 -298
- package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.js.map +0 -1
- package/dist/studio/components/crud/__tests__/DocumentEditor.test.d.ts +0 -8
- package/dist/studio/components/crud/__tests__/DocumentEditor.test.d.ts.map +0 -1
- package/dist/studio/components/crud/__tests__/DocumentEditor.test.js +0 -368
- package/dist/studio/components/crud/__tests__/DocumentEditor.test.js.map +0 -1
- package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.d.ts +0 -2
- package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.d.ts.map +0 -1
- package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.js +0 -352
- package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.js.map +0 -1
- package/dist/studio/components/crud/__tests__/setup.d.ts +0 -5
- package/dist/studio/components/crud/__tests__/setup.d.ts.map +0 -1
- package/dist/studio/components/crud/__tests__/setup.js +0 -22
- package/dist/studio/components/crud/__tests__/setup.js.map +0 -1
- package/dist/studio/components/crud/index.d.ts +0 -12
- package/dist/studio/components/crud/index.d.ts.map +0 -1
- package/dist/studio/components/crud/index.js +0 -11
- package/dist/studio/components/crud/index.js.map +0 -1
- package/dist/studio/hooks/useConnection.d.ts +0 -127
- package/dist/studio/hooks/useConnection.d.ts.map +0 -1
- package/dist/studio/hooks/useConnection.js +0 -414
- package/dist/studio/hooks/useConnection.js.map +0 -1
- package/dist/studio/hooks/useDatabaseBrowser.d.ts +0 -107
- package/dist/studio/hooks/useDatabaseBrowser.d.ts.map +0 -1
- package/dist/studio/hooks/useDatabaseBrowser.js +0 -294
- package/dist/studio/hooks/useDatabaseBrowser.js.map +0 -1
- package/dist/studio/index.d.ts +0 -16
- package/dist/studio/index.d.ts.map +0 -1
- package/dist/studio/index.js +0 -14
- package/dist/studio/index.js.map +0 -1
- package/dist/studio/types/connection.d.ts +0 -266
- package/dist/studio/types/connection.d.ts.map +0 -1
- package/dist/studio/types/connection.js +0 -159
- package/dist/studio/types/connection.js.map +0 -1
- package/dist/studio/vitest.config.d.ts +0 -3
- package/dist/studio/vitest.config.d.ts.map +0 -1
- package/dist/studio/vitest.config.js +0 -33
- package/dist/studio/vitest.config.js.map +0 -1
- package/dist/translator/aggregation-translator.d.ts +0 -51
- package/dist/translator/aggregation-translator.d.ts.map +0 -1
- package/dist/translator/aggregation-translator.js +0 -324
- package/dist/translator/aggregation-translator.js.map +0 -1
- package/dist/translator/dialect.d.ts +0 -131
- package/dist/translator/dialect.d.ts.map +0 -1
- package/dist/translator/dialect.js +0 -276
- package/dist/translator/dialect.js.map +0 -1
- package/dist/translator/geo-translator.d.ts +0 -91
- package/dist/translator/geo-translator.d.ts.map +0 -1
- package/dist/translator/geo-translator.js +0 -587
- package/dist/translator/geo-translator.js.map +0 -1
- package/dist/translator/hybrid-translator.d.ts +0 -70
- package/dist/translator/hybrid-translator.d.ts.map +0 -1
- package/dist/translator/hybrid-translator.js +0 -193
- package/dist/translator/hybrid-translator.js.map +0 -1
- package/dist/translator/index.d.ts +0 -13
- package/dist/translator/index.d.ts.map +0 -1
- package/dist/translator/index.js +0 -11
- package/dist/translator/index.js.map +0 -1
- package/dist/translator/query-translator.d.ts +0 -211
- package/dist/translator/query-translator.d.ts.map +0 -1
- package/dist/translator/query-translator.js +0 -1276
- package/dist/translator/query-translator.js.map +0 -1
- package/dist/translator/search-highlight.d.ts +0 -83
- package/dist/translator/search-highlight.d.ts.map +0 -1
- package/dist/translator/search-highlight.js +0 -83
- package/dist/translator/search-highlight.js.map +0 -1
- package/dist/translator/search-translator.d.ts +0 -155
- package/dist/translator/search-translator.d.ts.map +0 -1
- package/dist/translator/search-translator.js +0 -241
- package/dist/translator/search-translator.js.map +0 -1
- package/dist/translator/stages/add-fields-stage.d.ts +0 -7
- package/dist/translator/stages/add-fields-stage.d.ts.map +0 -1
- package/dist/translator/stages/add-fields-stage.js +0 -72
- package/dist/translator/stages/add-fields-stage.js.map +0 -1
- package/dist/translator/stages/bucket-stage.d.ts +0 -7
- package/dist/translator/stages/bucket-stage.d.ts.map +0 -1
- package/dist/translator/stages/bucket-stage.js +0 -87
- package/dist/translator/stages/bucket-stage.js.map +0 -1
- package/dist/translator/stages/count-stage.d.ts +0 -7
- package/dist/translator/stages/count-stage.d.ts.map +0 -1
- package/dist/translator/stages/count-stage.js +0 -12
- package/dist/translator/stages/count-stage.js.map +0 -1
- package/dist/translator/stages/expression-translator.d.ts +0 -68
- package/dist/translator/stages/expression-translator.d.ts.map +0 -1
- package/dist/translator/stages/expression-translator.js +0 -467
- package/dist/translator/stages/expression-translator.js.map +0 -1
- package/dist/translator/stages/facet-stage.d.ts +0 -13
- package/dist/translator/stages/facet-stage.d.ts.map +0 -1
- package/dist/translator/stages/facet-stage.js +0 -26
- package/dist/translator/stages/facet-stage.js.map +0 -1
- package/dist/translator/stages/fusion-stages.d.ts +0 -118
- package/dist/translator/stages/fusion-stages.d.ts.map +0 -1
- package/dist/translator/stages/fusion-stages.js +0 -201
- package/dist/translator/stages/fusion-stages.js.map +0 -1
- package/dist/translator/stages/group-stage.d.ts +0 -8
- package/dist/translator/stages/group-stage.d.ts.map +0 -1
- package/dist/translator/stages/group-stage.js +0 -123
- package/dist/translator/stages/group-stage.js.map +0 -1
- package/dist/translator/stages/index.d.ts +0 -24
- package/dist/translator/stages/index.d.ts.map +0 -1
- package/dist/translator/stages/index.js +0 -24
- package/dist/translator/stages/index.js.map +0 -1
- package/dist/translator/stages/join-optimizer.d.ts +0 -37
- package/dist/translator/stages/join-optimizer.d.ts.map +0 -1
- package/dist/translator/stages/join-optimizer.js +0 -93
- package/dist/translator/stages/join-optimizer.js.map +0 -1
- package/dist/translator/stages/limit-stage.d.ts +0 -7
- package/dist/translator/stages/limit-stage.d.ts.map +0 -1
- package/dist/translator/stages/limit-stage.js +0 -11
- package/dist/translator/stages/limit-stage.js.map +0 -1
- package/dist/translator/stages/lookup-stage.d.ts +0 -7
- package/dist/translator/stages/lookup-stage.d.ts.map +0 -1
- package/dist/translator/stages/lookup-stage.js +0 -73
- package/dist/translator/stages/lookup-stage.js.map +0 -1
- package/dist/translator/stages/match-stage.d.ts +0 -7
- package/dist/translator/stages/match-stage.d.ts.map +0 -1
- package/dist/translator/stages/match-stage.js +0 -14
- package/dist/translator/stages/match-stage.js.map +0 -1
- package/dist/translator/stages/optimizer.d.ts +0 -15
- package/dist/translator/stages/optimizer.d.ts.map +0 -1
- package/dist/translator/stages/optimizer.js +0 -249
- package/dist/translator/stages/optimizer.js.map +0 -1
- package/dist/translator/stages/parallel-facet.d.ts +0 -47
- package/dist/translator/stages/parallel-facet.d.ts.map +0 -1
- package/dist/translator/stages/parallel-facet.js +0 -57
- package/dist/translator/stages/parallel-facet.js.map +0 -1
- package/dist/translator/stages/project-stage.d.ts +0 -8
- package/dist/translator/stages/project-stage.d.ts.map +0 -1
- package/dist/translator/stages/project-stage.js +0 -145
- package/dist/translator/stages/project-stage.js.map +0 -1
- package/dist/translator/stages/search-stage.d.ts +0 -60
- package/dist/translator/stages/search-stage.d.ts.map +0 -1
- package/dist/translator/stages/search-stage.js +0 -89
- package/dist/translator/stages/search-stage.js.map +0 -1
- package/dist/translator/stages/skip-stage.d.ts +0 -7
- package/dist/translator/stages/skip-stage.d.ts.map +0 -1
- package/dist/translator/stages/skip-stage.js +0 -11
- package/dist/translator/stages/skip-stage.js.map +0 -1
- package/dist/translator/stages/sort-stage.d.ts +0 -7
- package/dist/translator/stages/sort-stage.d.ts.map +0 -1
- package/dist/translator/stages/sort-stage.js +0 -21
- package/dist/translator/stages/sort-stage.js.map +0 -1
- package/dist/translator/stages/types.d.ts +0 -136
- package/dist/translator/stages/types.d.ts.map +0 -1
- package/dist/translator/stages/types.js +0 -5
- package/dist/translator/stages/types.js.map +0 -1
- package/dist/translator/stages/unwind-stage.d.ts +0 -7
- package/dist/translator/stages/unwind-stage.d.ts.map +0 -1
- package/dist/translator/stages/unwind-stage.js +0 -61
- package/dist/translator/stages/unwind-stage.js.map +0 -1
- package/dist/translator/stages/vector-search-stage.d.ts +0 -53
- package/dist/translator/stages/vector-search-stage.d.ts.map +0 -1
- package/dist/translator/stages/vector-search-stage.js +0 -62
- package/dist/translator/stages/vector-search-stage.js.map +0 -1
- package/dist/translator/update-translator.d.ts +0 -148
- package/dist/translator/update-translator.d.ts.map +0 -1
- package/dist/translator/update-translator.js +0 -819
- package/dist/translator/update-translator.js.map +0 -1
- package/dist/translator/vector-translator.d.ts +0 -89
- package/dist/translator/vector-translator.d.ts.map +0 -1
- package/dist/translator/vector-translator.js +0 -106
- package/dist/translator/vector-translator.js.map +0 -1
- package/dist/types/env.d.ts +0 -31
- package/dist/types/env.d.ts.map +0 -1
- package/dist/types/env.js +0 -5
- package/dist/types/env.js.map +0 -1
- package/dist/types/function.d.ts +0 -65
- package/dist/types/function.d.ts.map +0 -1
- package/dist/types/function.js +0 -5
- package/dist/types/function.js.map +0 -1
- package/dist/types/index.d.ts +0 -137
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -13
- package/dist/types/index.js.map +0 -1
- package/dist/types/mongodb.d.ts +0 -258
- package/dist/types/mongodb.d.ts.map +0 -1
- package/dist/types/mongodb.js +0 -5
- package/dist/types/mongodb.js.map +0 -1
- package/dist/types/objectid.d.ts +0 -130
- package/dist/types/objectid.d.ts.map +0 -1
- package/dist/types/objectid.js +0 -314
- package/dist/types/objectid.js.map +0 -1
- package/dist/types/rpc.d.ts +0 -313
- package/dist/types/rpc.d.ts.map +0 -1
- package/dist/types/rpc.js +0 -136
- package/dist/types/rpc.js.map +0 -1
- package/dist/types/vectorize.d.ts +0 -136
- package/dist/types/vectorize.d.ts.map +0 -1
- package/dist/types/vectorize.js +0 -8
- package/dist/types/vectorize.js.map +0 -1
- package/dist/utils/sql-safety.d.ts +0 -64
- package/dist/utils/sql-safety.d.ts.map +0 -1
- package/dist/utils/sql-safety.js +0 -112
- package/dist/utils/sql-safety.js.map +0 -1
- package/dist/validation/document-validator.d.ts +0 -195
- package/dist/validation/document-validator.d.ts.map +0 -1
- package/dist/validation/document-validator.js +0 -529
- package/dist/validation/document-validator.js.map +0 -1
- package/dist/vectorize/document-serializer.d.ts +0 -119
- package/dist/vectorize/document-serializer.d.ts.map +0 -1
- package/dist/vectorize/document-serializer.js +0 -320
- package/dist/vectorize/document-serializer.js.map +0 -1
- package/dist/wire/auth/index.d.ts +0 -5
- package/dist/wire/auth/index.d.ts.map +0 -1
- package/dist/wire/auth/index.js +0 -5
- package/dist/wire/auth/index.js.map +0 -1
- package/dist/wire/auth/scram.d.ts +0 -160
- package/dist/wire/auth/scram.d.ts.map +0 -1
- package/dist/wire/auth/scram.js +0 -425
- package/dist/wire/auth/scram.js.map +0 -1
- package/dist/wire/backend/interface.d.ts +0 -168
- package/dist/wire/backend/interface.d.ts.map +0 -1
- package/dist/wire/backend/interface.js +0 -10
- package/dist/wire/backend/interface.js.map +0 -1
- package/dist/wire/backend/local-sqlite.d.ts +0 -89
- package/dist/wire/backend/local-sqlite.d.ts.map +0 -1
- package/dist/wire/backend/local-sqlite.js +0 -1002
- package/dist/wire/backend/local-sqlite.js.map +0 -1
- package/dist/wire/backend/query-router.d.ts +0 -197
- package/dist/wire/backend/query-router.d.ts.map +0 -1
- package/dist/wire/backend/query-router.js +0 -590
- package/dist/wire/backend/query-router.js.map +0 -1
- package/dist/wire/backend/validation.d.ts +0 -26
- package/dist/wire/backend/validation.d.ts.map +0 -1
- package/dist/wire/backend/validation.js +0 -79
- package/dist/wire/backend/validation.js.map +0 -1
- package/dist/wire/backend/workers-proxy.d.ts +0 -95
- package/dist/wire/backend/workers-proxy.d.ts.map +0 -1
- package/dist/wire/backend/workers-proxy.js +0 -429
- package/dist/wire/backend/workers-proxy.js.map +0 -1
- package/dist/wire/commands/admin.d.ts +0 -49
- package/dist/wire/commands/admin.d.ts.map +0 -1
- package/dist/wire/commands/admin.js +0 -272
- package/dist/wire/commands/admin.js.map +0 -1
- package/dist/wire/commands/aggregate.d.ts +0 -15
- package/dist/wire/commands/aggregate.d.ts.map +0 -1
- package/dist/wire/commands/aggregate.js +0 -98
- package/dist/wire/commands/aggregate.js.map +0 -1
- package/dist/wire/commands/auth.d.ts +0 -58
- package/dist/wire/commands/auth.d.ts.map +0 -1
- package/dist/wire/commands/auth.js +0 -158
- package/dist/wire/commands/auth.js.map +0 -1
- package/dist/wire/commands/crud.d.ts +0 -49
- package/dist/wire/commands/crud.d.ts.map +0 -1
- package/dist/wire/commands/crud.js +0 -336
- package/dist/wire/commands/crud.js.map +0 -1
- package/dist/wire/commands/hello.d.ts +0 -35
- package/dist/wire/commands/hello.d.ts.map +0 -1
- package/dist/wire/commands/hello.js +0 -204
- package/dist/wire/commands/hello.js.map +0 -1
- package/dist/wire/commands/index.d.ts +0 -24
- package/dist/wire/commands/index.d.ts.map +0 -1
- package/dist/wire/commands/index.js +0 -145
- package/dist/wire/commands/index.js.map +0 -1
- package/dist/wire/commands/router.d.ts +0 -46
- package/dist/wire/commands/router.d.ts.map +0 -1
- package/dist/wire/commands/router.js +0 -151
- package/dist/wire/commands/router.js.map +0 -1
- package/dist/wire/commands/types.d.ts +0 -51
- package/dist/wire/commands/types.d.ts.map +0 -1
- package/dist/wire/commands/types.js +0 -15
- package/dist/wire/commands/types.js.map +0 -1
- package/dist/wire/index.d.ts +0 -15
- package/dist/wire/index.d.ts.map +0 -1
- package/dist/wire/index.js +0 -19
- package/dist/wire/index.js.map +0 -1
- package/dist/wire/message.d.ts +0 -49
- package/dist/wire/message.d.ts.map +0 -1
- package/dist/wire/message.js +0 -299
- package/dist/wire/message.js.map +0 -1
- package/dist/wire/server.d.ts +0 -145
- package/dist/wire/server.d.ts.map +0 -1
- package/dist/wire/server.js +0 -284
- package/dist/wire/server.js.map +0 -1
- package/dist/wire/types.d.ts +0 -140
- package/dist/wire/types.d.ts.map +0 -1
- package/dist/wire/types.js +0 -64
- package/dist/wire/types.js.map +0 -1
- package/dist/worker.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAYxC,uCAAuC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,6CAA6C;AAC7C,OAAO;AACL,0BAA0B;AAC1B,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,mBAAmB;AACnB,2BAA2B;AAC3B,WAAW,GACZ,MAAM,aAAa,CAAC;AA0CrB,qCAAqC;AACrC,OAAO,EACL,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAK1B,uBAAuB;AACvB,OAAO,EACL,SAAS,EACT,WAAW,EACX,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,UAAU,EACV,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAQjC,6BAA6B;AAC7B,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"sources":["../src/rpc/rpc-target.ts","../src/types/objectid.ts","../src/durable-object/migrations.ts","../src/durable-object/schema.ts","../src/executor/function-executor.ts","../src/utils/sql-safety.ts","../src/translator/dialect.ts","../src/translator/stages/expression-translator.ts","../src/translator/query-translator.ts","../src/translator/stages/match-stage.ts","../src/translator/stages/project-stage.ts","../src/translator/stages/group-stage.ts","../src/translator/stages/sort-stage.ts","../src/translator/stages/limit-stage.ts","../src/translator/stages/skip-stage.ts","../src/translator/stages/count-stage.ts","../src/translator/stages/lookup-stage.ts","../src/translator/stages/unwind-stage.ts","../src/translator/stages/add-fields-stage.ts","../src/translator/stages/bucket-stage.ts","../src/translator/stages/facet-stage.ts","../src/translator/search-translator.ts","../src/translator/stages/search-stage.ts","../src/translator/stages/optimizer.ts","../src/translator/aggregation-translator.ts","../src/executor/aggregation-executor.ts","../src/mcp/server.ts","../src/mcp/transport/http.ts","../src/durable-object/mcp-handler.ts","../src/durable-object/mondo-database.ts","../src/durable-object/index-manager.ts","../src/client/cursor.ts","../src/client/bulk-write.ts","../src/client/change-stream.ts","../src/client/aggregation-cursor.ts","../src/client/mongo-collection.ts","../src/types/rpc.ts","../src/index.ts","../src/rpc/rpc-client.ts","../src/rpc/worker-entrypoint.ts"],"names":["req","result","typeCheck","matchExpr","spaceIdx","term","selectParts","cteExpression","sql","name","state","MessageType","errorResponse","DEFAULT_OPTIONS","newWorkersRpcResponse"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RPC Target - Server-side RPC handler for capnweb-style Workers RPC\n *\n * Implements:\n * - MondoRpcTarget extending RpcTarget base class\n * - Request routing to Durable Object stubs\n * - HTTP batch protocol support\n * - Promise pipelining for chained operations\n */\n\nimport type {\n DurableObjectNamespace,\n DurableObjectId,\n DurableObjectStub,\n MondoEnv,\n RpcRequest,\n RpcResponse,\n BatchResponse,\n DatabaseRef,\n CollectionRef,\n BatchedExecutorOptions,\n PipelineOp,\n} from '../types/rpc'\n\n// Re-export types for backward compatibility\nexport type {\n DurableObjectNamespace,\n DurableObjectId,\n DurableObjectStub,\n MondoEnv,\n RpcRequest,\n RpcResponse,\n BatchResponse,\n DatabaseRef,\n CollectionRef,\n BatchedExecutorOptions,\n PipelineOp,\n}\n\n// ============================================================================\n// RpcTarget Base Class\n// ============================================================================\n\n/**\n * Base class for RPC targets (capnweb-style)\n */\nexport class RpcTarget {\n protected methods: Map<string, (...args: unknown[]) => Promise<unknown>> = new Map();\n\n /**\n * Allowlist of methods that can be invoked via RPC.\n * Subclasses should override this to define their allowed methods.\n * This prevents invocation of inherited methods like constructor, __proto__, toString, etc.\n */\n protected allowedMethods: Set<string> = new Set();\n\n /**\n * Register a method handler\n */\n protected registerMethod(name: string, handler: (...args: unknown[]) => Promise<unknown>): void {\n this.methods.set(name, handler);\n }\n\n /**\n * Check if a method exists and is allowed\n */\n hasMethod(name: string): boolean {\n // Only return true if the method is in the allowlist or registered methods\n if (this.methods.has(name)) {\n return true;\n }\n if (this.allowedMethods.has(name) && typeof (this as Record<string, unknown>)[name] === 'function') {\n return true;\n }\n return false;\n }\n\n /**\n * Invoke a method by name\n */\n async invoke(method: string, params: unknown[]): Promise<unknown> {\n // First check registered methods (these are always allowed)\n const handler = this.methods.get(method);\n if (handler) {\n return handler.apply(this, params);\n }\n\n // For class methods, enforce the allowlist to prevent prototype pollution\n // and invocation of inherited methods like constructor, __proto__, toString, etc.\n if (!this.allowedMethods.has(method)) {\n throw new Error(`Method not allowed: ${method}`);\n }\n\n // Then check class methods\n const fn = (this as Record<string, unknown>)[method];\n if (typeof fn === 'function') {\n return (fn as (...args: unknown[]) => Promise<unknown>).apply(this, params);\n }\n\n throw new Error(`Method not found: ${method}`);\n }\n}\n\n// ============================================================================\n// MondoRpcTarget - MongoDB API over RPC\n// ============================================================================\n\n/**\n * MondoRpcTarget provides MongoDB-compatible API via Workers RPC\n */\nexport class MondoRpcTarget extends RpcTarget {\n private env: MondoEnv;\n private currentConnectionString: string | null = null;\n private databases: Map<string, DatabaseRef> = new Map();\n\n /**\n * Explicit allowlist of methods that can be invoked via RPC.\n * This prevents invocation of inherited methods like constructor, __proto__, toString, etc.\n */\n protected override allowedMethods = new Set([\n 'connect',\n 'db',\n 'collection',\n 'find',\n 'insertOne',\n 'updateOne',\n 'deleteOne',\n ]);\n\n constructor(env: MondoEnv) {\n super();\n this.env = env;\n }\n\n /**\n * Connect to a MongoDB-compatible connection string\n */\n async connect(connectionString: string): Promise<{ connected: boolean; database?: string }> {\n this.currentConnectionString = connectionString;\n\n // Parse connection string to extract database name\n const url = new URL(connectionString.replace('mongodb://', 'http://'));\n const dbName = url.pathname.slice(1) || 'default';\n\n // Get or create the Durable Object stub for this database\n const id = this.env.MONDO_DATABASE.idFromName(dbName);\n const stub = this.env.MONDO_DATABASE.get(id);\n\n this.databases.set(dbName, { name: dbName, stub });\n\n return { connected: true, database: dbName };\n }\n\n /**\n * Get the current connection string\n */\n get connectionString(): string | null {\n return this.currentConnectionString;\n }\n\n /**\n * Get a database reference\n */\n async db(name: string): Promise<DatabaseRef> {\n // Check if we already have this database\n let dbRef = this.databases.get(name);\n\n if (!dbRef) {\n // Create new Durable Object stub for this database\n const id = this.env.MONDO_DATABASE.idFromName(name);\n const stub = this.env.MONDO_DATABASE.get(id);\n dbRef = { name, stub };\n this.databases.set(name, dbRef);\n }\n\n return dbRef;\n }\n\n /**\n * Get a collection reference\n */\n async collection(dbName: string, collectionName: string): Promise<CollectionRef> {\n const dbRef = await this.db(dbName);\n return {\n dbName,\n collectionName,\n stub: dbRef.stub,\n };\n }\n\n /**\n * Execute a find operation\n */\n async find(dbName: string, collectionName: string, query: Record<string, unknown>): Promise<unknown[]> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/find', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, query }),\n });\n return response.json();\n }\n\n /**\n * Execute an insertOne operation\n */\n async insertOne(dbName: string, collectionName: string, document: Record<string, unknown>): Promise<{ insertedId: string }> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/insertOne', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, document }),\n });\n return response.json();\n }\n\n /**\n * Execute an updateOne operation\n */\n async updateOne(dbName: string, collectionName: string, filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{ matchedCount: number; modifiedCount: number }> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/updateOne', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, filter, update }),\n });\n return response.json();\n }\n\n /**\n * Execute a deleteOne operation\n */\n async deleteOne(dbName: string, collectionName: string, filter: Record<string, unknown>): Promise<{ deletedCount: number }> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/deleteOne', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, filter }),\n });\n return response.json();\n }\n}\n\n// ============================================================================\n// Workers RPC Response Handler\n// ============================================================================\n\n/**\n * Create a Workers RPC response from a target and request\n */\nexport async function newWorkersRpcResponse(target: RpcTarget, request: Request): Promise<Response> {\n const url = new URL(request.url);\n const isBatch = url.pathname.endsWith('/batch');\n\n try {\n const body = await request.json() as RpcRequest | RpcRequest[];\n\n if (isBatch && Array.isArray(body)) {\n // Handle batch requests\n const results = await Promise.all(\n body.map(async (req) => {\n try {\n const result = await target.invoke(req.method, req.params);\n return { id: req.id, result };\n } catch (error) {\n return {\n id: req.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n })\n );\n\n return new Response(JSON.stringify({ results }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Handle single request\n const req = body as RpcRequest;\n\n if (!target.hasMethod(req.method)) {\n return new Response(\n JSON.stringify({ error: `Method not found: ${req.method}` }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n const result = await target.invoke(req.method, req.params);\n\n return new Response(JSON.stringify({ id: req.id, result }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n return new Response(\n JSON.stringify({\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n}\n\n// ============================================================================\n// Batched RPC Executor\n// ============================================================================\n\n/**\n * Batched RPC executor that coalesces multiple requests\n */\nexport class BatchedRpcExecutor {\n private stub: DurableObjectStub;\n private options: Required<BatchedExecutorOptions>;\n private queue: Array<{\n method: string;\n params: Record<string, unknown>;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n }> = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(stub: DurableObjectStub, options: BatchedExecutorOptions = {}) {\n this.stub = stub;\n this.options = {\n maxBatchSize: options.maxBatchSize ?? 100,\n flushInterval: options.flushInterval ?? 10,\n };\n }\n\n /**\n * Execute a method with batching\n */\n execute(method: string, params: Record<string, unknown>): Promise<unknown> {\n return new Promise((resolve, reject) => {\n this.queue.push({ method, params, resolve, reject });\n\n // Auto-flush when batch size is reached\n if (this.queue.length >= this.options.maxBatchSize) {\n this.flush();\n } else if (!this.flushTimer) {\n // Schedule flush after interval\n this.flushTimer = setTimeout(() => this.flush(), this.options.flushInterval);\n }\n });\n }\n\n /**\n * Flush pending requests\n */\n async flush(): Promise<void> {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n // Process in batches\n while (this.queue.length > 0) {\n const batch = this.queue.splice(0, this.options.maxBatchSize);\n\n try {\n const response = await this.stub.fetch('http://internal/batch', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch.map((item, index) => ({\n id: String(index),\n method: item.method,\n params: item.params,\n }))),\n });\n\n const { results } = await response.json() as BatchResponse;\n\n batch.forEach((item, index) => {\n const result = results[index];\n if (result) {\n if (result.error) {\n item.reject(new Error(result.error));\n } else {\n item.resolve(result.result);\n }\n } else {\n item.reject(new Error('Missing result for batch item'));\n }\n });\n } catch (error) {\n // Reject all items in the batch\n batch.forEach((item) => {\n item.reject(error instanceof Error ? error : new Error('Unknown error'));\n });\n }\n }\n }\n}\n\n// ============================================================================\n// Promise Pipelining\n// ============================================================================\n\nlet pipelineOpIdCounter = 0;\n\n/**\n * Pipeline tracker for chained operations\n */\nexport class PipelineTracker {\n private operations: Map<string, PipelineOp> = new Map();\n private dependencyGraph: Map<string, Set<string>> = new Map();\n\n /**\n * Track a new operation\n */\n track(method: string, params: unknown[], dependency?: string): string {\n const id = `op-${++pipelineOpIdCounter}`;\n\n const dependencies: string[] = [];\n if (dependency) {\n dependencies.push(dependency);\n // Also add transitive dependencies\n const transitive = this.dependencyGraph.get(dependency);\n if (transitive) {\n dependencies.push(...transitive);\n }\n }\n\n this.operations.set(id, { id, method, params, dependencies });\n this.dependencyGraph.set(id, new Set(dependencies));\n\n return id;\n }\n\n /**\n * Get all dependencies for an operation\n */\n getDependencies(opId: string): string[] {\n return Array.from(this.dependencyGraph.get(opId) || []);\n }\n\n /**\n * Get operation by ID\n */\n getOperation(opId: string): PipelineOp | undefined {\n return this.operations.get(opId);\n }\n\n /**\n * Get all operations in dependency order\n */\n getOrderedOperations(): PipelineOp[] {\n const ordered: PipelineOp[] = [];\n const visited = new Set<string>();\n\n const visit = (id: string) => {\n if (visited.has(id)) return;\n visited.add(id);\n\n const op = this.operations.get(id);\n if (!op) return;\n\n op.dependencies.forEach(depId => visit(depId));\n ordered.push(op);\n };\n\n this.operations.forEach((_, id) => visit(id));\n return ordered;\n }\n}\n\n/**\n * Pipelined RPC proxy for chained method calls\n */\nexport class PipelinedRpcProxy {\n private target: MondoRpcTarget;\n private tracker: PipelineTracker;\n private currentDb: string | null = null;\n private currentCollection: string | null = null;\n\n constructor(target: MondoRpcTarget) {\n this.target = target;\n this.tracker = new PipelineTracker();\n }\n\n /**\n * Get a database reference (pipelined)\n */\n db(name: string): PipelinedDbProxy {\n const opId = this.tracker.track('db', [name]);\n this.currentDb = name;\n return new PipelinedDbProxy(this, name, opId);\n }\n\n /**\n * Execute the pipelined operations\n */\n async execute(): Promise<unknown> {\n if (!this.currentDb) {\n throw new Error('No database selected');\n }\n return this.target.db(this.currentDb);\n }\n\n /**\n * Get the underlying target\n */\n getTarget(): MondoRpcTarget {\n return this.target;\n }\n\n /**\n * Get current database name\n */\n getCurrentDb(): string | null {\n return this.currentDb;\n }\n\n /**\n * Get current collection name\n */\n getCurrentCollection(): string | null {\n return this.currentCollection;\n }\n\n /**\n * Set current collection\n */\n setCurrentCollection(name: string): void {\n this.currentCollection = name;\n }\n}\n\n/**\n * Pipelined database proxy\n */\nclass PipelinedDbProxy {\n private parent: PipelinedRpcProxy;\n private dbName: string;\n private operationId: string;\n\n constructor(parent: PipelinedRpcProxy, dbName: string, opId: string) {\n this.parent = parent;\n this.dbName = dbName;\n this.operationId = opId;\n }\n\n /**\n * Get the operation ID\n */\n get opId(): string {\n return this.operationId;\n }\n\n /**\n * Get a collection reference (pipelined)\n */\n collection(name: string): PipelinedCollectionProxy {\n this.parent.setCurrentCollection(name);\n return new PipelinedCollectionProxy(this.parent, this.dbName, name);\n }\n}\n\n/**\n * Pipelined collection proxy\n */\nclass PipelinedCollectionProxy {\n private parent: PipelinedRpcProxy;\n private dbName: string;\n private collectionName: string;\n\n constructor(parent: PipelinedRpcProxy, dbName: string, collectionName: string) {\n this.parent = parent;\n this.dbName = dbName;\n this.collectionName = collectionName;\n }\n\n /**\n * Find documents (executes the pipeline)\n */\n async find(query: Record<string, unknown>): Promise<unknown[]> {\n return this.parent.getTarget().find(this.dbName, this.collectionName, query);\n }\n\n /**\n * Insert one document\n */\n async insertOne(document: Record<string, unknown>): Promise<{ insertedId: string }> {\n return this.parent.getTarget().insertOne(this.dbName, this.collectionName, document);\n }\n\n /**\n * Update one document\n */\n async updateOne(filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{ matchedCount: number; modifiedCount: number }> {\n return this.parent.getTarget().updateOne(this.dbName, this.collectionName, filter, update);\n }\n\n /**\n * Delete one document\n */\n async deleteOne(filter: Record<string, unknown>): Promise<{ deletedCount: number }> {\n return this.parent.getTarget().deleteOne(this.dbName, this.collectionName, filter);\n }\n}\n","/**\n * ObjectId - MongoDB-compatible 12-byte unique identifier\n *\n * Structure (12 bytes = 24 hex characters):\n * - 4 bytes: Unix timestamp (seconds since epoch)\n * - 5 bytes: Random value (generated once per process)\n * - 3 bytes: Incrementing counter (initialized to random value)\n *\n * Compatible with MongoDB BSON ObjectId specification.\n */\n\n// Pre-computed hex lookup table for fast byte-to-hex conversion\nconst HEX_LOOKUP: string[] = Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n)\n\n// Pre-computed hex char to nibble map for fast hex-to-byte conversion\nconst HEX_CHAR_TO_NIBBLE: Record<string, number> = {}\nfor (let i = 0; i < 16; i++) {\n const hex = i.toString(16)\n HEX_CHAR_TO_NIBBLE[hex] = i\n HEX_CHAR_TO_NIBBLE[hex.toUpperCase()] = i\n}\n\n// Regex pattern for validation (compiled once)\nconst OBJECTID_PATTERN = /^[0-9a-fA-F]{24}$/\n\n/**\n * Process-level state for ObjectId generation\n */\nclass ObjectIdState {\n private randomBytes: Uint8Array | null = null\n private counter: number\n\n constructor() {\n // Initialize counter to random value\n this.counter = Math.floor(Math.random() * 0xffffff)\n }\n\n getRandomBytes(): Uint8Array {\n if (!this.randomBytes) {\n this.randomBytes = new Uint8Array(5)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(this.randomBytes)\n } else {\n // Fallback for environments without Web Crypto API\n for (let i = 0; i < 5; i++) {\n this.randomBytes[i] = Math.floor(Math.random() * 256)\n }\n }\n }\n return this.randomBytes\n }\n\n getNextCounter(): number {\n const value = this.counter\n this.counter = (this.counter + 1) & 0xffffff // Wrap at 24 bits\n return value\n }\n}\n\n// Singleton state instance\nconst state = new ObjectIdState()\n\n/**\n * Fast bytes to hex conversion using lookup table\n */\nfunction bytesToHex(bytes: Uint8Array): string {\n let result = ''\n for (let i = 0; i < bytes.length; i++) {\n result += HEX_LOOKUP[bytes[i]]\n }\n return result\n}\n\n/**\n * Fast hex to bytes conversion using nibble map\n */\nfunction hexToBytes(hex: string): Uint8Array {\n const len = hex.length >> 1\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n const hi = HEX_CHAR_TO_NIBBLE[hex[i * 2]]\n const lo = HEX_CHAR_TO_NIBBLE[hex[i * 2 + 1]]\n bytes[i] = (hi << 4) | lo\n }\n return bytes\n}\n\n/**\n * Write a 32-bit integer as 4 big-endian bytes\n */\nfunction writeUInt32BE(buffer: Uint8Array, value: number, offset: number): void {\n buffer[offset] = (value >>> 24) & 0xff\n buffer[offset + 1] = (value >>> 16) & 0xff\n buffer[offset + 2] = (value >>> 8) & 0xff\n buffer[offset + 3] = value & 0xff\n}\n\n/**\n * Read 4 big-endian bytes as a 32-bit unsigned integer\n */\nfunction readUInt32BE(buffer: Uint8Array, offset: number): number {\n return (\n ((buffer[offset] << 24) |\n (buffer[offset + 1] << 16) |\n (buffer[offset + 2] << 8) |\n buffer[offset + 3]) >>>\n 0\n )\n}\n\n/**\n * Type guard for ObjectId-like values\n */\nexport type ObjectIdLike = ObjectId | string | Uint8Array\n\n/**\n * Input types accepted by ObjectId constructor\n */\nexport type ObjectIdInput = ObjectIdLike | null | undefined\n\n/**\n * ObjectId class - MongoDB-compatible unique identifier\n *\n * @example\n * ```typescript\n * // Generate new ObjectId\n * const id = new ObjectId()\n *\n * // Create from hex string\n * const id2 = ObjectId.createFromHexString('507f1f77bcf86cd799439011')\n *\n * // Get timestamp\n * const timestamp = id.getTimestamp()\n *\n * // Compare ObjectIds\n * id.equals(id2) // false\n * ```\n */\nexport class ObjectId {\n /** BSON type identifier for serialization compatibility */\n readonly _bsontype = 'ObjectId' as const\n\n /** The raw 12-byte buffer containing the ObjectId data */\n readonly id: Uint8Array\n\n /** Cached hex string representation (computed lazily) */\n private _hexString: string | null = null\n\n /**\n * Create a new ObjectId\n *\n * @param input - Optional: hex string, Uint8Array, or another ObjectId.\n * If omitted, generates a new unique ObjectId.\n * @throws {TypeError} If input is invalid\n */\n constructor(input?: ObjectIdInput) {\n if (input === undefined || input === null) {\n this.id = this.generate()\n } else if (typeof input === 'string') {\n if (!ObjectId.isValidHex(input)) {\n throw new TypeError(\n `Invalid ObjectId hex string: \"${input}\". Must be 24 hex characters.`\n )\n }\n this.id = hexToBytes(input.toLowerCase())\n this._hexString = input.toLowerCase()\n } else if (input instanceof Uint8Array) {\n if (input.length !== 12) {\n throw new TypeError(\n `ObjectId buffer must be exactly 12 bytes, received ${input.length}`\n )\n }\n this.id = new Uint8Array(input)\n } else if (input instanceof ObjectId) {\n this.id = new Uint8Array(input.id)\n this._hexString = input._hexString\n } else {\n throw new TypeError(\n `Invalid ObjectId input type. Expected string, Uint8Array, or ObjectId.`\n )\n }\n }\n\n /**\n * Generate a new 12-byte ObjectId buffer\n * Structure: 4-byte timestamp | 5-byte random | 3-byte counter\n */\n private generate(): Uint8Array {\n const buffer = new Uint8Array(12)\n\n // 4 bytes: Unix timestamp in seconds (big-endian)\n const timestamp = Math.floor(Date.now() / 1000)\n writeUInt32BE(buffer, timestamp, 0)\n\n // 5 bytes: Random value (cached per process)\n const randomBytes = state.getRandomBytes()\n buffer.set(randomBytes, 4)\n\n // 3 bytes: Incrementing counter (big-endian, 24-bit)\n const counterValue = state.getNextCounter()\n buffer[9] = (counterValue >>> 16) & 0xff\n buffer[10] = (counterValue >>> 8) & 0xff\n buffer[11] = counterValue & 0xff\n\n return buffer\n }\n\n /**\n * Get the timestamp component of this ObjectId as a Date\n *\n * @returns Date object representing when this ObjectId was generated\n */\n getTimestamp(): Date {\n const seconds = readUInt32BE(this.id, 0)\n return new Date(seconds * 1000)\n }\n\n /**\n * Get the generation time as Unix timestamp (seconds)\n */\n getGenerationTime(): number {\n return readUInt32BE(this.id, 0)\n }\n\n /**\n * Return the ObjectId as a 24-character lowercase hex string\n */\n toHexString(): string {\n if (!this._hexString) {\n this._hexString = bytesToHex(this.id)\n }\n return this._hexString\n }\n\n /**\n * String representation of the ObjectId (same as toHexString)\n */\n toString(): string {\n return this.toHexString()\n }\n\n /**\n * JSON serialization - returns hex string\n * This allows ObjectIds to serialize naturally in JSON.stringify()\n */\n toJSON(): string {\n return this.toHexString()\n }\n\n /**\n * Compare this ObjectId to another value for equality\n *\n * @param other - ObjectId, hex string, or null/undefined to compare\n * @returns true if the ObjectIds are equal, false otherwise\n */\n equals(other: ObjectId | string | null | undefined): boolean {\n if (other === null || other === undefined) {\n return false\n }\n\n if (other instanceof ObjectId) {\n // Fast path: compare bytes directly if hex strings are cached\n if (this._hexString && other._hexString) {\n return this._hexString === other._hexString\n }\n // Compare bytes\n for (let i = 0; i < 12; i++) {\n if (this.id[i] !== other.id[i]) {\n return false\n }\n }\n return true\n }\n\n // Compare with string\n return this.toHexString() === other.toLowerCase()\n }\n\n /**\n * Primitive value conversion (returns hex string)\n */\n valueOf(): string {\n return this.toHexString()\n }\n\n /**\n * Symbol.toStringTag for better debugging output\n */\n get [Symbol.toStringTag](): string {\n return 'ObjectId'\n }\n\n /**\n * Create custom inspect output for Node.js console\n */\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return `ObjectId(\"${this.toHexString()}\")`\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create an ObjectId from a 24-character hex string\n *\n * @param hexString - 24-character hex string\n * @returns New ObjectId instance\n * @throws {TypeError} If hexString is invalid\n */\n static createFromHexString(hexString: string): ObjectId {\n if (!ObjectId.isValidHex(hexString)) {\n throw new TypeError(\n `Invalid ObjectId hex string: \"${hexString}\". Must be 24 hex characters.`\n )\n }\n return new ObjectId(hexString)\n }\n\n /**\n * Create an ObjectId with a specific timestamp\n * Useful for range queries on _id fields\n *\n * @param time - Unix timestamp in seconds\n * @returns New ObjectId with the given timestamp and zeroed remaining bytes\n */\n static createFromTime(time: number): ObjectId {\n const buffer = new Uint8Array(12)\n writeUInt32BE(buffer, time, 0)\n // Remaining 8 bytes are already zero from Uint8Array initialization\n return new ObjectId(buffer)\n }\n\n /**\n * Generate a new ObjectId (factory method, equivalent to new ObjectId())\n *\n * @returns New unique ObjectId instance\n */\n static generate(): ObjectId {\n return new ObjectId()\n }\n\n /**\n * Check if a value is a valid ObjectId or ObjectId hex string\n *\n * @param value - Value to check\n * @returns true if valid ObjectId or 24-char hex string\n */\n static isValid(value: unknown): value is ObjectId | string {\n if (value instanceof ObjectId) {\n return true\n }\n if (typeof value === 'string') {\n return ObjectId.isValidHex(value)\n }\n return false\n }\n\n /**\n * Check if a string is a valid 24-character hex string\n */\n private static isValidHex(str: string): boolean {\n return (\n typeof str === 'string' && str.length === 24 && OBJECTID_PATTERN.test(str)\n )\n }\n}\n\nexport default ObjectId\n","/**\n * Schema Migrations for MondoDB\n *\n * This module contains all schema migrations in a separate, organized structure.\n * Each migration is a function that transforms the database from one version to the next.\n */\n\nimport type { DurableObjectStorage } from './schema';\n\n/**\n * Migration function signature\n */\nexport type Migration = {\n version: number;\n description: string;\n up: (storage: DurableObjectStorage) => Promise<void>;\n down?: (storage: DurableObjectStorage) => Promise<void>;\n};\n\n/**\n * SQL statements for initial schema (v1)\n *\n * UNIFIED SCHEMA: This schema supports both MondoDatabase and IndexManager:\n * - collections table: stores collection metadata including indexes JSON\n * - documents table: stores documents with _id as the document identifier\n *\n * Both components import these definitions from schema.ts which re-exports them.\n */\nconst INITIAL_SCHEMA_SQL = {\n createCollections: `\n CREATE TABLE IF NOT EXISTS collections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n options TEXT DEFAULT '{}',\n indexes TEXT DEFAULT '[]',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `.trim(),\n\n createDocuments: `\n CREATE TABLE IF NOT EXISTS documents (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n _id TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(collection_id, _id),\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\n )\n `.trim(),\n\n createIdIndex: `\n CREATE INDEX IF NOT EXISTS idx_documents_id ON documents(_id)\n `.trim(),\n\n createCompositeIndex: `\n CREATE INDEX IF NOT EXISTS idx_documents_collection_id ON documents(collection_id, _id)\n `.trim(),\n};\n\n/**\n * All migrations in order\n */\nexport const migrations: Migration[] = [\n {\n version: 1,\n description: 'Initial schema - collections and documents tables',\n up: async (storage: DurableObjectStorage) => {\n // Create tables\n storage.sql.exec(INITIAL_SCHEMA_SQL.createCollections);\n storage.sql.exec(INITIAL_SCHEMA_SQL.createDocuments);\n\n // Create indexes for optimized queries\n storage.sql.exec(INITIAL_SCHEMA_SQL.createIdIndex);\n storage.sql.exec(INITIAL_SCHEMA_SQL.createCompositeIndex);\n },\n down: async (storage: DurableObjectStorage) => {\n // Drop in reverse order\n storage.sql.exec('DROP INDEX IF EXISTS idx_documents_collection_id');\n storage.sql.exec('DROP INDEX IF EXISTS idx_documents_id');\n storage.sql.exec('DROP TABLE IF EXISTS documents');\n storage.sql.exec('DROP TABLE IF EXISTS collections');\n },\n },\n];\n\n/**\n * Get migration by version number\n */\nexport function getMigration(version: number): Migration | undefined {\n return migrations.find((m) => m.version === version);\n}\n\n/**\n * Get all migrations from a starting version to an ending version\n */\nexport function getMigrationsInRange(\n fromVersion: number,\n toVersion: number\n): Migration[] {\n return migrations.filter(\n (m) => m.version > fromVersion && m.version <= toVersion\n );\n}\n\n/**\n * Get the latest migration version\n */\nexport function getLatestVersion(): number {\n if (migrations.length === 0) return 0;\n return Math.max(...migrations.map((m) => m.version));\n}\n\n/**\n * Validate migration sequence - ensures no gaps in version numbers\n */\nexport function validateMigrations(): { valid: boolean; error?: string } {\n if (migrations.length === 0) {\n return { valid: true };\n }\n\n const sortedVersions = [...migrations].sort((a, b) => a.version - b.version);\n\n // Check for duplicates\n const seen = new Set<number>();\n for (const migration of sortedVersions) {\n if (seen.has(migration.version)) {\n return {\n valid: false,\n error: `Duplicate migration version: ${migration.version}`,\n };\n }\n seen.add(migration.version);\n }\n\n // Check for gaps (starting from 1)\n for (let i = 0; i < sortedVersions.length; i++) {\n const migration = sortedVersions[i];\n if (migration && migration.version !== i + 1) {\n return {\n valid: false,\n error: `Missing migration version: ${i + 1}`,\n };\n }\n }\n\n return { valid: true };\n}\n","/**\n * SQLite Schema Management for MondoDB\n *\n * This module handles the initialization and management of SQLite tables\n * for MongoDB-compatible document storage in Cloudflare Durable Objects.\n *\n * UNIFIED SCHEMA TYPES:\n * This module serves as the single source of truth for all schema-related types\n * used by both IndexManager and MondoDatabase.\n */\n\nimport {\n migrations,\n getMigrationsInRange,\n getLatestVersion,\n validateMigrations,\n} from './migrations';\n\n// Re-export common types from src/types for convenience\nexport type {\n IndexSpec,\n IndexInfo,\n CreateIndexOptions,\n CreateIndexResult,\n DropIndexResult,\n Document,\n InsertOneResult,\n InsertManyResult,\n DeleteResult,\n UpdateResult,\n FindOptions,\n CollectionMetadata,\n} from '../types';\n\n/**\n * Current schema version - derived from migrations module\n */\nexport const SCHEMA_VERSION = getLatestVersion();\n\n/**\n * Schema key used for storing version in Durable Object storage\n */\nexport const SCHEMA_VERSION_KEY = 'schema_version';\n\n/**\n * Table definitions for the schema (exported for reference/testing)\n *\n * UNIFIED SCHEMA: This schema supports both MondoDatabase and IndexManager:\n * - collections table: stores collection metadata including indexes JSON\n * - documents table: stores documents with _id as the document identifier\n *\n * Note: The actual table creation is handled by migrations.ts.\n * These definitions are kept in sync for reference and testing.\n */\nexport const SCHEMA_TABLES = {\n collections: {\n name: 'collections',\n sql: `\n CREATE TABLE IF NOT EXISTS collections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n options TEXT DEFAULT '{}',\n indexes TEXT DEFAULT '[]',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `.trim(),\n },\n documents: {\n name: 'documents',\n sql: `\n CREATE TABLE IF NOT EXISTS documents (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n _id TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(collection_id, _id),\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\n )\n `.trim(),\n },\n} as const;\n\n/**\n * Index definitions for optimized queries\n */\nexport const SCHEMA_INDEXES = {\n documents_id: {\n name: 'idx_documents_id',\n sql: `CREATE INDEX IF NOT EXISTS idx_documents_id ON documents(_id)`,\n },\n documents_collection_id: {\n name: 'idx_documents_collection_id',\n sql: `CREATE INDEX IF NOT EXISTS idx_documents_collection_id ON documents(collection_id, _id)`,\n },\n} as const;\n\n// ============================================================================\n// UNIFIED SQL STORAGE INTERFACES\n// ============================================================================\n// These interfaces are used by both IndexManager and MondoDatabase to interact\n// with SQLite storage. The two styles (prepared statements vs exec) are both\n// supported to accommodate different use cases.\n\n/**\n * Interface for SQL query result with parameter binding\n * Used by MondoDatabase with Cloudflare's native SQL interface\n */\nexport interface SqlQueryResult {\n toArray(): unknown[];\n run(): void;\n bind(...params: unknown[]): SqlQueryResult;\n}\n\n/**\n * Interface for Cloudflare Durable Object SQL storage\n * Used by MondoDatabase for direct SQL execution\n */\nexport interface SqlStorage {\n exec(sql: string, ...params: unknown[]): SqlQueryResult;\n}\n\n/**\n * Interface for Cloudflare Durable Object storage\n * Used by MondoDatabase and SchemaManager\n */\nexport interface DurableObjectStorage {\n sql: SqlStorage;\n get<T>(key: string): Promise<T | undefined>;\n put(key: string, value: unknown): Promise<void>;\n /**\n * Execute a synchronous callback wrapped in a transaction.\n * If the callback throws, the transaction is rolled back.\n * Only available for SQLite-backed Durable Objects.\n */\n transactionSync<T>(callback: () => T): T;\n}\n\n/**\n * Interface for SQL prepared statement\n * Used by IndexManager for prepared statement execution\n */\nexport interface SQLStatement {\n bind(...params: unknown[]): SQLStatement;\n run(): void;\n first<T = unknown>(): T | null;\n all<T = unknown>(): T[];\n}\n\n/**\n * Interface for SQLite-compatible storage with SQL execution\n * Used by IndexManager for prepared statement-based operations\n *\n * This is an alternative interface to DurableObjectStorage that provides\n * a prepare() method for creating prepared statements, which is useful\n * for operations that need to retrieve results or bind parameters.\n */\nexport interface SQLStorage {\n exec(sql: string): void;\n prepare(sql: string): SQLStatement;\n}\n\n// ============================================================================\n// TTL INDEX TYPES\n// ============================================================================\n// These types support Time-To-Live (TTL) indexes for automatic document expiration\n\n/**\n * TTL Index information with collection context\n */\nexport interface TTLIndexInfo {\n collectionName: string;\n collectionId: number;\n indexName: string;\n field: string;\n expireAfterSeconds: number;\n}\n\n/**\n * TTL metadata for tracking cleanup operations\n */\nexport interface TTLMetadata {\n field: string;\n expireAfterSeconds: number;\n lastCleanupAt?: string;\n lastCleanupCount?: number;\n}\n\n/**\n * Result of a TTL cleanup operation\n */\nexport interface TTLCleanupResult {\n ok: 1;\n collectionsProcessed: number;\n documentsDeleted: number;\n errors?: string[];\n}\n\n/**\n * Query info for deleting expired documents\n */\nexport interface ExpiredDocumentsQuery {\n sql: string;\n params: unknown[];\n}\n\n/**\n * Legacy migration type (kept for backwards compatibility)\n * @deprecated Use migrations module instead\n */\nexport type MigrationFn = (storage: DurableObjectStorage) => Promise<void>;\n\n/**\n * Legacy migration registry (kept for backwards compatibility)\n * @deprecated Use migrations module instead\n */\nexport const MIGRATIONS: Record<number, MigrationFn> = Object.fromEntries(\n migrations.map((m) => [m.version, m.up])\n);\n\n/**\n * Schema validation result\n */\nexport interface SchemaValidationResult {\n valid: boolean;\n missingTables: string[];\n missingIndexes: string[];\n errors: string[];\n}\n\n/**\n * Required tables for schema integrity\n */\nconst REQUIRED_TABLES = ['collections', 'documents'];\n\n/**\n * Required indexes for schema integrity\n */\nconst REQUIRED_INDEXES = ['idx_documents_id', 'idx_documents_collection_id'];\n\n/**\n * SchemaManager handles SQLite schema initialization and migrations\n */\nexport class SchemaManager {\n private storage: DurableObjectStorage;\n\n constructor(storage: DurableObjectStorage) {\n this.storage = storage;\n\n // Validate migrations on construction\n const validation = validateMigrations();\n if (!validation.valid) {\n throw new Error(`Invalid migrations: ${validation.error}`);\n }\n }\n\n /**\n * Initialize the schema, running migrations if needed\n */\n async initializeSchema(): Promise<void> {\n const currentVersion = await this.storage.get<number>(SCHEMA_VERSION_KEY);\n\n // Skip if already at current version\n if (currentVersion === SCHEMA_VERSION) {\n return;\n }\n\n const startVersion = currentVersion ?? 0;\n\n // Get and run all applicable migrations\n const migrationsToRun = getMigrationsInRange(startVersion, SCHEMA_VERSION);\n\n for (const migration of migrationsToRun) {\n await migration.up(this.storage);\n }\n\n // Update schema version\n await this.storage.put(SCHEMA_VERSION_KEY, SCHEMA_VERSION);\n }\n\n /**\n * Validate that the schema is properly initialized\n * Returns true if all required tables exist\n */\n async validateSchema(): Promise<boolean> {\n const result = await this.validateSchemaDetailed();\n return result.valid;\n }\n\n /**\n * Detailed schema validation with specific error information\n */\n async validateSchemaDetailed(): Promise<SchemaValidationResult> {\n const result: SchemaValidationResult = {\n valid: true,\n missingTables: [],\n missingIndexes: [],\n errors: [],\n };\n\n try {\n // Check for required tables\n const tablesResult = this.storage.sql.exec(\n `SELECT name FROM sqlite_master WHERE type='table' AND name IN ('collections', 'documents')`\n );\n const tables = tablesResult.toArray() as { name: string }[];\n const tableNames = new Set(tables.map((t) => t.name));\n\n for (const requiredTable of REQUIRED_TABLES) {\n if (!tableNames.has(requiredTable)) {\n result.missingTables.push(requiredTable);\n result.valid = false;\n }\n }\n\n // Check for required indexes\n const indexesResult = this.storage.sql.exec(\n `SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%'`\n );\n const indexes = indexesResult.toArray() as { name: string }[];\n const indexNames = new Set(indexes.map((i) => i.name));\n\n for (const requiredIndex of REQUIRED_INDEXES) {\n if (!indexNames.has(requiredIndex)) {\n result.missingIndexes.push(requiredIndex);\n result.valid = false;\n }\n }\n } catch (error) {\n result.valid = false;\n result.errors.push(\n error instanceof Error ? error.message : 'Unknown error during validation'\n );\n }\n\n return result;\n }\n\n /**\n * Get the current schema version from storage\n */\n async getSchemaVersion(): Promise<number> {\n const version = await this.storage.get<number>(SCHEMA_VERSION_KEY);\n return version ?? 0;\n }\n\n /**\n * Check if schema needs migration\n */\n async needsMigration(): Promise<boolean> {\n const currentVersion = await this.getSchemaVersion();\n return currentVersion < SCHEMA_VERSION;\n }\n\n /**\n * Get list of pending migrations\n */\n async getPendingMigrations(): Promise<number[]> {\n const currentVersion = await this.getSchemaVersion();\n const pending = getMigrationsInRange(currentVersion, SCHEMA_VERSION);\n return pending.map((m) => m.version);\n }\n}\n","/**\n * FunctionExecutor - Secure execution of user functions via worker-loader\n *\n * Uses Cloudflare's worker-loader binding to execute arbitrary JavaScript\n * in isolated V8 contexts with:\n * - globalOutbound: null (no network access)\n * - Empty env (no binding access)\n * - Timeout enforcement\n */\n\nimport type { WorkerLoader, WorkerCode } from '../types/function'\n\ninterface Env {\n LOADER?: WorkerLoader\n}\n\nexport class FunctionExecutor {\n private env: Env\n\n constructor(env: Env) {\n this.env = env\n }\n\n /**\n * Execute a function with given arguments\n */\n async execute(body: string, args: unknown[], timeout = 5000): Promise<unknown> {\n if (!this.env.LOADER) {\n throw new Error(\n '$function requires worker_loaders binding. ' +\n 'Add to wrangler.jsonc: \"worker_loaders\": [{ \"binding\": \"LOADER\" }]'\n )\n }\n\n const normalizedBody = this.normalizeBody(body)\n const hash = await this.hashFunction(normalizedBody)\n\n const loader = this.env.LOADER\n const worker = loader.get(`fn-${hash}`, async (): Promise<WorkerCode> => ({\n compatibilityDate: '2024-09-25',\n mainModule: 'fn.js',\n modules: {\n 'fn.js': this.generateWorkerCode(normalizedBody, false)\n },\n globalOutbound: null,\n env: {}\n }))\n\n if (!worker.getEntrypoint) {\n throw new Error('Worker stub does not support getEntrypoint')\n }\n const entrypoint = worker.getEntrypoint()\n const response = await entrypoint.fetch(\n new Request('http://internal/execute', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ args, timeout })\n })\n )\n\n const result = await response.json() as { result?: unknown; error?: string }\n\n if (result.error) {\n throw new Error(`$function execution failed: ${result.error}`)\n }\n\n return result.result\n }\n\n /**\n * Execute a function for multiple arg sets in a single isolate (batch mode)\n */\n async executeBatch(body: string, argsArray: unknown[][], timeout = 10000): Promise<unknown[]> {\n if (!this.env.LOADER) {\n throw new Error(\n '$function requires worker_loaders binding. ' +\n 'Add to wrangler.jsonc: \"worker_loaders\": [{ \"binding\": \"LOADER\" }]'\n )\n }\n\n const normalizedBody = this.normalizeBody(body)\n const hash = await this.hashFunction(normalizedBody)\n\n const loader = this.env.LOADER\n const worker = loader.get(`fn-batch-${hash}`, async (): Promise<WorkerCode> => ({\n compatibilityDate: '2024-09-25',\n mainModule: 'fn.js',\n modules: {\n 'fn.js': this.generateWorkerCode(normalizedBody, true)\n },\n globalOutbound: null,\n env: {}\n }))\n\n if (!worker.getEntrypoint) {\n throw new Error('Worker stub does not support getEntrypoint')\n }\n const entrypoint = worker.getEntrypoint()\n const response = await entrypoint.fetch(\n new Request('http://internal/execute-batch', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ argsArray, timeout })\n })\n )\n\n const result = await response.json() as { results?: unknown[]; error?: string }\n\n if (result.error) {\n throw new Error(`$function batch execution failed: ${result.error}`)\n }\n\n return result.results ?? []\n }\n\n /**\n * Normalize function body to consistent format\n */\n private normalizeBody(body: string): string {\n const trimmed = body.trim()\n // Wrap function declarations in parentheses for invocation\n if (trimmed.startsWith('function')) {\n return `(${trimmed})`\n }\n return trimmed\n }\n\n /**\n * Generate SHA-256 hash of function body for caching\n */\n private async hashFunction(body: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(body)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n return Array.from(new Uint8Array(hashBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n .substring(0, 16) // Use first 16 chars for shorter IDs\n }\n\n /**\n * Generate the worker code that executes user functions\n */\n private generateWorkerCode(body: string, isBatch: boolean): string {\n if (isBatch) {\n return `\nexport default {\n async fetch(request) {\n try {\n const { argsArray, timeout = 10000 } = await request.json();\n const fn = ${body};\n\n const executeWithTimeout = async (args) => {\n const result = fn(...args);\n if (result instanceof Promise) {\n return Promise.race([\n result,\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Function execution timeout')), timeout)\n )\n ]);\n }\n return result;\n };\n\n const results = await Promise.all(argsArray.map(args => executeWithTimeout(args)));\n return Response.json({ results });\n } catch (err) {\n return Response.json({ error: err.message });\n }\n }\n}\n`\n }\n\n return `\nexport default {\n async fetch(request) {\n try {\n const { args, timeout = 5000 } = await request.json();\n const fn = ${body};\n const result = fn(...args);\n\n // Enforce timeout for async functions\n if (result instanceof Promise) {\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Function execution timeout')), timeout)\n );\n const finalResult = await Promise.race([result, timeoutPromise]);\n return Response.json({ result: finalResult });\n }\n\n return Response.json({ result });\n } catch (err) {\n return Response.json({ error: err.message });\n }\n }\n}\n`\n }\n}\n","/**\n * SQL Safety Utilities\n *\n * Functions to validate and sanitize field names and identifiers\n * to prevent SQL injection attacks.\n */\n\n/**\n * Regular expression pattern for valid MongoDB field names.\n * Allows alphanumeric characters, underscores, dots (for nested paths),\n * hyphens, and dollar signs (for operators/special fields).\n */\nconst SAFE_FIELD_PATTERN = /^[a-zA-Z0-9_.$-]+$/\n\n/**\n * Regular expression pattern for valid SQL identifiers.\n * Only allows alphanumeric characters and underscores.\n */\nconst SAFE_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/\n\n/**\n * Validates and returns a field name/path for safe use in SQL json_extract expressions.\n * Prevents SQL injection by only allowing safe characters in field paths.\n *\n * @param field - The field name or dot-notation path to validate\n * @returns The validated field name (unchanged if valid)\n * @throws Error if field name contains invalid characters\n *\n * @example\n * validateFieldPath('name') // returns 'name'\n * validateFieldPath('user.address') // returns 'user.address'\n * validateFieldPath(\"foo'; DROP--\") // throws Error\n */\nexport function validateFieldPath(field: string): string {\n if (!field || field.length === 0) {\n throw new Error('Field name cannot be empty')\n }\n\n // Check for null bytes\n if (field.includes('\\0')) {\n throw new Error('Field name cannot contain null characters')\n }\n\n // Check against safe pattern\n if (!SAFE_FIELD_PATTERN.test(field)) {\n throw new Error(\n `Invalid field name: \"${field}\". Field names can only contain alphanumeric characters, underscores, dots, hyphens, and dollar signs.`\n )\n }\n\n // Validate dot notation structure\n if (field.includes('..') || field.startsWith('.') || field.endsWith('.')) {\n throw new Error(\n `Invalid field path: \"${field}\". Field paths cannot have consecutive, leading, or trailing dots.`\n )\n }\n\n return field\n}\n\n/**\n * Validates an identifier (table name, index name, column name) for safe use in SQL.\n * Only allows alphanumeric characters and underscores, must start with letter or underscore.\n *\n * @param identifier - The identifier to validate\n * @returns The validated identifier (unchanged if valid)\n * @throws Error if identifier contains invalid characters\n *\n * @example\n * validateIdentifier('users') // returns 'users'\n * validateIdentifier('my_table_1') // returns 'my_table_1'\n * validateIdentifier('1table') // throws Error (starts with number)\n * validateIdentifier(\"users'; DROP--\")// throws Error\n */\nexport function validateIdentifier(identifier: string): string {\n if (!identifier || identifier.length === 0) {\n throw new Error('Identifier cannot be empty')\n }\n\n // Check for null bytes\n if (identifier.includes('\\0')) {\n throw new Error('Identifier cannot contain null characters')\n }\n\n // Check against safe pattern\n if (!SAFE_IDENTIFIER_PATTERN.test(identifier)) {\n throw new Error(\n `Invalid identifier: \"${identifier}\". Identifiers can only contain alphanumeric characters and underscores, and must start with a letter or underscore.`\n )\n }\n\n return identifier\n}\n\n/**\n * Creates a safe JSON path expression for use in json_extract().\n * Validates the field name and returns the properly formatted path.\n *\n * @param field - The field name or dot-notation path\n * @returns The JSON path string (e.g., '$.field.name')\n * @throws Error if field name is invalid\n *\n * @example\n * safeJsonPath('name') // returns '$.name'\n * safeJsonPath('user.address') // returns '$.user.address'\n * safeJsonPath('$special') // returns '$.$special' (preserves leading $)\n */\nexport function safeJsonPath(field: string): string {\n const validField = validateFieldPath(field)\n return validField.startsWith('$') ? validField : `$.${validField}`\n}\n\n/**\n * Creates a safe json_extract expression for use in SQL.\n * Validates the field name and returns the complete expression.\n *\n * @param dataColumn - The name of the JSON data column (e.g., 'data', 'value')\n * @param field - The field name or dot-notation path\n * @returns The json_extract expression (e.g., \"json_extract(data, '$.field')\")\n * @throws Error if field name is invalid\n *\n * @example\n * safeJsonExtract('data', 'name') // returns \"json_extract(data, '$.name')\"\n * safeJsonExtract('value', 'a.b') // returns \"json_extract(value, '$.a.b')\"\n */\nexport function safeJsonExtract(dataColumn: string, field: string): string {\n validateIdentifier(dataColumn)\n const jsonPath = safeJsonPath(field)\n return `json_extract(${dataColumn}, '${jsonPath}')`\n}\n","/**\n * SQL Dialect Support - Types and helpers for multi-database SQL generation\n *\n * Supports:\n * - sqlite: Default dialect, uses json_extract, CAST, etc.\n * - clickhouse: Uses JSONExtract*, toInt32, groupArray, etc.\n */\n\nexport type SQLDialect = 'sqlite' | 'clickhouse'\n\nexport interface DialectOptions {\n /** SQL dialect to use (default: 'sqlite') */\n dialect?: SQLDialect\n /** For ClickHouse: use positional ? parameters instead of typed {name:Type} */\n parameterMode?: 'positional' | 'typed'\n /** For ClickHouse: add WITH TOTALS to GROUP BY */\n withTotals?: boolean\n /** For ClickHouse: add FINAL modifier for ReplacingMergeTree tables */\n useFinal?: boolean\n /** For ClickHouse: use PREWHERE instead of WHERE for optimization */\n usePrewhere?: boolean\n}\n\nconst VALID_DIALECTS: SQLDialect[] = ['sqlite', 'clickhouse']\n\n/**\n * Validate dialect option and return normalized value\n */\nexport function validateDialect(dialect?: SQLDialect): SQLDialect {\n if (!dialect) return 'sqlite'\n if (!VALID_DIALECTS.includes(dialect)) {\n throw new Error(`Invalid dialect '${dialect}'. Supported dialects: ${VALID_DIALECTS.join(', ')}`)\n }\n return dialect\n}\n\n/**\n * Helper to choose SQL syntax based on dialect\n * @param dialect The SQL dialect\n * @param options Object with dialect-specific SQL strings\n */\nexport function dialectFn<T>(\n dialect: SQLDialect,\n options: { sqlite: T; clickhouse: T }\n): T {\n return options[dialect]\n}\n\n/**\n * JSON Extract functions by dialect\n */\nexport function jsonExtract(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n // Convert $.field.nested to 'field', 'nested' format\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n if (parts.length === 1 && parts[0] === '') {\n return dataColumn // root path\n }\n const pathArgs = parts.map(p => `'${p}'`).join(', ')\n return `JSONExtractRaw(${dataColumn}, ${pathArgs})`\n }\n // SQLite\n return `json_extract(${dataColumn}, '${path}')`\n}\n\n/**\n * JSON type checking by dialect\n */\nexport function jsonType(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n const pathArgs = parts.filter(p => p).map(p => `'${p}'`).join(', ')\n if (pathArgs) {\n return `JSONType(${dataColumn}, ${pathArgs})`\n }\n return `JSONType(${dataColumn})`\n }\n // SQLite - use json_extract then json_type for consistency\n return `json_type(json_extract(${dataColumn}, '${path}'))`\n}\n\n/**\n * JSON type checking with path argument directly (for $exists)\n */\nexport function jsonTypeWithPath(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n const pathArgs = parts.filter(p => p).map(p => `'${p}'`).join(', ')\n if (pathArgs) {\n return `JSONType(${dataColumn}, ${pathArgs})`\n }\n return `JSONType(${dataColumn})`\n }\n // SQLite - json_type can take data and path directly for existence checks\n return `json_type(${dataColumn}, '${path}')`\n}\n\n/**\n * JSON array length by dialect\n */\nexport function jsonArrayLength(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n const pathArgs = parts.filter(p => p).map(p => `'${p}'`).join(', ')\n return `JSONLength(${dataColumn}, ${pathArgs})`\n }\n // SQLite\n return `json_array_length(json_extract(${dataColumn}, '${path}'))`\n}\n\n/**\n * Type casting by dialect\n */\nexport interface CastOptions {\n toInt: (expr: string) => string\n toDouble: (expr: string) => string\n toString: (expr: string) => string\n toDate: (expr: string) => string\n toDecimal: (expr: string) => string\n}\n\nexport function getCastFunctions(dialect: SQLDialect): CastOptions {\n if (dialect === 'clickhouse') {\n return {\n toInt: (expr) => `toInt64(${expr})`,\n toDouble: (expr) => `toFloat64(${expr})`,\n toString: (expr) => `toString(${expr})`,\n toDate: (expr) => `toDateTime(${expr})`,\n toDecimal: (expr) => `toDecimal64(${expr}, 4)`\n }\n }\n // SQLite\n return {\n toInt: (expr) => `CAST(${expr} AS INTEGER)`,\n toDouble: (expr) => `CAST(${expr} AS REAL)`,\n toString: (expr) => `CAST(${expr} AS TEXT)`,\n toDate: (expr) => `datetime(${expr})`,\n toDecimal: (expr) => `CAST(${expr} AS REAL)`\n }\n}\n\n/**\n * Aggregation functions by dialect\n */\nexport interface AggregationFunctions {\n push: (expr: string) => string\n addToSet: (expr: string) => string\n first: (expr: string) => string\n last: (expr: string) => string\n sum: (expr: string) => string\n avg: (expr: string) => string\n min: (expr: string) => string\n max: (expr: string) => string\n count: () => string\n}\n\nexport function getAggregationFunctions(dialect: SQLDialect): AggregationFunctions {\n if (dialect === 'clickhouse') {\n return {\n push: (expr) => `groupArray(${expr})`,\n addToSet: (expr) => `groupUniqArray(${expr})`,\n first: (expr) => `any(${expr})`,\n last: (expr) => `anyLast(${expr})`,\n sum: (expr) => `sum(${expr})`,\n avg: (expr) => `avg(${expr})`,\n min: (expr) => `min(${expr})`,\n max: (expr) => `max(${expr})`,\n count: () => `count()`\n }\n }\n // SQLite\n return {\n push: (expr) => `json_group_array(${expr})`,\n addToSet: (expr) => `json_group_array(DISTINCT ${expr})`,\n first: (expr) => `(SELECT ${expr} LIMIT 1)`,\n last: (expr) => `(SELECT ${expr} ORDER BY ROWID DESC LIMIT 1)`,\n sum: (expr) => `SUM(${expr})`,\n avg: (expr) => `AVG(${expr})`,\n min: (expr) => `MIN(${expr})`,\n max: (expr) => `MAX(${expr})`,\n count: () => `COUNT(*)`\n }\n}\n\n/**\n * String functions by dialect\n */\nexport interface StringFunctions {\n indexOf: (str: string, search: string) => string\n strLength: (str: string) => string\n replaceAll: (str: string, find: string, replace: string) => string\n lower: (str: string) => string\n upper: (str: string) => string\n substr: (str: string, start: string, len: string) => string\n concat: (parts: string[]) => string\n}\n\nexport function getStringFunctions(dialect: SQLDialect): StringFunctions {\n if (dialect === 'clickhouse') {\n return {\n indexOf: (str, search) => `position(${str}, ${search})`,\n strLength: (str) => `length(${str})`,\n replaceAll: (str, find, replace) => `replaceAll(${str}, ${find}, ${replace})`,\n lower: (str) => `lower(${str})`,\n upper: (str) => `upper(${str})`,\n substr: (str, start, len) => `substring(${str}, ${start} + 1, ${len})`,\n concat: (parts) => `concat(${parts.join(', ')})`\n }\n }\n // SQLite\n return {\n indexOf: (str, search) => `INSTR(${str}, ${search})`,\n strLength: (str) => `LENGTH(${str})`,\n replaceAll: (str, find, replace) => `REPLACE(${str}, ${find}, ${replace})`,\n lower: (str) => `LOWER(${str})`,\n upper: (str) => `UPPER(${str})`,\n substr: (str, start, len) => `SUBSTR(${str}, ${start} + 1, ${len})`,\n concat: (parts) => parts.join(' || ')\n }\n}\n\n/**\n * Date functions by dialect\n */\nexport interface DateFunctions {\n fromString: (str: string) => string\n toString: (date: string, format: string) => string\n year: (date: string) => string\n month: (date: string) => string\n day: (date: string) => string\n hour: (date: string) => string\n minute: (date: string) => string\n second: (date: string) => string\n dateDiff: (unit: string, start: string, end: string) => string\n dateAdd: (date: string, unit: string, amount: string) => string\n dateTrunc: (date: string, unit: string) => string\n}\n\nexport function getDateFunctions(dialect: SQLDialect): DateFunctions {\n if (dialect === 'clickhouse') {\n return {\n fromString: (str) => `parseDateTimeBestEffort(${str})`,\n toString: (date, format) => `formatDateTime(${date}, ${format})`,\n year: (date) => `toYear(${date})`,\n month: (date) => `toMonth(${date})`,\n day: (date) => `toDayOfMonth(${date})`,\n hour: (date) => `toHour(${date})`,\n minute: (date) => `toMinute(${date})`,\n second: (date) => `toSecond(${date})`,\n dateDiff: (unit, start, end) => `dateDiff('${unit}', ${start}, ${end})`,\n dateAdd: (date, unit, amount) => `dateAdd(${unit}, ${amount}, ${date})`,\n dateTrunc: (date, unit) => {\n const fnMap: Record<string, string> = {\n day: 'toStartOfDay',\n month: 'toStartOfMonth',\n year: 'toStartOfYear',\n hour: 'toStartOfHour',\n minute: 'toStartOfMinute'\n }\n return `${fnMap[unit] || 'toStartOfDay'}(${date})`\n }\n }\n }\n // SQLite\n return {\n fromString: (str) => `datetime(${str})`,\n toString: (date, format) => `strftime(${format}, ${date})`,\n year: (date) => `CAST(strftime('%Y', ${date}) AS INTEGER)`,\n month: (date) => `CAST(strftime('%m', ${date}) AS INTEGER)`,\n day: (date) => `CAST(strftime('%d', ${date}) AS INTEGER)`,\n hour: (date) => `CAST(strftime('%H', ${date}) AS INTEGER)`,\n minute: (date) => `CAST(strftime('%M', ${date}) AS INTEGER)`,\n second: (date) => `CAST(strftime('%S', ${date}) AS INTEGER)`,\n dateDiff: (unit, start, end) => {\n if (unit === 'day') {\n return `CAST(julianday(${end}) - julianday(${start}) AS INTEGER)`\n }\n return `CAST((julianday(${end}) - julianday(${start})) * 24 AS INTEGER)` // hours\n },\n dateAdd: (date, unit, amount) => `datetime(${date}, '+' || ${amount} || ' ${unit}')`,\n dateTrunc: (date, unit) => {\n if (unit === 'day') {\n return `date(${date})`\n }\n if (unit === 'month') {\n return `date(${date}, 'start of month')`\n }\n if (unit === 'year') {\n return `date(${date}, 'start of year')`\n }\n return `datetime(${date})`\n }\n }\n}\n\n/**\n * Array functions by dialect\n */\nexport interface ArrayFunctions {\n unwind: (source: string, arrayPath: string, aliasName: string) => { sql: string; joinType: 'JOIN' | 'ARRAY JOIN' }\n filter: (array: string, varName: string, condition: string) => string\n map: (array: string, varName: string, expr: string) => string\n reduce: (array: string, initial: string, varName: string, accName: string, expr: string) => string\n slice: (array: string, start: string, count?: string) => string\n concat: (arrays: string[]) => string\n in: (value: string, array: string) => string\n}\n\nexport function getArrayFunctions(dialect: SQLDialect): ArrayFunctions {\n if (dialect === 'clickhouse') {\n return {\n unwind: (_source, arrayPath, aliasName) => ({\n sql: `${arrayPath} AS ${aliasName}`,\n joinType: 'ARRAY JOIN'\n }),\n filter: (array, varName, condition) => `arrayFilter(${varName} -> ${condition}, ${array})`,\n map: (array, varName, expr) => `arrayMap(${varName} -> ${expr}, ${array})`,\n reduce: (array, _initial, _varName, _accName, _expr) => `arrayReduce('sumState', ${array})`,\n slice: (array, start, count) => count ? `arraySlice(${array}, ${start}, ${count})` : `arraySlice(${array}, ${start})`,\n concat: (arrays) => `arrayConcat(${arrays.join(', ')})`,\n in: (value, array) => `has(${array}, ${value})`\n }\n }\n // SQLite\n return {\n unwind: (_source, arrayPath, aliasName) => ({\n sql: `json_each(${arrayPath}) AS ${aliasName}`,\n joinType: 'JOIN'\n }),\n filter: (array, varName, condition) => `(SELECT json_group_array(value) FROM json_each(${array}) WHERE ${condition.replace(new RegExp(varName, 'g'), 'value')})`,\n map: (array, varName, expr) => `(SELECT json_group_array(${expr.replace(new RegExp(varName, 'g'), 'value')}) FROM json_each(${array}))`,\n reduce: (array, initial, _varName, _accName, _expr) => `(SELECT ${initial} + TOTAL(value) FROM json_each(${array}))`,\n slice: (array, start, count) => count\n ? `(SELECT json_group_array(value) FROM (SELECT value FROM json_each(${array}) LIMIT ${count} OFFSET ${start}))`\n : `(SELECT json_group_array(value) FROM (SELECT value FROM json_each(${array}) OFFSET ${start}))`,\n concat: (arrays) => arrays.length === 2 ? `json_array(${arrays[0]}, ${arrays[1]})` : `json_array(${arrays.join(', ')})`,\n in: (value, array) => `EXISTS (SELECT 1 FROM json_each(${array}) WHERE value = ${value})`\n }\n}\n\n/**\n * Regex/pattern matching by dialect\n */\nexport function regexMatch(dialect: SQLDialect, column: string, pattern: string, caseInsensitive: boolean): string {\n if (dialect === 'clickhouse') {\n if (caseInsensitive) {\n return `${column} ILIKE ${pattern}`\n }\n return `${column} LIKE ${pattern}`\n }\n // SQLite\n if (caseInsensitive) {\n return `LOWER(${column}) LIKE LOWER(${pattern})`\n }\n return `${column} LIKE ${pattern}`\n}\n\n/**\n * NULL handling by dialect\n */\nexport function nullCheck(_dialect: SQLDialect, column: string): string {\n // Both dialects support IS NULL\n return `${column} IS NULL`\n}\n\nexport function ifNull(dialect: SQLDialect, exprs: string[]): string {\n if (dialect === 'clickhouse') {\n // ClickHouse supports ifNull for 2 args, coalesce for more\n if (exprs.length === 2) {\n return `ifNull(${exprs[0]}, ${exprs[1]})`\n }\n return `coalesce(${exprs.join(', ')})`\n }\n // SQLite uses COALESCE\n return `COALESCE(${exprs.join(', ')})`\n}\n","/**\n * Expression Translator - Translates MongoDB aggregation expressions to SQL\n * Handles arithmetic, string, conditional, comparison, and function operators\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { FunctionSpec, FunctionExpression } from '../../types/function'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport {\n type SQLDialect,\n jsonExtract as dialectJsonExtract,\n getCastFunctions,\n getStringFunctions,\n getDateFunctions,\n getArrayFunctions,\n ifNull as dialectIfNull,\n} from '../dialect'\n\n/**\n * Check if a value is a field reference (starts with $)\n */\nexport function isFieldReference(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith('$') && !value.startsWith('$$')\n}\n\n/**\n * Get the JSON path for a field reference\n *\n * SECURITY: Validates field name to prevent SQL injection attacks.\n * @throws Error if field contains invalid characters\n */\nexport function getFieldPath(fieldRef: string): string {\n // Remove the leading $ and convert to JSON path\n const field = fieldRef.substring(1)\n\n // Validate the field path to prevent SQL injection\n validateFieldPath(field)\n\n const parts = field.split('.')\n let path = '$'\n\n for (const part of parts) {\n if (/^\\d+$/.test(part)) {\n path += `[${part}]`\n } else {\n path += `.${part}`\n }\n }\n\n return path\n}\n\n/**\n * Translate an expression value (field reference, literal, or expression object)\n */\nexport function translateExpressionValue(value: unknown, params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n if (isFieldReference(value)) {\n const path = getFieldPath(value)\n return dialectJsonExtract(dialect, 'data', path)\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return translateExpression(value as Record<string, unknown>, params, dialect)\n }\n\n if (typeof value === 'string') {\n params.push(value)\n return '?'\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n\n if (value === null) {\n return 'NULL'\n }\n\n params.push(JSON.stringify(value))\n return '?'\n}\n\n/**\n * Main expression translator\n */\nexport function translateExpression(\n expr: Record<string, unknown>,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n const keys = Object.keys(expr)\n\n if (keys.length === 0) {\n return 'NULL'\n }\n\n const operator = keys[0]\n\n // Arithmetic operators\n if (operator === '$add') {\n return translateArithmetic(expr.$add as unknown[], params, '+', dialect)\n }\n if (operator === '$subtract') {\n return translateArithmetic(expr.$subtract as unknown[], params, '-', dialect)\n }\n if (operator === '$multiply') {\n return translateArithmetic(expr.$multiply as unknown[], params, '*', dialect)\n }\n if (operator === '$divide') {\n return translateArithmetic(expr.$divide as unknown[], params, '/', dialect)\n }\n if (operator === '$mod') {\n return translateArithmetic(expr.$mod as unknown[], params, '%', dialect)\n }\n\n // Type conversion operators\n const castFns = getCastFunctions(dialect)\n if (operator === '$toInt') {\n const val = translateExpressionValue(expr.$toInt, params, dialect)\n return castFns.toInt(val)\n }\n if (operator === '$toDouble') {\n const val = translateExpressionValue(expr.$toDouble, params, dialect)\n return castFns.toDouble(val)\n }\n if (operator === '$toString') {\n const val = translateExpressionValue(expr.$toString, params, dialect)\n return castFns.toString(val)\n }\n if (operator === '$toDate') {\n const val = translateExpressionValue(expr.$toDate, params, dialect)\n return castFns.toDate(val)\n }\n if (operator === '$toDecimal') {\n const val = translateExpressionValue(expr.$toDecimal, params, dialect)\n return castFns.toDecimal(val)\n }\n\n // String operators\n const strFns = getStringFunctions(dialect)\n if (operator === '$concat') {\n return translateConcat(expr.$concat as unknown[], params, dialect)\n }\n if (operator === '$substr') {\n return translateSubstr(expr.$substr as unknown[], params, dialect)\n }\n if (operator === '$toLower') {\n const val = translateExpressionValue(expr.$toLower, params, dialect)\n return strFns.lower(val)\n }\n if (operator === '$toUpper') {\n const val = translateExpressionValue(expr.$toUpper, params, dialect)\n return strFns.upper(val)\n }\n if (operator === '$indexOfBytes') {\n const args = expr.$indexOfBytes as unknown[]\n const str = translateExpressionValue(args[0], params, dialect)\n const search = translateExpressionValue(args[1], params, dialect)\n return strFns.indexOf(str, search)\n }\n if (operator === '$strLenBytes') {\n const val = translateExpressionValue(expr.$strLenBytes, params, dialect)\n return strFns.strLength(val)\n }\n if (operator === '$replaceAll') {\n const spec = expr.$replaceAll as { input: unknown; find: unknown; replacement: unknown }\n const input = translateExpressionValue(spec.input, params, dialect)\n const find = translateExpressionValue(spec.find, params, dialect)\n const replacement = translateExpressionValue(spec.replacement, params, dialect)\n return strFns.replaceAll(input, find, replacement)\n }\n\n // Date operators\n const dateFns = getDateFunctions(dialect)\n if (operator === '$dateFromString') {\n const spec = expr.$dateFromString as { dateString: unknown }\n const str = translateExpressionValue(spec.dateString, params, dialect)\n return dateFns.fromString(str)\n }\n if (operator === '$dateToString') {\n const spec = expr.$dateToString as { format: string; date: unknown }\n const date = translateExpressionValue(spec.date, params, dialect)\n params.push(spec.format)\n return dateFns.toString(date, '?')\n }\n if (operator === '$year') {\n const val = translateExpressionValue(expr.$year, params, dialect)\n return dateFns.year(val)\n }\n if (operator === '$month') {\n const val = translateExpressionValue(expr.$month, params, dialect)\n return dateFns.month(val)\n }\n if (operator === '$dayOfMonth') {\n const val = translateExpressionValue(expr.$dayOfMonth, params, dialect)\n return dateFns.day(val)\n }\n if (operator === '$hour') {\n const val = translateExpressionValue(expr.$hour, params, dialect)\n return dateFns.hour(val)\n }\n if (operator === '$minute') {\n const val = translateExpressionValue(expr.$minute, params, dialect)\n return dateFns.minute(val)\n }\n if (operator === '$second') {\n const val = translateExpressionValue(expr.$second, params, dialect)\n return dateFns.second(val)\n }\n if (operator === '$dateDiff') {\n const spec = expr.$dateDiff as { startDate: unknown; endDate: unknown; unit: string }\n const start = translateExpressionValue(spec.startDate, params, dialect)\n const end = translateExpressionValue(spec.endDate, params, dialect)\n return dateFns.dateDiff(spec.unit, start, end)\n }\n if (operator === '$dateAdd') {\n const spec = expr.$dateAdd as { startDate: unknown; unit: string; amount: unknown }\n const date = translateExpressionValue(spec.startDate, params, dialect)\n const amount = translateExpressionValue(spec.amount, params, dialect)\n return dateFns.dateAdd(date, spec.unit, amount)\n }\n if (operator === '$dateTrunc') {\n const spec = expr.$dateTrunc as { date: unknown; unit: string }\n const date = translateExpressionValue(spec.date, params, dialect)\n return dateFns.dateTrunc(date, spec.unit)\n }\n\n // Array operators\n const arrFns = getArrayFunctions(dialect)\n if (operator === '$in') {\n const args = expr.$in as unknown[]\n const value = translateExpressionValue(args[0], params, dialect)\n const array = translateExpressionValue(args[1], params, dialect)\n return arrFns.in(value, array)\n }\n if (operator === '$concatArrays') {\n const args = expr.$concatArrays as unknown[]\n const arrays = args.map(a => translateExpressionValue(a, params, dialect))\n return arrFns.concat(arrays)\n }\n if (operator === '$filter') {\n const spec = expr.$filter as { input: unknown; as: string; cond: unknown }\n const array = translateExpressionValue(spec.input, params, dialect)\n const cond = translateExpressionValue(spec.cond, params, dialect)\n return arrFns.filter(array, spec.as || 'this', cond)\n }\n if (operator === '$map') {\n const spec = expr.$map as { input: unknown; as: string; in: unknown }\n const array = translateExpressionValue(spec.input, params, dialect)\n const inExpr = translateExpressionValue(spec.in, params, dialect)\n return arrFns.map(array, spec.as || 'this', inExpr)\n }\n if (operator === '$reduce') {\n const spec = expr.$reduce as { input: unknown; initialValue: unknown; in: unknown }\n const array = translateExpressionValue(spec.input, params, dialect)\n const initial = translateExpressionValue(spec.initialValue, params, dialect)\n const inExpr = translateExpressionValue(spec.in, params, dialect)\n return arrFns.reduce(array, initial, 'this', 'value', inExpr)\n }\n if (operator === '$slice') {\n const args = expr.$slice as unknown[]\n const array = translateExpressionValue(args[0], params, dialect)\n const count = translateExpressionValue(args[1], params, dialect)\n return arrFns.slice(array, '0', count)\n }\n\n // Conditional operators\n if (operator === '$cond') {\n return translateCond(expr.$cond as Record<string, unknown> | unknown[], params, dialect)\n }\n if (operator === '$ifNull') {\n return translateIfNull(expr.$ifNull as unknown[], params, dialect)\n }\n if (operator === '$switch') {\n return translateSwitch(expr.$switch as Record<string, unknown>, params, dialect)\n }\n\n // Comparison operators (in expression context)\n if (operator === '$eq') {\n const args = expr.$eq as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} = ${right})`\n }\n if (operator === '$ne') {\n const args = expr.$ne as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} != ${right})`\n }\n if (operator === '$gt') {\n const args = expr.$gt as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} > ${right})`\n }\n if (operator === '$gte') {\n const args = expr.$gte as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} >= ${right})`\n }\n if (operator === '$lt') {\n const args = expr.$lt as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} < ${right})`\n }\n if (operator === '$lte') {\n const args = expr.$lte as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} <= ${right})`\n }\n\n // Logical operators\n if (operator === '$and') {\n const conditions = (expr.$and as unknown[]).map(c =>\n translateExpressionValue(c, params, dialect)\n )\n return `(${conditions.join(' AND ')})`\n }\n if (operator === '$or') {\n const conditions = (expr.$or as unknown[]).map(c =>\n translateExpressionValue(c, params, dialect)\n )\n return `(${conditions.join(' OR ')})`\n }\n if (operator === '$not') {\n const val = translateExpressionValue(expr.$not, params, dialect)\n return `NOT (${val})`\n }\n\n // $expr for match conditions - extract the inner expression\n if (operator === '$expr') {\n return translateExpression(expr.$expr as Record<string, unknown>, params, dialect)\n }\n\n // $function operator - custom JavaScript function execution\n if (operator === '$function') {\n return translateFunction(expr.$function as FunctionSpec, params)\n }\n\n throw new Error(`Unknown expression operator: ${operator}`)\n}\n\nfunction translateArithmetic(args: unknown[], params: unknown[], op: string, dialect: SQLDialect = 'sqlite'): string {\n const parts = args.map(arg => translateExpressionValue(arg, params, dialect))\n return `(${parts.join(` ${op} `)})`\n}\n\nfunction translateConcat(args: unknown[], params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n const parts = args.map(arg => translateExpressionValue(arg, params, dialect))\n const strFns = getStringFunctions(dialect)\n return strFns.concat(parts)\n}\n\nfunction translateSubstr(args: unknown[], params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n const str = translateExpressionValue(args[0], params, dialect)\n const start = translateExpressionValue(args[1], params, dialect)\n const len = translateExpressionValue(args[2], params, dialect)\n const strFns = getStringFunctions(dialect)\n return strFns.substr(str, start, len)\n}\n\nfunction translateCond(\n cond: Record<string, unknown> | unknown[],\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n let ifCond: unknown, thenVal: unknown, elseVal: unknown\n\n if (Array.isArray(cond)) {\n [ifCond, thenVal, elseVal] = cond\n } else {\n ifCond = cond.if\n thenVal = cond.then\n elseVal = cond.else\n }\n\n const condSql = translateExpressionValue(ifCond, params, dialect)\n const thenSql = translateExpressionValue(thenVal, params, dialect)\n const elseSql = translateExpressionValue(elseVal, params, dialect)\n\n return `CASE WHEN ${condSql} THEN ${thenSql} ELSE ${elseSql} END`\n}\n\nfunction translateIfNull(args: unknown[], params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n const parts = args.map(arg => translateExpressionValue(arg, params, dialect))\n return dialectIfNull(dialect, parts)\n}\n\nfunction translateSwitch(\n switchExpr: Record<string, unknown>,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n const branches = switchExpr.branches as Array<{ case: unknown; then: unknown }>\n const defaultVal = switchExpr.default\n\n const whenClauses = branches.map(branch => {\n const caseSql = translateExpressionValue(branch.case, params, dialect)\n const thenSql = translateExpressionValue(branch.then, params, dialect)\n return `WHEN ${caseSql} THEN ${thenSql}`\n })\n\n const elseSql = defaultVal !== undefined\n ? translateExpressionValue(defaultVal, params, dialect)\n : 'NULL'\n\n return `CASE ${whenClauses.join(' ')} ELSE ${elseSql} END`\n}\n\n/**\n * Translate $function operator to a marker for deferred execution\n * Returns a JSON marker string that will be processed by the aggregation executor\n *\n * The $function operator allows custom JavaScript functions in aggregation pipelines.\n * Since SQLite cannot execute JavaScript, we:\n * 1. Generate a JSON marker embedded in SQL output\n * 2. Extract field references from args for document binding\n * 3. Store the function expression metadata for post-processing\n */\nfunction translateFunction(spec: FunctionSpec, _params: unknown[]): string {\n // Validate required fields\n if (!spec.body) {\n throw new Error('$function requires body')\n }\n if (!spec.args) {\n throw new Error('$function requires args')\n }\n if (spec.lang !== 'js') {\n throw new Error('$function only supports lang: \"js\"')\n }\n\n // Normalize body to string\n const body = typeof spec.body === 'function'\n ? spec.body.toString()\n : spec.body\n\n // Process arguments - extract field paths and literal positions\n const argPaths: string[] = []\n const literalArgs: Record<number, unknown> = {}\n\n spec.args.forEach((arg, index) => {\n if (isFieldReference(arg)) {\n argPaths.push(getFieldPath(arg as string))\n } else {\n literalArgs[index] = arg\n }\n })\n\n // Create marker object\n const marker = {\n __type: 'function',\n body,\n argPaths,\n literalArgs,\n argOrder: spec.args.map((arg, i) =>\n isFieldReference(arg) ? { type: 'field', path: getFieldPath(arg as string) } : { type: 'literal', index: i }\n )\n }\n\n // Return as a JSON string that can be detected and parsed later\n return `'__FUNCTION__${JSON.stringify(marker).replace(/'/g, \"''\")}'`\n}\n\n/**\n * Function ID counter for placeholder identification\n * Exported for testing purposes\n */\nexport let functionIdCounter = 0\n\n/**\n * Reset function ID counter (useful for testing)\n */\nexport function resetFunctionIdCounter(): void {\n functionIdCounter = 0\n}\n\n/**\n * Check if a value is a $function operator\n */\nexport function isFunctionOperator(value: unknown): value is { $function: FunctionSpec } {\n return (\n typeof value === 'object' &&\n value !== null &&\n '$function' in value\n )\n}\n\n/**\n * Create a FunctionExpression from a $function spec\n * Utility for external code that needs to work with function expressions\n */\nexport function createFunctionExpression(spec: FunctionSpec): FunctionExpression {\n const bodyStr = typeof spec.body === 'function'\n ? spec.body.toString()\n : spec.body\n\n const argPaths: string[] = []\n const literalArgs = new Map<number, unknown>()\n\n for (let i = 0; i < spec.args.length; i++) {\n const arg = spec.args[i]\n\n if (isFieldReference(arg)) {\n const path = getFieldPath(arg as string)\n argPaths.push(path)\n } else {\n literalArgs.set(i, arg)\n }\n }\n\n return {\n __type: 'function',\n body: bodyStr,\n argPaths,\n literalArgs\n }\n}\n\n/**\n * Parse a function marker from SQL output\n * Returns the parsed function expression or null if not a function marker\n */\nexport function parseFunctionPlaceholder(sql: string): {\n __type: 'function'\n body: string\n argPaths: string[]\n literalArgs: Record<number, unknown>\n argOrder: Array<{ type: 'field'; path: string } | { type: 'literal'; index: number }>\n} | null {\n const match = sql.match(/'__FUNCTION__(.+?)'/)\n if (!match || !match[1]) return null\n\n try {\n // Unescape single quotes and parse JSON\n const json = match[1].replace(/''/g, \"'\")\n return JSON.parse(json)\n } catch {\n return null\n }\n}\n\n/**\n * Check if SQL contains function markers\n */\nexport function hasFunctionPlaceholders(sql: string): boolean {\n return /__FUNCTION__/.test(sql)\n}\n","/**\n * QueryTranslator - Translates MongoDB-style queries to SQL\n * using json_extract for field access on JSON documents.\n *\n * Features:\n * - Operator registry pattern for extensibility\n * - Automatic flattening of nested $and/$or for SQL optimization\n * - CTE-based optimization for multiple array operations\n * - Parameterized queries for SQL injection prevention\n * - $text operator for full-text search with FTS5\n * - Multi-dialect support (SQLite, ClickHouse)\n */\n\nimport { validateFieldPath } from '../utils/sql-safety.js';\nimport {\n type SQLDialect,\n type DialectOptions,\n validateDialect,\n jsonExtract as dialectJsonExtract,\n jsonType as dialectJsonType,\n jsonTypeWithPath as dialectJsonTypeWithPath,\n jsonArrayLength as dialectJsonArrayLength,\n regexMatch as dialectRegexMatch,\n} from './dialect.js';\nimport { translateExpression } from './stages/expression-translator.js';\n\nexport interface TranslatedQuery {\n sql: string;\n params: unknown[];\n /** Whether this query requires an FTS5 join */\n requiresFTS?: boolean;\n /** The FTS5 match expression (for building full query) */\n ftsMatch?: string;\n}\n\ntype QueryValue = unknown;\ntype QueryCondition = Record<string, QueryValue>;\n\n/**\n * Operator handler type for the registry pattern\n */\ntype OperatorHandler = (\n path: string,\n value: QueryValue,\n params: unknown[]\n) => string;\n\n/**\n * MongoDB type to SQLite json_type mapping\n */\nconst MONGO_TYPE_TO_SQLITE: Record<string, string | string[]> = {\n string: 'text',\n number: ['integer', 'real'],\n bool: ['true', 'false'],\n boolean: ['true', 'false'],\n array: 'array',\n object: 'object',\n null: 'null',\n};\n\n/**\n * JSON Schema type definition for $jsonSchema operator\n */\ninterface JsonSchema {\n type?: string | string[];\n bsonType?: string | string[];\n required?: string[];\n properties?: Record<string, JsonSchema>;\n additionalProperties?: boolean | JsonSchema;\n items?: JsonSchema | JsonSchema[];\n enum?: unknown[];\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number | boolean;\n exclusiveMaximum?: number | boolean;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n minItems?: number;\n maxItems?: number;\n uniqueItems?: boolean;\n minProperties?: number;\n maxProperties?: number;\n allOf?: JsonSchema[];\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n not?: JsonSchema;\n description?: string;\n title?: string;\n}\n\n/**\n * Options for query translation\n */\nexport interface TranslateOptions extends DialectOptions {\n /**\n * Enable CTE optimization for array operations\n * When enabled, multiple array checks on the same field use a single CTE\n */\n useCTE?: boolean;\n\n /**\n * Flatten nested logical operators\n * When enabled, nested $and/$or of the same type are merged\n */\n flattenLogical?: boolean;\n}\n\nconst DEFAULT_OPTIONS: TranslateOptions = {\n useCTE: true,\n flattenLogical: true,\n dialect: 'sqlite',\n};\n\n/**\n * QueryTranslator - Converts MongoDB query syntax to SQL with json_extract\n */\nexport class QueryTranslator {\n private options: TranslateOptions;\n private dialect: SQLDialect;\n\n constructor(options: TranslateOptions = {}) {\n // Validate dialect before merging options\n const dialect = validateDialect(options.dialect);\n this.options = { ...DEFAULT_OPTIONS, ...options, dialect };\n this.dialect = dialect;\n }\n\n /**\n * Registry of comparison operators and their SQL translations\n */\n private comparisonOperators: Record<string, OperatorHandler> = {\n $eq: (path, value, params) => {\n if (value === null) {\n return `${this.jsonExtract(path)} IS NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(sqlValue);\n return `${this.jsonExtract(path)} = ?`;\n },\n $ne: (path, value, params) => {\n if (value === null) {\n return `${this.jsonExtract(path)} IS NOT NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(sqlValue);\n return `${this.jsonExtract(path)} != ?`;\n },\n $gt: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} > ?`;\n },\n $gte: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} >= ?`;\n },\n $lt: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} < ?`;\n },\n $lte: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} <= ?`;\n },\n $in: (path, value, params) => {\n const arr = value as unknown[];\n if (arr.length === 0) {\n return '0 = 1';\n }\n params.push(...arr);\n const placeholders = arr.map(() => '?').join(', ');\n return `${this.jsonExtract(path)} IN (${placeholders})`;\n },\n $nin: (path, value, params) => {\n const arr = value as unknown[];\n if (arr.length === 0) {\n return '1 = 1';\n }\n params.push(...arr);\n const placeholders = arr.map(() => '?').join(', ');\n return `${this.jsonExtract(path)} NOT IN (${placeholders})`;\n },\n $regex: (path, value, params) => {\n // Handle both { $regex: \"pattern\" } and { $regex: \"pattern\", $options: \"i\" }\n // Also handle direct { field: { $regex: /pattern/i } } form\n // Also support $regexType: 'glob' for SQLite GLOB syntax\n let pattern: string;\n let options: string = '';\n let regexType: string = 'like'; // default to LIKE pattern matching\n\n if (typeof value === 'string') {\n pattern = value;\n } else if (value instanceof RegExp) {\n pattern = value.source;\n options = value.flags;\n } else if (value && typeof value === 'object') {\n const regexObj = value as { $regex?: string; $options?: string; $regexType?: string };\n pattern = regexObj.$regex || '';\n options = regexObj.$options || '';\n regexType = regexObj.$regexType || 'like';\n } else {\n pattern = String(value);\n }\n\n const fieldExpr = this.jsonExtract(path);\n const caseInsensitive = options.includes('i');\n\n // Handle GLOB type for SQLite\n if (regexType === 'glob' && this.dialect === 'sqlite') {\n params.push(pattern);\n const typeCheck = `json_type(${fieldExpr}) = 'text'`;\n return `(${typeCheck} AND ${fieldExpr} GLOB ?)`;\n }\n\n // Convert regex pattern to LIKE pattern\n // This is a simplified conversion that handles common cases\n const likePattern = this.regexToLike(pattern, options);\n params.push(likePattern);\n\n // First ensure the field is a string type (regex only works on strings)\n if (this.dialect === 'clickhouse') {\n const typeCheck = `JSONType(data, ${path.replace(/^\\$\\.?/, '').split('.').map(p => `'${p}'`).join(', ')}) = 'String'`;\n const matchExpr = dialectRegexMatch(this.dialect, fieldExpr, '?', caseInsensitive);\n return `(${typeCheck} AND ${matchExpr})`;\n }\n\n const typeCheck = `json_type(${fieldExpr}) = 'text'`;\n const matchExpr = dialectRegexMatch(this.dialect, fieldExpr, '?', caseInsensitive);\n return `(${typeCheck} AND ${matchExpr})`;\n },\n $mod: (path, value, params) => {\n // $mod: [divisor, remainder] - matches if field % divisor == remainder\n const [divisor, remainder] = value as [number, number];\n params.push(divisor, remainder);\n // Check that the field is numeric and apply modulo\n // Use CAST to handle float truncation like MongoDB\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND CAST(${this.jsonExtract(path)} AS INTEGER) % ? = ?)`;\n },\n\n // Bitwise operators\n $bitsAllSet: (path, value, params) => {\n // $bitsAllSet: [bit positions] or bitmask number\n // Matches if all specified bits are set (1)\n const mask = this.resolveBitmask(value);\n params.push(mask, mask);\n // (field & mask) == mask means all bits in mask are set\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) = ?)`;\n },\n $bitsAnyClear: (path, value, params) => {\n // $bitsAnyClear: [bit positions] or bitmask number\n // Matches if any of the specified bits are clear (0)\n const mask = this.resolveBitmask(value);\n params.push(mask, mask);\n // (field & mask) != mask means at least one bit in mask is clear\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) != ?)`;\n },\n $bitsAllClear: (path, value, params) => {\n // $bitsAllClear: [bit positions] or bitmask number\n // Matches if all specified bits are clear (0)\n const mask = this.resolveBitmask(value);\n params.push(mask);\n // (field & mask) == 0 means all bits in mask are clear\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) = 0)`;\n },\n $bitsAnySet: (path, value, params) => {\n // $bitsAnySet: [bit positions] or bitmask number\n // Matches if any of the specified bits are set (1)\n const mask = this.resolveBitmask(value);\n params.push(mask);\n // (field & mask) != 0 means at least one bit in mask is set\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) != 0)`;\n },\n };\n\n /**\n * Registry of element operators\n */\n private elementOperators: Record<string, OperatorHandler> = {\n $exists: (path, value, _params) => {\n // MongoDB $exists distinguishes between missing fields and null values:\n // - $exists: true -> field exists (including explicit null values)\n // - $exists: false -> field is completely missing from the document\n //\n // SQLite's json_extract returns NULL for both missing fields AND null values,\n // but json_type returns 'null' for explicit nulls and NULL for missing fields.\n // So we use json_type with path directly to properly detect field existence.\n if (path.startsWith('$')) {\n // JSON path - use json_type(data, path) directly for existence checks\n const typeExpr = dialectJsonTypeWithPath(this.dialect, 'data', path);\n if (value) {\n return `${typeExpr} IS NOT NULL`;\n }\n return `${typeExpr} IS NULL`;\n }\n // Direct reference (for elemMatch context) - use json_type\n if (this.dialect === 'clickhouse') {\n if (value) {\n return `JSONType(${path}) IS NOT NULL`;\n }\n return `JSONType(${path}) IS NULL`;\n }\n if (value) {\n return `json_type(${path}) IS NOT NULL`;\n }\n return `json_type(${path}) IS NULL`;\n },\n $type: (path, value, _params) => {\n const mongoType = value as string;\n const sqliteType = MONGO_TYPE_TO_SQLITE[mongoType];\n const typeExpr = dialectJsonType(this.dialect, 'data', path);\n\n if (Array.isArray(sqliteType)) {\n if (mongoType === 'number') {\n if (this.dialect === 'clickhouse') {\n return `${typeExpr} IN ('Int64', 'Float64', 'UInt64')`;\n }\n return `${typeExpr} IN ('integer', 'real')`;\n }\n // bool type checks for true/false values\n if (this.dialect === 'clickhouse') {\n return `${typeExpr} = 'Bool'`;\n }\n return `${typeExpr} IN ('true', 'false')`;\n }\n if (this.dialect === 'clickhouse') {\n const chType = mongoType === 'string' ? 'String' : mongoType === 'array' ? 'Array' : mongoType === 'object' ? 'Object' : sqliteType;\n return `${typeExpr} = '${chType}'`;\n }\n return `${typeExpr} = '${sqliteType}'`;\n },\n };\n\n /**\n * Registry of array operators\n */\n private arrayOperators: Record<string, OperatorHandler> = {\n $size: (path, value, params) => {\n params.push(value);\n const lenExpr = dialectJsonArrayLength(this.dialect, 'data', path);\n return `${lenExpr} = ?`;\n },\n $all: (path, value, params): string => {\n const arr = value as unknown[];\n if (arr.length === 0) {\n return '1 = 1';\n }\n // Each value must exist in the array using EXISTS with json_each\n const conditions = arr.map((v) => {\n params.push(v);\n return `EXISTS (SELECT 1 FROM json_each(${this.jsonExtract(path)}) WHERE value = ?)`;\n });\n return conditions.length === 1\n ? conditions[0]!\n : `(${conditions.join(' AND ')})`;\n },\n $elemMatch: (path, value, params) => {\n const conditions = value as QueryCondition;\n // Generate subquery for array element matching\n const innerConditions = this.translateElemMatchConditions(conditions, params);\n return `EXISTS (SELECT 1 FROM json_each(${this.jsonExtract(path)}) WHERE ${innerConditions})`;\n },\n };\n\n /**\n * Main entry point - translate a MongoDB query to SQL\n */\n translate(query: Record<string, unknown>): TranslatedQuery {\n const params: unknown[] = [];\n\n if (Object.keys(query).length === 0) {\n return { sql: '1 = 1', params: [] };\n }\n\n // Pre-process to flatten nested logical operators if enabled\n const processedQuery = this.options.flattenLogical\n ? this.flattenLogicalOperators(query)\n : query;\n\n const sql = this.translateDocument(processedQuery, params);\n return { sql, params };\n }\n\n /**\n * Flatten nested logical operators of the same type\n * E.g., $and: [{ $and: [a, b] }, c] -> $and: [a, b, c]\n */\n private flattenLogicalOperators(\n query: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(query)) {\n if (key === '$and' || key === '$or') {\n const conditions = value as Record<string, unknown>[];\n const flattened: Record<string, unknown>[] = [];\n\n for (const condition of conditions) {\n // Recursively flatten nested conditions\n const flatCondition = this.flattenLogicalOperators(condition);\n\n // If the nested condition is the same logical operator, merge it\n if (Object.keys(flatCondition).length === 1 && flatCondition[key]) {\n const nestedConditions = flatCondition[key] as Record<string, unknown>[];\n flattened.push(...nestedConditions);\n } else {\n flattened.push(flatCondition);\n }\n }\n\n result[key] = flattened;\n } else if (key === '$nor') {\n // $nor cannot be flattened the same way, but we still process nested conditions\n const conditions = value as Record<string, unknown>[];\n result[key] = conditions.map(c => this.flattenLogicalOperators(c));\n } else if (key.startsWith('$')) {\n // Other operators, just copy\n result[key] = value;\n } else {\n // Field condition - recursively process if it's an object\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const operators = value as Record<string, unknown>;\n const processedOps: Record<string, unknown> = {};\n\n for (const [op, opValue] of Object.entries(operators)) {\n if (op === '$not' && opValue && typeof opValue === 'object') {\n processedOps[op] = this.flattenLogicalOperators(opValue as Record<string, unknown>);\n } else if (op === '$elemMatch' && opValue && typeof opValue === 'object') {\n processedOps[op] = this.flattenLogicalOperators(opValue as Record<string, unknown>);\n } else {\n processedOps[op] = opValue;\n }\n }\n result[key] = processedOps;\n } else {\n result[key] = value;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Translate a query document (top-level or nested)\n */\n private translateDocument(\n query: Record<string, unknown>,\n params: unknown[]\n ): string {\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (key.startsWith('$')) {\n // Logical operator at top level\n const sql = this.translateLogicalOperator(key, value, params);\n conditions.push(sql);\n } else {\n // Field condition\n const sql = this.translateField(key, value, params);\n conditions.push(sql);\n }\n }\n\n if (conditions.length === 0) {\n return '1 = 1';\n }\n\n if (conditions.length === 1) {\n return conditions[0]!;\n }\n\n return `(${conditions.join(' AND ')})`;\n }\n\n /**\n * Translate a field condition\n */\n private translateField(\n field: string,\n value: unknown,\n params: unknown[]\n ): string {\n const path = this.fieldToJsonPath(field);\n\n // Direct value comparison (implicit $eq)\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return this.comparisonOperators.$eq!(path, value, params);\n }\n\n // Object with operators\n const operators = value as Record<string, unknown>;\n const operatorKeys = Object.keys(operators);\n\n // Check if it's an object with operators\n if (operatorKeys.length > 0 && operatorKeys.every(k => k.startsWith('$'))) {\n return this.translateFieldConditions(path, operators, params, false);\n }\n\n // Plain object equality (implicit $eq)\n return this.comparisonOperators.$eq!(path, value, params);\n }\n\n /**\n * Translate conditions on a single field\n */\n private translateFieldConditions(\n path: string,\n conditions: Record<string, unknown>,\n params: unknown[],\n isElemMatch: boolean\n ): string {\n const sqlParts: string[] = [];\n\n // Check for $regex with sibling $options or $regexType\n const hasRegexWithOptions = '$regex' in conditions && ('$options' in conditions || '$regexType' in conditions);\n\n for (const [op, value] of Object.entries(conditions)) {\n // Skip $options and $regexType when they're siblings of $regex (handled together with $regex)\n if ((op === '$options' || op === '$regexType') && hasRegexWithOptions) {\n continue;\n }\n\n let sql: string;\n\n if (op === '$not') {\n // $not wraps another operator\n const innerConditions = value as Record<string, unknown>;\n const innerSql = this.translateFieldConditions(path, innerConditions, params, isElemMatch);\n sql = `NOT (${innerSql})`;\n } else if (op === '$regex' && hasRegexWithOptions) {\n // Handle $regex with sibling $options or $regexType\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n const regexValue = {\n $regex: value,\n $options: conditions.$options,\n $regexType: conditions.$regexType\n };\n sql = this.comparisonOperators[op]!(actualPath, regexValue, params);\n } else if (this.comparisonOperators[op]) {\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n sql = this.comparisonOperators[op]!(actualPath, value, params);\n } else if (this.elementOperators[op]) {\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n sql = this.elementOperators[op]!(actualPath, value, params);\n } else if (this.arrayOperators[op]) {\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n sql = this.arrayOperators[op]!(actualPath, value, params);\n } else {\n // Unknown operator - treat as nested field in elemMatch context\n if (isElemMatch) {\n const nestedPath = this.elemMatchFieldPath(path, op.replace('$', ''));\n sql = this.translateFieldConditions(nestedPath, { $eq: value }, params, true);\n } else {\n throw new Error(`Unknown operator: ${op}`);\n }\n }\n\n sqlParts.push(sql);\n }\n\n if (sqlParts.length === 0) {\n return '1 = 1';\n }\n\n if (sqlParts.length === 1) {\n return sqlParts[0]!;\n }\n\n return `(${sqlParts.join(' AND ')})`;\n }\n\n /**\n * Translate logical operators ($and, $or, $not, $nor, $text)\n */\n private translateLogicalOperator(\n op: string,\n value: unknown,\n params: unknown[]\n ): string {\n switch (op) {\n case '$and': {\n const conditions = value as Record<string, unknown>[];\n if (conditions.length === 0) {\n return '1 = 1';\n }\n const parts = conditions.map(c => this.translateDocument(c, params));\n if (parts.length === 1) {\n return parts[0]!;\n }\n return `(${parts.join(' AND ')})`;\n }\n\n case '$or': {\n const conditions = value as Record<string, unknown>[];\n if (conditions.length === 0) {\n return '0 = 1';\n }\n const parts = conditions.map(c => this.translateDocument(c, params));\n if (parts.length === 1) {\n return parts[0]!;\n }\n return `(${parts.join(' OR ')})`;\n }\n\n case '$nor': {\n const conditions = value as Record<string, unknown>[];\n if (conditions.length === 0) {\n return '1 = 1';\n }\n const parts = conditions.map(c => this.translateDocument(c, params));\n return `NOT (${parts.join(' OR ')})`;\n }\n\n case '$not': {\n // $not at top level wraps a condition\n const innerSql = this.translateDocument(value as Record<string, unknown>, params);\n return `NOT (${innerSql})`;\n }\n\n case '$text': {\n // $text operator for full-text search\n const textOp = value as Record<string, unknown>;\n const { sql } = this.translateTextOperator(textOp, params);\n return sql;\n }\n\n case '$expr': {\n // $expr allows use of aggregation expressions in the query language\n // It enables comparing fields within the same document\n const exprResult = translateExpression(value as Record<string, unknown>, params, this.dialect);\n return exprResult;\n }\n\n case '$jsonSchema': {\n // $jsonSchema validates documents against a JSON Schema\n const schema = value as JsonSchema;\n return this.translateJsonSchema(schema, '$', params);\n }\n\n case '$where': {\n // $where executes JavaScript expressions - NOT SUPPORTED due to security risks\n // MongoDB's $where allows arbitrary JavaScript execution which is a security risk\n // In a SQL context, we cannot safely execute JavaScript\n throw new Error(\n '$where operator is not supported due to security risks. ' +\n 'Use $expr with aggregation expressions instead for field comparisons.'\n );\n }\n\n default:\n throw new Error(`Unknown logical operator: ${op}`);\n }\n }\n\n /**\n * Convert a field name to a JSON path\n * e.g., \"a.b.c\" -> \"$.a.b.c\"\n * e.g., \"items.0.name\" -> \"$.items[0].name\"\n *\n * SECURITY: Validates field name to prevent SQL injection attacks.\n * @throws Error if field contains invalid characters\n */\n private fieldToJsonPath(field: string): string {\n // Validate the entire field path to prevent SQL injection\n validateFieldPath(field);\n\n const parts = field.split('.');\n let path = '$';\n\n for (const part of parts) {\n // Check if part is a numeric index\n if (/^\\d+$/.test(part)) {\n path += `[${part}]`;\n } else {\n path += `.${part}`;\n }\n }\n\n return path;\n }\n\n /**\n * Generate json_extract SQL for a path\n */\n private jsonExtract(path: string): string {\n // If path starts with $, it's a JSON path\n if (path.startsWith('$')) {\n return dialectJsonExtract(this.dialect, 'data', path);\n }\n // Otherwise, it's a direct reference (for elemMatch context)\n return path;\n }\n\n /**\n * Convert a bitwise operator value to a bitmask\n * Accepts either:\n * - A number (used directly as bitmask)\n * - An array of bit positions (converted to bitmask)\n */\n private resolveBitmask(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n if (Array.isArray(value)) {\n // Convert array of bit positions to bitmask\n // e.g., [0, 2, 4] -> 0b10101 = 21\n return value.reduce((mask: number, pos: number) => mask | (1 << pos), 0);\n }\n throw new Error('Bitwise operator value must be a number or array of bit positions');\n }\n\n /**\n * Generate path for elemMatch field access\n * SECURITY: Validates field name to prevent SQL injection attacks.\n */\n private elemMatchFieldPath(basePath: string, field: string): string {\n if (basePath === 'value') {\n // Inside json_each, value is the current element\n if (field === '') {\n return 'value';\n }\n // Validate field name to prevent SQL injection\n validateFieldPath(field);\n return `json_extract(value, '$.${field}')`;\n }\n if (field === '') {\n return basePath;\n }\n // Validate field name to prevent SQL injection\n validateFieldPath(field);\n return `${basePath}.${field}`;\n }\n\n /**\n * Convert a regex pattern to SQLite LIKE/GLOB pattern\n * This handles common regex patterns:\n * - ^pattern -> pattern% (starts with)\n * - pattern$ -> %pattern (ends with)\n * - ^pattern$ -> pattern (exact match)\n * - .* or .+ -> % (any characters)\n * - . -> _ (single character)\n * - [0-9] -> character class (converted to GLOB syntax)\n * - [a-z] -> character class (converted to GLOB syntax)\n * - Literal text -> %text% (contains, default behavior)\n *\n * @param pattern The regex pattern to convert\n * @param options Regex options (i=case-insensitive, m=multiline)\n */\n private regexToLike(pattern: string, options: string = ''): string {\n // For multiline mode, we need special handling of ^ and $\n // In multiline mode, ^ matches start of line (after \\n) and $ matches before \\n\n const isMultiline = options.includes('m');\n\n // Handle anchors\n let startsWithAnchor = pattern.startsWith('^');\n let endsWithAnchor = pattern.endsWith('$') && !pattern.endsWith('\\\\$');\n\n // In multiline mode, anchors match line boundaries, not string boundaries\n // Since LIKE can't match line boundaries, we convert to contains match\n if (isMultiline && (startsWithAnchor || endsWithAnchor)) {\n // For multiline, we treat ^ and $ as matching within the string\n // This is an approximation - LIKE can't truly match line boundaries\n // But we can check for patterns after newline or before newline\n startsWithAnchor = false;\n endsWithAnchor = false;\n }\n\n // Remove anchors for processing\n let processed = pattern;\n if (pattern.startsWith('^')) {\n processed = processed.slice(1);\n }\n if (processed.endsWith('$') && !processed.endsWith('\\\\$')) {\n processed = processed.slice(0, -1);\n }\n\n // Process character by character to handle escaping properly\n let result = '';\n let i = 0;\n while (i < processed.length) {\n const char = processed[i];\n const nextChar = processed[i + 1];\n\n if (char === '\\\\' && nextChar !== undefined) {\n // Escaped character in regex - keep literal character\n // But we need to escape it for LIKE if it's a special LIKE character\n if (nextChar === '%' || nextChar === '_') {\n result += '\\\\' + nextChar;\n } else {\n result += nextChar;\n }\n i += 2;\n } else if (char === '[') {\n // Character class - find the closing bracket\n const endBracket = processed.indexOf(']', i + 1);\n if (endBracket !== -1) {\n const charClass = processed.slice(i + 1, endBracket);\n // Convert common character classes to approximate LIKE patterns\n // [0-9] -> _ (single digit) or % for multiple\n // [a-zA-Z] -> _ (single letter)\n // For now, use _ as a single character match (approximation)\n if (charClass.includes('+') || processed[endBracket + 1] === '+') {\n result += '%';\n i = endBracket + (processed[endBracket + 1] === '+' ? 2 : 1);\n } else if (processed[endBracket + 1] === '*') {\n result += '%';\n i = endBracket + 2;\n } else {\n result += '_';\n i = endBracket + 1;\n }\n } else {\n // No closing bracket, treat [ as literal\n result += char;\n i += 1;\n }\n } else if (char === '.' && nextChar === '*') {\n // .* -> % (any characters)\n result += '%';\n i += 2;\n } else if (char === '.' && nextChar === '+') {\n // .+ -> % (one or more characters, approximate with %)\n result += '%';\n i += 2;\n } else if (char === '.') {\n // . -> _ (single character)\n result += '_';\n i += 1;\n } else if (char === '%') {\n // Escape literal % for LIKE\n result += '\\\\%';\n i += 1;\n } else if (char === '_') {\n // Escape literal _ for LIKE\n result += '\\\\_';\n i += 1;\n } else if (char === '+' || char === '*' || char === '?' || char === '|' || char === '(' || char === ')') {\n // Skip regex quantifiers and grouping - not directly translatable to LIKE\n // These would need more sophisticated handling\n i += 1;\n } else {\n // Regular character\n result += char;\n i += 1;\n }\n }\n\n // Apply wildcards based on anchors\n if (!startsWithAnchor && !endsWithAnchor) {\n // No anchors: match anywhere (contains)\n return `%${result}%`;\n } else if (startsWithAnchor && !endsWithAnchor) {\n // Starts with anchor only\n return `${result}%`;\n } else if (!startsWithAnchor && endsWithAnchor) {\n // Ends with anchor only\n return `%${result}`;\n } else {\n // Both anchors: exact match\n return result;\n }\n }\n\n /**\n * Translate conditions inside $elemMatch\n * This handles document conditions like { field: value, field: { $op: value } }\n * SECURITY: Validates field names to prevent SQL injection attacks.\n */\n private translateElemMatchConditions(\n conditions: Record<string, unknown>,\n params: unknown[]\n ): string {\n const sqlParts: string[] = [];\n\n for (const [field, value] of Object.entries(conditions)) {\n // Validate field name to prevent SQL injection\n validateFieldPath(field);\n // In elemMatch, 'value' refers to the current array element from json_each\n // For nested fields, we use json_extract(value, '$.field')\n const extractPath = `json_extract(value, '$.${field}')`;\n\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n // Direct value comparison\n if (value === null) {\n sqlParts.push(`${extractPath} IS NULL`);\n } else {\n params.push(value);\n sqlParts.push(`${extractPath} = ?`);\n }\n } else {\n // Object with operators\n const operators = value as Record<string, unknown>;\n const opKeys = Object.keys(operators);\n\n if (opKeys.length > 0 && opKeys.every(k => k.startsWith('$'))) {\n // It's operators like { $gte: 90 }\n for (const [op, opValue] of Object.entries(operators)) {\n const opSql = this.translateElemMatchOperator(extractPath, op, opValue, params);\n sqlParts.push(opSql);\n }\n } else {\n // Plain object equality\n params.push(JSON.stringify(value));\n sqlParts.push(`${extractPath} = json(?)`);\n }\n }\n }\n\n if (sqlParts.length === 0) {\n return '1 = 1';\n }\n\n return sqlParts.length === 1 ? sqlParts[0]! : `(${sqlParts.join(' AND ')})`;\n }\n\n /**\n * Translate a single operator for elemMatch context\n */\n private translateElemMatchOperator(\n path: string,\n op: string,\n value: unknown,\n params: unknown[]\n ): string {\n switch (op) {\n case '$eq': {\n if (value === null) {\n return `${path} IS NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const eqValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(eqValue);\n return `${path} = ?`;\n }\n case '$ne': {\n if (value === null) {\n return `${path} IS NOT NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const neValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(neValue);\n return `${path} != ?`;\n }\n case '$gt':\n params.push(value);\n return `${path} > ?`;\n case '$gte':\n params.push(value);\n return `${path} >= ?`;\n case '$lt':\n params.push(value);\n return `${path} < ?`;\n case '$lte':\n params.push(value);\n return `${path} <= ?`;\n case '$in': {\n const arr = value as unknown[];\n if (arr.length === 0) return '0 = 1';\n params.push(...arr);\n return `${path} IN (${arr.map(() => '?').join(', ')})`;\n }\n case '$nin': {\n const arr = value as unknown[];\n if (arr.length === 0) return '1 = 1';\n params.push(...arr);\n return `${path} NOT IN (${arr.map(() => '?').join(', ')})`;\n }\n case '$exists':\n // Use json_type to distinguish between null values and missing fields\n return value ? `json_type(${path}) IS NOT NULL` : `json_type(${path}) IS NULL`;\n case '$regex': {\n // Handle $regex in elemMatch context\n let pattern: string;\n let options: string = '';\n\n if (typeof value === 'string') {\n pattern = value;\n } else if (value instanceof RegExp) {\n pattern = value.source;\n options = value.flags;\n } else if (value && typeof value === 'object') {\n const regexObj = value as { $regex?: string; $options?: string };\n pattern = regexObj.$regex || '';\n options = regexObj.$options || '';\n } else {\n pattern = String(value);\n }\n\n const likePattern = this.regexToLike(pattern, options);\n params.push(likePattern);\n\n // Add type check to ensure we only match string values\n const typeCheck = `json_type(${path}) = 'text'`;\n\n if (options.includes('i')) {\n return `(${typeCheck} AND LOWER(${path}) LIKE LOWER(?))`;\n }\n return `(${typeCheck} AND ${path} LIKE ?)`;\n }\n case '$mod': {\n // Handle $mod in elemMatch context\n const [divisor, remainder] = value as [number, number];\n params.push(divisor, remainder);\n return `(json_type(${path}) IN ('integer', 'real') AND CAST(${path} AS INTEGER) % ? = ?)`;\n }\n default:\n throw new Error(`Unsupported operator in $elemMatch: ${op}`);\n }\n }\n\n /**\n * Generate optimized SQL with CTE for multiple array operations on the same field\n * This is useful when you have multiple $all checks or $elemMatch on the same array\n *\n * Example output:\n * WITH array_cte AS (\n * SELECT value FROM json_each(json_extract(data, '$.tags'))\n * )\n * SELECT * FROM documents WHERE\n * EXISTS (SELECT 1 FROM array_cte WHERE value = ?) AND\n * EXISTS (SELECT 1 FROM array_cte WHERE value = ?)\n */\n translateWithCTE(\n query: Record<string, unknown>,\n tableName: string = 'documents'\n ): TranslatedQuery {\n const params: unknown[] = [];\n\n if (Object.keys(query).length === 0) {\n return { sql: `SELECT * FROM ${tableName}`, params: [] };\n }\n\n // Collect all array fields that have multiple operations\n const arrayFieldOps = this.collectArrayOperations(query);\n const cteDefinitions: string[] = [];\n const cteAliases = new Map<string, string>();\n let cteIndex = 0;\n\n // Create CTEs for fields with multiple array operations\n for (const [field, count] of arrayFieldOps.entries()) {\n if (count > 1) {\n const alias = `arr_cte_${cteIndex++}`;\n const path = this.fieldToJsonPath(field);\n cteDefinitions.push(\n `${alias} AS (SELECT value FROM json_each(json_extract(data, '${path}')))`\n );\n cteAliases.set(field, alias);\n }\n }\n\n // Translate the query, replacing repeated json_each with CTE references\n const whereClause = this.translateDocumentWithCTE(query, params, cteAliases);\n\n let sql: string;\n if (cteDefinitions.length > 0) {\n sql = `WITH ${cteDefinitions.join(', ')} SELECT * FROM ${tableName} WHERE ${whereClause}`;\n } else {\n sql = `SELECT * FROM ${tableName} WHERE ${whereClause}`;\n }\n\n return { sql, params };\n }\n\n /**\n * Collect array operations for CTE optimization analysis\n */\n private collectArrayOperations(\n query: Record<string, unknown>,\n counts: Map<string, number> = new Map()\n ): Map<string, number> {\n for (const [key, value] of Object.entries(query)) {\n if (key === '$and' || key === '$or' || key === '$nor') {\n const conditions = value as Record<string, unknown>[];\n for (const condition of conditions) {\n this.collectArrayOperations(condition, counts);\n }\n } else if (!key.startsWith('$') && value && typeof value === 'object') {\n const operators = value as Record<string, unknown>;\n for (const op of Object.keys(operators)) {\n if (op === '$all' || op === '$elemMatch') {\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n }\n }\n }\n return counts;\n }\n\n /**\n * Translate document using CTE aliases where applicable\n */\n private translateDocumentWithCTE(\n query: Record<string, unknown>,\n params: unknown[],\n _cteAliases: Map<string, string>\n ): string {\n // For now, fall back to standard translation\n // CTE optimization would replace json_each references with CTE aliases\n // This is a placeholder for full CTE implementation\n return this.translateDocument(query, params);\n }\n\n /**\n * Register a custom comparison operator\n * Allows extending the translator with custom operators\n */\n registerOperator(name: string, handler: OperatorHandler): void {\n if (!name.startsWith('$')) {\n throw new Error('Operator name must start with $');\n }\n this.comparisonOperators[name] = handler;\n }\n\n /**\n * Register a custom element operator\n */\n registerElementOperator(name: string, handler: OperatorHandler): void {\n if (!name.startsWith('$')) {\n throw new Error('Operator name must start with $');\n }\n this.elementOperators[name] = handler;\n }\n\n /**\n * Register a custom array operator\n */\n registerArrayOperator(name: string, handler: OperatorHandler): void {\n if (!name.startsWith('$')) {\n throw new Error('Operator name must start with $');\n }\n this.arrayOperators[name] = handler;\n }\n\n /**\n * Translate a MongoDB $text query to FTS5 MATCH SQL\n */\n private translateTextOperator(\n textOp: Record<string, unknown>,\n params: unknown[]\n ): { sql: string; ftsMatch: string } {\n const search = textOp.$search as string;\n const caseSensitive = textOp.$caseSensitive as boolean | undefined;\n const diacriticSensitive = textOp.$diacriticSensitive as boolean | undefined;\n\n // Handle empty search string\n if (!search || search.trim() === '') {\n return { sql: '0 = 1', ftsMatch: '' };\n }\n\n // Convert MongoDB text search syntax to FTS5 syntax\n const ftsQuery = this.convertToFTS5Query(search, caseSensitive, diacriticSensitive);\n\n params.push(ftsQuery);\n\n // Generate the FTS5 MATCH condition\n // This will be joined with the main documents table using rowid\n const sql = `id IN (SELECT rowid FROM {{FTS_TABLE}} WHERE {{FTS_TABLE}} MATCH ?)`;\n\n return { sql, ftsMatch: ftsQuery };\n }\n\n /**\n * Convert MongoDB text search syntax to FTS5 query syntax\n *\n * MongoDB syntax:\n * - \"word\" -> matches word\n * - \"word1 word2\" -> matches word1 OR word2\n * - \"\\\"phrase\\\"\" -> matches exact phrase\n * - \"-word\" -> excludes word (negation)\n *\n * FTS5 syntax:\n * - \"word\" -> matches word\n * - \"word1 OR word2\" -> matches word1 or word2\n * - \"word1 word2\" -> matches word1 AND word2\n * - \"\\\"phrase\\\"\" -> matches exact phrase\n * - \"NOT word\" -> excludes word\n */\n private convertToFTS5Query(\n search: string,\n _caseSensitive?: boolean,\n _diacriticSensitive?: boolean\n ): string {\n // Escape special FTS5 characters except quotes and minus\n const escaped = search.replace(/[&|()^~*:]/g, (char) => {\n return '\\\\' + char;\n });\n\n const tokens: string[] = [];\n let remaining = escaped.trim();\n\n // Parse the search string for phrases and terms\n while (remaining.length > 0) {\n remaining = remaining.trim();\n\n // Check for quoted phrase\n if (remaining.startsWith('\"')) {\n const endQuote = remaining.indexOf('\"', 1);\n if (endQuote > 1) {\n const phrase = remaining.slice(1, endQuote);\n tokens.push(`\"${phrase}\"`);\n remaining = remaining.slice(endQuote + 1);\n continue;\n }\n }\n\n // Check for negation\n if (remaining.startsWith('-')) {\n const spaceIdx = remaining.indexOf(' ');\n const term = spaceIdx > 0 ? remaining.slice(1, spaceIdx) : remaining.slice(1);\n if (term) {\n tokens.push(`NOT ${term}`);\n }\n remaining = spaceIdx > 0 ? remaining.slice(spaceIdx + 1) : '';\n continue;\n }\n\n // Regular term\n const spaceIdx = remaining.indexOf(' ');\n const term = spaceIdx > 0 ? remaining.slice(0, spaceIdx) : remaining;\n if (term) {\n tokens.push(term);\n }\n remaining = spaceIdx > 0 ? remaining.slice(spaceIdx + 1) : '';\n }\n\n // Join tokens - MongoDB uses OR by default for multiple terms\n // FTS5 uses AND by default, so we explicitly use OR\n if (tokens.length === 0) {\n return '*'; // Match all if no valid tokens\n }\n\n // Separate NOT terms from regular terms\n const notTerms = tokens.filter(t => t.startsWith('NOT '));\n const regularTerms = tokens.filter(t => !t.startsWith('NOT '));\n\n let query = '';\n if (regularTerms.length > 0) {\n // Use OR for regular terms (MongoDB default behavior)\n query = regularTerms.join(' OR ');\n }\n\n // Add NOT terms with AND\n if (notTerms.length > 0) {\n if (query) {\n query = `(${query}) AND ${notTerms.join(' AND ')}`;\n } else {\n // Only negations - need a base to negate from\n query = `* AND ${notTerms.join(' AND ')}`;\n }\n }\n\n return query;\n }\n\n /**\n * Translate a query with $meta projection support for textScore\n *\n * @param query The MongoDB query (must contain $text for textScore)\n * @param projection The projection with potential {$meta: \"textScore\"} fields\n * @param sort Optional sort with potential {$meta: \"textScore\"} fields\n */\n translateWithMeta(\n query: Record<string, unknown>,\n projection?: Record<string, unknown>,\n sort?: Record<string, unknown>\n ): TranslatedQuery {\n const params: unknown[] = [];\n\n // Check if query has $text\n const hasText = '$text' in query;\n\n if (!hasText) {\n // No text search, fall back to regular translation\n const baseResult = this.translate(query);\n return baseResult;\n }\n\n // Extract $text operator\n const textOp = query.$text as Record<string, unknown>;\n const { sql: textSql, ftsMatch } = this.translateTextOperator(textOp, params);\n\n // Process remaining query conditions\n const remainingQuery: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(query)) {\n if (key !== '$text') {\n remainingQuery[key] = value;\n }\n }\n\n let whereClause = textSql;\n if (Object.keys(remainingQuery).length > 0) {\n const remainingResult = this.translateDocument(remainingQuery, params);\n whereClause = `(${textSql}) AND (${remainingResult})`;\n }\n\n // Build SELECT clause with textScore if projected\n let selectClause = '*';\n const hasTextScoreProjection = projection && Object.values(projection).some(\n v => v && typeof v === 'object' && (v as Record<string, unknown>).$meta === 'textScore'\n );\n\n if (hasTextScoreProjection) {\n // FTS5 uses bm25() for relevance ranking\n // bm25() returns negative values (more negative = more relevant)\n // We negate it to get positive scores where higher = more relevant\n selectClause = '*, -bm25({{FTS_TABLE}}) as rank';\n }\n\n // Build ORDER BY clause\n let orderByClause = '';\n if (sort) {\n const hasTextScoreSort = Object.values(sort).some(\n v => v && typeof v === 'object' && (v as Record<string, unknown>).$meta === 'textScore'\n );\n\n if (hasTextScoreSort) {\n // Sort by rank (descending by default for textScore)\n orderByClause = ' ORDER BY rank DESC';\n }\n }\n\n return {\n sql: `SELECT ${selectClause} WHERE ${whereClause}${orderByClause}`,\n params,\n requiresFTS: true,\n ftsMatch,\n };\n }\n\n /**\n * Translate a JSON Schema to SQL conditions\n * Supports common JSON Schema validation keywords\n *\n * @param schema The JSON Schema to validate against\n * @param path The current JSON path (e.g., \"$.field.nested\")\n * @param params The parameters array to push values to\n */\n private translateJsonSchema(\n schema: JsonSchema,\n path: string,\n params: unknown[]\n ): string {\n const conditions: string[] = [];\n const jsonPath = path === '$' ? 'data' : `json_extract(data, '${path}')`;\n const typeExpr = path === '$'\n ? 'json_type(data)'\n : dialectJsonType(this.dialect, 'data', path);\n\n // Handle type/bsonType constraint\n const schemaType = schema.type || schema.bsonType;\n if (schemaType) {\n const types = Array.isArray(schemaType) ? schemaType : [schemaType];\n const typeConditions = types.map(t => {\n const sqlType = MONGO_TYPE_TO_SQLITE[t];\n if (Array.isArray(sqlType)) {\n return `${typeExpr} IN (${sqlType.map(st => `'${st}'`).join(', ')})`;\n }\n return `${typeExpr} = '${sqlType || t}'`;\n });\n if (typeConditions.length === 1) {\n conditions.push(typeConditions[0]!);\n } else {\n conditions.push(`(${typeConditions.join(' OR ')})`);\n }\n }\n\n // Handle required fields\n if (schema.required && schema.required.length > 0) {\n for (const field of schema.required) {\n validateFieldPath(field);\n const fieldPath = path === '$' ? `$.${field}` : `${path}.${field}`;\n const existsExpr = dialectJsonTypeWithPath(this.dialect, 'data', fieldPath);\n conditions.push(`${existsExpr} IS NOT NULL`);\n }\n }\n\n // Handle properties\n if (schema.properties) {\n for (const [field, propSchema] of Object.entries(schema.properties)) {\n validateFieldPath(field);\n const fieldPath = path === '$' ? `$.${field}` : `${path}.${field}`;\n const existsExpr = dialectJsonTypeWithPath(this.dialect, 'data', fieldPath);\n // Property validation only applies if the field exists\n const propCondition = this.translateJsonSchema(propSchema, fieldPath, params);\n if (propCondition !== '1 = 1') {\n conditions.push(`(${existsExpr} IS NULL OR ${propCondition})`);\n }\n }\n }\n\n // Handle enum constraint\n if (schema.enum && schema.enum.length > 0) {\n const enumValues = schema.enum.map(v => {\n if (v === null) return 'NULL';\n params.push(typeof v === 'object' ? JSON.stringify(v) : v);\n return '?';\n });\n const nullIncluded = schema.enum.includes(null);\n const nonNullValues = enumValues.filter(v => v !== 'NULL');\n if (nullIncluded && nonNullValues.length > 0) {\n conditions.push(`(${jsonPath} IS NULL OR ${jsonPath} IN (${nonNullValues.join(', ')}))`);\n } else if (nullIncluded) {\n conditions.push(`${jsonPath} IS NULL`);\n } else {\n conditions.push(`${jsonPath} IN (${enumValues.join(', ')})`);\n }\n }\n\n // Handle minimum/maximum for numbers\n if (schema.minimum !== undefined) {\n params.push(schema.minimum);\n conditions.push(`${jsonPath} >= ?`);\n }\n if (schema.maximum !== undefined) {\n params.push(schema.maximum);\n conditions.push(`${jsonPath} <= ?`);\n }\n if (schema.exclusiveMinimum !== undefined) {\n const val = typeof schema.exclusiveMinimum === 'boolean' ? schema.minimum : schema.exclusiveMinimum;\n if (val !== undefined) {\n params.push(val);\n conditions.push(`${jsonPath} > ?`);\n }\n }\n if (schema.exclusiveMaximum !== undefined) {\n const val = typeof schema.exclusiveMaximum === 'boolean' ? schema.maximum : schema.exclusiveMaximum;\n if (val !== undefined) {\n params.push(val);\n conditions.push(`${jsonPath} < ?`);\n }\n }\n\n // Handle minLength/maxLength for strings\n if (schema.minLength !== undefined) {\n params.push(schema.minLength);\n conditions.push(`LENGTH(${jsonPath}) >= ?`);\n }\n if (schema.maxLength !== undefined) {\n params.push(schema.maxLength);\n conditions.push(`LENGTH(${jsonPath}) <= ?`);\n }\n\n // Handle pattern for strings\n if (schema.pattern) {\n const likePattern = this.regexToLike(schema.pattern);\n params.push(likePattern);\n conditions.push(`${jsonPath} LIKE ?`);\n }\n\n // Handle minItems/maxItems for arrays\n if (schema.minItems !== undefined) {\n params.push(schema.minItems);\n const lenExpr = dialectJsonArrayLength(this.dialect, 'data', path);\n conditions.push(`${lenExpr} >= ?`);\n }\n if (schema.maxItems !== undefined) {\n params.push(schema.maxItems);\n const lenExpr = dialectJsonArrayLength(this.dialect, 'data', path);\n conditions.push(`${lenExpr} <= ?`);\n }\n\n // Handle allOf - all schemas must match\n if (schema.allOf && schema.allOf.length > 0) {\n const allOfConditions = schema.allOf.map(s => this.translateJsonSchema(s, path, params));\n conditions.push(`(${allOfConditions.join(' AND ')})`);\n }\n\n // Handle anyOf - at least one schema must match\n if (schema.anyOf && schema.anyOf.length > 0) {\n const anyOfConditions = schema.anyOf.map(s => this.translateJsonSchema(s, path, params));\n conditions.push(`(${anyOfConditions.join(' OR ')})`);\n }\n\n // Handle oneOf - exactly one schema must match (approximated with OR for SQL)\n if (schema.oneOf && schema.oneOf.length > 0) {\n // Note: True oneOf validation (exactly one match) is complex in SQL\n // We approximate with anyOf behavior since exact oneOf requires counting matches\n const oneOfConditions = schema.oneOf.map(s => this.translateJsonSchema(s, path, params));\n conditions.push(`(${oneOfConditions.join(' OR ')})`);\n }\n\n // Handle not - schema must not match\n if (schema.not) {\n const notCondition = this.translateJsonSchema(schema.not, path, params);\n conditions.push(`NOT (${notCondition})`);\n }\n\n if (conditions.length === 0) {\n return '1 = 1';\n }\n\n if (conditions.length === 1) {\n return conditions[0]!;\n }\n\n return `(${conditions.join(' AND ')})`;\n }\n}\n","/**\n * $match stage - Filters documents based on a query condition\n * Translates to SQL WHERE clause using QueryTranslator\n */\n\nimport { QueryTranslator } from '../query-translator'\nimport type { StageResult, StageContext } from './types'\n\nexport function translateMatchStage(\n matchQuery: Record<string, unknown>,\n _context: StageContext\n): StageResult {\n const queryTranslator = new QueryTranslator()\n const { sql, params } = queryTranslator.translate(matchQuery)\n\n return {\n whereClause: sql,\n params\n }\n}\n","/**\n * $project stage - Reshapes documents by including, excluding, or computing fields\n * Translates to SQL SELECT with json_object, json_remove, or computed expressions\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { StageResult, StageContext } from './types'\nimport { translateExpression, isFieldReference, getFieldPath } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport { type SQLDialect, jsonExtract as dialectJsonExtract } from '../dialect'\n\n/**\n * Recursively collect all field references from a $function expression's args\n */\nfunction collectFunctionFieldRefs(expr: unknown): string[] {\n if (!expr || typeof expr !== 'object') return []\n\n const fields: string[] = []\n const exprObj = expr as Record<string, unknown>\n\n // Check if this is a $function expression\n if ('$function' in exprObj) {\n const fnSpec = exprObj.$function as { args?: unknown[] }\n if (fnSpec.args && Array.isArray(fnSpec.args)) {\n for (const arg of fnSpec.args) {\n if (isFieldReference(arg)) {\n // Extract field name from $fieldName reference\n const fieldName = (arg as string).substring(1).split('.')[0]\n if (fieldName) {\n fields.push(fieldName)\n }\n }\n }\n }\n }\n\n // Recursively check nested objects\n for (const value of Object.values(exprObj)) {\n if (value && typeof value === 'object') {\n fields.push(...collectFunctionFieldRefs(value))\n }\n }\n\n return fields\n}\n\nexport function translateProjectStage(\n projection: Record<string, unknown>,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n const fields = Object.entries(projection)\n\n // Check if it's an exclusion projection (all values are 0 except _id)\n const isExclusion = fields.every(([key, value]) => {\n if (key === '_id') return true\n return value === 0\n })\n\n if (isExclusion) {\n return translateExclusionProject(projection, context, params, dialect)\n }\n\n // Inclusion or computed projection\n return translateInclusionProject(projection, context, params, dialect)\n}\n\nfunction translateExclusionProject(\n projection: Record<string, unknown>,\n _context: StageContext,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): StageResult {\n const fieldsToRemove = Object.entries(projection)\n .filter(([key, value]) => value === 0 && key !== '_id')\n .map(([key]) => {\n // Validate field name to prevent SQL injection\n validateFieldPath(key)\n return `'$.${key}'`\n })\n\n let selectClause: string\n if (fieldsToRemove.length > 0) {\n if (dialect === 'clickhouse') {\n // ClickHouse doesn't have json_remove, would need different approach\n selectClause = 'data' // Simplified for now\n } else {\n selectClause = `json_remove(data, ${fieldsToRemove.join(', ')}) AS data`\n }\n } else {\n selectClause = 'data'\n }\n\n return {\n selectClause,\n params\n }\n}\n\nfunction translateInclusionProject(\n projection: Record<string, unknown>,\n _context: StageContext,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): StageResult {\n const jsonParts: string[] = []\n\n // Collect all field references needed by $function expressions\n // These need to be included in the output so the function executor can extract them\n const functionFieldRefs = new Set<string>()\n for (const [, value] of Object.entries(projection)) {\n if (typeof value === 'object' && value !== null) {\n const refs = collectFunctionFieldRefs(value)\n refs.forEach(ref => functionFieldRefs.add(ref))\n }\n }\n\n // First, add the explicitly projected fields\n const explicitFields = new Set<string>()\n for (const [key, value] of Object.entries(projection)) {\n // Validate key (output field name) to prevent SQL injection\n validateFieldPath(key)\n explicitFields.add(key)\n if (value === 1) {\n // Include existing field\n const fieldExpr = dialectJsonExtract(dialect, 'data', `$.${key}`)\n jsonParts.push(`'${key}', ${fieldExpr}`)\n } else if (typeof value === 'string' && value.startsWith('$')) {\n // Field reference (renaming) - getFieldPath validates the field\n const fieldPath = getFieldPath(value)\n const fieldExpr = dialectJsonExtract(dialect, 'data', fieldPath)\n jsonParts.push(`'${key}', ${fieldExpr}`)\n } else if (typeof value === 'object' && value !== null) {\n // Expression\n const exprSql = translateExpression(value as Record<string, unknown>, params, dialect)\n jsonParts.push(`'${key}', ${exprSql}`)\n } else if (value !== 0) {\n // Literal value\n if (typeof value === 'string') {\n params.push(value)\n jsonParts.push(`'${key}', ?`)\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n jsonParts.push(`'${key}', ${JSON.stringify(value)}`)\n }\n }\n }\n\n // Add source fields needed by $function that aren't already projected\n // These will be used by the function executor to extract argument values\n for (const fieldRef of functionFieldRefs) {\n if (!explicitFields.has(fieldRef)) {\n // Validate field reference to prevent SQL injection\n validateFieldPath(fieldRef)\n const fieldExpr = dialectJsonExtract(dialect, 'data', `$.${fieldRef}`)\n jsonParts.push(`'${fieldRef}', ${fieldExpr}`)\n }\n }\n\n const selectClause = dialect === 'clickhouse'\n ? `tuple(${jsonParts.join(', ')}) AS data`\n : `json_object(${jsonParts.join(', ')}) AS data`\n\n return {\n selectClause,\n params,\n transformsShape: true\n }\n}\n","/**\n * $group stage - Groups documents by a specified expression\n * Translates to SQL GROUP BY with aggregate functions\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { StageResult, StageContext, GroupStage } from './types'\nimport { isFieldReference, getFieldPath, translateExpressionValue } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport { type SQLDialect, getAggregationFunctions, jsonExtract as dialectJsonExtract } from '../dialect'\n\nexport function translateGroupStage(\n group: GroupStage,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n\n // Validate _id is present\n if (!('_id' in group)) {\n throw new Error('$group requires _id field')\n }\n\n const { _id, ...accumulators } = group\n\n // Build GROUP BY clause\n const groupByFields: string[] = []\n const selectParts: string[] = []\n\n if (_id === null) {\n // Total aggregation - no GROUP BY\n selectParts.push(\"'_id', NULL\")\n } else if (typeof _id === 'string' && isFieldReference(_id)) {\n // Simple field grouping\n const path = getFieldPath(_id)\n const fieldExpr = dialectJsonExtract(dialect, 'data', path)\n groupByFields.push(fieldExpr)\n selectParts.push(`'_id', ${fieldExpr}`)\n } else if (typeof _id === 'object' && _id !== null) {\n // Compound _id\n const idParts: string[] = []\n for (const [key, value] of Object.entries(_id)) {\n // Validate key to prevent SQL injection\n validateFieldPath(key)\n if (typeof value === 'string' && isFieldReference(value)) {\n // getFieldPath validates the field reference\n const path = getFieldPath(value)\n const fieldExpr = dialectJsonExtract(dialect, 'data', path)\n groupByFields.push(fieldExpr)\n idParts.push(`'${key}', ${fieldExpr}`)\n }\n }\n if (dialect === 'clickhouse') {\n selectParts.push(`'_id', tuple(${idParts.join(', ')})`)\n } else {\n selectParts.push(`'_id', json_object(${idParts.join(', ')})`)\n }\n }\n\n // Build accumulators\n for (const [field, accumulator] of Object.entries(accumulators)) {\n // Validate field name to prevent SQL injection\n validateFieldPath(field)\n const accSql = translateAccumulator(accumulator as Record<string, unknown>, params, dialect)\n selectParts.push(`'${field}', ${accSql}`)\n }\n\n const selectClause = dialect === 'clickhouse'\n ? `tuple(${selectParts.join(', ')}) AS data`\n : `json_object(${selectParts.join(', ')}) AS data`\n\n const result: StageResult = {\n selectClause,\n params,\n transformsShape: true\n }\n if (groupByFields.length > 0) {\n result.groupByClause = groupByFields.join(', ')\n }\n return result\n}\n\nfunction translateAccumulator(\n accumulator: Record<string, unknown>,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n const operator = Object.keys(accumulator)[0]!\n const value = accumulator[operator]\n const aggFns = getAggregationFunctions(dialect)\n\n switch (operator) {\n case '$sum': {\n if (typeof value === 'number') {\n // $sum: 1 counts documents\n if (value === 1) {\n return aggFns.count()\n }\n return aggFns.sum(String(value))\n }\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.sum(expr)\n }\n\n case '$avg': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.avg(expr)\n }\n\n case '$min': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.min(expr)\n }\n\n case '$max': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.max(expr)\n }\n\n case '$count': {\n return aggFns.count()\n }\n\n case '$first': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.first(expr)\n }\n\n case '$last': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.last(expr)\n }\n\n case '$push': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.push(expr)\n }\n\n case '$addToSet': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.addToSet(expr)\n }\n\n default:\n throw new Error(`Unknown accumulator operator: ${operator}`)\n }\n}\n","/**\n * $sort stage - Sorts documents by specified fields\n * Translates to SQL ORDER BY clause\n */\n\nimport type { StageResult, StageContext } from './types'\nimport { getFieldPath } from './expression-translator'\n\nexport function translateSortStage(\n sort: Record<string, 1 | -1>,\n _context: StageContext\n): StageResult {\n const orderParts: string[] = []\n\n for (const [field, direction] of Object.entries(sort)) {\n if (direction !== 1 && direction !== -1) {\n throw new Error('$sort direction must be 1 or -1')\n }\n\n const path = getFieldPath('$' + field)\n const dirStr = direction === 1 ? 'ASC' : 'DESC'\n orderParts.push(`json_extract(data, '${path}') ${dirStr}`)\n }\n\n return {\n orderByClause: orderParts.join(', '),\n params: []\n }\n}\n","/**\n * $limit stage - Limits the number of documents\n * Translates to SQL LIMIT clause\n */\n\nimport type { StageResult, StageContext } from './types'\n\nexport function translateLimitStage(\n limit: number,\n _context: StageContext\n): StageResult {\n return {\n limitClause: `LIMIT ${limit}`,\n params: []\n }\n}\n","/**\n * $skip stage - Skips a number of documents\n * Translates to SQL OFFSET clause\n */\n\nimport type { StageResult, StageContext } from './types'\n\nexport function translateSkipStage(\n skip: number,\n _context: StageContext\n): StageResult {\n return {\n offsetClause: `OFFSET ${skip}`,\n params: []\n }\n}\n","/**\n * $count stage - Counts documents and returns a single document with the count\n * Translates to SELECT COUNT(*) AS fieldName\n */\n\nimport type { StageResult, StageContext } from './types'\n\nexport function translateCountStage(\n fieldName: string,\n _context: StageContext\n): StageResult {\n return {\n selectClause: `json_object('${fieldName}', COUNT(*)) AS data`,\n params: [],\n transformsShape: true\n }\n}\n","/**\n * $lookup stage - Performs a left outer join with another collection\n * Translates to SQL LEFT JOIN or subquery\n */\n\nimport type { StageResult, StageContext, LookupStage } from './types'\nimport { getFieldPath } from './expression-translator'\n\nexport function translateLookupStage(\n lookup: LookupStage,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const { localField, foreignField } = lookup\n\n if (localField && foreignField) {\n // Simple lookup with localField/foreignField\n return translateSimpleLookup(lookup, context, params)\n } else if (lookup.let && lookup.pipeline) {\n // Pipeline lookup\n return translatePipelineLookup(lookup, context, params)\n }\n\n throw new Error('$lookup requires either localField/foreignField or let/pipeline')\n}\n\nfunction translateSimpleLookup(\n lookup: LookupStage,\n context: StageContext,\n params: unknown[]\n): StageResult {\n const { from, localField, foreignField, as } = lookup\n\n const source = context.previousCte || context.collection\n const localPath = getFieldPath('$' + localField!)\n const foreignPath = getFieldPath('$' + foreignField!)\n\n // Use a subquery to collect matching documents as a JSON array\n const cteName = `stage_${context.cteIndex}`\n const cteExpression = `\n SELECT\n ${source}.data,\n COALESCE(\n (SELECT json_group_array(${from}.data)\n FROM ${from}\n WHERE json_extract(${from}.data, '${foreignPath}') = json_extract(${source}.data, '${localPath}')),\n '[]'\n ) AS lookup_result\n FROM ${source}\n `\n\n // The result should merge lookup_result into data as the 'as' field\n const selectClause = `json_set(data, '$.${as}', json(lookup_result)) AS data`\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n selectClause,\n params,\n transformsShape: true\n }\n}\n\nfunction translatePipelineLookup(\n lookup: LookupStage,\n context: StageContext,\n params: unknown[]\n): StageResult {\n const { from, as } = lookup\n\n // For pipeline lookups, we need to handle variable substitution\n // This is a simplified implementation\n const source = context.previousCte || context.collection\n const cteName = `stage_${context.cteIndex}`\n\n // Build the inner query for the lookup\n // In a full implementation, we'd translate the pipeline with variable substitution\n const cteExpression = `\n SELECT\n ${source}.data,\n COALESCE(\n (SELECT json_group_array(${from}.data) FROM ${from}),\n '[]'\n ) AS lookup_result\n FROM ${source}\n `\n\n const selectClause = `json_set(data, '$.${as}', json(lookup_result)) AS data`\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n selectClause,\n params,\n transformsShape: true\n }\n}\n","/**\n * $unwind stage - Deconstructs an array field to output one document per element\n * Translates to SQL using json_each for SQLite or ARRAY JOIN for ClickHouse\n */\n\nimport type { StageResult, StageContext, UnwindStage } from './types'\nimport { getFieldPath } from './expression-translator'\nimport { type SQLDialect, jsonExtract as dialectJsonExtract } from '../dialect'\n\nexport function translateUnwindStage(\n unwind: string | UnwindStage,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n\n // Normalize to UnwindStage format\n const config: UnwindStage = typeof unwind === 'string'\n ? { path: unwind }\n : unwind\n\n const { path, includeArrayIndex, preserveNullAndEmptyArrays } = config\n\n // Remove leading $ from path\n const fieldName = path.startsWith('$') ? path.substring(1) : path\n const jsonPath = getFieldPath('$' + fieldName)\n\n const source = context.previousCte || context.collection\n const cteName = `stage_${context.cteIndex}`\n\n if (dialect === 'clickhouse') {\n // ClickHouse uses ARRAY JOIN syntax\n const arrayExpr = dialectJsonExtract(dialect, `${source}.doc`, jsonPath)\n const leftJoin = preserveNullAndEmptyArrays ? 'LEFT ' : ''\n\n let selectParts = `*, ${fieldName}_element AS ${fieldName}`\n if (includeArrayIndex) {\n selectParts = `*, ${fieldName}_element AS ${fieldName}, ${fieldName}_index AS ${includeArrayIndex}`\n }\n\n const cteExpression = `\n SELECT ${selectParts}\n FROM ${source}\n ${leftJoin}ARRAY JOIN ${arrayExpr} AS ${fieldName}_element${includeArrayIndex ? `, arrayEnumerate(${arrayExpr}) AS ${fieldName}_index` : ''}\n `\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n params,\n transformsShape: true\n }\n }\n\n // SQLite uses json_each\n // Build the join type based on preserveNullAndEmptyArrays\n const joinType = preserveNullAndEmptyArrays ? 'LEFT JOIN' : 'JOIN'\n\n // Build the SELECT clause\n let selectParts = `json_set(${source}.data, '${jsonPath}', each.value) AS data`\n\n if (includeArrayIndex) {\n // Include the array index in the output\n selectParts = `json_set(json_set(${source}.data, '${jsonPath}', each.value), '$.${includeArrayIndex}', each.key) AS data`\n }\n\n const cteExpression = `\n SELECT ${selectParts}\n FROM ${source}\n ${joinType} json_each(json_extract(${source}.data, '${jsonPath}')) AS each\n `\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n params,\n transformsShape: true\n }\n}\n","/**\n * $addFields stage - Adds new fields to documents\n * Translates to SQL using json_set (SQLite) or tuple functions (ClickHouse)\n */\n\nimport type { StageResult, StageContext } from './types'\nimport { translateExpressionValue, isFieldReference, getFieldPath } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport { type SQLDialect, jsonExtract as dialectJsonExtract } from '../dialect'\n\nexport function translateAddFieldsStage(\n addFields: Record<string, unknown>,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n\n // Build nested json_set calls for each field\n let result = 'data'\n\n for (const [field, value] of Object.entries(addFields)) {\n // Validate field name to prevent SQL injection\n validateFieldPath(field)\n const jsonPath = `'$.${field}'`\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Expression\n const exprSql = translateExpressionValue(value, params, dialect)\n if (dialect === 'clickhouse') {\n // ClickHouse would need different handling\n result = `tuple(${result}, '${field}', ${exprSql})`\n } else {\n result = `json_set(${result}, ${jsonPath}, ${exprSql})`\n }\n } else if (isFieldReference(value)) {\n // Field reference - getFieldPath validates the field\n const fieldPath = getFieldPath(value)\n const fieldExpr = dialectJsonExtract(dialect, 'data', fieldPath)\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ${fieldExpr})`\n } else {\n result = `json_set(${result}, ${jsonPath}, ${fieldExpr})`\n }\n } else if (typeof value === 'string') {\n params.push(value)\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ?)`\n } else {\n result = `json_set(${result}, ${jsonPath}, ?)`\n }\n } else if (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ${JSON.stringify(value)})`\n } else {\n result = `json_set(${result}, ${jsonPath}, ${JSON.stringify(value)})`\n }\n } else if (Array.isArray(value)) {\n params.push(JSON.stringify(value))\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ?)`\n } else {\n result = `json_set(${result}, ${jsonPath}, json(?))`\n }\n }\n }\n\n return {\n selectClause: `${result} AS data`,\n params,\n transformsShape: true\n }\n}\n","/**\n * $bucket stage - Categorizes documents into groups (buckets) based on a specified expression\n * Translates to SQL using CASE WHEN for bucket boundaries\n */\n\nimport type { StageResult, StageContext, BucketStage } from './types'\nimport { getFieldPath, translateExpressionValue } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\n\nexport function translateBucketStage(\n bucket: BucketStage,\n _context: StageContext\n): StageResult {\n const params: unknown[] = []\n const { groupBy, boundaries, output } = bucket\n const defaultBucket = bucket.default\n\n // Get the field to bucket on - getFieldPath validates the field reference\n // If not a $ reference, validate directly\n let fieldPath: string\n if (groupBy.startsWith('$')) {\n fieldPath = getFieldPath(groupBy)\n } else {\n validateFieldPath(groupBy)\n fieldPath = `$.${groupBy}`\n }\n const fieldExpr = `json_extract(data, '${fieldPath}')`\n\n // Build CASE WHEN expression for bucket assignment\n const bucketCases: string[] = []\n\n for (let i = 0; i < boundaries.length - 1; i++) {\n const lower = boundaries[i]\n const upper = boundaries[i + 1]\n bucketCases.push(`WHEN ${fieldExpr} >= ${lower} AND ${fieldExpr} < ${upper} THEN ${lower}`)\n }\n\n // Handle default bucket\n const defaultCase = defaultBucket !== undefined\n ? `ELSE '${defaultBucket}'`\n : `ELSE NULL`\n\n const bucketExpr = `CASE ${bucketCases.join(' ')} ${defaultCase} END`\n\n // Build the output accumulators\n const selectParts: string[] = [`'_id', ${bucketExpr}`]\n\n if (output) {\n for (const [field, accumulator] of Object.entries(output)) {\n const accSql = translateBucketAccumulator(accumulator as Record<string, unknown>, params)\n selectParts.push(`'${field}', ${accSql}`)\n }\n } else {\n // Default output is count\n selectParts.push(`'count', COUNT(*)`)\n }\n\n return {\n selectClause: `json_object(${selectParts.join(', ')}) AS data`,\n groupByClause: bucketExpr,\n params,\n transformsShape: true\n }\n}\n\nfunction translateBucketAccumulator(\n accumulator: Record<string, unknown>,\n params: unknown[]\n): string {\n const operator = Object.keys(accumulator)[0]!\n const value = accumulator[operator]\n\n switch (operator) {\n case '$sum': {\n if (typeof value === 'number') {\n return `COUNT(*)`\n }\n const expr = translateExpressionValue(value, params)\n return `SUM(${expr})`\n }\n\n case '$avg': {\n const expr = translateExpressionValue(value, params)\n return `AVG(${expr})`\n }\n\n case '$min': {\n const expr = translateExpressionValue(value, params)\n return `MIN(${expr})`\n }\n\n case '$max': {\n const expr = translateExpressionValue(value, params)\n return `MAX(${expr})`\n }\n\n case '$count': {\n return 'COUNT(*)'\n }\n\n case '$push': {\n const expr = translateExpressionValue(value, params)\n return `json_group_array(${expr})`\n }\n\n default:\n throw new Error(`Unknown bucket accumulator operator: ${operator}`)\n }\n}\n","/**\n * $facet stage - Processes multiple aggregation pipelines in a single stage\n * Translates to multiple separate queries (can be run in parallel)\n */\n\nimport type { StageResult, StageContext, PipelineStage } from './types'\n\nexport interface FacetTranslator {\n translatePipeline(stages: PipelineStage[], collection: string): { sql: string; params: unknown[] }\n}\n\nexport function translateFacetStage(\n facet: Record<string, PipelineStage[]>,\n context: StageContext,\n pipelineTranslator: FacetTranslator\n): StageResult {\n const params: unknown[] = []\n const facets: Record<string, { sql: string; params: unknown[] }> = {}\n\n // Each facet is an independent pipeline\n for (const [facetName, pipeline] of Object.entries(facet)) {\n // Use the previous CTE or collection as the source for each facet\n const source = context.previousCte || context.collection\n\n // Translate each facet pipeline independently\n const result = pipelineTranslator.translatePipeline(pipeline, source)\n facets[facetName] = result\n }\n\n // The final result combines all facets\n // In practice, this would be assembled in the application layer\n // Here we provide the individual queries\n\n return {\n facets,\n params,\n selectClause: 'NULL', // Facets are handled separately\n transformsShape: true\n }\n}\n","/**\n * SearchTranslator - Translates MongoDB Atlas Search syntax to SQLite FTS5 MATCH syntax\n *\n * MongoDB Atlas Search operators:\n * - text: Full-text search on specified path(s)\n * - phrase: Exact phrase search\n * - wildcard: Wildcard pattern matching\n * - compound: Boolean combinations (must, should, mustNot, filter)\n *\n * FTS5 MATCH syntax:\n * - term: Simple word match\n * - \"phrase\": Exact phrase match\n * - prefix*: Prefix matching\n * - term1 AND term2: Both must match\n * - term1 OR term2: Either must match\n * - NOT term: Exclude term\n * - column:term: Match in specific column\n */\n\nexport interface SearchResult {\n /** The FTS5 MATCH expression */\n ftsMatch: string;\n /** SQL parameters for parameterized queries */\n params: unknown[];\n /** The FTS table name to query */\n ftsTable?: string;\n}\n\nexport interface TextOperator {\n query: string;\n path?: string | string[];\n fuzzy?: {\n maxEdits?: number;\n prefixLength?: number;\n };\n score?: {\n boost?: number;\n };\n}\n\nexport interface PhraseOperator {\n query: string;\n path?: string | string[];\n slop?: number;\n score?: {\n boost?: number;\n };\n}\n\nexport interface WildcardOperator {\n query: string;\n path?: string | string[];\n allowAnalyzedField?: boolean;\n score?: {\n boost?: number;\n };\n}\n\nexport interface AutocompleteOperator {\n query: string;\n path?: string | string[];\n tokenOrder?: 'any' | 'sequential';\n fuzzy?: {\n maxEdits?: number;\n prefixLength?: number;\n maxExpansions?: number;\n };\n score?: {\n boost?: number;\n };\n}\n\nexport interface CompoundOperator {\n must?: SearchOperator[];\n should?: SearchOperator[];\n mustNot?: SearchOperator[];\n filter?: SearchOperator[];\n minimumShouldMatch?: number;\n}\n\nexport interface SearchOperator {\n text?: TextOperator;\n phrase?: PhraseOperator;\n wildcard?: WildcardOperator;\n compound?: CompoundOperator;\n autocomplete?: AutocompleteOperator;\n}\n\n/**\n * SearchTranslator converts MongoDB Atlas Search syntax to SQLite FTS5 MATCH syntax\n */\nexport class SearchTranslator {\n /**\n * Translate a MongoDB $search operator to FTS5 MATCH expression\n *\n * @param search The MongoDB $search operator value\n * @param collection The collection name (used for FTS table naming)\n * @returns SearchResult with FTS5 MATCH expression\n */\n translateSearch(search: SearchOperator, collection: string): SearchResult {\n const params: unknown[] = [];\n\n const ftsMatch = this.translateOperator(search);\n\n return {\n ftsMatch,\n params,\n ftsTable: `${collection}_fts`,\n };\n }\n\n /**\n * Translate a single search operator to FTS5 syntax\n */\n private translateOperator(operator: SearchOperator): string {\n if (operator.text) {\n return this.translateText(operator.text);\n }\n\n if (operator.phrase) {\n return this.translatePhrase(operator.phrase);\n }\n\n if (operator.wildcard) {\n return this.translateWildcard(operator.wildcard);\n }\n\n if (operator.compound) {\n return this.translateCompound(operator.compound);\n }\n\n if (operator.autocomplete) {\n return this.translateAutocomplete(operator.autocomplete);\n }\n\n return '*'; // Match all if no operator specified\n }\n\n /**\n * Translate text operator to FTS5 terms\n *\n * MongoDB: { text: { query: \"hello world\", path: \"content\" } }\n * FTS5: content:hello content:world\n */\n private translateText(text: TextOperator): string {\n const { query, path } = text;\n\n // Split query into terms and escape each term to prevent FTS5 injection\n const terms = query.trim().split(/\\s+/).filter(t => t.length > 0).map(t => this.escapeFTS5Term(t));\n\n if (terms.length === 0) {\n return '*';\n }\n\n // If path is specified, prefix each term with the column\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n return terms.map(term => `${column}:${term}`).join(' ');\n }\n\n // No path specified - search all fields\n return terms.join(' ');\n }\n\n /**\n * Translate phrase operator to FTS5 quoted phrase\n *\n * MongoDB: { phrase: { query: \"hello world\", path: \"title\" } }\n * FTS5: title:\"hello world\"\n */\n private translatePhrase(phrase: PhraseOperator): string {\n const { query, path } = phrase;\n\n // Escape the phrase content to prevent FTS5 injection\n // For phrases, we escape and then wrap in quotes\n const escapedPhrase = this.escapeFTS5Term(query);\n const quotedPhrase = `\"${escapedPhrase}\"`;\n\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n return `${column}:${quotedPhrase}`;\n }\n\n return quotedPhrase;\n }\n\n /**\n * Translate wildcard operator to FTS5 prefix matching\n *\n * MongoDB: { wildcard: { query: \"data*\", path: \"content\" } }\n * FTS5: content:data*\n */\n private translateWildcard(wildcard: WildcardOperator): string {\n const { query, path } = wildcard;\n\n // For wildcard queries, we need to escape special chars but preserve the wildcard (*) at the end\n // First check if query ends with wildcard\n const hasTrailingWildcard = query.endsWith('*');\n const baseQuery = hasTrailingWildcard ? query.slice(0, -1) : query;\n const escapedQuery = this.escapeFTS5Term(baseQuery) + (hasTrailingWildcard ? '*' : '');\n\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n return `${column}:${escapedQuery}`;\n }\n\n return escapedQuery;\n }\n\n /**\n * Translate autocomplete operator to FTS5 prefix query\n *\n * MongoDB: { autocomplete: { query: \"mach\", path: \"title\" } }\n * FTS5: title:mach*\n *\n * Autocomplete uses prefix matching (term*) to find partial word matches.\n * When tokenOrder is 'sequential', terms must appear in order.\n */\n private translateAutocomplete(autocomplete: AutocompleteOperator): string {\n const { query, path, tokenOrder } = autocomplete;\n\n // Split query into terms and escape each term to prevent FTS5 injection\n const terms = query.trim().split(/\\s+/).filter(t => t.length > 0).map(t => this.escapeFTS5Term(t));\n\n if (terms.length === 0) {\n return '*';\n }\n\n // Add prefix wildcard to each term for autocomplete\n const prefixTerms = terms.map(term => `${term}*`);\n\n // If path is specified, prefix each term with the column\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n\n if (tokenOrder === 'sequential' && prefixTerms.length > 1) {\n // For sequential, terms must appear in order - use phrase-like matching\n // FTS5 doesn't support prefix in phrases, so we use NEAR/0 for adjacent terms\n // But for simplicity, we join with spaces which requires all terms\n return prefixTerms.map(term => `${column}:${term}`).join(' ');\n }\n\n return prefixTerms.map(term => `${column}:${term}`).join(' ');\n }\n\n // No path specified - search all fields\n if (tokenOrder === 'sequential' && prefixTerms.length > 1) {\n return prefixTerms.join(' ');\n }\n\n return prefixTerms.join(' ');\n }\n\n /**\n * Translate compound operator to FTS5 boolean expression\n *\n * MongoDB compound operators:\n * - must: All clauses must match (AND)\n * - should: At least one should match (OR)\n * - mustNot: None should match (NOT)\n * - filter: Same as must but without scoring\n */\n private translateCompound(compound: CompoundOperator): string {\n const parts: string[] = [];\n\n // Process 'must' clauses (AND)\n if (compound.must && compound.must.length > 0) {\n const mustClauses = compound.must.map(op => this.translateOperator(op));\n if (mustClauses.length === 1) {\n parts.push(mustClauses[0]!);\n } else {\n parts.push(`(${mustClauses.join(' AND ')})`);\n }\n }\n\n // Process 'filter' clauses (same as must)\n if (compound.filter && compound.filter.length > 0) {\n const filterClauses = compound.filter.map(op => this.translateOperator(op));\n if (filterClauses.length === 1) {\n parts.push(filterClauses[0]!);\n } else {\n parts.push(`(${filterClauses.join(' AND ')})`);\n }\n }\n\n // Process 'should' clauses (OR)\n if (compound.should && compound.should.length > 0) {\n const shouldClauses = compound.should.map(op => this.translateOperator(op));\n if (shouldClauses.length === 1) {\n parts.push(shouldClauses[0]!);\n } else {\n parts.push(`(${shouldClauses.join(' OR ')})`);\n }\n }\n\n // Process 'mustNot' clauses (NOT)\n if (compound.mustNot && compound.mustNot.length > 0) {\n const mustNotClauses = compound.mustNot.map(op => `NOT ${this.translateOperator(op)}`);\n parts.push(...mustNotClauses);\n }\n\n if (parts.length === 0) {\n return '*';\n }\n\n if (parts.length === 1) {\n return parts[0]!;\n }\n\n // Join all parts with AND\n return parts.join(' AND ');\n }\n\n /**\n * Escape special FTS5 characters in a term\n */\n private escapeFTS5Term(term: string): string {\n // FTS5 special characters that need escaping\n return term.replace(/[&|()^~*:\"]/g, char => `\\\\${char}`);\n }\n\n /**\n * Build the complete SQL query for a $search aggregation stage\n *\n * @param search The MongoDB $search operator\n * @param collection The collection name\n * @param documentsTable The documents table name (default: 'documents')\n * @returns Complete SQL query with FTS5 join\n */\n buildSearchSQL(\n search: SearchOperator,\n collection: string,\n documentsTable: string = 'documents'\n ): { sql: string; params: unknown[] } {\n const result = this.translateSearch(search, collection);\n const ftsTable = result.ftsTable || `${collection}_fts`;\n\n // Build SQL with FTS5 join\n // FTS5 uses rowid for joining with the content table\n const sql = `\n SELECT ${documentsTable}.*, -bm25(${ftsTable}) AS _searchScore\n FROM ${documentsTable}\n JOIN ${ftsTable} ON ${documentsTable}.id = ${ftsTable}.rowid\n WHERE ${ftsTable} MATCH ?\n ORDER BY _searchScore DESC\n `.trim();\n\n return {\n sql,\n params: [result.ftsMatch],\n };\n }\n}\n","/**\n * $search stage - MongoDB Atlas Search integration\n *\n * Translates MongoDB $search aggregation stage to SQLite FTS5 queries.\n * The $search stage must be the first stage in an aggregation pipeline.\n *\n * Supported operators:\n * - text: Full-text search on specified fields\n * - phrase: Exact phrase matching\n * - wildcard: Wildcard pattern matching\n * - compound: Boolean combinations (must, should, mustNot, filter)\n */\n\nimport { SearchTranslator, type SearchOperator } from '../search-translator';\nimport type { StageResult, StageContext } from './types';\n\n/**\n * Extended context for search stage\n */\nexport interface SearchStageContext extends StageContext {\n /** Include relevance score in results */\n includeScore?: boolean;\n}\n\n/**\n * Result from search stage translation\n */\nexport interface SearchStageResult extends StageResult {\n /** FTS5 MATCH expression */\n ftsMatch: string;\n /** FTS table name */\n ftsTable: string;\n /** JOIN clause for FTS table */\n ftsJoin: string;\n}\n\n/**\n * $search stage input with optional index name\n */\nexport interface SearchStageInput extends SearchOperator {\n /** Named search index to use */\n index?: string;\n}\n\n/**\n * Translate a $search aggregation stage to SQL\n *\n * @param searchSpec The $search stage specification\n * @param context Stage context including collection name\n * @returns SearchStageResult with FTS5 query components\n */\nexport function translateSearchStage(\n searchSpec: SearchStageInput,\n context: SearchStageContext\n): SearchStageResult {\n const translator = new SearchTranslator();\n\n // Extract the search operator (remove 'index' if present)\n const { index, ...searchOperator } = searchSpec;\n\n // Determine FTS table name\n const ftsTable = `${context.collection}_fts`;\n\n // Translate the search operator to FTS5 MATCH expression\n const searchResult = translator.translateSearch(searchOperator, context.collection);\n\n // Build the JOIN clause for FTS5 table\n const ftsJoin = `JOIN ${ftsTable} ON documents.id = ${ftsTable}.rowid`;\n\n // Build SELECT clause with optional score\n let selectClause: string | undefined;\n if (context.includeScore) {\n // FTS5 bm25() returns negative values (more negative = more relevant)\n // Negate to get positive scores where higher = more relevant\n selectClause = `*, -bm25(${ftsTable}) AS _searchScore`;\n }\n\n // Build WHERE clause\n const whereClause = `${ftsTable} MATCH ?`;\n\n // Build ORDER BY clause for relevance ranking\n const orderByClause = context.includeScore ? `_searchScore DESC` : undefined;\n\n const result: SearchStageResult = {\n ftsMatch: searchResult.ftsMatch,\n ftsTable,\n ftsJoin,\n whereClause,\n params: [searchResult.ftsMatch],\n };\n if (selectClause !== undefined) {\n result.selectClause = selectClause;\n }\n if (orderByClause !== undefined) {\n result.orderByClause = orderByClause;\n }\n if (context.includeScore !== undefined) {\n result.transformsShape = context.includeScore;\n }\n return result;\n}\n\n/**\n * Build complete SQL for a $search stage\n *\n * @param searchSpec The $search specification\n * @param collection Collection name\n * @param includeScore Whether to include relevance score\n * @returns Complete SQL query and parameters\n */\nexport function buildSearchSQL(\n searchSpec: SearchStageInput,\n collection: string,\n includeScore: boolean = false\n): { sql: string; params: unknown[] } {\n const context: SearchStageContext = {\n collection,\n cteIndex: 0,\n existingParams: [],\n includeScore,\n };\n\n const result = translateSearchStage(searchSpec, context);\n\n const selectClause = result.selectClause || '*';\n\n const sql = `\n SELECT ${selectClause}\n FROM documents\n ${result.ftsJoin}\n WHERE ${result.whereClause}\n ${result.orderByClause ? `ORDER BY ${result.orderByClause}` : ''}\n `.trim().replace(/\\s+/g, ' ');\n\n return {\n sql,\n params: result.params,\n };\n}\n","/**\n * Pipeline Optimizer - Optimizes aggregation pipelines before translation\n *\n * Optimizations:\n * 1. Predicate pushdown: Move $match stages as early as possible\n * 2. Projection pushdown: Reduce fields carried through pipeline\n * 3. Stage merging: Combine adjacent compatible stages\n * 4. Redundant stage elimination\n */\n\nimport type { PipelineStage } from './types'\n\n/**\n * Optimize an aggregation pipeline\n */\nexport function optimizePipeline(pipeline: PipelineStage[]): PipelineStage[] {\n let optimized = [...pipeline]\n\n // Apply optimizations in order\n optimized = pushdownPredicates(optimized)\n optimized = mergeAdjacentStages(optimized)\n optimized = eliminateRedundantStages(optimized)\n\n return optimized\n}\n\n/**\n * Push $match stages as early as possible in the pipeline\n * This reduces the number of documents processed by subsequent stages\n */\nfunction pushdownPredicates(pipeline: PipelineStage[]): PipelineStage[] {\n const result: PipelineStage[] = []\n\n for (let i = 0; i < pipeline.length; i++) {\n const stage = pipeline[i]!\n const stageType = getStageType(stage)\n\n if (stageType !== '$match') {\n result.push(stage)\n continue\n }\n\n // Try to push this $match earlier\n const matchCondition = (stage as { $match: Record<string, unknown> }).$match\n const pushPosition = findEarliestPushPosition(result, matchCondition)\n\n if (pushPosition < result.length) {\n // Insert at the earlier position\n result.splice(pushPosition, 0, stage)\n } else {\n result.push(stage)\n }\n }\n\n return result\n}\n\n/**\n * Find the earliest position where a $match can be pushed\n */\nfunction findEarliestPushPosition(\n stages: PipelineStage[],\n matchCondition: Record<string, unknown>\n): number {\n const matchFields = extractFieldsFromCondition(matchCondition)\n\n // Walk backwards through stages\n for (let i = stages.length - 1; i >= 0; i--) {\n const stage = stages[i]!\n const stageType = getStageType(stage)\n\n // Can't push past stages that modify the fields we're matching on\n if (stageType === '$group') {\n // $group completely changes document shape\n return i + 1\n }\n\n if (stageType === '$project' || stageType === '$addFields') {\n const projectFields = getAffectedFields(stage)\n if (matchFields.some(f => projectFields.has(f))) {\n return i + 1\n }\n }\n\n if (stageType === '$unwind') {\n const unwindField = getUnwindField(stage)\n if (matchFields.some(f => f === unwindField || f.startsWith(unwindField + '.'))) {\n return i + 1\n }\n }\n\n if (stageType === '$lookup') {\n const lookupAs = getLookupAsField(stage)\n if (matchFields.some(f => f === lookupAs || f.startsWith(lookupAs + '.'))) {\n return i + 1\n }\n }\n\n // $sort, $limit, $skip don't affect fields\n // We can generally push $match past them (though order matters for correctness)\n if (stageType === '$limit' || stageType === '$skip') {\n // Can't push past limit/skip as it changes result set\n return i + 1\n }\n }\n\n return 0\n}\n\n/**\n * Merge adjacent compatible stages\n */\nfunction mergeAdjacentStages(pipeline: PipelineStage[]): PipelineStage[] {\n const result: PipelineStage[] = []\n\n for (const stage of pipeline) {\n if (result.length === 0) {\n result.push(stage)\n continue\n }\n\n const prevStage = result[result.length - 1]!\n const merged = tryMergeStages(prevStage, stage)\n\n if (merged) {\n result[result.length - 1] = merged\n } else {\n result.push(stage)\n }\n }\n\n return result\n}\n\n/**\n * Try to merge two stages into one\n */\nfunction tryMergeStages(\n first: PipelineStage,\n second: PipelineStage\n): PipelineStage | null {\n const firstType = getStageType(first)\n const secondType = getStageType(second)\n\n // Merge adjacent $match stages\n if (firstType === '$match' && secondType === '$match') {\n const firstMatch = (first as { $match: Record<string, unknown> }).$match\n const secondMatch = (second as { $match: Record<string, unknown> }).$match\n\n return {\n $match: {\n $and: [firstMatch, secondMatch]\n }\n }\n }\n\n // Merge adjacent $addFields stages\n if (firstType === '$addFields' && secondType === '$addFields') {\n const firstFields = (first as { $addFields: Record<string, unknown> }).$addFields\n const secondFields = (second as { $addFields: Record<string, unknown> }).$addFields\n\n return {\n $addFields: {\n ...firstFields,\n ...secondFields\n }\n }\n }\n\n // Merge adjacent $project stages (if compatible)\n if (firstType === '$project' && secondType === '$project') {\n const firstProject = (first as { $project: Record<string, unknown> }).$project\n const secondProject = (second as { $project: Record<string, unknown> }).$project\n\n // Only merge if both are inclusion or both are exclusion\n const firstIsExclusion = isExclusionProject(firstProject)\n const secondIsExclusion = isExclusionProject(secondProject)\n\n if (firstIsExclusion === secondIsExclusion) {\n return {\n $project: {\n ...firstProject,\n ...secondProject\n }\n }\n }\n }\n\n return null\n}\n\n/**\n * Eliminate redundant stages\n */\nfunction eliminateRedundantStages(pipeline: PipelineStage[]): PipelineStage[] {\n return pipeline.filter((stage, index) => {\n const stageType = getStageType(stage)\n\n // Remove empty $match\n if (stageType === '$match') {\n const matchCondition = (stage as { $match: Record<string, unknown> }).$match\n if (Object.keys(matchCondition).length === 0) {\n return false\n }\n }\n\n // Remove $limit 0 followed by anything (no results anyway)\n if (stageType === '$limit') {\n const limit = (stage as { $limit: number }).$limit\n if (limit === 0) {\n // Keep only this stage, remove rest\n return true\n }\n }\n\n // Remove duplicate $sort stages (only last one matters)\n if (stageType === '$sort' && index < pipeline.length - 1) {\n for (let i = index + 1; i < pipeline.length; i++) {\n const laterStageType = getStageType(pipeline[i]!)\n if (laterStageType === '$sort') {\n return false\n }\n // If we hit a stage that depends on order, keep this sort\n if (['$limit', '$skip', '$first', '$last'].includes(laterStageType)) {\n return true\n }\n }\n }\n\n return true\n })\n}\n\n/**\n * Helper functions\n */\n\nfunction getStageType(stage: PipelineStage): string {\n return Object.keys(stage)[0]!\n}\n\nfunction extractFieldsFromCondition(condition: Record<string, unknown>): string[] {\n const fields: string[] = []\n\n for (const [key, value] of Object.entries(condition)) {\n if (key.startsWith('$')) {\n // Logical operator\n if (Array.isArray(value)) {\n for (const subCondition of value) {\n fields.push(...extractFieldsFromCondition(subCondition as Record<string, unknown>))\n }\n }\n } else {\n fields.push(key)\n }\n }\n\n return fields\n}\n\nfunction getAffectedFields(stage: PipelineStage): Set<string> {\n const stageType = getStageType(stage)\n const fields = new Set<string>()\n\n if (stageType === '$project') {\n const project = (stage as { $project: Record<string, unknown> }).$project\n for (const key of Object.keys(project)) {\n fields.add(key)\n }\n } else if (stageType === '$addFields') {\n const addFields = (stage as { $addFields: Record<string, unknown> }).$addFields\n for (const key of Object.keys(addFields)) {\n fields.add(key)\n }\n }\n\n return fields\n}\n\nfunction getUnwindField(stage: PipelineStage): string {\n const unwind = (stage as { $unwind: string | { path: string } }).$unwind\n if (typeof unwind === 'string') {\n return unwind.replace(/^\\$/, '')\n }\n return unwind.path.replace(/^\\$/, '')\n}\n\nfunction getLookupAsField(stage: PipelineStage): string {\n const lookup = (stage as { $lookup: { as: string } }).$lookup\n return lookup.as\n}\n\nfunction isExclusionProject(project: Record<string, unknown>): boolean {\n return Object.entries(project).every(([key, value]) => {\n if (key === '_id') return true\n return value === 0\n })\n}\n","/**\n * AggregationTranslator - Translates MongoDB aggregation pipelines to SQL\n * Uses CTE-based pipeline execution for complex pipelines\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { StageResult, StageContext, PipelineStage, AggregationResult, GroupStage, LookupStage, UnwindStage, BucketStage } from './stages/types'\nimport { translateMatchStage } from './stages/match-stage'\nimport { translateProjectStage } from './stages/project-stage'\nimport { translateGroupStage } from './stages/group-stage'\nimport { translateSortStage } from './stages/sort-stage'\nimport { translateLimitStage } from './stages/limit-stage'\nimport { translateSkipStage } from './stages/skip-stage'\nimport { translateCountStage } from './stages/count-stage'\nimport { translateLookupStage } from './stages/lookup-stage'\nimport { translateUnwindStage } from './stages/unwind-stage'\nimport { translateAddFieldsStage } from './stages/add-fields-stage'\nimport { translateBucketStage } from './stages/bucket-stage'\nimport { translateFacetStage, FacetTranslator } from './stages/facet-stage'\nimport { translateSearchStage, type SearchStageInput, type SearchStageContext } from './stages/search-stage'\nimport { optimizePipeline } from './stages/optimizer'\nimport { type SQLDialect, type DialectOptions, validateDialect } from './dialect'\n\nexport interface TranslatorOptions extends DialectOptions {\n /** Enable pipeline optimization (default: true) */\n optimize?: boolean\n}\n\nexport class AggregationTranslator implements FacetTranslator {\n private readonly options: TranslatorOptions\n private readonly dialect: SQLDialect\n\n constructor(private collection: string, options: TranslatorOptions = {}) {\n // Validate dialect before merging options\n const dialect = validateDialect(options.dialect)\n this.dialect = dialect\n this.options = {\n optimize: true,\n dialect,\n ...options\n }\n }\n\n /**\n * Translate a MongoDB aggregation pipeline to SQL\n */\n translate(pipeline: PipelineStage[]): AggregationResult {\n if (pipeline.length === 0) {\n throw new Error('Pipeline cannot be empty')\n }\n\n // Optionally optimize the pipeline\n const optimizedPipeline = this.options.optimize\n ? optimizePipeline(pipeline)\n : pipeline\n\n // Analyze pipeline to determine execution strategy\n const needsCte = this.needsCtePipeline(optimizedPipeline)\n\n if (needsCte) {\n return this.translateWithCte(optimizedPipeline)\n }\n\n return this.translateSimple(optimizedPipeline)\n }\n\n /**\n * Translate pipeline for use in facet (implements FacetTranslator)\n */\n translatePipeline(stages: PipelineStage[], collection: string): { sql: string; params: unknown[] } {\n const translator = new AggregationTranslator(collection)\n const result = translator.translate(stages)\n return { sql: result.sql, params: result.params }\n }\n\n /**\n * Determine if we need CTE-based execution\n */\n private needsCtePipeline(pipeline: PipelineStage[]): boolean {\n // Need CTEs for:\n // 1. Multiple stages that transform data shape\n // 2. $lookup, $unwind, $search stages\n // 3. $project followed by other stages\n let shapeTransformCount = 0\n\n for (const stage of pipeline) {\n const stageType = this.getStageType(stage)\n\n if (['$lookup', '$unwind', '$facet', '$search'].includes(stageType)) {\n return true\n }\n\n if (['$project', '$group', '$addFields'].includes(stageType)) {\n shapeTransformCount++\n }\n }\n\n return shapeTransformCount > 1\n }\n\n /**\n * Simple translation without CTEs\n */\n private translateSimple(pipeline: PipelineStage[]): AggregationResult {\n const params: unknown[] = []\n\n let selectClause = 'data'\n let whereClause: string | undefined\n let groupByClause: string | undefined\n let orderByClause: string | undefined\n let limitClause: string | undefined\n let offsetClause: string | undefined\n\n const context: StageContext = {\n collection: this.collection,\n cteIndex: 0,\n existingParams: params,\n dialect: this.dialect,\n dialectOptions: this.options\n }\n\n for (const stage of pipeline) {\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n if (result.selectClause) selectClause = result.selectClause\n if (result.whereClause) whereClause = result.whereClause\n if (result.groupByClause) groupByClause = result.groupByClause\n if (result.orderByClause) orderByClause = result.orderByClause\n if (result.limitClause) limitClause = result.limitClause\n if (result.offsetClause) offsetClause = result.offsetClause\n\n if (result.facets) {\n return {\n sql: '',\n params,\n facets: result.facets\n }\n }\n }\n\n // Build final SQL\n let sql = `SELECT ${selectClause} FROM ${this.collection}`\n\n if (whereClause) sql += ` WHERE ${whereClause}`\n if (groupByClause) sql += ` GROUP BY ${groupByClause}`\n if (orderByClause) sql += ` ORDER BY ${orderByClause}`\n if (limitClause) sql += ` ${limitClause}`\n if (offsetClause) sql += ` ${offsetClause}`\n\n return { sql, params }\n }\n\n /**\n * CTE-based translation for complex pipelines\n */\n private translateWithCte(pipeline: PipelineStage[]): AggregationResult {\n const params: unknown[] = []\n const ctes: string[] = []\n let cteIndex = 0\n let currentSource = this.collection\n\n // Accumulate simple clauses for current CTE\n let pendingClauses = {\n select: 'data',\n where: undefined as string | undefined,\n groupBy: undefined as string | undefined,\n orderBy: undefined as string | undefined,\n limit: undefined as string | undefined,\n offset: undefined as string | undefined\n }\n\n const flushPendingCte = () => {\n if (pendingClauses.select !== 'data' || pendingClauses.where || pendingClauses.groupBy) {\n const cteName = `stage_${cteIndex}`\n let cteSql = `SELECT ${pendingClauses.select} FROM ${currentSource}`\n\n if (pendingClauses.where) cteSql += ` WHERE ${pendingClauses.where}`\n if (pendingClauses.groupBy) cteSql += ` GROUP BY ${pendingClauses.groupBy}`\n if (pendingClauses.orderBy) cteSql += ` ORDER BY ${pendingClauses.orderBy}`\n if (pendingClauses.limit) cteSql += ` ${pendingClauses.limit}`\n if (pendingClauses.offset) cteSql += ` ${pendingClauses.offset}`\n\n ctes.push(`${cteName} AS (${cteSql})`)\n currentSource = cteName\n cteIndex++\n\n // Reset pending clauses\n pendingClauses = {\n select: 'data',\n where: undefined,\n groupBy: undefined,\n orderBy: undefined,\n limit: undefined,\n offset: undefined\n }\n }\n }\n\n const context: StageContext = {\n collection: this.collection,\n cteIndex,\n existingParams: params,\n dialect: this.dialect,\n dialectOptions: this.options,\n get previousCte() {\n return currentSource\n }\n }\n\n for (const stage of pipeline) {\n const stageType = this.getStageType(stage)\n\n // Stages that require their own CTE\n if (['$lookup', '$unwind'].includes(stageType)) {\n flushPendingCte()\n\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n if (result.cteExpression) {\n const cteName = result.cteName || `stage_${cteIndex}`\n ctes.push(`${cteName} AS (${result.cteExpression})`)\n currentSource = cteName\n cteIndex++\n }\n } else if (stageType === '$search') {\n // $search stage requires FTS join - must be first stage\n flushPendingCte()\n\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context) as StageResult & { ftsJoin?: string; ftsTable?: string; ftsMatch?: string }\n params.push(...result.params)\n\n // Build CTE with FTS join\n const ftsTable = result.ftsTable || `${this.collection}_fts`\n const selectClause = result.selectClause || 'documents.*'\n const cteSql = `SELECT ${selectClause} FROM documents JOIN ${ftsTable} ON documents.id = ${ftsTable}.rowid WHERE ${result.whereClause}`\n\n const cteName = `stage_${cteIndex}`\n ctes.push(`${cteName} AS (${cteSql})`)\n currentSource = cteName\n cteIndex++\n } else if (stageType === '$facet') {\n flushPendingCte()\n\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n if (result.facets) {\n // Build CTE for facets\n const sql = ctes.length > 0 ? `WITH ${ctes.join(', ')}\\n` : ''\n return {\n sql,\n params,\n facets: result.facets\n }\n }\n } else {\n // Simple stages that can accumulate\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n // If this stage transforms shape and we already have transforms, flush first\n if (result.transformsShape && (pendingClauses.select !== 'data' || pendingClauses.groupBy)) {\n flushPendingCte()\n context.cteIndex = cteIndex\n }\n\n if (result.selectClause) pendingClauses.select = result.selectClause\n if (result.whereClause) pendingClauses.where = result.whereClause\n if (result.groupByClause) pendingClauses.groupBy = result.groupByClause\n if (result.orderByClause) pendingClauses.orderBy = result.orderByClause\n if (result.limitClause) pendingClauses.limit = result.limitClause\n if (result.offsetClause) pendingClauses.offset = result.offsetClause\n }\n }\n\n // Build final query from pending clauses\n let finalSql = `SELECT ${pendingClauses.select} FROM ${currentSource}`\n\n if (pendingClauses.where) finalSql += ` WHERE ${pendingClauses.where}`\n if (pendingClauses.groupBy) finalSql += ` GROUP BY ${pendingClauses.groupBy}`\n if (pendingClauses.orderBy) finalSql += ` ORDER BY ${pendingClauses.orderBy}`\n if (pendingClauses.limit) finalSql += ` ${pendingClauses.limit}`\n if (pendingClauses.offset) finalSql += ` ${pendingClauses.offset}`\n\n // Combine CTEs with final query\n const sql = ctes.length > 0\n ? `WITH ${ctes.join(', ')} ${finalSql}`\n : finalSql\n\n return { sql, params }\n }\n\n /**\n * Get the stage type from a stage object\n */\n private getStageType(stage: PipelineStage): string {\n return Object.keys(stage)[0]!\n }\n\n /**\n * Translate a single pipeline stage\n */\n private translateStage(stage: PipelineStage, context: StageContext): StageResult {\n const stageType = this.getStageType(stage)\n const stageValue = (stage as Record<string, unknown>)[stageType]\n\n switch (stageType) {\n case '$match':\n return translateMatchStage(stageValue as Record<string, unknown>, context)\n\n case '$project':\n return translateProjectStage(stageValue as Record<string, unknown>, context)\n\n case '$group':\n return translateGroupStage(stageValue as GroupStage, context)\n\n case '$sort':\n return translateSortStage(stageValue as Record<string, 1 | -1>, context)\n\n case '$limit':\n return translateLimitStage(stageValue as number, context)\n\n case '$skip':\n return translateSkipStage(stageValue as number, context)\n\n case '$count':\n return translateCountStage(stageValue as string, context)\n\n case '$lookup':\n return translateLookupStage(stageValue as LookupStage, context)\n\n case '$unwind':\n return translateUnwindStage(stageValue as string | UnwindStage, context)\n\n case '$addFields':\n case '$set': // $set is an alias for $addFields\n return translateAddFieldsStage(stageValue as Record<string, unknown>, context)\n\n case '$bucket':\n return translateBucketStage(stageValue as BucketStage, context)\n\n case '$facet':\n return translateFacetStage(\n stageValue as Record<string, PipelineStage[]>,\n context,\n this\n )\n\n case '$search':\n return translateSearchStage(\n stageValue as SearchStageInput,\n context as SearchStageContext\n )\n\n default:\n throw new Error(`Unknown aggregation stage: ${stageType}`)\n }\n }\n}\n\n// Export types\nexport type { AggregationResult, PipelineStage }\n","/**\n * AggregationExecutor - Handles async execution of aggregation pipelines\n *\n * This class manages the execution of MongoDB aggregation pipelines that may\n * contain $function operators. It:\n * 1. Translates the pipeline to SQL using AggregationTranslator\n * 2. Executes the SQL query\n * 3. Detects function placeholders in the results\n * 4. Executes user functions via FunctionExecutor\n * 5. Merges function results back into documents\n */\n\nimport { FunctionExecutor } from './function-executor'\nimport { AggregationTranslator } from '../translator/aggregation-translator'\nimport type { WorkerLoader } from '../types/function'\nimport type { PipelineStage } from '../translator/aggregation-translator'\n\n/**\n * Environment bindings for the aggregation executor\n */\ninterface AggregationExecutorEnv {\n LOADER?: WorkerLoader\n}\n\n/**\n * SQL interface for executing queries\n */\ninterface SqlInterface {\n exec: (query: string, ...params: unknown[]) => { results: unknown[]; toArray?: () => unknown[] }\n}\n\n/**\n * Parsed function specification from placeholder\n */\ninterface ParsedFunctionSpec {\n __type: 'function'\n body: string\n argPaths: string[]\n literalArgs: Record<number, unknown>\n argOrder: Array<{ type: 'field'; path: string } | { type: 'literal'; index: number }>\n}\n\n/**\n * Batch execution item for grouping functions\n */\ninterface BatchItem {\n docIndex: number\n fieldPath: string[]\n fnSpec: ParsedFunctionSpec\n args: unknown[]\n}\n\n/**\n * AggregationExecutor handles the execution of aggregation pipelines\n * with support for $function operators that require async execution\n */\nexport class AggregationExecutor {\n private functionExecutor: FunctionExecutor | null\n\n constructor(\n private sql: SqlInterface,\n env: AggregationExecutorEnv\n ) {\n this.functionExecutor = env.LOADER ? new FunctionExecutor(env) : null\n }\n\n /**\n * Execute an aggregation pipeline\n */\n async execute(collection: string, pipeline: PipelineStage[]): Promise<unknown[]> {\n const translator = new AggregationTranslator(collection)\n const { sql, params, facets } = translator.translate(pipeline)\n\n // Handle facets separately\n if (facets) {\n return this.executeFacets(facets)\n }\n\n // Execute SQL query\n const rawResults = this.sql.exec(sql, ...params)\n const results = rawResults.toArray ? rawResults.toArray() : rawResults.results\n\n // Parse results\n const documents = results.map(row => {\n const data = (row as { data: string }).data\n return JSON.parse(data) as Record<string, unknown>\n })\n\n // Check if any results contain function placeholders\n const hasFunctions = documents.some(doc => this.documentHasFunctions(doc))\n\n if (!hasFunctions) {\n return documents\n }\n\n // Process function placeholders, passing pipeline for post-sort if needed\n return this.executeWithFunctions(documents, pipeline)\n }\n\n /**\n * Check if a document contains any function placeholders\n * The marker may be wrapped in quotes from SQL string output\n */\n private documentHasFunctions(doc: Record<string, unknown>): boolean {\n for (const value of Object.values(doc)) {\n if (typeof value === 'string' && value.includes('__FUNCTION__')) {\n return true\n }\n if (typeof value === 'object' && value !== null) {\n if (this.documentHasFunctions(value as Record<string, unknown>)) {\n return true\n }\n }\n }\n return false\n }\n\n /**\n * Execute pipeline with function placeholders\n */\n private async executeWithFunctions(\n documents: Record<string, unknown>[],\n pipeline: PipelineStage[] = []\n ): Promise<unknown[]> {\n // Collect all function invocations for batch processing\n const batchItems: BatchItem[] = []\n\n for (let docIndex = 0; docIndex < documents.length; docIndex++) {\n const doc = documents[docIndex]\n if (doc) {\n this.collectFunctionInvocations(doc, doc, [], docIndex, batchItems)\n }\n }\n\n // Group by function body for batch execution\n const functionGroups = this.groupByFunction(batchItems)\n\n // Execute each function group\n for (const [body, items] of functionGroups.entries()) {\n const argsArray = items.map(item => item.args)\n\n try {\n let results: unknown[]\n\n if (this.functionExecutor) {\n // Use secure sandboxed execution via worker-loader\n results = await this.functionExecutor.executeBatch(body, argsArray)\n } else {\n // Fallback: direct evaluation (for development/testing without worker_loaders)\n // WARNING: This is NOT sandboxed and should only be used in trusted environments\n results = this.executeDirectBatch(body, argsArray)\n }\n\n // Apply results back to documents\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item) {\n const result = results[i]\n const doc = documents[item.docIndex]\n if (doc) {\n this.setFieldValue(doc, item.fieldPath, result)\n }\n }\n }\n } catch (error) {\n // Re-throw with context\n throw error\n }\n }\n\n // Re-apply $sort stages after function execution\n // This is needed because SQL sorting happened on placeholder strings, not computed values\n // Use the last $sort stage since that represents the final ordering intent\n const sortStages = pipeline.filter(stage => '$sort' in stage);\n const lastSortStage = sortStages[sortStages.length - 1] as { $sort: Record<string, number> } | undefined;\n if (lastSortStage) {\n documents.sort((a, b) => {\n for (const [field, direction] of Object.entries(lastSortStage.$sort)) {\n const aVal = this.extractFieldValue(a, `$.${field}`)\n const bVal = this.extractFieldValue(b, `$.${field}`)\n\n // Handle different types\n if (aVal === bVal) continue\n if (aVal === null || aVal === undefined) return direction\n if (bVal === null || bVal === undefined) return -direction\n\n // Compare values\n const comparison = aVal < bVal ? -1 : 1\n return comparison * direction\n }\n return 0\n })\n }\n\n return documents\n }\n\n /**\n * SECURITY: Direct function execution has been disabled to prevent arbitrary code execution.\n *\n * The $function operator requires the LOADER binding for secure sandboxed execution\n * via Cloudflare worker-loader. Without this binding, $function operators cannot be used.\n *\n * This method is kept as a private placeholder that throws an error to prevent\n * any bypass attempts.\n *\n * @throws Error - Always throws to prevent unsafe code execution\n */\n private executeDirectBatch(_body: string, _argsArray: unknown[][]): never {\n // SECURITY: new Function() has been removed to prevent arbitrary code execution\n // The $function operator requires the LOADER binding for secure sandboxed execution\n throw new Error(\n 'SECURITY: $function operator requires the LOADER binding for secure sandboxed execution. ' +\n 'Direct function execution is disabled to prevent arbitrary code execution. ' +\n 'Please configure the worker_loaders binding in your wrangler.toml to enable $function support.'\n )\n }\n\n /**\n * Collect all function invocations from a document\n */\n private collectFunctionInvocations(\n root: Record<string, unknown>,\n current: Record<string, unknown>,\n path: string[],\n docIndex: number,\n items: BatchItem[]\n ): void {\n for (const [key, value] of Object.entries(current)) {\n const fieldPath = [...path, key]\n\n if (typeof value === 'string' && value.includes('__FUNCTION__')) {\n const fnSpec = this.parseFunctionMarker(value)\n if (fnSpec) {\n const args = this.extractArgs(root, fnSpec)\n items.push({ docIndex, fieldPath, fnSpec, args })\n }\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n this.collectFunctionInvocations(root, value as Record<string, unknown>, fieldPath, docIndex, items)\n }\n }\n }\n\n /**\n * Parse a function marker from a string value\n * Handles both direct markers and SQL string output with quotes\n */\n private parseFunctionMarker(value: string): ParsedFunctionSpec | null {\n // Try to find the __FUNCTION__ marker in the string\n // Match __FUNCTION__ followed by a JSON object\n const match = value.match(/__FUNCTION__({.+})$/) || value.match(/__FUNCTION__({.+})'?$/)\n if (match && match[1]) {\n try {\n return JSON.parse(match[1])\n } catch {\n // Try unescaping single quotes (from SQL string escaping)\n try {\n const unescaped = match[1].replace(/''/g, \"'\")\n return JSON.parse(unescaped)\n } catch {\n return null\n }\n }\n }\n return null\n }\n\n /**\n * Group batch items by function body\n */\n private groupByFunction(items: BatchItem[]): Map<string, BatchItem[]> {\n const groups = new Map<string, BatchItem[]>()\n\n for (const item of items) {\n const body = item.fnSpec.body\n if (!groups.has(body)) {\n groups.set(body, [])\n }\n groups.get(body)!.push(item)\n }\n\n return groups\n }\n\n /**\n * Extract arguments for a function from document data\n */\n private extractArgs(doc: Record<string, unknown>, fnSpec: ParsedFunctionSpec): unknown[] {\n return fnSpec.argOrder.map(arg => {\n if (arg.type === 'literal') {\n const index = (arg as { type: 'literal'; index: number }).index\n return fnSpec.literalArgs[index]\n }\n // Extract field value using path\n const path = (arg as { type: 'field'; path: string }).path\n return this.extractFieldValue(doc, path)\n })\n }\n\n /**\n * Extract a field value from a document using JSON path\n */\n private extractFieldValue(doc: Record<string, unknown>, path: string): unknown {\n // path is like \"$.field\" or \"$.nested.field\"\n const parts = path.replace(/^\\$\\./, '').split('.')\n let value: unknown = doc\n\n for (const part of parts) {\n if (value === null || value === undefined) {\n return undefined\n }\n value = (value as Record<string, unknown>)[part]\n }\n\n return value\n }\n\n /**\n * Set a field value in a document using field path\n */\n private setFieldValue(doc: Record<string, unknown>, path: string[], value: unknown): void {\n let current: Record<string, unknown> = doc\n\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]\n if (key !== undefined) {\n current = current[key] as Record<string, unknown>\n }\n }\n\n const lastKey = path[path.length - 1]\n if (lastKey !== undefined) {\n current[lastKey] = value\n }\n }\n\n /**\n * Execute facet pipelines\n */\n private async executeFacets(\n facets: Record<string, { sql: string; params: unknown[] }>\n ): Promise<unknown[]> {\n const result: Record<string, unknown[]> = {}\n\n for (const [name, facet] of Object.entries(facets)) {\n const rawResults = this.sql.exec(facet.sql, ...facet.params)\n const results = rawResults.toArray ? rawResults.toArray() : rawResults.results\n\n result[name] = results.map(row => {\n const data = (row as { data: string }).data\n return JSON.parse(data)\n })\n }\n\n return [result]\n }\n\n}\n","/**\n * MCP Server Factory for mongo.do\n *\n * Creates MCP server instances that provide:\n * - search: Query documents (readonly)\n * - fetch: Retrieve full documents by ID (readonly)\n * - do: Execute secure arbitrary code via Worker Loader sandbox (when loader available)\n */\n\nimport type {\n McpToolDefinition,\n McpToolHandler,\n McpToolResponse,\n McpRegisteredTool,\n McpRequest,\n McpResponse,\n McpInitializeRequest,\n McpToolsCallRequest,\n} from './types'\n\n// Re-export DatabaseAccess from types for convenience\nexport type { DatabaseAccess } from './types'\n\n/**\n * Code loader interface for executing JavaScript code in a sandbox\n */\nexport interface CodeLoader {\n execute(code: string, context?: Record<string, unknown>): Promise<{ success: boolean; result?: unknown; error?: string }>\n}\n\n/**\n * Configuration for creating an MCP server\n */\nexport interface McpServerConfig {\n /** Database access interface for tool implementations */\n dbAccess: DatabaseAccess\n /** Optional code loader for secure code execution (enables 'do' tool) */\n codeLoader?: CodeLoader\n /** Server name (default: 'mongo.do') */\n name?: string\n /** Server version (default: '1.0.0') */\n version?: string\n}\n\n/**\n * MCP Server instance\n */\nexport interface McpServer {\n /** Server name */\n readonly name: string\n /** Server version */\n readonly version: string\n\n /**\n * Register a tool with the server\n */\n tool<T extends Record<string, unknown>>(\n name: string,\n inputSchema: McpToolDefinition['inputSchema'],\n handler: McpToolHandler<T>,\n annotations?: McpToolDefinition['annotations']\n ): void\n\n /**\n * Register a tool with definition and handler\n */\n registerTool(tool: McpRegisteredTool): void\n\n /**\n * List all registered tools\n */\n listTools(): Promise<McpToolDefinition[]>\n\n /**\n * Call a tool by name\n */\n callTool(name: string, args: Record<string, unknown>): Promise<McpToolResponse>\n\n /**\n * Handle an incoming MCP request (JSON-RPC)\n */\n handleRequest(request: McpRequest): Promise<McpResponse>\n}\n\n// Import DatabaseAccess type for the config\nimport type { DatabaseAccess } from './types'\n\n/**\n * Create an MCP server instance for mongo.do\n *\n * @param config - Server configuration including database access and optional code loader\n * @returns Configured MCP server instance\n */\nexport function createMcpServer(config: McpServerConfig): McpServer {\n const { dbAccess, codeLoader, name, version } = config\n const serverName = name ?? 'mongo.do'\n const serverVersion = version ?? '1.0.0'\n const tools = new Map<string, McpRegisteredTool>()\n\n // Create the server instance\n const server: McpServer = {\n name: serverName,\n version: serverVersion,\n\n tool<T extends Record<string, unknown>>(\n name: string,\n inputSchema: McpToolDefinition['inputSchema'],\n handler: McpToolHandler<T>,\n annotations?: McpToolDefinition['annotations']\n ): void {\n const definition: McpToolDefinition = {\n name,\n description: annotations?.title ?? name,\n inputSchema,\n ...(annotations && { annotations }),\n }\n tools.set(name, {\n definition,\n handler: handler as McpToolHandler,\n })\n },\n\n registerTool(tool: McpRegisteredTool): void {\n tools.set(tool.definition.name, tool)\n },\n\n async listTools(): Promise<McpToolDefinition[]> {\n return Array.from(tools.values()).map(t => t.definition)\n },\n\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolResponse> {\n const tool = tools.get(name)\n if (!tool) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: `Tool '${name}' not found` }) }],\n isError: true,\n }\n }\n try {\n return await tool.handler(args)\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n },\n ],\n isError: true,\n }\n }\n },\n\n async handleRequest(request: McpRequest): Promise<McpResponse> {\n const baseResponse = {\n jsonrpc: '2.0' as const,\n id: request.id,\n }\n\n // Validate JSON-RPC version\n if (request.jsonrpc !== '2.0') {\n return {\n ...baseResponse,\n error: {\n code: -32600,\n message: 'Invalid JSON-RPC version',\n },\n }\n }\n\n switch (request.method) {\n case 'initialize': {\n const initReq = request as McpInitializeRequest\n return {\n ...baseResponse,\n result: {\n protocolVersion: initReq.params?.protocolVersion ?? '2024-11-05',\n capabilities: {\n tools: {},\n },\n serverInfo: {\n name: serverName,\n version: serverVersion,\n },\n },\n }\n }\n\n case 'tools/list': {\n const toolsList = await server.listTools()\n return {\n ...baseResponse,\n result: {\n tools: toolsList,\n },\n }\n }\n\n case 'tools/call': {\n const callReq = request as McpToolsCallRequest\n const result = await server.callTool(callReq.params.name, callReq.params.arguments ?? {})\n return {\n ...baseResponse,\n result,\n }\n }\n\n default:\n return {\n ...baseResponse,\n error: {\n code: -32601,\n message: `Method not found: ${request.method}`,\n },\n }\n }\n },\n }\n\n // Register the search tool (always available, readonly)\n server.tool<{ query: string; database?: string; collection?: string; limit?: number }>(\n 'search',\n {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query string',\n },\n database: {\n type: 'string',\n description: 'Database to search in',\n },\n collection: {\n type: 'string',\n description: 'Collection to search in',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results (default: 10)',\n },\n },\n required: ['query'],\n },\n async (args) => {\n // Validate required field\n if (!args.query) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: 'Missing required field: query' }) }],\n isError: true,\n }\n }\n // Placeholder implementation - will be expanded in search tool issue\n void args.database\n void args.collection\n void args.limit\n void dbAccess\n return {\n content: [{ type: 'text', text: '{\"results\":[]}' }],\n }\n },\n {\n title: 'Search Documents',\n readOnlyHint: true,\n openWorldHint: true,\n }\n )\n\n // Register the fetch tool (always available, readonly)\n server.tool<{ id: string }>(\n 'fetch',\n {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Document ID in format db.collection.ObjectId',\n },\n },\n required: ['id'],\n },\n async ({ id }) => {\n // Placeholder implementation - will be expanded in fetch tool issue\n void id\n void dbAccess\n return {\n content: [{ type: 'text', text: '{}' }],\n }\n },\n {\n title: 'Fetch Document',\n readOnlyHint: true,\n openWorldHint: true,\n }\n )\n\n // Register the do tool only if codeLoader is available\n if (codeLoader) {\n server.tool<{ code: string; description?: string }>(\n 'do',\n {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JavaScript code to execute',\n },\n description: {\n type: 'string',\n description: 'What the code does',\n },\n },\n required: ['code'],\n },\n async ({ code, description }) => {\n // Execute code using the code loader\n void description\n void dbAccess\n try {\n const result = await codeLoader.execute(code)\n return {\n content: [{ type: 'text', text: JSON.stringify(result) }],\n isError: !result.success,\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: false, error: error instanceof Error ? error.message : 'Unknown error' }) }],\n isError: true,\n }\n }\n },\n {\n title: 'Execute Code',\n readOnlyHint: false,\n destructiveHint: true,\n }\n )\n }\n\n return server\n}\n\n/**\n * Create a mock DatabaseAccess for testing\n */\nexport function createMockDatabaseAccess(): DatabaseAccess {\n return {\n async findOne() {\n return null\n },\n async find() {\n return []\n },\n async insertOne() {\n return { insertedId: 'mock-id' }\n },\n async insertMany() {\n return { insertedIds: [] }\n },\n async updateOne() {\n return { matchedCount: 0, modifiedCount: 0 }\n },\n async updateMany() {\n return { matchedCount: 0, modifiedCount: 0 }\n },\n async deleteOne() {\n return { deletedCount: 0 }\n },\n async deleteMany() {\n return { deletedCount: 0 }\n },\n async aggregate() {\n return []\n },\n async countDocuments() {\n return 0\n },\n async listCollections() {\n return []\n },\n async listDatabases() {\n return []\n },\n getProxy() {\n return this\n },\n }\n}\n","/**\n * HTTP Transport for MCP Server\n *\n * Provides HTTP/SSE transport for MCP protocol:\n * - POST for JSON-RPC requests\n * - GET for SSE streams\n * - OPTIONS for CORS preflight\n * - Session management via mcp-session-id header\n * - Request logging callback\n * - Authentication hook\n * - Rate limiting\n */\n\nimport type { McpServer } from '../server'\nimport type { McpRequest, McpResponse } from '../types'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * CORS configuration options\n */\nexport interface CorsOptions {\n /** Allowed origins (default: '*') */\n origin?: string | string[]\n /** Allowed methods (default: 'GET, POST, OPTIONS') */\n methods?: string\n /** Allowed headers (default: 'Content-Type, mcp-session-id') */\n allowedHeaders?: string\n /** Exposed headers (default: 'mcp-session-id') */\n exposedHeaders?: string\n /** Max age for preflight cache in seconds (default: 86400) */\n maxAge?: number\n /** Allow credentials (default: false) */\n credentials?: boolean\n}\n\n/**\n * Request log entry for logging callback\n */\nexport interface RequestLogEntry {\n /** Timestamp of the request */\n timestamp: Date\n /** HTTP method */\n method: string\n /** Request URL */\n url: string\n /** Session ID if available */\n sessionId?: string\n /** Response status code */\n statusCode: number\n /** Duration in milliseconds */\n durationMs: number\n /** JSON-RPC method if applicable */\n rpcMethod?: string\n /** Error message if request failed */\n error?: string\n}\n\n/**\n * Request logging callback function\n */\nexport type RequestLogCallback = (entry: RequestLogEntry) => void\n\n/**\n * Authentication result\n */\nexport interface AuthResult {\n /** Whether authentication succeeded */\n authenticated: boolean\n /** Error message if authentication failed */\n error?: string\n /** Optional user/client identifier */\n identity?: string\n}\n\n/**\n * Authentication hook function\n */\nexport type AuthHook = (request: Request) => Promise<AuthResult> | AuthResult\n\n/**\n * Rate limit result\n */\nexport interface RateLimitResult {\n /** Whether the request is allowed */\n allowed: boolean\n /** Retry-After header value in seconds (if rate limited) */\n retryAfter?: number\n /** Remaining requests in current window */\n remaining?: number\n /** Total limit for the window */\n limit?: number\n /** When the rate limit window resets (Unix timestamp) */\n resetAt?: number\n}\n\n/**\n * Rate limiting options\n */\nexport interface RateLimitOptions {\n /** Maximum requests per window */\n maxRequests: number\n /** Window size in milliseconds */\n windowMs: number\n /** Key extractor function (default: IP-based or session-based) */\n keyExtractor?: (request: Request, sessionId?: string) => string\n /** Custom rate limit check function (overrides built-in limiter) */\n customLimiter?: (key: string, request: Request) => Promise<RateLimitResult> | RateLimitResult\n}\n\n/**\n * HTTP transport options\n */\nexport interface HttpTransportOptions {\n /** CORS configuration */\n cors?: CorsOptions\n /** Request logging callback */\n onRequest?: RequestLogCallback\n /** Authentication hook */\n authenticate?: AuthHook\n /** Rate limiting configuration */\n rateLimit?: RateLimitOptions\n}\n\n/**\n * HTTP handler function type\n */\nexport type HttpHandler = (request: Request) => Promise<Response>\n\n/**\n * SSE session for managing server-sent events\n */\ninterface SseSession {\n controller: ReadableStreamDefaultController<Uint8Array>\n encoder: TextEncoder\n lastEventId: number\n}\n\n/**\n * Session storage for managing MCP sessions\n */\ninterface SessionStore {\n /** SSE sessions for real-time streaming */\n sseClients: Map<string, SseSession>\n /** Last activity timestamp for session cleanup */\n lastActivity: Map<string, number>\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst SESSION_HEADER = 'mcp-session-id'\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000 // 30 minutes\n\nconst DEFAULT_CORS: Required<CorsOptions> = {\n origin: '*',\n methods: 'GET, POST, OPTIONS, DELETE',\n allowedHeaders: 'Content-Type, mcp-session-id, Last-Event-ID, Authorization',\n exposedHeaders: 'mcp-session-id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset',\n maxAge: 86400,\n credentials: false,\n}\n\n/**\n * Rate limit entry for tracking request counts\n */\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * Rate limiter storage\n */\ninterface RateLimiterStore {\n entries: Map<string, RateLimitEntry>\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Generate a unique session ID\n */\nfunction generateSessionId(): string {\n const array = new Uint8Array(16)\n crypto.getRandomValues(array)\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Build CORS headers based on options and request\n */\nfunction buildCorsHeaders(options: Required<CorsOptions>, request: Request | null): Record<string, string> {\n const headers: Record<string, string> = {}\n const requestOrigin = request?.headers.get('Origin') ?? null\n\n // Handle origin\n if (options.origin === '*') {\n headers['Access-Control-Allow-Origin'] = '*'\n } else if (Array.isArray(options.origin)) {\n if (requestOrigin && options.origin.includes(requestOrigin)) {\n headers['Access-Control-Allow-Origin'] = requestOrigin\n headers['Vary'] = 'Origin'\n }\n } else if (requestOrigin === options.origin) {\n headers['Access-Control-Allow-Origin'] = options.origin\n }\n\n headers['Access-Control-Allow-Methods'] = options.methods\n headers['Access-Control-Allow-Headers'] = options.allowedHeaders\n headers['Access-Control-Expose-Headers'] = options.exposedHeaders\n headers['Access-Control-Max-Age'] = String(options.maxAge)\n\n if (options.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true'\n }\n\n return headers\n}\n\n/**\n * Create a JSON response with CORS headers\n */\nfunction jsonResponse(\n data: unknown,\n status: number,\n corsHeaders: Record<string, string>,\n sessionId?: string\n): Response {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n }\n if (sessionId) {\n headers[SESSION_HEADER] = sessionId\n }\n return new Response(JSON.stringify(data), { status, headers })\n}\n\n/**\n * Create an error response\n */\nfunction errorResponse(\n code: number,\n message: string,\n httpStatus: number,\n corsHeaders: Record<string, string>,\n id?: string | number | null\n): Response {\n const response: McpResponse = {\n jsonrpc: '2.0',\n id: id ?? null as unknown as string,\n error: { code, message },\n }\n return jsonResponse(response, httpStatus, corsHeaders)\n}\n\n/**\n * Default key extractor for rate limiting (uses session ID or falls back to IP-like identifier)\n */\nfunction defaultKeyExtractor(request: Request, sessionId?: string): string {\n if (sessionId) {\n return `session:${sessionId}`\n }\n // Try to get client IP from common headers\n const forwarded = request.headers.get('X-Forwarded-For')\n if (forwarded) {\n return `ip:${forwarded.split(',')[0].trim()}`\n }\n const realIp = request.headers.get('X-Real-IP')\n if (realIp) {\n return `ip:${realIp}`\n }\n // Fallback to a generic key\n return 'unknown'\n}\n\n/**\n * Check rate limit for a request\n */\nfunction checkRateLimit(\n key: string,\n options: RateLimitOptions,\n store: RateLimiterStore\n): RateLimitResult {\n const now = Date.now()\n const entry = store.entries.get(key)\n\n // Clean up expired entry\n if (entry && entry.resetAt <= now) {\n store.entries.delete(key)\n }\n\n const currentEntry = store.entries.get(key)\n\n if (!currentEntry) {\n // First request in window\n const resetAt = now + options.windowMs\n store.entries.set(key, { count: 1, resetAt })\n return {\n allowed: true,\n remaining: options.maxRequests - 1,\n limit: options.maxRequests,\n resetAt,\n }\n }\n\n if (currentEntry.count >= options.maxRequests) {\n // Rate limited\n const retryAfter = Math.ceil((currentEntry.resetAt - now) / 1000)\n return {\n allowed: false,\n retryAfter,\n remaining: 0,\n limit: options.maxRequests,\n resetAt: currentEntry.resetAt,\n }\n }\n\n // Increment count\n currentEntry.count++\n return {\n allowed: true,\n remaining: options.maxRequests - currentEntry.count,\n limit: options.maxRequests,\n resetAt: currentEntry.resetAt,\n }\n}\n\n/**\n * Add rate limit headers to response\n */\nfunction addRateLimitHeaders(headers: Record<string, string>, result: RateLimitResult): void {\n if (result.limit !== undefined) {\n headers['X-RateLimit-Limit'] = String(result.limit)\n }\n if (result.remaining !== undefined) {\n headers['X-RateLimit-Remaining'] = String(result.remaining)\n }\n if (result.resetAt !== undefined) {\n headers['X-RateLimit-Reset'] = String(Math.ceil(result.resetAt / 1000))\n }\n if (result.retryAfter !== undefined) {\n headers['Retry-After'] = String(result.retryAfter)\n }\n}\n\n/**\n * Create a rate limited error response\n */\nfunction rateLimitedResponse(\n corsHeaders: Record<string, string>,\n rateLimitResult: RateLimitResult\n): Response {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n }\n addRateLimitHeaders(headers, rateLimitResult)\n\n const response: McpResponse = {\n jsonrpc: '2.0',\n id: null as unknown as string,\n error: { code: -32000, message: 'Too many requests. Please retry later.' },\n }\n\n return new Response(JSON.stringify(response), { status: 429, headers })\n}\n\n/**\n * Create an authentication error response\n */\nfunction authErrorResponse(\n message: string,\n corsHeaders: Record<string, string>\n): Response {\n const response: McpResponse = {\n jsonrpc: '2.0',\n id: null as unknown as string,\n error: { code: -32001, message: `Authentication failed: ${message}` },\n }\n return new Response(JSON.stringify(response), {\n status: 401,\n headers: {\n 'Content-Type': 'application/json',\n 'WWW-Authenticate': 'Bearer',\n ...corsHeaders,\n },\n })\n}\n\n// =============================================================================\n// Main Factory Function\n// =============================================================================\n\n/**\n * Create an HTTP handler for MCP server\n *\n * @param server - MCP server instance\n * @param corsOptions - Optional CORS configuration (deprecated, use options.cors instead)\n * @returns HTTP handler function\n *\n * @example\n * ```typescript\n * const server = createMcpServer({ dbAccess })\n * const handler = createHttpMcpHandler(server)\n *\n * // In Cloudflare Worker\n * export default {\n * fetch: handler\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With full options\n * const handler = createHttpMcpHandler(server, {\n * cors: { origin: 'https://example.com' },\n * onRequest: (entry) => console.log(`${entry.method} ${entry.url} - ${entry.statusCode}`),\n * authenticate: async (req) => {\n * const token = req.headers.get('Authorization')?.replace('Bearer ', '')\n * if (!token) return { authenticated: false, error: 'Missing token' }\n * return { authenticated: true, identity: 'user-123' }\n * },\n * rateLimit: { maxRequests: 100, windowMs: 60000 }\n * })\n * ```\n */\n/**\n * Check if the options object is HttpTransportOptions\n */\nfunction isHttpTransportOptions(obj: unknown): obj is HttpTransportOptions {\n if (!obj || typeof obj !== 'object') return false\n const o = obj as Record<string, unknown>\n return 'cors' in o || 'onRequest' in o || 'authenticate' in o || 'rateLimit' in o\n}\n\nexport function createHttpMcpHandler(\n server: McpServer,\n corsOptionsOrOptions?: CorsOptions | HttpTransportOptions\n): HttpHandler {\n // Support both old CorsOptions and new HttpTransportOptions for backwards compatibility\n const options: HttpTransportOptions = isHttpTransportOptions(corsOptionsOrOptions)\n ? corsOptionsOrOptions\n : (corsOptionsOrOptions ? { cors: corsOptionsOrOptions } : {})\n\n const cors: Required<CorsOptions> = { ...DEFAULT_CORS, ...options.cors }\n const sessions: SessionStore = {\n sseClients: new Map(),\n lastActivity: new Map(),\n }\n const rateLimiter: RateLimiterStore = {\n entries: new Map(),\n }\n\n // Cleanup old sessions and rate limit entries periodically\n const cleanupSessions = () => {\n const now = Date.now()\n Array.from(sessions.lastActivity.entries()).forEach(([sessionId, lastActive]) => {\n if (now - lastActive > SESSION_TIMEOUT_MS) {\n const sseSession = sessions.sseClients.get(sessionId)\n if (sseSession) {\n try {\n sseSession.controller.close()\n } catch {\n // Controller may already be closed\n }\n }\n sessions.sseClients.delete(sessionId)\n sessions.lastActivity.delete(sessionId)\n }\n })\n // Clean up expired rate limit entries\n Array.from(rateLimiter.entries.entries()).forEach(([key, entry]) => {\n if (entry.resetAt <= now) {\n rateLimiter.entries.delete(key)\n }\n })\n }\n\n return async (request: Request): Promise<Response> => {\n const startTime = Date.now()\n const corsHeaders = buildCorsHeaders(cors, request)\n const method = request.method.toUpperCase()\n let sessionId: string | undefined\n let rpcMethod: string | undefined\n let errorMessage: string | undefined\n\n // Helper to log request\n const logRequest = (response: Response): Response => {\n if (options.onRequest) {\n const logEntry: RequestLogEntry = {\n timestamp: new Date(startTime),\n method,\n url: request.url,\n statusCode: response.status,\n durationMs: Date.now() - startTime,\n }\n if (sessionId) {\n logEntry.sessionId = sessionId\n }\n if (rpcMethod) {\n logEntry.rpcMethod = rpcMethod\n }\n if (errorMessage) {\n logEntry.error = errorMessage\n }\n options.onRequest(logEntry)\n }\n return response\n }\n\n try {\n // Cleanup old sessions on each request\n cleanupSessions()\n\n // Handle CORS preflight (no auth or rate limit for preflight)\n if (method === 'OPTIONS') {\n return logRequest(new Response(null, {\n status: 204,\n headers: corsHeaders,\n }))\n }\n\n // Get or create session ID (needed for rate limiting key)\n sessionId = request.headers.get(SESSION_HEADER) ?? undefined\n const isNewSession = !sessionId\n if (isNewSession) {\n sessionId = generateSessionId()\n }\n\n // Rate limiting check (before authentication to prevent auth bypass)\n if (options.rateLimit) {\n const keyExtractor = options.rateLimit.keyExtractor ?? defaultKeyExtractor\n const key = keyExtractor(request, sessionId)\n\n let rateLimitResult: RateLimitResult\n if (options.rateLimit.customLimiter) {\n rateLimitResult = await options.rateLimit.customLimiter(key, request)\n } else {\n rateLimitResult = checkRateLimit(key, options.rateLimit, rateLimiter)\n }\n\n if (!rateLimitResult.allowed) {\n errorMessage = 'Rate limited'\n return logRequest(rateLimitedResponse(corsHeaders, rateLimitResult))\n }\n }\n\n // Authentication check\n if (options.authenticate) {\n const authResult = await options.authenticate(request)\n if (!authResult.authenticated) {\n errorMessage = authResult.error ?? 'Authentication failed'\n return logRequest(authErrorResponse(errorMessage, corsHeaders))\n }\n }\n\n sessions.lastActivity.set(sessionId!, Date.now())\n\n // Handle GET for SSE streams\n if (method === 'GET') {\n return logRequest(await handleSseRequest(request, sessionId!, sessions, corsHeaders))\n }\n\n // Handle POST for JSON-RPC\n if (method === 'POST') {\n const response = await handleJsonRpcRequest(request, server, sessionId!, sessions, corsHeaders, (m) => {\n rpcMethod = m\n })\n return logRequest(response)\n }\n\n // Handle DELETE for session termination\n if (method === 'DELETE') {\n return logRequest(await handleDeleteSession(sessionId!, sessions, corsHeaders))\n }\n\n // Method not allowed\n errorMessage = `Method ${method} not allowed`\n return logRequest(errorResponse(-32600, errorMessage, 405, corsHeaders))\n } catch (error) {\n errorMessage = error instanceof Error ? error.message : 'Internal error'\n return logRequest(errorResponse(-32603, errorMessage, 500, corsHeaders))\n }\n }\n}\n\n// =============================================================================\n// Request Handlers\n// =============================================================================\n\n/**\n * Handle SSE stream request\n */\nasync function handleSseRequest(\n request: Request,\n sessionId: string,\n sessions: SessionStore,\n corsHeaders: Record<string, string>\n): Promise<Response> {\n const encoder = new TextEncoder()\n\n // Check Accept header\n const accept = request.headers.get('Accept')\n if (!accept?.includes('text/event-stream')) {\n return new Response(JSON.stringify({ error: 'Accept header must include text/event-stream' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json', ...corsHeaders },\n })\n }\n\n // Create SSE stream\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n // Store session\n const sseSession: SseSession = {\n controller,\n encoder,\n lastEventId: 0,\n }\n sessions.sseClients.set(sessionId, sseSession)\n\n // Send initial connection event\n const event = formatSseEvent('endpoint', JSON.stringify({\n type: 'connection',\n sessionId,\n timestamp: new Date().toISOString(),\n }), ++sseSession.lastEventId)\n controller.enqueue(encoder.encode(event))\n },\n cancel() {\n sessions.sseClients.delete(sessionId)\n },\n })\n\n return new Response(stream, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n [SESSION_HEADER]: sessionId,\n ...corsHeaders,\n },\n })\n}\n\n/**\n * Handle JSON-RPC POST request\n */\nasync function handleJsonRpcRequest(\n request: Request,\n server: McpServer,\n sessionId: string,\n sessions: SessionStore,\n corsHeaders: Record<string, string>,\n onRpcMethod?: (method: string) => void\n): Promise<Response> {\n // Check Content-Type\n const contentType = request.headers.get('Content-Type')\n if (!contentType?.includes('application/json')) {\n return errorResponse(-32700, 'Content-Type must be application/json', 400, corsHeaders)\n }\n\n // Parse JSON body\n let body: unknown\n try {\n body = await request.json()\n } catch {\n return errorResponse(-32700, 'Parse error: Invalid JSON', 400, corsHeaders)\n }\n\n // Handle batch requests\n if (Array.isArray(body)) {\n // Report first method for logging\n if (onRpcMethod && body.length > 0 && body[0]?.method) {\n onRpcMethod(`batch[${body.length}]:${body[0].method}`)\n }\n const responses = await Promise.all(\n body.map((req) => processRequest(req, server, sessionId, sessions))\n )\n return jsonResponse(responses, 200, corsHeaders, sessionId)\n }\n\n // Handle single request\n const mcpRequest = body as McpRequest\n if (onRpcMethod && mcpRequest.method) {\n onRpcMethod(mcpRequest.method)\n }\n const response = await processRequest(mcpRequest, server, sessionId, sessions)\n return jsonResponse(response, 200, corsHeaders, sessionId)\n}\n\n/**\n * Handle DELETE request for session termination\n */\nasync function handleDeleteSession(\n sessionId: string,\n sessions: SessionStore,\n corsHeaders: Record<string, string>\n): Promise<Response> {\n const sseSession = sessions.sseClients.get(sessionId)\n if (sseSession) {\n try {\n sseSession.controller.close()\n } catch {\n // Controller may already be closed\n }\n sessions.sseClients.delete(sessionId)\n }\n sessions.lastActivity.delete(sessionId)\n\n return new Response(null, {\n status: 204,\n headers: corsHeaders,\n })\n}\n\n/**\n * Process a single JSON-RPC request\n */\nasync function processRequest(\n request: McpRequest,\n server: McpServer,\n sessionId: string,\n sessions: SessionStore\n): Promise<McpResponse> {\n // Validate request structure\n if (!request || typeof request !== 'object') {\n return {\n jsonrpc: '2.0',\n id: null as unknown as string,\n error: { code: -32600, message: 'Invalid request' },\n }\n }\n\n // Delegate to MCP server\n const response = await server.handleRequest(request)\n\n // If there's an SSE client, send the response as an event\n const sseSession = sessions.sseClients.get(sessionId)\n if (sseSession) {\n try {\n const event = formatSseEvent('message', JSON.stringify(response), ++sseSession.lastEventId)\n sseSession.controller.enqueue(sseSession.encoder.encode(event))\n } catch {\n // SSE connection may be closed\n sessions.sseClients.delete(sessionId)\n }\n }\n\n return response\n}\n\n/**\n * Format an SSE event\n */\nfunction formatSseEvent(event: string, data: string, id: number): string {\n return `event: ${event}\\nid: ${id}\\ndata: ${data}\\n\\n`\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Send an event to a specific SSE session\n */\nexport function sendSseEvent(\n sessionId: string,\n sessions: SessionStore,\n event: string,\n data: unknown\n): boolean {\n const sseSession = sessions.sseClients.get(sessionId)\n if (!sseSession) {\n return false\n }\n\n try {\n const formattedEvent = formatSseEvent(event, JSON.stringify(data), ++sseSession.lastEventId)\n sseSession.controller.enqueue(sseSession.encoder.encode(formattedEvent))\n return true\n } catch {\n sessions.sseClients.delete(sessionId)\n return false\n }\n}\n\n/**\n * Create a simple request handler that wraps the MCP handler\n * for use with standard HTTP servers\n */\nexport function createStandardHandler(\n server: McpServer,\n corsOptions?: CorsOptions\n): HttpHandler {\n return createHttpMcpHandler(server, corsOptions)\n}\n","/**\n * MCP Handler for MondoDatabase Durable Object\n *\n * Creates an MCP HTTP handler that wraps MondoDatabase methods,\n * allowing AI agents to access the database via MCP protocol.\n */\n\nimport { createMcpServer, type McpServer } from '../mcp/server'\nimport { createHttpMcpHandler } from '../mcp/transport/http'\nimport type { HttpHandler } from '../mcp/transport/http'\nimport type { DatabaseAccess, FindOptions } from '../mcp/types'\nimport type { MondoDatabase, Document } from './mondo-database'\nimport type { PipelineStage } from '../translator/aggregation-translator'\n\n// Re-export HttpHandler for convenience\nexport type { HttpHandler }\n\n/**\n * Create a DatabaseAccess implementation that wraps MondoDatabase methods\n *\n * @param db - The MondoDatabase instance to wrap\n * @returns DatabaseAccess interface for MCP tools\n */\nexport function createDatabaseAccess(db: MondoDatabase): DatabaseAccess {\n return {\n async findOne(\n collection: string,\n filter: Record<string, unknown>\n ): Promise<Record<string, unknown> | null> {\n return db.findOne(collection, filter as Document)\n },\n\n async find(\n collection: string,\n filter: Record<string, unknown>,\n options?: FindOptions\n ): Promise<Record<string, unknown>[]> {\n // MondoDatabase.find() doesn't support options yet, so we fetch all and apply in memory\n const results = await db.find(collection, filter as Document)\n\n let processed = results as Record<string, unknown>[]\n\n // Apply skip\n if (options?.skip) {\n processed = processed.slice(options.skip)\n }\n\n // Apply limit\n if (options?.limit) {\n processed = processed.slice(0, options.limit)\n }\n\n // Apply sort (simple in-memory sort)\n if (options?.sort) {\n const sortEntries = Object.entries(options.sort)\n if (sortEntries.length > 0) {\n processed.sort((a, b) => {\n for (const [field, order] of sortEntries) {\n const aVal = a[field] as string | number | boolean | null | undefined\n const bVal = b[field] as string | number | boolean | null | undefined\n if (aVal != null && bVal != null && aVal < bVal) return order === 1 ? -1 : 1\n if (aVal != null && bVal != null && aVal > bVal) return order === 1 ? 1 : -1\n }\n return 0\n })\n }\n }\n\n // Apply projection\n if (options?.projection) {\n const projEntries = Object.entries(options.projection)\n const isInclusive = projEntries.some(([, v]) => v === 1)\n\n processed = processed.map((doc) => {\n if (isInclusive) {\n // Include only specified fields (plus _id unless excluded)\n const projected: Record<string, unknown> = {}\n if (options.projection!['_id'] !== 0) {\n projected['_id'] = doc['_id']\n }\n for (const [field, include] of projEntries) {\n if (include === 1 && field !== '_id') {\n projected[field] = doc[field]\n }\n }\n return projected\n } else {\n // Exclude specified fields\n const projected = { ...doc }\n for (const [field, exclude] of projEntries) {\n if (exclude === 0) {\n delete projected[field]\n }\n }\n return projected\n }\n })\n }\n\n return processed\n },\n\n async insertOne(\n collection: string,\n document: Record<string, unknown>\n ): Promise<{ insertedId: string }> {\n const result = await db.insertOne(collection, document as Document)\n return { insertedId: result.insertedId }\n },\n\n async insertMany(\n collection: string,\n documents: Record<string, unknown>[]\n ): Promise<{ insertedIds: string[] }> {\n const result = await db.insertMany(collection, documents as Document[])\n return { insertedIds: result.insertedIds }\n },\n\n async updateOne(\n collection: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n const result = await db.updateOne(\n collection,\n filter as Document,\n update as { $set?: Document; $unset?: Record<string, unknown> }\n )\n return {\n matchedCount: result.matchedCount,\n modifiedCount: result.modifiedCount,\n }\n },\n\n async updateMany(\n collection: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n // MondoDatabase doesn't have updateMany yet, so we implement it via find + updateOne\n const docs = await db.find(collection, filter as Document)\n let matchedCount = 0\n let modifiedCount = 0\n\n for (const doc of docs) {\n if (doc._id) {\n const result = await db.updateOne(\n collection,\n { _id: doc._id },\n update as { $set?: Document; $unset?: Record<string, unknown> }\n )\n matchedCount += result.matchedCount\n modifiedCount += result.modifiedCount\n }\n }\n\n return { matchedCount, modifiedCount }\n },\n\n async deleteOne(\n collection: string,\n filter: Record<string, unknown>\n ): Promise<{ deletedCount: number }> {\n const result = await db.deleteOne(collection, filter as Document)\n return { deletedCount: result.deletedCount }\n },\n\n async deleteMany(\n collection: string,\n filter: Record<string, unknown>\n ): Promise<{ deletedCount: number }> {\n const result = await db.deleteMany(collection, filter as Document)\n return { deletedCount: result.deletedCount }\n },\n\n async aggregate(\n collection: string,\n pipeline: Record<string, unknown>[]\n ): Promise<Record<string, unknown>[]> {\n const result = await db.aggregate(collection, pipeline as PipelineStage[])\n return result as Record<string, unknown>[]\n },\n\n async countDocuments(\n collection: string,\n filter?: Record<string, unknown>\n ): Promise<number> {\n return db.countDocuments(collection, (filter || {}) as Document)\n },\n\n async listCollections(): Promise<string[]> {\n // Get collections from the storage\n const storage = db.getStorage()\n const sql = storage.sql\n\n const result = sql.exec(`SELECT name FROM collections`).toArray() as { name: string }[]\n return result.map((row) => row.name)\n },\n\n async listDatabases(): Promise<string[]> {\n // In MondoDatabase, each DO instance is essentially a database\n // Return a single database name\n return ['default']\n },\n\n getProxy(): DatabaseAccess {\n // Return self as proxy - the MondoDatabase already provides isolation\n return this\n },\n }\n}\n\n/**\n * Create an MCP HTTP handler for a MondoDatabase instance\n *\n * @param db - The MondoDatabase instance\n * @param options - Optional configuration\n * @returns HTTP handler function for MCP requests\n *\n * @example\n * ```typescript\n * // In MondoDatabase.fetch()\n * if (url.pathname.startsWith('/mcp')) {\n * const mcpHandler = createMondoMcpHandler(this)\n * return mcpHandler(request)\n * }\n * ```\n */\nexport function createMondoMcpHandler(\n db: MondoDatabase,\n options?: {\n /** Server name for MCP initialization (default: 'mongo.do') */\n name?: string\n /** Server version (default: '1.0.0') */\n version?: string\n }\n): HttpHandler {\n // Create DatabaseAccess wrapper\n const dbAccess = createDatabaseAccess(db)\n\n // Create MCP server with database access\n const server = createMcpServer({\n dbAccess,\n name: options?.name ?? 'mongo.do',\n version: options?.version ?? '1.0.0',\n })\n\n // Create and return HTTP handler\n return createHttpMcpHandler(server)\n}\n\n/**\n * Get the MCP server instance for advanced usage\n *\n * @param db - The MondoDatabase instance\n * @param options - Optional configuration\n * @returns MCP server instance\n */\nexport function getMcpServer(\n db: MondoDatabase,\n options?: {\n name?: string\n version?: string\n }\n): McpServer {\n const dbAccess = createDatabaseAccess(db)\n return createMcpServer({\n dbAccess,\n name: options?.name ?? 'mongo.do',\n version: options?.version ?? '1.0.0',\n })\n}\n","/**\n * MondoDatabase - MongoDB-compatible Durable Object\n *\n * This is the main Durable Object class that provides MongoDB-compatible\n * operations backed by Cloudflare's SQLite storage.\n */\n\n// Import types from the unified schema module\nimport {\n SchemaManager,\n DurableObjectStorage,\n Document,\n InsertOneResult,\n UpdateResult,\n DeleteResult,\n} from './schema';\nimport { ObjectId } from '../types/objectid';\nimport type { WorkerLoader } from '../types/function';\nimport { AggregationExecutor } from '../executor/aggregation-executor';\nimport type { PipelineStage } from '../translator/aggregation-translator';\nimport { createMondoMcpHandler, type HttpHandler } from './mcp-handler';\n\n// Re-export types that consumers of MondoDatabase might need\nexport type { Document, InsertOneResult, UpdateResult, DeleteResult };\n\n/**\n * Interface for Durable Object state\n */\nexport interface DurableObjectState {\n storage: DurableObjectStorage;\n blockConcurrencyWhile<T>(callback: () => Promise<T>): void;\n}\n\n/**\n * Interface for Cloudflare Environment bindings\n */\nexport interface Env {\n /** Optional worker-loader binding for $function support */\n LOADER?: WorkerLoader\n /** Enable debug endpoints (/internal/reset, /internal/dump) - DO NOT enable in production */\n ENABLE_DEBUG_ENDPOINTS?: string\n}\n\n/**\n * Result of an insertMany operation\n * Note: This uses string[] for insertedIds (matching MongoDB's native driver behavior),\n * while the shared InsertManyResult type uses Record<number, string> for MongoDB compatibility\n */\nexport interface InsertManyResult {\n acknowledged: boolean;\n insertedCount: number;\n insertedIds: string[];\n}\n\n/**\n * MondoDatabase Durable Object\n *\n * Provides MongoDB-compatible document storage using Cloudflare Durable Objects\n * with SQLite as the backing store.\n */\nexport class MondoDatabase {\n private state: DurableObjectState;\n private env: Env;\n private schemaManager: SchemaManager;\n private initialized: boolean = false;\n private mcpHandler: HttpHandler | null = null;\n\n constructor(state: DurableObjectState, env: Env) {\n this.state = state;\n this.env = env;\n this.schemaManager = new SchemaManager(state.storage);\n\n // Use blockConcurrencyWhile to ensure atomic schema initialization\n // This prevents race conditions when multiple requests arrive simultaneously\n this.state.blockConcurrencyWhile(async () => {\n await this.schemaManager.initializeSchema();\n this.initialized = true;\n });\n }\n\n /**\n * Check if the database is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get the schema manager for advanced operations\n */\n getSchemaManager(): SchemaManager {\n return this.schemaManager;\n }\n\n /**\n * Get the underlying storage\n */\n getStorage(): DurableObjectStorage {\n return this.state.storage;\n }\n\n /**\n * Get or create a collection by name, returning the collection_id\n */\n private getOrCreateCollection(name: string): number {\n const sql = this.state.storage.sql;\n\n // Try to get existing collection\n const existing = sql.exec(\n `SELECT id FROM collections WHERE name = ?`,\n name\n ).toArray() as { id: number }[];\n\n if (existing.length > 0 && existing[0]) {\n return existing[0].id;\n }\n\n // Create new collection\n sql.exec(\n `INSERT INTO collections (name, options) VALUES (?, '{}')`,\n name\n );\n\n // Get the inserted id\n const result = sql.exec(\n `SELECT id FROM collections WHERE name = ?`,\n name\n ).toArray() as { id: number }[];\n\n if (!result[0]) {\n throw new Error(`Failed to create collection: ${name}`);\n }\n return result[0].id;\n }\n\n /**\n * Get collection ID by name, returns undefined if not found\n */\n private getCollectionId(name: string): number | undefined {\n const sql = this.state.storage.sql;\n const result = sql.exec(\n `SELECT id FROM collections WHERE name = ?`,\n name\n ).toArray() as { id: number }[];\n\n return result.length > 0 && result[0] ? result[0].id : undefined;\n }\n\n /**\n * Insert a single document into a collection\n */\n async insertOne(collection: string, document: Document): Promise<InsertOneResult> {\n const collectionId = this.getOrCreateCollection(collection);\n const sql = this.state.storage.sql;\n\n // Generate _id if not provided\n const docId = document._id\n ? (document._id instanceof ObjectId ? document._id.toHexString() : String(document._id))\n : new ObjectId().toHexString();\n\n // Create document with _id included\n const docWithId = { ...document, _id: docId };\n\n // Insert document using json() for proper JSON storage\n sql.exec(\n `INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, json(?))`,\n collectionId,\n docId,\n JSON.stringify(docWithId)\n );\n\n return {\n acknowledged: true,\n insertedId: docId,\n };\n }\n\n /**\n * Insert multiple documents into a collection\n */\n async insertMany(collection: string, documents: Document[]): Promise<InsertManyResult> {\n const collectionId = this.getOrCreateCollection(collection);\n const sql = this.state.storage.sql;\n\n // Use transactionSync for atomic bulk insert\n // If any insert fails, all are rolled back\n const insertedIds = this.state.storage.transactionSync(() => {\n const ids: string[] = [];\n\n for (const document of documents) {\n // Generate _id if not provided\n const docId = document._id\n ? (document._id instanceof ObjectId ? document._id.toHexString() : String(document._id))\n : new ObjectId().toHexString();\n\n // Create document with _id included\n const docWithId = { ...document, _id: docId };\n\n // Insert document\n sql.exec(\n `INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, json(?))`,\n collectionId,\n docId,\n JSON.stringify(docWithId)\n );\n\n ids.push(docId);\n }\n\n return ids;\n });\n\n return {\n acknowledged: true,\n insertedCount: insertedIds.length,\n insertedIds,\n };\n }\n\n /**\n * Find a single document matching the query\n */\n async findOne(collection: string, query: Document = {}): Promise<Document | null> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return null;\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(query);\n\n const sqlQuery = `\n SELECT data FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n LIMIT 1\n `;\n\n const result = sql.exec(sqlQuery, collectionId, ...params).toArray() as { data: string }[];\n\n if (result.length === 0 || !result[0]) {\n return null;\n }\n\n return JSON.parse(result[0].data) as Document;\n }\n\n /**\n * Find all documents matching the query\n */\n async find(collection: string, query: Document = {}): Promise<Document[]> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return [];\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(query);\n\n const sqlQuery = `\n SELECT data FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n `;\n\n const result = sql.exec(sqlQuery, collectionId, ...params).toArray() as { data: string }[];\n\n return result.map((row) => JSON.parse(row.data) as Document);\n }\n\n /**\n * Update a single document matching the filter\n */\n async updateOne(\n collection: string,\n filter: Document,\n update: { $set?: Document; $unset?: Record<string, unknown> }\n ): Promise<UpdateResult> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return { acknowledged: true, matchedCount: 0, modifiedCount: 0 };\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n // Find the document to update\n const findQuery = `\n SELECT id, data FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n LIMIT 1\n `;\n\n const found = sql.exec(findQuery, collectionId, ...params).toArray() as { id: number; data: string }[];\n\n if (found.length === 0 || !found[0]) {\n return { acknowledged: true, matchedCount: 0, modifiedCount: 0 };\n }\n\n const docRowId = found[0].id;\n const existingDoc = JSON.parse(found[0].data) as Document;\n\n // Apply $set updates\n let updatedDoc = { ...existingDoc };\n if (update.$set) {\n for (const [key, value] of Object.entries(update.$set)) {\n if (key !== '_id') {\n this.setNestedValue(updatedDoc, key, value);\n }\n }\n }\n\n // Apply $unset to remove fields\n if (update.$unset) {\n for (const key of Object.keys(update.$unset)) {\n if (key !== '_id') {\n this.deleteNestedValue(updatedDoc, key);\n }\n }\n }\n\n // Update the document in the database\n sql.exec(\n `UPDATE documents SET data = json(?) WHERE id = ?`,\n JSON.stringify(updatedDoc),\n docRowId\n );\n\n return {\n acknowledged: true,\n matchedCount: 1,\n modifiedCount: 1,\n };\n }\n\n /**\n * Delete a single document matching the filter\n */\n async deleteOne(collection: string, filter: Document): Promise<DeleteResult> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return { acknowledged: true, deletedCount: 0 };\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n // Find the document to delete\n const findQuery = `\n SELECT id FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n LIMIT 1\n `;\n\n const found = sql.exec(findQuery, collectionId, ...params).toArray() as { id: number }[];\n\n if (found.length === 0 || !found[0]) {\n return { acknowledged: true, deletedCount: 0 };\n }\n\n // Delete the document\n sql.exec(`DELETE FROM documents WHERE id = ?`, found[0].id);\n\n return {\n acknowledged: true,\n deletedCount: 1,\n };\n }\n\n /**\n * Build WHERE clause from MongoDB-style query\n * Supports: _id, simple field equality, $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $exists\n */\n private buildWhereClause(query: Document): { whereClause: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (key === '_id') {\n // Direct _id comparison on the _id column\n conditions.push('_id = ?');\n params.push(value instanceof ObjectId ? value.toHexString() : String(value));\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Handle MongoDB operators\n for (const [op, opValue] of Object.entries(value as Record<string, unknown>)) {\n const jsonPath = this.fieldToJsonPath(key);\n switch (op) {\n case '$eq': {\n conditions.push(`json_extract(data, ?) = ?`);\n const eqValue = typeof opValue === 'boolean' ? (opValue ? 1 : 0) : opValue;\n params.push(jsonPath, eqValue);\n break;\n }\n case '$ne': {\n conditions.push(`json_extract(data, ?) != ?`);\n const neValue = typeof opValue === 'boolean' ? (opValue ? 1 : 0) : opValue;\n params.push(jsonPath, neValue);\n break;\n }\n case '$gt':\n conditions.push(`json_extract(data, ?) > ?`);\n params.push(jsonPath, opValue);\n break;\n case '$gte':\n conditions.push(`json_extract(data, ?) >= ?`);\n params.push(jsonPath, opValue);\n break;\n case '$lt':\n conditions.push(`json_extract(data, ?) < ?`);\n params.push(jsonPath, opValue);\n break;\n case '$lte':\n conditions.push(`json_extract(data, ?) <= ?`);\n params.push(jsonPath, opValue);\n break;\n case '$in':\n if (Array.isArray(opValue) && opValue.length > 0) {\n const placeholders = opValue.map(() => '?').join(', ');\n conditions.push(`json_extract(data, ?) IN (${placeholders})`);\n params.push(jsonPath, ...opValue);\n }\n break;\n case '$nin':\n if (Array.isArray(opValue) && opValue.length > 0) {\n const placeholders = opValue.map(() => '?').join(', ');\n conditions.push(`json_extract(data, ?) NOT IN (${placeholders})`);\n params.push(jsonPath, ...opValue);\n }\n break;\n case '$exists':\n if (opValue) {\n conditions.push(`json_extract(data, ?) IS NOT NULL`);\n } else {\n conditions.push(`json_extract(data, ?) IS NULL`);\n }\n params.push(jsonPath);\n break;\n }\n }\n } else {\n // Implicit $eq for simple values using json_extract\n const jsonPath = this.fieldToJsonPath(key);\n conditions.push(`json_extract(data, ?) = ?`);\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(jsonPath, sqlValue);\n }\n }\n\n return {\n whereClause: conditions.join(' AND '),\n params,\n };\n }\n\n /**\n * Convert a field name (possibly with dot notation) to JSON path\n * e.g., \"profile.level\" -> \"$.profile.level\"\n */\n private fieldToJsonPath(field: string): string {\n return `$.${field}`;\n }\n\n /**\n * Set a nested value in an object using dot notation path\n */\n private setNestedValue(obj: Document, path: string, value: unknown): void {\n const keys = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]!;\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (lastKey !== undefined) {\n current[lastKey] = value;\n }\n }\n\n /**\n * Delete a nested value from an object using dot notation path\n */\n private deleteNestedValue(obj: Document, path: string): void {\n const keys = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]!;\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n return; // Path doesn't exist\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (lastKey !== undefined) {\n delete current[lastKey];\n }\n }\n\n /**\n * Delete multiple documents matching the filter\n */\n async deleteMany(collection: string, filter: Document = {}): Promise<DeleteResult> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return { acknowledged: true, deletedCount: 0 };\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n // Use transactionSync for atomic bulk delete\n // If any delete fails, all are rolled back\n const deletedCount = this.state.storage.transactionSync(() => {\n // If no filter, delete all documents in collection\n if (!whereClause) {\n const countResult = sql.exec(\n `SELECT COUNT(*) as count FROM documents WHERE collection_id = ?`,\n collectionId\n ).toArray() as { count: number }[];\n\n const count = countResult[0]?.count || 0;\n\n sql.exec(`DELETE FROM documents WHERE collection_id = ?`, collectionId);\n\n return count;\n }\n\n // Find and delete matching documents\n const findQuery = `\n SELECT id FROM documents\n WHERE collection_id = ? AND ${whereClause}\n `;\n\n const found = sql.exec(findQuery, collectionId, ...params).toArray() as { id: number }[];\n\n for (const row of found) {\n sql.exec(`DELETE FROM documents WHERE id = ?`, row.id);\n }\n\n return found.length;\n });\n\n return {\n acknowledged: true,\n deletedCount,\n };\n }\n\n /**\n * Count documents matching the filter\n */\n async countDocuments(collection: string, filter: Document = {}): Promise<number> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return 0;\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n const countQuery = `\n SELECT COUNT(*) as count FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n `;\n\n const result = sql.exec(countQuery, collectionId, ...params).toArray() as { count: number }[];\n\n return result[0]?.count || 0;\n }\n\n /**\n * Execute an aggregation pipeline on a collection\n *\n * Supports async execution for $function operators that require\n * JavaScript execution via worker-loader.\n *\n * @param collection - The collection name\n * @param pipeline - Array of aggregation pipeline stages\n * @returns Array of result documents\n */\n async aggregate(collection: string, pipeline: PipelineStage[]): Promise<unknown[]> {\n // Ensure collection exists - create view for documents\n const collectionId = this.getCollectionId(collection);\n\n if (collectionId === undefined) {\n // Return empty for non-existent collection\n return [];\n }\n\n // Create SQL interface that wraps the storage.sql for AggregationExecutor\n const sqlInterface = {\n exec: (query: string, ...params: unknown[]) => {\n // The AggregationTranslator generates SQL that selects from collection name directly\n // We need to replace the collection name with a subquery that filters by collection_id\n // Handle both cases: with and without existing WHERE clause\n let modifiedQuery: string;\n const fromPattern = new RegExp(`FROM\\\\s+${collection}\\\\b(\\\\s+WHERE\\\\s+)?`, 'gi');\n modifiedQuery = query.replace(fromPattern, (_match, hasWhere) => {\n if (hasWhere) {\n // There's an existing WHERE clause, use AND to combine conditions\n return `FROM documents WHERE collection_id = ${collectionId} AND `;\n } else {\n // No existing WHERE clause\n return `FROM documents WHERE collection_id = ${collectionId}`;\n }\n });\n const result = this.state.storage.sql.exec(modifiedQuery, ...params);\n const array = result.toArray();\n return {\n results: array,\n toArray: () => array\n };\n }\n };\n\n const executor = new AggregationExecutor(sqlInterface, this.env);\n return executor.execute(collection, pipeline);\n }\n\n /**\n * Reset database - for testing purposes\n */\n private async reset(): Promise<void> {\n const sql = this.state.storage.sql;\n sql.exec(`DELETE FROM documents`);\n sql.exec(`DELETE FROM collections`);\n }\n\n /**\n * Dump database contents - for debugging\n */\n private async dump(): Promise<{ collections: unknown[]; documents: unknown[] }> {\n const sql = this.state.storage.sql;\n const collections = sql.exec(`SELECT * FROM collections`).toArray();\n const documents = sql.exec(`SELECT * FROM documents`).toArray();\n return { collections, documents };\n }\n\n /**\n * Handle incoming fetch requests\n * Implements HTTP API for MongoDB-compatible operations\n */\n async fetch(request: Request): Promise<Response> {\n // Ensure initialization is complete\n if (!this.initialized) {\n return new Response(JSON.stringify({ error: 'Database initializing' }), {\n status: 503,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const url = new URL(request.url);\n const path = url.pathname;\n\n try {\n // MCP endpoint - route to MCP handler for AI agent access\n if (path.startsWith('/mcp')) {\n // Lazily create MCP handler on first request\n if (!this.mcpHandler) {\n this.mcpHandler = createMondoMcpHandler(this);\n }\n return this.mcpHandler(request);\n }\n\n // Health check endpoint\n if (path === '/health') {\n const isValid = await this.schemaManager.validateSchema();\n return new Response(\n JSON.stringify({\n status: isValid ? 'healthy' : 'unhealthy',\n schemaVersion: await this.schemaManager.getSchemaVersion(),\n }),\n {\n status: isValid ? 200 : 500,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n // Internal endpoints for testing - SECURITY: Gated behind ENABLE_DEBUG_ENDPOINTS\n // These endpoints are dangerous and should NEVER be enabled in production\n if (path === '/internal/reset' || path === '/internal/dump') {\n // Check if debug endpoints are enabled via environment variable\n if (this.env.ENABLE_DEBUG_ENDPOINTS !== 'true') {\n return new Response(JSON.stringify({ error: 'Debug endpoints are disabled' }), {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (request.method === 'POST' && path === '/internal/reset') {\n await this.reset();\n return new Response(JSON.stringify({ ok: true }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (request.method === 'GET' && path === '/internal/dump') {\n const data = await this.dump();\n return new Response(JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n // CRUD endpoints\n if (request.method === 'POST') {\n const body = await request.json() as Record<string, unknown>;\n const collection = body.collection as string;\n\n if (!collection) {\n return new Response(JSON.stringify({ error: 'Collection name required' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/insertOne') {\n const result = await this.insertOne(collection, body.document as Document || {});\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/insertMany') {\n const result = await this.insertMany(collection, body.documents as Document[] || []);\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/findOne') {\n const result = await this.findOne(collection, body.filter as Document || {});\n return new Response(JSON.stringify({ document: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/find') {\n const result = await this.find(collection, body.filter as Document || {});\n return new Response(JSON.stringify({ documents: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/updateOne') {\n const result = await this.updateOne(\n collection,\n body.filter as Document || {},\n body.update as { $set?: Document; $unset?: Record<string, unknown> } || {}\n );\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/deleteOne') {\n const result = await this.deleteOne(collection, body.filter as Document || {});\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/deleteMany') {\n const result = await this.deleteMany(collection, body.filter as Document || {});\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/countDocuments') {\n const result = await this.countDocuments(collection, body.filter as Document || {});\n return new Response(JSON.stringify({ count: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/aggregate') {\n const result = await this.aggregate(collection, body.pipeline as PipelineStage[] || []);\n return new Response(JSON.stringify({ documents: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n return new Response(JSON.stringify({ error: 'Not found' }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return new Response(JSON.stringify({ error: message }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n}\n","/**\n * Index Manager for mongo.do\n *\n * Manages SQLite indexes for MongoDB-style collections backed by Durable Objects.\n * Indexes are created on json_extract expressions to enable efficient querying.\n *\n * TTL (Time-To-Live) Index Support:\n * - createIndex({field: 1}, {expireAfterSeconds: N}) creates a TTL index\n * - Documents with date values in the TTL field will expire after N seconds\n * - Background cleanup removes expired documents periodically\n */\n\n// Import all types from the unified schema module\nimport type {\n IndexSpec,\n CreateIndexOptions,\n CreateIndexResult,\n IndexInfo,\n DropIndexResult,\n SQLStorage,\n SQLStatement,\n TTLIndexInfo,\n TTLMetadata,\n TTLCleanupResult,\n ExpiredDocumentsQuery,\n} from './schema'\n\n// Re-export types that consumers of IndexManager might need\nexport type {\n SQLStorage,\n SQLStatement,\n TTLIndexInfo,\n TTLMetadata,\n TTLCleanupResult,\n ExpiredDocumentsQuery,\n}\n\n/**\n * Validates and escapes a field name/path for safe use in SQL json_extract expressions.\n * Prevents SQL injection by only allowing safe characters in field paths.\n *\n * @throws Error if field name contains invalid characters\n */\nexport function escapeFieldPath(field: string): string {\n if (!field || field.length === 0) {\n throw new Error('Field name cannot be empty')\n }\n if (field.includes('\\0')) {\n throw new Error('Field name cannot contain null characters')\n }\n const safeFieldPattern = /^[a-zA-Z0-9_.$-]+$/\n if (!safeFieldPattern.test(field)) {\n throw new Error(`Invalid field name: ${field}. Field names can only contain alphanumeric characters, underscores, dots, hyphens, and dollar signs.`)\n }\n if (field.includes('..') || field.startsWith('.') || field.endsWith('.')) {\n throw new Error(`Invalid field path: ${field}. Field paths cannot have consecutive, leading, or trailing dots.`)\n }\n return field\n}\n\n/**\n * Validates an identifier (table name, index name) for safe use in SQL.\n * Only allows alphanumeric characters and underscores.\n *\n * @throws Error if identifier contains invalid characters\n */\nexport function validateIdentifier(identifier: string): string {\n if (!identifier || identifier.length === 0) {\n throw new Error('Identifier cannot be empty')\n }\n if (identifier.includes('\\0')) {\n throw new Error('Identifier cannot contain null characters')\n }\n const safeIdentifierPattern = /^[a-zA-Z0-9_]+$/\n if (!safeIdentifierPattern.test(identifier)) {\n throw new Error(`Invalid identifier: ${identifier}. Identifiers can only contain alphanumeric characters and underscores.`)\n }\n return identifier\n}\n\n/**\n * Check if an index specification is a text index\n */\nexport function isTextIndex(keys: IndexSpec): boolean {\n return Object.values(keys).some(v => v === 'text')\n}\n\n/**\n * Get fields that are text-indexed\n */\nexport function getTextFields(keys: IndexSpec): string[] {\n return Object.entries(keys)\n .filter(([_, v]) => v === 'text')\n .map(([field]) => field)\n}\n\n/**\n * Generate FTS5 virtual table name for a collection\n */\nexport function generateFTS5TableName(collectionName: string): string {\n validateIdentifier(collectionName)\n return `${collectionName}_fts`\n}\n\n/**\n * Generates an index name from collection name and key specification\n */\nexport function generateIndexName(collectionName: string, keys: IndexSpec): string {\n validateIdentifier(collectionName)\n const keyParts = Object.entries(keys).map(([field, direction]) => {\n escapeFieldPath(field)\n const safeField = field.replace(/\\./g, '_')\n if (direction === 'text') {\n return `${safeField}_text`\n }\n const suffix = direction === 1 ? '1' : '-1'\n return `${safeField}_${suffix}`\n })\n return `${collectionName}_${keyParts.join('_')}`\n}\n\n/**\n * Generates the SQLite index name (prefixed for internal use)\n */\nexport function generateSQLiteIndexName(collectionName: string, keys: IndexSpec, unique?: boolean): string {\n const baseName = generateIndexName(collectionName, keys)\n const prefix = unique ? 'idx_unique_' : 'idx_'\n return `${prefix}${baseName}`\n}\n\n/**\n * Builds the SQL CREATE INDEX statement for given index specification\n */\nexport function buildCreateIndexSQL(\n collectionName: string,\n collectionId: number,\n keys: IndexSpec,\n options: CreateIndexOptions = {}\n): { sql: string; indexName: string; sqliteIndexName: string } {\n const indexName = options.name || generateIndexName(collectionName, keys)\n const sqliteIndexName = `idx_${options.unique ? 'unique_' : ''}${indexName}`\n\n // Build the column expressions for the index\n const columns = Object.entries(keys).map(([field, direction]) => {\n // Validate and escape field name to prevent SQL injection\n const safeField = escapeFieldPath(field)\n const jsonPath = safeField.startsWith('$') ? safeField : `$.${safeField}`\n const expr = `json_extract(data, '${jsonPath}')`\n const order = direction === 1 ? 'ASC' : 'DESC'\n return `${expr} ${order}`\n })\n\n const uniqueClause = options.unique ? 'UNIQUE ' : ''\n\n // Build the WHERE clause for collection scoping\n const whereClause = `WHERE collection_id = ${collectionId}`\n\n // Handle sparse index - only index documents where the field exists\n let sparseCondition = ''\n if (options.sparse) {\n const sparseChecks = Object.keys(keys).map(field => {\n const safeField = escapeFieldPath(field)\n const jsonPath = safeField.startsWith('$') ? safeField : `$.${safeField}`\n return `json_extract(data, '${jsonPath}') IS NOT NULL`\n })\n sparseCondition = ` AND ${sparseChecks.join(' AND ')}`\n }\n\n const sql = `CREATE ${uniqueClause}INDEX IF NOT EXISTS ${sqliteIndexName} ON documents (\n ${columns.join(',\\n ')}\n) ${whereClause}${sparseCondition}`\n\n return { sql, indexName, sqliteIndexName }\n}\n\n/**\n * Builds the SQL for creating an FTS5 virtual table for text indexing.\n *\n * UNIFIED SCHEMA: Uses _id column from the unified schema (not doc_id).\n */\nexport function buildFTS5CreateSQL(\n collectionName: string,\n fields: string[],\n options: CreateIndexOptions = {}\n): { tableName: string; createSQL: string; triggersSQL: string[] } {\n // generateFTS5TableName validates collectionName\n const ftsTableName = generateFTS5TableName(collectionName)\n\n // Validate and escape all field names to prevent SQL injection\n const safeFields = fields.map(f => escapeFieldPath(f))\n // Replace dots with underscores for FTS5 column names\n const safeFtsFields = safeFields.map(f => f.replace(/\\./g, '_'))\n // Use _id to match the unified schema column name\n const ftsFields = ['_id', ...safeFtsFields]\n\n // Tokenize option - use unicode61 by default for better international support\n const tokenize = options.default_language === 'none'\n ? 'unicode61'\n : 'porter unicode61'\n\n // Create the FTS5 virtual table\n const createSQL = `CREATE VIRTUAL TABLE IF NOT EXISTS ${ftsTableName} USING fts5(\n ${ftsFields.join(', ')},\n content='documents',\n content_rowid='id',\n tokenize='${tokenize}'\n)`\n\n // Build json_extract expressions with validated field paths\n const jsonExtractExprsNew = safeFields.map(f => `json_extract(NEW.data, '$.${f}')`)\n const jsonExtractExprsOld = safeFields.map(f => `json_extract(OLD.data, '$.${f}')`)\n\n // Create triggers to keep FTS5 table in sync with documents table\n // Uses _id column from the unified schema\n const triggersSQL: string[] = [\n // Insert trigger\n `CREATE TRIGGER IF NOT EXISTS ${ftsTableName}_ai AFTER INSERT ON documents BEGIN\n INSERT INTO ${ftsTableName}(rowid, _id, ${safeFtsFields.join(', ')})\n VALUES (NEW.id, NEW._id, ${jsonExtractExprsNew.join(', ')});\nEND`,\n // Delete trigger\n `CREATE TRIGGER IF NOT EXISTS ${ftsTableName}_ad AFTER DELETE ON documents BEGIN\n INSERT INTO ${ftsTableName}(${ftsTableName}, rowid, _id, ${safeFtsFields.join(', ')})\n VALUES('delete', OLD.id, OLD._id, ${jsonExtractExprsOld.join(', ')});\nEND`,\n // Update trigger\n `CREATE TRIGGER IF NOT EXISTS ${ftsTableName}_au AFTER UPDATE ON documents BEGIN\n INSERT INTO ${ftsTableName}(${ftsTableName}, rowid, _id, ${safeFtsFields.join(', ')})\n VALUES('delete', OLD.id, OLD._id, ${jsonExtractExprsOld.join(', ')});\n INSERT INTO ${ftsTableName}(rowid, _id, ${safeFtsFields.join(', ')})\n VALUES (NEW.id, NEW._id, ${jsonExtractExprsNew.join(', ')});\nEND`,\n ]\n\n return { tableName: ftsTableName, createSQL, triggersSQL }\n}\n\n/**\n * Builds the SQL for dropping an FTS5 virtual table and its triggers\n */\nexport function buildFTS5DropSQL(collectionName: string): { dropSQL: string; dropTriggersSQL: string[] } {\n const ftsTableName = generateFTS5TableName(collectionName)\n\n return {\n dropSQL: `DROP TABLE IF EXISTS ${ftsTableName}`,\n dropTriggersSQL: [\n `DROP TRIGGER IF EXISTS ${ftsTableName}_ai`,\n `DROP TRIGGER IF EXISTS ${ftsTableName}_ad`,\n `DROP TRIGGER IF EXISTS ${ftsTableName}_au`,\n ],\n }\n}\n\n/** Default cleanup interval in milliseconds (60 seconds) */\nconst DEFAULT_CLEANUP_INTERVAL_MS = 60000\n\n/**\n * IndexManager handles creation, deletion, and listing of indexes\n * Includes TTL (Time-To-Live) index support for automatic document expiration\n */\nexport class IndexManager {\n private storage: SQLStorage\n private cleanupIntervalMs: number = DEFAULT_CLEANUP_INTERVAL_MS\n private ttlMetadataCache: Map<string, TTLMetadata> = new Map()\n\n constructor(storage: SQLStorage) {\n this.storage = storage\n }\n\n /**\n * Ensure the collections and documents tables exist.\n *\n * UNIFIED SCHEMA: This uses the same schema as MondoDatabase/SchemaManager.\n * The schema is defined in schema.ts/migrations.ts as the single source of truth.\n * This method creates the tables if they don't exist (for standalone IndexManager usage).\n */\n ensureMetadataTable(): void {\n this.storage.exec(`\n CREATE TABLE IF NOT EXISTS collections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n options TEXT DEFAULT '{}',\n indexes TEXT DEFAULT '[]',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `)\n\n this.storage.exec(`\n CREATE TABLE IF NOT EXISTS documents (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n _id TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(collection_id, _id),\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\n )\n `)\n\n // Create default indexes on _id per collection (unified schema indexes)\n this.storage.exec(`\n CREATE INDEX IF NOT EXISTS idx_documents_id ON documents(_id)\n `)\n this.storage.exec(`\n CREATE INDEX IF NOT EXISTS idx_documents_collection_id ON documents(collection_id, _id)\n `)\n }\n\n /**\n * Get or create a collection and return its ID\n */\n getOrCreateCollection(name: string): { id: number; created: boolean } {\n // Try to get existing collection\n const existing = this.storage\n .prepare('SELECT id FROM collections WHERE name = ?')\n .bind(name)\n .first<{ id: number }>()\n\n if (existing) {\n return { id: existing.id, created: false }\n }\n\n // Create new collection\n this.storage\n .prepare('INSERT INTO collections (name) VALUES (?)')\n .bind(name)\n .run()\n\n const result = this.storage\n .prepare('SELECT id FROM collections WHERE name = ?')\n .bind(name)\n .first<{ id: number }>()\n\n if (!result) {\n throw new Error(`Failed to create collection: ${name}`)\n }\n\n return { id: result.id, created: true }\n }\n\n /**\n * Get collection metadata\n */\n getCollection(name: string): { id: number; indexes: IndexInfo[] } | null {\n const result = this.storage\n .prepare('SELECT id, indexes FROM collections WHERE name = ?')\n .bind(name)\n .first<{ id: number; indexes: string }>()\n\n if (!result) {\n return null\n }\n\n return {\n id: result.id,\n indexes: JSON.parse(result.indexes) as IndexInfo[],\n }\n }\n\n /**\n * Create an index on a collection\n */\n createIndex(\n collectionName: string,\n keys: IndexSpec,\n options: CreateIndexOptions = {}\n ): CreateIndexResult {\n // Ensure tables exist\n this.ensureMetadataTable()\n\n // Get or create collection\n const { id: collectionId, created } = this.getOrCreateCollection(collectionName)\n\n // Get current indexes\n const collection = this.getCollection(collectionName)\n const currentIndexes = collection?.indexes || []\n const numIndexesBefore = currentIndexes.length + 1 // +1 for _id index\n\n // Generate index info\n const indexName = options.name || generateIndexName(collectionName, keys)\n\n // Check if index already exists\n const existingIndex = currentIndexes.find(idx => idx.name === indexName)\n if (existingIndex) {\n // Index already exists with same name\n return {\n ok: 1,\n numIndexesBefore,\n numIndexesAfter: numIndexesBefore,\n createdCollectionAutomatically: created,\n note: 'all indexes already exist',\n }\n }\n\n // Check if this is a text index\n const isText = isTextIndex(keys)\n const textFields = isText ? getTextFields(keys) : []\n\n // Text index validation - only one text index per collection\n if (isText) {\n const existingTextIndex = currentIndexes.find(idx =>\n Object.values(idx.key).some(v => v === 'text')\n )\n if (existingTextIndex) {\n throw new Error(`Collection '${collectionName}' already has a text index: ${existingTextIndex.name}`)\n }\n }\n\n // TTL index validation\n if (options.expireAfterSeconds !== undefined) {\n // TTL indexes must be on a single field (MongoDB restriction)\n const keyFields = Object.keys(keys)\n if (keyFields.length !== 1) {\n throw new Error('TTL indexes must be on a single field, compound TTL indexes are not supported')\n }\n\n // Check if collection already has a TTL index (MongoDB only allows one per collection)\n const existingTTLIndex = currentIndexes.find(idx => idx.expireAfterSeconds !== undefined)\n if (existingTTLIndex) {\n throw new Error(`Collection '${collectionName}' already has a TTL index: ${existingTTLIndex.name}`)\n }\n }\n\n // Handle text index creation with FTS5\n if (isText) {\n const { createSQL, triggersSQL } = buildFTS5CreateSQL(\n collectionName,\n textFields,\n options\n )\n\n try {\n // Create FTS5 virtual table\n this.storage.exec(createSQL)\n\n // Create sync triggers\n for (const triggerSQL of triggersSQL) {\n this.storage.exec(triggerSQL)\n }\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error)\n if (!errMsg.includes('already exists')) {\n throw error\n }\n }\n } else {\n // Build and execute regular CREATE INDEX\n const { sql } = buildCreateIndexSQL(\n collectionName,\n collectionId,\n keys,\n options\n )\n\n try {\n this.storage.exec(sql)\n } catch (error) {\n // If index already exists in SQLite, that's ok\n const errMsg = error instanceof Error ? error.message : String(error)\n if (!errMsg.includes('already exists')) {\n throw error\n }\n }\n }\n\n // Build index info\n const indexInfo: IndexInfo = {\n name: indexName,\n key: keys,\n v: 2,\n }\n\n if (options.unique) {\n indexInfo.unique = true\n }\n if (options.sparse) {\n indexInfo.sparse = true\n }\n if (options.partialFilterExpression) {\n indexInfo.partialFilterExpression = options.partialFilterExpression\n }\n if (options.expireAfterSeconds !== undefined) {\n indexInfo.expireAfterSeconds = options.expireAfterSeconds\n\n // Cache TTL metadata for quick access\n const ttlField = Object.keys(keys)[0]\n if (ttlField !== undefined) {\n const cacheKey = `${collectionName}:${indexName}`\n this.ttlMetadataCache.set(cacheKey, {\n field: ttlField,\n expireAfterSeconds: options.expireAfterSeconds,\n })\n }\n }\n if (isText) {\n indexInfo.textIndexVersion = 3\n if (options.weights) {\n indexInfo.weights = options.weights\n }\n if (options.default_language) {\n indexInfo.default_language = options.default_language\n }\n }\n\n // Update collection metadata with new index\n const updatedIndexes = [...currentIndexes, indexInfo]\n this.storage\n .prepare('UPDATE collections SET indexes = ?, updated_at = datetime(\\'now\\') WHERE id = ?')\n .bind(JSON.stringify(updatedIndexes), collectionId)\n .run()\n\n return {\n ok: 1,\n numIndexesBefore,\n numIndexesAfter: numIndexesBefore + 1,\n createdCollectionAutomatically: created,\n }\n }\n\n /**\n * List all indexes on a collection\n */\n listIndexes(collectionName: string): IndexInfo[] {\n const collection = this.getCollection(collectionName)\n if (!collection) {\n return []\n }\n\n // Always include the _id index\n const idIndex: IndexInfo = {\n name: '_id_',\n key: { _id: 1 },\n v: 2,\n }\n\n return [idIndex, ...collection.indexes]\n }\n\n /**\n * Drop a specific index by name\n */\n dropIndex(collectionName: string, indexName: string): DropIndexResult {\n // Validate collection name to prevent SQL injection\n validateIdentifier(collectionName)\n\n const collection = this.getCollection(collectionName)\n if (!collection) {\n throw new Error(`Collection not found: ${collectionName}`)\n }\n\n // Cannot drop _id index\n if (indexName === '_id_') {\n throw new Error('cannot drop _id index')\n }\n\n const currentIndexes = collection.indexes\n const indexToRemove = currentIndexes.find(idx => idx.name === indexName)\n\n if (!indexToRemove) {\n throw new Error(`index not found with name [${indexName}]`)\n }\n\n const nIndexesWas = currentIndexes.length + 1 // +1 for _id\n\n // Check if this is a text index\n const isText = isTextIndex(indexToRemove.key)\n\n if (isText) {\n // Drop FTS5 table and triggers (collection name already validated)\n const { dropSQL, dropTriggersSQL } = buildFTS5DropSQL(collectionName)\n try {\n for (const triggerSQL of dropTriggersSQL) {\n this.storage.exec(triggerSQL)\n }\n this.storage.exec(dropSQL)\n } catch (error) {\n // Ignore errors if FTS5 table doesn't exist\n }\n } else {\n // Generate SQLite index name and drop it\n // Index name comes from stored metadata so it's already validated\n const sqliteIndexName = `idx_${indexToRemove.unique ? 'unique_' : ''}${indexName}`\n try {\n this.storage.exec(`DROP INDEX IF EXISTS ${sqliteIndexName}`)\n } catch (error) {\n // Ignore errors if index doesn't exist in SQLite\n }\n }\n\n // Clear TTL metadata cache if this was a TTL index\n if (indexToRemove.expireAfterSeconds !== undefined) {\n const cacheKey = `${collectionName}:${indexName}`\n this.ttlMetadataCache.delete(cacheKey)\n }\n\n // Update metadata\n const updatedIndexes = currentIndexes.filter(idx => idx.name !== indexName)\n this.storage\n .prepare('UPDATE collections SET indexes = ?, updated_at = datetime(\\'now\\') WHERE id = ?')\n .bind(JSON.stringify(updatedIndexes), collection.id)\n .run()\n\n return {\n ok: 1,\n nIndexesWas,\n }\n }\n\n /**\n * Drop all indexes on a collection (except _id)\n */\n dropIndexes(collectionName: string): DropIndexResult {\n // Validate collection name to prevent SQL injection\n validateIdentifier(collectionName)\n\n const collection = this.getCollection(collectionName)\n if (!collection) {\n throw new Error(`Collection not found: ${collectionName}`)\n }\n\n const currentIndexes = collection.indexes\n const nIndexesWas = currentIndexes.length + 1 // +1 for _id\n\n // Drop all SQLite indexes\n // Index names come from stored metadata so they're already validated\n for (const index of currentIndexes) {\n const sqliteIndexName = `idx_${index.unique ? 'unique_' : ''}${index.name}`\n try {\n this.storage.exec(`DROP INDEX IF EXISTS ${sqliteIndexName}`)\n } catch (error) {\n // Ignore errors\n }\n }\n\n // Clear indexes in metadata (keeping _id which is implicit)\n this.storage\n .prepare('UPDATE collections SET indexes = \\'[]\\', updated_at = datetime(\\'now\\') WHERE id = ?')\n .bind(collection.id)\n .run()\n\n return {\n ok: 1,\n nIndexesWas,\n }\n }\n\n /**\n * Get index usage hints for a query\n * Returns suggested index names that could be used for the query\n */\n getIndexHints(collectionName: string, queryFields: string[]): string[] {\n const collection = this.getCollection(collectionName)\n if (!collection) {\n return []\n }\n\n const hints: string[] = []\n\n // Find indexes that could help with the query\n for (const index of collection.indexes) {\n const indexFields = Object.keys(index.key)\n\n // Check if this index covers any of the query fields\n const coversQuery = queryFields.some(field => indexFields.includes(field))\n if (coversQuery) {\n hints.push(index.name)\n }\n }\n\n return hints\n }\n\n /**\n * Get all TTL indexes across all collections\n */\n getTTLIndexes(): TTLIndexInfo[] {\n const ttlIndexes: TTLIndexInfo[] = []\n\n // Get all collections\n const collections = this.storage\n .prepare('SELECT id, name, indexes FROM collections')\n .all<{ id: number; name: string; indexes: string }>()\n\n for (const collection of collections) {\n const indexes = JSON.parse(collection.indexes) as IndexInfo[]\n\n for (const index of indexes) {\n if (index.expireAfterSeconds !== undefined) {\n const field = Object.keys(index.key)[0]\n if (field !== undefined) {\n ttlIndexes.push({\n collectionName: collection.name,\n collectionId: collection.id,\n indexName: index.name,\n field,\n expireAfterSeconds: index.expireAfterSeconds,\n })\n }\n }\n }\n }\n\n return ttlIndexes\n }\n\n /**\n * Check if a specific index is a TTL index\n */\n isTTLIndex(collectionName: string, indexName: string): boolean {\n const collection = this.getCollection(collectionName)\n if (!collection) {\n return false\n }\n\n const index = collection.indexes.find(idx => idx.name === indexName)\n return index?.expireAfterSeconds !== undefined\n }\n\n /**\n * Check if a value is a valid date for TTL purposes\n * Accepts Date objects, ISO strings, and Unix timestamps (in ms)\n */\n isValidTTLFieldValue(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false\n }\n\n if (value instanceof Date) {\n return !isNaN(value.getTime())\n }\n\n if (typeof value === 'string') {\n const date = new Date(value)\n return !isNaN(date.getTime())\n }\n\n if (typeof value === 'number') {\n // Unix timestamp in milliseconds (reasonable range: after 1970 and before year 3000)\n const date = new Date(value)\n return !isNaN(date.getTime()) && value > 0 && value < 32503680000000\n }\n\n return false\n }\n\n /**\n * Calculate expiration time for a document\n */\n calculateExpirationTime(dateValue: Date | string | number, expireAfterSeconds: number): Date {\n let date: Date\n\n if (dateValue instanceof Date) {\n date = dateValue\n } else if (typeof dateValue === 'string') {\n date = new Date(dateValue)\n } else {\n date = new Date(dateValue)\n }\n\n return new Date(date.getTime() + expireAfterSeconds * 1000)\n }\n\n /**\n * Check if a document is expired based on its TTL field\n */\n isDocumentExpired(\n document: Record<string, unknown>,\n field: string,\n expireAfterSeconds: number\n ): boolean {\n const fieldValue = document[field]\n\n if (!this.isValidTTLFieldValue(fieldValue)) {\n return false\n }\n\n const expiresAt = this.calculateExpirationTime(\n fieldValue as Date | string | number,\n expireAfterSeconds\n )\n\n return expiresAt.getTime() < Date.now()\n }\n\n /**\n * Build SQL query to delete expired documents for a collection\n */\n buildExpiredDocumentsQuery(\n collectionName: string,\n field: string,\n expireAfterSeconds: number\n ): ExpiredDocumentsQuery {\n // Validate field name to prevent SQL injection\n const safeField = escapeFieldPath(field)\n const jsonPath = safeField.startsWith('$') ? safeField : `$.${safeField}`\n const cutoffTime = new Date(Date.now() - expireAfterSeconds * 1000).toISOString()\n\n // Get collection id if it exists, otherwise use a subquery\n const collection = this.getCollection(collectionName)\n const collectionIdParam = collection?.id\n\n // Build DELETE query that:\n // 1. Targets documents in the specific collection\n // 2. Extracts the date field using json_extract\n // 3. Compares with the cutoff time using datetime functions\n let sql: string\n let params: unknown[]\n\n if (collectionIdParam !== undefined) {\n sql = `DELETE FROM documents\n WHERE collection_id = ?\n AND json_extract(data, '${jsonPath}') IS NOT NULL\n AND datetime(json_extract(data, '${jsonPath}')) < datetime(?)`\n params = [collectionIdParam, cutoffTime]\n } else {\n // Collection doesn't exist yet - use a subquery to get the id\n sql = `DELETE FROM documents\n WHERE collection_id = (SELECT id FROM collections WHERE name = ?)\n AND json_extract(data, '${jsonPath}') IS NOT NULL\n AND datetime(json_extract(data, '${jsonPath}')) < datetime(?)`\n params = [collectionName, cutoffTime]\n }\n\n return {\n sql,\n params,\n }\n }\n\n /**\n * Get TTL metadata for a specific index\n */\n getTTLMetadata(collectionName: string, indexName: string): TTLMetadata | null {\n const cacheKey = `${collectionName}:${indexName}`\n\n // Check cache first\n if (this.ttlMetadataCache.has(cacheKey)) {\n return this.ttlMetadataCache.get(cacheKey)!\n }\n\n // Load from index metadata\n const collection = this.getCollection(collectionName)\n if (!collection) {\n return null\n }\n\n const index = collection.indexes.find(idx => idx.name === indexName)\n if (!index || index.expireAfterSeconds === undefined) {\n return null\n }\n\n const field = Object.keys(index.key)[0]\n if (field === undefined) {\n return null\n }\n const metadata: TTLMetadata = {\n field,\n expireAfterSeconds: index.expireAfterSeconds,\n }\n\n this.ttlMetadataCache.set(cacheKey, metadata)\n return metadata\n }\n\n /**\n * Record a TTL cleanup operation for tracking purposes\n */\n recordTTLCleanup(collectionName: string, indexName: string, deletedCount: number): void {\n const cacheKey = `${collectionName}:${indexName}`\n const metadata = this.ttlMetadataCache.get(cacheKey)\n\n if (metadata) {\n metadata.lastCleanupAt = new Date().toISOString()\n metadata.lastCleanupCount = deletedCount\n }\n }\n\n /**\n * Get the next cleanup time based on the configured interval\n */\n getNextCleanupTime(): number {\n return Date.now() + this.cleanupIntervalMs\n }\n\n /**\n * Set the cleanup interval in milliseconds\n */\n setCleanupInterval(intervalMs: number): void {\n this.cleanupIntervalMs = intervalMs\n }\n\n /**\n * Run TTL cleanup across all collections with TTL indexes\n * Deletes all expired documents and returns cleanup statistics\n */\n async runTTLCleanup(): Promise<TTLCleanupResult> {\n const ttlIndexes = this.getTTLIndexes()\n let totalDeleted = 0\n const errors: string[] = []\n\n for (const ttlIndex of ttlIndexes) {\n try {\n const query = this.buildExpiredDocumentsQuery(\n ttlIndex.collectionName,\n ttlIndex.field,\n ttlIndex.expireAfterSeconds\n )\n\n if (query.sql) {\n // Execute the delete query\n const stmt = this.storage.prepare(query.sql)\n stmt.bind(...query.params).run()\n\n // Record the cleanup (we don't have a direct way to get affected rows in this interface)\n this.recordTTLCleanup(ttlIndex.collectionName, ttlIndex.indexName, 0)\n }\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error)\n errors.push(`Error cleaning ${ttlIndex.collectionName}: ${errMsg}`)\n }\n }\n\n const result: TTLCleanupResult = {\n ok: 1,\n collectionsProcessed: ttlIndexes.length,\n documentsDeleted: totalDeleted,\n }\n\n if (errors.length > 0) {\n result.errors = errors\n }\n\n return result\n }\n}\n\nexport default IndexManager\n","/**\n * FindCursor - MongoDB-compatible cursor for query results\n *\n * Provides chainable methods for sorting, limiting, skipping, and projecting\n * query results. Supports async iteration and array conversion.\n */\n\nimport type { MongoCollection } from './mongo-collection'\n\n// Base document type\nexport type Document = Record<string, unknown>\n\nexport interface FindOptions {\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n skip?: number\n}\n\n/**\n * FindCursor provides lazy evaluation of MongoDB queries\n */\nexport class FindCursor<TSchema extends Document = Document> {\n private readonly collection: MongoCollection<any>\n private readonly filter: object\n private _projection?: Record<string, 0 | 1>\n private _sort?: Record<string, 1 | -1>\n private _limit?: number\n private _skip?: number\n private _executed: boolean = false\n private _results: TSchema[] = []\n\n constructor(\n collection: MongoCollection<any>,\n filter: object,\n options?: FindOptions\n ) {\n this.collection = collection\n this.filter = filter\n if (options) {\n if (options.projection !== undefined) this._projection = options.projection\n if (options.sort !== undefined) this._sort = options.sort\n if (options.limit !== undefined) this._limit = options.limit\n if (options.skip !== undefined) this._skip = options.skip\n }\n }\n\n /**\n * Set the sort order\n */\n sort(spec: Record<string, 1 | -1>): this {\n this._sort = spec\n return this\n }\n\n /**\n * Set the maximum number of documents to return\n */\n limit(count: number): this {\n this._limit = count\n return this\n }\n\n /**\n * Set the number of documents to skip\n */\n skip(count: number): this {\n this._skip = count\n return this\n }\n\n /**\n * Set the projection for returned documents\n */\n project(spec: Record<string, 0 | 1>): this {\n this._projection = spec\n return this\n }\n\n /**\n * Execute the query and return all documents as an array\n */\n async toArray(): Promise<TSchema[]> {\n if (!this._executed) {\n const options: { sort?: Record<string, 1 | -1>; skip?: number; limit?: number } = {}\n if (this._sort !== undefined) options.sort = this._sort\n if (this._skip !== undefined) options.skip = this._skip\n if (this._limit !== undefined) options.limit = this._limit\n this._results = this.collection._findDocuments(this.filter, options)\n\n // Apply projection\n if (this._projection) {\n this._results = this._results.map(doc =>\n this.collection._applyProjection(doc, this._projection!)\n )\n }\n\n this._executed = true\n }\n return [...this._results]\n }\n\n /**\n * Execute callback for each document\n */\n async forEach(callback: (doc: TSchema) => void): Promise<void> {\n const docs = await this.toArray()\n for (const doc of docs) {\n callback(doc)\n }\n }\n\n /**\n * Count documents matching the query\n */\n async count(): Promise<number> {\n const docs = await this.toArray()\n return docs.length\n }\n\n /**\n * Check if there are any documents\n */\n async hasNext(): Promise<boolean> {\n const docs = await this.toArray()\n return docs.length > 0\n }\n\n /**\n * Get the next document (simple implementation)\n */\n async next(): Promise<TSchema | null> {\n const docs = await this.toArray()\n return docs.length > 0 ? docs[0] ?? null : null\n }\n\n /**\n * Map over documents\n */\n map<U>(fn: (doc: TSchema) => U): MappedCursor<TSchema, U> {\n return new MappedCursor(this, fn)\n }\n\n /**\n * Async iterator support\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<TSchema> {\n const docs = await this.toArray()\n for (const doc of docs) {\n yield doc\n }\n }\n}\n\n/**\n * Cursor with map transformation applied\n */\nclass MappedCursor<TSchema extends Document, U> {\n private readonly cursor: FindCursor<TSchema>\n private readonly mapFn: (doc: TSchema) => U\n\n constructor(cursor: FindCursor<TSchema>, mapFn: (doc: TSchema) => U) {\n this.cursor = cursor\n this.mapFn = mapFn\n }\n\n async toArray(): Promise<U[]> {\n const docs = await this.cursor.toArray()\n return docs.map(this.mapFn)\n }\n\n async forEach(callback: (doc: U) => void): Promise<void> {\n const docs = await this.toArray()\n for (const doc of docs) {\n callback(doc)\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<U> {\n const docs = await this.toArray()\n for (const doc of docs) {\n yield doc\n }\n }\n}\n\nexport default FindCursor\n","/**\n * Bulk Write Operations - MongoDB-compatible bulk write support\n *\n * Provides types and utilities for bulk write operations that can\n * batch multiple insert, update, and delete operations into a single\n * request for improved performance.\n */\n\nimport type { ObjectId } from '../types/objectid'\n\n/**\n * Base document type\n */\nexport type Document = Record<string, unknown>\n\n/**\n * Insert one operation in a bulk write\n */\nexport interface InsertOneModel<TDocument extends Document = Document> {\n insertOne: {\n document: TDocument\n }\n}\n\n/**\n * Update one operation in a bulk write\n */\nexport interface UpdateOneModel<TDocument extends Document = Document> {\n updateOne: {\n filter: Partial<TDocument> | object\n update: object\n upsert?: boolean\n arrayFilters?: object[]\n hint?: string | object\n collation?: object\n }\n}\n\n/**\n * Update many operation in a bulk write\n */\nexport interface UpdateManyModel<TDocument extends Document = Document> {\n updateMany: {\n filter: Partial<TDocument> | object\n update: object\n upsert?: boolean\n arrayFilters?: object[]\n hint?: string | object\n collation?: object\n }\n}\n\n/**\n * Replace one operation in a bulk write\n */\nexport interface ReplaceOneModel<TDocument extends Document = Document> {\n replaceOne: {\n filter: object\n replacement: TDocument\n upsert?: boolean\n hint?: string | object\n collation?: object\n }\n}\n\n/**\n * Delete one operation in a bulk write\n */\nexport interface DeleteOneModel {\n deleteOne: {\n filter: object\n hint?: string | object\n collation?: object\n }\n}\n\n/**\n * Delete many operation in a bulk write\n */\nexport interface DeleteManyModel {\n deleteMany: {\n filter: object\n hint?: string | object\n collation?: object\n }\n}\n\n/**\n * Union type of all bulk write operation models\n */\nexport type BulkWriteOperation<TDocument extends Document = Document> =\n | InsertOneModel<TDocument>\n | UpdateOneModel<TDocument>\n | UpdateManyModel<TDocument>\n | ReplaceOneModel<TDocument>\n | DeleteOneModel\n | DeleteManyModel\n\n/**\n * Options for bulk write operations\n */\nexport interface BulkWriteOptions {\n /**\n * If true (default), operations are executed in order.\n * If an error occurs, remaining operations are not executed.\n * If false, operations may be executed in any order, and all\n * operations are attempted regardless of errors.\n */\n ordered?: boolean\n\n /**\n * If true, bypass document validation during write operations\n */\n bypassDocumentValidation?: boolean\n\n /**\n * Comment to attach to the operation\n */\n comment?: string | object\n\n /**\n * Map of parameter names and values for use with $$var syntax\n */\n let?: Document\n}\n\n/**\n * Error information for a failed write operation\n */\nexport interface BulkWriteError {\n /**\n * Index of the operation in the operations array that caused the error\n */\n index: number\n\n /**\n * Error code\n */\n code: number\n\n /**\n * Human-readable error message\n */\n errmsg: string\n\n /**\n * The operation that caused the error\n */\n op?: BulkWriteOperation | undefined\n}\n\n/**\n * Upserted document information\n */\nexport interface BulkWriteUpsertedId {\n /**\n * Index of the upsert operation in the operations array\n */\n index: number\n\n /**\n * The _id of the upserted document\n */\n _id: ObjectId | string\n}\n\n/**\n * Result of a bulk write operation\n */\nexport interface BulkWriteResult {\n /**\n * Whether the write was acknowledged by the server\n */\n acknowledged: boolean\n\n /**\n * Number of documents inserted\n */\n insertedCount: number\n\n /**\n * Number of documents matched for update/replace operations\n */\n matchedCount: number\n\n /**\n * Number of documents modified by update/replace operations\n */\n modifiedCount: number\n\n /**\n * Number of documents deleted\n */\n deletedCount: number\n\n /**\n * Number of documents upserted\n */\n upsertedCount: number\n\n /**\n * Map of operation index to inserted document _id\n */\n insertedIds: Record<number, ObjectId | string>\n\n /**\n * Array of upserted document information\n */\n upsertedIds: Record<number, ObjectId | string>\n}\n\n/**\n * Error thrown when bulk write operations fail\n */\nexport class BulkWriteException extends Error {\n /**\n * Partial result of operations that succeeded before the error\n */\n result: BulkWriteResult\n\n /**\n * Array of write errors\n */\n writeErrors: BulkWriteError[]\n\n constructor(message: string, result: BulkWriteResult, writeErrors: BulkWriteError[]) {\n super(message)\n this.name = 'BulkWriteException'\n this.result = result\n this.writeErrors = writeErrors\n }\n}\n\n/**\n * Type guard to check if an operation is an insertOne\n */\nexport function isInsertOneModel<T extends Document>(\n op: BulkWriteOperation<T>\n): op is InsertOneModel<T> {\n return 'insertOne' in op\n}\n\n/**\n * Type guard to check if an operation is an updateOne\n */\nexport function isUpdateOneModel<T extends Document>(\n op: BulkWriteOperation<T>\n): op is UpdateOneModel<T> {\n return 'updateOne' in op\n}\n\n/**\n * Type guard to check if an operation is an updateMany\n */\nexport function isUpdateManyModel<T extends Document>(\n op: BulkWriteOperation<T>\n): op is UpdateManyModel<T> {\n return 'updateMany' in op\n}\n\n/**\n * Type guard to check if an operation is a replaceOne\n */\nexport function isReplaceOneModel<T extends Document>(\n op: BulkWriteOperation<T>\n): op is ReplaceOneModel<T> {\n return 'replaceOne' in op\n}\n\n/**\n * Type guard to check if an operation is a deleteOne\n */\nexport function isDeleteOneModel(op: BulkWriteOperation): op is DeleteOneModel {\n return 'deleteOne' in op\n}\n\n/**\n * Type guard to check if an operation is a deleteMany\n */\nexport function isDeleteManyModel(op: BulkWriteOperation): op is DeleteManyModel {\n return 'deleteMany' in op\n}\n","/**\n * ChangeStream - MongoDB-compatible change stream implementation\n *\n * Provides real-time notifications for data changes in a collection.\n * Supports filtering with $match pipeline stages and resume tokens for\n * reliable resumption after disconnections.\n *\n * @see https://www.mongodb.com/docs/manual/changeStreams/\n */\n\nimport { ObjectId } from '../types/objectid'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Change event operation types\n */\nexport type OperationType = 'insert' | 'update' | 'replace' | 'delete' | 'drop' | 'invalidate'\n\n/**\n * Namespace identifying the collection\n */\nexport interface ChangeStreamNamespace {\n db: string\n coll: string\n}\n\n/**\n * Document key identifying the changed document\n */\nexport interface DocumentKey {\n _id: ObjectId\n}\n\n/**\n * Description of fields updated/removed in an update operation\n */\nexport interface UpdateDescription {\n updatedFields: Record<string, unknown>\n removedFields: string[]\n truncatedArrays?: Array<{ field: string; newSize: number }>\n}\n\n/**\n * Resume token for resuming a change stream\n */\nexport interface ResumeToken {\n _data: string\n}\n\n/**\n * A change event emitted by the change stream\n */\nexport interface ChangeEvent<TDocument = Record<string, unknown>> {\n /** Resume token for this event */\n _id: ResumeToken\n /** Type of operation that triggered this event */\n operationType: OperationType\n /** Timestamp when the change occurred */\n clusterTime: Date\n /** Database and collection namespace */\n ns: ChangeStreamNamespace\n /** The _id of the affected document */\n documentKey: DocumentKey\n /** Full document (for insert, replace, or update with fullDocument option) */\n fullDocument?: TDocument\n /** Description of updated/removed fields (for update operations) */\n updateDescription?: UpdateDescription\n}\n\n/**\n * Options for creating a change stream\n */\nexport interface ChangeStreamOptions {\n /** How to handle fullDocument for update operations */\n fullDocument?: 'default' | 'updateLookup' | 'whenAvailable' | 'required'\n /** Resume after this token (exclusive) */\n resumeAfter?: ResumeToken\n /** Start after this token (exclusive) - similar to resumeAfter */\n startAfter?: ResumeToken\n /** Start at a specific operation time */\n startAtOperationTime?: Date\n /** Maximum time to wait for new events in ms */\n maxAwaitTimeMS?: number\n /** Batch size for fetching events */\n batchSize?: number\n}\n\n/**\n * Aggregation pipeline stage for filtering change events\n */\nexport interface MatchStage {\n $match: Record<string, unknown>\n}\n\nexport type ChangeStreamPipeline = MatchStage[]\n\n// ============================================================================\n// ResumeToken Utility\n// ============================================================================\n\n/**\n * Parsed resume token data\n */\nexport interface ParsedResumeToken {\n database: string\n collection: string\n sequence: number\n timestamp: number\n}\n\n/**\n * Utility class for generating and parsing resume tokens\n */\nexport const ResumeToken = {\n /**\n * Generate a new resume token\n */\n generate(database: string, collection: string, sequence: number): ResumeToken {\n const timestamp = Date.now()\n const data = {\n db: database,\n coll: collection,\n seq: sequence,\n ts: timestamp,\n }\n // Encode as base64 for compact representation\n const encoded = btoa(JSON.stringify(data))\n // Pad with timestamp prefix for ordering\n const paddedTs = timestamp.toString(36).padStart(12, '0')\n const paddedSeq = sequence.toString(36).padStart(8, '0')\n return { _data: `${paddedTs}${paddedSeq}${encoded}` }\n },\n\n /**\n * Parse a resume token back to its components\n */\n parse(token: ResumeToken): ParsedResumeToken {\n try {\n // Extract the base64 portion (after timestamp and sequence prefixes)\n const encoded = token._data.slice(20) // 12 for ts + 8 for seq\n const decoded = atob(encoded)\n const data = JSON.parse(decoded)\n\n return {\n database: data.db,\n collection: data.coll,\n sequence: data.seq,\n timestamp: data.ts,\n }\n } catch (error) {\n throw new Error(`Invalid resume token: ${token._data}`)\n }\n },\n\n /**\n * Compare two tokens for ordering\n */\n compare(a: ResumeToken, b: ResumeToken): number {\n return a._data.localeCompare(b._data)\n },\n}\n\n// ============================================================================\n// ChangeStream Class\n// ============================================================================\n\n/**\n * MongoDB-compatible change stream cursor\n *\n * Allows watching for changes on a collection in real-time.\n * Supports filtering, resume tokens, and async iteration.\n *\n * @example\n * ```typescript\n * const changeStream = collection.watch([\n * { $match: { operationType: 'insert' } }\n * ])\n *\n * for await (const event of changeStream) {\n * console.log('Change:', event.operationType, event.fullDocument)\n * }\n * ```\n */\nexport class ChangeStream<TDocument = Record<string, unknown>> {\n private readonly database: string\n private readonly collection: string\n private readonly pipeline: ChangeStreamPipeline\n private readonly options: ChangeStreamOptions\n private readonly getDocumentById: (id: ObjectId) => Promise<TDocument | null>\n private readonly getChangeEvents: (afterSequence: number) => Promise<StoredChangeEvent[]>\n private readonly onClose?: (() => void) | undefined\n\n private _closed: boolean = false\n private _resumeToken: ResumeToken | null = null\n private _currentSequence: number = 0\n private _pendingEvents: ChangeEvent<TDocument>[] = []\n\n constructor(\n database: string,\n collection: string,\n pipeline: ChangeStreamPipeline,\n options: ChangeStreamOptions,\n callbacks: {\n getDocumentById: (id: ObjectId) => Promise<TDocument | null>\n getChangeEvents: (afterSequence: number) => Promise<StoredChangeEvent[]>\n getCurrentSequence: () => number\n onClose?: () => void\n }\n ) {\n this.database = database\n this.collection = collection\n this.pipeline = pipeline || []\n this.options = options || {}\n this.getDocumentById = callbacks.getDocumentById\n this.getChangeEvents = callbacks.getChangeEvents\n // Start from the current sequence by default (real-time watching)\n // This follows MongoDB's behavior where change streams only see future events\n this._currentSequence = callbacks.getCurrentSequence()\n this.onClose = callbacks.onClose\n\n // Handle resume/start tokens - resume after the specified sequence\n // This allows resuming from a previous point in the event stream\n if (options.resumeAfter || options.startAfter) {\n const token = options.resumeAfter || options.startAfter\n try {\n const parsed = ResumeToken.parse(token!)\n this._currentSequence = parsed.sequence\n } catch {\n // Invalid token, start from current position\n }\n }\n }\n\n /**\n * Whether the change stream is closed\n */\n get closed(): boolean {\n return this._closed\n }\n\n /**\n * Get the current resume token (for the last received event)\n */\n getResumeToken(): ResumeToken | null {\n return this._resumeToken\n }\n\n /**\n * Get the next change event (blocking)\n * Returns null if the stream is closed\n */\n async next(): Promise<ChangeEvent<TDocument> | null> {\n if (this._closed) {\n return null\n }\n\n // Check for pending events first\n if (this._pendingEvents.length > 0) {\n const event = this._pendingEvents.shift()!\n this._resumeToken = event._id\n return event\n }\n\n // Poll for new events\n const maxWait = this.options.maxAwaitTimeMS || 30000\n const pollInterval = 50\n const startTime = Date.now()\n\n while (!this._closed && Date.now() - startTime < maxWait) {\n const events = await this.fetchNewEvents()\n\n if (events.length > 0) {\n // Store remaining events for subsequent calls\n this._pendingEvents = events.slice(1)\n const event = events[0]\n if (event) {\n this._resumeToken = event._id\n return event\n }\n }\n\n // Wait before next poll\n await new Promise(resolve => setTimeout(resolve, pollInterval))\n }\n\n return null\n }\n\n /**\n * Try to get the next event without blocking\n * Returns null immediately if no events are available\n */\n async tryNext(): Promise<ChangeEvent<TDocument> | null> {\n if (this._closed) {\n return null\n }\n\n // Check pending events\n if (this._pendingEvents.length > 0) {\n const event = this._pendingEvents.shift()!\n this._resumeToken = event._id\n return event\n }\n\n // Fetch new events without waiting\n const events = await this.fetchNewEvents()\n\n if (events.length > 0) {\n this._pendingEvents = events.slice(1)\n const event = events[0]\n if (event) {\n this._resumeToken = event._id\n return event\n }\n }\n\n return null\n }\n\n /**\n * Check if there are more events available\n */\n async hasNext(): Promise<boolean> {\n if (this._closed) {\n return false\n }\n\n if (this._pendingEvents.length > 0) {\n return true\n }\n\n const events = await this.fetchNewEvents()\n if (events.length > 0) {\n this._pendingEvents = events\n return true\n }\n\n return false\n }\n\n /**\n * Close the change stream\n */\n async close(): Promise<void> {\n if (!this._closed) {\n this._closed = true\n this._pendingEvents = []\n if (this.onClose) {\n this.onClose()\n }\n }\n }\n\n /**\n * Get a stream interface for the change stream\n */\n stream(): AsyncIterable<ChangeEvent<TDocument>> {\n return this\n }\n\n /**\n * Async iterator implementation\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<ChangeEvent<TDocument>> {\n while (!this._closed) {\n const event = await this.tryNext()\n if (event) {\n yield event\n } else if (!this._closed) {\n // Small delay to prevent busy-waiting\n await new Promise(resolve => setTimeout(resolve, 10))\n }\n }\n }\n\n /**\n * Fetch new events from the change event store\n */\n private async fetchNewEvents(): Promise<ChangeEvent<TDocument>[]> {\n const stored = await this.getChangeEvents(this._currentSequence)\n\n const events: ChangeEvent<TDocument>[] = []\n\n for (const storedEvent of stored) {\n const event = await this.transformStoredEvent(storedEvent)\n\n // Apply pipeline filters\n if (this.matchesPipeline(event)) {\n events.push(event)\n }\n\n // Update current sequence\n this._currentSequence = storedEvent.sequence\n }\n\n return events\n }\n\n /**\n * Transform a stored event into a ChangeEvent\n */\n private async transformStoredEvent(stored: StoredChangeEvent): Promise<ChangeEvent<TDocument>> {\n const documentKey: DocumentKey = {\n _id: typeof stored.documentId === 'string'\n ? new ObjectId(stored.documentId)\n : stored.documentId,\n }\n\n const event: ChangeEvent<TDocument> = {\n _id: ResumeToken.generate(this.database, this.collection, stored.sequence),\n operationType: stored.operationType,\n clusterTime: new Date(stored.timestamp),\n ns: {\n db: this.database,\n coll: this.collection,\n },\n documentKey,\n }\n\n // Handle fullDocument based on operation type and options\n if (stored.operationType === 'insert' || stored.operationType === 'replace') {\n event.fullDocument = stored.fullDocument as TDocument\n } else if (stored.operationType === 'update') {\n // Include updateDescription for updates\n event.updateDescription = {\n updatedFields: stored.updatedFields || {},\n removedFields: stored.removedFields || [],\n }\n\n // Include fullDocument if updateLookup option is set\n if (this.options.fullDocument === 'updateLookup') {\n const doc = await this.getDocumentById(documentKey._id)\n if (doc) {\n event.fullDocument = doc\n }\n }\n }\n // delete operations don't include fullDocument\n\n return event\n }\n\n /**\n * Check if an event matches the pipeline filters\n */\n private matchesPipeline(event: ChangeEvent<TDocument>): boolean {\n for (const stage of this.pipeline) {\n if ('$match' in stage) {\n if (!this.matchesCondition(event, stage.$match)) {\n return false\n }\n }\n }\n return true\n }\n\n /**\n * Check if an event matches a $match condition\n */\n private matchesCondition(event: ChangeEvent<TDocument>, condition: Record<string, unknown>): boolean {\n for (const [key, value] of Object.entries(condition)) {\n // Handle logical operators\n if (key === '$or') {\n const conditions = value as Record<string, unknown>[]\n if (!conditions.some(c => this.matchesCondition(event, c))) {\n return false\n }\n continue\n }\n\n if (key === '$and') {\n const conditions = value as Record<string, unknown>[]\n if (!conditions.every(c => this.matchesCondition(event, c))) {\n return false\n }\n continue\n }\n\n // Get the value from the event\n const eventValue = this.getNestedValue(event as unknown as Record<string, unknown>, key)\n\n // Handle comparison operators\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const operators = value as Record<string, unknown>\n for (const [op, opValue] of Object.entries(operators)) {\n if (!this.matchesOperator(eventValue, op, opValue)) {\n return false\n }\n }\n continue\n }\n\n // Direct comparison\n if (eventValue !== value) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Match a comparison operator\n */\n private matchesOperator(value: unknown, operator: string, operand: unknown): boolean {\n switch (operator) {\n case '$eq':\n return value === operand\n case '$ne':\n return value !== operand\n case '$gt':\n return typeof value === 'number' && value > (operand as number)\n case '$gte':\n return typeof value === 'number' && value >= (operand as number)\n case '$lt':\n return typeof value === 'number' && value < (operand as number)\n case '$lte':\n return typeof value === 'number' && value <= (operand as number)\n case '$in':\n return Array.isArray(operand) && operand.includes(value)\n case '$nin':\n return Array.isArray(operand) && !operand.includes(value)\n default:\n return true\n }\n }\n\n /**\n * Get a nested value from an object using dot notation\n */\n private getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.')\n let current: unknown = obj\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined\n }\n current = (current as Record<string, unknown>)[part]\n }\n\n return current\n }\n}\n\n// ============================================================================\n// Stored Change Event Interface\n// ============================================================================\n\n/**\n * Internal structure for stored change events\n */\nexport interface StoredChangeEvent {\n sequence: number\n operationType: OperationType\n documentId: string | ObjectId\n timestamp: number\n fullDocument?: Record<string, unknown>\n updatedFields?: Record<string, unknown>\n removedFields?: string[]\n}\n\n// ============================================================================\n// ChangeEventStore Class\n// ============================================================================\n\n/**\n * In-memory store for change events (for testing)\n * In production, this would be backed by SQLite\n */\nexport class ChangeEventStore {\n private events: StoredChangeEvent[] = []\n private sequence: number = 0\n\n /**\n * Record a new change event\n */\n addEvent(event: Omit<StoredChangeEvent, 'sequence' | 'timestamp'>): void {\n this.sequence++\n this.events.push({\n ...event,\n sequence: this.sequence,\n timestamp: Date.now(),\n })\n }\n\n /**\n * Get events after a given sequence number\n */\n getEventsAfter(sequence: number): StoredChangeEvent[] {\n return this.events.filter(e => e.sequence > sequence)\n }\n\n /**\n * Get the current sequence number\n */\n getCurrentSequence(): number {\n return this.sequence\n }\n\n /**\n * Clear all events\n */\n clear(): void {\n this.events = []\n this.sequence = 0\n }\n}\n\nexport default ChangeStream\n","/**\n * AggregationCursor - Async cursor for MongoDB aggregation pipeline results\n *\n * Provides:\n * - Async iteration with for-await-of\n * - toArray() for collecting all results\n * - Support for async pipeline stages ($function, $lookup with pipeline)\n * - Proper error propagation from async stages\n */\n\nimport { EventEmitter } from 'events'\nimport type { Document } from './mongo-collection'\nimport type { PipelineStage } from '../translator/stages/types'\n\n/**\n * Options for aggregation cursor\n */\nexport interface AggregationCursorOptions {\n /** Batch size for streaming results */\n batchSize?: number\n /** Allow disk use for large result sets */\n allowDiskUse?: boolean\n /** Maximum time for operation (ms) */\n maxTimeMS?: number\n /** Comment for the operation */\n comment?: string\n}\n\n/**\n * Async function stage definition ($function)\n */\nexport interface FunctionStage {\n body: string | ((...args: unknown[]) => unknown | Promise<unknown>)\n args: unknown[]\n lang: 'js'\n}\n\n/**\n * Result from async stage execution\n */\nexport interface AsyncStageResult<T = Document> {\n documents: T[]\n hasMore: boolean\n error?: Error\n}\n\n/**\n * Executor function type for running pipeline against data\n */\nexport type PipelineExecutor<T> = (\n documents: T[],\n stage: PipelineStage,\n context: AsyncExecutionContext\n) => Promise<T[]>\n\n/**\n * Context for async pipeline execution\n */\nexport interface AsyncExecutionContext {\n /** Collection name being aggregated */\n collectionName: string\n /** Lookup function for $lookup stages */\n lookupCollection?: (name: string) => Promise<Document[]>\n /** Custom function executor for $function stages */\n functionExecutor?: (fn: FunctionStage, doc: Document) => Promise<unknown>\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal\n}\n\n/**\n * AggregationCursor provides async iteration over aggregation pipeline results\n */\nexport class AggregationCursor<TSchema extends Document = Document> extends EventEmitter {\n private readonly _pipeline: PipelineStage[]\n private readonly _options: AggregationCursorOptions\n private readonly _fetchFn: () => Promise<TSchema[]>\n private readonly _asyncExecutor: PipelineExecutor<TSchema> | undefined\n private readonly _context: AsyncExecutionContext\n\n private _buffer: TSchema[] = []\n private _position: number = 0\n private _fetched: boolean = false\n private _closed: boolean = false\n private _error: Error | null = null\n\n /**\n * Create a new AggregationCursor\n *\n * @param pipeline - The aggregation pipeline stages\n * @param fetchFn - Function to fetch and execute the pipeline\n * @param options - Cursor options\n * @param asyncExecutor - Optional executor for async stages\n * @param context - Execution context\n */\n constructor(\n pipeline: PipelineStage[],\n fetchFn: () => Promise<TSchema[]>,\n options: AggregationCursorOptions = {},\n asyncExecutor?: PipelineExecutor<TSchema>,\n context: AsyncExecutionContext = { collectionName: '' }\n ) {\n super()\n this._pipeline = pipeline\n this._fetchFn = fetchFn\n this._options = options\n this._asyncExecutor = asyncExecutor\n this._context = context\n }\n\n /**\n * Whether the cursor is closed\n */\n get closed(): boolean {\n return this._closed\n }\n\n /**\n * Get the pipeline being executed\n */\n get pipeline(): PipelineStage[] {\n return [...this._pipeline]\n }\n\n /**\n * Number of documents currently buffered\n */\n get bufferedCount(): number {\n return this._closed ? 0 : Math.max(0, this._buffer.length - this._position)\n }\n\n /**\n * Execute the pipeline and fetch results\n */\n private async ensureFetched(): Promise<void> {\n if (this._fetched || this._closed) return\n if (this._error) throw this._error\n\n // Check for abort signal\n if (this._context.abortSignal?.aborted) {\n throw new Error('Aggregation was aborted')\n }\n\n try {\n // Execute the pipeline\n let results = await this._fetchFn()\n\n // Check for async stages that need additional processing\n if (this._asyncExecutor && this.hasAsyncStages()) {\n results = await this.executeAsyncStages(results)\n }\n\n this._buffer = results\n this._fetched = true\n } catch (error) {\n this._error = error instanceof Error ? error : new Error(String(error))\n this._closed = true\n throw this._error\n }\n }\n\n /**\n * Check if pipeline contains async stages\n */\n private hasAsyncStages(): boolean {\n return this._pipeline.some(stage => {\n const stageType = Object.keys(stage)[0]\n return stageType === '$function' ||\n (stageType === '$lookup' && this.isAsyncLookup(stage))\n })\n }\n\n /**\n * Check if $lookup stage requires async execution\n */\n private isAsyncLookup(stage: PipelineStage): boolean {\n if ('$lookup' in stage) {\n const lookup = (stage as { $lookup: { pipeline?: PipelineStage[] } }).$lookup\n return Array.isArray(lookup.pipeline) && lookup.pipeline.length > 0\n }\n return false\n }\n\n /**\n * Execute async stages in the pipeline\n */\n private async executeAsyncStages(documents: TSchema[]): Promise<TSchema[]> {\n let results = documents\n\n for (const stage of this._pipeline) {\n // Check for abort\n if (this._context.abortSignal?.aborted) {\n throw new Error('Aggregation was aborted')\n }\n\n const stageType = Object.keys(stage)[0]\n\n if (stageType === '$function') {\n results = await this.executeFunctionStage(results, stage)\n } else if (stageType === '$lookup' && this.isAsyncLookup(stage)) {\n results = await this.executeAsyncLookup(results, stage)\n } else if (this._asyncExecutor) {\n results = await this._asyncExecutor(results, stage, this._context)\n }\n }\n\n return results\n }\n\n /**\n * Execute $function stage\n */\n private async executeFunctionStage(\n documents: TSchema[],\n stage: PipelineStage\n ): Promise<TSchema[]> {\n const funcDef = (stage as unknown as { $function: FunctionStage }).$function\n\n if (!this._context.functionExecutor) {\n throw new Error('$function stage requires a function executor in context')\n }\n\n const results: TSchema[] = []\n const errors: Error[] = []\n\n // Process documents in parallel with concurrency limit\n const concurrency = 10\n for (let i = 0; i < documents.length; i += concurrency) {\n const batch = documents.slice(i, i + concurrency)\n\n const batchResults = await Promise.allSettled(\n batch.map(async (doc) => {\n try {\n const result = await this._context.functionExecutor!(funcDef, doc)\n return { ...doc, ...result as object } as TSchema\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n return doc\n }\n })\n )\n\n for (const result of batchResults) {\n if (result.status === 'fulfilled') {\n results.push(result.value)\n }\n }\n }\n\n // Propagate first error if any\n const firstError = errors[0]\n if (firstError) {\n throw new AggregationError(\n `$function stage failed: ${firstError.message}`,\n errors\n )\n }\n\n return results\n }\n\n /**\n * Execute $lookup with pipeline (async)\n */\n private async executeAsyncLookup(\n documents: TSchema[],\n stage: PipelineStage\n ): Promise<TSchema[]> {\n if (!this._context.lookupCollection) {\n throw new Error('$lookup requires lookupCollection in context')\n }\n\n const lookup = (stage as { $lookup: {\n from: string\n localField?: string\n foreignField?: string\n let?: Record<string, string>\n pipeline?: PipelineStage[]\n as: string\n }}).$lookup\n\n const lookupDocs = await this._context.lookupCollection(lookup.from)\n\n return documents.map(doc => {\n let matched: Document[]\n\n if (lookup.pipeline && lookup.pipeline.length > 0) {\n // Pipeline lookup - apply pipeline with let variables\n const letVars = lookup.let || {}\n const scopedVars: Record<string, unknown> = {}\n\n for (const [varName, fieldRef] of Object.entries(letVars)) {\n const field = fieldRef.startsWith('$') ? fieldRef.slice(1) : fieldRef\n scopedVars[varName] = this.getNestedValue(doc, field)\n }\n\n // Filter lookup docs based on pipeline (simplified)\n matched = lookupDocs.filter(lookupDoc => {\n // Check $match stages in pipeline\n return lookup.pipeline!.every(pipelineStage => {\n if ('$match' in pipelineStage) {\n return this.matchesExpression(lookupDoc, pipelineStage.$match, scopedVars)\n }\n return true\n })\n })\n } else if (lookup.localField && lookup.foreignField) {\n // Basic lookup\n const localValue = this.getNestedValue(doc, lookup.localField)\n matched = lookupDocs.filter(lookupDoc => {\n const foreignValue = this.getNestedValue(lookupDoc, lookup.foreignField!)\n return this.valuesEqual(localValue, foreignValue)\n })\n } else {\n matched = []\n }\n\n return {\n ...doc,\n [lookup.as]: matched\n } as TSchema\n })\n }\n\n /**\n * Get nested value from document\n */\n private getNestedValue(doc: Document, path: string): unknown {\n const parts = path.split('.')\n let value: unknown = doc\n\n for (const part of parts) {\n if (value === null || value === undefined) return undefined\n value = (value as Record<string, unknown>)[part]\n }\n\n return value\n }\n\n /**\n * Check if two values are equal\n */\n private valuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n if (typeof a !== typeof b) return false\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((val, i) => this.valuesEqual(val, b[i]))\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n if (keysA.length !== keysB.length) return false\n return keysA.every(key =>\n this.valuesEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key]\n )\n )\n }\n\n return false\n }\n\n /**\n * Check if document matches an expression (simplified)\n */\n private matchesExpression(\n doc: Document,\n expr: Record<string, unknown>,\n scopedVars: Record<string, unknown>\n ): boolean {\n for (const [key, value] of Object.entries(expr)) {\n if (key === '$expr') {\n return this.evaluateExpr(doc, value as Record<string, unknown>, scopedVars)\n }\n\n const docValue = this.getNestedValue(doc, key)\n\n if (typeof value === 'object' && value !== null) {\n const ops = value as Record<string, unknown>\n for (const [op, opValue] of Object.entries(ops)) {\n if (!this.evaluateOperator(docValue, op, opValue, scopedVars)) {\n return false\n }\n }\n } else if (!this.valuesEqual(docValue, value)) {\n return false\n }\n }\n return true\n }\n\n /**\n * Evaluate $expr\n */\n private evaluateExpr(\n doc: Document,\n expr: Record<string, unknown>,\n scopedVars: Record<string, unknown>\n ): boolean {\n const keys = Object.keys(expr)\n const operator = keys[0]\n if (!operator) return true\n const operands = expr[operator] as unknown[]\n\n const resolveValue = (val: unknown): unknown => {\n if (typeof val === 'string') {\n if (val.startsWith('$$')) {\n return scopedVars[val.slice(2)]\n }\n if (val.startsWith('$')) {\n return this.getNestedValue(doc, val.slice(1))\n }\n }\n return val\n }\n\n switch (operator) {\n case '$eq':\n return this.valuesEqual(resolveValue(operands[0]), resolveValue(operands[1]))\n case '$ne':\n return !this.valuesEqual(resolveValue(operands[0]), resolveValue(operands[1]))\n case '$gt':\n return (resolveValue(operands[0]) as number) > (resolveValue(operands[1]) as number)\n case '$gte':\n return (resolveValue(operands[0]) as number) >= (resolveValue(operands[1]) as number)\n case '$lt':\n return (resolveValue(operands[0]) as number) < (resolveValue(operands[1]) as number)\n case '$lte':\n return (resolveValue(operands[0]) as number) <= (resolveValue(operands[1]) as number)\n case '$and':\n return (operands as Record<string, unknown>[]).every(e =>\n this.evaluateExpr(doc, e, scopedVars)\n )\n case '$or':\n return (operands as Record<string, unknown>[]).some(e =>\n this.evaluateExpr(doc, e, scopedVars)\n )\n default:\n return true\n }\n }\n\n /**\n * Evaluate a comparison operator\n */\n private evaluateOperator(\n docValue: unknown,\n op: string,\n opValue: unknown,\n scopedVars: Record<string, unknown>\n ): boolean {\n const resolvedOpValue = typeof opValue === 'string' && opValue.startsWith('$$')\n ? scopedVars[opValue.slice(2)]\n : opValue\n\n switch (op) {\n case '$eq':\n return this.valuesEqual(docValue, resolvedOpValue)\n case '$ne':\n return !this.valuesEqual(docValue, resolvedOpValue)\n case '$gt':\n return (docValue as number) > (resolvedOpValue as number)\n case '$gte':\n return (docValue as number) >= (resolvedOpValue as number)\n case '$lt':\n return (docValue as number) < (resolvedOpValue as number)\n case '$lte':\n return (docValue as number) <= (resolvedOpValue as number)\n case '$in':\n return (resolvedOpValue as unknown[]).some(v => this.valuesEqual(docValue, v))\n case '$nin':\n return !(resolvedOpValue as unknown[]).some(v => this.valuesEqual(docValue, v))\n default:\n return true\n }\n }\n\n /**\n * Get the next document\n */\n async next(): Promise<TSchema | null> {\n if (this._closed) return null\n if (this._error) throw this._error\n\n await this.ensureFetched()\n\n if (this._position >= this._buffer.length) {\n return null\n }\n\n const doc = this._buffer[this._position++]\n return doc !== undefined ? doc : null\n }\n\n /**\n * Check if there are more documents\n */\n async hasNext(): Promise<boolean> {\n if (this._closed) return false\n if (this._error) return false\n\n await this.ensureFetched()\n return this._position < this._buffer.length\n }\n\n /**\n * Get all documents as an array\n */\n async toArray(): Promise<TSchema[]> {\n if (this._closed) return []\n if (this._error) throw this._error\n\n await this.ensureFetched()\n\n const remaining = this._buffer.slice(this._position)\n this._position = this._buffer.length\n\n // Close cursor after consuming\n await this.close()\n\n return remaining\n }\n\n /**\n * Execute callback for each document\n */\n async forEach(\n callback: (doc: TSchema, index: number) => void | false | Promise<void | false>\n ): Promise<void> {\n if (this._closed) return\n if (this._error) throw this._error\n\n await this.ensureFetched()\n\n let index = 0\n while (this._position < this._buffer.length) {\n const doc = this._buffer[this._position++]\n if (doc !== undefined) {\n const result = await callback(doc, index++)\n if (result === false) break\n }\n }\n }\n\n /**\n * Transform documents\n */\n map<U>(fn: (doc: TSchema, index: number) => U): MappedAggregationCursor<TSchema, U> {\n return new MappedAggregationCursor(this, fn)\n }\n\n /**\n * Close the cursor\n */\n async close(): Promise<void> {\n if (this._closed) return\n\n this._closed = true\n this._buffer = []\n this._position = 0\n\n this.emit('close')\n }\n\n /**\n * Async iterator support for for-await-of\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<TSchema> {\n try {\n while (await this.hasNext()) {\n const doc = await this.next()\n if (doc !== null) {\n yield doc\n }\n }\n } finally {\n await this.close()\n }\n }\n\n /**\n * Clone the cursor\n */\n clone(): AggregationCursor<TSchema> {\n return new AggregationCursor(\n this._pipeline,\n this._fetchFn,\n this._options,\n this._asyncExecutor,\n this._context\n )\n }\n\n /**\n * Explain the aggregation plan\n */\n explain(): AggregationPlan {\n return {\n pipeline: this._pipeline.map(stage => {\n const keys = Object.keys(stage)\n const stageName = keys[0]\n return {\n stage: stageName ?? '',\n isAsync: this.isAsyncStage(stage)\n }\n }),\n hasAsyncStages: this.hasAsyncStages(),\n options: this._options\n }\n }\n\n /**\n * Check if a stage is async\n */\n private isAsyncStage(stage: PipelineStage): boolean {\n const stageType = Object.keys(stage)[0]\n return stageType === '$function' ||\n (stageType === '$lookup' && this.isAsyncLookup(stage))\n }\n}\n\n/**\n * Mapped cursor for transformed results\n */\nclass MappedAggregationCursor<TSchema extends Document, U> {\n private readonly _cursor: AggregationCursor<TSchema>\n private readonly _mapFn: (doc: TSchema, index: number) => U\n\n constructor(cursor: AggregationCursor<TSchema>, mapFn: (doc: TSchema, index: number) => U) {\n this._cursor = cursor\n this._mapFn = mapFn\n }\n\n async toArray(): Promise<U[]> {\n const docs = await this._cursor.toArray()\n return docs.map(this._mapFn)\n }\n\n async forEach(callback: (doc: U, index: number) => void | false | Promise<void | false>): Promise<void> {\n let index = 0\n await this._cursor.forEach(async (doc) => {\n const mapped = this._mapFn(doc, index)\n return callback(mapped, index++)\n })\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<U> {\n let index = 0\n for await (const doc of this._cursor) {\n yield this._mapFn(doc, index++)\n }\n }\n}\n\n/**\n * Aggregation plan interface\n */\nexport interface AggregationPlan {\n pipeline: Array<{ stage: string; isAsync: boolean }>\n hasAsyncStages: boolean\n options: AggregationCursorOptions\n}\n\n/**\n * Error class for aggregation failures\n */\nexport class AggregationError extends Error {\n public readonly errors: Error[]\n\n constructor(message: string, errors: Error[] = []) {\n super(message)\n this.name = 'AggregationError'\n this.errors = errors\n }\n}\n\nexport default AggregationCursor\n","/**\n * MongoCollection - MongoDB-compatible collection interface\n *\n * Provides CRUD operations and query support for documents.\n * This is the client-side in-memory implementation for testing.\n */\n\nimport { MongoDatabase } from './mongo-database'\nimport { ObjectId } from '../types/objectid'\nimport { FindCursor } from './cursor'\nimport {\n BulkWriteOperation,\n BulkWriteOptions,\n BulkWriteResult,\n BulkWriteError,\n BulkWriteException,\n isInsertOneModel,\n isUpdateOneModel,\n isUpdateManyModel,\n isReplaceOneModel,\n isDeleteOneModel,\n isDeleteManyModel,\n} from './bulk-write'\nimport {\n ChangeStream,\n ChangeStreamPipeline,\n ChangeStreamOptions,\n ChangeEventStore,\n} from './change-stream'\nimport { ClientSession, TransactableCollection } from './session'\nimport {\n AggregationCursor,\n AggregationCursorOptions,\n AsyncExecutionContext,\n FunctionStage,\n} from './aggregation-cursor'\nimport type { PipelineStage } from '../translator/stages/types'\n\n// Base document type\nexport type Document = Record<string, unknown>\n\n// Insert result types\nexport interface InsertOneResult {\n acknowledged: boolean\n insertedId: ObjectId\n}\n\nexport interface InsertManyResult {\n acknowledged: boolean\n insertedCount: number\n insertedIds: Record<number, ObjectId>\n}\n\n// Update result types\nexport interface UpdateResult {\n acknowledged: boolean\n matchedCount: number\n modifiedCount: number\n upsertedId?: ObjectId\n upsertedCount?: number\n}\n\n// Delete result types\nexport interface DeleteResult {\n acknowledged: boolean\n deletedCount: number\n}\n\n// Session option interface (common to all operations)\nexport interface SessionOption {\n session?: ClientSession\n}\n\n// Options types\nexport interface FindOptions extends SessionOption {\n projection?: Record<string, 0 | 1> | undefined\n sort?: Record<string, 1 | -1> | undefined\n limit?: number | undefined\n skip?: number | undefined\n}\n\nexport interface InsertOneOptions extends SessionOption {}\n\nexport interface InsertManyOptions extends SessionOption {}\n\nexport interface UpdateOptions extends SessionOption {\n upsert?: boolean | undefined\n arrayFilters?: object[] | undefined\n}\n\nexport interface ReplaceOptions extends SessionOption {\n upsert?: boolean | undefined\n}\n\nexport interface DeleteOptions extends SessionOption {}\n\nexport interface FindOneAndUpdateOptions extends SessionOption {\n projection?: Record<string, 0 | 1> | undefined\n sort?: Record<string, 1 | -1> | undefined\n upsert?: boolean | undefined\n returnDocument?: 'before' | 'after' | undefined\n}\n\nexport interface FindOneAndDeleteOptions extends SessionOption {\n projection?: Record<string, 0 | 1> | undefined\n sort?: Record<string, 1 | -1> | undefined\n}\n\nexport interface FindOneAndReplaceOptions extends SessionOption {\n projection?: Record<string, 0 | 1> | undefined\n sort?: Record<string, 1 | -1> | undefined\n upsert?: boolean | undefined\n returnDocument?: 'before' | 'after' | undefined\n}\n\n/**\n * MongoCollection provides CRUD operations for documents\n */\nexport class MongoCollection<TSchema extends Document = Document>\n implements TransactableCollection\n{\n private readonly database: MongoDatabase\n private readonly _collectionName: string\n private documents: Map<string, TSchema & { _id: ObjectId }> = new Map()\n private readonly _changeEventStore: ChangeEventStore = new ChangeEventStore()\n private readonly _activeChangeStreams: Set<ChangeStream<TSchema>> = new Set()\n\n constructor(database: MongoDatabase, name: string) {\n this.database = database\n this._collectionName = name\n }\n\n /**\n * Get the collection name\n */\n get collectionName(): string {\n return this._collectionName\n }\n\n /**\n * Ensure collection is created in the database\n * @internal\n */\n async _ensureCreated(): Promise<void> {\n this.database._registerCollection(this._collectionName)\n }\n\n /**\n * Drop collection data\n * @internal\n */\n async _drop(): Promise<void> {\n this.documents.clear()\n }\n\n /**\n * Get a unique key for this collection (used for transaction tracking)\n * @internal\n */\n _getCollectionKey(): string {\n return `${this.database.databaseName}.${this._collectionName}`\n }\n\n /**\n * Create a snapshot of the current collection data\n * @internal\n */\n _createSnapshot(): Map<string, Record<string, unknown>> {\n const snapshot = new Map<string, Record<string, unknown>>()\n for (const [key, doc] of this.documents) {\n // Deep clone the document\n snapshot.set(key, JSON.parse(JSON.stringify(doc)))\n }\n return snapshot\n }\n\n /**\n * Restore collection data from a snapshot (used for transaction rollback)\n * @internal\n */\n _restoreFromSnapshot(snapshot: Map<string, Record<string, unknown>>): void {\n this.documents.clear()\n for (const [key, doc] of snapshot) {\n // Reconstruct ObjectId for _id field\n const restoredDoc = { ...doc } as TSchema & { _id: ObjectId }\n if (doc._id && typeof doc._id === 'object' && '_hexString' in (doc._id as object)) {\n restoredDoc._id = new ObjectId((doc._id as { _hexString: string })._hexString)\n }\n this.documents.set(key, restoredDoc)\n }\n }\n\n /**\n * Track this collection in a session for transaction support\n * @internal\n */\n private _trackInSession(session?: ClientSession): void {\n if (session && session.inTransaction) {\n session._trackCollection(this)\n session._markInProgress()\n }\n }\n\n /**\n * Insert a single document\n */\n async insertOne(doc: TSchema, options?: InsertOneOptions): Promise<InsertOneResult> {\n await this._ensureCreated()\n\n // Track collection in session for transaction rollback support\n this._trackInSession(options?.session)\n\n // Generate _id if not provided\n const docWithId = { ...doc } as TSchema & { _id: ObjectId }\n if (!docWithId._id) {\n docWithId._id = new ObjectId()\n } else if (typeof docWithId._id === 'string') {\n docWithId._id = new ObjectId(docWithId._id)\n }\n\n // Check for duplicate _id\n const idHex = docWithId._id.toHexString()\n if (this.documents.has(idHex)) {\n const error = new Error(\n `E11000 duplicate key error collection: ${this._collectionName} dup key: { _id: \"${idHex}\" }`\n )\n ;(error as any).code = 11000\n throw error\n }\n\n // Store document\n this.documents.set(idHex, docWithId)\n\n // Emit insert change event\n this._changeEventStore.addEvent({\n operationType: 'insert',\n documentId: docWithId._id,\n fullDocument: docWithId as unknown as Record<string, unknown>,\n })\n\n return {\n acknowledged: true,\n insertedId: docWithId._id,\n }\n }\n\n /**\n * Insert multiple documents\n */\n async insertMany(docs: TSchema[], options?: InsertManyOptions): Promise<InsertManyResult> {\n await this._ensureCreated()\n\n // Track collection in session for transaction rollback support\n this._trackInSession(options?.session)\n\n const insertedIds: Record<number, ObjectId> = {}\n\n for (let i = 0; i < docs.length; i++) {\n const doc = docs[i]\n if (doc === undefined) continue\n const result = await this.insertOne(doc, options)\n insertedIds[i] = result.insertedId\n }\n\n return {\n acknowledged: true,\n insertedCount: docs.length,\n insertedIds,\n }\n }\n\n /**\n * Find a single document\n */\n async findOne(\n filter: object = {},\n options?: FindOptions\n ): Promise<(TSchema & { _id: ObjectId }) | null> {\n const docs = this._findDocuments(filter)\n if (docs.length === 0) {\n return null\n }\n\n const doc = docs[0]\n if (doc === undefined) {\n return null\n }\n return options?.projection ? this._applyProjection(doc, options.projection) : doc\n }\n\n /**\n * Find multiple documents, returns a cursor\n */\n find(filter: object = {}, options?: FindOptions): FindCursor<TSchema & { _id: ObjectId }> {\n // Convert to a clean object to avoid exactOptionalPropertyTypes issues\n const cursorOptions = options ? {\n ...(options.projection !== undefined && { projection: options.projection }),\n ...(options.sort !== undefined && { sort: options.sort }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.skip !== undefined && { skip: options.skip }),\n } : undefined\n return new FindCursor<TSchema & { _id: ObjectId }>(this as any, filter, cursorOptions)\n }\n\n /**\n * Internal method to execute find query\n * @internal\n */\n _findDocuments(\n filter: object,\n options?: { sort?: Record<string, 1 | -1>; skip?: number; limit?: number }\n ): (TSchema & { _id: ObjectId })[] {\n let results: (TSchema & { _id: ObjectId })[] = []\n\n // Get all documents and filter\n for (const doc of this.documents.values()) {\n if (this._matchesFilter(doc, filter)) {\n results.push({ ...doc })\n }\n }\n\n // Apply sort\n if (options?.sort) {\n results = this._sortDocuments(results, options.sort)\n }\n\n // Apply skip\n if (options?.skip && options.skip > 0) {\n results = results.slice(options.skip)\n }\n\n // Apply limit\n if (options?.limit && options.limit > 0) {\n results = results.slice(0, options.limit)\n }\n\n return results\n }\n\n /**\n * Update a single document\n */\n async updateOne(\n filter: object,\n update: object,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n // Track collection in session for transaction rollback support\n this._trackInSession(options?.session)\n\n const docs = this._findDocuments(filter)\n\n if (docs.length === 0) {\n // Handle upsert\n if (options?.upsert) {\n const newDoc = this._applyUpdate({} as TSchema, update, filter)\n const result = await this.insertOne(newDoc, options)\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n upsertedId: result.insertedId,\n upsertedCount: 1,\n }\n }\n\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n }\n }\n\n // Update first matching document\n const doc = docs[0]\n if (doc === undefined) {\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n }\n }\n const updatedDoc = this._applyUpdate(doc, update)\n this.documents.set(doc._id.toHexString(), updatedDoc)\n\n // Emit update change event\n const { updatedFields, removedFields } = this._extractUpdateChanges(update)\n this._changeEventStore.addEvent({\n operationType: 'update',\n documentId: doc._id,\n updatedFields,\n removedFields,\n })\n\n return {\n acknowledged: true,\n matchedCount: 1,\n modifiedCount: 1,\n }\n }\n\n /**\n * Update multiple documents\n */\n async updateMany(\n filter: object,\n update: object,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n // Track collection in session for transaction rollback support\n this._trackInSession(options?.session)\n\n const docs = this._findDocuments(filter)\n\n if (docs.length === 0) {\n if (options?.upsert) {\n const newDoc = this._applyUpdate({} as TSchema, update, filter)\n const result = await this.insertOne(newDoc, options)\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n upsertedId: result.insertedId,\n upsertedCount: 1,\n }\n }\n\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n }\n }\n\n // Update all matching documents\n const { updatedFields, removedFields } = this._extractUpdateChanges(update)\n for (const doc of docs) {\n const updatedDoc = this._applyUpdate(doc, update)\n this.documents.set(doc._id.toHexString(), updatedDoc)\n\n // Emit update change event for each document\n this._changeEventStore.addEvent({\n operationType: 'update',\n documentId: doc._id,\n updatedFields,\n removedFields,\n })\n }\n\n return {\n acknowledged: true,\n matchedCount: docs.length,\n modifiedCount: docs.length,\n }\n }\n\n /**\n * Replace a single document\n */\n async replaceOne(\n filter: object,\n replacement: TSchema,\n options?: ReplaceOptions\n ): Promise<UpdateResult> {\n // Track collection in session for transaction rollback support\n this._trackInSession(options?.session)\n\n const docs = this._findDocuments(filter)\n\n if (docs.length === 0) {\n if (options?.upsert) {\n const result = await this.insertOne(replacement, options)\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n upsertedId: result.insertedId,\n upsertedCount: 1,\n }\n }\n\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n }\n }\n\n // Replace first matching document, preserving _id\n const doc = docs[0]\n if (doc === undefined) {\n return {\n acknowledged: true,\n matchedCount: 0,\n modifiedCount: 0,\n }\n }\n const replacedDoc = { ...replacement, _id: doc._id } as TSchema & { _id: ObjectId }\n this.documents.set(doc._id.toHexString(), replacedDoc)\n\n // Emit replace change event\n this._changeEventStore.addEvent({\n operationType: 'replace',\n documentId: doc._id,\n fullDocument: replacedDoc as unknown as Record<string, unknown>,\n })\n\n return {\n acknowledged: true,\n matchedCount: 1,\n modifiedCount: 1,\n }\n }\n\n /**\n * Delete a single document\n */\n async deleteOne(filter: object, options?: DeleteOptions): Promise<DeleteResult> {\n // Track collection in session for transaction rollback support\n this._trackInSession(options?.session)\n\n const docs = this._findDocuments(filter)\n\n if (docs.length === 0) {\n return {\n acknowledged: true,\n deletedCount: 0,\n }\n }\n\n // Delete first matching document\n const firstDoc = docs[0]\n if (firstDoc === undefined) {\n return {\n acknowledged: true,\n deletedCount: 0,\n }\n }\n const docId = firstDoc._id\n this.documents.delete(docId.toHexString())\n\n // Emit delete change event\n this._changeEventStore.addEvent({\n operationType: 'delete',\n documentId: docId,\n })\n\n return {\n acknowledged: true,\n deletedCount: 1,\n }\n }\n\n /**\n * Delete multiple documents\n */\n async deleteMany(filter: object, options?: DeleteOptions): Promise<DeleteResult> {\n // Track collection in session for transaction rollback support\n this._trackInSession(options?.session)\n\n const docs = this._findDocuments(filter)\n\n // Delete all matching documents\n for (const doc of docs) {\n this.documents.delete(doc._id.toHexString())\n\n // Emit delete change event\n this._changeEventStore.addEvent({\n operationType: 'delete',\n documentId: doc._id,\n })\n }\n\n return {\n acknowledged: true,\n deletedCount: docs.length,\n }\n }\n\n /**\n * Count documents matching filter\n */\n async countDocuments(filter: object = {}): Promise<number> {\n const docs = this._findDocuments(filter)\n return docs.length\n }\n\n /**\n * Find one and update\n */\n async findOneAndUpdate(\n filter: object,\n update: object,\n options?: FindOneAndUpdateOptions\n ): Promise<(TSchema & { _id: ObjectId }) | null> {\n const docs = this._findDocuments(filter, {\n ...(options?.sort !== undefined && { sort: options.sort })\n })\n\n if (docs.length === 0) {\n if (options?.upsert) {\n const newDoc = this._applyUpdate({} as TSchema, update, filter)\n await this.insertOne(newDoc)\n if (options?.returnDocument === 'after') {\n return this.findOne(filter, {\n ...(options?.projection !== undefined && { projection: options.projection })\n })\n }\n return null\n }\n return null\n }\n\n const doc = docs[0]\n if (doc === undefined) {\n return null\n }\n const originalDoc = { ...doc }\n\n // Update the document\n const updatedDoc = this._applyUpdate(doc, update)\n this.documents.set(doc._id.toHexString(), updatedDoc)\n\n // Return before or after based on options\n const result = options?.returnDocument === 'after' ? updatedDoc : originalDoc\n return options?.projection ? this._applyProjection(result, options.projection) : result\n }\n\n /**\n * Find one and delete\n */\n async findOneAndDelete(\n filter: object,\n options?: FindOneAndDeleteOptions\n ): Promise<(TSchema & { _id: ObjectId }) | null> {\n const docs = this._findDocuments(filter, {\n ...(options?.sort !== undefined && { sort: options.sort })\n })\n\n if (docs.length === 0) {\n return null\n }\n\n const doc = docs[0]\n if (doc === undefined) {\n return null\n }\n this.documents.delete(doc._id.toHexString())\n\n return options?.projection ? this._applyProjection(doc, options.projection) : doc\n }\n\n /**\n * Find one and replace\n */\n async findOneAndReplace(\n filter: object,\n replacement: TSchema,\n options?: FindOneAndReplaceOptions\n ): Promise<(TSchema & { _id: ObjectId }) | null> {\n const docs = this._findDocuments(filter, {\n ...(options?.sort !== undefined && { sort: options.sort })\n })\n\n if (docs.length === 0) {\n if (options?.upsert) {\n await this.insertOne(replacement)\n if (options?.returnDocument === 'after') {\n return this.findOne(filter, {\n ...(options?.projection !== undefined && { projection: options.projection })\n })\n }\n return null\n }\n return null\n }\n\n const doc = docs[0]\n if (doc === undefined) {\n return null\n }\n const originalDoc = { ...doc }\n\n // Replace the document, preserving _id\n const replacedDoc = { ...replacement, _id: doc._id } as TSchema & { _id: ObjectId }\n this.documents.set(doc._id.toHexString(), replacedDoc)\n\n // Return before or after based on options\n const result = options?.returnDocument === 'after' ? replacedDoc : originalDoc\n return options?.projection ? this._applyProjection(result, options.projection) : result\n }\n\n /**\n * Execute multiple write operations in a single batch\n *\n * @param operations - Array of bulk write operations\n * @param options - Bulk write options\n * @returns BulkWriteResult with operation counts\n */\n async bulkWrite(\n operations: BulkWriteOperation<TSchema>[],\n options: BulkWriteOptions = {}\n ): Promise<BulkWriteResult> {\n const ordered = options.ordered !== false // Default to true\n\n // Initialize result\n const result: BulkWriteResult = {\n acknowledged: true,\n insertedCount: 0,\n matchedCount: 0,\n modifiedCount: 0,\n deletedCount: 0,\n upsertedCount: 0,\n insertedIds: {},\n upsertedIds: {},\n }\n\n const writeErrors: BulkWriteError[] = []\n\n // Process operations\n for (let i = 0; i < operations.length; i++) {\n const op = operations[i]\n if (op === undefined) continue\n\n try {\n if (isInsertOneModel(op)) {\n const insertResult = await this.insertOne(op.insertOne.document)\n result.insertedCount++\n result.insertedIds[i] = insertResult.insertedId\n } else if (isUpdateOneModel(op)) {\n const updateResult = await this.updateOne(\n op.updateOne.filter,\n op.updateOne.update,\n {\n ...(op.updateOne.upsert !== undefined && { upsert: op.updateOne.upsert }),\n ...(op.updateOne.arrayFilters !== undefined && { arrayFilters: op.updateOne.arrayFilters })\n }\n )\n result.matchedCount += updateResult.matchedCount\n result.modifiedCount += updateResult.modifiedCount\n if (updateResult.upsertedId) {\n result.upsertedCount++\n result.upsertedIds[i] = updateResult.upsertedId\n }\n } else if (isUpdateManyModel(op)) {\n const updateResult = await this.updateMany(\n op.updateMany.filter,\n op.updateMany.update,\n {\n ...(op.updateMany.upsert !== undefined && { upsert: op.updateMany.upsert }),\n ...(op.updateMany.arrayFilters !== undefined && { arrayFilters: op.updateMany.arrayFilters })\n }\n )\n result.matchedCount += updateResult.matchedCount\n result.modifiedCount += updateResult.modifiedCount\n if (updateResult.upsertedId) {\n result.upsertedCount++\n result.upsertedIds[i] = updateResult.upsertedId\n }\n } else if (isReplaceOneModel(op)) {\n const replaceResult = await this.replaceOne(\n op.replaceOne.filter,\n op.replaceOne.replacement,\n {\n ...(op.replaceOne.upsert !== undefined && { upsert: op.replaceOne.upsert })\n }\n )\n result.matchedCount += replaceResult.matchedCount\n result.modifiedCount += replaceResult.modifiedCount\n if (replaceResult.upsertedId) {\n result.upsertedCount++\n result.upsertedIds[i] = replaceResult.upsertedId\n }\n } else if (isDeleteOneModel(op)) {\n const deleteResult = await this.deleteOne(op.deleteOne.filter)\n result.deletedCount += deleteResult.deletedCount\n } else if (isDeleteManyModel(op)) {\n const deleteResult = await this.deleteMany(op.deleteMany.filter)\n result.deletedCount += deleteResult.deletedCount\n }\n } catch (error) {\n const bulkError: BulkWriteError = {\n index: i,\n code: 11000, // Default to duplicate key error code\n errmsg: error instanceof Error ? error.message : String(error),\n op,\n }\n writeErrors.push(bulkError)\n\n // For ordered operations, stop on first error\n if (ordered) {\n throw new BulkWriteException(\n `BulkWrite operation failed: ${bulkError.errmsg}`,\n result,\n writeErrors\n )\n }\n // For unordered, continue processing remaining operations\n }\n }\n\n // If there were errors in unordered mode, throw exception with partial results\n if (writeErrors.length > 0) {\n throw new BulkWriteException(\n `BulkWrite operation completed with ${writeErrors.length} error(s)`,\n result,\n writeErrors\n )\n }\n\n return result\n }\n\n /**\n * Drop the collection\n */\n async drop(): Promise<boolean> {\n this.documents.clear()\n return true\n }\n\n /**\n * Watch for changes on this collection\n *\n * Creates a change stream that emits events for insert, update, replace, and delete operations.\n *\n * @param pipeline - Optional aggregation pipeline for filtering events (supports $match)\n * @param options - Change stream options\n * @returns A ChangeStream instance\n *\n * @example\n * ```typescript\n * const changeStream = collection.watch([\n * { $match: { operationType: 'insert' } }\n * ])\n *\n * for await (const event of changeStream) {\n * console.log('Change:', event.operationType, event.fullDocument)\n * }\n * ```\n */\n watch(\n pipeline: ChangeStreamPipeline = [],\n options: ChangeStreamOptions = {}\n ): ChangeStream<TSchema> {\n const changeStream = new ChangeStream<TSchema>(\n this.database.databaseName,\n this._collectionName,\n pipeline,\n options,\n {\n getDocumentById: async (id: ObjectId) => {\n const doc = this.documents.get(id.toHexString())\n return doc || null\n },\n getChangeEvents: async (afterSequence: number) => {\n return this._changeEventStore.getEventsAfter(afterSequence)\n },\n getCurrentSequence: () => {\n return this._changeEventStore.getCurrentSequence()\n },\n onClose: () => {\n this._activeChangeStreams.delete(changeStream)\n },\n }\n )\n\n this._activeChangeStreams.add(changeStream)\n return changeStream\n }\n\n /**\n * Check if a document matches a filter\n * @internal\n */\n private _matchesFilter(doc: Record<string, unknown>, filter: object): boolean {\n const filterObj = filter as Record<string, unknown>\n\n for (const [key, value] of Object.entries(filterObj)) {\n // Handle logical operators\n if (key === '$and') {\n const conditions = value as object[]\n if (!conditions.every(cond => this._matchesFilter(doc, cond))) {\n return false\n }\n continue\n }\n\n if (key === '$or') {\n const conditions = value as object[]\n if (!conditions.some(cond => this._matchesFilter(doc, cond))) {\n return false\n }\n continue\n }\n\n if (key === '$nor') {\n const conditions = value as object[]\n if (conditions.some(cond => this._matchesFilter(doc, cond))) {\n return false\n }\n continue\n }\n\n // Get document value for comparison\n const docValue = this._getNestedValue(doc, key)\n\n // Handle operator objects\n if (value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof ObjectId)) {\n if (!this._matchesOperators(docValue, value as Record<string, unknown>)) {\n return false\n }\n continue\n }\n\n // Direct comparison\n if (!this._valuesEqual(docValue, value)) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Check if a value matches operator conditions\n */\n private _matchesOperators(docValue: unknown, operators: Record<string, unknown>): boolean {\n for (const [op, opValue] of Object.entries(operators)) {\n switch (op) {\n case '$eq':\n if (!this._valuesEqual(docValue, opValue)) return false\n break\n case '$ne':\n if (this._valuesEqual(docValue, opValue)) return false\n break\n case '$gt':\n if (typeof docValue !== 'number' || docValue <= (opValue as number)) return false\n break\n case '$gte':\n if (typeof docValue !== 'number' || docValue < (opValue as number)) return false\n break\n case '$lt':\n if (typeof docValue !== 'number' || docValue >= (opValue as number)) return false\n break\n case '$lte':\n if (typeof docValue !== 'number' || docValue > (opValue as number)) return false\n break\n case '$in':\n const inArray = opValue as unknown[]\n if (!inArray.some(v => this._valuesEqual(docValue, v))) return false\n break\n case '$nin':\n const ninArray = opValue as unknown[]\n if (ninArray.some(v => this._valuesEqual(docValue, v))) return false\n break\n case '$exists':\n const exists = docValue !== undefined\n if (opValue !== exists) return false\n break\n case '$not':\n if (this._matchesOperators(docValue, opValue as Record<string, unknown>)) return false\n break\n case '$regex':\n const regex = new RegExp(opValue as string)\n if (typeof docValue !== 'string' || !regex.test(docValue)) return false\n break\n case '$type':\n if (typeof docValue !== opValue) return false\n break\n case '$elemMatch':\n if (!Array.isArray(docValue)) return false\n if (!docValue.some(elem => this._matchesFilter(elem as Record<string, unknown>, opValue as object))) return false\n break\n case '$size':\n if (!Array.isArray(docValue) || docValue.length !== opValue) return false\n break\n case '$all':\n if (!Array.isArray(docValue)) return false\n const allValues = opValue as unknown[]\n if (!allValues.every(v => docValue.some(dv => this._valuesEqual(dv, v)))) return false\n break\n }\n }\n return true\n }\n\n /**\n * Compare two values for equality\n */\n private _valuesEqual(a: unknown, b: unknown): boolean {\n if (a instanceof ObjectId && b instanceof ObjectId) {\n return a.equals(b)\n }\n if (a instanceof ObjectId && typeof b === 'string') {\n return a.equals(b)\n }\n if (typeof a === 'string' && b instanceof ObjectId) {\n return b.equals(a)\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((val, idx) => this._valuesEqual(val, b[idx]))\n }\n if (a !== null && b !== null && typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n if (keysA.length !== keysB.length) return false\n return keysA.every(key =>\n this._valuesEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n )\n }\n return a === b\n }\n\n /**\n * Get nested value from document using dot notation\n */\n private _getNestedValue(doc: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.')\n let current: unknown = doc\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined\n }\n current = (current as Record<string, unknown>)[part]\n }\n\n return current\n }\n\n /**\n * Apply update operators to a document\n */\n private _applyUpdate(\n doc: TSchema & { _id?: ObjectId },\n update: object,\n filter?: object\n ): TSchema & { _id: ObjectId } {\n const updateObj = update as Record<string, unknown>\n const result = { ...doc } as TSchema & { _id: ObjectId }\n\n // Preserve or generate _id\n if (!result._id) {\n result._id = new ObjectId()\n }\n\n // Apply filter fields for upsert\n if (filter) {\n const filterObj = filter as Record<string, unknown>\n for (const [key, value] of Object.entries(filterObj)) {\n if (!key.startsWith('$') && typeof value !== 'object') {\n (result as Record<string, unknown>)[key] = value\n }\n }\n }\n\n // Apply update operators\n for (const [op, fields] of Object.entries(updateObj)) {\n switch (op) {\n case '$set':\n for (const [key, value] of Object.entries(fields as Record<string, unknown>)) {\n this._setNestedValue(result, key, value)\n }\n break\n\n case '$unset':\n for (const key of Object.keys(fields as Record<string, unknown>)) {\n this._deleteNestedValue(result, key)\n }\n break\n\n case '$inc':\n for (const [key, value] of Object.entries(fields as Record<string, number>)) {\n const current = this._getNestedValue(result, key)\n const newValue = (typeof current === 'number' ? current : 0) + value\n this._setNestedValue(result, key, newValue)\n }\n break\n\n case '$mul':\n for (const [key, value] of Object.entries(fields as Record<string, number>)) {\n const current = this._getNestedValue(result, key)\n const newValue = (typeof current === 'number' ? current : 0) * value\n this._setNestedValue(result, key, newValue)\n }\n break\n\n case '$min':\n for (const [key, value] of Object.entries(fields as Record<string, number>)) {\n const current = this._getNestedValue(result, key)\n if (current === undefined || (value as number) < (current as number)) {\n this._setNestedValue(result, key, value)\n }\n }\n break\n\n case '$max':\n for (const [key, value] of Object.entries(fields as Record<string, number>)) {\n const current = this._getNestedValue(result, key)\n if (current === undefined || (value as number) > (current as number)) {\n this._setNestedValue(result, key, value)\n }\n }\n break\n\n case '$rename':\n for (const [oldKey, newKey] of Object.entries(fields as Record<string, string>)) {\n const value = this._getNestedValue(result, oldKey)\n this._deleteNestedValue(result, oldKey)\n this._setNestedValue(result, newKey, value)\n }\n break\n\n case '$push':\n for (const [key, value] of Object.entries(fields as Record<string, unknown>)) {\n const current = this._getNestedValue(result, key)\n const array = Array.isArray(current) ? [...current] : []\n\n if (typeof value === 'object' && value !== null && '$each' in (value as object)) {\n const eachValue = value as { $each: unknown[] }\n array.push(...eachValue.$each)\n } else {\n array.push(value)\n }\n\n this._setNestedValue(result, key, array)\n }\n break\n\n case '$pull':\n for (const [key, value] of Object.entries(fields as Record<string, unknown>)) {\n const current = this._getNestedValue(result, key)\n if (Array.isArray(current)) {\n const newArray = current.filter(item => !this._valuesEqual(item, value))\n this._setNestedValue(result, key, newArray)\n }\n }\n break\n\n case '$pop':\n for (const [key, value] of Object.entries(fields as Record<string, number>)) {\n const current = this._getNestedValue(result, key)\n if (Array.isArray(current)) {\n const newArray = [...current]\n if (value === 1) {\n newArray.pop()\n } else if (value === -1) {\n newArray.shift()\n }\n this._setNestedValue(result, key, newArray)\n }\n }\n break\n\n case '$addToSet':\n for (const [key, value] of Object.entries(fields as Record<string, unknown>)) {\n const current = this._getNestedValue(result, key)\n const array = Array.isArray(current) ? [...current] : []\n\n if (typeof value === 'object' && value !== null && '$each' in (value as object)) {\n const eachValue = value as { $each: unknown[] }\n for (const item of eachValue.$each) {\n if (!array.some(existing => this._valuesEqual(existing, item))) {\n array.push(item)\n }\n }\n } else if (!array.some(existing => this._valuesEqual(existing, value))) {\n array.push(value)\n }\n\n this._setNestedValue(result, key, array)\n }\n break\n\n case '$currentDate':\n for (const [key, value] of Object.entries(fields as Record<string, boolean | { $type: string }>)) {\n if (value === true || (typeof value === 'object' && value.$type === 'date')) {\n this._setNestedValue(result, key, new Date())\n } else if (typeof value === 'object' && value.$type === 'timestamp') {\n this._setNestedValue(result, key, Date.now())\n }\n }\n break\n }\n }\n\n return result\n }\n\n /**\n * Set a nested value in an object\n */\n private _setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (part === undefined) continue\n if (current[part] === undefined || current[part] === null) {\n current[part] = {}\n }\n current = current[part] as Record<string, unknown>\n }\n\n const lastPart = parts[parts.length - 1]\n if (lastPart !== undefined) {\n current[lastPart] = value\n }\n }\n\n /**\n * Delete a nested value from an object\n */\n private _deleteNestedValue(obj: Record<string, unknown>, path: string): void {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (part === undefined) continue\n if (current[part] === undefined || current[part] === null) {\n return\n }\n current = current[part] as Record<string, unknown>\n }\n\n const lastPart = parts[parts.length - 1]\n if (lastPart !== undefined) {\n delete current[lastPart]\n }\n }\n\n /**\n * Sort documents by the given sort specification\n */\n private _sortDocuments(\n docs: (TSchema & { _id: ObjectId })[],\n sort: Record<string, 1 | -1>\n ): (TSchema & { _id: ObjectId })[] {\n return [...docs].sort((a, b) => {\n for (const [key, direction] of Object.entries(sort)) {\n const aValue = this._getNestedValue(a, key)\n const bValue = this._getNestedValue(b, key)\n\n let comparison = 0\n if (aValue === bValue) {\n comparison = 0\n } else if (aValue === null || aValue === undefined) {\n comparison = -1\n } else if (bValue === null || bValue === undefined) {\n comparison = 1\n } else if (typeof aValue === 'string' && typeof bValue === 'string') {\n comparison = aValue.localeCompare(bValue)\n } else if (typeof aValue === 'number' && typeof bValue === 'number') {\n comparison = aValue - bValue\n } else {\n comparison = String(aValue).localeCompare(String(bValue))\n }\n\n if (comparison !== 0) {\n return comparison * direction\n }\n }\n return 0\n })\n }\n\n /**\n * Apply projection to a document\n * @internal\n */\n _applyProjection(\n doc: TSchema & { _id: ObjectId },\n projection: Record<string, 0 | 1>\n ): TSchema & { _id: ObjectId } {\n const hasInclusions = Object.values(projection).some(v => v === 1)\n const hasExclusions = Object.values(projection).some(v => v === 0)\n\n // Cannot mix inclusions and exclusions (except for _id)\n if (hasInclusions) {\n const result: Record<string, unknown> = {}\n\n // Always include _id unless explicitly excluded\n if (projection._id !== 0) {\n result._id = doc._id\n }\n\n for (const [key, value] of Object.entries(projection)) {\n if (value === 1 && key !== '_id') {\n result[key] = this._getNestedValue(doc, key)\n }\n }\n\n return result as TSchema & { _id: ObjectId }\n } else if (hasExclusions) {\n const result = { ...doc }\n\n for (const [key, value] of Object.entries(projection)) {\n if (value === 0) {\n delete (result as Record<string, unknown>)[key]\n }\n }\n\n return result\n }\n\n return doc\n }\n\n /**\n * Extract updated and removed fields from an update object\n * @internal\n */\n private _extractUpdateChanges(update: object): {\n updatedFields: Record<string, unknown>\n removedFields: string[]\n } {\n const updateObj = update as Record<string, unknown>\n const updatedFields: Record<string, unknown> = {}\n const removedFields: string[] = []\n\n // Extract fields from $set\n if (updateObj.$set) {\n Object.assign(updatedFields, updateObj.$set)\n }\n\n // Extract fields from $unset\n if (updateObj.$unset) {\n removedFields.push(...Object.keys(updateObj.$unset as Record<string, unknown>))\n }\n\n // Extract fields from $inc, $mul, $min, $max (these set values)\n for (const op of ['$inc', '$mul', '$min', '$max']) {\n if (updateObj[op]) {\n for (const key of Object.keys(updateObj[op] as Record<string, unknown>)) {\n updatedFields[key] = (updateObj[op] as Record<string, unknown>)[key]\n }\n }\n }\n\n // Handle $push (updated fields)\n if (updateObj.$push) {\n for (const key of Object.keys(updateObj.$push as Record<string, unknown>)) {\n updatedFields[key] = (updateObj.$push as Record<string, unknown>)[key]\n }\n }\n\n // Handle $pull (updated fields)\n if (updateObj.$pull) {\n for (const key of Object.keys(updateObj.$pull as Record<string, unknown>)) {\n updatedFields[key] = (updateObj.$pull as Record<string, unknown>)[key]\n }\n }\n\n // Handle $addToSet (updated fields)\n if (updateObj.$addToSet) {\n for (const key of Object.keys(updateObj.$addToSet as Record<string, unknown>)) {\n updatedFields[key] = (updateObj.$addToSet as Record<string, unknown>)[key]\n }\n }\n\n return { updatedFields, removedFields }\n }\n\n /**\n * Execute an aggregation pipeline on the collection\n *\n * Returns an AggregationCursor that supports:\n * - Async iteration with `for await (const doc of cursor)`\n * - Converting to array with `await cursor.toArray()`\n * - forEach iteration with `await cursor.forEach(callback)`\n *\n * Supports async stages like $function and $lookup with pipeline.\n *\n * @param pipeline - Array of aggregation pipeline stages\n * @param options - Aggregation options\n * @returns AggregationCursor for iterating over results\n *\n * @example\n * ```typescript\n * // Using toArray\n * const results = await collection.aggregate([\n * { $match: { status: 'active' } },\n * { $group: { _id: '$category', count: { $sum: 1 } } }\n * ]).toArray()\n *\n * // Using async iterator\n * for await (const doc of collection.aggregate([\n * { $match: { status: 'active' } }\n * ])) {\n * console.log(doc)\n * }\n * ```\n */\n aggregate<TResult extends Document = TSchema>(\n pipeline: PipelineStage[],\n options: AggregationCursorOptions = {}\n ): AggregationCursor<TResult> {\n // Create execution context for async stages\n const context: AsyncExecutionContext = {\n collectionName: this._collectionName,\n lookupCollection: async (name: string) => {\n // Get documents from another collection for $lookup\n const targetCollection = this.database.collection(name)\n return targetCollection._findDocuments({}) as unknown as Document[]\n },\n functionExecutor: async (fn: FunctionStage, doc: Document) => {\n // Execute $function stage\n return this._executeFunctionStage(fn, doc)\n }\n }\n\n // Create fetch function that executes the pipeline\n const fetchFn = async (): Promise<TResult[]> => {\n // Get all documents from collection\n const allDocs = this._findDocuments({})\n\n // Execute pipeline stages\n return this._executeAggregationPipeline<TResult>(allDocs, pipeline)\n }\n\n return new AggregationCursor<TResult>(\n pipeline,\n fetchFn,\n options,\n undefined, // No custom async executor - we handle in fetch\n context\n )\n }\n\n /**\n * Execute $function stage on a document\n * @internal\n */\n private async _executeFunctionStage(\n fn: FunctionStage,\n doc: Document\n ): Promise<unknown> {\n let func: (...args: unknown[]) => unknown | Promise<unknown>\n\n if (typeof fn.body === 'string') {\n // String function bodies require secure worker-loader execution\n throw new Error(\n '$function requires worker_loaders binding. ' +\n 'Add to wrangler.jsonc: \"worker_loaders\": [{ \"binding\": \"LOADER\" }]'\n )\n } else {\n func = fn.body\n }\n\n // Resolve args - replace field references with actual values\n const resolvedArgs = fn.args.map(arg => {\n if (typeof arg === 'string' && arg.startsWith('$')) {\n return this._getNestedValue(doc, arg.slice(1))\n }\n return arg\n })\n\n // Execute function\n return func(...resolvedArgs)\n }\n\n /**\n * Execute aggregation pipeline on documents (in-memory implementation)\n * @internal\n */\n private _executeAggregationPipeline<TResult extends Document = Document>(\n documents: (TSchema & { _id: ObjectId })[],\n pipeline: PipelineStage[]\n ): TResult[] {\n let results: Document[] = documents.map(doc => ({ ...doc }))\n\n for (const stage of pipeline) {\n const stageType = Object.keys(stage)[0]\n if (stageType === undefined) continue\n const stageValue = (stage as Record<string, unknown>)[stageType]\n\n switch (stageType) {\n case '$match':\n results = results.filter(doc =>\n this._matchesFilter(doc as TSchema & { _id: ObjectId }, stageValue as object)\n )\n break\n\n case '$project':\n results = this._executeProjectStage(results, stageValue as Record<string, unknown>)\n break\n\n case '$group':\n results = this._executeGroupStage(results, stageValue as Record<string, unknown>)\n break\n\n case '$sort':\n results = this._executeSortStage(results, stageValue as Record<string, 1 | -1>)\n break\n\n case '$limit':\n results = results.slice(0, stageValue as number)\n break\n\n case '$skip':\n results = results.slice(stageValue as number)\n break\n\n case '$count':\n results = [{ [stageValue as string]: results.length }]\n break\n\n case '$unwind':\n results = this._executeUnwindStage(results, stageValue as string | { path: string; preserveNullAndEmptyArrays?: boolean })\n break\n\n case '$addFields':\n case '$set':\n results = this._executeAddFieldsStage(results, stageValue as Record<string, unknown>)\n break\n\n case '$lookup':\n results = this._executeLookupStage(results, stageValue as {\n from: string\n localField?: string\n foreignField?: string\n as: string\n })\n break\n\n default:\n // Unsupported stage - pass through\n break\n }\n }\n\n return results as TResult[]\n }\n\n /**\n * Execute $project stage\n * @internal\n */\n private _executeProjectStage(\n documents: Document[],\n projection: Record<string, unknown>\n ): Document[] {\n // Check if we have inclusions or expressions (expressions count as inclusions)\n const hasInclusion = Object.entries(projection).some(([key, v]) => {\n if (key === '_id') return false // _id: 0 doesn't count\n return v === 1 ||\n (typeof v === 'string' && v.startsWith('$')) ||\n (typeof v === 'object' && v !== null)\n })\n const excludeId = projection._id === 0\n\n return documents.map(doc => {\n const result: Document = {}\n\n if (hasInclusion) {\n // Inclusion mode\n if (!excludeId && '_id' in doc) {\n result._id = doc._id\n }\n\n for (const [key, value] of Object.entries(projection)) {\n if (key === '_id' && value === 0) continue\n if (key === '_id' && value === 1) {\n result._id = doc._id\n continue\n }\n\n if (value === 1) {\n result[key] = this._getNestedValue(doc, key)\n } else if (typeof value === 'string' && value.startsWith('$')) {\n result[key] = this._getNestedValue(doc, value.slice(1))\n } else if (typeof value === 'object' && value !== null) {\n result[key] = this._evaluateExpression(doc, value)\n }\n }\n } else {\n // Exclusion mode\n for (const [key, val] of Object.entries(doc)) {\n if (projection[key] === 0) continue\n result[key] = val\n }\n }\n\n return result\n })\n }\n\n /**\n * Execute $group stage\n * @internal\n */\n private _executeGroupStage(\n documents: Document[],\n groupSpec: Record<string, unknown>\n ): Document[] {\n const groups = new Map<string, { docs: Document[]; result: Document }>()\n\n for (const doc of documents) {\n // Compute group key\n let groupKey: string\n const idSpec = groupSpec._id\n\n if (idSpec === null) {\n groupKey = '__all__'\n } else if (typeof idSpec === 'string' && idSpec.startsWith('$')) {\n groupKey = String(this._getNestedValue(doc, idSpec.slice(1)))\n } else if (typeof idSpec === 'object' && idSpec !== null) {\n const keyObj: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(idSpec as Record<string, unknown>)) {\n if (typeof v === 'string' && v.startsWith('$')) {\n keyObj[k] = this._getNestedValue(doc, v.slice(1))\n } else {\n keyObj[k] = v\n }\n }\n groupKey = JSON.stringify(keyObj)\n } else {\n groupKey = String(idSpec)\n }\n\n if (!groups.has(groupKey)) {\n // Initialize group\n let idValue: unknown\n if (idSpec === null) {\n idValue = null\n } else if (typeof idSpec === 'string' && idSpec.startsWith('$')) {\n idValue = this._getNestedValue(doc, idSpec.slice(1))\n } else if (typeof idSpec === 'object' && idSpec !== null) {\n idValue = {}\n for (const [k, v] of Object.entries(idSpec as Record<string, unknown>)) {\n if (typeof v === 'string' && v.startsWith('$')) {\n (idValue as Record<string, unknown>)[k] = this._getNestedValue(doc, v.slice(1))\n } else {\n (idValue as Record<string, unknown>)[k] = v\n }\n }\n } else {\n idValue = idSpec\n }\n\n groups.set(groupKey, { docs: [], result: { _id: idValue } })\n }\n\n groups.get(groupKey)!.docs.push(doc)\n }\n\n // Apply accumulators\n const results: Document[] = []\n\n for (const { docs, result } of groups.values()) {\n for (const [key, accumulator] of Object.entries(groupSpec)) {\n if (key === '_id') continue\n\n if (typeof accumulator === 'object' && accumulator !== null) {\n const accObj = accumulator as Record<string, unknown>\n const accType = Object.keys(accObj)[0]\n if (accType === undefined) continue\n const accValue = accObj[accType]\n\n switch (accType) {\n case '$sum':\n if (accValue === 1) {\n result[key] = docs.length\n } else if (typeof accValue === 'string' && accValue.startsWith('$')) {\n result[key] = docs.reduce((sum, d) => {\n const val = this._getNestedValue(d, accValue.slice(1))\n return sum + (typeof val === 'number' ? val : 0)\n }, 0)\n }\n break\n\n case '$avg':\n if (typeof accValue === 'string' && accValue.startsWith('$')) {\n const sum = docs.reduce((s, d) => {\n const val = this._getNestedValue(d, accValue.slice(1))\n return s + (typeof val === 'number' ? val : 0)\n }, 0)\n result[key] = docs.length > 0 ? sum / docs.length : null\n }\n break\n\n case '$min':\n if (typeof accValue === 'string' && accValue.startsWith('$')) {\n const values = docs.map(d => this._getNestedValue(d, accValue.slice(1)) as number)\n result[key] = Math.min(...values.filter(v => typeof v === 'number'))\n }\n break\n\n case '$max':\n if (typeof accValue === 'string' && accValue.startsWith('$')) {\n const values = docs.map(d => this._getNestedValue(d, accValue.slice(1)) as number)\n result[key] = Math.max(...values.filter(v => typeof v === 'number'))\n }\n break\n\n case '$count':\n result[key] = docs.length\n break\n\n case '$first':\n if (typeof accValue === 'string' && accValue.startsWith('$')) {\n const firstDoc = docs[0]\n result[key] = firstDoc !== undefined ? this._getNestedValue(firstDoc, accValue.slice(1)) : null\n }\n break\n\n case '$last':\n if (typeof accValue === 'string' && accValue.startsWith('$')) {\n const lastDoc = docs[docs.length - 1]\n result[key] = lastDoc !== undefined ? this._getNestedValue(lastDoc, accValue.slice(1)) : null\n }\n break\n\n case '$push':\n if (typeof accValue === 'string' && accValue.startsWith('$')) {\n result[key] = docs.map(d => this._getNestedValue(d, accValue.slice(1)))\n }\n break\n\n case '$addToSet':\n if (typeof accValue === 'string' && accValue.startsWith('$')) {\n const set = new Set()\n for (const d of docs) {\n set.add(JSON.stringify(this._getNestedValue(d, accValue.slice(1))))\n }\n result[key] = Array.from(set).map(s => JSON.parse(s as string))\n }\n break\n }\n }\n }\n\n results.push(result)\n }\n\n return results\n }\n\n /**\n * Execute $sort stage\n * @internal\n */\n private _executeSortStage(\n documents: Document[],\n sortSpec: Record<string, 1 | -1>\n ): Document[] {\n return [...documents].sort((a, b) => {\n for (const [field, direction] of Object.entries(sortSpec)) {\n const aVal = this._getNestedValue(a, field)\n const bVal = this._getNestedValue(b, field)\n\n let comparison = 0\n if (aVal === bVal) {\n comparison = 0\n } else if (aVal === null || aVal === undefined) {\n comparison = -1\n } else if (bVal === null || bVal === undefined) {\n comparison = 1\n } else if (typeof aVal === 'string' && typeof bVal === 'string') {\n comparison = aVal.localeCompare(bVal)\n } else {\n comparison = (aVal as number) - (bVal as number)\n }\n\n if (comparison !== 0) {\n return comparison * direction\n }\n }\n return 0\n })\n }\n\n /**\n * Execute $unwind stage\n * @internal\n */\n private _executeUnwindStage(\n documents: Document[],\n unwindSpec: string | { path: string; preserveNullAndEmptyArrays?: boolean }\n ): Document[] {\n const path = typeof unwindSpec === 'string' ? unwindSpec : unwindSpec.path\n const preserveNull = typeof unwindSpec === 'object' && unwindSpec.preserveNullAndEmptyArrays === true\n const fieldPath = path.startsWith('$') ? path.slice(1) : path\n\n const results: Document[] = []\n\n for (const doc of documents) {\n const arrayValue = this._getNestedValue(doc, fieldPath)\n\n if (Array.isArray(arrayValue) && arrayValue.length > 0) {\n for (const item of arrayValue) {\n const newDoc = { ...doc }\n this._setNestedValue(newDoc, fieldPath, item)\n results.push(newDoc)\n }\n } else if (preserveNull) {\n results.push({ ...doc })\n }\n }\n\n return results\n }\n\n /**\n * Execute $addFields/$set stage\n * @internal\n */\n private _executeAddFieldsStage(\n documents: Document[],\n fieldsSpec: Record<string, unknown>\n ): Document[] {\n return documents.map(doc => {\n const result = { ...doc }\n\n for (const [field, value] of Object.entries(fieldsSpec)) {\n if (typeof value === 'string' && value.startsWith('$')) {\n result[field] = this._getNestedValue(doc, value.slice(1))\n } else if (typeof value === 'object' && value !== null) {\n result[field] = this._evaluateExpression(doc, value)\n } else {\n result[field] = value\n }\n }\n\n return result\n })\n }\n\n /**\n * Execute $lookup stage\n * @internal\n */\n private _executeLookupStage(\n documents: Document[],\n lookupSpec: {\n from: string\n localField?: string\n foreignField?: string\n as: string\n }\n ): Document[] {\n const targetCollection = this.database.collection(lookupSpec.from)\n const targetDocs = targetCollection._findDocuments({})\n\n return documents.map(doc => {\n const result = { ...doc }\n\n if (lookupSpec.localField && lookupSpec.foreignField) {\n const localValue = this._getNestedValue(doc, lookupSpec.localField)\n const matched = targetDocs.filter(targetDoc => {\n const foreignValue = this._getNestedValue(targetDoc as Record<string, unknown>, lookupSpec.foreignField!)\n return this._valuesEqual(localValue, foreignValue)\n })\n result[lookupSpec.as] = matched\n } else {\n result[lookupSpec.as] = []\n }\n\n return result\n })\n }\n\n /**\n * Evaluate an expression (simplified)\n * @internal\n */\n private _evaluateExpression(doc: Document, expr: unknown): unknown {\n if (expr === null || typeof expr !== 'object') {\n return expr\n }\n\n const exprObj = expr as Record<string, unknown>\n const operator = Object.keys(exprObj)[0]\n if (operator === undefined) return expr\n const operand = exprObj[operator]\n\n switch (operator) {\n case '$concat':\n if (Array.isArray(operand)) {\n return operand.map(item => {\n if (typeof item === 'string' && item.startsWith('$')) {\n return String(this._getNestedValue(doc, item.slice(1)) ?? '')\n }\n return String(item)\n }).join('')\n }\n break\n\n case '$add':\n if (Array.isArray(operand)) {\n return operand.reduce((sum, item) => {\n if (typeof item === 'string' && item.startsWith('$')) {\n return sum + (Number(this._getNestedValue(doc, item.slice(1))) || 0)\n }\n return sum + (Number(item) || 0)\n }, 0)\n }\n break\n\n case '$subtract':\n if (Array.isArray(operand) && operand.length === 2) {\n const a = typeof operand[0] === 'string' && operand[0].startsWith('$')\n ? Number(this._getNestedValue(doc, operand[0].slice(1)))\n : Number(operand[0])\n const b = typeof operand[1] === 'string' && operand[1].startsWith('$')\n ? Number(this._getNestedValue(doc, operand[1].slice(1)))\n : Number(operand[1])\n return a - b\n }\n break\n\n case '$multiply':\n if (Array.isArray(operand)) {\n return operand.reduce((product, item) => {\n if (typeof item === 'string' && item.startsWith('$')) {\n return product * (Number(this._getNestedValue(doc, item.slice(1))) || 0)\n }\n return product * (Number(item) || 0)\n }, 1)\n }\n break\n\n case '$divide':\n if (Array.isArray(operand) && operand.length === 2) {\n const a = typeof operand[0] === 'string' && operand[0].startsWith('$')\n ? Number(this._getNestedValue(doc, operand[0].slice(1)))\n : Number(operand[0])\n const b = typeof operand[1] === 'string' && operand[1].startsWith('$')\n ? Number(this._getNestedValue(doc, operand[1].slice(1)))\n : Number(operand[1])\n return b !== 0 ? a / b : null\n }\n break\n\n case '$cond':\n if (typeof operand === 'object' && operand !== null) {\n const cond = operand as { if: unknown; then: unknown; else: unknown }\n const condition = this._evaluateCondition(doc, cond.if)\n return condition\n ? this._evaluateExpression(doc, cond.then)\n : this._evaluateExpression(doc, cond.else)\n }\n break\n\n case '$ifNull':\n if (Array.isArray(operand) && operand.length === 2) {\n const value = typeof operand[0] === 'string' && operand[0].startsWith('$')\n ? this._getNestedValue(doc, operand[0].slice(1))\n : operand[0]\n return value ?? operand[1]\n }\n break\n }\n\n return expr\n }\n\n /**\n * Evaluate a condition\n * @internal\n */\n private _evaluateCondition(doc: Document, condition: unknown): boolean {\n if (typeof condition !== 'object' || condition === null) {\n return Boolean(condition)\n }\n\n const condObj = condition as Record<string, unknown>\n const operator = Object.keys(condObj)[0]\n if (operator === undefined) return true\n const operand = condObj[operator] as unknown[]\n\n switch (operator) {\n case '$eq':\n return this._compareExprValues(doc, operand[0], operand[1]) === 0\n case '$ne':\n return this._compareExprValues(doc, operand[0], operand[1]) !== 0\n case '$gt':\n return this._compareExprValues(doc, operand[0], operand[1]) > 0\n case '$gte':\n return this._compareExprValues(doc, operand[0], operand[1]) >= 0\n case '$lt':\n return this._compareExprValues(doc, operand[0], operand[1]) < 0\n case '$lte':\n return this._compareExprValues(doc, operand[0], operand[1]) <= 0\n case '$and':\n return (operand as unknown[]).every(c => this._evaluateCondition(doc, c))\n case '$or':\n return (operand as unknown[]).some(c => this._evaluateCondition(doc, c))\n default:\n return true\n }\n }\n\n /**\n * Compare two expression values\n * @internal\n */\n private _compareExprValues(doc: Document, a: unknown, b: unknown): number {\n const resolveValue = (val: unknown): unknown => {\n if (typeof val === 'string' && val.startsWith('$')) {\n return this._getNestedValue(doc, val.slice(1))\n }\n return val\n }\n\n const aVal = resolveValue(a)\n const bVal = resolveValue(b)\n\n if (aVal === bVal) return 0\n if (aVal === null || aVal === undefined) return -1\n if (bVal === null || bVal === undefined) return 1\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return aVal - bVal\n }\n return String(aVal).localeCompare(String(bVal))\n }\n}\n\nexport default MongoCollection\n","/**\n * Consolidated RPC Types\n *\n * This module contains all shared RPC-related type definitions used across:\n * - src/rpc/rpc-target.ts\n * - src/rpc/rpc-client.ts\n * - src/rpc/endpoint.ts\n * - src/rpc/index.ts\n * - src/wire/backend/workers-proxy.ts\n */\n\n// ============================================================================\n// Cloudflare Durable Object Types\n// ============================================================================\n\n/**\n * Durable Object namespace interface\n */\nexport interface DurableObjectNamespace {\n idFromName(name: string): DurableObjectId\n get(id: DurableObjectId): DurableObjectStub\n}\n\n/**\n * Durable Object ID interface\n */\nexport interface DurableObjectId {\n toString(): string\n}\n\n/**\n * Durable Object stub interface\n */\nexport interface DurableObjectStub {\n fetch(request: Request | string, init?: RequestInit): Promise<Response>\n}\n\n// ============================================================================\n// Environment Types\n// ============================================================================\n\n/**\n * Base Mondo environment bindings interface\n */\nexport interface MondoEnv {\n MONDO_DATABASE: DurableObjectNamespace\n /** Optional Worker Loader for $function support (closed beta) */\n LOADER?: WorkerLoader\n /** Optional auth token for RPC endpoint */\n MONDO_AUTH_TOKEN?: string\n}\n\n// ============================================================================\n// Worker Loader Types (for $function operator)\n// ============================================================================\n\n/**\n * Worker Loader interface for dynamic worker creation\n * (Closed beta feature for $function operator support)\n */\nexport interface WorkerLoader {\n get(id: string, getCode: () => Promise<WorkerCode>): WorkerStub\n}\n\n/**\n * Worker code specification for dynamic workers\n */\nexport interface WorkerCode {\n compatibilityDate: string\n compatibilityFlags?: string[]\n mainModule: string\n modules: Record<string, string | { js: string } | { text: string }>\n globalOutbound?: null // null blocks all network access\n env?: Record<string, unknown>\n}\n\n/**\n * Worker stub interface for dynamic workers\n */\nexport interface WorkerStub {\n fetch?(request: Request): Promise<Response>\n getEntrypoint?(name?: string): WorkerEntrypoint\n}\n\n/**\n * Worker entrypoint interface\n */\nexport interface WorkerEntrypoint {\n fetch(request: Request): Promise<Response>\n}\n\n// ============================================================================\n// JSON-RPC Style Request/Response Types\n// ============================================================================\n\n/**\n * RPC request structure for Workers RPC (capnweb-style)\n * Used by rpc-target.ts and rpc-client.ts\n */\nexport interface RpcRequest {\n id?: string\n method: string\n params: unknown[]\n}\n\n/**\n * RPC response structure for Workers RPC\n */\nexport interface RpcResponse {\n id?: string\n result?: unknown\n error?: string\n}\n\n/**\n * Batch response structure\n */\nexport interface BatchResponse {\n results: RpcResponse[]\n}\n\n// ============================================================================\n// HTTP RPC Endpoint Request/Response Types\n// ============================================================================\n\n/**\n * RPC request structure for HTTP endpoint\n * Used by endpoint.ts and workers-proxy.ts\n */\nexport interface HttpRpcRequest {\n method: string\n db?: string\n collection?: string\n filter?: Record<string, unknown>\n update?: Record<string, unknown>\n document?: Record<string, unknown>\n documents?: Record<string, unknown>[]\n pipeline?: Record<string, unknown>[]\n options?: Record<string, unknown>\n field?: string\n query?: Record<string, unknown>\n}\n\n/**\n * HTTP RPC success response\n */\nexport interface HttpRpcSuccessResponse {\n ok: 1\n result: unknown\n}\n\n/**\n * HTTP RPC error response\n */\nexport interface HttpRpcErrorResponse {\n ok: 0\n error: string\n code: number\n codeName?: string\n}\n\n/**\n * HTTP RPC response (union type)\n */\nexport type HttpRpcResponse = HttpRpcSuccessResponse | HttpRpcErrorResponse\n\n// ============================================================================\n// Legacy RPC Types (for src/rpc/index.ts message-based protocol)\n// ============================================================================\n\n/**\n * RPC message types for internal operations\n */\nexport enum MessageType {\n // Document operations\n INSERT_ONE = 'insertOne',\n INSERT_MANY = 'insertMany',\n FIND_ONE = 'findOne',\n FIND = 'find',\n UPDATE_ONE = 'updateOne',\n UPDATE_MANY = 'updateMany',\n DELETE_ONE = 'deleteOne',\n DELETE_MANY = 'deleteMany',\n\n // Aggregation\n AGGREGATE = 'aggregate',\n COUNT = 'count',\n DISTINCT = 'distinct',\n\n // Index operations\n CREATE_INDEX = 'createIndex',\n DROP_INDEX = 'dropIndex',\n LIST_INDEXES = 'listIndexes',\n\n // Collection operations\n CREATE_COLLECTION = 'createCollection',\n DROP_COLLECTION = 'dropCollection',\n LIST_COLLECTIONS = 'listCollections',\n\n // Database operations\n STATS = 'stats',\n HEALTH = 'health',\n}\n\n/**\n * Legacy RPC request interface (message-based)\n */\nexport interface LegacyRpcRequest {\n type: MessageType\n collection?: string\n payload: unknown\n}\n\n/**\n * Legacy RPC response interface\n */\nexport interface LegacyRpcResponse<T = unknown> {\n success: boolean\n data?: T\n error?: {\n code: string\n message: string\n }\n}\n\n// ============================================================================\n// Database Reference Types\n// ============================================================================\n\n/**\n * Database reference returned by db() method\n */\nexport interface DatabaseRef {\n name: string\n stub: DurableObjectStub\n}\n\n/**\n * Collection reference returned by collection() method\n */\nexport interface CollectionRef {\n dbName: string\n collectionName: string\n stub: DurableObjectStub\n}\n\n// ============================================================================\n// Batched Executor Types\n// ============================================================================\n\n/**\n * Batched executor options\n */\nexport interface BatchedExecutorOptions {\n maxBatchSize?: number\n flushInterval?: number\n}\n\n/**\n * Pipelined operation reference\n */\nexport interface PipelineOp {\n id: string\n method: string\n params: unknown[]\n dependencies: string[]\n}\n\n// ============================================================================\n// RPC Client Types\n// ============================================================================\n\n/**\n * RPC client options\n */\nexport interface RpcClientOptions {\n /** Enable automatic reconnection */\n autoReconnect?: boolean\n /** Maximum retry attempts */\n maxRetries?: number\n /** Reconnect interval in milliseconds */\n reconnectInterval?: number\n /** Enable request deduplication */\n deduplicate?: boolean\n /** Deduplication TTL in milliseconds */\n deduplicationTtl?: number\n /** Request timeout in milliseconds */\n timeout?: number\n}\n\n/**\n * Options for request deduplicator\n */\nexport interface DeduplicatorOptions {\n ttl?: number\n}\n\n/**\n * Event handler type\n */\nexport type EventHandler<T = unknown> = (event: T) => void\n\n/**\n * Reconnect event data\n */\nexport interface ReconnectEvent {\n attempt: number\n lastError?: Error\n}\n\n// ============================================================================\n// RPC Handler Types\n// ============================================================================\n\n/**\n * RPC Handler interface\n */\nexport interface RpcHandler {\n fetch(request: Request): Promise<Response>\n}\n\n// ============================================================================\n// MongoDB Error Codes\n// ============================================================================\n\n/**\n * MongoDB-compatible error codes\n */\nexport const ErrorCode = {\n OK: 0,\n INTERNAL_ERROR: 1,\n BAD_VALUE: 2,\n NO_SUCH_KEY: 4,\n GRAPH_CONTAINS_CYCLE: 5,\n HOST_UNREACHABLE: 6,\n HOST_NOT_FOUND: 7,\n UNKNOWN_ERROR: 8,\n FAILED_TO_PARSE: 9,\n CANNOT_MUTATE_OBJECT: 10,\n USER_NOT_FOUND: 11,\n UNSUPPORTED_FORMAT: 12,\n UNAUTHORIZED: 13,\n TYPE_MISMATCH: 14,\n OVERFLOW: 15,\n INVALID_LENGTH: 16,\n PROTOCOL_ERROR: 17,\n AUTHENTICATION_FAILED: 18,\n CANNOT_REUSE_OBJECT: 19,\n ILLEGAL_OPERATION: 20,\n EMPTY_ARRAY_OPERATION: 21,\n INVALID_BSON: 22,\n ALREADY_INITIALIZED: 23,\n LOCK_TIMEOUT: 24,\n REMOTE_VALIDATION_ERROR: 25,\n NAMESPACE_NOT_FOUND: 26,\n INDEX_NOT_FOUND: 27,\n PATH_NOT_VIABLE: 28,\n NON_EXISTENT_PATH: 29,\n INVALID_PATH: 30,\n ROLE_NOT_FOUND: 31,\n ROLES_NOT_RELATED: 32,\n PRIVILEGE_NOT_FOUND: 33,\n CANNOT_BACKFILL_ARRAY: 34,\n COMMAND_NOT_FOUND: 59,\n DATABASE_NOT_FOUND: 60,\n LOCATION_ERROR: 16755,\n DUPLICATE_KEY: 11000,\n} as const\n\nexport type ErrorCodeValue = (typeof ErrorCode)[keyof typeof ErrorCode]\n\n/**\n * Get the code name for an error code\n */\nexport function getErrorCodeName(code: number): string {\n for (const [name, value] of Object.entries(ErrorCode)) {\n if (value === code) {\n return name\n .split('_')\n .map((word) => word.charAt(0) + word.slice(1).toLowerCase())\n .join('')\n }\n }\n return 'UnknownError'\n}\n\n// ============================================================================\n// Response Helper Functions\n// ============================================================================\n\n/**\n * Create a success response (Document format for wire protocol)\n */\nexport function successResponse(data: Record<string, unknown> = {}): Record<string, unknown> {\n return { ok: 1, ...data }\n}\n\n/**\n * Create an error response (Document format for wire protocol)\n */\nexport function errorResponse(\n code: number,\n errmsg: string,\n codeName?: string\n): Record<string, unknown> {\n return {\n ok: 0,\n code,\n codeName: codeName || getErrorCodeName(code),\n errmsg,\n }\n}\n\n/**\n * Create a legacy success response\n */\nexport function legacySuccessResponse<T>(data: T): LegacyRpcResponse<T> {\n return { success: true, data }\n}\n\n/**\n * Create a legacy error response\n */\nexport function legacyErrorResponse(code: string, message: string): LegacyRpcResponse<never> {\n return { success: false, error: { code, message } }\n}\n","/**\n * mongo.do - MongoDB-compatible database backed by Cloudflare Durable Objects SQLite\n *\n * Main entry point for the package.\n */\n\n// Types\nexport { ObjectId } from './types/objectid';\n\n// Durable Object\nexport { MondoDatabase } from './durable-object/mondo-database';\nexport { SchemaManager, SCHEMA_VERSION, SCHEMA_TABLES } from './durable-object/schema';\nexport {\n IndexManager,\n generateIndexName,\n generateSQLiteIndexName,\n buildCreateIndexSQL,\n} from './durable-object/index-manager';\nexport type { SQLStorage, SQLStatement } from './durable-object/index-manager';\n\n// Index types\nexport type {\n IndexSpec,\n CreateIndexOptions,\n CreateIndexResult,\n IndexInfo,\n DropIndexResult,\n} from './types';\n\n// Client collection with index support\nexport { MongoCollection } from './client/mongo-collection';\n\n// Consolidated RPC Types (from types/rpc.ts)\nexport {\n // Error codes and helpers\n ErrorCode,\n getErrorCodeName,\n successResponse,\n errorResponse,\n legacySuccessResponse,\n legacyErrorResponse,\n // Legacy RPC message types\n MessageType,\n} from './types/rpc';\n\nexport type {\n // Cloudflare types\n DurableObjectNamespace,\n DurableObjectId,\n DurableObjectStub,\n // Environment types\n MondoEnv,\n // Worker loader types\n WorkerLoader,\n WorkerCode,\n WorkerStub,\n WorkerEntrypoint as WorkerEntrypointType,\n // JSON-RPC style types\n RpcRequest,\n RpcResponse,\n BatchResponse,\n // HTTP RPC types\n HttpRpcRequest,\n HttpRpcSuccessResponse,\n HttpRpcErrorResponse,\n HttpRpcResponse,\n // Legacy RPC types\n LegacyRpcRequest,\n LegacyRpcResponse,\n // Database reference types\n DatabaseRef,\n CollectionRef,\n // Batched executor types\n BatchedExecutorOptions,\n PipelineOp,\n // RPC client types\n RpcClientOptions,\n DeduplicatorOptions,\n EventHandler,\n ReconnectEvent,\n // RPC handler types\n RpcHandler,\n ErrorCodeValue,\n} from './types/rpc';\n\n// RPC Server (classes and functions)\nexport {\n RpcTarget,\n MondoRpcTarget,\n newWorkersRpcResponse,\n BatchedRpcExecutor,\n PipelineTracker,\n PipelinedRpcProxy,\n} from './rpc/rpc-target';\n\n// Backward compatibility: re-export RpcMondoEnv alias\nexport type { MondoEnv as RpcMondoEnv } from './types/rpc';\n\n// RPC Client (classes)\nexport {\n RpcClient,\n MongoClient,\n WebSocketRpcTransport,\n RequestDeduplicator,\n} from './rpc/rpc-client';\n\n// Worker Entrypoint\nexport {\n WorkerEntrypoint,\n MondoEntrypoint,\n validateEnv,\n isMondoEnv,\n DEFAULT_OPTIONS,\n} from './rpc/worker-entrypoint';\n\nexport type {\n ExecutionContext,\n MondoBindings,\n MondoEntrypointOptions,\n} from './rpc/worker-entrypoint';\n\n// Default export for Workers\nexport { MondoEntrypoint as default } from './rpc/worker-entrypoint';\n","/**\n * RPC Client - Client-side RPC handler for capnweb-style Workers RPC\n *\n * Implements:\n * - HTTP batch protocol\n * - WebSocket sessions\n * - Auto-reconnection\n * - Request deduplication\n */\n\nimport type {\n RpcClientOptions,\n RpcRequest,\n RpcResponse,\n BatchResponse,\n EventHandler,\n ReconnectEvent,\n DeduplicatorOptions,\n} from '../types/rpc'\n\n// Re-export types for backward compatibility\nexport type {\n RpcClientOptions,\n RpcRequest,\n RpcResponse,\n BatchResponse,\n EventHandler,\n ReconnectEvent,\n DeduplicatorOptions,\n}\n\n/**\n * Deduplicates identical concurrent requests\n */\nexport class RequestDeduplicator {\n private cache: Map<string, { promise: Promise<unknown>; timestamp: number }> = new Map();\n private ttl: number;\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: DeduplicatorOptions = {}) {\n this.ttl = options.ttl ?? 1000;\n this.startCleanup();\n }\n\n /**\n * Start the cleanup interval\n */\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n this.cleanup();\n }, this.ttl);\n }\n\n /**\n * Stop the cleanup interval\n */\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n }\n\n /**\n * Clean up expired entries\n */\n private cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.cache) {\n if (now - entry.timestamp > this.ttl) {\n this.cache.delete(key);\n }\n }\n }\n\n /**\n * Check if a key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n if (Date.now() - entry.timestamp > this.ttl) {\n this.cache.delete(key);\n return false;\n }\n return true;\n }\n\n /**\n * Get a cached promise\n */\n get(key: string): Promise<unknown> | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n if (Date.now() - entry.timestamp > this.ttl) {\n this.cache.delete(key);\n return undefined;\n }\n return entry.promise;\n }\n\n /**\n * Set a promise for a key\n */\n set(key: string, promise: Promise<unknown>): void {\n this.cache.set(key, { promise, timestamp: Date.now() });\n }\n\n /**\n * Generate a cache key from method and params\n */\n static generateKey(method: string, params: unknown[]): string {\n return `${method}:${JSON.stringify(params)}`;\n }\n}\n\n// ============================================================================\n// WebSocket RPC Transport\n// ============================================================================\n\n/**\n * WebSocket-based RPC transport\n */\nexport class WebSocketRpcTransport {\n private ws: WebSocket;\n private messageId = 0;\n private pending: Map<string, { resolve: (value: unknown) => void; reject: (error: Error) => void; timeout: ReturnType<typeof setTimeout> }> = new Map();\n private messageHandlers: Set<(message: unknown) => void> = new Set();\n private options: { timeout?: number };\n\n constructor(ws: WebSocket, options?: { timeout?: number }) {\n this.ws = ws;\n this.options = options ?? {};\n this.setupMessageHandler();\n }\n\n /**\n * Set up the WebSocket message handler\n */\n private setupMessageHandler(): void {\n this.ws.addEventListener('message', (event) => {\n try {\n const data = JSON.parse(event.data as string);\n this.handleMessage(data);\n } catch {\n // Ignore parse errors\n }\n });\n }\n\n /**\n * Handle incoming message\n */\n private handleMessage(data: RpcResponse): void {\n // Notify all message handlers\n this.messageHandlers.forEach((handler) => handler(data));\n\n // Resolve pending requests\n if (data.id) {\n const pending = this.pending.get(data.id);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pending.delete(data.id);\n if (data.error) {\n pending.reject(new Error(data.error));\n } else {\n pending.resolve(data.result);\n }\n }\n }\n }\n\n /**\n * Send a request over WebSocket\n */\n send(request: Omit<RpcRequest, 'id'>): Promise<unknown> {\n const id = String(++this.messageId);\n const fullRequest: RpcRequest = { ...request, id };\n\n return new Promise((resolve, reject) => {\n if (this.ws.readyState !== WebSocket.OPEN) {\n reject(new Error('WebSocket is not open'));\n return;\n }\n\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error('Request timeout'));\n }, this.options?.timeout ?? 30000);\n\n this.pending.set(id, { resolve, reject, timeout });\n this.ws.send(JSON.stringify(fullRequest));\n });\n }\n\n /**\n * Add a message handler for streaming responses\n */\n onMessage(handler: (message: unknown) => void): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n /**\n * Close the connection\n */\n close(): void {\n this.ws.close();\n }\n\n /**\n * Get connection state\n */\n get readyState(): number {\n return this.ws.readyState;\n }\n}\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nlet requestIdCounter = 0;\n\n/**\n * RPC client for connecting to Mondo workers\n */\nexport class RpcClient {\n private url: string;\n readonly options: Required<RpcClientOptions>;\n readonly transport: 'http' | 'websocket';\n\n private eventHandlers: Map<string, Set<EventHandler>> = new Map();\n private batchMode = false;\n private batchQueue: Array<{\n request: RpcRequest;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n }> = [];\n private deduplicator: RequestDeduplicator | null = null;\n private wsTransport: WebSocketRpcTransport | null = null;\n\n constructor(url: string, options: RpcClientOptions = {}) {\n this.url = url;\n this.options = {\n autoReconnect: options.autoReconnect ?? false,\n maxRetries: options.maxRetries ?? 3,\n reconnectInterval: options.reconnectInterval ?? 1000,\n deduplicate: options.deduplicate ?? false,\n deduplicationTtl: options.deduplicationTtl ?? 1000,\n timeout: options.timeout ?? 30000,\n };\n\n // Determine transport based on URL\n this.transport = url.startsWith('ws://') || url.startsWith('wss://') ? 'websocket' : 'http';\n\n // Set up deduplication if enabled\n if (this.options.deduplicate) {\n this.deduplicator = new RequestDeduplicator({ ttl: this.options.deduplicationTtl });\n }\n }\n\n /**\n * Make an RPC call\n */\n async call(method: string, params: unknown[]): Promise<unknown> {\n const request: RpcRequest = {\n id: String(++requestIdCounter),\n method,\n params,\n };\n\n // Check deduplication cache\n if (this.deduplicator) {\n const key = RequestDeduplicator.generateKey(method, params);\n const cached = this.deduplicator.get(key);\n if (cached) {\n return cached;\n }\n\n const promise = this.executeCall(request);\n this.deduplicator.set(key, promise);\n return promise;\n }\n\n return this.executeCall(request);\n }\n\n /**\n * Execute the actual RPC call\n */\n private async executeCall(request: RpcRequest): Promise<unknown> {\n // If in batch mode, queue the request\n if (this.batchMode) {\n return new Promise((resolve, reject) => {\n this.batchQueue.push({ request, resolve, reject });\n });\n }\n\n // Use WebSocket transport if available\n if (this.transport === 'websocket' && this.wsTransport) {\n return this.wsTransport.send(request);\n }\n\n // HTTP transport with retry logic\n return this.executeWithRetry(request);\n }\n\n /**\n * Execute with retry logic\n */\n private async executeWithRetry(request: RpcRequest, attempt = 1): Promise<unknown> {\n try {\n const response = await fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n signal: AbortSignal.timeout(this.options.timeout),\n });\n\n const data = await response.json() as RpcResponse;\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n return data.result ?? data;\n } catch (error) {\n if (this.options.autoReconnect && attempt < this.options.maxRetries) {\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, this.options.reconnectInterval));\n this.emit('reconnect', { attempt });\n return this.executeWithRetry(request, attempt + 1);\n }\n throw error;\n }\n }\n\n /**\n * Start batch mode\n */\n startBatch(): void {\n this.batchMode = true;\n this.batchQueue = [];\n }\n\n /**\n * End batch mode and send all queued requests\n */\n async endBatch(): Promise<void> {\n this.batchMode = false;\n\n if (this.batchQueue.length === 0) {\n return;\n }\n\n const batch = [...this.batchQueue];\n this.batchQueue = [];\n\n try {\n const response = await fetch(`${this.url}/batch`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch.map((item) => item.request)),\n signal: AbortSignal.timeout(this.options.timeout),\n });\n\n const data = await response.json() as BatchResponse;\n\n batch.forEach((item, index) => {\n const result = data.results[index];\n if (result) {\n if (result.error) {\n item.reject(new Error(result.error));\n } else {\n item.resolve(result.result);\n }\n } else {\n item.reject(new Error('Missing result for batch item'));\n }\n });\n } catch (error) {\n // Reject all queued requests\n batch.forEach((item) => {\n item.reject(error instanceof Error ? error : new Error('Unknown error'));\n });\n }\n }\n\n /**\n * Register an event handler\n */\n on<T = unknown>(event: string, handler: EventHandler<T>): void {\n let handlers = this.eventHandlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this.eventHandlers.set(event, handlers);\n }\n handlers.add(handler as EventHandler);\n }\n\n /**\n * Remove an event handler\n */\n off<T = unknown>(event: string, handler: EventHandler<T>): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Emit an event\n */\n emit<T = unknown>(event: string, data: T): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach((handler) => handler(data));\n }\n }\n\n /**\n * Connect via WebSocket\n */\n async connectWebSocket(): Promise<void> {\n if (this.transport !== 'websocket') {\n throw new Error('Cannot connect WebSocket for HTTP transport');\n }\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(this.url);\n\n ws.addEventListener('open', () => {\n this.wsTransport = new WebSocketRpcTransport(ws, { timeout: this.options.timeout });\n resolve();\n });\n\n ws.addEventListener('error', (_event) => {\n reject(new Error('WebSocket connection failed'));\n });\n\n ws.addEventListener('close', () => {\n this.wsTransport = null;\n if (this.options.autoReconnect) {\n setTimeout(() => this.connectWebSocket(), this.options.reconnectInterval);\n }\n });\n });\n }\n\n /**\n * Close the client connection\n */\n close(): void {\n if (this.wsTransport) {\n this.wsTransport.close();\n this.wsTransport = null;\n }\n if (this.deduplicator) {\n this.deduplicator.destroy();\n this.deduplicator = null;\n }\n }\n}\n\n// ============================================================================\n// MongoClient wrapper\n// ============================================================================\n\n/**\n * MongoDB-compatible client wrapper over RPC\n */\nexport class MongoClient {\n private client: RpcClient;\n private isConnected = false;\n private dbName: string | null = null;\n\n constructor(url: string, options: RpcClientOptions = {}) {\n // Convert MongoDB URL to RPC endpoint URL\n const rpcUrl = this.parseMongoUrl(url);\n this.client = new RpcClient(rpcUrl, options);\n }\n\n /**\n * Parse MongoDB URL to extract RPC endpoint\n */\n private parseMongoUrl(url: string): string {\n // Extract host from mongodb:// URL\n const parsed = new URL(url.replace('mongodb://', 'http://'));\n this.dbName = parsed.pathname.slice(1) || null;\n return `http://${parsed.host}/rpc`;\n }\n\n /**\n * Connect to the database\n */\n async connect(): Promise<MongoClient> {\n if (!this.dbName) {\n throw new Error('No database specified in connection string');\n }\n await this.client.call('connect', [`mongodb://localhost/${this.dbName}`]);\n this.isConnected = true;\n return this;\n }\n\n /**\n * Get a database reference\n */\n db(name?: string): Database {\n const dbName = name || this.dbName;\n if (!dbName) {\n throw new Error('No database specified');\n }\n return new Database(this.client, dbName);\n }\n\n /**\n * Close the connection\n */\n close(): void {\n this.client.close();\n this.isConnected = false;\n }\n\n /**\n * Check if connected\n */\n get connected(): boolean {\n return this.isConnected;\n }\n}\n\n/**\n * Database reference\n */\nclass Database {\n private client: RpcClient;\n private name: string;\n\n constructor(client: RpcClient, name: string) {\n this.client = client;\n this.name = name;\n }\n\n /**\n * Get a collection reference\n */\n collection(name: string): Collection {\n return new Collection(this.client, this.name, name);\n }\n}\n\n/**\n * RPC Find Cursor - Simple cursor for RPC-based find operations\n */\nclass RpcFindCursor<T = unknown> {\n private client: RpcClient;\n private dbName: string;\n private collectionName: string;\n private query: Record<string, unknown>;\n private _sort?: Record<string, 1 | -1>;\n private _limit?: number;\n private _skip?: number;\n private _projection?: Record<string, 0 | 1>;\n private _buffer: T[] = [];\n private _position: number = 0;\n private _fetched: boolean = false;\n private _closed: boolean = false;\n\n constructor(\n client: RpcClient,\n dbName: string,\n collectionName: string,\n query: Record<string, unknown> = {}\n ) {\n this.client = client;\n this.dbName = dbName;\n this.collectionName = collectionName;\n this.query = query;\n }\n\n get closed(): boolean {\n return this._closed;\n }\n\n sort(spec: Record<string, 1 | -1>): this {\n this._sort = spec;\n return this;\n }\n\n limit(count: number): this {\n if (count < 0) throw new Error('Limit must be non-negative');\n this._limit = count;\n return this;\n }\n\n skip(count: number): this {\n if (count < 0) throw new Error('Skip must be non-negative');\n this._skip = count;\n return this;\n }\n\n project(spec: Record<string, 0 | 1>): this {\n this._projection = spec;\n return this;\n }\n\n private async ensureFetched(): Promise<void> {\n if (this._fetched || this._closed) return;\n\n const options: Record<string, unknown> = {};\n if (this._sort) options.sort = this._sort;\n if (this._limit !== undefined) options.limit = this._limit;\n if (this._skip !== undefined) options.skip = this._skip;\n if (this._projection) options.projection = this._projection;\n\n this._buffer = await this.client.call('find', [\n this.dbName,\n this.collectionName,\n this.query,\n options\n ]) as T[];\n this._fetched = true;\n }\n\n async next(): Promise<T | null> {\n if (this._closed) return null;\n await this.ensureFetched();\n if (this._position >= this._buffer.length) return null;\n return this._buffer[this._position++] ?? null;\n }\n\n async hasNext(): Promise<boolean> {\n if (this._closed) return false;\n await this.ensureFetched();\n return this._position < this._buffer.length;\n }\n\n async toArray(): Promise<T[]> {\n if (this._closed) return [];\n await this.ensureFetched();\n const remaining = this._buffer.slice(this._position);\n this._position = this._buffer.length;\n await this.close();\n return remaining;\n }\n\n async forEach(callback: (doc: T, index: number) => void | false | Promise<void | false>): Promise<void> {\n if (this._closed) return;\n await this.ensureFetched();\n let index = 0;\n while (this._position < this._buffer.length) {\n const doc = this._buffer[this._position++];\n if (doc !== undefined) {\n const result = await callback(doc, index++);\n if (result === false) break;\n }\n }\n }\n\n async count(): Promise<number> {\n await this.ensureFetched();\n return this._buffer.length - this._position;\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n this._buffer = [];\n this._position = 0;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n try {\n while (await this.hasNext()) {\n const doc = await this.next();\n if (doc !== null) yield doc;\n }\n } finally {\n await this.close();\n }\n }\n}\n\n/**\n * RPC Aggregation Cursor - Simple cursor for RPC-based aggregate operations\n */\nclass RpcAggregationCursor<T = unknown> {\n private client: RpcClient;\n private dbName: string;\n private collectionName: string;\n private pipeline: unknown[];\n private options: Record<string, unknown>;\n private _buffer: T[] = [];\n private _position: number = 0;\n private _fetched: boolean = false;\n private _closed: boolean = false;\n\n constructor(\n client: RpcClient,\n dbName: string,\n collectionName: string,\n pipeline: unknown[] = [],\n options: Record<string, unknown> = {}\n ) {\n this.client = client;\n this.dbName = dbName;\n this.collectionName = collectionName;\n this.pipeline = pipeline;\n this.options = options;\n }\n\n get closed(): boolean {\n return this._closed;\n }\n\n private async ensureFetched(): Promise<void> {\n if (this._fetched || this._closed) return;\n this._buffer = await this.client.call('aggregate', [\n this.dbName,\n this.collectionName,\n this.pipeline,\n this.options\n ]) as T[];\n this._fetched = true;\n }\n\n async next(): Promise<T | null> {\n if (this._closed) return null;\n await this.ensureFetched();\n if (this._position >= this._buffer.length) return null;\n return this._buffer[this._position++] ?? null;\n }\n\n async hasNext(): Promise<boolean> {\n if (this._closed) return false;\n await this.ensureFetched();\n return this._position < this._buffer.length;\n }\n\n async toArray(): Promise<T[]> {\n if (this._closed) return [];\n await this.ensureFetched();\n const remaining = this._buffer.slice(this._position);\n this._position = this._buffer.length;\n await this.close();\n return remaining;\n }\n\n async forEach(callback: (doc: T, index: number) => void | false | Promise<void | false>): Promise<void> {\n if (this._closed) return;\n await this.ensureFetched();\n let index = 0;\n while (this._position < this._buffer.length) {\n const doc = this._buffer[this._position++];\n if (doc !== undefined) {\n const result = await callback(doc, index++);\n if (result === false) break;\n }\n }\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n this._buffer = [];\n this._position = 0;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n try {\n while (await this.hasNext()) {\n const doc = await this.next();\n if (doc !== null) yield doc;\n }\n } finally {\n await this.close();\n }\n }\n}\n\n/**\n * Collection reference\n */\nclass Collection {\n private client: RpcClient;\n private dbName: string;\n private collectionName: string;\n\n constructor(client: RpcClient, dbName: string, collectionName: string) {\n this.client = client;\n this.dbName = dbName;\n this.collectionName = collectionName;\n }\n\n /**\n * Find documents - returns a cursor\n */\n find(query: Record<string, unknown> = {}): RpcFindCursor {\n return new RpcFindCursor(this.client, this.dbName, this.collectionName, query);\n }\n\n /**\n * Find one document\n */\n async findOne(query: Record<string, unknown> = {}): Promise<unknown | null> {\n const cursor = this.find(query).limit(1);\n return cursor.next();\n }\n\n /**\n * Aggregate pipeline - returns a cursor\n */\n aggregate(pipeline: unknown[] = [], options: Record<string, unknown> = {}): RpcAggregationCursor {\n return new RpcAggregationCursor(this.client, this.dbName, this.collectionName, pipeline, options);\n }\n\n /**\n * Insert one document\n */\n async insertOne(document: Record<string, unknown>): Promise<{ insertedId: string }> {\n return this.client.call('insertOne', [this.dbName, this.collectionName, document]) as Promise<{ insertedId: string }>;\n }\n\n /**\n * Update one document\n */\n async updateOne(filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{ matchedCount: number; modifiedCount: number }> {\n return this.client.call('updateOne', [this.dbName, this.collectionName, filter, update]) as Promise<{ matchedCount: number; modifiedCount: number }>;\n }\n\n /**\n * Delete one document\n */\n async deleteOne(filter: Record<string, unknown>): Promise<{ deletedCount: number }> {\n return this.client.call('deleteOne', [this.dbName, this.collectionName, filter]) as Promise<{ deletedCount: number }>;\n }\n}\n","/**\n * Worker Entrypoint - Workers RPC service binding support\n *\n * Implements:\n * - MondoEntrypoint extending WorkerEntrypoint\n * - Service binding methods\n * - TypeScript declarations\n * - Environment safety\n */\n\nimport { MondoRpcTarget } from './rpc-target';\nimport type {\n DurableObjectNamespace,\n DurableObjectStub,\n DatabaseRef,\n CollectionRef,\n MondoEnv,\n WorkerLoader,\n WorkerCode,\n WorkerStub,\n} from '../types/rpc';\n\n// Re-export types for backward compatibility\nexport type {\n DurableObjectNamespace,\n DurableObjectStub,\n DatabaseRef,\n CollectionRef,\n MondoEnv,\n WorkerLoader,\n WorkerCode,\n WorkerStub,\n};\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\n/**\n * Execution context interface\n */\nexport interface ExecutionContext {\n waitUntil(promise: Promise<unknown>): void;\n passThroughOnException(): void;\n}\n\n/**\n * Mondo bindings interface (for service binding consumers)\n */\nexport interface MondoBindings {\n /** Connect to a MongoDB-compatible connection string */\n connect(connectionString: string): Promise<{ connected: boolean; database?: string }>;\n /** Get a database reference */\n db(name: string): Promise<DatabaseRef>;\n /** Get a collection reference */\n collection(dbName: string, collectionName: string): Promise<CollectionRef>;\n}\n\n/**\n * Default options for the entrypoint\n */\nexport const DEFAULT_OPTIONS = {\n /** Maximum batch size for batched operations */\n maxBatchSize: 100,\n /** Request timeout in milliseconds */\n timeout: 30000,\n /** Enable background cleanup */\n enableCleanup: true,\n /** Cleanup interval in milliseconds */\n cleanupInterval: 60000,\n} as const;\n\n/**\n * Entrypoint options\n */\nexport interface MondoEntrypointOptions {\n maxBatchSize?: number;\n timeout?: number;\n enableCleanup?: boolean;\n cleanupInterval?: number;\n}\n\n// ============================================================================\n// WorkerEntrypoint Base Class\n// ============================================================================\n\n/**\n * Base class for Worker entrypoints (capnweb-style)\n */\nexport class WorkerEntrypoint {\n protected ctx: ExecutionContext;\n protected env: unknown;\n\n constructor(ctx: ExecutionContext, env: unknown) {\n this.ctx = ctx;\n this.env = env;\n }\n\n /**\n * Handle HTTP fetch requests\n */\n async fetch(_request: Request): Promise<Response> {\n return new Response('Method not implemented', { status: 501 });\n }\n}\n\n// ============================================================================\n// Environment Validation\n// ============================================================================\n\n/**\n * Type guard for Mondo environment\n */\nexport function isMondoEnv(env: unknown): env is MondoEnv {\n if (!env || typeof env !== 'object') return false;\n const e = env as Record<string, unknown>;\n return (\n typeof e.MONDO_DATABASE === 'object' &&\n e.MONDO_DATABASE !== null &&\n typeof (e.MONDO_DATABASE as Record<string, unknown>).idFromName === 'function' &&\n typeof (e.MONDO_DATABASE as Record<string, unknown>).get === 'function'\n );\n}\n\n/**\n * Validate environment bindings\n */\nexport function validateEnv(env: unknown): boolean {\n return isMondoEnv(env);\n}\n\n// ============================================================================\n// MondoEntrypoint\n// ============================================================================\n\n/**\n * MondoEntrypoint extends WorkerEntrypoint for service binding support\n *\n * Usage in wrangler.toml:\n * ```toml\n * [[services]]\n * binding = \"MONDO\"\n * service = \"mongo.do\"\n * entrypoint = \"MondoEntrypoint\"\n * ```\n *\n * Usage in consuming worker:\n * ```typescript\n * const result = await env.MONDO.connect('mongodb://localhost/mydb');\n * ```\n */\nexport class MondoEntrypoint extends WorkerEntrypoint implements MondoBindings {\n protected override env: MondoEnv;\n private rpcTarget: MondoRpcTarget;\n private entrypointOptions: Required<MondoEntrypointOptions>;\n private cleanupScheduled = false;\n\n constructor(ctx: ExecutionContext, env: MondoEnv) {\n super(ctx, env);\n\n // Validate environment bindings\n if (!validateEnv(env)) {\n throw new Error(\n 'Invalid environment: MONDO_DATABASE binding is required. ' +\n 'Please configure the Durable Object binding in your wrangler.toml.'\n );\n }\n\n this.env = env;\n this.rpcTarget = new MondoRpcTarget(env);\n this.entrypointOptions = {\n maxBatchSize: DEFAULT_OPTIONS.maxBatchSize,\n timeout: DEFAULT_OPTIONS.timeout,\n enableCleanup: DEFAULT_OPTIONS.enableCleanup,\n cleanupInterval: DEFAULT_OPTIONS.cleanupInterval,\n };\n }\n\n /**\n * Get the entrypoint options\n */\n get options(): Required<MondoEntrypointOptions> {\n return this.entrypointOptions;\n }\n\n /**\n * Handle HTTP fetch requests\n */\n override async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url);\n\n // Health check endpoint\n if (url.pathname === '/health') {\n return new Response(JSON.stringify({ status: 'healthy' }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Bindings check endpoint (for diagnostics)\n if (url.pathname === '/bindings') {\n const bindings = {\n MONDO_DATABASE: !!this.env.MONDO_DATABASE,\n LOADER: !!this.env.LOADER,\n LOADER_type: this.env.LOADER ? typeof this.env.LOADER : 'undefined',\n LOADER_keys: this.env.LOADER ? Object.keys(this.env.LOADER as object) : [],\n };\n return new Response(JSON.stringify(bindings, null, 2), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // RPC endpoint\n if (url.pathname === '/rpc' || url.pathname.startsWith('/rpc/')) {\n const { newWorkersRpcResponse } = await import('./rpc-target');\n return newWorkersRpcResponse(this.rpcTarget, request);\n }\n\n return new Response('Not found', { status: 404 });\n }\n\n /**\n * Connect to a MongoDB-compatible connection string\n */\n async connect(connectionString: string): Promise<{ connected: boolean; database?: string }> {\n return this.rpcTarget.connect(connectionString);\n }\n\n /**\n * Get a database reference\n */\n async db(name: string): Promise<DatabaseRef> {\n return this.rpcTarget.db(name);\n }\n\n /**\n * Get a collection reference\n */\n async collection(dbName: string, collectionName: string): Promise<CollectionRef> {\n return this.rpcTarget.collection(dbName, collectionName);\n }\n\n /**\n * Execute a find operation\n */\n async find(dbName: string, collectionName: string, query: Record<string, unknown>): Promise<unknown[]> {\n return this.rpcTarget.find(dbName, collectionName, query);\n }\n\n /**\n * Execute an insertOne operation\n */\n async insertOne(dbName: string, collectionName: string, document: Record<string, unknown>): Promise<{ insertedId: string }> {\n return this.rpcTarget.insertOne(dbName, collectionName, document);\n }\n\n /**\n * Execute an updateOne operation\n */\n async updateOne(\n dbName: string,\n collectionName: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n return this.rpcTarget.updateOne(dbName, collectionName, filter, update);\n }\n\n /**\n * Execute a deleteOne operation\n */\n async deleteOne(dbName: string, collectionName: string, filter: Record<string, unknown>): Promise<{ deletedCount: number }> {\n return this.rpcTarget.deleteOne(dbName, collectionName, filter);\n }\n\n /**\n * Schedule background cleanup task\n */\n scheduleCleanup(): void {\n if (this.cleanupScheduled) return;\n this.cleanupScheduled = true;\n\n const cleanupPromise = this.runCleanup();\n this.ctx.waitUntil(cleanupPromise);\n }\n\n /**\n * Run cleanup task\n */\n private async runCleanup(): Promise<void> {\n // Placeholder for cleanup logic\n // Could include: clearing caches, closing stale connections, etc.\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n /**\n * Get the underlying RPC target (for testing)\n */\n getRpcTarget(): MondoRpcTarget {\n return this.rpcTarget;\n }\n}\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\nexport { MondoRpcTarget, newWorkersRpcResponse } from './rpc-target';\n// Note: All RPC types are consolidated in '../types/rpc' and re-exported at the top of this file.\n// The following types are re-exported from '../types/rpc' for convenience:\nexport type { DurableObjectId, RpcRequest, RpcResponse, BatchResponse } from '../types/rpc';\n"]}
|