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.
Files changed (706) hide show
  1. package/dist/cli/index.d.ts +1 -15
  2. package/dist/cli/index.js +4083 -196
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/index.d.ts +2740 -20
  5. package/dist/index.js +9375 -27
  6. package/dist/index.js.map +1 -1
  7. package/dist/worker-entrypoint-BEW23Gmp.d.ts +1331 -0
  8. package/dist/worker.d.ts +6 -5
  9. package/dist/worker.js +5477 -18
  10. package/dist/worker.js.map +1 -1
  11. package/package.json +3 -2
  12. package/dist/agentfs/adapters/anthropic.d.ts +0 -176
  13. package/dist/agentfs/adapters/anthropic.d.ts.map +0 -1
  14. package/dist/agentfs/adapters/anthropic.js +0 -629
  15. package/dist/agentfs/adapters/anthropic.js.map +0 -1
  16. package/dist/agentfs/adapters/index.d.ts +0 -21
  17. package/dist/agentfs/adapters/index.d.ts.map +0 -1
  18. package/dist/agentfs/adapters/index.js +0 -23
  19. package/dist/agentfs/adapters/index.js.map +0 -1
  20. package/dist/agentfs/adapters/vercel.d.ts +0 -260
  21. package/dist/agentfs/adapters/vercel.d.ts.map +0 -1
  22. package/dist/agentfs/adapters/vercel.js +0 -288
  23. package/dist/agentfs/adapters/vercel.js.map +0 -1
  24. package/dist/agentfs/glob.d.ts +0 -116
  25. package/dist/agentfs/glob.d.ts.map +0 -1
  26. package/dist/agentfs/glob.js +0 -270
  27. package/dist/agentfs/glob.js.map +0 -1
  28. package/dist/agentfs/grep.d.ts +0 -83
  29. package/dist/agentfs/grep.d.ts.map +0 -1
  30. package/dist/agentfs/grep.js +0 -193
  31. package/dist/agentfs/grep.js.map +0 -1
  32. package/dist/agentfs/index.d.ts +0 -22
  33. package/dist/agentfs/index.d.ts.map +0 -1
  34. package/dist/agentfs/index.js +0 -18
  35. package/dist/agentfs/index.js.map +0 -1
  36. package/dist/agentfs/kv-store.d.ts +0 -128
  37. package/dist/agentfs/kv-store.d.ts.map +0 -1
  38. package/dist/agentfs/kv-store.js +0 -227
  39. package/dist/agentfs/kv-store.js.map +0 -1
  40. package/dist/agentfs/mondo-agent.d.ts +0 -255
  41. package/dist/agentfs/mondo-agent.d.ts.map +0 -1
  42. package/dist/agentfs/mondo-agent.js +0 -879
  43. package/dist/agentfs/mondo-agent.js.map +0 -1
  44. package/dist/agentfs/toolcalls.d.ts +0 -130
  45. package/dist/agentfs/toolcalls.d.ts.map +0 -1
  46. package/dist/agentfs/toolcalls.js +0 -178
  47. package/dist/agentfs/toolcalls.js.map +0 -1
  48. package/dist/agentfs/types.d.ts +0 -171
  49. package/dist/agentfs/types.d.ts.map +0 -1
  50. package/dist/agentfs/types.js +0 -7
  51. package/dist/agentfs/types.js.map +0 -1
  52. package/dist/agentfs/vfs.d.ts +0 -249
  53. package/dist/agentfs/vfs.d.ts.map +0 -1
  54. package/dist/agentfs/vfs.js +0 -469
  55. package/dist/agentfs/vfs.js.map +0 -1
  56. package/dist/cli/index.d.ts.map +0 -1
  57. package/dist/cli/mcp.d.ts +0 -119
  58. package/dist/cli/mcp.d.ts.map +0 -1
  59. package/dist/cli/mcp.js +0 -418
  60. package/dist/cli/mcp.js.map +0 -1
  61. package/dist/cli/server.d.ts +0 -179
  62. package/dist/cli/server.d.ts.map +0 -1
  63. package/dist/cli/server.js +0 -441
  64. package/dist/cli/server.js.map +0 -1
  65. package/dist/client/Collection.d.ts +0 -199
  66. package/dist/client/Collection.d.ts.map +0 -1
  67. package/dist/client/Collection.js +0 -256
  68. package/dist/client/Collection.js.map +0 -1
  69. package/dist/client/Database.d.ts +0 -68
  70. package/dist/client/Database.d.ts.map +0 -1
  71. package/dist/client/Database.js +0 -105
  72. package/dist/client/Database.js.map +0 -1
  73. package/dist/client/MongoClient.d.ts +0 -165
  74. package/dist/client/MongoClient.d.ts.map +0 -1
  75. package/dist/client/MongoClient.js +0 -307
  76. package/dist/client/MongoClient.js.map +0 -1
  77. package/dist/client/aggregation-cursor.d.ts +0 -210
  78. package/dist/client/aggregation-cursor.d.ts.map +0 -1
  79. package/dist/client/aggregation-cursor.js +0 -509
  80. package/dist/client/aggregation-cursor.js.map +0 -1
  81. package/dist/client/bulk-write.d.ts +0 -216
  82. package/dist/client/bulk-write.d.ts.map +0 -1
  83. package/dist/client/bulk-write.js +0 -63
  84. package/dist/client/bulk-write.js.map +0 -1
  85. package/dist/client/change-stream.d.ts +0 -245
  86. package/dist/client/change-stream.d.ts.map +0 -1
  87. package/dist/client/change-stream.js +0 -429
  88. package/dist/client/change-stream.js.map +0 -1
  89. package/dist/client/cursor.d.ts +0 -85
  90. package/dist/client/cursor.d.ts.map +0 -1
  91. package/dist/client/cursor.js +0 -156
  92. package/dist/client/cursor.js.map +0 -1
  93. package/dist/client/http-cursor.d.ts +0 -233
  94. package/dist/client/http-cursor.d.ts.map +0 -1
  95. package/dist/client/http-cursor.js +0 -496
  96. package/dist/client/http-cursor.js.map +0 -1
  97. package/dist/client/index.d.ts +0 -18
  98. package/dist/client/index.d.ts.map +0 -1
  99. package/dist/client/index.js +0 -24
  100. package/dist/client/index.js.map +0 -1
  101. package/dist/client/mongo-client.d.ts +0 -60
  102. package/dist/client/mongo-client.d.ts.map +0 -1
  103. package/dist/client/mongo-client.js +0 -190
  104. package/dist/client/mongo-client.js.map +0 -1
  105. package/dist/client/mongo-collection.d.ts +0 -359
  106. package/dist/client/mongo-collection.d.ts.map +0 -1
  107. package/dist/client/mongo-collection.js +0 -1641
  108. package/dist/client/mongo-collection.js.map +0 -1
  109. package/dist/client/mongo-cursor.d.ts +0 -257
  110. package/dist/client/mongo-cursor.d.ts.map +0 -1
  111. package/dist/client/mongo-cursor.js +0 -621
  112. package/dist/client/mongo-cursor.js.map +0 -1
  113. package/dist/client/mongo-database.d.ts +0 -88
  114. package/dist/client/mongo-database.d.ts.map +0 -1
  115. package/dist/client/mongo-database.js +0 -139
  116. package/dist/client/mongo-database.js.map +0 -1
  117. package/dist/client/session.d.ts +0 -210
  118. package/dist/client/session.d.ts.map +0 -1
  119. package/dist/client/session.js +0 -326
  120. package/dist/client/session.js.map +0 -1
  121. package/dist/durable-object/index-manager.d.ts +0 -173
  122. package/dist/durable-object/index-manager.d.ts.map +0 -1
  123. package/dist/durable-object/index-manager.js +0 -764
  124. package/dist/durable-object/index-manager.js.map +0 -1
  125. package/dist/durable-object/index.d.ts +0 -12
  126. package/dist/durable-object/index.d.ts.map +0 -1
  127. package/dist/durable-object/index.js +0 -8
  128. package/dist/durable-object/index.js.map +0 -1
  129. package/dist/durable-object/mcp-handler.d.ts +0 -52
  130. package/dist/durable-object/mcp-handler.d.ts.map +0 -1
  131. package/dist/durable-object/mcp-handler.js +0 -186
  132. package/dist/durable-object/mcp-handler.js.map +0 -1
  133. package/dist/durable-object/migrations.d.ts +0 -40
  134. package/dist/durable-object/migrations.d.ts.map +0 -1
  135. package/dist/durable-object/migrations.js +0 -121
  136. package/dist/durable-object/migrations.js.map +0 -1
  137. package/dist/durable-object/mondo-database.d.ts +0 -148
  138. package/dist/durable-object/mondo-database.d.ts.map +0 -1
  139. package/dist/durable-object/mondo-database.js +0 -621
  140. package/dist/durable-object/mondo-database.js.map +0 -1
  141. package/dist/durable-object/schema.d.ts +0 -192
  142. package/dist/durable-object/schema.d.ts.map +0 -1
  143. package/dist/durable-object/schema.js +0 -186
  144. package/dist/durable-object/schema.js.map +0 -1
  145. package/dist/embedding/document-serializer.d.ts +0 -118
  146. package/dist/embedding/document-serializer.d.ts.map +0 -1
  147. package/dist/embedding/document-serializer.js +0 -339
  148. package/dist/embedding/document-serializer.js.map +0 -1
  149. package/dist/embedding/embedding-manager.d.ts +0 -136
  150. package/dist/embedding/embedding-manager.d.ts.map +0 -1
  151. package/dist/embedding/embedding-manager.js +0 -176
  152. package/dist/embedding/embedding-manager.js.map +0 -1
  153. package/dist/embedding/index.d.ts +0 -9
  154. package/dist/embedding/index.d.ts.map +0 -1
  155. package/dist/embedding/index.js +0 -9
  156. package/dist/embedding/index.js.map +0 -1
  157. package/dist/executor/aggregation-executor.d.ts +0 -93
  158. package/dist/executor/aggregation-executor.d.ts.map +0 -1
  159. package/dist/executor/aggregation-executor.js +0 -275
  160. package/dist/executor/aggregation-executor.js.map +0 -1
  161. package/dist/executor/function-executor.d.ts +0 -39
  162. package/dist/executor/function-executor.d.ts.map +0 -1
  163. package/dist/executor/function-executor.js +0 -168
  164. package/dist/executor/function-executor.js.map +0 -1
  165. package/dist/executor/index.d.ts +0 -4
  166. package/dist/executor/index.d.ts.map +0 -1
  167. package/dist/executor/index.js +0 -4
  168. package/dist/executor/index.js.map +0 -1
  169. package/dist/executor/vector-search-executor.d.ts +0 -71
  170. package/dist/executor/vector-search-executor.d.ts.map +0 -1
  171. package/dist/executor/vector-search-executor.js +0 -113
  172. package/dist/executor/vector-search-executor.js.map +0 -1
  173. package/dist/index.d.ts.map +0 -1
  174. package/dist/mcp/adapters/anthropic-adapter.d.ts +0 -256
  175. package/dist/mcp/adapters/anthropic-adapter.d.ts.map +0 -1
  176. package/dist/mcp/adapters/anthropic-adapter.js +0 -409
  177. package/dist/mcp/adapters/anthropic-adapter.js.map +0 -1
  178. package/dist/mcp/adapters/base-adapter.d.ts +0 -164
  179. package/dist/mcp/adapters/base-adapter.d.ts.map +0 -1
  180. package/dist/mcp/adapters/base-adapter.js +0 -277
  181. package/dist/mcp/adapters/base-adapter.js.map +0 -1
  182. package/dist/mcp/adapters/errors.d.ts +0 -173
  183. package/dist/mcp/adapters/errors.d.ts.map +0 -1
  184. package/dist/mcp/adapters/errors.js +0 -305
  185. package/dist/mcp/adapters/errors.js.map +0 -1
  186. package/dist/mcp/adapters/index.d.ts +0 -65
  187. package/dist/mcp/adapters/index.d.ts.map +0 -1
  188. package/dist/mcp/adapters/index.js +0 -92
  189. package/dist/mcp/adapters/index.js.map +0 -1
  190. package/dist/mcp/adapters/streaming.d.ts +0 -200
  191. package/dist/mcp/adapters/streaming.d.ts.map +0 -1
  192. package/dist/mcp/adapters/streaming.js +0 -381
  193. package/dist/mcp/adapters/streaming.js.map +0 -1
  194. package/dist/mcp/adapters/vercel-adapter.d.ts +0 -321
  195. package/dist/mcp/adapters/vercel-adapter.d.ts.map +0 -1
  196. package/dist/mcp/adapters/vercel-adapter.js +0 -487
  197. package/dist/mcp/adapters/vercel-adapter.js.map +0 -1
  198. package/dist/mcp/agent.d.ts +0 -192
  199. package/dist/mcp/agent.d.ts.map +0 -1
  200. package/dist/mcp/agent.js +0 -338
  201. package/dist/mcp/agent.js.map +0 -1
  202. package/dist/mcp/cli.d.ts +0 -71
  203. package/dist/mcp/cli.d.ts.map +0 -1
  204. package/dist/mcp/cli.js +0 -218
  205. package/dist/mcp/cli.js.map +0 -1
  206. package/dist/mcp/index.d.ts +0 -15
  207. package/dist/mcp/index.d.ts.map +0 -1
  208. package/dist/mcp/index.js +0 -20
  209. package/dist/mcp/index.js.map +0 -1
  210. package/dist/mcp/sandbox/database-proxy.d.ts +0 -118
  211. package/dist/mcp/sandbox/database-proxy.d.ts.map +0 -1
  212. package/dist/mcp/sandbox/database-proxy.js +0 -154
  213. package/dist/mcp/sandbox/database-proxy.js.map +0 -1
  214. package/dist/mcp/sandbox/index.d.ts +0 -8
  215. package/dist/mcp/sandbox/index.d.ts.map +0 -1
  216. package/dist/mcp/sandbox/index.js +0 -7
  217. package/dist/mcp/sandbox/index.js.map +0 -1
  218. package/dist/mcp/sandbox/miniflare-evaluator.d.ts +0 -72
  219. package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +0 -1
  220. package/dist/mcp/sandbox/miniflare-evaluator.js +0 -379
  221. package/dist/mcp/sandbox/miniflare-evaluator.js.map +0 -1
  222. package/dist/mcp/sandbox/template.d.ts +0 -48
  223. package/dist/mcp/sandbox/template.d.ts.map +0 -1
  224. package/dist/mcp/sandbox/template.js +0 -147
  225. package/dist/mcp/sandbox/template.js.map +0 -1
  226. package/dist/mcp/sandbox/worker-evaluator.d.ts +0 -160
  227. package/dist/mcp/sandbox/worker-evaluator.d.ts.map +0 -1
  228. package/dist/mcp/sandbox/worker-evaluator.js +0 -217
  229. package/dist/mcp/sandbox/worker-evaluator.js.map +0 -1
  230. package/dist/mcp/server.d.ts +0 -75
  231. package/dist/mcp/server.d.ts.map +0 -1
  232. package/dist/mcp/server.js +0 -278
  233. package/dist/mcp/server.js.map +0 -1
  234. package/dist/mcp/tool-call-auditor.d.ts +0 -188
  235. package/dist/mcp/tool-call-auditor.d.ts.map +0 -1
  236. package/dist/mcp/tool-call-auditor.js +0 -198
  237. package/dist/mcp/tool-call-auditor.js.map +0 -1
  238. package/dist/mcp/tools/do.d.ts +0 -51
  239. package/dist/mcp/tools/do.d.ts.map +0 -1
  240. package/dist/mcp/tools/do.js +0 -113
  241. package/dist/mcp/tools/do.js.map +0 -1
  242. package/dist/mcp/tools/fetch.d.ts +0 -43
  243. package/dist/mcp/tools/fetch.d.ts.map +0 -1
  244. package/dist/mcp/tools/fetch.js +0 -127
  245. package/dist/mcp/tools/fetch.js.map +0 -1
  246. package/dist/mcp/tools/index.d.ts +0 -9
  247. package/dist/mcp/tools/index.d.ts.map +0 -1
  248. package/dist/mcp/tools/index.js +0 -9
  249. package/dist/mcp/tools/index.js.map +0 -1
  250. package/dist/mcp/tools/search.d.ts +0 -60
  251. package/dist/mcp/tools/search.d.ts.map +0 -1
  252. package/dist/mcp/tools/search.js +0 -278
  253. package/dist/mcp/tools/search.js.map +0 -1
  254. package/dist/mcp/transport/http.d.ts +0 -144
  255. package/dist/mcp/transport/http.d.ts.map +0 -1
  256. package/dist/mcp/transport/http.js +0 -545
  257. package/dist/mcp/transport/http.js.map +0 -1
  258. package/dist/mcp/transport/index.d.ts +0 -10
  259. package/dist/mcp/transport/index.d.ts.map +0 -1
  260. package/dist/mcp/transport/index.js +0 -12
  261. package/dist/mcp/transport/index.js.map +0 -1
  262. package/dist/mcp/transport/stdio.d.ts +0 -132
  263. package/dist/mcp/transport/stdio.d.ts.map +0 -1
  264. package/dist/mcp/transport/stdio.js +0 -466
  265. package/dist/mcp/transport/stdio.js.map +0 -1
  266. package/dist/mcp/types.d.ts +0 -476
  267. package/dist/mcp/types.d.ts.map +0 -1
  268. package/dist/mcp/types.js +0 -178
  269. package/dist/mcp/types.js.map +0 -1
  270. package/dist/olap/cdc/cdc-buffer.d.ts +0 -92
  271. package/dist/olap/cdc/cdc-buffer.d.ts.map +0 -1
  272. package/dist/olap/cdc/cdc-buffer.js +0 -146
  273. package/dist/olap/cdc/cdc-buffer.js.map +0 -1
  274. package/dist/olap/cdc/cdc-emitter.d.ts +0 -118
  275. package/dist/olap/cdc/cdc-emitter.d.ts.map +0 -1
  276. package/dist/olap/cdc/cdc-emitter.js +0 -217
  277. package/dist/olap/cdc/cdc-emitter.js.map +0 -1
  278. package/dist/olap/cdc/cdc-schema.d.ts +0 -119
  279. package/dist/olap/cdc/cdc-schema.d.ts.map +0 -1
  280. package/dist/olap/cdc/cdc-schema.js +0 -253
  281. package/dist/olap/cdc/cdc-schema.js.map +0 -1
  282. package/dist/olap/cdc/index.d.ts +0 -10
  283. package/dist/olap/cdc/index.d.ts.map +0 -1
  284. package/dist/olap/cdc/index.js +0 -10
  285. package/dist/olap/cdc/index.js.map +0 -1
  286. package/dist/olap/clickhouse/iceberg.d.ts +0 -164
  287. package/dist/olap/clickhouse/iceberg.d.ts.map +0 -1
  288. package/dist/olap/clickhouse/iceberg.js +0 -138
  289. package/dist/olap/clickhouse/iceberg.js.map +0 -1
  290. package/dist/olap/clickhouse/index.d.ts +0 -14
  291. package/dist/olap/clickhouse/index.d.ts.map +0 -1
  292. package/dist/olap/clickhouse/index.js +0 -14
  293. package/dist/olap/clickhouse/index.js.map +0 -1
  294. package/dist/olap/clickhouse/mapper.d.ts +0 -170
  295. package/dist/olap/clickhouse/mapper.d.ts.map +0 -1
  296. package/dist/olap/clickhouse/mapper.js +0 -654
  297. package/dist/olap/clickhouse/mapper.js.map +0 -1
  298. package/dist/olap/clickhouse/olap-backend.d.ts +0 -181
  299. package/dist/olap/clickhouse/olap-backend.d.ts.map +0 -1
  300. package/dist/olap/clickhouse/olap-backend.js +0 -1083
  301. package/dist/olap/clickhouse/olap-backend.js.map +0 -1
  302. package/dist/olap/clickhouse/query-executor.d.ts +0 -163
  303. package/dist/olap/clickhouse/query-executor.d.ts.map +0 -1
  304. package/dist/olap/clickhouse/query-executor.js +0 -560
  305. package/dist/olap/clickhouse/query-executor.js.map +0 -1
  306. package/dist/olap/clickhouse/query.d.ts +0 -134
  307. package/dist/olap/clickhouse/query.d.ts.map +0 -1
  308. package/dist/olap/clickhouse/query.js +0 -512
  309. package/dist/olap/clickhouse/query.js.map +0 -1
  310. package/dist/olap/stage/index.d.ts +0 -6
  311. package/dist/olap/stage/index.d.ts.map +0 -1
  312. package/dist/olap/stage/index.js +0 -6
  313. package/dist/olap/stage/index.js.map +0 -1
  314. package/dist/olap/stage/parser.d.ts +0 -68
  315. package/dist/olap/stage/parser.d.ts.map +0 -1
  316. package/dist/olap/stage/parser.js +0 -293
  317. package/dist/olap/stage/parser.js.map +0 -1
  318. package/dist/olap/stage/router.d.ts +0 -94
  319. package/dist/olap/stage/router.d.ts.map +0 -1
  320. package/dist/olap/stage/router.js +0 -390
  321. package/dist/olap/stage/router.js.map +0 -1
  322. package/dist/rpc/endpoint.d.ts +0 -52
  323. package/dist/rpc/endpoint.d.ts.map +0 -1
  324. package/dist/rpc/endpoint.js +0 -734
  325. package/dist/rpc/endpoint.js.map +0 -1
  326. package/dist/rpc/index.d.ts +0 -34
  327. package/dist/rpc/index.d.ts.map +0 -1
  328. package/dist/rpc/index.js +0 -45
  329. package/dist/rpc/index.js.map +0 -1
  330. package/dist/rpc/rpc-client.d.ts +0 -275
  331. package/dist/rpc/rpc-client.d.ts.map +0 -1
  332. package/dist/rpc/rpc-client.js +0 -735
  333. package/dist/rpc/rpc-client.js.map +0 -1
  334. package/dist/rpc/rpc-target.d.ts +0 -220
  335. package/dist/rpc/rpc-target.d.ts.map +0 -1
  336. package/dist/rpc/rpc-target.js +0 -500
  337. package/dist/rpc/rpc-target.js.map +0 -1
  338. package/dist/rpc/worker-entrypoint.d.ts +0 -159
  339. package/dist/rpc/worker-entrypoint.d.ts.map +0 -1
  340. package/dist/rpc/worker-entrypoint.js +0 -212
  341. package/dist/rpc/worker-entrypoint.js.map +0 -1
  342. package/dist/server.d.ts +0 -18
  343. package/dist/server.d.ts.map +0 -1
  344. package/dist/server.js +0 -129
  345. package/dist/server.js.map +0 -1
  346. package/dist/studio/components/browser/CollectionItem.d.ts +0 -26
  347. package/dist/studio/components/browser/CollectionItem.d.ts.map +0 -1
  348. package/dist/studio/components/browser/CollectionItem.js +0 -143
  349. package/dist/studio/components/browser/CollectionItem.js.map +0 -1
  350. package/dist/studio/components/browser/CollectionTree.d.ts +0 -45
  351. package/dist/studio/components/browser/CollectionTree.d.ts.map +0 -1
  352. package/dist/studio/components/browser/CollectionTree.js +0 -207
  353. package/dist/studio/components/browser/CollectionTree.js.map +0 -1
  354. package/dist/studio/components/browser/ConnectedDatabaseBrowser.d.ts +0 -51
  355. package/dist/studio/components/browser/ConnectedDatabaseBrowser.d.ts.map +0 -1
  356. package/dist/studio/components/browser/ConnectedDatabaseBrowser.js +0 -185
  357. package/dist/studio/components/browser/ConnectedDatabaseBrowser.js.map +0 -1
  358. package/dist/studio/components/browser/DatabaseBrowser.d.ts +0 -46
  359. package/dist/studio/components/browser/DatabaseBrowser.d.ts.map +0 -1
  360. package/dist/studio/components/browser/DatabaseBrowser.js +0 -304
  361. package/dist/studio/components/browser/DatabaseBrowser.js.map +0 -1
  362. package/dist/studio/components/browser/__tests__/CollectionItem.test.d.ts +0 -5
  363. package/dist/studio/components/browser/__tests__/CollectionItem.test.d.ts.map +0 -1
  364. package/dist/studio/components/browser/__tests__/CollectionItem.test.js +0 -169
  365. package/dist/studio/components/browser/__tests__/CollectionItem.test.js.map +0 -1
  366. package/dist/studio/components/browser/__tests__/CollectionTree.test.d.ts +0 -5
  367. package/dist/studio/components/browser/__tests__/CollectionTree.test.d.ts.map +0 -1
  368. package/dist/studio/components/browser/__tests__/CollectionTree.test.js +0 -203
  369. package/dist/studio/components/browser/__tests__/CollectionTree.test.js.map +0 -1
  370. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.d.ts +0 -8
  371. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.d.ts.map +0 -1
  372. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.js +0 -522
  373. package/dist/studio/components/browser/__tests__/DatabaseBrowser.e2e.test.js.map +0 -1
  374. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.d.ts +0 -5
  375. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.d.ts.map +0 -1
  376. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.js +0 -518
  377. package/dist/studio/components/browser/__tests__/DatabaseBrowser.test.js.map +0 -1
  378. package/dist/studio/components/browser/__tests__/setup.d.ts +0 -5
  379. package/dist/studio/components/browser/__tests__/setup.d.ts.map +0 -1
  380. package/dist/studio/components/browser/__tests__/setup.js +0 -22
  381. package/dist/studio/components/browser/__tests__/setup.js.map +0 -1
  382. package/dist/studio/components/browser/index.d.ts +0 -15
  383. package/dist/studio/components/browser/index.d.ts.map +0 -1
  384. package/dist/studio/components/browser/index.js +0 -10
  385. package/dist/studio/components/browser/index.js.map +0 -1
  386. package/dist/studio/components/browser/types.d.ts +0 -33
  387. package/dist/studio/components/browser/types.d.ts.map +0 -1
  388. package/dist/studio/components/browser/types.js +0 -5
  389. package/dist/studio/components/browser/types.js.map +0 -1
  390. package/dist/studio/components/connection/ConnectionForm.d.ts +0 -59
  391. package/dist/studio/components/connection/ConnectionForm.d.ts.map +0 -1
  392. package/dist/studio/components/connection/ConnectionForm.js +0 -274
  393. package/dist/studio/components/connection/ConnectionForm.js.map +0 -1
  394. package/dist/studio/components/connection/ConnectionList.d.ts +0 -59
  395. package/dist/studio/components/connection/ConnectionList.d.ts.map +0 -1
  396. package/dist/studio/components/connection/ConnectionList.js +0 -286
  397. package/dist/studio/components/connection/ConnectionList.js.map +0 -1
  398. package/dist/studio/components/connection/ConnectionPanel.d.ts +0 -132
  399. package/dist/studio/components/connection/ConnectionPanel.d.ts.map +0 -1
  400. package/dist/studio/components/connection/ConnectionPanel.js +0 -293
  401. package/dist/studio/components/connection/ConnectionPanel.js.map +0 -1
  402. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.d.ts +0 -8
  403. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.d.ts.map +0 -1
  404. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.js +0 -632
  405. package/dist/studio/components/connection/__tests__/ConnectionPanel.test.js.map +0 -1
  406. package/dist/studio/components/connection/__tests__/setup.d.ts +0 -5
  407. package/dist/studio/components/connection/__tests__/setup.d.ts.map +0 -1
  408. package/dist/studio/components/connection/__tests__/setup.js +0 -11
  409. package/dist/studio/components/connection/__tests__/setup.js.map +0 -1
  410. package/dist/studio/components/connection/index.d.ts +0 -10
  411. package/dist/studio/components/connection/index.d.ts.map +0 -1
  412. package/dist/studio/components/connection/index.js +0 -7
  413. package/dist/studio/components/connection/index.js.map +0 -1
  414. package/dist/studio/components/crud/DeleteDocumentDialog.d.ts +0 -91
  415. package/dist/studio/components/crud/DeleteDocumentDialog.d.ts.map +0 -1
  416. package/dist/studio/components/crud/DeleteDocumentDialog.js +0 -273
  417. package/dist/studio/components/crud/DeleteDocumentDialog.js.map +0 -1
  418. package/dist/studio/components/crud/DocumentEditor.d.ts +0 -32
  419. package/dist/studio/components/crud/DocumentEditor.d.ts.map +0 -1
  420. package/dist/studio/components/crud/DocumentEditor.js +0 -546
  421. package/dist/studio/components/crud/DocumentEditor.js.map +0 -1
  422. package/dist/studio/components/crud/InsertDocumentDialog.d.ts +0 -78
  423. package/dist/studio/components/crud/InsertDocumentDialog.d.ts.map +0 -1
  424. package/dist/studio/components/crud/InsertDocumentDialog.js +0 -323
  425. package/dist/studio/components/crud/InsertDocumentDialog.js.map +0 -1
  426. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.d.ts +0 -5
  427. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.d.ts.map +0 -1
  428. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.js +0 -298
  429. package/dist/studio/components/crud/__tests__/DeleteDocumentDialog.test.js.map +0 -1
  430. package/dist/studio/components/crud/__tests__/DocumentEditor.test.d.ts +0 -8
  431. package/dist/studio/components/crud/__tests__/DocumentEditor.test.d.ts.map +0 -1
  432. package/dist/studio/components/crud/__tests__/DocumentEditor.test.js +0 -368
  433. package/dist/studio/components/crud/__tests__/DocumentEditor.test.js.map +0 -1
  434. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.d.ts +0 -2
  435. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.d.ts.map +0 -1
  436. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.js +0 -352
  437. package/dist/studio/components/crud/__tests__/InsertDocumentDialog.test.js.map +0 -1
  438. package/dist/studio/components/crud/__tests__/setup.d.ts +0 -5
  439. package/dist/studio/components/crud/__tests__/setup.d.ts.map +0 -1
  440. package/dist/studio/components/crud/__tests__/setup.js +0 -22
  441. package/dist/studio/components/crud/__tests__/setup.js.map +0 -1
  442. package/dist/studio/components/crud/index.d.ts +0 -12
  443. package/dist/studio/components/crud/index.d.ts.map +0 -1
  444. package/dist/studio/components/crud/index.js +0 -11
  445. package/dist/studio/components/crud/index.js.map +0 -1
  446. package/dist/studio/hooks/useConnection.d.ts +0 -127
  447. package/dist/studio/hooks/useConnection.d.ts.map +0 -1
  448. package/dist/studio/hooks/useConnection.js +0 -414
  449. package/dist/studio/hooks/useConnection.js.map +0 -1
  450. package/dist/studio/hooks/useDatabaseBrowser.d.ts +0 -107
  451. package/dist/studio/hooks/useDatabaseBrowser.d.ts.map +0 -1
  452. package/dist/studio/hooks/useDatabaseBrowser.js +0 -294
  453. package/dist/studio/hooks/useDatabaseBrowser.js.map +0 -1
  454. package/dist/studio/index.d.ts +0 -16
  455. package/dist/studio/index.d.ts.map +0 -1
  456. package/dist/studio/index.js +0 -14
  457. package/dist/studio/index.js.map +0 -1
  458. package/dist/studio/types/connection.d.ts +0 -266
  459. package/dist/studio/types/connection.d.ts.map +0 -1
  460. package/dist/studio/types/connection.js +0 -159
  461. package/dist/studio/types/connection.js.map +0 -1
  462. package/dist/studio/vitest.config.d.ts +0 -3
  463. package/dist/studio/vitest.config.d.ts.map +0 -1
  464. package/dist/studio/vitest.config.js +0 -33
  465. package/dist/studio/vitest.config.js.map +0 -1
  466. package/dist/translator/aggregation-translator.d.ts +0 -51
  467. package/dist/translator/aggregation-translator.d.ts.map +0 -1
  468. package/dist/translator/aggregation-translator.js +0 -324
  469. package/dist/translator/aggregation-translator.js.map +0 -1
  470. package/dist/translator/dialect.d.ts +0 -131
  471. package/dist/translator/dialect.d.ts.map +0 -1
  472. package/dist/translator/dialect.js +0 -276
  473. package/dist/translator/dialect.js.map +0 -1
  474. package/dist/translator/geo-translator.d.ts +0 -91
  475. package/dist/translator/geo-translator.d.ts.map +0 -1
  476. package/dist/translator/geo-translator.js +0 -587
  477. package/dist/translator/geo-translator.js.map +0 -1
  478. package/dist/translator/hybrid-translator.d.ts +0 -70
  479. package/dist/translator/hybrid-translator.d.ts.map +0 -1
  480. package/dist/translator/hybrid-translator.js +0 -193
  481. package/dist/translator/hybrid-translator.js.map +0 -1
  482. package/dist/translator/index.d.ts +0 -13
  483. package/dist/translator/index.d.ts.map +0 -1
  484. package/dist/translator/index.js +0 -11
  485. package/dist/translator/index.js.map +0 -1
  486. package/dist/translator/query-translator.d.ts +0 -211
  487. package/dist/translator/query-translator.d.ts.map +0 -1
  488. package/dist/translator/query-translator.js +0 -1276
  489. package/dist/translator/query-translator.js.map +0 -1
  490. package/dist/translator/search-highlight.d.ts +0 -83
  491. package/dist/translator/search-highlight.d.ts.map +0 -1
  492. package/dist/translator/search-highlight.js +0 -83
  493. package/dist/translator/search-highlight.js.map +0 -1
  494. package/dist/translator/search-translator.d.ts +0 -155
  495. package/dist/translator/search-translator.d.ts.map +0 -1
  496. package/dist/translator/search-translator.js +0 -241
  497. package/dist/translator/search-translator.js.map +0 -1
  498. package/dist/translator/stages/add-fields-stage.d.ts +0 -7
  499. package/dist/translator/stages/add-fields-stage.d.ts.map +0 -1
  500. package/dist/translator/stages/add-fields-stage.js +0 -72
  501. package/dist/translator/stages/add-fields-stage.js.map +0 -1
  502. package/dist/translator/stages/bucket-stage.d.ts +0 -7
  503. package/dist/translator/stages/bucket-stage.d.ts.map +0 -1
  504. package/dist/translator/stages/bucket-stage.js +0 -87
  505. package/dist/translator/stages/bucket-stage.js.map +0 -1
  506. package/dist/translator/stages/count-stage.d.ts +0 -7
  507. package/dist/translator/stages/count-stage.d.ts.map +0 -1
  508. package/dist/translator/stages/count-stage.js +0 -12
  509. package/dist/translator/stages/count-stage.js.map +0 -1
  510. package/dist/translator/stages/expression-translator.d.ts +0 -68
  511. package/dist/translator/stages/expression-translator.d.ts.map +0 -1
  512. package/dist/translator/stages/expression-translator.js +0 -467
  513. package/dist/translator/stages/expression-translator.js.map +0 -1
  514. package/dist/translator/stages/facet-stage.d.ts +0 -13
  515. package/dist/translator/stages/facet-stage.d.ts.map +0 -1
  516. package/dist/translator/stages/facet-stage.js +0 -26
  517. package/dist/translator/stages/facet-stage.js.map +0 -1
  518. package/dist/translator/stages/fusion-stages.d.ts +0 -118
  519. package/dist/translator/stages/fusion-stages.d.ts.map +0 -1
  520. package/dist/translator/stages/fusion-stages.js +0 -201
  521. package/dist/translator/stages/fusion-stages.js.map +0 -1
  522. package/dist/translator/stages/group-stage.d.ts +0 -8
  523. package/dist/translator/stages/group-stage.d.ts.map +0 -1
  524. package/dist/translator/stages/group-stage.js +0 -123
  525. package/dist/translator/stages/group-stage.js.map +0 -1
  526. package/dist/translator/stages/index.d.ts +0 -24
  527. package/dist/translator/stages/index.d.ts.map +0 -1
  528. package/dist/translator/stages/index.js +0 -24
  529. package/dist/translator/stages/index.js.map +0 -1
  530. package/dist/translator/stages/join-optimizer.d.ts +0 -37
  531. package/dist/translator/stages/join-optimizer.d.ts.map +0 -1
  532. package/dist/translator/stages/join-optimizer.js +0 -93
  533. package/dist/translator/stages/join-optimizer.js.map +0 -1
  534. package/dist/translator/stages/limit-stage.d.ts +0 -7
  535. package/dist/translator/stages/limit-stage.d.ts.map +0 -1
  536. package/dist/translator/stages/limit-stage.js +0 -11
  537. package/dist/translator/stages/limit-stage.js.map +0 -1
  538. package/dist/translator/stages/lookup-stage.d.ts +0 -7
  539. package/dist/translator/stages/lookup-stage.d.ts.map +0 -1
  540. package/dist/translator/stages/lookup-stage.js +0 -73
  541. package/dist/translator/stages/lookup-stage.js.map +0 -1
  542. package/dist/translator/stages/match-stage.d.ts +0 -7
  543. package/dist/translator/stages/match-stage.d.ts.map +0 -1
  544. package/dist/translator/stages/match-stage.js +0 -14
  545. package/dist/translator/stages/match-stage.js.map +0 -1
  546. package/dist/translator/stages/optimizer.d.ts +0 -15
  547. package/dist/translator/stages/optimizer.d.ts.map +0 -1
  548. package/dist/translator/stages/optimizer.js +0 -249
  549. package/dist/translator/stages/optimizer.js.map +0 -1
  550. package/dist/translator/stages/parallel-facet.d.ts +0 -47
  551. package/dist/translator/stages/parallel-facet.d.ts.map +0 -1
  552. package/dist/translator/stages/parallel-facet.js +0 -57
  553. package/dist/translator/stages/parallel-facet.js.map +0 -1
  554. package/dist/translator/stages/project-stage.d.ts +0 -8
  555. package/dist/translator/stages/project-stage.d.ts.map +0 -1
  556. package/dist/translator/stages/project-stage.js +0 -145
  557. package/dist/translator/stages/project-stage.js.map +0 -1
  558. package/dist/translator/stages/search-stage.d.ts +0 -60
  559. package/dist/translator/stages/search-stage.d.ts.map +0 -1
  560. package/dist/translator/stages/search-stage.js +0 -89
  561. package/dist/translator/stages/search-stage.js.map +0 -1
  562. package/dist/translator/stages/skip-stage.d.ts +0 -7
  563. package/dist/translator/stages/skip-stage.d.ts.map +0 -1
  564. package/dist/translator/stages/skip-stage.js +0 -11
  565. package/dist/translator/stages/skip-stage.js.map +0 -1
  566. package/dist/translator/stages/sort-stage.d.ts +0 -7
  567. package/dist/translator/stages/sort-stage.d.ts.map +0 -1
  568. package/dist/translator/stages/sort-stage.js +0 -21
  569. package/dist/translator/stages/sort-stage.js.map +0 -1
  570. package/dist/translator/stages/types.d.ts +0 -136
  571. package/dist/translator/stages/types.d.ts.map +0 -1
  572. package/dist/translator/stages/types.js +0 -5
  573. package/dist/translator/stages/types.js.map +0 -1
  574. package/dist/translator/stages/unwind-stage.d.ts +0 -7
  575. package/dist/translator/stages/unwind-stage.d.ts.map +0 -1
  576. package/dist/translator/stages/unwind-stage.js +0 -61
  577. package/dist/translator/stages/unwind-stage.js.map +0 -1
  578. package/dist/translator/stages/vector-search-stage.d.ts +0 -53
  579. package/dist/translator/stages/vector-search-stage.d.ts.map +0 -1
  580. package/dist/translator/stages/vector-search-stage.js +0 -62
  581. package/dist/translator/stages/vector-search-stage.js.map +0 -1
  582. package/dist/translator/update-translator.d.ts +0 -148
  583. package/dist/translator/update-translator.d.ts.map +0 -1
  584. package/dist/translator/update-translator.js +0 -819
  585. package/dist/translator/update-translator.js.map +0 -1
  586. package/dist/translator/vector-translator.d.ts +0 -89
  587. package/dist/translator/vector-translator.d.ts.map +0 -1
  588. package/dist/translator/vector-translator.js +0 -106
  589. package/dist/translator/vector-translator.js.map +0 -1
  590. package/dist/types/env.d.ts +0 -31
  591. package/dist/types/env.d.ts.map +0 -1
  592. package/dist/types/env.js +0 -5
  593. package/dist/types/env.js.map +0 -1
  594. package/dist/types/function.d.ts +0 -65
  595. package/dist/types/function.d.ts.map +0 -1
  596. package/dist/types/function.js +0 -5
  597. package/dist/types/function.js.map +0 -1
  598. package/dist/types/index.d.ts +0 -137
  599. package/dist/types/index.d.ts.map +0 -1
  600. package/dist/types/index.js +0 -13
  601. package/dist/types/index.js.map +0 -1
  602. package/dist/types/mongodb.d.ts +0 -258
  603. package/dist/types/mongodb.d.ts.map +0 -1
  604. package/dist/types/mongodb.js +0 -5
  605. package/dist/types/mongodb.js.map +0 -1
  606. package/dist/types/objectid.d.ts +0 -130
  607. package/dist/types/objectid.d.ts.map +0 -1
  608. package/dist/types/objectid.js +0 -314
  609. package/dist/types/objectid.js.map +0 -1
  610. package/dist/types/rpc.d.ts +0 -313
  611. package/dist/types/rpc.d.ts.map +0 -1
  612. package/dist/types/rpc.js +0 -136
  613. package/dist/types/rpc.js.map +0 -1
  614. package/dist/types/vectorize.d.ts +0 -136
  615. package/dist/types/vectorize.d.ts.map +0 -1
  616. package/dist/types/vectorize.js +0 -8
  617. package/dist/types/vectorize.js.map +0 -1
  618. package/dist/utils/sql-safety.d.ts +0 -64
  619. package/dist/utils/sql-safety.d.ts.map +0 -1
  620. package/dist/utils/sql-safety.js +0 -112
  621. package/dist/utils/sql-safety.js.map +0 -1
  622. package/dist/validation/document-validator.d.ts +0 -195
  623. package/dist/validation/document-validator.d.ts.map +0 -1
  624. package/dist/validation/document-validator.js +0 -529
  625. package/dist/validation/document-validator.js.map +0 -1
  626. package/dist/vectorize/document-serializer.d.ts +0 -119
  627. package/dist/vectorize/document-serializer.d.ts.map +0 -1
  628. package/dist/vectorize/document-serializer.js +0 -320
  629. package/dist/vectorize/document-serializer.js.map +0 -1
  630. package/dist/wire/auth/index.d.ts +0 -5
  631. package/dist/wire/auth/index.d.ts.map +0 -1
  632. package/dist/wire/auth/index.js +0 -5
  633. package/dist/wire/auth/index.js.map +0 -1
  634. package/dist/wire/auth/scram.d.ts +0 -160
  635. package/dist/wire/auth/scram.d.ts.map +0 -1
  636. package/dist/wire/auth/scram.js +0 -425
  637. package/dist/wire/auth/scram.js.map +0 -1
  638. package/dist/wire/backend/interface.d.ts +0 -168
  639. package/dist/wire/backend/interface.d.ts.map +0 -1
  640. package/dist/wire/backend/interface.js +0 -10
  641. package/dist/wire/backend/interface.js.map +0 -1
  642. package/dist/wire/backend/local-sqlite.d.ts +0 -89
  643. package/dist/wire/backend/local-sqlite.d.ts.map +0 -1
  644. package/dist/wire/backend/local-sqlite.js +0 -1002
  645. package/dist/wire/backend/local-sqlite.js.map +0 -1
  646. package/dist/wire/backend/query-router.d.ts +0 -197
  647. package/dist/wire/backend/query-router.d.ts.map +0 -1
  648. package/dist/wire/backend/query-router.js +0 -590
  649. package/dist/wire/backend/query-router.js.map +0 -1
  650. package/dist/wire/backend/validation.d.ts +0 -26
  651. package/dist/wire/backend/validation.d.ts.map +0 -1
  652. package/dist/wire/backend/validation.js +0 -79
  653. package/dist/wire/backend/validation.js.map +0 -1
  654. package/dist/wire/backend/workers-proxy.d.ts +0 -95
  655. package/dist/wire/backend/workers-proxy.d.ts.map +0 -1
  656. package/dist/wire/backend/workers-proxy.js +0 -429
  657. package/dist/wire/backend/workers-proxy.js.map +0 -1
  658. package/dist/wire/commands/admin.d.ts +0 -49
  659. package/dist/wire/commands/admin.d.ts.map +0 -1
  660. package/dist/wire/commands/admin.js +0 -272
  661. package/dist/wire/commands/admin.js.map +0 -1
  662. package/dist/wire/commands/aggregate.d.ts +0 -15
  663. package/dist/wire/commands/aggregate.d.ts.map +0 -1
  664. package/dist/wire/commands/aggregate.js +0 -98
  665. package/dist/wire/commands/aggregate.js.map +0 -1
  666. package/dist/wire/commands/auth.d.ts +0 -58
  667. package/dist/wire/commands/auth.d.ts.map +0 -1
  668. package/dist/wire/commands/auth.js +0 -158
  669. package/dist/wire/commands/auth.js.map +0 -1
  670. package/dist/wire/commands/crud.d.ts +0 -49
  671. package/dist/wire/commands/crud.d.ts.map +0 -1
  672. package/dist/wire/commands/crud.js +0 -336
  673. package/dist/wire/commands/crud.js.map +0 -1
  674. package/dist/wire/commands/hello.d.ts +0 -35
  675. package/dist/wire/commands/hello.d.ts.map +0 -1
  676. package/dist/wire/commands/hello.js +0 -204
  677. package/dist/wire/commands/hello.js.map +0 -1
  678. package/dist/wire/commands/index.d.ts +0 -24
  679. package/dist/wire/commands/index.d.ts.map +0 -1
  680. package/dist/wire/commands/index.js +0 -145
  681. package/dist/wire/commands/index.js.map +0 -1
  682. package/dist/wire/commands/router.d.ts +0 -46
  683. package/dist/wire/commands/router.d.ts.map +0 -1
  684. package/dist/wire/commands/router.js +0 -151
  685. package/dist/wire/commands/router.js.map +0 -1
  686. package/dist/wire/commands/types.d.ts +0 -51
  687. package/dist/wire/commands/types.d.ts.map +0 -1
  688. package/dist/wire/commands/types.js +0 -15
  689. package/dist/wire/commands/types.js.map +0 -1
  690. package/dist/wire/index.d.ts +0 -15
  691. package/dist/wire/index.d.ts.map +0 -1
  692. package/dist/wire/index.js +0 -19
  693. package/dist/wire/index.js.map +0 -1
  694. package/dist/wire/message.d.ts +0 -49
  695. package/dist/wire/message.d.ts.map +0 -1
  696. package/dist/wire/message.js +0 -299
  697. package/dist/wire/message.js.map +0 -1
  698. package/dist/wire/server.d.ts +0 -145
  699. package/dist/wire/server.d.ts.map +0 -1
  700. package/dist/wire/server.js +0 -284
  701. package/dist/wire/server.js.map +0 -1
  702. package/dist/wire/types.d.ts +0 -140
  703. package/dist/wire/types.d.ts.map +0 -1
  704. package/dist/wire/types.js +0 -64
  705. package/dist/wire/types.js.map +0 -1
  706. 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