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
|
@@ -1,1002 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local SQLite Backend
|
|
3
|
-
*
|
|
4
|
-
* Implements MondoBackend using Bun's native SQLite for local development.
|
|
5
|
-
* Simplified implementation for wire protocol server.
|
|
6
|
-
*/
|
|
7
|
-
import { Database } from 'bun:sqlite';
|
|
8
|
-
import { ObjectId } from 'bson';
|
|
9
|
-
import { validateFieldPath, safeJsonPath } from '../../utils/sql-safety.js';
|
|
10
|
-
import { sanitizeDatabaseName, validateCollectionName } from './validation.js';
|
|
11
|
-
// Re-export validation functions for backwards compatibility
|
|
12
|
-
export { sanitizeDatabaseName, validateCollectionName } from './validation.js';
|
|
13
|
-
/** Default batch size for cursor results */
|
|
14
|
-
const DEFAULT_BATCH_SIZE = 101;
|
|
15
|
-
/** Cursor timeout in milliseconds (10 minutes) */
|
|
16
|
-
const CURSOR_TIMEOUT_MS = 10 * 60 * 1000;
|
|
17
|
-
/**
|
|
18
|
-
* Local SQLite Backend
|
|
19
|
-
*/
|
|
20
|
-
export class LocalSQLiteBackend {
|
|
21
|
-
databases = new Map();
|
|
22
|
-
cursors = new Map();
|
|
23
|
-
nextCursorId = 1n;
|
|
24
|
-
dataDir;
|
|
25
|
-
constructor(dataDir = '.mongodo') {
|
|
26
|
-
this.dataDir = dataDir;
|
|
27
|
-
// Ensure data directory exists
|
|
28
|
-
const fs = require('fs');
|
|
29
|
-
if (!fs.existsSync(dataDir)) {
|
|
30
|
-
fs.mkdirSync(dataDir, { recursive: true });
|
|
31
|
-
}
|
|
32
|
-
// Start cursor cleanup interval
|
|
33
|
-
setInterval(() => this.cleanupExpiredCursors(), 60000);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Get or create a database connection
|
|
37
|
-
*/
|
|
38
|
-
getDatabase(name) {
|
|
39
|
-
// SECURITY: Validate database name to prevent path traversal attacks
|
|
40
|
-
const safeName = sanitizeDatabaseName(name);
|
|
41
|
-
let db = this.databases.get(safeName);
|
|
42
|
-
if (!db) {
|
|
43
|
-
const dbPath = `${this.dataDir}/${safeName}.sqlite`;
|
|
44
|
-
db = new Database(dbPath);
|
|
45
|
-
this.initializeSchema(db);
|
|
46
|
-
this.databases.set(safeName, db);
|
|
47
|
-
}
|
|
48
|
-
return db;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Initialize the database schema
|
|
52
|
-
*/
|
|
53
|
-
initializeSchema(db) {
|
|
54
|
-
db.exec(`
|
|
55
|
-
CREATE TABLE IF NOT EXISTS collections (
|
|
56
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
-
name TEXT NOT NULL UNIQUE,
|
|
58
|
-
options TEXT DEFAULT '{}'
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
CREATE TABLE IF NOT EXISTS documents (
|
|
62
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
63
|
-
collection_id INTEGER NOT NULL,
|
|
64
|
-
_id TEXT NOT NULL,
|
|
65
|
-
data TEXT NOT NULL DEFAULT '{}',
|
|
66
|
-
FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE,
|
|
67
|
-
UNIQUE(collection_id, _id)
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
CREATE INDEX IF NOT EXISTS idx_documents_id ON documents(_id);
|
|
71
|
-
CREATE INDEX IF NOT EXISTS idx_documents_collection_id ON documents(collection_id, _id);
|
|
72
|
-
|
|
73
|
-
CREATE TABLE IF NOT EXISTS indexes (
|
|
74
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
75
|
-
collection_id INTEGER NOT NULL,
|
|
76
|
-
name TEXT NOT NULL,
|
|
77
|
-
key TEXT NOT NULL,
|
|
78
|
-
options TEXT DEFAULT '{}',
|
|
79
|
-
FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE,
|
|
80
|
-
UNIQUE(collection_id, name)
|
|
81
|
-
);
|
|
82
|
-
`);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Get collection ID, creating collection if it doesn't exist
|
|
86
|
-
*/
|
|
87
|
-
getOrCreateCollectionId(db, name) {
|
|
88
|
-
// SECURITY: Validate collection name
|
|
89
|
-
const safeName = validateCollectionName(name);
|
|
90
|
-
const existing = db.query('SELECT id FROM collections WHERE name = ?').get(safeName);
|
|
91
|
-
if (existing) {
|
|
92
|
-
return existing.id;
|
|
93
|
-
}
|
|
94
|
-
const result = db.query('INSERT INTO collections (name) VALUES (?) RETURNING id').get(safeName);
|
|
95
|
-
return result.id;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Get collection ID or null if not found
|
|
99
|
-
*/
|
|
100
|
-
getCollectionId(db, name) {
|
|
101
|
-
// SECURITY: Validate collection name
|
|
102
|
-
const safeName = validateCollectionName(name);
|
|
103
|
-
const result = db.query('SELECT id FROM collections WHERE name = ?').get(safeName);
|
|
104
|
-
return result?.id ?? null;
|
|
105
|
-
}
|
|
106
|
-
// ============ Database Operations ============
|
|
107
|
-
async listDatabases() {
|
|
108
|
-
const fs = require('fs');
|
|
109
|
-
const path = require('path');
|
|
110
|
-
let files = [];
|
|
111
|
-
try {
|
|
112
|
-
files = fs.readdirSync(this.dataDir);
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
// Directory doesn't exist
|
|
116
|
-
}
|
|
117
|
-
const databases = [];
|
|
118
|
-
for (const file of files) {
|
|
119
|
-
if (file.endsWith('.sqlite')) {
|
|
120
|
-
const name = file.replace('.sqlite', '');
|
|
121
|
-
const filePath = path.join(this.dataDir, file);
|
|
122
|
-
const stats = fs.statSync(filePath);
|
|
123
|
-
databases.push({
|
|
124
|
-
name,
|
|
125
|
-
sizeOnDisk: stats.size,
|
|
126
|
-
empty: stats.size < 1000,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Always include admin database
|
|
131
|
-
if (!databases.find((d) => d.name === 'admin')) {
|
|
132
|
-
databases.unshift({ name: 'admin', sizeOnDisk: 0, empty: true });
|
|
133
|
-
}
|
|
134
|
-
return databases;
|
|
135
|
-
}
|
|
136
|
-
async createDatabase(name) {
|
|
137
|
-
this.getDatabase(name);
|
|
138
|
-
}
|
|
139
|
-
async dropDatabase(name) {
|
|
140
|
-
// SECURITY: Validate database name to prevent path traversal attacks
|
|
141
|
-
const safeName = sanitizeDatabaseName(name);
|
|
142
|
-
const db = this.databases.get(safeName);
|
|
143
|
-
if (db) {
|
|
144
|
-
db.close();
|
|
145
|
-
this.databases.delete(safeName);
|
|
146
|
-
}
|
|
147
|
-
const fs = require('fs');
|
|
148
|
-
const dbPath = `${this.dataDir}/${safeName}.sqlite`;
|
|
149
|
-
if (fs.existsSync(dbPath)) {
|
|
150
|
-
fs.unlinkSync(dbPath);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
async databaseExists(name) {
|
|
154
|
-
// SECURITY: Validate database name to prevent path traversal attacks
|
|
155
|
-
const safeName = sanitizeDatabaseName(name);
|
|
156
|
-
const fs = require('fs');
|
|
157
|
-
return fs.existsSync(`${this.dataDir}/${safeName}.sqlite`);
|
|
158
|
-
}
|
|
159
|
-
// ============ Collection Operations ============
|
|
160
|
-
async listCollections(dbName, filter) {
|
|
161
|
-
const db = this.getDatabase(dbName);
|
|
162
|
-
let query = 'SELECT name, options FROM collections';
|
|
163
|
-
const params = [];
|
|
164
|
-
if (filter?.name && typeof filter.name === 'string') {
|
|
165
|
-
query += ' WHERE name = ?';
|
|
166
|
-
params.push(filter.name);
|
|
167
|
-
}
|
|
168
|
-
const rows = db.query(query).all(...params);
|
|
169
|
-
return rows.map((row) => ({
|
|
170
|
-
name: row.name,
|
|
171
|
-
type: 'collection',
|
|
172
|
-
options: JSON.parse(row.options),
|
|
173
|
-
info: { readOnly: false },
|
|
174
|
-
}));
|
|
175
|
-
}
|
|
176
|
-
async createCollection(dbName, name, options) {
|
|
177
|
-
// SECURITY: Validate collection name
|
|
178
|
-
const safeName = validateCollectionName(name);
|
|
179
|
-
const db = this.getDatabase(dbName);
|
|
180
|
-
const optionsJson = JSON.stringify(options || {});
|
|
181
|
-
db.query('INSERT OR IGNORE INTO collections (name, options) VALUES (?, ?)').run(safeName, optionsJson);
|
|
182
|
-
}
|
|
183
|
-
async dropCollection(dbName, name) {
|
|
184
|
-
// SECURITY: Validate collection name
|
|
185
|
-
const safeName = validateCollectionName(name);
|
|
186
|
-
const db = this.getDatabase(dbName);
|
|
187
|
-
db.query('DELETE FROM collections WHERE name = ?').run(safeName);
|
|
188
|
-
}
|
|
189
|
-
async collectionExists(dbName, name) {
|
|
190
|
-
// SECURITY: Validate collection name
|
|
191
|
-
const safeName = validateCollectionName(name);
|
|
192
|
-
const db = this.getDatabase(dbName);
|
|
193
|
-
const result = db.query('SELECT 1 FROM collections WHERE name = ? LIMIT 1').get(safeName);
|
|
194
|
-
return result !== null;
|
|
195
|
-
}
|
|
196
|
-
async collStats(dbName, collection) {
|
|
197
|
-
const db = this.getDatabase(dbName);
|
|
198
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
199
|
-
if (!collectionId) {
|
|
200
|
-
return {
|
|
201
|
-
ns: `${dbName}.${collection}`,
|
|
202
|
-
count: 0,
|
|
203
|
-
size: 0,
|
|
204
|
-
avgObjSize: 0,
|
|
205
|
-
storageSize: 0,
|
|
206
|
-
totalIndexSize: 0,
|
|
207
|
-
nindexes: 1,
|
|
208
|
-
indexSizes: { _id_: 0 },
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
const stats = db
|
|
212
|
-
.query(`
|
|
213
|
-
SELECT COUNT(*) as count, COALESCE(SUM(LENGTH(data)), 0) as size
|
|
214
|
-
FROM documents WHERE collection_id = ?
|
|
215
|
-
`)
|
|
216
|
-
.get(collectionId);
|
|
217
|
-
return {
|
|
218
|
-
ns: `${dbName}.${collection}`,
|
|
219
|
-
count: stats.count,
|
|
220
|
-
size: stats.size,
|
|
221
|
-
avgObjSize: stats.count > 0 ? stats.size / stats.count : 0,
|
|
222
|
-
storageSize: stats.size,
|
|
223
|
-
totalIndexSize: stats.count * 50,
|
|
224
|
-
nindexes: 1,
|
|
225
|
-
indexSizes: { _id_: stats.count * 50 },
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
async dbStats(dbName) {
|
|
229
|
-
const db = this.getDatabase(dbName);
|
|
230
|
-
const collectionStats = db
|
|
231
|
-
.query('SELECT COUNT(DISTINCT id) as collections FROM collections')
|
|
232
|
-
.get();
|
|
233
|
-
const docStats = db
|
|
234
|
-
.query('SELECT COUNT(*) as objects, COALESCE(SUM(LENGTH(data)), 0) as dataSize FROM documents')
|
|
235
|
-
.get();
|
|
236
|
-
return {
|
|
237
|
-
db: dbName,
|
|
238
|
-
collections: collectionStats.collections,
|
|
239
|
-
views: 0,
|
|
240
|
-
objects: docStats.objects,
|
|
241
|
-
avgObjSize: docStats.objects > 0 ? docStats.dataSize / docStats.objects : 0,
|
|
242
|
-
dataSize: docStats.dataSize,
|
|
243
|
-
storageSize: docStats.dataSize,
|
|
244
|
-
indexes: collectionStats.collections,
|
|
245
|
-
indexSize: docStats.objects * 50,
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
// ============ CRUD Operations ============
|
|
249
|
-
async find(dbName, collection, options) {
|
|
250
|
-
const db = this.getDatabase(dbName);
|
|
251
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
252
|
-
if (!collectionId) {
|
|
253
|
-
return { documents: [], cursorId: 0n, hasMore: false };
|
|
254
|
-
}
|
|
255
|
-
let sql = 'SELECT _id, data FROM documents WHERE collection_id = ?';
|
|
256
|
-
const params = [collectionId];
|
|
257
|
-
// Build filter (simplified)
|
|
258
|
-
if (options.filter && Object.keys(options.filter).length > 0) {
|
|
259
|
-
const filterSql = this.buildFilterSql(options.filter, params);
|
|
260
|
-
if (filterSql) {
|
|
261
|
-
sql += ` AND (${filterSql})`;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
// Add sorting
|
|
265
|
-
if (options.sort) {
|
|
266
|
-
const sortClauses = [];
|
|
267
|
-
for (const [field, direction] of Object.entries(options.sort)) {
|
|
268
|
-
const dir = direction === -1 ? 'DESC' : 'ASC';
|
|
269
|
-
if (field === '_id') {
|
|
270
|
-
sortClauses.push(`_id ${dir}`);
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
// Validate field name to prevent SQL injection
|
|
274
|
-
const safePath = safeJsonPath(validateFieldPath(field));
|
|
275
|
-
sortClauses.push(`json_extract(data, '${safePath}') ${dir}`);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
if (sortClauses.length > 0) {
|
|
279
|
-
sql += ` ORDER BY ${sortClauses.join(', ')}`;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
// Add limit and offset
|
|
283
|
-
if (options.limit && options.limit > 0) {
|
|
284
|
-
sql += ` LIMIT ${options.limit}`;
|
|
285
|
-
}
|
|
286
|
-
if (options.skip && options.skip > 0) {
|
|
287
|
-
sql += ` OFFSET ${options.skip}`;
|
|
288
|
-
}
|
|
289
|
-
const rows = db.query(sql).all(...params);
|
|
290
|
-
let documents = rows.map((row) => {
|
|
291
|
-
const doc = JSON.parse(row.data);
|
|
292
|
-
doc._id = this.parseId(row._id);
|
|
293
|
-
return doc;
|
|
294
|
-
});
|
|
295
|
-
// Apply projection
|
|
296
|
-
if (options.projection) {
|
|
297
|
-
documents = documents.map((doc) => this.applyProjection(doc, options.projection));
|
|
298
|
-
}
|
|
299
|
-
const batchSize = options.batchSize || DEFAULT_BATCH_SIZE;
|
|
300
|
-
// Handle cursor for large result sets
|
|
301
|
-
if (documents.length > batchSize) {
|
|
302
|
-
const cursorId = this.nextCursorId++;
|
|
303
|
-
this.cursors.set(cursorId, {
|
|
304
|
-
id: cursorId,
|
|
305
|
-
namespace: `${dbName}.${collection}`,
|
|
306
|
-
documents,
|
|
307
|
-
position: batchSize,
|
|
308
|
-
batchSize,
|
|
309
|
-
createdAt: Date.now(),
|
|
310
|
-
});
|
|
311
|
-
return {
|
|
312
|
-
documents: documents.slice(0, batchSize),
|
|
313
|
-
cursorId,
|
|
314
|
-
hasMore: true,
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
return { documents, cursorId: 0n, hasMore: false };
|
|
318
|
-
}
|
|
319
|
-
async insertOne(dbName, collection, doc) {
|
|
320
|
-
return this.insertMany(dbName, collection, [doc]);
|
|
321
|
-
}
|
|
322
|
-
async insertMany(dbName, collection, docs) {
|
|
323
|
-
const db = this.getDatabase(dbName);
|
|
324
|
-
const collectionId = this.getOrCreateCollectionId(db, collection);
|
|
325
|
-
const insertedIds = new Map();
|
|
326
|
-
let insertedCount = 0;
|
|
327
|
-
const stmt = db.prepare('INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, ?)');
|
|
328
|
-
db.transaction(() => {
|
|
329
|
-
for (let i = 0; i < docs.length; i++) {
|
|
330
|
-
const doc = { ...docs[i] };
|
|
331
|
-
if (!doc._id) {
|
|
332
|
-
doc._id = new ObjectId();
|
|
333
|
-
}
|
|
334
|
-
const idStr = this.serializeId(doc._id);
|
|
335
|
-
const dataJson = JSON.stringify(doc);
|
|
336
|
-
stmt.run(collectionId, idStr, dataJson);
|
|
337
|
-
insertedIds.set(i, doc._id);
|
|
338
|
-
insertedCount++;
|
|
339
|
-
}
|
|
340
|
-
})();
|
|
341
|
-
return { acknowledged: true, insertedIds, insertedCount };
|
|
342
|
-
}
|
|
343
|
-
async updateOne(dbName, collection, filter, update, options) {
|
|
344
|
-
const db = this.getDatabase(dbName);
|
|
345
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
346
|
-
if (!collectionId && !options?.upsert) {
|
|
347
|
-
return { acknowledged: true, matchedCount: 0, modifiedCount: 0, upsertedCount: 0 };
|
|
348
|
-
}
|
|
349
|
-
// Find the document
|
|
350
|
-
let sql = 'SELECT id, _id, data FROM documents WHERE collection_id = ?';
|
|
351
|
-
const params = [collectionId || 0];
|
|
352
|
-
const filterSql = this.buildFilterSql(filter, params);
|
|
353
|
-
if (filterSql) {
|
|
354
|
-
sql += ` AND (${filterSql})`;
|
|
355
|
-
}
|
|
356
|
-
sql += ' LIMIT 1';
|
|
357
|
-
const row = db.query(sql).get(...params);
|
|
358
|
-
if (!row) {
|
|
359
|
-
if (options?.upsert) {
|
|
360
|
-
const cid = this.getOrCreateCollectionId(db, collection);
|
|
361
|
-
const newDoc = { ...filter };
|
|
362
|
-
const updatedDoc = this.applyUpdate(newDoc, update);
|
|
363
|
-
if (!updatedDoc._id) {
|
|
364
|
-
updatedDoc._id = new ObjectId();
|
|
365
|
-
}
|
|
366
|
-
const idStr = this.serializeId(updatedDoc._id);
|
|
367
|
-
db.query('INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, ?)').run(cid, idStr, JSON.stringify(updatedDoc));
|
|
368
|
-
return {
|
|
369
|
-
acknowledged: true,
|
|
370
|
-
matchedCount: 0,
|
|
371
|
-
modifiedCount: 0,
|
|
372
|
-
upsertedId: updatedDoc._id,
|
|
373
|
-
upsertedCount: 1,
|
|
374
|
-
};
|
|
375
|
-
}
|
|
376
|
-
return { acknowledged: true, matchedCount: 0, modifiedCount: 0, upsertedCount: 0 };
|
|
377
|
-
}
|
|
378
|
-
const doc = JSON.parse(row.data);
|
|
379
|
-
doc._id = this.parseId(row._id);
|
|
380
|
-
const updatedDoc = this.applyUpdate(doc, update);
|
|
381
|
-
db.query('UPDATE documents SET data = ? WHERE id = ?').run(JSON.stringify(updatedDoc), row.id);
|
|
382
|
-
return { acknowledged: true, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 };
|
|
383
|
-
}
|
|
384
|
-
async updateMany(dbName, collection, filter, update, options) {
|
|
385
|
-
const db = this.getDatabase(dbName);
|
|
386
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
387
|
-
if (!collectionId) {
|
|
388
|
-
if (options?.upsert) {
|
|
389
|
-
const result = await this.updateOne(dbName, collection, filter, update, options);
|
|
390
|
-
return result;
|
|
391
|
-
}
|
|
392
|
-
return { acknowledged: true, matchedCount: 0, modifiedCount: 0, upsertedCount: 0 };
|
|
393
|
-
}
|
|
394
|
-
let sql = 'SELECT id, _id, data FROM documents WHERE collection_id = ?';
|
|
395
|
-
const params = [collectionId];
|
|
396
|
-
const filterSql = this.buildFilterSql(filter, params);
|
|
397
|
-
if (filterSql) {
|
|
398
|
-
sql += ` AND (${filterSql})`;
|
|
399
|
-
}
|
|
400
|
-
const rows = db.query(sql).all(...params);
|
|
401
|
-
if (rows.length === 0 && options?.upsert) {
|
|
402
|
-
const result = await this.updateOne(dbName, collection, filter, update, options);
|
|
403
|
-
return result;
|
|
404
|
-
}
|
|
405
|
-
const stmt = db.prepare('UPDATE documents SET data = ? WHERE id = ?');
|
|
406
|
-
db.transaction(() => {
|
|
407
|
-
for (const row of rows) {
|
|
408
|
-
const doc = JSON.parse(row.data);
|
|
409
|
-
doc._id = this.parseId(row._id);
|
|
410
|
-
const updatedDoc = this.applyUpdate(doc, update);
|
|
411
|
-
stmt.run(JSON.stringify(updatedDoc), row.id);
|
|
412
|
-
}
|
|
413
|
-
})();
|
|
414
|
-
return {
|
|
415
|
-
acknowledged: true,
|
|
416
|
-
matchedCount: rows.length,
|
|
417
|
-
modifiedCount: rows.length,
|
|
418
|
-
upsertedCount: 0,
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
async deleteOne(dbName, collection, filter) {
|
|
422
|
-
const db = this.getDatabase(dbName);
|
|
423
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
424
|
-
if (!collectionId) {
|
|
425
|
-
return { acknowledged: true, deletedCount: 0 };
|
|
426
|
-
}
|
|
427
|
-
// Find one document first
|
|
428
|
-
let sql = 'SELECT id FROM documents WHERE collection_id = ?';
|
|
429
|
-
const params = [collectionId];
|
|
430
|
-
const filterSql = this.buildFilterSql(filter, params);
|
|
431
|
-
if (filterSql) {
|
|
432
|
-
sql += ` AND (${filterSql})`;
|
|
433
|
-
}
|
|
434
|
-
sql += ' LIMIT 1';
|
|
435
|
-
const row = db.query(sql).get(...params);
|
|
436
|
-
if (!row) {
|
|
437
|
-
return { acknowledged: true, deletedCount: 0 };
|
|
438
|
-
}
|
|
439
|
-
db.query('DELETE FROM documents WHERE id = ?').run(row.id);
|
|
440
|
-
return { acknowledged: true, deletedCount: 1 };
|
|
441
|
-
}
|
|
442
|
-
async deleteMany(dbName, collection, filter) {
|
|
443
|
-
const db = this.getDatabase(dbName);
|
|
444
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
445
|
-
if (!collectionId) {
|
|
446
|
-
return { acknowledged: true, deletedCount: 0 };
|
|
447
|
-
}
|
|
448
|
-
let sql = 'DELETE FROM documents WHERE collection_id = ?';
|
|
449
|
-
const params = [collectionId];
|
|
450
|
-
const filterSql = this.buildFilterSql(filter, params);
|
|
451
|
-
if (filterSql) {
|
|
452
|
-
sql += ` AND (${filterSql})`;
|
|
453
|
-
}
|
|
454
|
-
const result = db.query(sql).run(...params);
|
|
455
|
-
return { acknowledged: true, deletedCount: result.changes };
|
|
456
|
-
}
|
|
457
|
-
// ============ Count & Distinct ============
|
|
458
|
-
async count(dbName, collection, query) {
|
|
459
|
-
const db = this.getDatabase(dbName);
|
|
460
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
461
|
-
if (!collectionId) {
|
|
462
|
-
return 0;
|
|
463
|
-
}
|
|
464
|
-
let sql = 'SELECT COUNT(*) as count FROM documents WHERE collection_id = ?';
|
|
465
|
-
const params = [collectionId];
|
|
466
|
-
if (query && Object.keys(query).length > 0) {
|
|
467
|
-
const filterSql = this.buildFilterSql(query, params);
|
|
468
|
-
if (filterSql) {
|
|
469
|
-
sql += ` AND (${filterSql})`;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
const result = db.query(sql).get(...params);
|
|
473
|
-
return result.count;
|
|
474
|
-
}
|
|
475
|
-
async distinct(dbName, collection, field, query) {
|
|
476
|
-
const db = this.getDatabase(dbName);
|
|
477
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
478
|
-
if (!collectionId) {
|
|
479
|
-
return [];
|
|
480
|
-
}
|
|
481
|
-
let sql;
|
|
482
|
-
if (field === '_id') {
|
|
483
|
-
sql = 'SELECT DISTINCT _id as value FROM documents WHERE collection_id = ?';
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
// Validate field name to prevent SQL injection
|
|
487
|
-
const safePath = safeJsonPath(validateFieldPath(field));
|
|
488
|
-
sql = `SELECT DISTINCT json_extract(data, '${safePath}') as value FROM documents WHERE collection_id = ?`;
|
|
489
|
-
}
|
|
490
|
-
const params = [collectionId];
|
|
491
|
-
if (query && Object.keys(query).length > 0) {
|
|
492
|
-
const filterSql = this.buildFilterSql(query, params);
|
|
493
|
-
if (filterSql) {
|
|
494
|
-
sql += ` AND (${filterSql})`;
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
const rows = db.query(sql).all(...params);
|
|
498
|
-
return rows.map((r) => r.value).filter((v) => v !== null);
|
|
499
|
-
}
|
|
500
|
-
// ============ Aggregation ============
|
|
501
|
-
async aggregate(dbName, collection, pipeline, options) {
|
|
502
|
-
const db = this.getDatabase(dbName);
|
|
503
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
504
|
-
if (!collectionId) {
|
|
505
|
-
return { documents: [], cursorId: 0n, hasMore: false };
|
|
506
|
-
}
|
|
507
|
-
// Get all documents for in-memory processing
|
|
508
|
-
const rows = db
|
|
509
|
-
.query('SELECT _id, data FROM documents WHERE collection_id = ?')
|
|
510
|
-
.all(collectionId);
|
|
511
|
-
let documents = rows.map((row) => {
|
|
512
|
-
const doc = JSON.parse(row.data);
|
|
513
|
-
doc._id = this.parseId(row._id);
|
|
514
|
-
return doc;
|
|
515
|
-
});
|
|
516
|
-
// Apply pipeline stages
|
|
517
|
-
documents = this.applyPipeline(documents, pipeline);
|
|
518
|
-
const batchSize = options?.batchSize || DEFAULT_BATCH_SIZE;
|
|
519
|
-
if (documents.length > batchSize) {
|
|
520
|
-
const cursorId = this.nextCursorId++;
|
|
521
|
-
this.cursors.set(cursorId, {
|
|
522
|
-
id: cursorId,
|
|
523
|
-
namespace: `${dbName}.${collection}`,
|
|
524
|
-
documents,
|
|
525
|
-
position: batchSize,
|
|
526
|
-
batchSize,
|
|
527
|
-
createdAt: Date.now(),
|
|
528
|
-
});
|
|
529
|
-
return {
|
|
530
|
-
documents: documents.slice(0, batchSize),
|
|
531
|
-
cursorId,
|
|
532
|
-
hasMore: true,
|
|
533
|
-
};
|
|
534
|
-
}
|
|
535
|
-
return { documents, cursorId: 0n, hasMore: false };
|
|
536
|
-
}
|
|
537
|
-
// ============ Index Operations ============
|
|
538
|
-
async listIndexes(dbName, collection) {
|
|
539
|
-
const db = this.getDatabase(dbName);
|
|
540
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
541
|
-
const indexes = [{ v: 2, key: { _id: 1 }, name: '_id_' }];
|
|
542
|
-
if (!collectionId) {
|
|
543
|
-
return indexes;
|
|
544
|
-
}
|
|
545
|
-
const rows = db
|
|
546
|
-
.query('SELECT name, key, options FROM indexes WHERE collection_id = ?')
|
|
547
|
-
.all(collectionId);
|
|
548
|
-
for (const row of rows) {
|
|
549
|
-
indexes.push({
|
|
550
|
-
v: 2,
|
|
551
|
-
key: JSON.parse(row.key),
|
|
552
|
-
name: row.name,
|
|
553
|
-
...JSON.parse(row.options),
|
|
554
|
-
});
|
|
555
|
-
}
|
|
556
|
-
return indexes;
|
|
557
|
-
}
|
|
558
|
-
async createIndexes(dbName, collection, indexes) {
|
|
559
|
-
const db = this.getDatabase(dbName);
|
|
560
|
-
const collectionId = this.getOrCreateCollectionId(db, collection);
|
|
561
|
-
const createdNames = [];
|
|
562
|
-
const stmt = db.prepare('INSERT OR IGNORE INTO indexes (collection_id, name, key, options) VALUES (?, ?, ?, ?)');
|
|
563
|
-
for (const spec of indexes) {
|
|
564
|
-
const name = spec.name || this.generateIndexName(spec.key);
|
|
565
|
-
const keyJson = JSON.stringify(spec.key);
|
|
566
|
-
const options = {};
|
|
567
|
-
if (spec.unique)
|
|
568
|
-
options.unique = true;
|
|
569
|
-
if (spec.sparse)
|
|
570
|
-
options.sparse = true;
|
|
571
|
-
const result = stmt.run(collectionId, name, keyJson, JSON.stringify(options));
|
|
572
|
-
if (result.changes > 0) {
|
|
573
|
-
createdNames.push(name);
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
return createdNames;
|
|
577
|
-
}
|
|
578
|
-
async dropIndex(dbName, collection, indexName) {
|
|
579
|
-
const db = this.getDatabase(dbName);
|
|
580
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
581
|
-
if (collectionId) {
|
|
582
|
-
db.query('DELETE FROM indexes WHERE collection_id = ? AND name = ?').run(collectionId, indexName);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
async dropIndexes(dbName, collection) {
|
|
586
|
-
const db = this.getDatabase(dbName);
|
|
587
|
-
const collectionId = this.getCollectionId(db, collection);
|
|
588
|
-
if (collectionId) {
|
|
589
|
-
db.query("DELETE FROM indexes WHERE collection_id = ? AND name != '_id_'").run(collectionId);
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
// ============ Cursor Management ============
|
|
593
|
-
createCursor(state) {
|
|
594
|
-
this.cursors.set(state.id, state);
|
|
595
|
-
}
|
|
596
|
-
getCursor(id) {
|
|
597
|
-
return this.cursors.get(id);
|
|
598
|
-
}
|
|
599
|
-
advanceCursor(id, count) {
|
|
600
|
-
const cursor = this.cursors.get(id);
|
|
601
|
-
if (!cursor) {
|
|
602
|
-
return [];
|
|
603
|
-
}
|
|
604
|
-
const start = cursor.position;
|
|
605
|
-
const end = Math.min(start + count, cursor.documents.length);
|
|
606
|
-
cursor.position = end;
|
|
607
|
-
return cursor.documents.slice(start, end);
|
|
608
|
-
}
|
|
609
|
-
closeCursor(id) {
|
|
610
|
-
return this.cursors.delete(id);
|
|
611
|
-
}
|
|
612
|
-
cleanupExpiredCursors() {
|
|
613
|
-
const now = Date.now();
|
|
614
|
-
for (const [id, cursor] of this.cursors) {
|
|
615
|
-
if (now - cursor.createdAt > CURSOR_TIMEOUT_MS) {
|
|
616
|
-
this.cursors.delete(id);
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
// ============ Helper Methods ============
|
|
621
|
-
serializeId(id) {
|
|
622
|
-
if (id instanceof ObjectId) {
|
|
623
|
-
return id.toHexString();
|
|
624
|
-
}
|
|
625
|
-
if (typeof id === 'object' && id !== null && '$oid' in id) {
|
|
626
|
-
return id.$oid;
|
|
627
|
-
}
|
|
628
|
-
return String(id);
|
|
629
|
-
}
|
|
630
|
-
parseId(idStr) {
|
|
631
|
-
if (/^[0-9a-f]{24}$/i.test(idStr)) {
|
|
632
|
-
return new ObjectId(idStr);
|
|
633
|
-
}
|
|
634
|
-
return idStr;
|
|
635
|
-
}
|
|
636
|
-
generateIndexName(key) {
|
|
637
|
-
return Object.entries(key)
|
|
638
|
-
.map(([field, dir]) => `${field}_${dir}`)
|
|
639
|
-
.join('_');
|
|
640
|
-
}
|
|
641
|
-
/**
|
|
642
|
-
* Build simplified SQL filter from MongoDB query
|
|
643
|
-
*/
|
|
644
|
-
buildFilterSql(filter, params) {
|
|
645
|
-
const conditions = [];
|
|
646
|
-
for (const [key, value] of Object.entries(filter)) {
|
|
647
|
-
if (key === '_id') {
|
|
648
|
-
params.push(this.serializeId(value));
|
|
649
|
-
conditions.push('_id = ?');
|
|
650
|
-
}
|
|
651
|
-
else if (key === '$and' && Array.isArray(value)) {
|
|
652
|
-
const subConditions = value
|
|
653
|
-
.map((sub) => this.buildFilterSql(sub, params))
|
|
654
|
-
.filter(Boolean);
|
|
655
|
-
if (subConditions.length > 0) {
|
|
656
|
-
conditions.push(`(${subConditions.join(' AND ')})`);
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
else if (key === '$or' && Array.isArray(value)) {
|
|
660
|
-
const subConditions = value
|
|
661
|
-
.map((sub) => this.buildFilterSql(sub, params))
|
|
662
|
-
.filter(Boolean);
|
|
663
|
-
if (subConditions.length > 0) {
|
|
664
|
-
conditions.push(`(${subConditions.join(' OR ')})`);
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
668
|
-
// Handle operators
|
|
669
|
-
// Validate field name to prevent SQL injection
|
|
670
|
-
const safePath = safeJsonPath(validateFieldPath(key));
|
|
671
|
-
for (const [op, opValue] of Object.entries(value)) {
|
|
672
|
-
const path = `json_extract(data, '${safePath}')`;
|
|
673
|
-
switch (op) {
|
|
674
|
-
case '$eq':
|
|
675
|
-
params.push(opValue);
|
|
676
|
-
conditions.push(`${path} = ?`);
|
|
677
|
-
break;
|
|
678
|
-
case '$ne':
|
|
679
|
-
params.push(opValue);
|
|
680
|
-
conditions.push(`${path} != ?`);
|
|
681
|
-
break;
|
|
682
|
-
case '$gt':
|
|
683
|
-
params.push(opValue);
|
|
684
|
-
conditions.push(`${path} > ?`);
|
|
685
|
-
break;
|
|
686
|
-
case '$gte':
|
|
687
|
-
params.push(opValue);
|
|
688
|
-
conditions.push(`${path} >= ?`);
|
|
689
|
-
break;
|
|
690
|
-
case '$lt':
|
|
691
|
-
params.push(opValue);
|
|
692
|
-
conditions.push(`${path} < ?`);
|
|
693
|
-
break;
|
|
694
|
-
case '$lte':
|
|
695
|
-
params.push(opValue);
|
|
696
|
-
conditions.push(`${path} <= ?`);
|
|
697
|
-
break;
|
|
698
|
-
case '$exists':
|
|
699
|
-
conditions.push(opValue ? `${path} IS NOT NULL` : `${path} IS NULL`);
|
|
700
|
-
break;
|
|
701
|
-
case '$in':
|
|
702
|
-
if (Array.isArray(opValue) && opValue.length > 0) {
|
|
703
|
-
const placeholders = opValue.map(() => '?').join(', ');
|
|
704
|
-
params.push(...opValue);
|
|
705
|
-
conditions.push(`${path} IN (${placeholders})`);
|
|
706
|
-
}
|
|
707
|
-
break;
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
else {
|
|
712
|
-
// Direct equality
|
|
713
|
-
// Validate field name to prevent SQL injection
|
|
714
|
-
const safePath = safeJsonPath(validateFieldPath(key));
|
|
715
|
-
const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;
|
|
716
|
-
params.push(sqlValue);
|
|
717
|
-
conditions.push(`json_extract(data, '${safePath}') = ?`);
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
return conditions.join(' AND ');
|
|
721
|
-
}
|
|
722
|
-
applyProjection(doc, projection) {
|
|
723
|
-
const includeFields = new Set();
|
|
724
|
-
const excludeFields = new Set();
|
|
725
|
-
let isInclusion = false;
|
|
726
|
-
for (const [field, value] of Object.entries(projection)) {
|
|
727
|
-
if (field === '_id' && (value === 0 || value === false)) {
|
|
728
|
-
excludeFields.add('_id');
|
|
729
|
-
continue;
|
|
730
|
-
}
|
|
731
|
-
if (value === 1 || value === true) {
|
|
732
|
-
includeFields.add(field);
|
|
733
|
-
isInclusion = true;
|
|
734
|
-
}
|
|
735
|
-
else if (value === 0 || value === false) {
|
|
736
|
-
excludeFields.add(field);
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
if (isInclusion) {
|
|
740
|
-
const result = {};
|
|
741
|
-
if (!excludeFields.has('_id')) {
|
|
742
|
-
result._id = doc._id;
|
|
743
|
-
}
|
|
744
|
-
for (const field of includeFields) {
|
|
745
|
-
if (field in doc) {
|
|
746
|
-
result[field] = doc[field];
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
return result;
|
|
750
|
-
}
|
|
751
|
-
const result = { ...doc };
|
|
752
|
-
for (const field of excludeFields) {
|
|
753
|
-
delete result[field];
|
|
754
|
-
}
|
|
755
|
-
return result;
|
|
756
|
-
}
|
|
757
|
-
applyUpdate(doc, update) {
|
|
758
|
-
const result = { ...doc };
|
|
759
|
-
if (update.$set) {
|
|
760
|
-
Object.assign(result, update.$set);
|
|
761
|
-
}
|
|
762
|
-
if (update.$unset) {
|
|
763
|
-
for (const key of Object.keys(update.$unset)) {
|
|
764
|
-
delete result[key];
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
if (update.$inc) {
|
|
768
|
-
for (const [key, value] of Object.entries(update.$inc)) {
|
|
769
|
-
const current = result[key] || 0;
|
|
770
|
-
result[key] = current + value;
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
if (update.$push) {
|
|
774
|
-
for (const [key, value] of Object.entries(update.$push)) {
|
|
775
|
-
const current = result[key] || [];
|
|
776
|
-
if (typeof value === 'object' && value !== null && '$each' in value) {
|
|
777
|
-
current.push(...value.$each);
|
|
778
|
-
}
|
|
779
|
-
else {
|
|
780
|
-
current.push(value);
|
|
781
|
-
}
|
|
782
|
-
result[key] = current;
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
// Handle replacement (no operators)
|
|
786
|
-
const hasOperators = Object.keys(update).some((k) => k.startsWith('$'));
|
|
787
|
-
if (!hasOperators) {
|
|
788
|
-
const id = result._id;
|
|
789
|
-
for (const key of Object.keys(result)) {
|
|
790
|
-
if (key !== '_id')
|
|
791
|
-
delete result[key];
|
|
792
|
-
}
|
|
793
|
-
Object.assign(result, update);
|
|
794
|
-
result._id = id;
|
|
795
|
-
}
|
|
796
|
-
return result;
|
|
797
|
-
}
|
|
798
|
-
applyPipeline(documents, pipeline) {
|
|
799
|
-
let result = [...documents];
|
|
800
|
-
for (const stage of pipeline) {
|
|
801
|
-
const entry = Object.entries(stage)[0];
|
|
802
|
-
if (!entry)
|
|
803
|
-
continue;
|
|
804
|
-
const [op, value] = entry;
|
|
805
|
-
switch (op) {
|
|
806
|
-
case '$match':
|
|
807
|
-
result = result.filter((doc) => this.matchDocument(doc, value));
|
|
808
|
-
break;
|
|
809
|
-
case '$project':
|
|
810
|
-
result = result.map((doc) => this.applyProjection(doc, value));
|
|
811
|
-
break;
|
|
812
|
-
case '$sort':
|
|
813
|
-
result = this.sortDocuments(result, value);
|
|
814
|
-
break;
|
|
815
|
-
case '$limit':
|
|
816
|
-
result = result.slice(0, value);
|
|
817
|
-
break;
|
|
818
|
-
case '$skip':
|
|
819
|
-
result = result.slice(value);
|
|
820
|
-
break;
|
|
821
|
-
case '$count':
|
|
822
|
-
result = [{ [value]: result.length }];
|
|
823
|
-
break;
|
|
824
|
-
case '$sample':
|
|
825
|
-
const size = value.size || 100;
|
|
826
|
-
result = this.shuffleArray(result).slice(0, size);
|
|
827
|
-
break;
|
|
828
|
-
case '$group':
|
|
829
|
-
result = this.groupDocuments(result, value);
|
|
830
|
-
break;
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
return result;
|
|
834
|
-
}
|
|
835
|
-
matchDocument(doc, query) {
|
|
836
|
-
for (const [key, value] of Object.entries(query)) {
|
|
837
|
-
if (key === '$and') {
|
|
838
|
-
if (!value.every((q) => this.matchDocument(doc, q))) {
|
|
839
|
-
return false;
|
|
840
|
-
}
|
|
841
|
-
continue;
|
|
842
|
-
}
|
|
843
|
-
if (key === '$or') {
|
|
844
|
-
if (!value.some((q) => this.matchDocument(doc, q))) {
|
|
845
|
-
return false;
|
|
846
|
-
}
|
|
847
|
-
continue;
|
|
848
|
-
}
|
|
849
|
-
const docValue = doc[key];
|
|
850
|
-
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
851
|
-
for (const [op, opValue] of Object.entries(value)) {
|
|
852
|
-
switch (op) {
|
|
853
|
-
case '$eq':
|
|
854
|
-
if (docValue !== opValue)
|
|
855
|
-
return false;
|
|
856
|
-
break;
|
|
857
|
-
case '$ne':
|
|
858
|
-
if (docValue === opValue)
|
|
859
|
-
return false;
|
|
860
|
-
break;
|
|
861
|
-
case '$gt':
|
|
862
|
-
if (!(docValue > opValue))
|
|
863
|
-
return false;
|
|
864
|
-
break;
|
|
865
|
-
case '$gte':
|
|
866
|
-
if (!(docValue >= opValue))
|
|
867
|
-
return false;
|
|
868
|
-
break;
|
|
869
|
-
case '$lt':
|
|
870
|
-
if (!(docValue < opValue))
|
|
871
|
-
return false;
|
|
872
|
-
break;
|
|
873
|
-
case '$lte':
|
|
874
|
-
if (!(docValue <= opValue))
|
|
875
|
-
return false;
|
|
876
|
-
break;
|
|
877
|
-
case '$in':
|
|
878
|
-
if (!opValue.includes(docValue))
|
|
879
|
-
return false;
|
|
880
|
-
break;
|
|
881
|
-
case '$exists':
|
|
882
|
-
if ((opValue && docValue === undefined) || (!opValue && docValue !== undefined))
|
|
883
|
-
return false;
|
|
884
|
-
break;
|
|
885
|
-
}
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
else {
|
|
889
|
-
if (docValue !== value)
|
|
890
|
-
return false;
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
return true;
|
|
894
|
-
}
|
|
895
|
-
sortDocuments(documents, sort) {
|
|
896
|
-
return [...documents].sort((a, b) => {
|
|
897
|
-
for (const [field, direction] of Object.entries(sort)) {
|
|
898
|
-
const aVal = a[field];
|
|
899
|
-
const bVal = b[field];
|
|
900
|
-
const dir = direction === -1 ? -1 : 1;
|
|
901
|
-
if (aVal === bVal)
|
|
902
|
-
continue;
|
|
903
|
-
if (aVal === undefined || aVal === null)
|
|
904
|
-
return dir;
|
|
905
|
-
if (bVal === undefined || bVal === null)
|
|
906
|
-
return -dir;
|
|
907
|
-
if (aVal < bVal)
|
|
908
|
-
return -dir;
|
|
909
|
-
if (aVal > bVal)
|
|
910
|
-
return dir;
|
|
911
|
-
}
|
|
912
|
-
return 0;
|
|
913
|
-
});
|
|
914
|
-
}
|
|
915
|
-
shuffleArray(array) {
|
|
916
|
-
const result = [...array];
|
|
917
|
-
for (let i = result.length - 1; i > 0; i--) {
|
|
918
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
919
|
-
const temp = result[i];
|
|
920
|
-
result[i] = result[j];
|
|
921
|
-
result[j] = temp;
|
|
922
|
-
}
|
|
923
|
-
return result;
|
|
924
|
-
}
|
|
925
|
-
groupDocuments(documents, groupSpec) {
|
|
926
|
-
const groups = new Map();
|
|
927
|
-
const idSpec = groupSpec._id;
|
|
928
|
-
for (const doc of documents) {
|
|
929
|
-
let groupKey;
|
|
930
|
-
if (idSpec === null) {
|
|
931
|
-
groupKey = '__all__';
|
|
932
|
-
}
|
|
933
|
-
else if (typeof idSpec === 'string' && idSpec.startsWith('$')) {
|
|
934
|
-
groupKey = JSON.stringify(doc[idSpec.slice(1)]);
|
|
935
|
-
}
|
|
936
|
-
else {
|
|
937
|
-
groupKey = JSON.stringify(idSpec);
|
|
938
|
-
}
|
|
939
|
-
if (!groups.has(groupKey)) {
|
|
940
|
-
groups.set(groupKey, []);
|
|
941
|
-
}
|
|
942
|
-
groups.get(groupKey).push(doc);
|
|
943
|
-
}
|
|
944
|
-
const result = [];
|
|
945
|
-
for (const [key, docs] of groups) {
|
|
946
|
-
const grouped = { _id: key === '__all__' ? null : JSON.parse(key) };
|
|
947
|
-
for (const [field, spec] of Object.entries(groupSpec)) {
|
|
948
|
-
if (field === '_id')
|
|
949
|
-
continue;
|
|
950
|
-
if (typeof spec === 'object' && spec !== null) {
|
|
951
|
-
const [op, value] = Object.entries(spec)[0];
|
|
952
|
-
const fieldPath = typeof value === 'string' && value.startsWith('$') ? value.slice(1) : null;
|
|
953
|
-
switch (op) {
|
|
954
|
-
case '$sum':
|
|
955
|
-
if (value === 1) {
|
|
956
|
-
grouped[field] = docs.length;
|
|
957
|
-
}
|
|
958
|
-
else if (fieldPath) {
|
|
959
|
-
grouped[field] = docs.reduce((sum, doc) => sum + (doc[fieldPath] || 0), 0);
|
|
960
|
-
}
|
|
961
|
-
break;
|
|
962
|
-
case '$avg':
|
|
963
|
-
if (fieldPath) {
|
|
964
|
-
const values = docs.map((doc) => doc[fieldPath]).filter((v) => typeof v === 'number');
|
|
965
|
-
grouped[field] = values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null;
|
|
966
|
-
}
|
|
967
|
-
break;
|
|
968
|
-
case '$first':
|
|
969
|
-
if (fieldPath && docs.length > 0) {
|
|
970
|
-
const firstDoc = docs[0];
|
|
971
|
-
if (firstDoc) {
|
|
972
|
-
grouped[field] = firstDoc[fieldPath];
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
break;
|
|
976
|
-
case '$last':
|
|
977
|
-
if (fieldPath && docs.length > 0) {
|
|
978
|
-
const lastDoc = docs[docs.length - 1];
|
|
979
|
-
if (lastDoc) {
|
|
980
|
-
grouped[field] = lastDoc[fieldPath];
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
break;
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
}
|
|
987
|
-
result.push(grouped);
|
|
988
|
-
}
|
|
989
|
-
return result;
|
|
990
|
-
}
|
|
991
|
-
/**
|
|
992
|
-
* Close all database connections
|
|
993
|
-
*/
|
|
994
|
-
close() {
|
|
995
|
-
for (const db of this.databases.values()) {
|
|
996
|
-
db.close();
|
|
997
|
-
}
|
|
998
|
-
this.databases.clear();
|
|
999
|
-
this.cursors.clear();
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
//# sourceMappingURL=local-sqlite.js.map
|