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 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAA8B,MAAM,yBAAyB,CAAC;AAEtF,kEAAkE;AAClE,eAAe;IACb,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAAa,EAAE,GAAqB;QAChE,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;CACF,CAAC;AAEF,gDAAgD;AAChD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5E,0CAA0C;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"sources":["../src/rpc/rpc-target.ts","../src/rpc/worker-entrypoint.ts","../src/durable-object/migrations.ts","../src/durable-object/schema.ts","../src/types/objectid.ts","../src/executor/function-executor.ts","../src/utils/sql-safety.ts","../src/translator/dialect.ts","../src/translator/stages/expression-translator.ts","../src/translator/query-translator.ts","../src/translator/stages/match-stage.ts","../src/translator/stages/project-stage.ts","../src/translator/stages/group-stage.ts","../src/translator/stages/sort-stage.ts","../src/translator/stages/limit-stage.ts","../src/translator/stages/skip-stage.ts","../src/translator/stages/count-stage.ts","../src/translator/stages/lookup-stage.ts","../src/translator/stages/unwind-stage.ts","../src/translator/stages/add-fields-stage.ts","../src/translator/stages/bucket-stage.ts","../src/translator/stages/facet-stage.ts","../src/translator/search-translator.ts","../src/translator/stages/search-stage.ts","../src/translator/stages/optimizer.ts","../src/translator/aggregation-translator.ts","../src/executor/aggregation-executor.ts","../src/mcp/server.ts","../src/mcp/transport/http.ts","../src/durable-object/mcp-handler.ts","../src/durable-object/mondo-database.ts","../src/worker.ts"],"names":["req","result","newWorkersRpcResponse","DEFAULT_OPTIONS","typeCheck","matchExpr","spaceIdx","term","selectParts","cteExpression","sql","name","state"],"mappings":"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","file":"worker.js","sourcesContent":["/**\n * RPC Target - Server-side RPC handler for capnweb-style Workers RPC\n *\n * Implements:\n * - MondoRpcTarget extending RpcTarget base class\n * - Request routing to Durable Object stubs\n * - HTTP batch protocol support\n * - Promise pipelining for chained operations\n */\n\nimport type {\n DurableObjectNamespace,\n DurableObjectId,\n DurableObjectStub,\n MondoEnv,\n RpcRequest,\n RpcResponse,\n BatchResponse,\n DatabaseRef,\n CollectionRef,\n BatchedExecutorOptions,\n PipelineOp,\n} from '../types/rpc'\n\n// Re-export types for backward compatibility\nexport type {\n DurableObjectNamespace,\n DurableObjectId,\n DurableObjectStub,\n MondoEnv,\n RpcRequest,\n RpcResponse,\n BatchResponse,\n DatabaseRef,\n CollectionRef,\n BatchedExecutorOptions,\n PipelineOp,\n}\n\n// ============================================================================\n// RpcTarget Base Class\n// ============================================================================\n\n/**\n * Base class for RPC targets (capnweb-style)\n */\nexport class RpcTarget {\n protected methods: Map<string, (...args: unknown[]) => Promise<unknown>> = new Map();\n\n /**\n * Allowlist of methods that can be invoked via RPC.\n * Subclasses should override this to define their allowed methods.\n * This prevents invocation of inherited methods like constructor, __proto__, toString, etc.\n */\n protected allowedMethods: Set<string> = new Set();\n\n /**\n * Register a method handler\n */\n protected registerMethod(name: string, handler: (...args: unknown[]) => Promise<unknown>): void {\n this.methods.set(name, handler);\n }\n\n /**\n * Check if a method exists and is allowed\n */\n hasMethod(name: string): boolean {\n // Only return true if the method is in the allowlist or registered methods\n if (this.methods.has(name)) {\n return true;\n }\n if (this.allowedMethods.has(name) && typeof (this as Record<string, unknown>)[name] === 'function') {\n return true;\n }\n return false;\n }\n\n /**\n * Invoke a method by name\n */\n async invoke(method: string, params: unknown[]): Promise<unknown> {\n // First check registered methods (these are always allowed)\n const handler = this.methods.get(method);\n if (handler) {\n return handler.apply(this, params);\n }\n\n // For class methods, enforce the allowlist to prevent prototype pollution\n // and invocation of inherited methods like constructor, __proto__, toString, etc.\n if (!this.allowedMethods.has(method)) {\n throw new Error(`Method not allowed: ${method}`);\n }\n\n // Then check class methods\n const fn = (this as Record<string, unknown>)[method];\n if (typeof fn === 'function') {\n return (fn as (...args: unknown[]) => Promise<unknown>).apply(this, params);\n }\n\n throw new Error(`Method not found: ${method}`);\n }\n}\n\n// ============================================================================\n// MondoRpcTarget - MongoDB API over RPC\n// ============================================================================\n\n/**\n * MondoRpcTarget provides MongoDB-compatible API via Workers RPC\n */\nexport class MondoRpcTarget extends RpcTarget {\n private env: MondoEnv;\n private currentConnectionString: string | null = null;\n private databases: Map<string, DatabaseRef> = new Map();\n\n /**\n * Explicit allowlist of methods that can be invoked via RPC.\n * This prevents invocation of inherited methods like constructor, __proto__, toString, etc.\n */\n protected override allowedMethods = new Set([\n 'connect',\n 'db',\n 'collection',\n 'find',\n 'insertOne',\n 'updateOne',\n 'deleteOne',\n ]);\n\n constructor(env: MondoEnv) {\n super();\n this.env = env;\n }\n\n /**\n * Connect to a MongoDB-compatible connection string\n */\n async connect(connectionString: string): Promise<{ connected: boolean; database?: string }> {\n this.currentConnectionString = connectionString;\n\n // Parse connection string to extract database name\n const url = new URL(connectionString.replace('mongodb://', 'http://'));\n const dbName = url.pathname.slice(1) || 'default';\n\n // Get or create the Durable Object stub for this database\n const id = this.env.MONDO_DATABASE.idFromName(dbName);\n const stub = this.env.MONDO_DATABASE.get(id);\n\n this.databases.set(dbName, { name: dbName, stub });\n\n return { connected: true, database: dbName };\n }\n\n /**\n * Get the current connection string\n */\n get connectionString(): string | null {\n return this.currentConnectionString;\n }\n\n /**\n * Get a database reference\n */\n async db(name: string): Promise<DatabaseRef> {\n // Check if we already have this database\n let dbRef = this.databases.get(name);\n\n if (!dbRef) {\n // Create new Durable Object stub for this database\n const id = this.env.MONDO_DATABASE.idFromName(name);\n const stub = this.env.MONDO_DATABASE.get(id);\n dbRef = { name, stub };\n this.databases.set(name, dbRef);\n }\n\n return dbRef;\n }\n\n /**\n * Get a collection reference\n */\n async collection(dbName: string, collectionName: string): Promise<CollectionRef> {\n const dbRef = await this.db(dbName);\n return {\n dbName,\n collectionName,\n stub: dbRef.stub,\n };\n }\n\n /**\n * Execute a find operation\n */\n async find(dbName: string, collectionName: string, query: Record<string, unknown>): Promise<unknown[]> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/find', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, query }),\n });\n return response.json();\n }\n\n /**\n * Execute an insertOne operation\n */\n async insertOne(dbName: string, collectionName: string, document: Record<string, unknown>): Promise<{ insertedId: string }> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/insertOne', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, document }),\n });\n return response.json();\n }\n\n /**\n * Execute an updateOne operation\n */\n async updateOne(dbName: string, collectionName: string, filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{ matchedCount: number; modifiedCount: number }> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/updateOne', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, filter, update }),\n });\n return response.json();\n }\n\n /**\n * Execute a deleteOne operation\n */\n async deleteOne(dbName: string, collectionName: string, filter: Record<string, unknown>): Promise<{ deletedCount: number }> {\n const dbRef = await this.db(dbName);\n const response = await dbRef.stub.fetch('http://internal/deleteOne', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ collection: collectionName, filter }),\n });\n return response.json();\n }\n}\n\n// ============================================================================\n// Workers RPC Response Handler\n// ============================================================================\n\n/**\n * Create a Workers RPC response from a target and request\n */\nexport async function newWorkersRpcResponse(target: RpcTarget, request: Request): Promise<Response> {\n const url = new URL(request.url);\n const isBatch = url.pathname.endsWith('/batch');\n\n try {\n const body = await request.json() as RpcRequest | RpcRequest[];\n\n if (isBatch && Array.isArray(body)) {\n // Handle batch requests\n const results = await Promise.all(\n body.map(async (req) => {\n try {\n const result = await target.invoke(req.method, req.params);\n return { id: req.id, result };\n } catch (error) {\n return {\n id: req.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n })\n );\n\n return new Response(JSON.stringify({ results }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Handle single request\n const req = body as RpcRequest;\n\n if (!target.hasMethod(req.method)) {\n return new Response(\n JSON.stringify({ error: `Method not found: ${req.method}` }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n const result = await target.invoke(req.method, req.params);\n\n return new Response(JSON.stringify({ id: req.id, result }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n return new Response(\n JSON.stringify({\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n}\n\n// ============================================================================\n// Batched RPC Executor\n// ============================================================================\n\n/**\n * Batched RPC executor that coalesces multiple requests\n */\nexport class BatchedRpcExecutor {\n private stub: DurableObjectStub;\n private options: Required<BatchedExecutorOptions>;\n private queue: Array<{\n method: string;\n params: Record<string, unknown>;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n }> = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(stub: DurableObjectStub, options: BatchedExecutorOptions = {}) {\n this.stub = stub;\n this.options = {\n maxBatchSize: options.maxBatchSize ?? 100,\n flushInterval: options.flushInterval ?? 10,\n };\n }\n\n /**\n * Execute a method with batching\n */\n execute(method: string, params: Record<string, unknown>): Promise<unknown> {\n return new Promise((resolve, reject) => {\n this.queue.push({ method, params, resolve, reject });\n\n // Auto-flush when batch size is reached\n if (this.queue.length >= this.options.maxBatchSize) {\n this.flush();\n } else if (!this.flushTimer) {\n // Schedule flush after interval\n this.flushTimer = setTimeout(() => this.flush(), this.options.flushInterval);\n }\n });\n }\n\n /**\n * Flush pending requests\n */\n async flush(): Promise<void> {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n // Process in batches\n while (this.queue.length > 0) {\n const batch = this.queue.splice(0, this.options.maxBatchSize);\n\n try {\n const response = await this.stub.fetch('http://internal/batch', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch.map((item, index) => ({\n id: String(index),\n method: item.method,\n params: item.params,\n }))),\n });\n\n const { results } = await response.json() as BatchResponse;\n\n batch.forEach((item, index) => {\n const result = results[index];\n if (result) {\n if (result.error) {\n item.reject(new Error(result.error));\n } else {\n item.resolve(result.result);\n }\n } else {\n item.reject(new Error('Missing result for batch item'));\n }\n });\n } catch (error) {\n // Reject all items in the batch\n batch.forEach((item) => {\n item.reject(error instanceof Error ? error : new Error('Unknown error'));\n });\n }\n }\n }\n}\n\n// ============================================================================\n// Promise Pipelining\n// ============================================================================\n\nlet pipelineOpIdCounter = 0;\n\n/**\n * Pipeline tracker for chained operations\n */\nexport class PipelineTracker {\n private operations: Map<string, PipelineOp> = new Map();\n private dependencyGraph: Map<string, Set<string>> = new Map();\n\n /**\n * Track a new operation\n */\n track(method: string, params: unknown[], dependency?: string): string {\n const id = `op-${++pipelineOpIdCounter}`;\n\n const dependencies: string[] = [];\n if (dependency) {\n dependencies.push(dependency);\n // Also add transitive dependencies\n const transitive = this.dependencyGraph.get(dependency);\n if (transitive) {\n dependencies.push(...transitive);\n }\n }\n\n this.operations.set(id, { id, method, params, dependencies });\n this.dependencyGraph.set(id, new Set(dependencies));\n\n return id;\n }\n\n /**\n * Get all dependencies for an operation\n */\n getDependencies(opId: string): string[] {\n return Array.from(this.dependencyGraph.get(opId) || []);\n }\n\n /**\n * Get operation by ID\n */\n getOperation(opId: string): PipelineOp | undefined {\n return this.operations.get(opId);\n }\n\n /**\n * Get all operations in dependency order\n */\n getOrderedOperations(): PipelineOp[] {\n const ordered: PipelineOp[] = [];\n const visited = new Set<string>();\n\n const visit = (id: string) => {\n if (visited.has(id)) return;\n visited.add(id);\n\n const op = this.operations.get(id);\n if (!op) return;\n\n op.dependencies.forEach(depId => visit(depId));\n ordered.push(op);\n };\n\n this.operations.forEach((_, id) => visit(id));\n return ordered;\n }\n}\n\n/**\n * Pipelined RPC proxy for chained method calls\n */\nexport class PipelinedRpcProxy {\n private target: MondoRpcTarget;\n private tracker: PipelineTracker;\n private currentDb: string | null = null;\n private currentCollection: string | null = null;\n\n constructor(target: MondoRpcTarget) {\n this.target = target;\n this.tracker = new PipelineTracker();\n }\n\n /**\n * Get a database reference (pipelined)\n */\n db(name: string): PipelinedDbProxy {\n const opId = this.tracker.track('db', [name]);\n this.currentDb = name;\n return new PipelinedDbProxy(this, name, opId);\n }\n\n /**\n * Execute the pipelined operations\n */\n async execute(): Promise<unknown> {\n if (!this.currentDb) {\n throw new Error('No database selected');\n }\n return this.target.db(this.currentDb);\n }\n\n /**\n * Get the underlying target\n */\n getTarget(): MondoRpcTarget {\n return this.target;\n }\n\n /**\n * Get current database name\n */\n getCurrentDb(): string | null {\n return this.currentDb;\n }\n\n /**\n * Get current collection name\n */\n getCurrentCollection(): string | null {\n return this.currentCollection;\n }\n\n /**\n * Set current collection\n */\n setCurrentCollection(name: string): void {\n this.currentCollection = name;\n }\n}\n\n/**\n * Pipelined database proxy\n */\nclass PipelinedDbProxy {\n private parent: PipelinedRpcProxy;\n private dbName: string;\n private operationId: string;\n\n constructor(parent: PipelinedRpcProxy, dbName: string, opId: string) {\n this.parent = parent;\n this.dbName = dbName;\n this.operationId = opId;\n }\n\n /**\n * Get the operation ID\n */\n get opId(): string {\n return this.operationId;\n }\n\n /**\n * Get a collection reference (pipelined)\n */\n collection(name: string): PipelinedCollectionProxy {\n this.parent.setCurrentCollection(name);\n return new PipelinedCollectionProxy(this.parent, this.dbName, name);\n }\n}\n\n/**\n * Pipelined collection proxy\n */\nclass PipelinedCollectionProxy {\n private parent: PipelinedRpcProxy;\n private dbName: string;\n private collectionName: string;\n\n constructor(parent: PipelinedRpcProxy, dbName: string, collectionName: string) {\n this.parent = parent;\n this.dbName = dbName;\n this.collectionName = collectionName;\n }\n\n /**\n * Find documents (executes the pipeline)\n */\n async find(query: Record<string, unknown>): Promise<unknown[]> {\n return this.parent.getTarget().find(this.dbName, this.collectionName, query);\n }\n\n /**\n * Insert one document\n */\n async insertOne(document: Record<string, unknown>): Promise<{ insertedId: string }> {\n return this.parent.getTarget().insertOne(this.dbName, this.collectionName, document);\n }\n\n /**\n * Update one document\n */\n async updateOne(filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{ matchedCount: number; modifiedCount: number }> {\n return this.parent.getTarget().updateOne(this.dbName, this.collectionName, filter, update);\n }\n\n /**\n * Delete one document\n */\n async deleteOne(filter: Record<string, unknown>): Promise<{ deletedCount: number }> {\n return this.parent.getTarget().deleteOne(this.dbName, this.collectionName, filter);\n }\n}\n","/**\n * Worker Entrypoint - Workers RPC service binding support\n *\n * Implements:\n * - MondoEntrypoint extending WorkerEntrypoint\n * - Service binding methods\n * - TypeScript declarations\n * - Environment safety\n */\n\nimport { MondoRpcTarget } from './rpc-target';\nimport type {\n DurableObjectNamespace,\n DurableObjectStub,\n DatabaseRef,\n CollectionRef,\n MondoEnv,\n WorkerLoader,\n WorkerCode,\n WorkerStub,\n} from '../types/rpc';\n\n// Re-export types for backward compatibility\nexport type {\n DurableObjectNamespace,\n DurableObjectStub,\n DatabaseRef,\n CollectionRef,\n MondoEnv,\n WorkerLoader,\n WorkerCode,\n WorkerStub,\n};\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\n/**\n * Execution context interface\n */\nexport interface ExecutionContext {\n waitUntil(promise: Promise<unknown>): void;\n passThroughOnException(): void;\n}\n\n/**\n * Mondo bindings interface (for service binding consumers)\n */\nexport interface MondoBindings {\n /** Connect to a MongoDB-compatible connection string */\n connect(connectionString: string): Promise<{ connected: boolean; database?: string }>;\n /** Get a database reference */\n db(name: string): Promise<DatabaseRef>;\n /** Get a collection reference */\n collection(dbName: string, collectionName: string): Promise<CollectionRef>;\n}\n\n/**\n * Default options for the entrypoint\n */\nexport const DEFAULT_OPTIONS = {\n /** Maximum batch size for batched operations */\n maxBatchSize: 100,\n /** Request timeout in milliseconds */\n timeout: 30000,\n /** Enable background cleanup */\n enableCleanup: true,\n /** Cleanup interval in milliseconds */\n cleanupInterval: 60000,\n} as const;\n\n/**\n * Entrypoint options\n */\nexport interface MondoEntrypointOptions {\n maxBatchSize?: number;\n timeout?: number;\n enableCleanup?: boolean;\n cleanupInterval?: number;\n}\n\n// ============================================================================\n// WorkerEntrypoint Base Class\n// ============================================================================\n\n/**\n * Base class for Worker entrypoints (capnweb-style)\n */\nexport class WorkerEntrypoint {\n protected ctx: ExecutionContext;\n protected env: unknown;\n\n constructor(ctx: ExecutionContext, env: unknown) {\n this.ctx = ctx;\n this.env = env;\n }\n\n /**\n * Handle HTTP fetch requests\n */\n async fetch(_request: Request): Promise<Response> {\n return new Response('Method not implemented', { status: 501 });\n }\n}\n\n// ============================================================================\n// Environment Validation\n// ============================================================================\n\n/**\n * Type guard for Mondo environment\n */\nexport function isMondoEnv(env: unknown): env is MondoEnv {\n if (!env || typeof env !== 'object') return false;\n const e = env as Record<string, unknown>;\n return (\n typeof e.MONDO_DATABASE === 'object' &&\n e.MONDO_DATABASE !== null &&\n typeof (e.MONDO_DATABASE as Record<string, unknown>).idFromName === 'function' &&\n typeof (e.MONDO_DATABASE as Record<string, unknown>).get === 'function'\n );\n}\n\n/**\n * Validate environment bindings\n */\nexport function validateEnv(env: unknown): boolean {\n return isMondoEnv(env);\n}\n\n// ============================================================================\n// MondoEntrypoint\n// ============================================================================\n\n/**\n * MondoEntrypoint extends WorkerEntrypoint for service binding support\n *\n * Usage in wrangler.toml:\n * ```toml\n * [[services]]\n * binding = \"MONDO\"\n * service = \"mongo.do\"\n * entrypoint = \"MondoEntrypoint\"\n * ```\n *\n * Usage in consuming worker:\n * ```typescript\n * const result = await env.MONDO.connect('mongodb://localhost/mydb');\n * ```\n */\nexport class MondoEntrypoint extends WorkerEntrypoint implements MondoBindings {\n protected override env: MondoEnv;\n private rpcTarget: MondoRpcTarget;\n private entrypointOptions: Required<MondoEntrypointOptions>;\n private cleanupScheduled = false;\n\n constructor(ctx: ExecutionContext, env: MondoEnv) {\n super(ctx, env);\n\n // Validate environment bindings\n if (!validateEnv(env)) {\n throw new Error(\n 'Invalid environment: MONDO_DATABASE binding is required. ' +\n 'Please configure the Durable Object binding in your wrangler.toml.'\n );\n }\n\n this.env = env;\n this.rpcTarget = new MondoRpcTarget(env);\n this.entrypointOptions = {\n maxBatchSize: DEFAULT_OPTIONS.maxBatchSize,\n timeout: DEFAULT_OPTIONS.timeout,\n enableCleanup: DEFAULT_OPTIONS.enableCleanup,\n cleanupInterval: DEFAULT_OPTIONS.cleanupInterval,\n };\n }\n\n /**\n * Get the entrypoint options\n */\n get options(): Required<MondoEntrypointOptions> {\n return this.entrypointOptions;\n }\n\n /**\n * Handle HTTP fetch requests\n */\n override async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url);\n\n // Health check endpoint\n if (url.pathname === '/health') {\n return new Response(JSON.stringify({ status: 'healthy' }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Bindings check endpoint (for diagnostics)\n if (url.pathname === '/bindings') {\n const bindings = {\n MONDO_DATABASE: !!this.env.MONDO_DATABASE,\n LOADER: !!this.env.LOADER,\n LOADER_type: this.env.LOADER ? typeof this.env.LOADER : 'undefined',\n LOADER_keys: this.env.LOADER ? Object.keys(this.env.LOADER as object) : [],\n };\n return new Response(JSON.stringify(bindings, null, 2), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // RPC endpoint\n if (url.pathname === '/rpc' || url.pathname.startsWith('/rpc/')) {\n const { newWorkersRpcResponse } = await import('./rpc-target');\n return newWorkersRpcResponse(this.rpcTarget, request);\n }\n\n return new Response('Not found', { status: 404 });\n }\n\n /**\n * Connect to a MongoDB-compatible connection string\n */\n async connect(connectionString: string): Promise<{ connected: boolean; database?: string }> {\n return this.rpcTarget.connect(connectionString);\n }\n\n /**\n * Get a database reference\n */\n async db(name: string): Promise<DatabaseRef> {\n return this.rpcTarget.db(name);\n }\n\n /**\n * Get a collection reference\n */\n async collection(dbName: string, collectionName: string): Promise<CollectionRef> {\n return this.rpcTarget.collection(dbName, collectionName);\n }\n\n /**\n * Execute a find operation\n */\n async find(dbName: string, collectionName: string, query: Record<string, unknown>): Promise<unknown[]> {\n return this.rpcTarget.find(dbName, collectionName, query);\n }\n\n /**\n * Execute an insertOne operation\n */\n async insertOne(dbName: string, collectionName: string, document: Record<string, unknown>): Promise<{ insertedId: string }> {\n return this.rpcTarget.insertOne(dbName, collectionName, document);\n }\n\n /**\n * Execute an updateOne operation\n */\n async updateOne(\n dbName: string,\n collectionName: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n return this.rpcTarget.updateOne(dbName, collectionName, filter, update);\n }\n\n /**\n * Execute a deleteOne operation\n */\n async deleteOne(dbName: string, collectionName: string, filter: Record<string, unknown>): Promise<{ deletedCount: number }> {\n return this.rpcTarget.deleteOne(dbName, collectionName, filter);\n }\n\n /**\n * Schedule background cleanup task\n */\n scheduleCleanup(): void {\n if (this.cleanupScheduled) return;\n this.cleanupScheduled = true;\n\n const cleanupPromise = this.runCleanup();\n this.ctx.waitUntil(cleanupPromise);\n }\n\n /**\n * Run cleanup task\n */\n private async runCleanup(): Promise<void> {\n // Placeholder for cleanup logic\n // Could include: clearing caches, closing stale connections, etc.\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n /**\n * Get the underlying RPC target (for testing)\n */\n getRpcTarget(): MondoRpcTarget {\n return this.rpcTarget;\n }\n}\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\nexport { MondoRpcTarget, newWorkersRpcResponse } from './rpc-target';\n// Note: All RPC types are consolidated in '../types/rpc' and re-exported at the top of this file.\n// The following types are re-exported from '../types/rpc' for convenience:\nexport type { DurableObjectId, RpcRequest, RpcResponse, BatchResponse } from '../types/rpc';\n","/**\n * Schema Migrations for MondoDB\n *\n * This module contains all schema migrations in a separate, organized structure.\n * Each migration is a function that transforms the database from one version to the next.\n */\n\nimport type { DurableObjectStorage } from './schema';\n\n/**\n * Migration function signature\n */\nexport type Migration = {\n version: number;\n description: string;\n up: (storage: DurableObjectStorage) => Promise<void>;\n down?: (storage: DurableObjectStorage) => Promise<void>;\n};\n\n/**\n * SQL statements for initial schema (v1)\n *\n * UNIFIED SCHEMA: This schema supports both MondoDatabase and IndexManager:\n * - collections table: stores collection metadata including indexes JSON\n * - documents table: stores documents with _id as the document identifier\n *\n * Both components import these definitions from schema.ts which re-exports them.\n */\nconst INITIAL_SCHEMA_SQL = {\n createCollections: `\n CREATE TABLE IF NOT EXISTS collections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n options TEXT DEFAULT '{}',\n indexes TEXT DEFAULT '[]',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `.trim(),\n\n createDocuments: `\n CREATE TABLE IF NOT EXISTS documents (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n _id TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(collection_id, _id),\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\n )\n `.trim(),\n\n createIdIndex: `\n CREATE INDEX IF NOT EXISTS idx_documents_id ON documents(_id)\n `.trim(),\n\n createCompositeIndex: `\n CREATE INDEX IF NOT EXISTS idx_documents_collection_id ON documents(collection_id, _id)\n `.trim(),\n};\n\n/**\n * All migrations in order\n */\nexport const migrations: Migration[] = [\n {\n version: 1,\n description: 'Initial schema - collections and documents tables',\n up: async (storage: DurableObjectStorage) => {\n // Create tables\n storage.sql.exec(INITIAL_SCHEMA_SQL.createCollections);\n storage.sql.exec(INITIAL_SCHEMA_SQL.createDocuments);\n\n // Create indexes for optimized queries\n storage.sql.exec(INITIAL_SCHEMA_SQL.createIdIndex);\n storage.sql.exec(INITIAL_SCHEMA_SQL.createCompositeIndex);\n },\n down: async (storage: DurableObjectStorage) => {\n // Drop in reverse order\n storage.sql.exec('DROP INDEX IF EXISTS idx_documents_collection_id');\n storage.sql.exec('DROP INDEX IF EXISTS idx_documents_id');\n storage.sql.exec('DROP TABLE IF EXISTS documents');\n storage.sql.exec('DROP TABLE IF EXISTS collections');\n },\n },\n];\n\n/**\n * Get migration by version number\n */\nexport function getMigration(version: number): Migration | undefined {\n return migrations.find((m) => m.version === version);\n}\n\n/**\n * Get all migrations from a starting version to an ending version\n */\nexport function getMigrationsInRange(\n fromVersion: number,\n toVersion: number\n): Migration[] {\n return migrations.filter(\n (m) => m.version > fromVersion && m.version <= toVersion\n );\n}\n\n/**\n * Get the latest migration version\n */\nexport function getLatestVersion(): number {\n if (migrations.length === 0) return 0;\n return Math.max(...migrations.map((m) => m.version));\n}\n\n/**\n * Validate migration sequence - ensures no gaps in version numbers\n */\nexport function validateMigrations(): { valid: boolean; error?: string } {\n if (migrations.length === 0) {\n return { valid: true };\n }\n\n const sortedVersions = [...migrations].sort((a, b) => a.version - b.version);\n\n // Check for duplicates\n const seen = new Set<number>();\n for (const migration of sortedVersions) {\n if (seen.has(migration.version)) {\n return {\n valid: false,\n error: `Duplicate migration version: ${migration.version}`,\n };\n }\n seen.add(migration.version);\n }\n\n // Check for gaps (starting from 1)\n for (let i = 0; i < sortedVersions.length; i++) {\n const migration = sortedVersions[i];\n if (migration && migration.version !== i + 1) {\n return {\n valid: false,\n error: `Missing migration version: ${i + 1}`,\n };\n }\n }\n\n return { valid: true };\n}\n","/**\n * SQLite Schema Management for MondoDB\n *\n * This module handles the initialization and management of SQLite tables\n * for MongoDB-compatible document storage in Cloudflare Durable Objects.\n *\n * UNIFIED SCHEMA TYPES:\n * This module serves as the single source of truth for all schema-related types\n * used by both IndexManager and MondoDatabase.\n */\n\nimport {\n migrations,\n getMigrationsInRange,\n getLatestVersion,\n validateMigrations,\n} from './migrations';\n\n// Re-export common types from src/types for convenience\nexport type {\n IndexSpec,\n IndexInfo,\n CreateIndexOptions,\n CreateIndexResult,\n DropIndexResult,\n Document,\n InsertOneResult,\n InsertManyResult,\n DeleteResult,\n UpdateResult,\n FindOptions,\n CollectionMetadata,\n} from '../types';\n\n/**\n * Current schema version - derived from migrations module\n */\nexport const SCHEMA_VERSION = getLatestVersion();\n\n/**\n * Schema key used for storing version in Durable Object storage\n */\nexport const SCHEMA_VERSION_KEY = 'schema_version';\n\n/**\n * Table definitions for the schema (exported for reference/testing)\n *\n * UNIFIED SCHEMA: This schema supports both MondoDatabase and IndexManager:\n * - collections table: stores collection metadata including indexes JSON\n * - documents table: stores documents with _id as the document identifier\n *\n * Note: The actual table creation is handled by migrations.ts.\n * These definitions are kept in sync for reference and testing.\n */\nexport const SCHEMA_TABLES = {\n collections: {\n name: 'collections',\n sql: `\n CREATE TABLE IF NOT EXISTS collections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n options TEXT DEFAULT '{}',\n indexes TEXT DEFAULT '[]',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `.trim(),\n },\n documents: {\n name: 'documents',\n sql: `\n CREATE TABLE IF NOT EXISTS documents (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n collection_id INTEGER NOT NULL,\n _id TEXT NOT NULL,\n data TEXT NOT NULL DEFAULT '{}',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(collection_id, _id),\n FOREIGN KEY (collection_id) REFERENCES collections(id) ON DELETE CASCADE\n )\n `.trim(),\n },\n} as const;\n\n/**\n * Index definitions for optimized queries\n */\nexport const SCHEMA_INDEXES = {\n documents_id: {\n name: 'idx_documents_id',\n sql: `CREATE INDEX IF NOT EXISTS idx_documents_id ON documents(_id)`,\n },\n documents_collection_id: {\n name: 'idx_documents_collection_id',\n sql: `CREATE INDEX IF NOT EXISTS idx_documents_collection_id ON documents(collection_id, _id)`,\n },\n} as const;\n\n// ============================================================================\n// UNIFIED SQL STORAGE INTERFACES\n// ============================================================================\n// These interfaces are used by both IndexManager and MondoDatabase to interact\n// with SQLite storage. The two styles (prepared statements vs exec) are both\n// supported to accommodate different use cases.\n\n/**\n * Interface for SQL query result with parameter binding\n * Used by MondoDatabase with Cloudflare's native SQL interface\n */\nexport interface SqlQueryResult {\n toArray(): unknown[];\n run(): void;\n bind(...params: unknown[]): SqlQueryResult;\n}\n\n/**\n * Interface for Cloudflare Durable Object SQL storage\n * Used by MondoDatabase for direct SQL execution\n */\nexport interface SqlStorage {\n exec(sql: string, ...params: unknown[]): SqlQueryResult;\n}\n\n/**\n * Interface for Cloudflare Durable Object storage\n * Used by MondoDatabase and SchemaManager\n */\nexport interface DurableObjectStorage {\n sql: SqlStorage;\n get<T>(key: string): Promise<T | undefined>;\n put(key: string, value: unknown): Promise<void>;\n /**\n * Execute a synchronous callback wrapped in a transaction.\n * If the callback throws, the transaction is rolled back.\n * Only available for SQLite-backed Durable Objects.\n */\n transactionSync<T>(callback: () => T): T;\n}\n\n/**\n * Interface for SQL prepared statement\n * Used by IndexManager for prepared statement execution\n */\nexport interface SQLStatement {\n bind(...params: unknown[]): SQLStatement;\n run(): void;\n first<T = unknown>(): T | null;\n all<T = unknown>(): T[];\n}\n\n/**\n * Interface for SQLite-compatible storage with SQL execution\n * Used by IndexManager for prepared statement-based operations\n *\n * This is an alternative interface to DurableObjectStorage that provides\n * a prepare() method for creating prepared statements, which is useful\n * for operations that need to retrieve results or bind parameters.\n */\nexport interface SQLStorage {\n exec(sql: string): void;\n prepare(sql: string): SQLStatement;\n}\n\n// ============================================================================\n// TTL INDEX TYPES\n// ============================================================================\n// These types support Time-To-Live (TTL) indexes for automatic document expiration\n\n/**\n * TTL Index information with collection context\n */\nexport interface TTLIndexInfo {\n collectionName: string;\n collectionId: number;\n indexName: string;\n field: string;\n expireAfterSeconds: number;\n}\n\n/**\n * TTL metadata for tracking cleanup operations\n */\nexport interface TTLMetadata {\n field: string;\n expireAfterSeconds: number;\n lastCleanupAt?: string;\n lastCleanupCount?: number;\n}\n\n/**\n * Result of a TTL cleanup operation\n */\nexport interface TTLCleanupResult {\n ok: 1;\n collectionsProcessed: number;\n documentsDeleted: number;\n errors?: string[];\n}\n\n/**\n * Query info for deleting expired documents\n */\nexport interface ExpiredDocumentsQuery {\n sql: string;\n params: unknown[];\n}\n\n/**\n * Legacy migration type (kept for backwards compatibility)\n * @deprecated Use migrations module instead\n */\nexport type MigrationFn = (storage: DurableObjectStorage) => Promise<void>;\n\n/**\n * Legacy migration registry (kept for backwards compatibility)\n * @deprecated Use migrations module instead\n */\nexport const MIGRATIONS: Record<number, MigrationFn> = Object.fromEntries(\n migrations.map((m) => [m.version, m.up])\n);\n\n/**\n * Schema validation result\n */\nexport interface SchemaValidationResult {\n valid: boolean;\n missingTables: string[];\n missingIndexes: string[];\n errors: string[];\n}\n\n/**\n * Required tables for schema integrity\n */\nconst REQUIRED_TABLES = ['collections', 'documents'];\n\n/**\n * Required indexes for schema integrity\n */\nconst REQUIRED_INDEXES = ['idx_documents_id', 'idx_documents_collection_id'];\n\n/**\n * SchemaManager handles SQLite schema initialization and migrations\n */\nexport class SchemaManager {\n private storage: DurableObjectStorage;\n\n constructor(storage: DurableObjectStorage) {\n this.storage = storage;\n\n // Validate migrations on construction\n const validation = validateMigrations();\n if (!validation.valid) {\n throw new Error(`Invalid migrations: ${validation.error}`);\n }\n }\n\n /**\n * Initialize the schema, running migrations if needed\n */\n async initializeSchema(): Promise<void> {\n const currentVersion = await this.storage.get<number>(SCHEMA_VERSION_KEY);\n\n // Skip if already at current version\n if (currentVersion === SCHEMA_VERSION) {\n return;\n }\n\n const startVersion = currentVersion ?? 0;\n\n // Get and run all applicable migrations\n const migrationsToRun = getMigrationsInRange(startVersion, SCHEMA_VERSION);\n\n for (const migration of migrationsToRun) {\n await migration.up(this.storage);\n }\n\n // Update schema version\n await this.storage.put(SCHEMA_VERSION_KEY, SCHEMA_VERSION);\n }\n\n /**\n * Validate that the schema is properly initialized\n * Returns true if all required tables exist\n */\n async validateSchema(): Promise<boolean> {\n const result = await this.validateSchemaDetailed();\n return result.valid;\n }\n\n /**\n * Detailed schema validation with specific error information\n */\n async validateSchemaDetailed(): Promise<SchemaValidationResult> {\n const result: SchemaValidationResult = {\n valid: true,\n missingTables: [],\n missingIndexes: [],\n errors: [],\n };\n\n try {\n // Check for required tables\n const tablesResult = this.storage.sql.exec(\n `SELECT name FROM sqlite_master WHERE type='table' AND name IN ('collections', 'documents')`\n );\n const tables = tablesResult.toArray() as { name: string }[];\n const tableNames = new Set(tables.map((t) => t.name));\n\n for (const requiredTable of REQUIRED_TABLES) {\n if (!tableNames.has(requiredTable)) {\n result.missingTables.push(requiredTable);\n result.valid = false;\n }\n }\n\n // Check for required indexes\n const indexesResult = this.storage.sql.exec(\n `SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%'`\n );\n const indexes = indexesResult.toArray() as { name: string }[];\n const indexNames = new Set(indexes.map((i) => i.name));\n\n for (const requiredIndex of REQUIRED_INDEXES) {\n if (!indexNames.has(requiredIndex)) {\n result.missingIndexes.push(requiredIndex);\n result.valid = false;\n }\n }\n } catch (error) {\n result.valid = false;\n result.errors.push(\n error instanceof Error ? error.message : 'Unknown error during validation'\n );\n }\n\n return result;\n }\n\n /**\n * Get the current schema version from storage\n */\n async getSchemaVersion(): Promise<number> {\n const version = await this.storage.get<number>(SCHEMA_VERSION_KEY);\n return version ?? 0;\n }\n\n /**\n * Check if schema needs migration\n */\n async needsMigration(): Promise<boolean> {\n const currentVersion = await this.getSchemaVersion();\n return currentVersion < SCHEMA_VERSION;\n }\n\n /**\n * Get list of pending migrations\n */\n async getPendingMigrations(): Promise<number[]> {\n const currentVersion = await this.getSchemaVersion();\n const pending = getMigrationsInRange(currentVersion, SCHEMA_VERSION);\n return pending.map((m) => m.version);\n }\n}\n","/**\n * ObjectId - MongoDB-compatible 12-byte unique identifier\n *\n * Structure (12 bytes = 24 hex characters):\n * - 4 bytes: Unix timestamp (seconds since epoch)\n * - 5 bytes: Random value (generated once per process)\n * - 3 bytes: Incrementing counter (initialized to random value)\n *\n * Compatible with MongoDB BSON ObjectId specification.\n */\n\n// Pre-computed hex lookup table for fast byte-to-hex conversion\nconst HEX_LOOKUP: string[] = Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n)\n\n// Pre-computed hex char to nibble map for fast hex-to-byte conversion\nconst HEX_CHAR_TO_NIBBLE: Record<string, number> = {}\nfor (let i = 0; i < 16; i++) {\n const hex = i.toString(16)\n HEX_CHAR_TO_NIBBLE[hex] = i\n HEX_CHAR_TO_NIBBLE[hex.toUpperCase()] = i\n}\n\n// Regex pattern for validation (compiled once)\nconst OBJECTID_PATTERN = /^[0-9a-fA-F]{24}$/\n\n/**\n * Process-level state for ObjectId generation\n */\nclass ObjectIdState {\n private randomBytes: Uint8Array | null = null\n private counter: number\n\n constructor() {\n // Initialize counter to random value\n this.counter = Math.floor(Math.random() * 0xffffff)\n }\n\n getRandomBytes(): Uint8Array {\n if (!this.randomBytes) {\n this.randomBytes = new Uint8Array(5)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(this.randomBytes)\n } else {\n // Fallback for environments without Web Crypto API\n for (let i = 0; i < 5; i++) {\n this.randomBytes[i] = Math.floor(Math.random() * 256)\n }\n }\n }\n return this.randomBytes\n }\n\n getNextCounter(): number {\n const value = this.counter\n this.counter = (this.counter + 1) & 0xffffff // Wrap at 24 bits\n return value\n }\n}\n\n// Singleton state instance\nconst state = new ObjectIdState()\n\n/**\n * Fast bytes to hex conversion using lookup table\n */\nfunction bytesToHex(bytes: Uint8Array): string {\n let result = ''\n for (let i = 0; i < bytes.length; i++) {\n result += HEX_LOOKUP[bytes[i]]\n }\n return result\n}\n\n/**\n * Fast hex to bytes conversion using nibble map\n */\nfunction hexToBytes(hex: string): Uint8Array {\n const len = hex.length >> 1\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n const hi = HEX_CHAR_TO_NIBBLE[hex[i * 2]]\n const lo = HEX_CHAR_TO_NIBBLE[hex[i * 2 + 1]]\n bytes[i] = (hi << 4) | lo\n }\n return bytes\n}\n\n/**\n * Write a 32-bit integer as 4 big-endian bytes\n */\nfunction writeUInt32BE(buffer: Uint8Array, value: number, offset: number): void {\n buffer[offset] = (value >>> 24) & 0xff\n buffer[offset + 1] = (value >>> 16) & 0xff\n buffer[offset + 2] = (value >>> 8) & 0xff\n buffer[offset + 3] = value & 0xff\n}\n\n/**\n * Read 4 big-endian bytes as a 32-bit unsigned integer\n */\nfunction readUInt32BE(buffer: Uint8Array, offset: number): number {\n return (\n ((buffer[offset] << 24) |\n (buffer[offset + 1] << 16) |\n (buffer[offset + 2] << 8) |\n buffer[offset + 3]) >>>\n 0\n )\n}\n\n/**\n * Type guard for ObjectId-like values\n */\nexport type ObjectIdLike = ObjectId | string | Uint8Array\n\n/**\n * Input types accepted by ObjectId constructor\n */\nexport type ObjectIdInput = ObjectIdLike | null | undefined\n\n/**\n * ObjectId class - MongoDB-compatible unique identifier\n *\n * @example\n * ```typescript\n * // Generate new ObjectId\n * const id = new ObjectId()\n *\n * // Create from hex string\n * const id2 = ObjectId.createFromHexString('507f1f77bcf86cd799439011')\n *\n * // Get timestamp\n * const timestamp = id.getTimestamp()\n *\n * // Compare ObjectIds\n * id.equals(id2) // false\n * ```\n */\nexport class ObjectId {\n /** BSON type identifier for serialization compatibility */\n readonly _bsontype = 'ObjectId' as const\n\n /** The raw 12-byte buffer containing the ObjectId data */\n readonly id: Uint8Array\n\n /** Cached hex string representation (computed lazily) */\n private _hexString: string | null = null\n\n /**\n * Create a new ObjectId\n *\n * @param input - Optional: hex string, Uint8Array, or another ObjectId.\n * If omitted, generates a new unique ObjectId.\n * @throws {TypeError} If input is invalid\n */\n constructor(input?: ObjectIdInput) {\n if (input === undefined || input === null) {\n this.id = this.generate()\n } else if (typeof input === 'string') {\n if (!ObjectId.isValidHex(input)) {\n throw new TypeError(\n `Invalid ObjectId hex string: \"${input}\". Must be 24 hex characters.`\n )\n }\n this.id = hexToBytes(input.toLowerCase())\n this._hexString = input.toLowerCase()\n } else if (input instanceof Uint8Array) {\n if (input.length !== 12) {\n throw new TypeError(\n `ObjectId buffer must be exactly 12 bytes, received ${input.length}`\n )\n }\n this.id = new Uint8Array(input)\n } else if (input instanceof ObjectId) {\n this.id = new Uint8Array(input.id)\n this._hexString = input._hexString\n } else {\n throw new TypeError(\n `Invalid ObjectId input type. Expected string, Uint8Array, or ObjectId.`\n )\n }\n }\n\n /**\n * Generate a new 12-byte ObjectId buffer\n * Structure: 4-byte timestamp | 5-byte random | 3-byte counter\n */\n private generate(): Uint8Array {\n const buffer = new Uint8Array(12)\n\n // 4 bytes: Unix timestamp in seconds (big-endian)\n const timestamp = Math.floor(Date.now() / 1000)\n writeUInt32BE(buffer, timestamp, 0)\n\n // 5 bytes: Random value (cached per process)\n const randomBytes = state.getRandomBytes()\n buffer.set(randomBytes, 4)\n\n // 3 bytes: Incrementing counter (big-endian, 24-bit)\n const counterValue = state.getNextCounter()\n buffer[9] = (counterValue >>> 16) & 0xff\n buffer[10] = (counterValue >>> 8) & 0xff\n buffer[11] = counterValue & 0xff\n\n return buffer\n }\n\n /**\n * Get the timestamp component of this ObjectId as a Date\n *\n * @returns Date object representing when this ObjectId was generated\n */\n getTimestamp(): Date {\n const seconds = readUInt32BE(this.id, 0)\n return new Date(seconds * 1000)\n }\n\n /**\n * Get the generation time as Unix timestamp (seconds)\n */\n getGenerationTime(): number {\n return readUInt32BE(this.id, 0)\n }\n\n /**\n * Return the ObjectId as a 24-character lowercase hex string\n */\n toHexString(): string {\n if (!this._hexString) {\n this._hexString = bytesToHex(this.id)\n }\n return this._hexString\n }\n\n /**\n * String representation of the ObjectId (same as toHexString)\n */\n toString(): string {\n return this.toHexString()\n }\n\n /**\n * JSON serialization - returns hex string\n * This allows ObjectIds to serialize naturally in JSON.stringify()\n */\n toJSON(): string {\n return this.toHexString()\n }\n\n /**\n * Compare this ObjectId to another value for equality\n *\n * @param other - ObjectId, hex string, or null/undefined to compare\n * @returns true if the ObjectIds are equal, false otherwise\n */\n equals(other: ObjectId | string | null | undefined): boolean {\n if (other === null || other === undefined) {\n return false\n }\n\n if (other instanceof ObjectId) {\n // Fast path: compare bytes directly if hex strings are cached\n if (this._hexString && other._hexString) {\n return this._hexString === other._hexString\n }\n // Compare bytes\n for (let i = 0; i < 12; i++) {\n if (this.id[i] !== other.id[i]) {\n return false\n }\n }\n return true\n }\n\n // Compare with string\n return this.toHexString() === other.toLowerCase()\n }\n\n /**\n * Primitive value conversion (returns hex string)\n */\n valueOf(): string {\n return this.toHexString()\n }\n\n /**\n * Symbol.toStringTag for better debugging output\n */\n get [Symbol.toStringTag](): string {\n return 'ObjectId'\n }\n\n /**\n * Create custom inspect output for Node.js console\n */\n [Symbol.for('nodejs.util.inspect.custom')](): string {\n return `ObjectId(\"${this.toHexString()}\")`\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create an ObjectId from a 24-character hex string\n *\n * @param hexString - 24-character hex string\n * @returns New ObjectId instance\n * @throws {TypeError} If hexString is invalid\n */\n static createFromHexString(hexString: string): ObjectId {\n if (!ObjectId.isValidHex(hexString)) {\n throw new TypeError(\n `Invalid ObjectId hex string: \"${hexString}\". Must be 24 hex characters.`\n )\n }\n return new ObjectId(hexString)\n }\n\n /**\n * Create an ObjectId with a specific timestamp\n * Useful for range queries on _id fields\n *\n * @param time - Unix timestamp in seconds\n * @returns New ObjectId with the given timestamp and zeroed remaining bytes\n */\n static createFromTime(time: number): ObjectId {\n const buffer = new Uint8Array(12)\n writeUInt32BE(buffer, time, 0)\n // Remaining 8 bytes are already zero from Uint8Array initialization\n return new ObjectId(buffer)\n }\n\n /**\n * Generate a new ObjectId (factory method, equivalent to new ObjectId())\n *\n * @returns New unique ObjectId instance\n */\n static generate(): ObjectId {\n return new ObjectId()\n }\n\n /**\n * Check if a value is a valid ObjectId or ObjectId hex string\n *\n * @param value - Value to check\n * @returns true if valid ObjectId or 24-char hex string\n */\n static isValid(value: unknown): value is ObjectId | string {\n if (value instanceof ObjectId) {\n return true\n }\n if (typeof value === 'string') {\n return ObjectId.isValidHex(value)\n }\n return false\n }\n\n /**\n * Check if a string is a valid 24-character hex string\n */\n private static isValidHex(str: string): boolean {\n return (\n typeof str === 'string' && str.length === 24 && OBJECTID_PATTERN.test(str)\n )\n }\n}\n\nexport default ObjectId\n","/**\n * FunctionExecutor - Secure execution of user functions via worker-loader\n *\n * Uses Cloudflare's worker-loader binding to execute arbitrary JavaScript\n * in isolated V8 contexts with:\n * - globalOutbound: null (no network access)\n * - Empty env (no binding access)\n * - Timeout enforcement\n */\n\nimport type { WorkerLoader, WorkerCode } from '../types/function'\n\ninterface Env {\n LOADER?: WorkerLoader\n}\n\nexport class FunctionExecutor {\n private env: Env\n\n constructor(env: Env) {\n this.env = env\n }\n\n /**\n * Execute a function with given arguments\n */\n async execute(body: string, args: unknown[], timeout = 5000): Promise<unknown> {\n if (!this.env.LOADER) {\n throw new Error(\n '$function requires worker_loaders binding. ' +\n 'Add to wrangler.jsonc: \"worker_loaders\": [{ \"binding\": \"LOADER\" }]'\n )\n }\n\n const normalizedBody = this.normalizeBody(body)\n const hash = await this.hashFunction(normalizedBody)\n\n const loader = this.env.LOADER\n const worker = loader.get(`fn-${hash}`, async (): Promise<WorkerCode> => ({\n compatibilityDate: '2024-09-25',\n mainModule: 'fn.js',\n modules: {\n 'fn.js': this.generateWorkerCode(normalizedBody, false)\n },\n globalOutbound: null,\n env: {}\n }))\n\n if (!worker.getEntrypoint) {\n throw new Error('Worker stub does not support getEntrypoint')\n }\n const entrypoint = worker.getEntrypoint()\n const response = await entrypoint.fetch(\n new Request('http://internal/execute', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ args, timeout })\n })\n )\n\n const result = await response.json() as { result?: unknown; error?: string }\n\n if (result.error) {\n throw new Error(`$function execution failed: ${result.error}`)\n }\n\n return result.result\n }\n\n /**\n * Execute a function for multiple arg sets in a single isolate (batch mode)\n */\n async executeBatch(body: string, argsArray: unknown[][], timeout = 10000): Promise<unknown[]> {\n if (!this.env.LOADER) {\n throw new Error(\n '$function requires worker_loaders binding. ' +\n 'Add to wrangler.jsonc: \"worker_loaders\": [{ \"binding\": \"LOADER\" }]'\n )\n }\n\n const normalizedBody = this.normalizeBody(body)\n const hash = await this.hashFunction(normalizedBody)\n\n const loader = this.env.LOADER\n const worker = loader.get(`fn-batch-${hash}`, async (): Promise<WorkerCode> => ({\n compatibilityDate: '2024-09-25',\n mainModule: 'fn.js',\n modules: {\n 'fn.js': this.generateWorkerCode(normalizedBody, true)\n },\n globalOutbound: null,\n env: {}\n }))\n\n if (!worker.getEntrypoint) {\n throw new Error('Worker stub does not support getEntrypoint')\n }\n const entrypoint = worker.getEntrypoint()\n const response = await entrypoint.fetch(\n new Request('http://internal/execute-batch', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ argsArray, timeout })\n })\n )\n\n const result = await response.json() as { results?: unknown[]; error?: string }\n\n if (result.error) {\n throw new Error(`$function batch execution failed: ${result.error}`)\n }\n\n return result.results ?? []\n }\n\n /**\n * Normalize function body to consistent format\n */\n private normalizeBody(body: string): string {\n const trimmed = body.trim()\n // Wrap function declarations in parentheses for invocation\n if (trimmed.startsWith('function')) {\n return `(${trimmed})`\n }\n return trimmed\n }\n\n /**\n * Generate SHA-256 hash of function body for caching\n */\n private async hashFunction(body: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(body)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n return Array.from(new Uint8Array(hashBuffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n .substring(0, 16) // Use first 16 chars for shorter IDs\n }\n\n /**\n * Generate the worker code that executes user functions\n */\n private generateWorkerCode(body: string, isBatch: boolean): string {\n if (isBatch) {\n return `\nexport default {\n async fetch(request) {\n try {\n const { argsArray, timeout = 10000 } = await request.json();\n const fn = ${body};\n\n const executeWithTimeout = async (args) => {\n const result = fn(...args);\n if (result instanceof Promise) {\n return Promise.race([\n result,\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Function execution timeout')), timeout)\n )\n ]);\n }\n return result;\n };\n\n const results = await Promise.all(argsArray.map(args => executeWithTimeout(args)));\n return Response.json({ results });\n } catch (err) {\n return Response.json({ error: err.message });\n }\n }\n}\n`\n }\n\n return `\nexport default {\n async fetch(request) {\n try {\n const { args, timeout = 5000 } = await request.json();\n const fn = ${body};\n const result = fn(...args);\n\n // Enforce timeout for async functions\n if (result instanceof Promise) {\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Function execution timeout')), timeout)\n );\n const finalResult = await Promise.race([result, timeoutPromise]);\n return Response.json({ result: finalResult });\n }\n\n return Response.json({ result });\n } catch (err) {\n return Response.json({ error: err.message });\n }\n }\n}\n`\n }\n}\n","/**\n * SQL Safety Utilities\n *\n * Functions to validate and sanitize field names and identifiers\n * to prevent SQL injection attacks.\n */\n\n/**\n * Regular expression pattern for valid MongoDB field names.\n * Allows alphanumeric characters, underscores, dots (for nested paths),\n * hyphens, and dollar signs (for operators/special fields).\n */\nconst SAFE_FIELD_PATTERN = /^[a-zA-Z0-9_.$-]+$/\n\n/**\n * Regular expression pattern for valid SQL identifiers.\n * Only allows alphanumeric characters and underscores.\n */\nconst SAFE_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/\n\n/**\n * Validates and returns a field name/path for safe use in SQL json_extract expressions.\n * Prevents SQL injection by only allowing safe characters in field paths.\n *\n * @param field - The field name or dot-notation path to validate\n * @returns The validated field name (unchanged if valid)\n * @throws Error if field name contains invalid characters\n *\n * @example\n * validateFieldPath('name') // returns 'name'\n * validateFieldPath('user.address') // returns 'user.address'\n * validateFieldPath(\"foo'; DROP--\") // throws Error\n */\nexport function validateFieldPath(field: string): string {\n if (!field || field.length === 0) {\n throw new Error('Field name cannot be empty')\n }\n\n // Check for null bytes\n if (field.includes('\\0')) {\n throw new Error('Field name cannot contain null characters')\n }\n\n // Check against safe pattern\n if (!SAFE_FIELD_PATTERN.test(field)) {\n throw new Error(\n `Invalid field name: \"${field}\". Field names can only contain alphanumeric characters, underscores, dots, hyphens, and dollar signs.`\n )\n }\n\n // Validate dot notation structure\n if (field.includes('..') || field.startsWith('.') || field.endsWith('.')) {\n throw new Error(\n `Invalid field path: \"${field}\". Field paths cannot have consecutive, leading, or trailing dots.`\n )\n }\n\n return field\n}\n\n/**\n * Validates an identifier (table name, index name, column name) for safe use in SQL.\n * Only allows alphanumeric characters and underscores, must start with letter or underscore.\n *\n * @param identifier - The identifier to validate\n * @returns The validated identifier (unchanged if valid)\n * @throws Error if identifier contains invalid characters\n *\n * @example\n * validateIdentifier('users') // returns 'users'\n * validateIdentifier('my_table_1') // returns 'my_table_1'\n * validateIdentifier('1table') // throws Error (starts with number)\n * validateIdentifier(\"users'; DROP--\")// throws Error\n */\nexport function validateIdentifier(identifier: string): string {\n if (!identifier || identifier.length === 0) {\n throw new Error('Identifier cannot be empty')\n }\n\n // Check for null bytes\n if (identifier.includes('\\0')) {\n throw new Error('Identifier cannot contain null characters')\n }\n\n // Check against safe pattern\n if (!SAFE_IDENTIFIER_PATTERN.test(identifier)) {\n throw new Error(\n `Invalid identifier: \"${identifier}\". Identifiers can only contain alphanumeric characters and underscores, and must start with a letter or underscore.`\n )\n }\n\n return identifier\n}\n\n/**\n * Creates a safe JSON path expression for use in json_extract().\n * Validates the field name and returns the properly formatted path.\n *\n * @param field - The field name or dot-notation path\n * @returns The JSON path string (e.g., '$.field.name')\n * @throws Error if field name is invalid\n *\n * @example\n * safeJsonPath('name') // returns '$.name'\n * safeJsonPath('user.address') // returns '$.user.address'\n * safeJsonPath('$special') // returns '$.$special' (preserves leading $)\n */\nexport function safeJsonPath(field: string): string {\n const validField = validateFieldPath(field)\n return validField.startsWith('$') ? validField : `$.${validField}`\n}\n\n/**\n * Creates a safe json_extract expression for use in SQL.\n * Validates the field name and returns the complete expression.\n *\n * @param dataColumn - The name of the JSON data column (e.g., 'data', 'value')\n * @param field - The field name or dot-notation path\n * @returns The json_extract expression (e.g., \"json_extract(data, '$.field')\")\n * @throws Error if field name is invalid\n *\n * @example\n * safeJsonExtract('data', 'name') // returns \"json_extract(data, '$.name')\"\n * safeJsonExtract('value', 'a.b') // returns \"json_extract(value, '$.a.b')\"\n */\nexport function safeJsonExtract(dataColumn: string, field: string): string {\n validateIdentifier(dataColumn)\n const jsonPath = safeJsonPath(field)\n return `json_extract(${dataColumn}, '${jsonPath}')`\n}\n","/**\n * SQL Dialect Support - Types and helpers for multi-database SQL generation\n *\n * Supports:\n * - sqlite: Default dialect, uses json_extract, CAST, etc.\n * - clickhouse: Uses JSONExtract*, toInt32, groupArray, etc.\n */\n\nexport type SQLDialect = 'sqlite' | 'clickhouse'\n\nexport interface DialectOptions {\n /** SQL dialect to use (default: 'sqlite') */\n dialect?: SQLDialect\n /** For ClickHouse: use positional ? parameters instead of typed {name:Type} */\n parameterMode?: 'positional' | 'typed'\n /** For ClickHouse: add WITH TOTALS to GROUP BY */\n withTotals?: boolean\n /** For ClickHouse: add FINAL modifier for ReplacingMergeTree tables */\n useFinal?: boolean\n /** For ClickHouse: use PREWHERE instead of WHERE for optimization */\n usePrewhere?: boolean\n}\n\nconst VALID_DIALECTS: SQLDialect[] = ['sqlite', 'clickhouse']\n\n/**\n * Validate dialect option and return normalized value\n */\nexport function validateDialect(dialect?: SQLDialect): SQLDialect {\n if (!dialect) return 'sqlite'\n if (!VALID_DIALECTS.includes(dialect)) {\n throw new Error(`Invalid dialect '${dialect}'. Supported dialects: ${VALID_DIALECTS.join(', ')}`)\n }\n return dialect\n}\n\n/**\n * Helper to choose SQL syntax based on dialect\n * @param dialect The SQL dialect\n * @param options Object with dialect-specific SQL strings\n */\nexport function dialectFn<T>(\n dialect: SQLDialect,\n options: { sqlite: T; clickhouse: T }\n): T {\n return options[dialect]\n}\n\n/**\n * JSON Extract functions by dialect\n */\nexport function jsonExtract(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n // Convert $.field.nested to 'field', 'nested' format\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n if (parts.length === 1 && parts[0] === '') {\n return dataColumn // root path\n }\n const pathArgs = parts.map(p => `'${p}'`).join(', ')\n return `JSONExtractRaw(${dataColumn}, ${pathArgs})`\n }\n // SQLite\n return `json_extract(${dataColumn}, '${path}')`\n}\n\n/**\n * JSON type checking by dialect\n */\nexport function jsonType(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n const pathArgs = parts.filter(p => p).map(p => `'${p}'`).join(', ')\n if (pathArgs) {\n return `JSONType(${dataColumn}, ${pathArgs})`\n }\n return `JSONType(${dataColumn})`\n }\n // SQLite - use json_extract then json_type for consistency\n return `json_type(json_extract(${dataColumn}, '${path}'))`\n}\n\n/**\n * JSON type checking with path argument directly (for $exists)\n */\nexport function jsonTypeWithPath(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n const pathArgs = parts.filter(p => p).map(p => `'${p}'`).join(', ')\n if (pathArgs) {\n return `JSONType(${dataColumn}, ${pathArgs})`\n }\n return `JSONType(${dataColumn})`\n }\n // SQLite - json_type can take data and path directly for existence checks\n return `json_type(${dataColumn}, '${path}')`\n}\n\n/**\n * JSON array length by dialect\n */\nexport function jsonArrayLength(dialect: SQLDialect, dataColumn: string, path: string): string {\n if (dialect === 'clickhouse') {\n const parts = path.replace(/^\\$\\.?/, '').split('.')\n const pathArgs = parts.filter(p => p).map(p => `'${p}'`).join(', ')\n return `JSONLength(${dataColumn}, ${pathArgs})`\n }\n // SQLite\n return `json_array_length(json_extract(${dataColumn}, '${path}'))`\n}\n\n/**\n * Type casting by dialect\n */\nexport interface CastOptions {\n toInt: (expr: string) => string\n toDouble: (expr: string) => string\n toString: (expr: string) => string\n toDate: (expr: string) => string\n toDecimal: (expr: string) => string\n}\n\nexport function getCastFunctions(dialect: SQLDialect): CastOptions {\n if (dialect === 'clickhouse') {\n return {\n toInt: (expr) => `toInt64(${expr})`,\n toDouble: (expr) => `toFloat64(${expr})`,\n toString: (expr) => `toString(${expr})`,\n toDate: (expr) => `toDateTime(${expr})`,\n toDecimal: (expr) => `toDecimal64(${expr}, 4)`\n }\n }\n // SQLite\n return {\n toInt: (expr) => `CAST(${expr} AS INTEGER)`,\n toDouble: (expr) => `CAST(${expr} AS REAL)`,\n toString: (expr) => `CAST(${expr} AS TEXT)`,\n toDate: (expr) => `datetime(${expr})`,\n toDecimal: (expr) => `CAST(${expr} AS REAL)`\n }\n}\n\n/**\n * Aggregation functions by dialect\n */\nexport interface AggregationFunctions {\n push: (expr: string) => string\n addToSet: (expr: string) => string\n first: (expr: string) => string\n last: (expr: string) => string\n sum: (expr: string) => string\n avg: (expr: string) => string\n min: (expr: string) => string\n max: (expr: string) => string\n count: () => string\n}\n\nexport function getAggregationFunctions(dialect: SQLDialect): AggregationFunctions {\n if (dialect === 'clickhouse') {\n return {\n push: (expr) => `groupArray(${expr})`,\n addToSet: (expr) => `groupUniqArray(${expr})`,\n first: (expr) => `any(${expr})`,\n last: (expr) => `anyLast(${expr})`,\n sum: (expr) => `sum(${expr})`,\n avg: (expr) => `avg(${expr})`,\n min: (expr) => `min(${expr})`,\n max: (expr) => `max(${expr})`,\n count: () => `count()`\n }\n }\n // SQLite\n return {\n push: (expr) => `json_group_array(${expr})`,\n addToSet: (expr) => `json_group_array(DISTINCT ${expr})`,\n first: (expr) => `(SELECT ${expr} LIMIT 1)`,\n last: (expr) => `(SELECT ${expr} ORDER BY ROWID DESC LIMIT 1)`,\n sum: (expr) => `SUM(${expr})`,\n avg: (expr) => `AVG(${expr})`,\n min: (expr) => `MIN(${expr})`,\n max: (expr) => `MAX(${expr})`,\n count: () => `COUNT(*)`\n }\n}\n\n/**\n * String functions by dialect\n */\nexport interface StringFunctions {\n indexOf: (str: string, search: string) => string\n strLength: (str: string) => string\n replaceAll: (str: string, find: string, replace: string) => string\n lower: (str: string) => string\n upper: (str: string) => string\n substr: (str: string, start: string, len: string) => string\n concat: (parts: string[]) => string\n}\n\nexport function getStringFunctions(dialect: SQLDialect): StringFunctions {\n if (dialect === 'clickhouse') {\n return {\n indexOf: (str, search) => `position(${str}, ${search})`,\n strLength: (str) => `length(${str})`,\n replaceAll: (str, find, replace) => `replaceAll(${str}, ${find}, ${replace})`,\n lower: (str) => `lower(${str})`,\n upper: (str) => `upper(${str})`,\n substr: (str, start, len) => `substring(${str}, ${start} + 1, ${len})`,\n concat: (parts) => `concat(${parts.join(', ')})`\n }\n }\n // SQLite\n return {\n indexOf: (str, search) => `INSTR(${str}, ${search})`,\n strLength: (str) => `LENGTH(${str})`,\n replaceAll: (str, find, replace) => `REPLACE(${str}, ${find}, ${replace})`,\n lower: (str) => `LOWER(${str})`,\n upper: (str) => `UPPER(${str})`,\n substr: (str, start, len) => `SUBSTR(${str}, ${start} + 1, ${len})`,\n concat: (parts) => parts.join(' || ')\n }\n}\n\n/**\n * Date functions by dialect\n */\nexport interface DateFunctions {\n fromString: (str: string) => string\n toString: (date: string, format: string) => string\n year: (date: string) => string\n month: (date: string) => string\n day: (date: string) => string\n hour: (date: string) => string\n minute: (date: string) => string\n second: (date: string) => string\n dateDiff: (unit: string, start: string, end: string) => string\n dateAdd: (date: string, unit: string, amount: string) => string\n dateTrunc: (date: string, unit: string) => string\n}\n\nexport function getDateFunctions(dialect: SQLDialect): DateFunctions {\n if (dialect === 'clickhouse') {\n return {\n fromString: (str) => `parseDateTimeBestEffort(${str})`,\n toString: (date, format) => `formatDateTime(${date}, ${format})`,\n year: (date) => `toYear(${date})`,\n month: (date) => `toMonth(${date})`,\n day: (date) => `toDayOfMonth(${date})`,\n hour: (date) => `toHour(${date})`,\n minute: (date) => `toMinute(${date})`,\n second: (date) => `toSecond(${date})`,\n dateDiff: (unit, start, end) => `dateDiff('${unit}', ${start}, ${end})`,\n dateAdd: (date, unit, amount) => `dateAdd(${unit}, ${amount}, ${date})`,\n dateTrunc: (date, unit) => {\n const fnMap: Record<string, string> = {\n day: 'toStartOfDay',\n month: 'toStartOfMonth',\n year: 'toStartOfYear',\n hour: 'toStartOfHour',\n minute: 'toStartOfMinute'\n }\n return `${fnMap[unit] || 'toStartOfDay'}(${date})`\n }\n }\n }\n // SQLite\n return {\n fromString: (str) => `datetime(${str})`,\n toString: (date, format) => `strftime(${format}, ${date})`,\n year: (date) => `CAST(strftime('%Y', ${date}) AS INTEGER)`,\n month: (date) => `CAST(strftime('%m', ${date}) AS INTEGER)`,\n day: (date) => `CAST(strftime('%d', ${date}) AS INTEGER)`,\n hour: (date) => `CAST(strftime('%H', ${date}) AS INTEGER)`,\n minute: (date) => `CAST(strftime('%M', ${date}) AS INTEGER)`,\n second: (date) => `CAST(strftime('%S', ${date}) AS INTEGER)`,\n dateDiff: (unit, start, end) => {\n if (unit === 'day') {\n return `CAST(julianday(${end}) - julianday(${start}) AS INTEGER)`\n }\n return `CAST((julianday(${end}) - julianday(${start})) * 24 AS INTEGER)` // hours\n },\n dateAdd: (date, unit, amount) => `datetime(${date}, '+' || ${amount} || ' ${unit}')`,\n dateTrunc: (date, unit) => {\n if (unit === 'day') {\n return `date(${date})`\n }\n if (unit === 'month') {\n return `date(${date}, 'start of month')`\n }\n if (unit === 'year') {\n return `date(${date}, 'start of year')`\n }\n return `datetime(${date})`\n }\n }\n}\n\n/**\n * Array functions by dialect\n */\nexport interface ArrayFunctions {\n unwind: (source: string, arrayPath: string, aliasName: string) => { sql: string; joinType: 'JOIN' | 'ARRAY JOIN' }\n filter: (array: string, varName: string, condition: string) => string\n map: (array: string, varName: string, expr: string) => string\n reduce: (array: string, initial: string, varName: string, accName: string, expr: string) => string\n slice: (array: string, start: string, count?: string) => string\n concat: (arrays: string[]) => string\n in: (value: string, array: string) => string\n}\n\nexport function getArrayFunctions(dialect: SQLDialect): ArrayFunctions {\n if (dialect === 'clickhouse') {\n return {\n unwind: (_source, arrayPath, aliasName) => ({\n sql: `${arrayPath} AS ${aliasName}`,\n joinType: 'ARRAY JOIN'\n }),\n filter: (array, varName, condition) => `arrayFilter(${varName} -> ${condition}, ${array})`,\n map: (array, varName, expr) => `arrayMap(${varName} -> ${expr}, ${array})`,\n reduce: (array, _initial, _varName, _accName, _expr) => `arrayReduce('sumState', ${array})`,\n slice: (array, start, count) => count ? `arraySlice(${array}, ${start}, ${count})` : `arraySlice(${array}, ${start})`,\n concat: (arrays) => `arrayConcat(${arrays.join(', ')})`,\n in: (value, array) => `has(${array}, ${value})`\n }\n }\n // SQLite\n return {\n unwind: (_source, arrayPath, aliasName) => ({\n sql: `json_each(${arrayPath}) AS ${aliasName}`,\n joinType: 'JOIN'\n }),\n filter: (array, varName, condition) => `(SELECT json_group_array(value) FROM json_each(${array}) WHERE ${condition.replace(new RegExp(varName, 'g'), 'value')})`,\n map: (array, varName, expr) => `(SELECT json_group_array(${expr.replace(new RegExp(varName, 'g'), 'value')}) FROM json_each(${array}))`,\n reduce: (array, initial, _varName, _accName, _expr) => `(SELECT ${initial} + TOTAL(value) FROM json_each(${array}))`,\n slice: (array, start, count) => count\n ? `(SELECT json_group_array(value) FROM (SELECT value FROM json_each(${array}) LIMIT ${count} OFFSET ${start}))`\n : `(SELECT json_group_array(value) FROM (SELECT value FROM json_each(${array}) OFFSET ${start}))`,\n concat: (arrays) => arrays.length === 2 ? `json_array(${arrays[0]}, ${arrays[1]})` : `json_array(${arrays.join(', ')})`,\n in: (value, array) => `EXISTS (SELECT 1 FROM json_each(${array}) WHERE value = ${value})`\n }\n}\n\n/**\n * Regex/pattern matching by dialect\n */\nexport function regexMatch(dialect: SQLDialect, column: string, pattern: string, caseInsensitive: boolean): string {\n if (dialect === 'clickhouse') {\n if (caseInsensitive) {\n return `${column} ILIKE ${pattern}`\n }\n return `${column} LIKE ${pattern}`\n }\n // SQLite\n if (caseInsensitive) {\n return `LOWER(${column}) LIKE LOWER(${pattern})`\n }\n return `${column} LIKE ${pattern}`\n}\n\n/**\n * NULL handling by dialect\n */\nexport function nullCheck(_dialect: SQLDialect, column: string): string {\n // Both dialects support IS NULL\n return `${column} IS NULL`\n}\n\nexport function ifNull(dialect: SQLDialect, exprs: string[]): string {\n if (dialect === 'clickhouse') {\n // ClickHouse supports ifNull for 2 args, coalesce for more\n if (exprs.length === 2) {\n return `ifNull(${exprs[0]}, ${exprs[1]})`\n }\n return `coalesce(${exprs.join(', ')})`\n }\n // SQLite uses COALESCE\n return `COALESCE(${exprs.join(', ')})`\n}\n","/**\n * Expression Translator - Translates MongoDB aggregation expressions to SQL\n * Handles arithmetic, string, conditional, comparison, and function operators\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { FunctionSpec, FunctionExpression } from '../../types/function'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport {\n type SQLDialect,\n jsonExtract as dialectJsonExtract,\n getCastFunctions,\n getStringFunctions,\n getDateFunctions,\n getArrayFunctions,\n ifNull as dialectIfNull,\n} from '../dialect'\n\n/**\n * Check if a value is a field reference (starts with $)\n */\nexport function isFieldReference(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith('$') && !value.startsWith('$$')\n}\n\n/**\n * Get the JSON path for a field reference\n *\n * SECURITY: Validates field name to prevent SQL injection attacks.\n * @throws Error if field contains invalid characters\n */\nexport function getFieldPath(fieldRef: string): string {\n // Remove the leading $ and convert to JSON path\n const field = fieldRef.substring(1)\n\n // Validate the field path to prevent SQL injection\n validateFieldPath(field)\n\n const parts = field.split('.')\n let path = '$'\n\n for (const part of parts) {\n if (/^\\d+$/.test(part)) {\n path += `[${part}]`\n } else {\n path += `.${part}`\n }\n }\n\n return path\n}\n\n/**\n * Translate an expression value (field reference, literal, or expression object)\n */\nexport function translateExpressionValue(value: unknown, params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n if (isFieldReference(value)) {\n const path = getFieldPath(value)\n return dialectJsonExtract(dialect, 'data', path)\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return translateExpression(value as Record<string, unknown>, params, dialect)\n }\n\n if (typeof value === 'string') {\n params.push(value)\n return '?'\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n\n if (value === null) {\n return 'NULL'\n }\n\n params.push(JSON.stringify(value))\n return '?'\n}\n\n/**\n * Main expression translator\n */\nexport function translateExpression(\n expr: Record<string, unknown>,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n const keys = Object.keys(expr)\n\n if (keys.length === 0) {\n return 'NULL'\n }\n\n const operator = keys[0]\n\n // Arithmetic operators\n if (operator === '$add') {\n return translateArithmetic(expr.$add as unknown[], params, '+', dialect)\n }\n if (operator === '$subtract') {\n return translateArithmetic(expr.$subtract as unknown[], params, '-', dialect)\n }\n if (operator === '$multiply') {\n return translateArithmetic(expr.$multiply as unknown[], params, '*', dialect)\n }\n if (operator === '$divide') {\n return translateArithmetic(expr.$divide as unknown[], params, '/', dialect)\n }\n if (operator === '$mod') {\n return translateArithmetic(expr.$mod as unknown[], params, '%', dialect)\n }\n\n // Type conversion operators\n const castFns = getCastFunctions(dialect)\n if (operator === '$toInt') {\n const val = translateExpressionValue(expr.$toInt, params, dialect)\n return castFns.toInt(val)\n }\n if (operator === '$toDouble') {\n const val = translateExpressionValue(expr.$toDouble, params, dialect)\n return castFns.toDouble(val)\n }\n if (operator === '$toString') {\n const val = translateExpressionValue(expr.$toString, params, dialect)\n return castFns.toString(val)\n }\n if (operator === '$toDate') {\n const val = translateExpressionValue(expr.$toDate, params, dialect)\n return castFns.toDate(val)\n }\n if (operator === '$toDecimal') {\n const val = translateExpressionValue(expr.$toDecimal, params, dialect)\n return castFns.toDecimal(val)\n }\n\n // String operators\n const strFns = getStringFunctions(dialect)\n if (operator === '$concat') {\n return translateConcat(expr.$concat as unknown[], params, dialect)\n }\n if (operator === '$substr') {\n return translateSubstr(expr.$substr as unknown[], params, dialect)\n }\n if (operator === '$toLower') {\n const val = translateExpressionValue(expr.$toLower, params, dialect)\n return strFns.lower(val)\n }\n if (operator === '$toUpper') {\n const val = translateExpressionValue(expr.$toUpper, params, dialect)\n return strFns.upper(val)\n }\n if (operator === '$indexOfBytes') {\n const args = expr.$indexOfBytes as unknown[]\n const str = translateExpressionValue(args[0], params, dialect)\n const search = translateExpressionValue(args[1], params, dialect)\n return strFns.indexOf(str, search)\n }\n if (operator === '$strLenBytes') {\n const val = translateExpressionValue(expr.$strLenBytes, params, dialect)\n return strFns.strLength(val)\n }\n if (operator === '$replaceAll') {\n const spec = expr.$replaceAll as { input: unknown; find: unknown; replacement: unknown }\n const input = translateExpressionValue(spec.input, params, dialect)\n const find = translateExpressionValue(spec.find, params, dialect)\n const replacement = translateExpressionValue(spec.replacement, params, dialect)\n return strFns.replaceAll(input, find, replacement)\n }\n\n // Date operators\n const dateFns = getDateFunctions(dialect)\n if (operator === '$dateFromString') {\n const spec = expr.$dateFromString as { dateString: unknown }\n const str = translateExpressionValue(spec.dateString, params, dialect)\n return dateFns.fromString(str)\n }\n if (operator === '$dateToString') {\n const spec = expr.$dateToString as { format: string; date: unknown }\n const date = translateExpressionValue(spec.date, params, dialect)\n params.push(spec.format)\n return dateFns.toString(date, '?')\n }\n if (operator === '$year') {\n const val = translateExpressionValue(expr.$year, params, dialect)\n return dateFns.year(val)\n }\n if (operator === '$month') {\n const val = translateExpressionValue(expr.$month, params, dialect)\n return dateFns.month(val)\n }\n if (operator === '$dayOfMonth') {\n const val = translateExpressionValue(expr.$dayOfMonth, params, dialect)\n return dateFns.day(val)\n }\n if (operator === '$hour') {\n const val = translateExpressionValue(expr.$hour, params, dialect)\n return dateFns.hour(val)\n }\n if (operator === '$minute') {\n const val = translateExpressionValue(expr.$minute, params, dialect)\n return dateFns.minute(val)\n }\n if (operator === '$second') {\n const val = translateExpressionValue(expr.$second, params, dialect)\n return dateFns.second(val)\n }\n if (operator === '$dateDiff') {\n const spec = expr.$dateDiff as { startDate: unknown; endDate: unknown; unit: string }\n const start = translateExpressionValue(spec.startDate, params, dialect)\n const end = translateExpressionValue(spec.endDate, params, dialect)\n return dateFns.dateDiff(spec.unit, start, end)\n }\n if (operator === '$dateAdd') {\n const spec = expr.$dateAdd as { startDate: unknown; unit: string; amount: unknown }\n const date = translateExpressionValue(spec.startDate, params, dialect)\n const amount = translateExpressionValue(spec.amount, params, dialect)\n return dateFns.dateAdd(date, spec.unit, amount)\n }\n if (operator === '$dateTrunc') {\n const spec = expr.$dateTrunc as { date: unknown; unit: string }\n const date = translateExpressionValue(spec.date, params, dialect)\n return dateFns.dateTrunc(date, spec.unit)\n }\n\n // Array operators\n const arrFns = getArrayFunctions(dialect)\n if (operator === '$in') {\n const args = expr.$in as unknown[]\n const value = translateExpressionValue(args[0], params, dialect)\n const array = translateExpressionValue(args[1], params, dialect)\n return arrFns.in(value, array)\n }\n if (operator === '$concatArrays') {\n const args = expr.$concatArrays as unknown[]\n const arrays = args.map(a => translateExpressionValue(a, params, dialect))\n return arrFns.concat(arrays)\n }\n if (operator === '$filter') {\n const spec = expr.$filter as { input: unknown; as: string; cond: unknown }\n const array = translateExpressionValue(spec.input, params, dialect)\n const cond = translateExpressionValue(spec.cond, params, dialect)\n return arrFns.filter(array, spec.as || 'this', cond)\n }\n if (operator === '$map') {\n const spec = expr.$map as { input: unknown; as: string; in: unknown }\n const array = translateExpressionValue(spec.input, params, dialect)\n const inExpr = translateExpressionValue(spec.in, params, dialect)\n return arrFns.map(array, spec.as || 'this', inExpr)\n }\n if (operator === '$reduce') {\n const spec = expr.$reduce as { input: unknown; initialValue: unknown; in: unknown }\n const array = translateExpressionValue(spec.input, params, dialect)\n const initial = translateExpressionValue(spec.initialValue, params, dialect)\n const inExpr = translateExpressionValue(spec.in, params, dialect)\n return arrFns.reduce(array, initial, 'this', 'value', inExpr)\n }\n if (operator === '$slice') {\n const args = expr.$slice as unknown[]\n const array = translateExpressionValue(args[0], params, dialect)\n const count = translateExpressionValue(args[1], params, dialect)\n return arrFns.slice(array, '0', count)\n }\n\n // Conditional operators\n if (operator === '$cond') {\n return translateCond(expr.$cond as Record<string, unknown> | unknown[], params, dialect)\n }\n if (operator === '$ifNull') {\n return translateIfNull(expr.$ifNull as unknown[], params, dialect)\n }\n if (operator === '$switch') {\n return translateSwitch(expr.$switch as Record<string, unknown>, params, dialect)\n }\n\n // Comparison operators (in expression context)\n if (operator === '$eq') {\n const args = expr.$eq as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} = ${right})`\n }\n if (operator === '$ne') {\n const args = expr.$ne as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} != ${right})`\n }\n if (operator === '$gt') {\n const args = expr.$gt as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} > ${right})`\n }\n if (operator === '$gte') {\n const args = expr.$gte as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} >= ${right})`\n }\n if (operator === '$lt') {\n const args = expr.$lt as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} < ${right})`\n }\n if (operator === '$lte') {\n const args = expr.$lte as unknown[]\n const left = translateExpressionValue(args[0], params, dialect)\n const right = translateExpressionValue(args[1], params, dialect)\n return `(${left} <= ${right})`\n }\n\n // Logical operators\n if (operator === '$and') {\n const conditions = (expr.$and as unknown[]).map(c =>\n translateExpressionValue(c, params, dialect)\n )\n return `(${conditions.join(' AND ')})`\n }\n if (operator === '$or') {\n const conditions = (expr.$or as unknown[]).map(c =>\n translateExpressionValue(c, params, dialect)\n )\n return `(${conditions.join(' OR ')})`\n }\n if (operator === '$not') {\n const val = translateExpressionValue(expr.$not, params, dialect)\n return `NOT (${val})`\n }\n\n // $expr for match conditions - extract the inner expression\n if (operator === '$expr') {\n return translateExpression(expr.$expr as Record<string, unknown>, params, dialect)\n }\n\n // $function operator - custom JavaScript function execution\n if (operator === '$function') {\n return translateFunction(expr.$function as FunctionSpec, params)\n }\n\n throw new Error(`Unknown expression operator: ${operator}`)\n}\n\nfunction translateArithmetic(args: unknown[], params: unknown[], op: string, dialect: SQLDialect = 'sqlite'): string {\n const parts = args.map(arg => translateExpressionValue(arg, params, dialect))\n return `(${parts.join(` ${op} `)})`\n}\n\nfunction translateConcat(args: unknown[], params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n const parts = args.map(arg => translateExpressionValue(arg, params, dialect))\n const strFns = getStringFunctions(dialect)\n return strFns.concat(parts)\n}\n\nfunction translateSubstr(args: unknown[], params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n const str = translateExpressionValue(args[0], params, dialect)\n const start = translateExpressionValue(args[1], params, dialect)\n const len = translateExpressionValue(args[2], params, dialect)\n const strFns = getStringFunctions(dialect)\n return strFns.substr(str, start, len)\n}\n\nfunction translateCond(\n cond: Record<string, unknown> | unknown[],\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n let ifCond: unknown, thenVal: unknown, elseVal: unknown\n\n if (Array.isArray(cond)) {\n [ifCond, thenVal, elseVal] = cond\n } else {\n ifCond = cond.if\n thenVal = cond.then\n elseVal = cond.else\n }\n\n const condSql = translateExpressionValue(ifCond, params, dialect)\n const thenSql = translateExpressionValue(thenVal, params, dialect)\n const elseSql = translateExpressionValue(elseVal, params, dialect)\n\n return `CASE WHEN ${condSql} THEN ${thenSql} ELSE ${elseSql} END`\n}\n\nfunction translateIfNull(args: unknown[], params: unknown[], dialect: SQLDialect = 'sqlite'): string {\n const parts = args.map(arg => translateExpressionValue(arg, params, dialect))\n return dialectIfNull(dialect, parts)\n}\n\nfunction translateSwitch(\n switchExpr: Record<string, unknown>,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n const branches = switchExpr.branches as Array<{ case: unknown; then: unknown }>\n const defaultVal = switchExpr.default\n\n const whenClauses = branches.map(branch => {\n const caseSql = translateExpressionValue(branch.case, params, dialect)\n const thenSql = translateExpressionValue(branch.then, params, dialect)\n return `WHEN ${caseSql} THEN ${thenSql}`\n })\n\n const elseSql = defaultVal !== undefined\n ? translateExpressionValue(defaultVal, params, dialect)\n : 'NULL'\n\n return `CASE ${whenClauses.join(' ')} ELSE ${elseSql} END`\n}\n\n/**\n * Translate $function operator to a marker for deferred execution\n * Returns a JSON marker string that will be processed by the aggregation executor\n *\n * The $function operator allows custom JavaScript functions in aggregation pipelines.\n * Since SQLite cannot execute JavaScript, we:\n * 1. Generate a JSON marker embedded in SQL output\n * 2. Extract field references from args for document binding\n * 3. Store the function expression metadata for post-processing\n */\nfunction translateFunction(spec: FunctionSpec, _params: unknown[]): string {\n // Validate required fields\n if (!spec.body) {\n throw new Error('$function requires body')\n }\n if (!spec.args) {\n throw new Error('$function requires args')\n }\n if (spec.lang !== 'js') {\n throw new Error('$function only supports lang: \"js\"')\n }\n\n // Normalize body to string\n const body = typeof spec.body === 'function'\n ? spec.body.toString()\n : spec.body\n\n // Process arguments - extract field paths and literal positions\n const argPaths: string[] = []\n const literalArgs: Record<number, unknown> = {}\n\n spec.args.forEach((arg, index) => {\n if (isFieldReference(arg)) {\n argPaths.push(getFieldPath(arg as string))\n } else {\n literalArgs[index] = arg\n }\n })\n\n // Create marker object\n const marker = {\n __type: 'function',\n body,\n argPaths,\n literalArgs,\n argOrder: spec.args.map((arg, i) =>\n isFieldReference(arg) ? { type: 'field', path: getFieldPath(arg as string) } : { type: 'literal', index: i }\n )\n }\n\n // Return as a JSON string that can be detected and parsed later\n return `'__FUNCTION__${JSON.stringify(marker).replace(/'/g, \"''\")}'`\n}\n\n/**\n * Function ID counter for placeholder identification\n * Exported for testing purposes\n */\nexport let functionIdCounter = 0\n\n/**\n * Reset function ID counter (useful for testing)\n */\nexport function resetFunctionIdCounter(): void {\n functionIdCounter = 0\n}\n\n/**\n * Check if a value is a $function operator\n */\nexport function isFunctionOperator(value: unknown): value is { $function: FunctionSpec } {\n return (\n typeof value === 'object' &&\n value !== null &&\n '$function' in value\n )\n}\n\n/**\n * Create a FunctionExpression from a $function spec\n * Utility for external code that needs to work with function expressions\n */\nexport function createFunctionExpression(spec: FunctionSpec): FunctionExpression {\n const bodyStr = typeof spec.body === 'function'\n ? spec.body.toString()\n : spec.body\n\n const argPaths: string[] = []\n const literalArgs = new Map<number, unknown>()\n\n for (let i = 0; i < spec.args.length; i++) {\n const arg = spec.args[i]\n\n if (isFieldReference(arg)) {\n const path = getFieldPath(arg as string)\n argPaths.push(path)\n } else {\n literalArgs.set(i, arg)\n }\n }\n\n return {\n __type: 'function',\n body: bodyStr,\n argPaths,\n literalArgs\n }\n}\n\n/**\n * Parse a function marker from SQL output\n * Returns the parsed function expression or null if not a function marker\n */\nexport function parseFunctionPlaceholder(sql: string): {\n __type: 'function'\n body: string\n argPaths: string[]\n literalArgs: Record<number, unknown>\n argOrder: Array<{ type: 'field'; path: string } | { type: 'literal'; index: number }>\n} | null {\n const match = sql.match(/'__FUNCTION__(.+?)'/)\n if (!match || !match[1]) return null\n\n try {\n // Unescape single quotes and parse JSON\n const json = match[1].replace(/''/g, \"'\")\n return JSON.parse(json)\n } catch {\n return null\n }\n}\n\n/**\n * Check if SQL contains function markers\n */\nexport function hasFunctionPlaceholders(sql: string): boolean {\n return /__FUNCTION__/.test(sql)\n}\n","/**\n * QueryTranslator - Translates MongoDB-style queries to SQL\n * using json_extract for field access on JSON documents.\n *\n * Features:\n * - Operator registry pattern for extensibility\n * - Automatic flattening of nested $and/$or for SQL optimization\n * - CTE-based optimization for multiple array operations\n * - Parameterized queries for SQL injection prevention\n * - $text operator for full-text search with FTS5\n * - Multi-dialect support (SQLite, ClickHouse)\n */\n\nimport { validateFieldPath } from '../utils/sql-safety.js';\nimport {\n type SQLDialect,\n type DialectOptions,\n validateDialect,\n jsonExtract as dialectJsonExtract,\n jsonType as dialectJsonType,\n jsonTypeWithPath as dialectJsonTypeWithPath,\n jsonArrayLength as dialectJsonArrayLength,\n regexMatch as dialectRegexMatch,\n} from './dialect.js';\nimport { translateExpression } from './stages/expression-translator.js';\n\nexport interface TranslatedQuery {\n sql: string;\n params: unknown[];\n /** Whether this query requires an FTS5 join */\n requiresFTS?: boolean;\n /** The FTS5 match expression (for building full query) */\n ftsMatch?: string;\n}\n\ntype QueryValue = unknown;\ntype QueryCondition = Record<string, QueryValue>;\n\n/**\n * Operator handler type for the registry pattern\n */\ntype OperatorHandler = (\n path: string,\n value: QueryValue,\n params: unknown[]\n) => string;\n\n/**\n * MongoDB type to SQLite json_type mapping\n */\nconst MONGO_TYPE_TO_SQLITE: Record<string, string | string[]> = {\n string: 'text',\n number: ['integer', 'real'],\n bool: ['true', 'false'],\n boolean: ['true', 'false'],\n array: 'array',\n object: 'object',\n null: 'null',\n};\n\n/**\n * JSON Schema type definition for $jsonSchema operator\n */\ninterface JsonSchema {\n type?: string | string[];\n bsonType?: string | string[];\n required?: string[];\n properties?: Record<string, JsonSchema>;\n additionalProperties?: boolean | JsonSchema;\n items?: JsonSchema | JsonSchema[];\n enum?: unknown[];\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number | boolean;\n exclusiveMaximum?: number | boolean;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n minItems?: number;\n maxItems?: number;\n uniqueItems?: boolean;\n minProperties?: number;\n maxProperties?: number;\n allOf?: JsonSchema[];\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n not?: JsonSchema;\n description?: string;\n title?: string;\n}\n\n/**\n * Options for query translation\n */\nexport interface TranslateOptions extends DialectOptions {\n /**\n * Enable CTE optimization for array operations\n * When enabled, multiple array checks on the same field use a single CTE\n */\n useCTE?: boolean;\n\n /**\n * Flatten nested logical operators\n * When enabled, nested $and/$or of the same type are merged\n */\n flattenLogical?: boolean;\n}\n\nconst DEFAULT_OPTIONS: TranslateOptions = {\n useCTE: true,\n flattenLogical: true,\n dialect: 'sqlite',\n};\n\n/**\n * QueryTranslator - Converts MongoDB query syntax to SQL with json_extract\n */\nexport class QueryTranslator {\n private options: TranslateOptions;\n private dialect: SQLDialect;\n\n constructor(options: TranslateOptions = {}) {\n // Validate dialect before merging options\n const dialect = validateDialect(options.dialect);\n this.options = { ...DEFAULT_OPTIONS, ...options, dialect };\n this.dialect = dialect;\n }\n\n /**\n * Registry of comparison operators and their SQL translations\n */\n private comparisonOperators: Record<string, OperatorHandler> = {\n $eq: (path, value, params) => {\n if (value === null) {\n return `${this.jsonExtract(path)} IS NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(sqlValue);\n return `${this.jsonExtract(path)} = ?`;\n },\n $ne: (path, value, params) => {\n if (value === null) {\n return `${this.jsonExtract(path)} IS NOT NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(sqlValue);\n return `${this.jsonExtract(path)} != ?`;\n },\n $gt: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} > ?`;\n },\n $gte: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} >= ?`;\n },\n $lt: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} < ?`;\n },\n $lte: (path, value, params) => {\n params.push(value);\n return `${this.jsonExtract(path)} <= ?`;\n },\n $in: (path, value, params) => {\n const arr = value as unknown[];\n if (arr.length === 0) {\n return '0 = 1';\n }\n params.push(...arr);\n const placeholders = arr.map(() => '?').join(', ');\n return `${this.jsonExtract(path)} IN (${placeholders})`;\n },\n $nin: (path, value, params) => {\n const arr = value as unknown[];\n if (arr.length === 0) {\n return '1 = 1';\n }\n params.push(...arr);\n const placeholders = arr.map(() => '?').join(', ');\n return `${this.jsonExtract(path)} NOT IN (${placeholders})`;\n },\n $regex: (path, value, params) => {\n // Handle both { $regex: \"pattern\" } and { $regex: \"pattern\", $options: \"i\" }\n // Also handle direct { field: { $regex: /pattern/i } } form\n // Also support $regexType: 'glob' for SQLite GLOB syntax\n let pattern: string;\n let options: string = '';\n let regexType: string = 'like'; // default to LIKE pattern matching\n\n if (typeof value === 'string') {\n pattern = value;\n } else if (value instanceof RegExp) {\n pattern = value.source;\n options = value.flags;\n } else if (value && typeof value === 'object') {\n const regexObj = value as { $regex?: string; $options?: string; $regexType?: string };\n pattern = regexObj.$regex || '';\n options = regexObj.$options || '';\n regexType = regexObj.$regexType || 'like';\n } else {\n pattern = String(value);\n }\n\n const fieldExpr = this.jsonExtract(path);\n const caseInsensitive = options.includes('i');\n\n // Handle GLOB type for SQLite\n if (regexType === 'glob' && this.dialect === 'sqlite') {\n params.push(pattern);\n const typeCheck = `json_type(${fieldExpr}) = 'text'`;\n return `(${typeCheck} AND ${fieldExpr} GLOB ?)`;\n }\n\n // Convert regex pattern to LIKE pattern\n // This is a simplified conversion that handles common cases\n const likePattern = this.regexToLike(pattern, options);\n params.push(likePattern);\n\n // First ensure the field is a string type (regex only works on strings)\n if (this.dialect === 'clickhouse') {\n const typeCheck = `JSONType(data, ${path.replace(/^\\$\\.?/, '').split('.').map(p => `'${p}'`).join(', ')}) = 'String'`;\n const matchExpr = dialectRegexMatch(this.dialect, fieldExpr, '?', caseInsensitive);\n return `(${typeCheck} AND ${matchExpr})`;\n }\n\n const typeCheck = `json_type(${fieldExpr}) = 'text'`;\n const matchExpr = dialectRegexMatch(this.dialect, fieldExpr, '?', caseInsensitive);\n return `(${typeCheck} AND ${matchExpr})`;\n },\n $mod: (path, value, params) => {\n // $mod: [divisor, remainder] - matches if field % divisor == remainder\n const [divisor, remainder] = value as [number, number];\n params.push(divisor, remainder);\n // Check that the field is numeric and apply modulo\n // Use CAST to handle float truncation like MongoDB\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND CAST(${this.jsonExtract(path)} AS INTEGER) % ? = ?)`;\n },\n\n // Bitwise operators\n $bitsAllSet: (path, value, params) => {\n // $bitsAllSet: [bit positions] or bitmask number\n // Matches if all specified bits are set (1)\n const mask = this.resolveBitmask(value);\n params.push(mask, mask);\n // (field & mask) == mask means all bits in mask are set\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) = ?)`;\n },\n $bitsAnyClear: (path, value, params) => {\n // $bitsAnyClear: [bit positions] or bitmask number\n // Matches if any of the specified bits are clear (0)\n const mask = this.resolveBitmask(value);\n params.push(mask, mask);\n // (field & mask) != mask means at least one bit in mask is clear\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) != ?)`;\n },\n $bitsAllClear: (path, value, params) => {\n // $bitsAllClear: [bit positions] or bitmask number\n // Matches if all specified bits are clear (0)\n const mask = this.resolveBitmask(value);\n params.push(mask);\n // (field & mask) == 0 means all bits in mask are clear\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) = 0)`;\n },\n $bitsAnySet: (path, value, params) => {\n // $bitsAnySet: [bit positions] or bitmask number\n // Matches if any of the specified bits are set (1)\n const mask = this.resolveBitmask(value);\n params.push(mask);\n // (field & mask) != 0 means at least one bit in mask is set\n return `(json_type(${this.jsonExtract(path)}) IN ('integer', 'real') AND (CAST(${this.jsonExtract(path)} AS INTEGER) & ?) != 0)`;\n },\n };\n\n /**\n * Registry of element operators\n */\n private elementOperators: Record<string, OperatorHandler> = {\n $exists: (path, value, _params) => {\n // MongoDB $exists distinguishes between missing fields and null values:\n // - $exists: true -> field exists (including explicit null values)\n // - $exists: false -> field is completely missing from the document\n //\n // SQLite's json_extract returns NULL for both missing fields AND null values,\n // but json_type returns 'null' for explicit nulls and NULL for missing fields.\n // So we use json_type with path directly to properly detect field existence.\n if (path.startsWith('$')) {\n // JSON path - use json_type(data, path) directly for existence checks\n const typeExpr = dialectJsonTypeWithPath(this.dialect, 'data', path);\n if (value) {\n return `${typeExpr} IS NOT NULL`;\n }\n return `${typeExpr} IS NULL`;\n }\n // Direct reference (for elemMatch context) - use json_type\n if (this.dialect === 'clickhouse') {\n if (value) {\n return `JSONType(${path}) IS NOT NULL`;\n }\n return `JSONType(${path}) IS NULL`;\n }\n if (value) {\n return `json_type(${path}) IS NOT NULL`;\n }\n return `json_type(${path}) IS NULL`;\n },\n $type: (path, value, _params) => {\n const mongoType = value as string;\n const sqliteType = MONGO_TYPE_TO_SQLITE[mongoType];\n const typeExpr = dialectJsonType(this.dialect, 'data', path);\n\n if (Array.isArray(sqliteType)) {\n if (mongoType === 'number') {\n if (this.dialect === 'clickhouse') {\n return `${typeExpr} IN ('Int64', 'Float64', 'UInt64')`;\n }\n return `${typeExpr} IN ('integer', 'real')`;\n }\n // bool type checks for true/false values\n if (this.dialect === 'clickhouse') {\n return `${typeExpr} = 'Bool'`;\n }\n return `${typeExpr} IN ('true', 'false')`;\n }\n if (this.dialect === 'clickhouse') {\n const chType = mongoType === 'string' ? 'String' : mongoType === 'array' ? 'Array' : mongoType === 'object' ? 'Object' : sqliteType;\n return `${typeExpr} = '${chType}'`;\n }\n return `${typeExpr} = '${sqliteType}'`;\n },\n };\n\n /**\n * Registry of array operators\n */\n private arrayOperators: Record<string, OperatorHandler> = {\n $size: (path, value, params) => {\n params.push(value);\n const lenExpr = dialectJsonArrayLength(this.dialect, 'data', path);\n return `${lenExpr} = ?`;\n },\n $all: (path, value, params): string => {\n const arr = value as unknown[];\n if (arr.length === 0) {\n return '1 = 1';\n }\n // Each value must exist in the array using EXISTS with json_each\n const conditions = arr.map((v) => {\n params.push(v);\n return `EXISTS (SELECT 1 FROM json_each(${this.jsonExtract(path)}) WHERE value = ?)`;\n });\n return conditions.length === 1\n ? conditions[0]!\n : `(${conditions.join(' AND ')})`;\n },\n $elemMatch: (path, value, params) => {\n const conditions = value as QueryCondition;\n // Generate subquery for array element matching\n const innerConditions = this.translateElemMatchConditions(conditions, params);\n return `EXISTS (SELECT 1 FROM json_each(${this.jsonExtract(path)}) WHERE ${innerConditions})`;\n },\n };\n\n /**\n * Main entry point - translate a MongoDB query to SQL\n */\n translate(query: Record<string, unknown>): TranslatedQuery {\n const params: unknown[] = [];\n\n if (Object.keys(query).length === 0) {\n return { sql: '1 = 1', params: [] };\n }\n\n // Pre-process to flatten nested logical operators if enabled\n const processedQuery = this.options.flattenLogical\n ? this.flattenLogicalOperators(query)\n : query;\n\n const sql = this.translateDocument(processedQuery, params);\n return { sql, params };\n }\n\n /**\n * Flatten nested logical operators of the same type\n * E.g., $and: [{ $and: [a, b] }, c] -> $and: [a, b, c]\n */\n private flattenLogicalOperators(\n query: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(query)) {\n if (key === '$and' || key === '$or') {\n const conditions = value as Record<string, unknown>[];\n const flattened: Record<string, unknown>[] = [];\n\n for (const condition of conditions) {\n // Recursively flatten nested conditions\n const flatCondition = this.flattenLogicalOperators(condition);\n\n // If the nested condition is the same logical operator, merge it\n if (Object.keys(flatCondition).length === 1 && flatCondition[key]) {\n const nestedConditions = flatCondition[key] as Record<string, unknown>[];\n flattened.push(...nestedConditions);\n } else {\n flattened.push(flatCondition);\n }\n }\n\n result[key] = flattened;\n } else if (key === '$nor') {\n // $nor cannot be flattened the same way, but we still process nested conditions\n const conditions = value as Record<string, unknown>[];\n result[key] = conditions.map(c => this.flattenLogicalOperators(c));\n } else if (key.startsWith('$')) {\n // Other operators, just copy\n result[key] = value;\n } else {\n // Field condition - recursively process if it's an object\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const operators = value as Record<string, unknown>;\n const processedOps: Record<string, unknown> = {};\n\n for (const [op, opValue] of Object.entries(operators)) {\n if (op === '$not' && opValue && typeof opValue === 'object') {\n processedOps[op] = this.flattenLogicalOperators(opValue as Record<string, unknown>);\n } else if (op === '$elemMatch' && opValue && typeof opValue === 'object') {\n processedOps[op] = this.flattenLogicalOperators(opValue as Record<string, unknown>);\n } else {\n processedOps[op] = opValue;\n }\n }\n result[key] = processedOps;\n } else {\n result[key] = value;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Translate a query document (top-level or nested)\n */\n private translateDocument(\n query: Record<string, unknown>,\n params: unknown[]\n ): string {\n const conditions: string[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (key.startsWith('$')) {\n // Logical operator at top level\n const sql = this.translateLogicalOperator(key, value, params);\n conditions.push(sql);\n } else {\n // Field condition\n const sql = this.translateField(key, value, params);\n conditions.push(sql);\n }\n }\n\n if (conditions.length === 0) {\n return '1 = 1';\n }\n\n if (conditions.length === 1) {\n return conditions[0]!;\n }\n\n return `(${conditions.join(' AND ')})`;\n }\n\n /**\n * Translate a field condition\n */\n private translateField(\n field: string,\n value: unknown,\n params: unknown[]\n ): string {\n const path = this.fieldToJsonPath(field);\n\n // Direct value comparison (implicit $eq)\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return this.comparisonOperators.$eq!(path, value, params);\n }\n\n // Object with operators\n const operators = value as Record<string, unknown>;\n const operatorKeys = Object.keys(operators);\n\n // Check if it's an object with operators\n if (operatorKeys.length > 0 && operatorKeys.every(k => k.startsWith('$'))) {\n return this.translateFieldConditions(path, operators, params, false);\n }\n\n // Plain object equality (implicit $eq)\n return this.comparisonOperators.$eq!(path, value, params);\n }\n\n /**\n * Translate conditions on a single field\n */\n private translateFieldConditions(\n path: string,\n conditions: Record<string, unknown>,\n params: unknown[],\n isElemMatch: boolean\n ): string {\n const sqlParts: string[] = [];\n\n // Check for $regex with sibling $options or $regexType\n const hasRegexWithOptions = '$regex' in conditions && ('$options' in conditions || '$regexType' in conditions);\n\n for (const [op, value] of Object.entries(conditions)) {\n // Skip $options and $regexType when they're siblings of $regex (handled together with $regex)\n if ((op === '$options' || op === '$regexType') && hasRegexWithOptions) {\n continue;\n }\n\n let sql: string;\n\n if (op === '$not') {\n // $not wraps another operator\n const innerConditions = value as Record<string, unknown>;\n const innerSql = this.translateFieldConditions(path, innerConditions, params, isElemMatch);\n sql = `NOT (${innerSql})`;\n } else if (op === '$regex' && hasRegexWithOptions) {\n // Handle $regex with sibling $options or $regexType\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n const regexValue = {\n $regex: value,\n $options: conditions.$options,\n $regexType: conditions.$regexType\n };\n sql = this.comparisonOperators[op]!(actualPath, regexValue, params);\n } else if (this.comparisonOperators[op]) {\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n sql = this.comparisonOperators[op]!(actualPath, value, params);\n } else if (this.elementOperators[op]) {\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n sql = this.elementOperators[op]!(actualPath, value, params);\n } else if (this.arrayOperators[op]) {\n const actualPath = isElemMatch ? this.elemMatchFieldPath(path, '') : path;\n sql = this.arrayOperators[op]!(actualPath, value, params);\n } else {\n // Unknown operator - treat as nested field in elemMatch context\n if (isElemMatch) {\n const nestedPath = this.elemMatchFieldPath(path, op.replace('$', ''));\n sql = this.translateFieldConditions(nestedPath, { $eq: value }, params, true);\n } else {\n throw new Error(`Unknown operator: ${op}`);\n }\n }\n\n sqlParts.push(sql);\n }\n\n if (sqlParts.length === 0) {\n return '1 = 1';\n }\n\n if (sqlParts.length === 1) {\n return sqlParts[0]!;\n }\n\n return `(${sqlParts.join(' AND ')})`;\n }\n\n /**\n * Translate logical operators ($and, $or, $not, $nor, $text)\n */\n private translateLogicalOperator(\n op: string,\n value: unknown,\n params: unknown[]\n ): string {\n switch (op) {\n case '$and': {\n const conditions = value as Record<string, unknown>[];\n if (conditions.length === 0) {\n return '1 = 1';\n }\n const parts = conditions.map(c => this.translateDocument(c, params));\n if (parts.length === 1) {\n return parts[0]!;\n }\n return `(${parts.join(' AND ')})`;\n }\n\n case '$or': {\n const conditions = value as Record<string, unknown>[];\n if (conditions.length === 0) {\n return '0 = 1';\n }\n const parts = conditions.map(c => this.translateDocument(c, params));\n if (parts.length === 1) {\n return parts[0]!;\n }\n return `(${parts.join(' OR ')})`;\n }\n\n case '$nor': {\n const conditions = value as Record<string, unknown>[];\n if (conditions.length === 0) {\n return '1 = 1';\n }\n const parts = conditions.map(c => this.translateDocument(c, params));\n return `NOT (${parts.join(' OR ')})`;\n }\n\n case '$not': {\n // $not at top level wraps a condition\n const innerSql = this.translateDocument(value as Record<string, unknown>, params);\n return `NOT (${innerSql})`;\n }\n\n case '$text': {\n // $text operator for full-text search\n const textOp = value as Record<string, unknown>;\n const { sql } = this.translateTextOperator(textOp, params);\n return sql;\n }\n\n case '$expr': {\n // $expr allows use of aggregation expressions in the query language\n // It enables comparing fields within the same document\n const exprResult = translateExpression(value as Record<string, unknown>, params, this.dialect);\n return exprResult;\n }\n\n case '$jsonSchema': {\n // $jsonSchema validates documents against a JSON Schema\n const schema = value as JsonSchema;\n return this.translateJsonSchema(schema, '$', params);\n }\n\n case '$where': {\n // $where executes JavaScript expressions - NOT SUPPORTED due to security risks\n // MongoDB's $where allows arbitrary JavaScript execution which is a security risk\n // In a SQL context, we cannot safely execute JavaScript\n throw new Error(\n '$where operator is not supported due to security risks. ' +\n 'Use $expr with aggregation expressions instead for field comparisons.'\n );\n }\n\n default:\n throw new Error(`Unknown logical operator: ${op}`);\n }\n }\n\n /**\n * Convert a field name to a JSON path\n * e.g., \"a.b.c\" -> \"$.a.b.c\"\n * e.g., \"items.0.name\" -> \"$.items[0].name\"\n *\n * SECURITY: Validates field name to prevent SQL injection attacks.\n * @throws Error if field contains invalid characters\n */\n private fieldToJsonPath(field: string): string {\n // Validate the entire field path to prevent SQL injection\n validateFieldPath(field);\n\n const parts = field.split('.');\n let path = '$';\n\n for (const part of parts) {\n // Check if part is a numeric index\n if (/^\\d+$/.test(part)) {\n path += `[${part}]`;\n } else {\n path += `.${part}`;\n }\n }\n\n return path;\n }\n\n /**\n * Generate json_extract SQL for a path\n */\n private jsonExtract(path: string): string {\n // If path starts with $, it's a JSON path\n if (path.startsWith('$')) {\n return dialectJsonExtract(this.dialect, 'data', path);\n }\n // Otherwise, it's a direct reference (for elemMatch context)\n return path;\n }\n\n /**\n * Convert a bitwise operator value to a bitmask\n * Accepts either:\n * - A number (used directly as bitmask)\n * - An array of bit positions (converted to bitmask)\n */\n private resolveBitmask(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n if (Array.isArray(value)) {\n // Convert array of bit positions to bitmask\n // e.g., [0, 2, 4] -> 0b10101 = 21\n return value.reduce((mask: number, pos: number) => mask | (1 << pos), 0);\n }\n throw new Error('Bitwise operator value must be a number or array of bit positions');\n }\n\n /**\n * Generate path for elemMatch field access\n * SECURITY: Validates field name to prevent SQL injection attacks.\n */\n private elemMatchFieldPath(basePath: string, field: string): string {\n if (basePath === 'value') {\n // Inside json_each, value is the current element\n if (field === '') {\n return 'value';\n }\n // Validate field name to prevent SQL injection\n validateFieldPath(field);\n return `json_extract(value, '$.${field}')`;\n }\n if (field === '') {\n return basePath;\n }\n // Validate field name to prevent SQL injection\n validateFieldPath(field);\n return `${basePath}.${field}`;\n }\n\n /**\n * Convert a regex pattern to SQLite LIKE/GLOB pattern\n * This handles common regex patterns:\n * - ^pattern -> pattern% (starts with)\n * - pattern$ -> %pattern (ends with)\n * - ^pattern$ -> pattern (exact match)\n * - .* or .+ -> % (any characters)\n * - . -> _ (single character)\n * - [0-9] -> character class (converted to GLOB syntax)\n * - [a-z] -> character class (converted to GLOB syntax)\n * - Literal text -> %text% (contains, default behavior)\n *\n * @param pattern The regex pattern to convert\n * @param options Regex options (i=case-insensitive, m=multiline)\n */\n private regexToLike(pattern: string, options: string = ''): string {\n // For multiline mode, we need special handling of ^ and $\n // In multiline mode, ^ matches start of line (after \\n) and $ matches before \\n\n const isMultiline = options.includes('m');\n\n // Handle anchors\n let startsWithAnchor = pattern.startsWith('^');\n let endsWithAnchor = pattern.endsWith('$') && !pattern.endsWith('\\\\$');\n\n // In multiline mode, anchors match line boundaries, not string boundaries\n // Since LIKE can't match line boundaries, we convert to contains match\n if (isMultiline && (startsWithAnchor || endsWithAnchor)) {\n // For multiline, we treat ^ and $ as matching within the string\n // This is an approximation - LIKE can't truly match line boundaries\n // But we can check for patterns after newline or before newline\n startsWithAnchor = false;\n endsWithAnchor = false;\n }\n\n // Remove anchors for processing\n let processed = pattern;\n if (pattern.startsWith('^')) {\n processed = processed.slice(1);\n }\n if (processed.endsWith('$') && !processed.endsWith('\\\\$')) {\n processed = processed.slice(0, -1);\n }\n\n // Process character by character to handle escaping properly\n let result = '';\n let i = 0;\n while (i < processed.length) {\n const char = processed[i];\n const nextChar = processed[i + 1];\n\n if (char === '\\\\' && nextChar !== undefined) {\n // Escaped character in regex - keep literal character\n // But we need to escape it for LIKE if it's a special LIKE character\n if (nextChar === '%' || nextChar === '_') {\n result += '\\\\' + nextChar;\n } else {\n result += nextChar;\n }\n i += 2;\n } else if (char === '[') {\n // Character class - find the closing bracket\n const endBracket = processed.indexOf(']', i + 1);\n if (endBracket !== -1) {\n const charClass = processed.slice(i + 1, endBracket);\n // Convert common character classes to approximate LIKE patterns\n // [0-9] -> _ (single digit) or % for multiple\n // [a-zA-Z] -> _ (single letter)\n // For now, use _ as a single character match (approximation)\n if (charClass.includes('+') || processed[endBracket + 1] === '+') {\n result += '%';\n i = endBracket + (processed[endBracket + 1] === '+' ? 2 : 1);\n } else if (processed[endBracket + 1] === '*') {\n result += '%';\n i = endBracket + 2;\n } else {\n result += '_';\n i = endBracket + 1;\n }\n } else {\n // No closing bracket, treat [ as literal\n result += char;\n i += 1;\n }\n } else if (char === '.' && nextChar === '*') {\n // .* -> % (any characters)\n result += '%';\n i += 2;\n } else if (char === '.' && nextChar === '+') {\n // .+ -> % (one or more characters, approximate with %)\n result += '%';\n i += 2;\n } else if (char === '.') {\n // . -> _ (single character)\n result += '_';\n i += 1;\n } else if (char === '%') {\n // Escape literal % for LIKE\n result += '\\\\%';\n i += 1;\n } else if (char === '_') {\n // Escape literal _ for LIKE\n result += '\\\\_';\n i += 1;\n } else if (char === '+' || char === '*' || char === '?' || char === '|' || char === '(' || char === ')') {\n // Skip regex quantifiers and grouping - not directly translatable to LIKE\n // These would need more sophisticated handling\n i += 1;\n } else {\n // Regular character\n result += char;\n i += 1;\n }\n }\n\n // Apply wildcards based on anchors\n if (!startsWithAnchor && !endsWithAnchor) {\n // No anchors: match anywhere (contains)\n return `%${result}%`;\n } else if (startsWithAnchor && !endsWithAnchor) {\n // Starts with anchor only\n return `${result}%`;\n } else if (!startsWithAnchor && endsWithAnchor) {\n // Ends with anchor only\n return `%${result}`;\n } else {\n // Both anchors: exact match\n return result;\n }\n }\n\n /**\n * Translate conditions inside $elemMatch\n * This handles document conditions like { field: value, field: { $op: value } }\n * SECURITY: Validates field names to prevent SQL injection attacks.\n */\n private translateElemMatchConditions(\n conditions: Record<string, unknown>,\n params: unknown[]\n ): string {\n const sqlParts: string[] = [];\n\n for (const [field, value] of Object.entries(conditions)) {\n // Validate field name to prevent SQL injection\n validateFieldPath(field);\n // In elemMatch, 'value' refers to the current array element from json_each\n // For nested fields, we use json_extract(value, '$.field')\n const extractPath = `json_extract(value, '$.${field}')`;\n\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n // Direct value comparison\n if (value === null) {\n sqlParts.push(`${extractPath} IS NULL`);\n } else {\n params.push(value);\n sqlParts.push(`${extractPath} = ?`);\n }\n } else {\n // Object with operators\n const operators = value as Record<string, unknown>;\n const opKeys = Object.keys(operators);\n\n if (opKeys.length > 0 && opKeys.every(k => k.startsWith('$'))) {\n // It's operators like { $gte: 90 }\n for (const [op, opValue] of Object.entries(operators)) {\n const opSql = this.translateElemMatchOperator(extractPath, op, opValue, params);\n sqlParts.push(opSql);\n }\n } else {\n // Plain object equality\n params.push(JSON.stringify(value));\n sqlParts.push(`${extractPath} = json(?)`);\n }\n }\n }\n\n if (sqlParts.length === 0) {\n return '1 = 1';\n }\n\n return sqlParts.length === 1 ? sqlParts[0]! : `(${sqlParts.join(' AND ')})`;\n }\n\n /**\n * Translate a single operator for elemMatch context\n */\n private translateElemMatchOperator(\n path: string,\n op: string,\n value: unknown,\n params: unknown[]\n ): string {\n switch (op) {\n case '$eq': {\n if (value === null) {\n return `${path} IS NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const eqValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(eqValue);\n return `${path} = ?`;\n }\n case '$ne': {\n if (value === null) {\n return `${path} IS NOT NULL`;\n }\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const neValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(neValue);\n return `${path} != ?`;\n }\n case '$gt':\n params.push(value);\n return `${path} > ?`;\n case '$gte':\n params.push(value);\n return `${path} >= ?`;\n case '$lt':\n params.push(value);\n return `${path} < ?`;\n case '$lte':\n params.push(value);\n return `${path} <= ?`;\n case '$in': {\n const arr = value as unknown[];\n if (arr.length === 0) return '0 = 1';\n params.push(...arr);\n return `${path} IN (${arr.map(() => '?').join(', ')})`;\n }\n case '$nin': {\n const arr = value as unknown[];\n if (arr.length === 0) return '1 = 1';\n params.push(...arr);\n return `${path} NOT IN (${arr.map(() => '?').join(', ')})`;\n }\n case '$exists':\n // Use json_type to distinguish between null values and missing fields\n return value ? `json_type(${path}) IS NOT NULL` : `json_type(${path}) IS NULL`;\n case '$regex': {\n // Handle $regex in elemMatch context\n let pattern: string;\n let options: string = '';\n\n if (typeof value === 'string') {\n pattern = value;\n } else if (value instanceof RegExp) {\n pattern = value.source;\n options = value.flags;\n } else if (value && typeof value === 'object') {\n const regexObj = value as { $regex?: string; $options?: string };\n pattern = regexObj.$regex || '';\n options = regexObj.$options || '';\n } else {\n pattern = String(value);\n }\n\n const likePattern = this.regexToLike(pattern, options);\n params.push(likePattern);\n\n // Add type check to ensure we only match string values\n const typeCheck = `json_type(${path}) = 'text'`;\n\n if (options.includes('i')) {\n return `(${typeCheck} AND LOWER(${path}) LIKE LOWER(?))`;\n }\n return `(${typeCheck} AND ${path} LIKE ?)`;\n }\n case '$mod': {\n // Handle $mod in elemMatch context\n const [divisor, remainder] = value as [number, number];\n params.push(divisor, remainder);\n return `(json_type(${path}) IN ('integer', 'real') AND CAST(${path} AS INTEGER) % ? = ?)`;\n }\n default:\n throw new Error(`Unsupported operator in $elemMatch: ${op}`);\n }\n }\n\n /**\n * Generate optimized SQL with CTE for multiple array operations on the same field\n * This is useful when you have multiple $all checks or $elemMatch on the same array\n *\n * Example output:\n * WITH array_cte AS (\n * SELECT value FROM json_each(json_extract(data, '$.tags'))\n * )\n * SELECT * FROM documents WHERE\n * EXISTS (SELECT 1 FROM array_cte WHERE value = ?) AND\n * EXISTS (SELECT 1 FROM array_cte WHERE value = ?)\n */\n translateWithCTE(\n query: Record<string, unknown>,\n tableName: string = 'documents'\n ): TranslatedQuery {\n const params: unknown[] = [];\n\n if (Object.keys(query).length === 0) {\n return { sql: `SELECT * FROM ${tableName}`, params: [] };\n }\n\n // Collect all array fields that have multiple operations\n const arrayFieldOps = this.collectArrayOperations(query);\n const cteDefinitions: string[] = [];\n const cteAliases = new Map<string, string>();\n let cteIndex = 0;\n\n // Create CTEs for fields with multiple array operations\n for (const [field, count] of arrayFieldOps.entries()) {\n if (count > 1) {\n const alias = `arr_cte_${cteIndex++}`;\n const path = this.fieldToJsonPath(field);\n cteDefinitions.push(\n `${alias} AS (SELECT value FROM json_each(json_extract(data, '${path}')))`\n );\n cteAliases.set(field, alias);\n }\n }\n\n // Translate the query, replacing repeated json_each with CTE references\n const whereClause = this.translateDocumentWithCTE(query, params, cteAliases);\n\n let sql: string;\n if (cteDefinitions.length > 0) {\n sql = `WITH ${cteDefinitions.join(', ')} SELECT * FROM ${tableName} WHERE ${whereClause}`;\n } else {\n sql = `SELECT * FROM ${tableName} WHERE ${whereClause}`;\n }\n\n return { sql, params };\n }\n\n /**\n * Collect array operations for CTE optimization analysis\n */\n private collectArrayOperations(\n query: Record<string, unknown>,\n counts: Map<string, number> = new Map()\n ): Map<string, number> {\n for (const [key, value] of Object.entries(query)) {\n if (key === '$and' || key === '$or' || key === '$nor') {\n const conditions = value as Record<string, unknown>[];\n for (const condition of conditions) {\n this.collectArrayOperations(condition, counts);\n }\n } else if (!key.startsWith('$') && value && typeof value === 'object') {\n const operators = value as Record<string, unknown>;\n for (const op of Object.keys(operators)) {\n if (op === '$all' || op === '$elemMatch') {\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n }\n }\n }\n return counts;\n }\n\n /**\n * Translate document using CTE aliases where applicable\n */\n private translateDocumentWithCTE(\n query: Record<string, unknown>,\n params: unknown[],\n _cteAliases: Map<string, string>\n ): string {\n // For now, fall back to standard translation\n // CTE optimization would replace json_each references with CTE aliases\n // This is a placeholder for full CTE implementation\n return this.translateDocument(query, params);\n }\n\n /**\n * Register a custom comparison operator\n * Allows extending the translator with custom operators\n */\n registerOperator(name: string, handler: OperatorHandler): void {\n if (!name.startsWith('$')) {\n throw new Error('Operator name must start with $');\n }\n this.comparisonOperators[name] = handler;\n }\n\n /**\n * Register a custom element operator\n */\n registerElementOperator(name: string, handler: OperatorHandler): void {\n if (!name.startsWith('$')) {\n throw new Error('Operator name must start with $');\n }\n this.elementOperators[name] = handler;\n }\n\n /**\n * Register a custom array operator\n */\n registerArrayOperator(name: string, handler: OperatorHandler): void {\n if (!name.startsWith('$')) {\n throw new Error('Operator name must start with $');\n }\n this.arrayOperators[name] = handler;\n }\n\n /**\n * Translate a MongoDB $text query to FTS5 MATCH SQL\n */\n private translateTextOperator(\n textOp: Record<string, unknown>,\n params: unknown[]\n ): { sql: string; ftsMatch: string } {\n const search = textOp.$search as string;\n const caseSensitive = textOp.$caseSensitive as boolean | undefined;\n const diacriticSensitive = textOp.$diacriticSensitive as boolean | undefined;\n\n // Handle empty search string\n if (!search || search.trim() === '') {\n return { sql: '0 = 1', ftsMatch: '' };\n }\n\n // Convert MongoDB text search syntax to FTS5 syntax\n const ftsQuery = this.convertToFTS5Query(search, caseSensitive, diacriticSensitive);\n\n params.push(ftsQuery);\n\n // Generate the FTS5 MATCH condition\n // This will be joined with the main documents table using rowid\n const sql = `id IN (SELECT rowid FROM {{FTS_TABLE}} WHERE {{FTS_TABLE}} MATCH ?)`;\n\n return { sql, ftsMatch: ftsQuery };\n }\n\n /**\n * Convert MongoDB text search syntax to FTS5 query syntax\n *\n * MongoDB syntax:\n * - \"word\" -> matches word\n * - \"word1 word2\" -> matches word1 OR word2\n * - \"\\\"phrase\\\"\" -> matches exact phrase\n * - \"-word\" -> excludes word (negation)\n *\n * FTS5 syntax:\n * - \"word\" -> matches word\n * - \"word1 OR word2\" -> matches word1 or word2\n * - \"word1 word2\" -> matches word1 AND word2\n * - \"\\\"phrase\\\"\" -> matches exact phrase\n * - \"NOT word\" -> excludes word\n */\n private convertToFTS5Query(\n search: string,\n _caseSensitive?: boolean,\n _diacriticSensitive?: boolean\n ): string {\n // Escape special FTS5 characters except quotes and minus\n const escaped = search.replace(/[&|()^~*:]/g, (char) => {\n return '\\\\' + char;\n });\n\n const tokens: string[] = [];\n let remaining = escaped.trim();\n\n // Parse the search string for phrases and terms\n while (remaining.length > 0) {\n remaining = remaining.trim();\n\n // Check for quoted phrase\n if (remaining.startsWith('\"')) {\n const endQuote = remaining.indexOf('\"', 1);\n if (endQuote > 1) {\n const phrase = remaining.slice(1, endQuote);\n tokens.push(`\"${phrase}\"`);\n remaining = remaining.slice(endQuote + 1);\n continue;\n }\n }\n\n // Check for negation\n if (remaining.startsWith('-')) {\n const spaceIdx = remaining.indexOf(' ');\n const term = spaceIdx > 0 ? remaining.slice(1, spaceIdx) : remaining.slice(1);\n if (term) {\n tokens.push(`NOT ${term}`);\n }\n remaining = spaceIdx > 0 ? remaining.slice(spaceIdx + 1) : '';\n continue;\n }\n\n // Regular term\n const spaceIdx = remaining.indexOf(' ');\n const term = spaceIdx > 0 ? remaining.slice(0, spaceIdx) : remaining;\n if (term) {\n tokens.push(term);\n }\n remaining = spaceIdx > 0 ? remaining.slice(spaceIdx + 1) : '';\n }\n\n // Join tokens - MongoDB uses OR by default for multiple terms\n // FTS5 uses AND by default, so we explicitly use OR\n if (tokens.length === 0) {\n return '*'; // Match all if no valid tokens\n }\n\n // Separate NOT terms from regular terms\n const notTerms = tokens.filter(t => t.startsWith('NOT '));\n const regularTerms = tokens.filter(t => !t.startsWith('NOT '));\n\n let query = '';\n if (regularTerms.length > 0) {\n // Use OR for regular terms (MongoDB default behavior)\n query = regularTerms.join(' OR ');\n }\n\n // Add NOT terms with AND\n if (notTerms.length > 0) {\n if (query) {\n query = `(${query}) AND ${notTerms.join(' AND ')}`;\n } else {\n // Only negations - need a base to negate from\n query = `* AND ${notTerms.join(' AND ')}`;\n }\n }\n\n return query;\n }\n\n /**\n * Translate a query with $meta projection support for textScore\n *\n * @param query The MongoDB query (must contain $text for textScore)\n * @param projection The projection with potential {$meta: \"textScore\"} fields\n * @param sort Optional sort with potential {$meta: \"textScore\"} fields\n */\n translateWithMeta(\n query: Record<string, unknown>,\n projection?: Record<string, unknown>,\n sort?: Record<string, unknown>\n ): TranslatedQuery {\n const params: unknown[] = [];\n\n // Check if query has $text\n const hasText = '$text' in query;\n\n if (!hasText) {\n // No text search, fall back to regular translation\n const baseResult = this.translate(query);\n return baseResult;\n }\n\n // Extract $text operator\n const textOp = query.$text as Record<string, unknown>;\n const { sql: textSql, ftsMatch } = this.translateTextOperator(textOp, params);\n\n // Process remaining query conditions\n const remainingQuery: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(query)) {\n if (key !== '$text') {\n remainingQuery[key] = value;\n }\n }\n\n let whereClause = textSql;\n if (Object.keys(remainingQuery).length > 0) {\n const remainingResult = this.translateDocument(remainingQuery, params);\n whereClause = `(${textSql}) AND (${remainingResult})`;\n }\n\n // Build SELECT clause with textScore if projected\n let selectClause = '*';\n const hasTextScoreProjection = projection && Object.values(projection).some(\n v => v && typeof v === 'object' && (v as Record<string, unknown>).$meta === 'textScore'\n );\n\n if (hasTextScoreProjection) {\n // FTS5 uses bm25() for relevance ranking\n // bm25() returns negative values (more negative = more relevant)\n // We negate it to get positive scores where higher = more relevant\n selectClause = '*, -bm25({{FTS_TABLE}}) as rank';\n }\n\n // Build ORDER BY clause\n let orderByClause = '';\n if (sort) {\n const hasTextScoreSort = Object.values(sort).some(\n v => v && typeof v === 'object' && (v as Record<string, unknown>).$meta === 'textScore'\n );\n\n if (hasTextScoreSort) {\n // Sort by rank (descending by default for textScore)\n orderByClause = ' ORDER BY rank DESC';\n }\n }\n\n return {\n sql: `SELECT ${selectClause} WHERE ${whereClause}${orderByClause}`,\n params,\n requiresFTS: true,\n ftsMatch,\n };\n }\n\n /**\n * Translate a JSON Schema to SQL conditions\n * Supports common JSON Schema validation keywords\n *\n * @param schema The JSON Schema to validate against\n * @param path The current JSON path (e.g., \"$.field.nested\")\n * @param params The parameters array to push values to\n */\n private translateJsonSchema(\n schema: JsonSchema,\n path: string,\n params: unknown[]\n ): string {\n const conditions: string[] = [];\n const jsonPath = path === '$' ? 'data' : `json_extract(data, '${path}')`;\n const typeExpr = path === '$'\n ? 'json_type(data)'\n : dialectJsonType(this.dialect, 'data', path);\n\n // Handle type/bsonType constraint\n const schemaType = schema.type || schema.bsonType;\n if (schemaType) {\n const types = Array.isArray(schemaType) ? schemaType : [schemaType];\n const typeConditions = types.map(t => {\n const sqlType = MONGO_TYPE_TO_SQLITE[t];\n if (Array.isArray(sqlType)) {\n return `${typeExpr} IN (${sqlType.map(st => `'${st}'`).join(', ')})`;\n }\n return `${typeExpr} = '${sqlType || t}'`;\n });\n if (typeConditions.length === 1) {\n conditions.push(typeConditions[0]!);\n } else {\n conditions.push(`(${typeConditions.join(' OR ')})`);\n }\n }\n\n // Handle required fields\n if (schema.required && schema.required.length > 0) {\n for (const field of schema.required) {\n validateFieldPath(field);\n const fieldPath = path === '$' ? `$.${field}` : `${path}.${field}`;\n const existsExpr = dialectJsonTypeWithPath(this.dialect, 'data', fieldPath);\n conditions.push(`${existsExpr} IS NOT NULL`);\n }\n }\n\n // Handle properties\n if (schema.properties) {\n for (const [field, propSchema] of Object.entries(schema.properties)) {\n validateFieldPath(field);\n const fieldPath = path === '$' ? `$.${field}` : `${path}.${field}`;\n const existsExpr = dialectJsonTypeWithPath(this.dialect, 'data', fieldPath);\n // Property validation only applies if the field exists\n const propCondition = this.translateJsonSchema(propSchema, fieldPath, params);\n if (propCondition !== '1 = 1') {\n conditions.push(`(${existsExpr} IS NULL OR ${propCondition})`);\n }\n }\n }\n\n // Handle enum constraint\n if (schema.enum && schema.enum.length > 0) {\n const enumValues = schema.enum.map(v => {\n if (v === null) return 'NULL';\n params.push(typeof v === 'object' ? JSON.stringify(v) : v);\n return '?';\n });\n const nullIncluded = schema.enum.includes(null);\n const nonNullValues = enumValues.filter(v => v !== 'NULL');\n if (nullIncluded && nonNullValues.length > 0) {\n conditions.push(`(${jsonPath} IS NULL OR ${jsonPath} IN (${nonNullValues.join(', ')}))`);\n } else if (nullIncluded) {\n conditions.push(`${jsonPath} IS NULL`);\n } else {\n conditions.push(`${jsonPath} IN (${enumValues.join(', ')})`);\n }\n }\n\n // Handle minimum/maximum for numbers\n if (schema.minimum !== undefined) {\n params.push(schema.minimum);\n conditions.push(`${jsonPath} >= ?`);\n }\n if (schema.maximum !== undefined) {\n params.push(schema.maximum);\n conditions.push(`${jsonPath} <= ?`);\n }\n if (schema.exclusiveMinimum !== undefined) {\n const val = typeof schema.exclusiveMinimum === 'boolean' ? schema.minimum : schema.exclusiveMinimum;\n if (val !== undefined) {\n params.push(val);\n conditions.push(`${jsonPath} > ?`);\n }\n }\n if (schema.exclusiveMaximum !== undefined) {\n const val = typeof schema.exclusiveMaximum === 'boolean' ? schema.maximum : schema.exclusiveMaximum;\n if (val !== undefined) {\n params.push(val);\n conditions.push(`${jsonPath} < ?`);\n }\n }\n\n // Handle minLength/maxLength for strings\n if (schema.minLength !== undefined) {\n params.push(schema.minLength);\n conditions.push(`LENGTH(${jsonPath}) >= ?`);\n }\n if (schema.maxLength !== undefined) {\n params.push(schema.maxLength);\n conditions.push(`LENGTH(${jsonPath}) <= ?`);\n }\n\n // Handle pattern for strings\n if (schema.pattern) {\n const likePattern = this.regexToLike(schema.pattern);\n params.push(likePattern);\n conditions.push(`${jsonPath} LIKE ?`);\n }\n\n // Handle minItems/maxItems for arrays\n if (schema.minItems !== undefined) {\n params.push(schema.minItems);\n const lenExpr = dialectJsonArrayLength(this.dialect, 'data', path);\n conditions.push(`${lenExpr} >= ?`);\n }\n if (schema.maxItems !== undefined) {\n params.push(schema.maxItems);\n const lenExpr = dialectJsonArrayLength(this.dialect, 'data', path);\n conditions.push(`${lenExpr} <= ?`);\n }\n\n // Handle allOf - all schemas must match\n if (schema.allOf && schema.allOf.length > 0) {\n const allOfConditions = schema.allOf.map(s => this.translateJsonSchema(s, path, params));\n conditions.push(`(${allOfConditions.join(' AND ')})`);\n }\n\n // Handle anyOf - at least one schema must match\n if (schema.anyOf && schema.anyOf.length > 0) {\n const anyOfConditions = schema.anyOf.map(s => this.translateJsonSchema(s, path, params));\n conditions.push(`(${anyOfConditions.join(' OR ')})`);\n }\n\n // Handle oneOf - exactly one schema must match (approximated with OR for SQL)\n if (schema.oneOf && schema.oneOf.length > 0) {\n // Note: True oneOf validation (exactly one match) is complex in SQL\n // We approximate with anyOf behavior since exact oneOf requires counting matches\n const oneOfConditions = schema.oneOf.map(s => this.translateJsonSchema(s, path, params));\n conditions.push(`(${oneOfConditions.join(' OR ')})`);\n }\n\n // Handle not - schema must not match\n if (schema.not) {\n const notCondition = this.translateJsonSchema(schema.not, path, params);\n conditions.push(`NOT (${notCondition})`);\n }\n\n if (conditions.length === 0) {\n return '1 = 1';\n }\n\n if (conditions.length === 1) {\n return conditions[0]!;\n }\n\n return `(${conditions.join(' AND ')})`;\n }\n}\n","/**\n * $match stage - Filters documents based on a query condition\n * Translates to SQL WHERE clause using QueryTranslator\n */\n\nimport { QueryTranslator } from '../query-translator'\nimport type { StageResult, StageContext } from './types'\n\nexport function translateMatchStage(\n matchQuery: Record<string, unknown>,\n _context: StageContext\n): StageResult {\n const queryTranslator = new QueryTranslator()\n const { sql, params } = queryTranslator.translate(matchQuery)\n\n return {\n whereClause: sql,\n params\n }\n}\n","/**\n * $project stage - Reshapes documents by including, excluding, or computing fields\n * Translates to SQL SELECT with json_object, json_remove, or computed expressions\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { StageResult, StageContext } from './types'\nimport { translateExpression, isFieldReference, getFieldPath } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport { type SQLDialect, jsonExtract as dialectJsonExtract } from '../dialect'\n\n/**\n * Recursively collect all field references from a $function expression's args\n */\nfunction collectFunctionFieldRefs(expr: unknown): string[] {\n if (!expr || typeof expr !== 'object') return []\n\n const fields: string[] = []\n const exprObj = expr as Record<string, unknown>\n\n // Check if this is a $function expression\n if ('$function' in exprObj) {\n const fnSpec = exprObj.$function as { args?: unknown[] }\n if (fnSpec.args && Array.isArray(fnSpec.args)) {\n for (const arg of fnSpec.args) {\n if (isFieldReference(arg)) {\n // Extract field name from $fieldName reference\n const fieldName = (arg as string).substring(1).split('.')[0]\n if (fieldName) {\n fields.push(fieldName)\n }\n }\n }\n }\n }\n\n // Recursively check nested objects\n for (const value of Object.values(exprObj)) {\n if (value && typeof value === 'object') {\n fields.push(...collectFunctionFieldRefs(value))\n }\n }\n\n return fields\n}\n\nexport function translateProjectStage(\n projection: Record<string, unknown>,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n const fields = Object.entries(projection)\n\n // Check if it's an exclusion projection (all values are 0 except _id)\n const isExclusion = fields.every(([key, value]) => {\n if (key === '_id') return true\n return value === 0\n })\n\n if (isExclusion) {\n return translateExclusionProject(projection, context, params, dialect)\n }\n\n // Inclusion or computed projection\n return translateInclusionProject(projection, context, params, dialect)\n}\n\nfunction translateExclusionProject(\n projection: Record<string, unknown>,\n _context: StageContext,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): StageResult {\n const fieldsToRemove = Object.entries(projection)\n .filter(([key, value]) => value === 0 && key !== '_id')\n .map(([key]) => {\n // Validate field name to prevent SQL injection\n validateFieldPath(key)\n return `'$.${key}'`\n })\n\n let selectClause: string\n if (fieldsToRemove.length > 0) {\n if (dialect === 'clickhouse') {\n // ClickHouse doesn't have json_remove, would need different approach\n selectClause = 'data' // Simplified for now\n } else {\n selectClause = `json_remove(data, ${fieldsToRemove.join(', ')}) AS data`\n }\n } else {\n selectClause = 'data'\n }\n\n return {\n selectClause,\n params\n }\n}\n\nfunction translateInclusionProject(\n projection: Record<string, unknown>,\n _context: StageContext,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): StageResult {\n const jsonParts: string[] = []\n\n // Collect all field references needed by $function expressions\n // These need to be included in the output so the function executor can extract them\n const functionFieldRefs = new Set<string>()\n for (const [, value] of Object.entries(projection)) {\n if (typeof value === 'object' && value !== null) {\n const refs = collectFunctionFieldRefs(value)\n refs.forEach(ref => functionFieldRefs.add(ref))\n }\n }\n\n // First, add the explicitly projected fields\n const explicitFields = new Set<string>()\n for (const [key, value] of Object.entries(projection)) {\n // Validate key (output field name) to prevent SQL injection\n validateFieldPath(key)\n explicitFields.add(key)\n if (value === 1) {\n // Include existing field\n const fieldExpr = dialectJsonExtract(dialect, 'data', `$.${key}`)\n jsonParts.push(`'${key}', ${fieldExpr}`)\n } else if (typeof value === 'string' && value.startsWith('$')) {\n // Field reference (renaming) - getFieldPath validates the field\n const fieldPath = getFieldPath(value)\n const fieldExpr = dialectJsonExtract(dialect, 'data', fieldPath)\n jsonParts.push(`'${key}', ${fieldExpr}`)\n } else if (typeof value === 'object' && value !== null) {\n // Expression\n const exprSql = translateExpression(value as Record<string, unknown>, params, dialect)\n jsonParts.push(`'${key}', ${exprSql}`)\n } else if (value !== 0) {\n // Literal value\n if (typeof value === 'string') {\n params.push(value)\n jsonParts.push(`'${key}', ?`)\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n jsonParts.push(`'${key}', ${JSON.stringify(value)}`)\n }\n }\n }\n\n // Add source fields needed by $function that aren't already projected\n // These will be used by the function executor to extract argument values\n for (const fieldRef of functionFieldRefs) {\n if (!explicitFields.has(fieldRef)) {\n // Validate field reference to prevent SQL injection\n validateFieldPath(fieldRef)\n const fieldExpr = dialectJsonExtract(dialect, 'data', `$.${fieldRef}`)\n jsonParts.push(`'${fieldRef}', ${fieldExpr}`)\n }\n }\n\n const selectClause = dialect === 'clickhouse'\n ? `tuple(${jsonParts.join(', ')}) AS data`\n : `json_object(${jsonParts.join(', ')}) AS data`\n\n return {\n selectClause,\n params,\n transformsShape: true\n }\n}\n","/**\n * $group stage - Groups documents by a specified expression\n * Translates to SQL GROUP BY with aggregate functions\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { StageResult, StageContext, GroupStage } from './types'\nimport { isFieldReference, getFieldPath, translateExpressionValue } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport { type SQLDialect, getAggregationFunctions, jsonExtract as dialectJsonExtract } from '../dialect'\n\nexport function translateGroupStage(\n group: GroupStage,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n\n // Validate _id is present\n if (!('_id' in group)) {\n throw new Error('$group requires _id field')\n }\n\n const { _id, ...accumulators } = group\n\n // Build GROUP BY clause\n const groupByFields: string[] = []\n const selectParts: string[] = []\n\n if (_id === null) {\n // Total aggregation - no GROUP BY\n selectParts.push(\"'_id', NULL\")\n } else if (typeof _id === 'string' && isFieldReference(_id)) {\n // Simple field grouping\n const path = getFieldPath(_id)\n const fieldExpr = dialectJsonExtract(dialect, 'data', path)\n groupByFields.push(fieldExpr)\n selectParts.push(`'_id', ${fieldExpr}`)\n } else if (typeof _id === 'object' && _id !== null) {\n // Compound _id\n const idParts: string[] = []\n for (const [key, value] of Object.entries(_id)) {\n // Validate key to prevent SQL injection\n validateFieldPath(key)\n if (typeof value === 'string' && isFieldReference(value)) {\n // getFieldPath validates the field reference\n const path = getFieldPath(value)\n const fieldExpr = dialectJsonExtract(dialect, 'data', path)\n groupByFields.push(fieldExpr)\n idParts.push(`'${key}', ${fieldExpr}`)\n }\n }\n if (dialect === 'clickhouse') {\n selectParts.push(`'_id', tuple(${idParts.join(', ')})`)\n } else {\n selectParts.push(`'_id', json_object(${idParts.join(', ')})`)\n }\n }\n\n // Build accumulators\n for (const [field, accumulator] of Object.entries(accumulators)) {\n // Validate field name to prevent SQL injection\n validateFieldPath(field)\n const accSql = translateAccumulator(accumulator as Record<string, unknown>, params, dialect)\n selectParts.push(`'${field}', ${accSql}`)\n }\n\n const selectClause = dialect === 'clickhouse'\n ? `tuple(${selectParts.join(', ')}) AS data`\n : `json_object(${selectParts.join(', ')}) AS data`\n\n const result: StageResult = {\n selectClause,\n params,\n transformsShape: true\n }\n if (groupByFields.length > 0) {\n result.groupByClause = groupByFields.join(', ')\n }\n return result\n}\n\nfunction translateAccumulator(\n accumulator: Record<string, unknown>,\n params: unknown[],\n dialect: SQLDialect = 'sqlite'\n): string {\n const operator = Object.keys(accumulator)[0]!\n const value = accumulator[operator]\n const aggFns = getAggregationFunctions(dialect)\n\n switch (operator) {\n case '$sum': {\n if (typeof value === 'number') {\n // $sum: 1 counts documents\n if (value === 1) {\n return aggFns.count()\n }\n return aggFns.sum(String(value))\n }\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.sum(expr)\n }\n\n case '$avg': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.avg(expr)\n }\n\n case '$min': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.min(expr)\n }\n\n case '$max': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.max(expr)\n }\n\n case '$count': {\n return aggFns.count()\n }\n\n case '$first': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.first(expr)\n }\n\n case '$last': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.last(expr)\n }\n\n case '$push': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.push(expr)\n }\n\n case '$addToSet': {\n const expr = translateExpressionValue(value, params, dialect)\n return aggFns.addToSet(expr)\n }\n\n default:\n throw new Error(`Unknown accumulator operator: ${operator}`)\n }\n}\n","/**\n * $sort stage - Sorts documents by specified fields\n * Translates to SQL ORDER BY clause\n */\n\nimport type { StageResult, StageContext } from './types'\nimport { getFieldPath } from './expression-translator'\n\nexport function translateSortStage(\n sort: Record<string, 1 | -1>,\n _context: StageContext\n): StageResult {\n const orderParts: string[] = []\n\n for (const [field, direction] of Object.entries(sort)) {\n if (direction !== 1 && direction !== -1) {\n throw new Error('$sort direction must be 1 or -1')\n }\n\n const path = getFieldPath('$' + field)\n const dirStr = direction === 1 ? 'ASC' : 'DESC'\n orderParts.push(`json_extract(data, '${path}') ${dirStr}`)\n }\n\n return {\n orderByClause: orderParts.join(', '),\n params: []\n }\n}\n","/**\n * $limit stage - Limits the number of documents\n * Translates to SQL LIMIT clause\n */\n\nimport type { StageResult, StageContext } from './types'\n\nexport function translateLimitStage(\n limit: number,\n _context: StageContext\n): StageResult {\n return {\n limitClause: `LIMIT ${limit}`,\n params: []\n }\n}\n","/**\n * $skip stage - Skips a number of documents\n * Translates to SQL OFFSET clause\n */\n\nimport type { StageResult, StageContext } from './types'\n\nexport function translateSkipStage(\n skip: number,\n _context: StageContext\n): StageResult {\n return {\n offsetClause: `OFFSET ${skip}`,\n params: []\n }\n}\n","/**\n * $count stage - Counts documents and returns a single document with the count\n * Translates to SELECT COUNT(*) AS fieldName\n */\n\nimport type { StageResult, StageContext } from './types'\n\nexport function translateCountStage(\n fieldName: string,\n _context: StageContext\n): StageResult {\n return {\n selectClause: `json_object('${fieldName}', COUNT(*)) AS data`,\n params: [],\n transformsShape: true\n }\n}\n","/**\n * $lookup stage - Performs a left outer join with another collection\n * Translates to SQL LEFT JOIN or subquery\n */\n\nimport type { StageResult, StageContext, LookupStage } from './types'\nimport { getFieldPath } from './expression-translator'\n\nexport function translateLookupStage(\n lookup: LookupStage,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const { localField, foreignField } = lookup\n\n if (localField && foreignField) {\n // Simple lookup with localField/foreignField\n return translateSimpleLookup(lookup, context, params)\n } else if (lookup.let && lookup.pipeline) {\n // Pipeline lookup\n return translatePipelineLookup(lookup, context, params)\n }\n\n throw new Error('$lookup requires either localField/foreignField or let/pipeline')\n}\n\nfunction translateSimpleLookup(\n lookup: LookupStage,\n context: StageContext,\n params: unknown[]\n): StageResult {\n const { from, localField, foreignField, as } = lookup\n\n const source = context.previousCte || context.collection\n const localPath = getFieldPath('$' + localField!)\n const foreignPath = getFieldPath('$' + foreignField!)\n\n // Use a subquery to collect matching documents as a JSON array\n const cteName = `stage_${context.cteIndex}`\n const cteExpression = `\n SELECT\n ${source}.data,\n COALESCE(\n (SELECT json_group_array(${from}.data)\n FROM ${from}\n WHERE json_extract(${from}.data, '${foreignPath}') = json_extract(${source}.data, '${localPath}')),\n '[]'\n ) AS lookup_result\n FROM ${source}\n `\n\n // The result should merge lookup_result into data as the 'as' field\n const selectClause = `json_set(data, '$.${as}', json(lookup_result)) AS data`\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n selectClause,\n params,\n transformsShape: true\n }\n}\n\nfunction translatePipelineLookup(\n lookup: LookupStage,\n context: StageContext,\n params: unknown[]\n): StageResult {\n const { from, as } = lookup\n\n // For pipeline lookups, we need to handle variable substitution\n // This is a simplified implementation\n const source = context.previousCte || context.collection\n const cteName = `stage_${context.cteIndex}`\n\n // Build the inner query for the lookup\n // In a full implementation, we'd translate the pipeline with variable substitution\n const cteExpression = `\n SELECT\n ${source}.data,\n COALESCE(\n (SELECT json_group_array(${from}.data) FROM ${from}),\n '[]'\n ) AS lookup_result\n FROM ${source}\n `\n\n const selectClause = `json_set(data, '$.${as}', json(lookup_result)) AS data`\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n selectClause,\n params,\n transformsShape: true\n }\n}\n","/**\n * $unwind stage - Deconstructs an array field to output one document per element\n * Translates to SQL using json_each for SQLite or ARRAY JOIN for ClickHouse\n */\n\nimport type { StageResult, StageContext, UnwindStage } from './types'\nimport { getFieldPath } from './expression-translator'\nimport { type SQLDialect, jsonExtract as dialectJsonExtract } from '../dialect'\n\nexport function translateUnwindStage(\n unwind: string | UnwindStage,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n\n // Normalize to UnwindStage format\n const config: UnwindStage = typeof unwind === 'string'\n ? { path: unwind }\n : unwind\n\n const { path, includeArrayIndex, preserveNullAndEmptyArrays } = config\n\n // Remove leading $ from path\n const fieldName = path.startsWith('$') ? path.substring(1) : path\n const jsonPath = getFieldPath('$' + fieldName)\n\n const source = context.previousCte || context.collection\n const cteName = `stage_${context.cteIndex}`\n\n if (dialect === 'clickhouse') {\n // ClickHouse uses ARRAY JOIN syntax\n const arrayExpr = dialectJsonExtract(dialect, `${source}.doc`, jsonPath)\n const leftJoin = preserveNullAndEmptyArrays ? 'LEFT ' : ''\n\n let selectParts = `*, ${fieldName}_element AS ${fieldName}`\n if (includeArrayIndex) {\n selectParts = `*, ${fieldName}_element AS ${fieldName}, ${fieldName}_index AS ${includeArrayIndex}`\n }\n\n const cteExpression = `\n SELECT ${selectParts}\n FROM ${source}\n ${leftJoin}ARRAY JOIN ${arrayExpr} AS ${fieldName}_element${includeArrayIndex ? `, arrayEnumerate(${arrayExpr}) AS ${fieldName}_index` : ''}\n `\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n params,\n transformsShape: true\n }\n }\n\n // SQLite uses json_each\n // Build the join type based on preserveNullAndEmptyArrays\n const joinType = preserveNullAndEmptyArrays ? 'LEFT JOIN' : 'JOIN'\n\n // Build the SELECT clause\n let selectParts = `json_set(${source}.data, '${jsonPath}', each.value) AS data`\n\n if (includeArrayIndex) {\n // Include the array index in the output\n selectParts = `json_set(json_set(${source}.data, '${jsonPath}', each.value), '$.${includeArrayIndex}', each.key) AS data`\n }\n\n const cteExpression = `\n SELECT ${selectParts}\n FROM ${source}\n ${joinType} json_each(json_extract(${source}.data, '${jsonPath}')) AS each\n `\n\n return {\n cteExpression: cteExpression.trim(),\n cteName,\n params,\n transformsShape: true\n }\n}\n","/**\n * $addFields stage - Adds new fields to documents\n * Translates to SQL using json_set (SQLite) or tuple functions (ClickHouse)\n */\n\nimport type { StageResult, StageContext } from './types'\nimport { translateExpressionValue, isFieldReference, getFieldPath } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\nimport { type SQLDialect, jsonExtract as dialectJsonExtract } from '../dialect'\n\nexport function translateAddFieldsStage(\n addFields: Record<string, unknown>,\n context: StageContext\n): StageResult {\n const params: unknown[] = []\n const dialect: SQLDialect = context.dialect || 'sqlite'\n\n // Build nested json_set calls for each field\n let result = 'data'\n\n for (const [field, value] of Object.entries(addFields)) {\n // Validate field name to prevent SQL injection\n validateFieldPath(field)\n const jsonPath = `'$.${field}'`\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Expression\n const exprSql = translateExpressionValue(value, params, dialect)\n if (dialect === 'clickhouse') {\n // ClickHouse would need different handling\n result = `tuple(${result}, '${field}', ${exprSql})`\n } else {\n result = `json_set(${result}, ${jsonPath}, ${exprSql})`\n }\n } else if (isFieldReference(value)) {\n // Field reference - getFieldPath validates the field\n const fieldPath = getFieldPath(value)\n const fieldExpr = dialectJsonExtract(dialect, 'data', fieldPath)\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ${fieldExpr})`\n } else {\n result = `json_set(${result}, ${jsonPath}, ${fieldExpr})`\n }\n } else if (typeof value === 'string') {\n params.push(value)\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ?)`\n } else {\n result = `json_set(${result}, ${jsonPath}, ?)`\n }\n } else if (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ${JSON.stringify(value)})`\n } else {\n result = `json_set(${result}, ${jsonPath}, ${JSON.stringify(value)})`\n }\n } else if (Array.isArray(value)) {\n params.push(JSON.stringify(value))\n if (dialect === 'clickhouse') {\n result = `tuple(${result}, '${field}', ?)`\n } else {\n result = `json_set(${result}, ${jsonPath}, json(?))`\n }\n }\n }\n\n return {\n selectClause: `${result} AS data`,\n params,\n transformsShape: true\n }\n}\n","/**\n * $bucket stage - Categorizes documents into groups (buckets) based on a specified expression\n * Translates to SQL using CASE WHEN for bucket boundaries\n */\n\nimport type { StageResult, StageContext, BucketStage } from './types'\nimport { getFieldPath, translateExpressionValue } from './expression-translator'\nimport { validateFieldPath } from '../../utils/sql-safety.js'\n\nexport function translateBucketStage(\n bucket: BucketStage,\n _context: StageContext\n): StageResult {\n const params: unknown[] = []\n const { groupBy, boundaries, output } = bucket\n const defaultBucket = bucket.default\n\n // Get the field to bucket on - getFieldPath validates the field reference\n // If not a $ reference, validate directly\n let fieldPath: string\n if (groupBy.startsWith('$')) {\n fieldPath = getFieldPath(groupBy)\n } else {\n validateFieldPath(groupBy)\n fieldPath = `$.${groupBy}`\n }\n const fieldExpr = `json_extract(data, '${fieldPath}')`\n\n // Build CASE WHEN expression for bucket assignment\n const bucketCases: string[] = []\n\n for (let i = 0; i < boundaries.length - 1; i++) {\n const lower = boundaries[i]\n const upper = boundaries[i + 1]\n bucketCases.push(`WHEN ${fieldExpr} >= ${lower} AND ${fieldExpr} < ${upper} THEN ${lower}`)\n }\n\n // Handle default bucket\n const defaultCase = defaultBucket !== undefined\n ? `ELSE '${defaultBucket}'`\n : `ELSE NULL`\n\n const bucketExpr = `CASE ${bucketCases.join(' ')} ${defaultCase} END`\n\n // Build the output accumulators\n const selectParts: string[] = [`'_id', ${bucketExpr}`]\n\n if (output) {\n for (const [field, accumulator] of Object.entries(output)) {\n const accSql = translateBucketAccumulator(accumulator as Record<string, unknown>, params)\n selectParts.push(`'${field}', ${accSql}`)\n }\n } else {\n // Default output is count\n selectParts.push(`'count', COUNT(*)`)\n }\n\n return {\n selectClause: `json_object(${selectParts.join(', ')}) AS data`,\n groupByClause: bucketExpr,\n params,\n transformsShape: true\n }\n}\n\nfunction translateBucketAccumulator(\n accumulator: Record<string, unknown>,\n params: unknown[]\n): string {\n const operator = Object.keys(accumulator)[0]!\n const value = accumulator[operator]\n\n switch (operator) {\n case '$sum': {\n if (typeof value === 'number') {\n return `COUNT(*)`\n }\n const expr = translateExpressionValue(value, params)\n return `SUM(${expr})`\n }\n\n case '$avg': {\n const expr = translateExpressionValue(value, params)\n return `AVG(${expr})`\n }\n\n case '$min': {\n const expr = translateExpressionValue(value, params)\n return `MIN(${expr})`\n }\n\n case '$max': {\n const expr = translateExpressionValue(value, params)\n return `MAX(${expr})`\n }\n\n case '$count': {\n return 'COUNT(*)'\n }\n\n case '$push': {\n const expr = translateExpressionValue(value, params)\n return `json_group_array(${expr})`\n }\n\n default:\n throw new Error(`Unknown bucket accumulator operator: ${operator}`)\n }\n}\n","/**\n * $facet stage - Processes multiple aggregation pipelines in a single stage\n * Translates to multiple separate queries (can be run in parallel)\n */\n\nimport type { StageResult, StageContext, PipelineStage } from './types'\n\nexport interface FacetTranslator {\n translatePipeline(stages: PipelineStage[], collection: string): { sql: string; params: unknown[] }\n}\n\nexport function translateFacetStage(\n facet: Record<string, PipelineStage[]>,\n context: StageContext,\n pipelineTranslator: FacetTranslator\n): StageResult {\n const params: unknown[] = []\n const facets: Record<string, { sql: string; params: unknown[] }> = {}\n\n // Each facet is an independent pipeline\n for (const [facetName, pipeline] of Object.entries(facet)) {\n // Use the previous CTE or collection as the source for each facet\n const source = context.previousCte || context.collection\n\n // Translate each facet pipeline independently\n const result = pipelineTranslator.translatePipeline(pipeline, source)\n facets[facetName] = result\n }\n\n // The final result combines all facets\n // In practice, this would be assembled in the application layer\n // Here we provide the individual queries\n\n return {\n facets,\n params,\n selectClause: 'NULL', // Facets are handled separately\n transformsShape: true\n }\n}\n","/**\n * SearchTranslator - Translates MongoDB Atlas Search syntax to SQLite FTS5 MATCH syntax\n *\n * MongoDB Atlas Search operators:\n * - text: Full-text search on specified path(s)\n * - phrase: Exact phrase search\n * - wildcard: Wildcard pattern matching\n * - compound: Boolean combinations (must, should, mustNot, filter)\n *\n * FTS5 MATCH syntax:\n * - term: Simple word match\n * - \"phrase\": Exact phrase match\n * - prefix*: Prefix matching\n * - term1 AND term2: Both must match\n * - term1 OR term2: Either must match\n * - NOT term: Exclude term\n * - column:term: Match in specific column\n */\n\nexport interface SearchResult {\n /** The FTS5 MATCH expression */\n ftsMatch: string;\n /** SQL parameters for parameterized queries */\n params: unknown[];\n /** The FTS table name to query */\n ftsTable?: string;\n}\n\nexport interface TextOperator {\n query: string;\n path?: string | string[];\n fuzzy?: {\n maxEdits?: number;\n prefixLength?: number;\n };\n score?: {\n boost?: number;\n };\n}\n\nexport interface PhraseOperator {\n query: string;\n path?: string | string[];\n slop?: number;\n score?: {\n boost?: number;\n };\n}\n\nexport interface WildcardOperator {\n query: string;\n path?: string | string[];\n allowAnalyzedField?: boolean;\n score?: {\n boost?: number;\n };\n}\n\nexport interface AutocompleteOperator {\n query: string;\n path?: string | string[];\n tokenOrder?: 'any' | 'sequential';\n fuzzy?: {\n maxEdits?: number;\n prefixLength?: number;\n maxExpansions?: number;\n };\n score?: {\n boost?: number;\n };\n}\n\nexport interface CompoundOperator {\n must?: SearchOperator[];\n should?: SearchOperator[];\n mustNot?: SearchOperator[];\n filter?: SearchOperator[];\n minimumShouldMatch?: number;\n}\n\nexport interface SearchOperator {\n text?: TextOperator;\n phrase?: PhraseOperator;\n wildcard?: WildcardOperator;\n compound?: CompoundOperator;\n autocomplete?: AutocompleteOperator;\n}\n\n/**\n * SearchTranslator converts MongoDB Atlas Search syntax to SQLite FTS5 MATCH syntax\n */\nexport class SearchTranslator {\n /**\n * Translate a MongoDB $search operator to FTS5 MATCH expression\n *\n * @param search The MongoDB $search operator value\n * @param collection The collection name (used for FTS table naming)\n * @returns SearchResult with FTS5 MATCH expression\n */\n translateSearch(search: SearchOperator, collection: string): SearchResult {\n const params: unknown[] = [];\n\n const ftsMatch = this.translateOperator(search);\n\n return {\n ftsMatch,\n params,\n ftsTable: `${collection}_fts`,\n };\n }\n\n /**\n * Translate a single search operator to FTS5 syntax\n */\n private translateOperator(operator: SearchOperator): string {\n if (operator.text) {\n return this.translateText(operator.text);\n }\n\n if (operator.phrase) {\n return this.translatePhrase(operator.phrase);\n }\n\n if (operator.wildcard) {\n return this.translateWildcard(operator.wildcard);\n }\n\n if (operator.compound) {\n return this.translateCompound(operator.compound);\n }\n\n if (operator.autocomplete) {\n return this.translateAutocomplete(operator.autocomplete);\n }\n\n return '*'; // Match all if no operator specified\n }\n\n /**\n * Translate text operator to FTS5 terms\n *\n * MongoDB: { text: { query: \"hello world\", path: \"content\" } }\n * FTS5: content:hello content:world\n */\n private translateText(text: TextOperator): string {\n const { query, path } = text;\n\n // Split query into terms and escape each term to prevent FTS5 injection\n const terms = query.trim().split(/\\s+/).filter(t => t.length > 0).map(t => this.escapeFTS5Term(t));\n\n if (terms.length === 0) {\n return '*';\n }\n\n // If path is specified, prefix each term with the column\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n return terms.map(term => `${column}:${term}`).join(' ');\n }\n\n // No path specified - search all fields\n return terms.join(' ');\n }\n\n /**\n * Translate phrase operator to FTS5 quoted phrase\n *\n * MongoDB: { phrase: { query: \"hello world\", path: \"title\" } }\n * FTS5: title:\"hello world\"\n */\n private translatePhrase(phrase: PhraseOperator): string {\n const { query, path } = phrase;\n\n // Escape the phrase content to prevent FTS5 injection\n // For phrases, we escape and then wrap in quotes\n const escapedPhrase = this.escapeFTS5Term(query);\n const quotedPhrase = `\"${escapedPhrase}\"`;\n\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n return `${column}:${quotedPhrase}`;\n }\n\n return quotedPhrase;\n }\n\n /**\n * Translate wildcard operator to FTS5 prefix matching\n *\n * MongoDB: { wildcard: { query: \"data*\", path: \"content\" } }\n * FTS5: content:data*\n */\n private translateWildcard(wildcard: WildcardOperator): string {\n const { query, path } = wildcard;\n\n // For wildcard queries, we need to escape special chars but preserve the wildcard (*) at the end\n // First check if query ends with wildcard\n const hasTrailingWildcard = query.endsWith('*');\n const baseQuery = hasTrailingWildcard ? query.slice(0, -1) : query;\n const escapedQuery = this.escapeFTS5Term(baseQuery) + (hasTrailingWildcard ? '*' : '');\n\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n return `${column}:${escapedQuery}`;\n }\n\n return escapedQuery;\n }\n\n /**\n * Translate autocomplete operator to FTS5 prefix query\n *\n * MongoDB: { autocomplete: { query: \"mach\", path: \"title\" } }\n * FTS5: title:mach*\n *\n * Autocomplete uses prefix matching (term*) to find partial word matches.\n * When tokenOrder is 'sequential', terms must appear in order.\n */\n private translateAutocomplete(autocomplete: AutocompleteOperator): string {\n const { query, path, tokenOrder } = autocomplete;\n\n // Split query into terms and escape each term to prevent FTS5 injection\n const terms = query.trim().split(/\\s+/).filter(t => t.length > 0).map(t => this.escapeFTS5Term(t));\n\n if (terms.length === 0) {\n return '*';\n }\n\n // Add prefix wildcard to each term for autocomplete\n const prefixTerms = terms.map(term => `${term}*`);\n\n // If path is specified, prefix each term with the column\n if (path) {\n const column = Array.isArray(path) ? path[0] : path;\n\n if (tokenOrder === 'sequential' && prefixTerms.length > 1) {\n // For sequential, terms must appear in order - use phrase-like matching\n // FTS5 doesn't support prefix in phrases, so we use NEAR/0 for adjacent terms\n // But for simplicity, we join with spaces which requires all terms\n return prefixTerms.map(term => `${column}:${term}`).join(' ');\n }\n\n return prefixTerms.map(term => `${column}:${term}`).join(' ');\n }\n\n // No path specified - search all fields\n if (tokenOrder === 'sequential' && prefixTerms.length > 1) {\n return prefixTerms.join(' ');\n }\n\n return prefixTerms.join(' ');\n }\n\n /**\n * Translate compound operator to FTS5 boolean expression\n *\n * MongoDB compound operators:\n * - must: All clauses must match (AND)\n * - should: At least one should match (OR)\n * - mustNot: None should match (NOT)\n * - filter: Same as must but without scoring\n */\n private translateCompound(compound: CompoundOperator): string {\n const parts: string[] = [];\n\n // Process 'must' clauses (AND)\n if (compound.must && compound.must.length > 0) {\n const mustClauses = compound.must.map(op => this.translateOperator(op));\n if (mustClauses.length === 1) {\n parts.push(mustClauses[0]!);\n } else {\n parts.push(`(${mustClauses.join(' AND ')})`);\n }\n }\n\n // Process 'filter' clauses (same as must)\n if (compound.filter && compound.filter.length > 0) {\n const filterClauses = compound.filter.map(op => this.translateOperator(op));\n if (filterClauses.length === 1) {\n parts.push(filterClauses[0]!);\n } else {\n parts.push(`(${filterClauses.join(' AND ')})`);\n }\n }\n\n // Process 'should' clauses (OR)\n if (compound.should && compound.should.length > 0) {\n const shouldClauses = compound.should.map(op => this.translateOperator(op));\n if (shouldClauses.length === 1) {\n parts.push(shouldClauses[0]!);\n } else {\n parts.push(`(${shouldClauses.join(' OR ')})`);\n }\n }\n\n // Process 'mustNot' clauses (NOT)\n if (compound.mustNot && compound.mustNot.length > 0) {\n const mustNotClauses = compound.mustNot.map(op => `NOT ${this.translateOperator(op)}`);\n parts.push(...mustNotClauses);\n }\n\n if (parts.length === 0) {\n return '*';\n }\n\n if (parts.length === 1) {\n return parts[0]!;\n }\n\n // Join all parts with AND\n return parts.join(' AND ');\n }\n\n /**\n * Escape special FTS5 characters in a term\n */\n private escapeFTS5Term(term: string): string {\n // FTS5 special characters that need escaping\n return term.replace(/[&|()^~*:\"]/g, char => `\\\\${char}`);\n }\n\n /**\n * Build the complete SQL query for a $search aggregation stage\n *\n * @param search The MongoDB $search operator\n * @param collection The collection name\n * @param documentsTable The documents table name (default: 'documents')\n * @returns Complete SQL query with FTS5 join\n */\n buildSearchSQL(\n search: SearchOperator,\n collection: string,\n documentsTable: string = 'documents'\n ): { sql: string; params: unknown[] } {\n const result = this.translateSearch(search, collection);\n const ftsTable = result.ftsTable || `${collection}_fts`;\n\n // Build SQL with FTS5 join\n // FTS5 uses rowid for joining with the content table\n const sql = `\n SELECT ${documentsTable}.*, -bm25(${ftsTable}) AS _searchScore\n FROM ${documentsTable}\n JOIN ${ftsTable} ON ${documentsTable}.id = ${ftsTable}.rowid\n WHERE ${ftsTable} MATCH ?\n ORDER BY _searchScore DESC\n `.trim();\n\n return {\n sql,\n params: [result.ftsMatch],\n };\n }\n}\n","/**\n * $search stage - MongoDB Atlas Search integration\n *\n * Translates MongoDB $search aggregation stage to SQLite FTS5 queries.\n * The $search stage must be the first stage in an aggregation pipeline.\n *\n * Supported operators:\n * - text: Full-text search on specified fields\n * - phrase: Exact phrase matching\n * - wildcard: Wildcard pattern matching\n * - compound: Boolean combinations (must, should, mustNot, filter)\n */\n\nimport { SearchTranslator, type SearchOperator } from '../search-translator';\nimport type { StageResult, StageContext } from './types';\n\n/**\n * Extended context for search stage\n */\nexport interface SearchStageContext extends StageContext {\n /** Include relevance score in results */\n includeScore?: boolean;\n}\n\n/**\n * Result from search stage translation\n */\nexport interface SearchStageResult extends StageResult {\n /** FTS5 MATCH expression */\n ftsMatch: string;\n /** FTS table name */\n ftsTable: string;\n /** JOIN clause for FTS table */\n ftsJoin: string;\n}\n\n/**\n * $search stage input with optional index name\n */\nexport interface SearchStageInput extends SearchOperator {\n /** Named search index to use */\n index?: string;\n}\n\n/**\n * Translate a $search aggregation stage to SQL\n *\n * @param searchSpec The $search stage specification\n * @param context Stage context including collection name\n * @returns SearchStageResult with FTS5 query components\n */\nexport function translateSearchStage(\n searchSpec: SearchStageInput,\n context: SearchStageContext\n): SearchStageResult {\n const translator = new SearchTranslator();\n\n // Extract the search operator (remove 'index' if present)\n const { index, ...searchOperator } = searchSpec;\n\n // Determine FTS table name\n const ftsTable = `${context.collection}_fts`;\n\n // Translate the search operator to FTS5 MATCH expression\n const searchResult = translator.translateSearch(searchOperator, context.collection);\n\n // Build the JOIN clause for FTS5 table\n const ftsJoin = `JOIN ${ftsTable} ON documents.id = ${ftsTable}.rowid`;\n\n // Build SELECT clause with optional score\n let selectClause: string | undefined;\n if (context.includeScore) {\n // FTS5 bm25() returns negative values (more negative = more relevant)\n // Negate to get positive scores where higher = more relevant\n selectClause = `*, -bm25(${ftsTable}) AS _searchScore`;\n }\n\n // Build WHERE clause\n const whereClause = `${ftsTable} MATCH ?`;\n\n // Build ORDER BY clause for relevance ranking\n const orderByClause = context.includeScore ? `_searchScore DESC` : undefined;\n\n const result: SearchStageResult = {\n ftsMatch: searchResult.ftsMatch,\n ftsTable,\n ftsJoin,\n whereClause,\n params: [searchResult.ftsMatch],\n };\n if (selectClause !== undefined) {\n result.selectClause = selectClause;\n }\n if (orderByClause !== undefined) {\n result.orderByClause = orderByClause;\n }\n if (context.includeScore !== undefined) {\n result.transformsShape = context.includeScore;\n }\n return result;\n}\n\n/**\n * Build complete SQL for a $search stage\n *\n * @param searchSpec The $search specification\n * @param collection Collection name\n * @param includeScore Whether to include relevance score\n * @returns Complete SQL query and parameters\n */\nexport function buildSearchSQL(\n searchSpec: SearchStageInput,\n collection: string,\n includeScore: boolean = false\n): { sql: string; params: unknown[] } {\n const context: SearchStageContext = {\n collection,\n cteIndex: 0,\n existingParams: [],\n includeScore,\n };\n\n const result = translateSearchStage(searchSpec, context);\n\n const selectClause = result.selectClause || '*';\n\n const sql = `\n SELECT ${selectClause}\n FROM documents\n ${result.ftsJoin}\n WHERE ${result.whereClause}\n ${result.orderByClause ? `ORDER BY ${result.orderByClause}` : ''}\n `.trim().replace(/\\s+/g, ' ');\n\n return {\n sql,\n params: result.params,\n };\n}\n","/**\n * Pipeline Optimizer - Optimizes aggregation pipelines before translation\n *\n * Optimizations:\n * 1. Predicate pushdown: Move $match stages as early as possible\n * 2. Projection pushdown: Reduce fields carried through pipeline\n * 3. Stage merging: Combine adjacent compatible stages\n * 4. Redundant stage elimination\n */\n\nimport type { PipelineStage } from './types'\n\n/**\n * Optimize an aggregation pipeline\n */\nexport function optimizePipeline(pipeline: PipelineStage[]): PipelineStage[] {\n let optimized = [...pipeline]\n\n // Apply optimizations in order\n optimized = pushdownPredicates(optimized)\n optimized = mergeAdjacentStages(optimized)\n optimized = eliminateRedundantStages(optimized)\n\n return optimized\n}\n\n/**\n * Push $match stages as early as possible in the pipeline\n * This reduces the number of documents processed by subsequent stages\n */\nfunction pushdownPredicates(pipeline: PipelineStage[]): PipelineStage[] {\n const result: PipelineStage[] = []\n\n for (let i = 0; i < pipeline.length; i++) {\n const stage = pipeline[i]!\n const stageType = getStageType(stage)\n\n if (stageType !== '$match') {\n result.push(stage)\n continue\n }\n\n // Try to push this $match earlier\n const matchCondition = (stage as { $match: Record<string, unknown> }).$match\n const pushPosition = findEarliestPushPosition(result, matchCondition)\n\n if (pushPosition < result.length) {\n // Insert at the earlier position\n result.splice(pushPosition, 0, stage)\n } else {\n result.push(stage)\n }\n }\n\n return result\n}\n\n/**\n * Find the earliest position where a $match can be pushed\n */\nfunction findEarliestPushPosition(\n stages: PipelineStage[],\n matchCondition: Record<string, unknown>\n): number {\n const matchFields = extractFieldsFromCondition(matchCondition)\n\n // Walk backwards through stages\n for (let i = stages.length - 1; i >= 0; i--) {\n const stage = stages[i]!\n const stageType = getStageType(stage)\n\n // Can't push past stages that modify the fields we're matching on\n if (stageType === '$group') {\n // $group completely changes document shape\n return i + 1\n }\n\n if (stageType === '$project' || stageType === '$addFields') {\n const projectFields = getAffectedFields(stage)\n if (matchFields.some(f => projectFields.has(f))) {\n return i + 1\n }\n }\n\n if (stageType === '$unwind') {\n const unwindField = getUnwindField(stage)\n if (matchFields.some(f => f === unwindField || f.startsWith(unwindField + '.'))) {\n return i + 1\n }\n }\n\n if (stageType === '$lookup') {\n const lookupAs = getLookupAsField(stage)\n if (matchFields.some(f => f === lookupAs || f.startsWith(lookupAs + '.'))) {\n return i + 1\n }\n }\n\n // $sort, $limit, $skip don't affect fields\n // We can generally push $match past them (though order matters for correctness)\n if (stageType === '$limit' || stageType === '$skip') {\n // Can't push past limit/skip as it changes result set\n return i + 1\n }\n }\n\n return 0\n}\n\n/**\n * Merge adjacent compatible stages\n */\nfunction mergeAdjacentStages(pipeline: PipelineStage[]): PipelineStage[] {\n const result: PipelineStage[] = []\n\n for (const stage of pipeline) {\n if (result.length === 0) {\n result.push(stage)\n continue\n }\n\n const prevStage = result[result.length - 1]!\n const merged = tryMergeStages(prevStage, stage)\n\n if (merged) {\n result[result.length - 1] = merged\n } else {\n result.push(stage)\n }\n }\n\n return result\n}\n\n/**\n * Try to merge two stages into one\n */\nfunction tryMergeStages(\n first: PipelineStage,\n second: PipelineStage\n): PipelineStage | null {\n const firstType = getStageType(first)\n const secondType = getStageType(second)\n\n // Merge adjacent $match stages\n if (firstType === '$match' && secondType === '$match') {\n const firstMatch = (first as { $match: Record<string, unknown> }).$match\n const secondMatch = (second as { $match: Record<string, unknown> }).$match\n\n return {\n $match: {\n $and: [firstMatch, secondMatch]\n }\n }\n }\n\n // Merge adjacent $addFields stages\n if (firstType === '$addFields' && secondType === '$addFields') {\n const firstFields = (first as { $addFields: Record<string, unknown> }).$addFields\n const secondFields = (second as { $addFields: Record<string, unknown> }).$addFields\n\n return {\n $addFields: {\n ...firstFields,\n ...secondFields\n }\n }\n }\n\n // Merge adjacent $project stages (if compatible)\n if (firstType === '$project' && secondType === '$project') {\n const firstProject = (first as { $project: Record<string, unknown> }).$project\n const secondProject = (second as { $project: Record<string, unknown> }).$project\n\n // Only merge if both are inclusion or both are exclusion\n const firstIsExclusion = isExclusionProject(firstProject)\n const secondIsExclusion = isExclusionProject(secondProject)\n\n if (firstIsExclusion === secondIsExclusion) {\n return {\n $project: {\n ...firstProject,\n ...secondProject\n }\n }\n }\n }\n\n return null\n}\n\n/**\n * Eliminate redundant stages\n */\nfunction eliminateRedundantStages(pipeline: PipelineStage[]): PipelineStage[] {\n return pipeline.filter((stage, index) => {\n const stageType = getStageType(stage)\n\n // Remove empty $match\n if (stageType === '$match') {\n const matchCondition = (stage as { $match: Record<string, unknown> }).$match\n if (Object.keys(matchCondition).length === 0) {\n return false\n }\n }\n\n // Remove $limit 0 followed by anything (no results anyway)\n if (stageType === '$limit') {\n const limit = (stage as { $limit: number }).$limit\n if (limit === 0) {\n // Keep only this stage, remove rest\n return true\n }\n }\n\n // Remove duplicate $sort stages (only last one matters)\n if (stageType === '$sort' && index < pipeline.length - 1) {\n for (let i = index + 1; i < pipeline.length; i++) {\n const laterStageType = getStageType(pipeline[i]!)\n if (laterStageType === '$sort') {\n return false\n }\n // If we hit a stage that depends on order, keep this sort\n if (['$limit', '$skip', '$first', '$last'].includes(laterStageType)) {\n return true\n }\n }\n }\n\n return true\n })\n}\n\n/**\n * Helper functions\n */\n\nfunction getStageType(stage: PipelineStage): string {\n return Object.keys(stage)[0]!\n}\n\nfunction extractFieldsFromCondition(condition: Record<string, unknown>): string[] {\n const fields: string[] = []\n\n for (const [key, value] of Object.entries(condition)) {\n if (key.startsWith('$')) {\n // Logical operator\n if (Array.isArray(value)) {\n for (const subCondition of value) {\n fields.push(...extractFieldsFromCondition(subCondition as Record<string, unknown>))\n }\n }\n } else {\n fields.push(key)\n }\n }\n\n return fields\n}\n\nfunction getAffectedFields(stage: PipelineStage): Set<string> {\n const stageType = getStageType(stage)\n const fields = new Set<string>()\n\n if (stageType === '$project') {\n const project = (stage as { $project: Record<string, unknown> }).$project\n for (const key of Object.keys(project)) {\n fields.add(key)\n }\n } else if (stageType === '$addFields') {\n const addFields = (stage as { $addFields: Record<string, unknown> }).$addFields\n for (const key of Object.keys(addFields)) {\n fields.add(key)\n }\n }\n\n return fields\n}\n\nfunction getUnwindField(stage: PipelineStage): string {\n const unwind = (stage as { $unwind: string | { path: string } }).$unwind\n if (typeof unwind === 'string') {\n return unwind.replace(/^\\$/, '')\n }\n return unwind.path.replace(/^\\$/, '')\n}\n\nfunction getLookupAsField(stage: PipelineStage): string {\n const lookup = (stage as { $lookup: { as: string } }).$lookup\n return lookup.as\n}\n\nfunction isExclusionProject(project: Record<string, unknown>): boolean {\n return Object.entries(project).every(([key, value]) => {\n if (key === '_id') return true\n return value === 0\n })\n}\n","/**\n * AggregationTranslator - Translates MongoDB aggregation pipelines to SQL\n * Uses CTE-based pipeline execution for complex pipelines\n * Supports multiple SQL dialects (SQLite, ClickHouse)\n */\n\nimport type { StageResult, StageContext, PipelineStage, AggregationResult, GroupStage, LookupStage, UnwindStage, BucketStage } from './stages/types'\nimport { translateMatchStage } from './stages/match-stage'\nimport { translateProjectStage } from './stages/project-stage'\nimport { translateGroupStage } from './stages/group-stage'\nimport { translateSortStage } from './stages/sort-stage'\nimport { translateLimitStage } from './stages/limit-stage'\nimport { translateSkipStage } from './stages/skip-stage'\nimport { translateCountStage } from './stages/count-stage'\nimport { translateLookupStage } from './stages/lookup-stage'\nimport { translateUnwindStage } from './stages/unwind-stage'\nimport { translateAddFieldsStage } from './stages/add-fields-stage'\nimport { translateBucketStage } from './stages/bucket-stage'\nimport { translateFacetStage, FacetTranslator } from './stages/facet-stage'\nimport { translateSearchStage, type SearchStageInput, type SearchStageContext } from './stages/search-stage'\nimport { optimizePipeline } from './stages/optimizer'\nimport { type SQLDialect, type DialectOptions, validateDialect } from './dialect'\n\nexport interface TranslatorOptions extends DialectOptions {\n /** Enable pipeline optimization (default: true) */\n optimize?: boolean\n}\n\nexport class AggregationTranslator implements FacetTranslator {\n private readonly options: TranslatorOptions\n private readonly dialect: SQLDialect\n\n constructor(private collection: string, options: TranslatorOptions = {}) {\n // Validate dialect before merging options\n const dialect = validateDialect(options.dialect)\n this.dialect = dialect\n this.options = {\n optimize: true,\n dialect,\n ...options\n }\n }\n\n /**\n * Translate a MongoDB aggregation pipeline to SQL\n */\n translate(pipeline: PipelineStage[]): AggregationResult {\n if (pipeline.length === 0) {\n throw new Error('Pipeline cannot be empty')\n }\n\n // Optionally optimize the pipeline\n const optimizedPipeline = this.options.optimize\n ? optimizePipeline(pipeline)\n : pipeline\n\n // Analyze pipeline to determine execution strategy\n const needsCte = this.needsCtePipeline(optimizedPipeline)\n\n if (needsCte) {\n return this.translateWithCte(optimizedPipeline)\n }\n\n return this.translateSimple(optimizedPipeline)\n }\n\n /**\n * Translate pipeline for use in facet (implements FacetTranslator)\n */\n translatePipeline(stages: PipelineStage[], collection: string): { sql: string; params: unknown[] } {\n const translator = new AggregationTranslator(collection)\n const result = translator.translate(stages)\n return { sql: result.sql, params: result.params }\n }\n\n /**\n * Determine if we need CTE-based execution\n */\n private needsCtePipeline(pipeline: PipelineStage[]): boolean {\n // Need CTEs for:\n // 1. Multiple stages that transform data shape\n // 2. $lookup, $unwind, $search stages\n // 3. $project followed by other stages\n let shapeTransformCount = 0\n\n for (const stage of pipeline) {\n const stageType = this.getStageType(stage)\n\n if (['$lookup', '$unwind', '$facet', '$search'].includes(stageType)) {\n return true\n }\n\n if (['$project', '$group', '$addFields'].includes(stageType)) {\n shapeTransformCount++\n }\n }\n\n return shapeTransformCount > 1\n }\n\n /**\n * Simple translation without CTEs\n */\n private translateSimple(pipeline: PipelineStage[]): AggregationResult {\n const params: unknown[] = []\n\n let selectClause = 'data'\n let whereClause: string | undefined\n let groupByClause: string | undefined\n let orderByClause: string | undefined\n let limitClause: string | undefined\n let offsetClause: string | undefined\n\n const context: StageContext = {\n collection: this.collection,\n cteIndex: 0,\n existingParams: params,\n dialect: this.dialect,\n dialectOptions: this.options\n }\n\n for (const stage of pipeline) {\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n if (result.selectClause) selectClause = result.selectClause\n if (result.whereClause) whereClause = result.whereClause\n if (result.groupByClause) groupByClause = result.groupByClause\n if (result.orderByClause) orderByClause = result.orderByClause\n if (result.limitClause) limitClause = result.limitClause\n if (result.offsetClause) offsetClause = result.offsetClause\n\n if (result.facets) {\n return {\n sql: '',\n params,\n facets: result.facets\n }\n }\n }\n\n // Build final SQL\n let sql = `SELECT ${selectClause} FROM ${this.collection}`\n\n if (whereClause) sql += ` WHERE ${whereClause}`\n if (groupByClause) sql += ` GROUP BY ${groupByClause}`\n if (orderByClause) sql += ` ORDER BY ${orderByClause}`\n if (limitClause) sql += ` ${limitClause}`\n if (offsetClause) sql += ` ${offsetClause}`\n\n return { sql, params }\n }\n\n /**\n * CTE-based translation for complex pipelines\n */\n private translateWithCte(pipeline: PipelineStage[]): AggregationResult {\n const params: unknown[] = []\n const ctes: string[] = []\n let cteIndex = 0\n let currentSource = this.collection\n\n // Accumulate simple clauses for current CTE\n let pendingClauses = {\n select: 'data',\n where: undefined as string | undefined,\n groupBy: undefined as string | undefined,\n orderBy: undefined as string | undefined,\n limit: undefined as string | undefined,\n offset: undefined as string | undefined\n }\n\n const flushPendingCte = () => {\n if (pendingClauses.select !== 'data' || pendingClauses.where || pendingClauses.groupBy) {\n const cteName = `stage_${cteIndex}`\n let cteSql = `SELECT ${pendingClauses.select} FROM ${currentSource}`\n\n if (pendingClauses.where) cteSql += ` WHERE ${pendingClauses.where}`\n if (pendingClauses.groupBy) cteSql += ` GROUP BY ${pendingClauses.groupBy}`\n if (pendingClauses.orderBy) cteSql += ` ORDER BY ${pendingClauses.orderBy}`\n if (pendingClauses.limit) cteSql += ` ${pendingClauses.limit}`\n if (pendingClauses.offset) cteSql += ` ${pendingClauses.offset}`\n\n ctes.push(`${cteName} AS (${cteSql})`)\n currentSource = cteName\n cteIndex++\n\n // Reset pending clauses\n pendingClauses = {\n select: 'data',\n where: undefined,\n groupBy: undefined,\n orderBy: undefined,\n limit: undefined,\n offset: undefined\n }\n }\n }\n\n const context: StageContext = {\n collection: this.collection,\n cteIndex,\n existingParams: params,\n dialect: this.dialect,\n dialectOptions: this.options,\n get previousCte() {\n return currentSource\n }\n }\n\n for (const stage of pipeline) {\n const stageType = this.getStageType(stage)\n\n // Stages that require their own CTE\n if (['$lookup', '$unwind'].includes(stageType)) {\n flushPendingCte()\n\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n if (result.cteExpression) {\n const cteName = result.cteName || `stage_${cteIndex}`\n ctes.push(`${cteName} AS (${result.cteExpression})`)\n currentSource = cteName\n cteIndex++\n }\n } else if (stageType === '$search') {\n // $search stage requires FTS join - must be first stage\n flushPendingCte()\n\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context) as StageResult & { ftsJoin?: string; ftsTable?: string; ftsMatch?: string }\n params.push(...result.params)\n\n // Build CTE with FTS join\n const ftsTable = result.ftsTable || `${this.collection}_fts`\n const selectClause = result.selectClause || 'documents.*'\n const cteSql = `SELECT ${selectClause} FROM documents JOIN ${ftsTable} ON documents.id = ${ftsTable}.rowid WHERE ${result.whereClause}`\n\n const cteName = `stage_${cteIndex}`\n ctes.push(`${cteName} AS (${cteSql})`)\n currentSource = cteName\n cteIndex++\n } else if (stageType === '$facet') {\n flushPendingCte()\n\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n if (result.facets) {\n // Build CTE for facets\n const sql = ctes.length > 0 ? `WITH ${ctes.join(', ')}\\n` : ''\n return {\n sql,\n params,\n facets: result.facets\n }\n }\n } else {\n // Simple stages that can accumulate\n context.cteIndex = cteIndex\n const result = this.translateStage(stage, context)\n params.push(...result.params)\n\n // If this stage transforms shape and we already have transforms, flush first\n if (result.transformsShape && (pendingClauses.select !== 'data' || pendingClauses.groupBy)) {\n flushPendingCte()\n context.cteIndex = cteIndex\n }\n\n if (result.selectClause) pendingClauses.select = result.selectClause\n if (result.whereClause) pendingClauses.where = result.whereClause\n if (result.groupByClause) pendingClauses.groupBy = result.groupByClause\n if (result.orderByClause) pendingClauses.orderBy = result.orderByClause\n if (result.limitClause) pendingClauses.limit = result.limitClause\n if (result.offsetClause) pendingClauses.offset = result.offsetClause\n }\n }\n\n // Build final query from pending clauses\n let finalSql = `SELECT ${pendingClauses.select} FROM ${currentSource}`\n\n if (pendingClauses.where) finalSql += ` WHERE ${pendingClauses.where}`\n if (pendingClauses.groupBy) finalSql += ` GROUP BY ${pendingClauses.groupBy}`\n if (pendingClauses.orderBy) finalSql += ` ORDER BY ${pendingClauses.orderBy}`\n if (pendingClauses.limit) finalSql += ` ${pendingClauses.limit}`\n if (pendingClauses.offset) finalSql += ` ${pendingClauses.offset}`\n\n // Combine CTEs with final query\n const sql = ctes.length > 0\n ? `WITH ${ctes.join(', ')} ${finalSql}`\n : finalSql\n\n return { sql, params }\n }\n\n /**\n * Get the stage type from a stage object\n */\n private getStageType(stage: PipelineStage): string {\n return Object.keys(stage)[0]!\n }\n\n /**\n * Translate a single pipeline stage\n */\n private translateStage(stage: PipelineStage, context: StageContext): StageResult {\n const stageType = this.getStageType(stage)\n const stageValue = (stage as Record<string, unknown>)[stageType]\n\n switch (stageType) {\n case '$match':\n return translateMatchStage(stageValue as Record<string, unknown>, context)\n\n case '$project':\n return translateProjectStage(stageValue as Record<string, unknown>, context)\n\n case '$group':\n return translateGroupStage(stageValue as GroupStage, context)\n\n case '$sort':\n return translateSortStage(stageValue as Record<string, 1 | -1>, context)\n\n case '$limit':\n return translateLimitStage(stageValue as number, context)\n\n case '$skip':\n return translateSkipStage(stageValue as number, context)\n\n case '$count':\n return translateCountStage(stageValue as string, context)\n\n case '$lookup':\n return translateLookupStage(stageValue as LookupStage, context)\n\n case '$unwind':\n return translateUnwindStage(stageValue as string | UnwindStage, context)\n\n case '$addFields':\n case '$set': // $set is an alias for $addFields\n return translateAddFieldsStage(stageValue as Record<string, unknown>, context)\n\n case '$bucket':\n return translateBucketStage(stageValue as BucketStage, context)\n\n case '$facet':\n return translateFacetStage(\n stageValue as Record<string, PipelineStage[]>,\n context,\n this\n )\n\n case '$search':\n return translateSearchStage(\n stageValue as SearchStageInput,\n context as SearchStageContext\n )\n\n default:\n throw new Error(`Unknown aggregation stage: ${stageType}`)\n }\n }\n}\n\n// Export types\nexport type { AggregationResult, PipelineStage }\n","/**\n * AggregationExecutor - Handles async execution of aggregation pipelines\n *\n * This class manages the execution of MongoDB aggregation pipelines that may\n * contain $function operators. It:\n * 1. Translates the pipeline to SQL using AggregationTranslator\n * 2. Executes the SQL query\n * 3. Detects function placeholders in the results\n * 4. Executes user functions via FunctionExecutor\n * 5. Merges function results back into documents\n */\n\nimport { FunctionExecutor } from './function-executor'\nimport { AggregationTranslator } from '../translator/aggregation-translator'\nimport type { WorkerLoader } from '../types/function'\nimport type { PipelineStage } from '../translator/aggregation-translator'\n\n/**\n * Environment bindings for the aggregation executor\n */\ninterface AggregationExecutorEnv {\n LOADER?: WorkerLoader\n}\n\n/**\n * SQL interface for executing queries\n */\ninterface SqlInterface {\n exec: (query: string, ...params: unknown[]) => { results: unknown[]; toArray?: () => unknown[] }\n}\n\n/**\n * Parsed function specification from placeholder\n */\ninterface ParsedFunctionSpec {\n __type: 'function'\n body: string\n argPaths: string[]\n literalArgs: Record<number, unknown>\n argOrder: Array<{ type: 'field'; path: string } | { type: 'literal'; index: number }>\n}\n\n/**\n * Batch execution item for grouping functions\n */\ninterface BatchItem {\n docIndex: number\n fieldPath: string[]\n fnSpec: ParsedFunctionSpec\n args: unknown[]\n}\n\n/**\n * AggregationExecutor handles the execution of aggregation pipelines\n * with support for $function operators that require async execution\n */\nexport class AggregationExecutor {\n private functionExecutor: FunctionExecutor | null\n\n constructor(\n private sql: SqlInterface,\n env: AggregationExecutorEnv\n ) {\n this.functionExecutor = env.LOADER ? new FunctionExecutor(env) : null\n }\n\n /**\n * Execute an aggregation pipeline\n */\n async execute(collection: string, pipeline: PipelineStage[]): Promise<unknown[]> {\n const translator = new AggregationTranslator(collection)\n const { sql, params, facets } = translator.translate(pipeline)\n\n // Handle facets separately\n if (facets) {\n return this.executeFacets(facets)\n }\n\n // Execute SQL query\n const rawResults = this.sql.exec(sql, ...params)\n const results = rawResults.toArray ? rawResults.toArray() : rawResults.results\n\n // Parse results\n const documents = results.map(row => {\n const data = (row as { data: string }).data\n return JSON.parse(data) as Record<string, unknown>\n })\n\n // Check if any results contain function placeholders\n const hasFunctions = documents.some(doc => this.documentHasFunctions(doc))\n\n if (!hasFunctions) {\n return documents\n }\n\n // Process function placeholders, passing pipeline for post-sort if needed\n return this.executeWithFunctions(documents, pipeline)\n }\n\n /**\n * Check if a document contains any function placeholders\n * The marker may be wrapped in quotes from SQL string output\n */\n private documentHasFunctions(doc: Record<string, unknown>): boolean {\n for (const value of Object.values(doc)) {\n if (typeof value === 'string' && value.includes('__FUNCTION__')) {\n return true\n }\n if (typeof value === 'object' && value !== null) {\n if (this.documentHasFunctions(value as Record<string, unknown>)) {\n return true\n }\n }\n }\n return false\n }\n\n /**\n * Execute pipeline with function placeholders\n */\n private async executeWithFunctions(\n documents: Record<string, unknown>[],\n pipeline: PipelineStage[] = []\n ): Promise<unknown[]> {\n // Collect all function invocations for batch processing\n const batchItems: BatchItem[] = []\n\n for (let docIndex = 0; docIndex < documents.length; docIndex++) {\n const doc = documents[docIndex]\n if (doc) {\n this.collectFunctionInvocations(doc, doc, [], docIndex, batchItems)\n }\n }\n\n // Group by function body for batch execution\n const functionGroups = this.groupByFunction(batchItems)\n\n // Execute each function group\n for (const [body, items] of functionGroups.entries()) {\n const argsArray = items.map(item => item.args)\n\n try {\n let results: unknown[]\n\n if (this.functionExecutor) {\n // Use secure sandboxed execution via worker-loader\n results = await this.functionExecutor.executeBatch(body, argsArray)\n } else {\n // Fallback: direct evaluation (for development/testing without worker_loaders)\n // WARNING: This is NOT sandboxed and should only be used in trusted environments\n results = this.executeDirectBatch(body, argsArray)\n }\n\n // Apply results back to documents\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item) {\n const result = results[i]\n const doc = documents[item.docIndex]\n if (doc) {\n this.setFieldValue(doc, item.fieldPath, result)\n }\n }\n }\n } catch (error) {\n // Re-throw with context\n throw error\n }\n }\n\n // Re-apply $sort stages after function execution\n // This is needed because SQL sorting happened on placeholder strings, not computed values\n // Use the last $sort stage since that represents the final ordering intent\n const sortStages = pipeline.filter(stage => '$sort' in stage);\n const lastSortStage = sortStages[sortStages.length - 1] as { $sort: Record<string, number> } | undefined;\n if (lastSortStage) {\n documents.sort((a, b) => {\n for (const [field, direction] of Object.entries(lastSortStage.$sort)) {\n const aVal = this.extractFieldValue(a, `$.${field}`)\n const bVal = this.extractFieldValue(b, `$.${field}`)\n\n // Handle different types\n if (aVal === bVal) continue\n if (aVal === null || aVal === undefined) return direction\n if (bVal === null || bVal === undefined) return -direction\n\n // Compare values\n const comparison = aVal < bVal ? -1 : 1\n return comparison * direction\n }\n return 0\n })\n }\n\n return documents\n }\n\n /**\n * SECURITY: Direct function execution has been disabled to prevent arbitrary code execution.\n *\n * The $function operator requires the LOADER binding for secure sandboxed execution\n * via Cloudflare worker-loader. Without this binding, $function operators cannot be used.\n *\n * This method is kept as a private placeholder that throws an error to prevent\n * any bypass attempts.\n *\n * @throws Error - Always throws to prevent unsafe code execution\n */\n private executeDirectBatch(_body: string, _argsArray: unknown[][]): never {\n // SECURITY: new Function() has been removed to prevent arbitrary code execution\n // The $function operator requires the LOADER binding for secure sandboxed execution\n throw new Error(\n 'SECURITY: $function operator requires the LOADER binding for secure sandboxed execution. ' +\n 'Direct function execution is disabled to prevent arbitrary code execution. ' +\n 'Please configure the worker_loaders binding in your wrangler.toml to enable $function support.'\n )\n }\n\n /**\n * Collect all function invocations from a document\n */\n private collectFunctionInvocations(\n root: Record<string, unknown>,\n current: Record<string, unknown>,\n path: string[],\n docIndex: number,\n items: BatchItem[]\n ): void {\n for (const [key, value] of Object.entries(current)) {\n const fieldPath = [...path, key]\n\n if (typeof value === 'string' && value.includes('__FUNCTION__')) {\n const fnSpec = this.parseFunctionMarker(value)\n if (fnSpec) {\n const args = this.extractArgs(root, fnSpec)\n items.push({ docIndex, fieldPath, fnSpec, args })\n }\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n this.collectFunctionInvocations(root, value as Record<string, unknown>, fieldPath, docIndex, items)\n }\n }\n }\n\n /**\n * Parse a function marker from a string value\n * Handles both direct markers and SQL string output with quotes\n */\n private parseFunctionMarker(value: string): ParsedFunctionSpec | null {\n // Try to find the __FUNCTION__ marker in the string\n // Match __FUNCTION__ followed by a JSON object\n const match = value.match(/__FUNCTION__({.+})$/) || value.match(/__FUNCTION__({.+})'?$/)\n if (match && match[1]) {\n try {\n return JSON.parse(match[1])\n } catch {\n // Try unescaping single quotes (from SQL string escaping)\n try {\n const unescaped = match[1].replace(/''/g, \"'\")\n return JSON.parse(unescaped)\n } catch {\n return null\n }\n }\n }\n return null\n }\n\n /**\n * Group batch items by function body\n */\n private groupByFunction(items: BatchItem[]): Map<string, BatchItem[]> {\n const groups = new Map<string, BatchItem[]>()\n\n for (const item of items) {\n const body = item.fnSpec.body\n if (!groups.has(body)) {\n groups.set(body, [])\n }\n groups.get(body)!.push(item)\n }\n\n return groups\n }\n\n /**\n * Extract arguments for a function from document data\n */\n private extractArgs(doc: Record<string, unknown>, fnSpec: ParsedFunctionSpec): unknown[] {\n return fnSpec.argOrder.map(arg => {\n if (arg.type === 'literal') {\n const index = (arg as { type: 'literal'; index: number }).index\n return fnSpec.literalArgs[index]\n }\n // Extract field value using path\n const path = (arg as { type: 'field'; path: string }).path\n return this.extractFieldValue(doc, path)\n })\n }\n\n /**\n * Extract a field value from a document using JSON path\n */\n private extractFieldValue(doc: Record<string, unknown>, path: string): unknown {\n // path is like \"$.field\" or \"$.nested.field\"\n const parts = path.replace(/^\\$\\./, '').split('.')\n let value: unknown = doc\n\n for (const part of parts) {\n if (value === null || value === undefined) {\n return undefined\n }\n value = (value as Record<string, unknown>)[part]\n }\n\n return value\n }\n\n /**\n * Set a field value in a document using field path\n */\n private setFieldValue(doc: Record<string, unknown>, path: string[], value: unknown): void {\n let current: Record<string, unknown> = doc\n\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]\n if (key !== undefined) {\n current = current[key] as Record<string, unknown>\n }\n }\n\n const lastKey = path[path.length - 1]\n if (lastKey !== undefined) {\n current[lastKey] = value\n }\n }\n\n /**\n * Execute facet pipelines\n */\n private async executeFacets(\n facets: Record<string, { sql: string; params: unknown[] }>\n ): Promise<unknown[]> {\n const result: Record<string, unknown[]> = {}\n\n for (const [name, facet] of Object.entries(facets)) {\n const rawResults = this.sql.exec(facet.sql, ...facet.params)\n const results = rawResults.toArray ? rawResults.toArray() : rawResults.results\n\n result[name] = results.map(row => {\n const data = (row as { data: string }).data\n return JSON.parse(data)\n })\n }\n\n return [result]\n }\n\n}\n","/**\n * MCP Server Factory for mongo.do\n *\n * Creates MCP server instances that provide:\n * - search: Query documents (readonly)\n * - fetch: Retrieve full documents by ID (readonly)\n * - do: Execute secure arbitrary code via Worker Loader sandbox (when loader available)\n */\n\nimport type {\n McpToolDefinition,\n McpToolHandler,\n McpToolResponse,\n McpRegisteredTool,\n McpRequest,\n McpResponse,\n McpInitializeRequest,\n McpToolsCallRequest,\n} from './types'\n\n// Re-export DatabaseAccess from types for convenience\nexport type { DatabaseAccess } from './types'\n\n/**\n * Code loader interface for executing JavaScript code in a sandbox\n */\nexport interface CodeLoader {\n execute(code: string, context?: Record<string, unknown>): Promise<{ success: boolean; result?: unknown; error?: string }>\n}\n\n/**\n * Configuration for creating an MCP server\n */\nexport interface McpServerConfig {\n /** Database access interface for tool implementations */\n dbAccess: DatabaseAccess\n /** Optional code loader for secure code execution (enables 'do' tool) */\n codeLoader?: CodeLoader\n /** Server name (default: 'mongo.do') */\n name?: string\n /** Server version (default: '1.0.0') */\n version?: string\n}\n\n/**\n * MCP Server instance\n */\nexport interface McpServer {\n /** Server name */\n readonly name: string\n /** Server version */\n readonly version: string\n\n /**\n * Register a tool with the server\n */\n tool<T extends Record<string, unknown>>(\n name: string,\n inputSchema: McpToolDefinition['inputSchema'],\n handler: McpToolHandler<T>,\n annotations?: McpToolDefinition['annotations']\n ): void\n\n /**\n * Register a tool with definition and handler\n */\n registerTool(tool: McpRegisteredTool): void\n\n /**\n * List all registered tools\n */\n listTools(): Promise<McpToolDefinition[]>\n\n /**\n * Call a tool by name\n */\n callTool(name: string, args: Record<string, unknown>): Promise<McpToolResponse>\n\n /**\n * Handle an incoming MCP request (JSON-RPC)\n */\n handleRequest(request: McpRequest): Promise<McpResponse>\n}\n\n// Import DatabaseAccess type for the config\nimport type { DatabaseAccess } from './types'\n\n/**\n * Create an MCP server instance for mongo.do\n *\n * @param config - Server configuration including database access and optional code loader\n * @returns Configured MCP server instance\n */\nexport function createMcpServer(config: McpServerConfig): McpServer {\n const { dbAccess, codeLoader, name, version } = config\n const serverName = name ?? 'mongo.do'\n const serverVersion = version ?? '1.0.0'\n const tools = new Map<string, McpRegisteredTool>()\n\n // Create the server instance\n const server: McpServer = {\n name: serverName,\n version: serverVersion,\n\n tool<T extends Record<string, unknown>>(\n name: string,\n inputSchema: McpToolDefinition['inputSchema'],\n handler: McpToolHandler<T>,\n annotations?: McpToolDefinition['annotations']\n ): void {\n const definition: McpToolDefinition = {\n name,\n description: annotations?.title ?? name,\n inputSchema,\n ...(annotations && { annotations }),\n }\n tools.set(name, {\n definition,\n handler: handler as McpToolHandler,\n })\n },\n\n registerTool(tool: McpRegisteredTool): void {\n tools.set(tool.definition.name, tool)\n },\n\n async listTools(): Promise<McpToolDefinition[]> {\n return Array.from(tools.values()).map(t => t.definition)\n },\n\n async callTool(name: string, args: Record<string, unknown>): Promise<McpToolResponse> {\n const tool = tools.get(name)\n if (!tool) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: `Tool '${name}' not found` }) }],\n isError: true,\n }\n }\n try {\n return await tool.handler(args)\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : 'Unknown error',\n }),\n },\n ],\n isError: true,\n }\n }\n },\n\n async handleRequest(request: McpRequest): Promise<McpResponse> {\n const baseResponse = {\n jsonrpc: '2.0' as const,\n id: request.id,\n }\n\n // Validate JSON-RPC version\n if (request.jsonrpc !== '2.0') {\n return {\n ...baseResponse,\n error: {\n code: -32600,\n message: 'Invalid JSON-RPC version',\n },\n }\n }\n\n switch (request.method) {\n case 'initialize': {\n const initReq = request as McpInitializeRequest\n return {\n ...baseResponse,\n result: {\n protocolVersion: initReq.params?.protocolVersion ?? '2024-11-05',\n capabilities: {\n tools: {},\n },\n serverInfo: {\n name: serverName,\n version: serverVersion,\n },\n },\n }\n }\n\n case 'tools/list': {\n const toolsList = await server.listTools()\n return {\n ...baseResponse,\n result: {\n tools: toolsList,\n },\n }\n }\n\n case 'tools/call': {\n const callReq = request as McpToolsCallRequest\n const result = await server.callTool(callReq.params.name, callReq.params.arguments ?? {})\n return {\n ...baseResponse,\n result,\n }\n }\n\n default:\n return {\n ...baseResponse,\n error: {\n code: -32601,\n message: `Method not found: ${request.method}`,\n },\n }\n }\n },\n }\n\n // Register the search tool (always available, readonly)\n server.tool<{ query: string; database?: string; collection?: string; limit?: number }>(\n 'search',\n {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query string',\n },\n database: {\n type: 'string',\n description: 'Database to search in',\n },\n collection: {\n type: 'string',\n description: 'Collection to search in',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results (default: 10)',\n },\n },\n required: ['query'],\n },\n async (args) => {\n // Validate required field\n if (!args.query) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: 'Missing required field: query' }) }],\n isError: true,\n }\n }\n // Placeholder implementation - will be expanded in search tool issue\n void args.database\n void args.collection\n void args.limit\n void dbAccess\n return {\n content: [{ type: 'text', text: '{\"results\":[]}' }],\n }\n },\n {\n title: 'Search Documents',\n readOnlyHint: true,\n openWorldHint: true,\n }\n )\n\n // Register the fetch tool (always available, readonly)\n server.tool<{ id: string }>(\n 'fetch',\n {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Document ID in format db.collection.ObjectId',\n },\n },\n required: ['id'],\n },\n async ({ id }) => {\n // Placeholder implementation - will be expanded in fetch tool issue\n void id\n void dbAccess\n return {\n content: [{ type: 'text', text: '{}' }],\n }\n },\n {\n title: 'Fetch Document',\n readOnlyHint: true,\n openWorldHint: true,\n }\n )\n\n // Register the do tool only if codeLoader is available\n if (codeLoader) {\n server.tool<{ code: string; description?: string }>(\n 'do',\n {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JavaScript code to execute',\n },\n description: {\n type: 'string',\n description: 'What the code does',\n },\n },\n required: ['code'],\n },\n async ({ code, description }) => {\n // Execute code using the code loader\n void description\n void dbAccess\n try {\n const result = await codeLoader.execute(code)\n return {\n content: [{ type: 'text', text: JSON.stringify(result) }],\n isError: !result.success,\n }\n } catch (error) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: false, error: error instanceof Error ? error.message : 'Unknown error' }) }],\n isError: true,\n }\n }\n },\n {\n title: 'Execute Code',\n readOnlyHint: false,\n destructiveHint: true,\n }\n )\n }\n\n return server\n}\n\n/**\n * Create a mock DatabaseAccess for testing\n */\nexport function createMockDatabaseAccess(): DatabaseAccess {\n return {\n async findOne() {\n return null\n },\n async find() {\n return []\n },\n async insertOne() {\n return { insertedId: 'mock-id' }\n },\n async insertMany() {\n return { insertedIds: [] }\n },\n async updateOne() {\n return { matchedCount: 0, modifiedCount: 0 }\n },\n async updateMany() {\n return { matchedCount: 0, modifiedCount: 0 }\n },\n async deleteOne() {\n return { deletedCount: 0 }\n },\n async deleteMany() {\n return { deletedCount: 0 }\n },\n async aggregate() {\n return []\n },\n async countDocuments() {\n return 0\n },\n async listCollections() {\n return []\n },\n async listDatabases() {\n return []\n },\n getProxy() {\n return this\n },\n }\n}\n","/**\n * HTTP Transport for MCP Server\n *\n * Provides HTTP/SSE transport for MCP protocol:\n * - POST for JSON-RPC requests\n * - GET for SSE streams\n * - OPTIONS for CORS preflight\n * - Session management via mcp-session-id header\n * - Request logging callback\n * - Authentication hook\n * - Rate limiting\n */\n\nimport type { McpServer } from '../server'\nimport type { McpRequest, McpResponse } from '../types'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * CORS configuration options\n */\nexport interface CorsOptions {\n /** Allowed origins (default: '*') */\n origin?: string | string[]\n /** Allowed methods (default: 'GET, POST, OPTIONS') */\n methods?: string\n /** Allowed headers (default: 'Content-Type, mcp-session-id') */\n allowedHeaders?: string\n /** Exposed headers (default: 'mcp-session-id') */\n exposedHeaders?: string\n /** Max age for preflight cache in seconds (default: 86400) */\n maxAge?: number\n /** Allow credentials (default: false) */\n credentials?: boolean\n}\n\n/**\n * Request log entry for logging callback\n */\nexport interface RequestLogEntry {\n /** Timestamp of the request */\n timestamp: Date\n /** HTTP method */\n method: string\n /** Request URL */\n url: string\n /** Session ID if available */\n sessionId?: string\n /** Response status code */\n statusCode: number\n /** Duration in milliseconds */\n durationMs: number\n /** JSON-RPC method if applicable */\n rpcMethod?: string\n /** Error message if request failed */\n error?: string\n}\n\n/**\n * Request logging callback function\n */\nexport type RequestLogCallback = (entry: RequestLogEntry) => void\n\n/**\n * Authentication result\n */\nexport interface AuthResult {\n /** Whether authentication succeeded */\n authenticated: boolean\n /** Error message if authentication failed */\n error?: string\n /** Optional user/client identifier */\n identity?: string\n}\n\n/**\n * Authentication hook function\n */\nexport type AuthHook = (request: Request) => Promise<AuthResult> | AuthResult\n\n/**\n * Rate limit result\n */\nexport interface RateLimitResult {\n /** Whether the request is allowed */\n allowed: boolean\n /** Retry-After header value in seconds (if rate limited) */\n retryAfter?: number\n /** Remaining requests in current window */\n remaining?: number\n /** Total limit for the window */\n limit?: number\n /** When the rate limit window resets (Unix timestamp) */\n resetAt?: number\n}\n\n/**\n * Rate limiting options\n */\nexport interface RateLimitOptions {\n /** Maximum requests per window */\n maxRequests: number\n /** Window size in milliseconds */\n windowMs: number\n /** Key extractor function (default: IP-based or session-based) */\n keyExtractor?: (request: Request, sessionId?: string) => string\n /** Custom rate limit check function (overrides built-in limiter) */\n customLimiter?: (key: string, request: Request) => Promise<RateLimitResult> | RateLimitResult\n}\n\n/**\n * HTTP transport options\n */\nexport interface HttpTransportOptions {\n /** CORS configuration */\n cors?: CorsOptions\n /** Request logging callback */\n onRequest?: RequestLogCallback\n /** Authentication hook */\n authenticate?: AuthHook\n /** Rate limiting configuration */\n rateLimit?: RateLimitOptions\n}\n\n/**\n * HTTP handler function type\n */\nexport type HttpHandler = (request: Request) => Promise<Response>\n\n/**\n * SSE session for managing server-sent events\n */\ninterface SseSession {\n controller: ReadableStreamDefaultController<Uint8Array>\n encoder: TextEncoder\n lastEventId: number\n}\n\n/**\n * Session storage for managing MCP sessions\n */\ninterface SessionStore {\n /** SSE sessions for real-time streaming */\n sseClients: Map<string, SseSession>\n /** Last activity timestamp for session cleanup */\n lastActivity: Map<string, number>\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst SESSION_HEADER = 'mcp-session-id'\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000 // 30 minutes\n\nconst DEFAULT_CORS: Required<CorsOptions> = {\n origin: '*',\n methods: 'GET, POST, OPTIONS, DELETE',\n allowedHeaders: 'Content-Type, mcp-session-id, Last-Event-ID, Authorization',\n exposedHeaders: 'mcp-session-id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset',\n maxAge: 86400,\n credentials: false,\n}\n\n/**\n * Rate limit entry for tracking request counts\n */\ninterface RateLimitEntry {\n count: number\n resetAt: number\n}\n\n/**\n * Rate limiter storage\n */\ninterface RateLimiterStore {\n entries: Map<string, RateLimitEntry>\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Generate a unique session ID\n */\nfunction generateSessionId(): string {\n const array = new Uint8Array(16)\n crypto.getRandomValues(array)\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Build CORS headers based on options and request\n */\nfunction buildCorsHeaders(options: Required<CorsOptions>, request: Request | null): Record<string, string> {\n const headers: Record<string, string> = {}\n const requestOrigin = request?.headers.get('Origin') ?? null\n\n // Handle origin\n if (options.origin === '*') {\n headers['Access-Control-Allow-Origin'] = '*'\n } else if (Array.isArray(options.origin)) {\n if (requestOrigin && options.origin.includes(requestOrigin)) {\n headers['Access-Control-Allow-Origin'] = requestOrigin\n headers['Vary'] = 'Origin'\n }\n } else if (requestOrigin === options.origin) {\n headers['Access-Control-Allow-Origin'] = options.origin\n }\n\n headers['Access-Control-Allow-Methods'] = options.methods\n headers['Access-Control-Allow-Headers'] = options.allowedHeaders\n headers['Access-Control-Expose-Headers'] = options.exposedHeaders\n headers['Access-Control-Max-Age'] = String(options.maxAge)\n\n if (options.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true'\n }\n\n return headers\n}\n\n/**\n * Create a JSON response with CORS headers\n */\nfunction jsonResponse(\n data: unknown,\n status: number,\n corsHeaders: Record<string, string>,\n sessionId?: string\n): Response {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n }\n if (sessionId) {\n headers[SESSION_HEADER] = sessionId\n }\n return new Response(JSON.stringify(data), { status, headers })\n}\n\n/**\n * Create an error response\n */\nfunction errorResponse(\n code: number,\n message: string,\n httpStatus: number,\n corsHeaders: Record<string, string>,\n id?: string | number | null\n): Response {\n const response: McpResponse = {\n jsonrpc: '2.0',\n id: id ?? null as unknown as string,\n error: { code, message },\n }\n return jsonResponse(response, httpStatus, corsHeaders)\n}\n\n/**\n * Default key extractor for rate limiting (uses session ID or falls back to IP-like identifier)\n */\nfunction defaultKeyExtractor(request: Request, sessionId?: string): string {\n if (sessionId) {\n return `session:${sessionId}`\n }\n // Try to get client IP from common headers\n const forwarded = request.headers.get('X-Forwarded-For')\n if (forwarded) {\n return `ip:${forwarded.split(',')[0].trim()}`\n }\n const realIp = request.headers.get('X-Real-IP')\n if (realIp) {\n return `ip:${realIp}`\n }\n // Fallback to a generic key\n return 'unknown'\n}\n\n/**\n * Check rate limit for a request\n */\nfunction checkRateLimit(\n key: string,\n options: RateLimitOptions,\n store: RateLimiterStore\n): RateLimitResult {\n const now = Date.now()\n const entry = store.entries.get(key)\n\n // Clean up expired entry\n if (entry && entry.resetAt <= now) {\n store.entries.delete(key)\n }\n\n const currentEntry = store.entries.get(key)\n\n if (!currentEntry) {\n // First request in window\n const resetAt = now + options.windowMs\n store.entries.set(key, { count: 1, resetAt })\n return {\n allowed: true,\n remaining: options.maxRequests - 1,\n limit: options.maxRequests,\n resetAt,\n }\n }\n\n if (currentEntry.count >= options.maxRequests) {\n // Rate limited\n const retryAfter = Math.ceil((currentEntry.resetAt - now) / 1000)\n return {\n allowed: false,\n retryAfter,\n remaining: 0,\n limit: options.maxRequests,\n resetAt: currentEntry.resetAt,\n }\n }\n\n // Increment count\n currentEntry.count++\n return {\n allowed: true,\n remaining: options.maxRequests - currentEntry.count,\n limit: options.maxRequests,\n resetAt: currentEntry.resetAt,\n }\n}\n\n/**\n * Add rate limit headers to response\n */\nfunction addRateLimitHeaders(headers: Record<string, string>, result: RateLimitResult): void {\n if (result.limit !== undefined) {\n headers['X-RateLimit-Limit'] = String(result.limit)\n }\n if (result.remaining !== undefined) {\n headers['X-RateLimit-Remaining'] = String(result.remaining)\n }\n if (result.resetAt !== undefined) {\n headers['X-RateLimit-Reset'] = String(Math.ceil(result.resetAt / 1000))\n }\n if (result.retryAfter !== undefined) {\n headers['Retry-After'] = String(result.retryAfter)\n }\n}\n\n/**\n * Create a rate limited error response\n */\nfunction rateLimitedResponse(\n corsHeaders: Record<string, string>,\n rateLimitResult: RateLimitResult\n): Response {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n }\n addRateLimitHeaders(headers, rateLimitResult)\n\n const response: McpResponse = {\n jsonrpc: '2.0',\n id: null as unknown as string,\n error: { code: -32000, message: 'Too many requests. Please retry later.' },\n }\n\n return new Response(JSON.stringify(response), { status: 429, headers })\n}\n\n/**\n * Create an authentication error response\n */\nfunction authErrorResponse(\n message: string,\n corsHeaders: Record<string, string>\n): Response {\n const response: McpResponse = {\n jsonrpc: '2.0',\n id: null as unknown as string,\n error: { code: -32001, message: `Authentication failed: ${message}` },\n }\n return new Response(JSON.stringify(response), {\n status: 401,\n headers: {\n 'Content-Type': 'application/json',\n 'WWW-Authenticate': 'Bearer',\n ...corsHeaders,\n },\n })\n}\n\n// =============================================================================\n// Main Factory Function\n// =============================================================================\n\n/**\n * Create an HTTP handler for MCP server\n *\n * @param server - MCP server instance\n * @param corsOptions - Optional CORS configuration (deprecated, use options.cors instead)\n * @returns HTTP handler function\n *\n * @example\n * ```typescript\n * const server = createMcpServer({ dbAccess })\n * const handler = createHttpMcpHandler(server)\n *\n * // In Cloudflare Worker\n * export default {\n * fetch: handler\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With full options\n * const handler = createHttpMcpHandler(server, {\n * cors: { origin: 'https://example.com' },\n * onRequest: (entry) => console.log(`${entry.method} ${entry.url} - ${entry.statusCode}`),\n * authenticate: async (req) => {\n * const token = req.headers.get('Authorization')?.replace('Bearer ', '')\n * if (!token) return { authenticated: false, error: 'Missing token' }\n * return { authenticated: true, identity: 'user-123' }\n * },\n * rateLimit: { maxRequests: 100, windowMs: 60000 }\n * })\n * ```\n */\n/**\n * Check if the options object is HttpTransportOptions\n */\nfunction isHttpTransportOptions(obj: unknown): obj is HttpTransportOptions {\n if (!obj || typeof obj !== 'object') return false\n const o = obj as Record<string, unknown>\n return 'cors' in o || 'onRequest' in o || 'authenticate' in o || 'rateLimit' in o\n}\n\nexport function createHttpMcpHandler(\n server: McpServer,\n corsOptionsOrOptions?: CorsOptions | HttpTransportOptions\n): HttpHandler {\n // Support both old CorsOptions and new HttpTransportOptions for backwards compatibility\n const options: HttpTransportOptions = isHttpTransportOptions(corsOptionsOrOptions)\n ? corsOptionsOrOptions\n : (corsOptionsOrOptions ? { cors: corsOptionsOrOptions } : {})\n\n const cors: Required<CorsOptions> = { ...DEFAULT_CORS, ...options.cors }\n const sessions: SessionStore = {\n sseClients: new Map(),\n lastActivity: new Map(),\n }\n const rateLimiter: RateLimiterStore = {\n entries: new Map(),\n }\n\n // Cleanup old sessions and rate limit entries periodically\n const cleanupSessions = () => {\n const now = Date.now()\n Array.from(sessions.lastActivity.entries()).forEach(([sessionId, lastActive]) => {\n if (now - lastActive > SESSION_TIMEOUT_MS) {\n const sseSession = sessions.sseClients.get(sessionId)\n if (sseSession) {\n try {\n sseSession.controller.close()\n } catch {\n // Controller may already be closed\n }\n }\n sessions.sseClients.delete(sessionId)\n sessions.lastActivity.delete(sessionId)\n }\n })\n // Clean up expired rate limit entries\n Array.from(rateLimiter.entries.entries()).forEach(([key, entry]) => {\n if (entry.resetAt <= now) {\n rateLimiter.entries.delete(key)\n }\n })\n }\n\n return async (request: Request): Promise<Response> => {\n const startTime = Date.now()\n const corsHeaders = buildCorsHeaders(cors, request)\n const method = request.method.toUpperCase()\n let sessionId: string | undefined\n let rpcMethod: string | undefined\n let errorMessage: string | undefined\n\n // Helper to log request\n const logRequest = (response: Response): Response => {\n if (options.onRequest) {\n const logEntry: RequestLogEntry = {\n timestamp: new Date(startTime),\n method,\n url: request.url,\n statusCode: response.status,\n durationMs: Date.now() - startTime,\n }\n if (sessionId) {\n logEntry.sessionId = sessionId\n }\n if (rpcMethod) {\n logEntry.rpcMethod = rpcMethod\n }\n if (errorMessage) {\n logEntry.error = errorMessage\n }\n options.onRequest(logEntry)\n }\n return response\n }\n\n try {\n // Cleanup old sessions on each request\n cleanupSessions()\n\n // Handle CORS preflight (no auth or rate limit for preflight)\n if (method === 'OPTIONS') {\n return logRequest(new Response(null, {\n status: 204,\n headers: corsHeaders,\n }))\n }\n\n // Get or create session ID (needed for rate limiting key)\n sessionId = request.headers.get(SESSION_HEADER) ?? undefined\n const isNewSession = !sessionId\n if (isNewSession) {\n sessionId = generateSessionId()\n }\n\n // Rate limiting check (before authentication to prevent auth bypass)\n if (options.rateLimit) {\n const keyExtractor = options.rateLimit.keyExtractor ?? defaultKeyExtractor\n const key = keyExtractor(request, sessionId)\n\n let rateLimitResult: RateLimitResult\n if (options.rateLimit.customLimiter) {\n rateLimitResult = await options.rateLimit.customLimiter(key, request)\n } else {\n rateLimitResult = checkRateLimit(key, options.rateLimit, rateLimiter)\n }\n\n if (!rateLimitResult.allowed) {\n errorMessage = 'Rate limited'\n return logRequest(rateLimitedResponse(corsHeaders, rateLimitResult))\n }\n }\n\n // Authentication check\n if (options.authenticate) {\n const authResult = await options.authenticate(request)\n if (!authResult.authenticated) {\n errorMessage = authResult.error ?? 'Authentication failed'\n return logRequest(authErrorResponse(errorMessage, corsHeaders))\n }\n }\n\n sessions.lastActivity.set(sessionId!, Date.now())\n\n // Handle GET for SSE streams\n if (method === 'GET') {\n return logRequest(await handleSseRequest(request, sessionId!, sessions, corsHeaders))\n }\n\n // Handle POST for JSON-RPC\n if (method === 'POST') {\n const response = await handleJsonRpcRequest(request, server, sessionId!, sessions, corsHeaders, (m) => {\n rpcMethod = m\n })\n return logRequest(response)\n }\n\n // Handle DELETE for session termination\n if (method === 'DELETE') {\n return logRequest(await handleDeleteSession(sessionId!, sessions, corsHeaders))\n }\n\n // Method not allowed\n errorMessage = `Method ${method} not allowed`\n return logRequest(errorResponse(-32600, errorMessage, 405, corsHeaders))\n } catch (error) {\n errorMessage = error instanceof Error ? error.message : 'Internal error'\n return logRequest(errorResponse(-32603, errorMessage, 500, corsHeaders))\n }\n }\n}\n\n// =============================================================================\n// Request Handlers\n// =============================================================================\n\n/**\n * Handle SSE stream request\n */\nasync function handleSseRequest(\n request: Request,\n sessionId: string,\n sessions: SessionStore,\n corsHeaders: Record<string, string>\n): Promise<Response> {\n const encoder = new TextEncoder()\n\n // Check Accept header\n const accept = request.headers.get('Accept')\n if (!accept?.includes('text/event-stream')) {\n return new Response(JSON.stringify({ error: 'Accept header must include text/event-stream' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json', ...corsHeaders },\n })\n }\n\n // Create SSE stream\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n // Store session\n const sseSession: SseSession = {\n controller,\n encoder,\n lastEventId: 0,\n }\n sessions.sseClients.set(sessionId, sseSession)\n\n // Send initial connection event\n const event = formatSseEvent('endpoint', JSON.stringify({\n type: 'connection',\n sessionId,\n timestamp: new Date().toISOString(),\n }), ++sseSession.lastEventId)\n controller.enqueue(encoder.encode(event))\n },\n cancel() {\n sessions.sseClients.delete(sessionId)\n },\n })\n\n return new Response(stream, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n [SESSION_HEADER]: sessionId,\n ...corsHeaders,\n },\n })\n}\n\n/**\n * Handle JSON-RPC POST request\n */\nasync function handleJsonRpcRequest(\n request: Request,\n server: McpServer,\n sessionId: string,\n sessions: SessionStore,\n corsHeaders: Record<string, string>,\n onRpcMethod?: (method: string) => void\n): Promise<Response> {\n // Check Content-Type\n const contentType = request.headers.get('Content-Type')\n if (!contentType?.includes('application/json')) {\n return errorResponse(-32700, 'Content-Type must be application/json', 400, corsHeaders)\n }\n\n // Parse JSON body\n let body: unknown\n try {\n body = await request.json()\n } catch {\n return errorResponse(-32700, 'Parse error: Invalid JSON', 400, corsHeaders)\n }\n\n // Handle batch requests\n if (Array.isArray(body)) {\n // Report first method for logging\n if (onRpcMethod && body.length > 0 && body[0]?.method) {\n onRpcMethod(`batch[${body.length}]:${body[0].method}`)\n }\n const responses = await Promise.all(\n body.map((req) => processRequest(req, server, sessionId, sessions))\n )\n return jsonResponse(responses, 200, corsHeaders, sessionId)\n }\n\n // Handle single request\n const mcpRequest = body as McpRequest\n if (onRpcMethod && mcpRequest.method) {\n onRpcMethod(mcpRequest.method)\n }\n const response = await processRequest(mcpRequest, server, sessionId, sessions)\n return jsonResponse(response, 200, corsHeaders, sessionId)\n}\n\n/**\n * Handle DELETE request for session termination\n */\nasync function handleDeleteSession(\n sessionId: string,\n sessions: SessionStore,\n corsHeaders: Record<string, string>\n): Promise<Response> {\n const sseSession = sessions.sseClients.get(sessionId)\n if (sseSession) {\n try {\n sseSession.controller.close()\n } catch {\n // Controller may already be closed\n }\n sessions.sseClients.delete(sessionId)\n }\n sessions.lastActivity.delete(sessionId)\n\n return new Response(null, {\n status: 204,\n headers: corsHeaders,\n })\n}\n\n/**\n * Process a single JSON-RPC request\n */\nasync function processRequest(\n request: McpRequest,\n server: McpServer,\n sessionId: string,\n sessions: SessionStore\n): Promise<McpResponse> {\n // Validate request structure\n if (!request || typeof request !== 'object') {\n return {\n jsonrpc: '2.0',\n id: null as unknown as string,\n error: { code: -32600, message: 'Invalid request' },\n }\n }\n\n // Delegate to MCP server\n const response = await server.handleRequest(request)\n\n // If there's an SSE client, send the response as an event\n const sseSession = sessions.sseClients.get(sessionId)\n if (sseSession) {\n try {\n const event = formatSseEvent('message', JSON.stringify(response), ++sseSession.lastEventId)\n sseSession.controller.enqueue(sseSession.encoder.encode(event))\n } catch {\n // SSE connection may be closed\n sessions.sseClients.delete(sessionId)\n }\n }\n\n return response\n}\n\n/**\n * Format an SSE event\n */\nfunction formatSseEvent(event: string, data: string, id: number): string {\n return `event: ${event}\\nid: ${id}\\ndata: ${data}\\n\\n`\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Send an event to a specific SSE session\n */\nexport function sendSseEvent(\n sessionId: string,\n sessions: SessionStore,\n event: string,\n data: unknown\n): boolean {\n const sseSession = sessions.sseClients.get(sessionId)\n if (!sseSession) {\n return false\n }\n\n try {\n const formattedEvent = formatSseEvent(event, JSON.stringify(data), ++sseSession.lastEventId)\n sseSession.controller.enqueue(sseSession.encoder.encode(formattedEvent))\n return true\n } catch {\n sessions.sseClients.delete(sessionId)\n return false\n }\n}\n\n/**\n * Create a simple request handler that wraps the MCP handler\n * for use with standard HTTP servers\n */\nexport function createStandardHandler(\n server: McpServer,\n corsOptions?: CorsOptions\n): HttpHandler {\n return createHttpMcpHandler(server, corsOptions)\n}\n","/**\n * MCP Handler for MondoDatabase Durable Object\n *\n * Creates an MCP HTTP handler that wraps MondoDatabase methods,\n * allowing AI agents to access the database via MCP protocol.\n */\n\nimport { createMcpServer, type McpServer } from '../mcp/server'\nimport { createHttpMcpHandler } from '../mcp/transport/http'\nimport type { HttpHandler } from '../mcp/transport/http'\nimport type { DatabaseAccess, FindOptions } from '../mcp/types'\nimport type { MondoDatabase, Document } from './mondo-database'\nimport type { PipelineStage } from '../translator/aggregation-translator'\n\n// Re-export HttpHandler for convenience\nexport type { HttpHandler }\n\n/**\n * Create a DatabaseAccess implementation that wraps MondoDatabase methods\n *\n * @param db - The MondoDatabase instance to wrap\n * @returns DatabaseAccess interface for MCP tools\n */\nexport function createDatabaseAccess(db: MondoDatabase): DatabaseAccess {\n return {\n async findOne(\n collection: string,\n filter: Record<string, unknown>\n ): Promise<Record<string, unknown> | null> {\n return db.findOne(collection, filter as Document)\n },\n\n async find(\n collection: string,\n filter: Record<string, unknown>,\n options?: FindOptions\n ): Promise<Record<string, unknown>[]> {\n // MondoDatabase.find() doesn't support options yet, so we fetch all and apply in memory\n const results = await db.find(collection, filter as Document)\n\n let processed = results as Record<string, unknown>[]\n\n // Apply skip\n if (options?.skip) {\n processed = processed.slice(options.skip)\n }\n\n // Apply limit\n if (options?.limit) {\n processed = processed.slice(0, options.limit)\n }\n\n // Apply sort (simple in-memory sort)\n if (options?.sort) {\n const sortEntries = Object.entries(options.sort)\n if (sortEntries.length > 0) {\n processed.sort((a, b) => {\n for (const [field, order] of sortEntries) {\n const aVal = a[field] as string | number | boolean | null | undefined\n const bVal = b[field] as string | number | boolean | null | undefined\n if (aVal != null && bVal != null && aVal < bVal) return order === 1 ? -1 : 1\n if (aVal != null && bVal != null && aVal > bVal) return order === 1 ? 1 : -1\n }\n return 0\n })\n }\n }\n\n // Apply projection\n if (options?.projection) {\n const projEntries = Object.entries(options.projection)\n const isInclusive = projEntries.some(([, v]) => v === 1)\n\n processed = processed.map((doc) => {\n if (isInclusive) {\n // Include only specified fields (plus _id unless excluded)\n const projected: Record<string, unknown> = {}\n if (options.projection!['_id'] !== 0) {\n projected['_id'] = doc['_id']\n }\n for (const [field, include] of projEntries) {\n if (include === 1 && field !== '_id') {\n projected[field] = doc[field]\n }\n }\n return projected\n } else {\n // Exclude specified fields\n const projected = { ...doc }\n for (const [field, exclude] of projEntries) {\n if (exclude === 0) {\n delete projected[field]\n }\n }\n return projected\n }\n })\n }\n\n return processed\n },\n\n async insertOne(\n collection: string,\n document: Record<string, unknown>\n ): Promise<{ insertedId: string }> {\n const result = await db.insertOne(collection, document as Document)\n return { insertedId: result.insertedId }\n },\n\n async insertMany(\n collection: string,\n documents: Record<string, unknown>[]\n ): Promise<{ insertedIds: string[] }> {\n const result = await db.insertMany(collection, documents as Document[])\n return { insertedIds: result.insertedIds }\n },\n\n async updateOne(\n collection: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n const result = await db.updateOne(\n collection,\n filter as Document,\n update as { $set?: Document; $unset?: Record<string, unknown> }\n )\n return {\n matchedCount: result.matchedCount,\n modifiedCount: result.modifiedCount,\n }\n },\n\n async updateMany(\n collection: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>\n ): Promise<{ matchedCount: number; modifiedCount: number }> {\n // MondoDatabase doesn't have updateMany yet, so we implement it via find + updateOne\n const docs = await db.find(collection, filter as Document)\n let matchedCount = 0\n let modifiedCount = 0\n\n for (const doc of docs) {\n if (doc._id) {\n const result = await db.updateOne(\n collection,\n { _id: doc._id },\n update as { $set?: Document; $unset?: Record<string, unknown> }\n )\n matchedCount += result.matchedCount\n modifiedCount += result.modifiedCount\n }\n }\n\n return { matchedCount, modifiedCount }\n },\n\n async deleteOne(\n collection: string,\n filter: Record<string, unknown>\n ): Promise<{ deletedCount: number }> {\n const result = await db.deleteOne(collection, filter as Document)\n return { deletedCount: result.deletedCount }\n },\n\n async deleteMany(\n collection: string,\n filter: Record<string, unknown>\n ): Promise<{ deletedCount: number }> {\n const result = await db.deleteMany(collection, filter as Document)\n return { deletedCount: result.deletedCount }\n },\n\n async aggregate(\n collection: string,\n pipeline: Record<string, unknown>[]\n ): Promise<Record<string, unknown>[]> {\n const result = await db.aggregate(collection, pipeline as PipelineStage[])\n return result as Record<string, unknown>[]\n },\n\n async countDocuments(\n collection: string,\n filter?: Record<string, unknown>\n ): Promise<number> {\n return db.countDocuments(collection, (filter || {}) as Document)\n },\n\n async listCollections(): Promise<string[]> {\n // Get collections from the storage\n const storage = db.getStorage()\n const sql = storage.sql\n\n const result = sql.exec(`SELECT name FROM collections`).toArray() as { name: string }[]\n return result.map((row) => row.name)\n },\n\n async listDatabases(): Promise<string[]> {\n // In MondoDatabase, each DO instance is essentially a database\n // Return a single database name\n return ['default']\n },\n\n getProxy(): DatabaseAccess {\n // Return self as proxy - the MondoDatabase already provides isolation\n return this\n },\n }\n}\n\n/**\n * Create an MCP HTTP handler for a MondoDatabase instance\n *\n * @param db - The MondoDatabase instance\n * @param options - Optional configuration\n * @returns HTTP handler function for MCP requests\n *\n * @example\n * ```typescript\n * // In MondoDatabase.fetch()\n * if (url.pathname.startsWith('/mcp')) {\n * const mcpHandler = createMondoMcpHandler(this)\n * return mcpHandler(request)\n * }\n * ```\n */\nexport function createMondoMcpHandler(\n db: MondoDatabase,\n options?: {\n /** Server name for MCP initialization (default: 'mongo.do') */\n name?: string\n /** Server version (default: '1.0.0') */\n version?: string\n }\n): HttpHandler {\n // Create DatabaseAccess wrapper\n const dbAccess = createDatabaseAccess(db)\n\n // Create MCP server with database access\n const server = createMcpServer({\n dbAccess,\n name: options?.name ?? 'mongo.do',\n version: options?.version ?? '1.0.0',\n })\n\n // Create and return HTTP handler\n return createHttpMcpHandler(server)\n}\n\n/**\n * Get the MCP server instance for advanced usage\n *\n * @param db - The MondoDatabase instance\n * @param options - Optional configuration\n * @returns MCP server instance\n */\nexport function getMcpServer(\n db: MondoDatabase,\n options?: {\n name?: string\n version?: string\n }\n): McpServer {\n const dbAccess = createDatabaseAccess(db)\n return createMcpServer({\n dbAccess,\n name: options?.name ?? 'mongo.do',\n version: options?.version ?? '1.0.0',\n })\n}\n","/**\n * MondoDatabase - MongoDB-compatible Durable Object\n *\n * This is the main Durable Object class that provides MongoDB-compatible\n * operations backed by Cloudflare's SQLite storage.\n */\n\n// Import types from the unified schema module\nimport {\n SchemaManager,\n DurableObjectStorage,\n Document,\n InsertOneResult,\n UpdateResult,\n DeleteResult,\n} from './schema';\nimport { ObjectId } from '../types/objectid';\nimport type { WorkerLoader } from '../types/function';\nimport { AggregationExecutor } from '../executor/aggregation-executor';\nimport type { PipelineStage } from '../translator/aggregation-translator';\nimport { createMondoMcpHandler, type HttpHandler } from './mcp-handler';\n\n// Re-export types that consumers of MondoDatabase might need\nexport type { Document, InsertOneResult, UpdateResult, DeleteResult };\n\n/**\n * Interface for Durable Object state\n */\nexport interface DurableObjectState {\n storage: DurableObjectStorage;\n blockConcurrencyWhile<T>(callback: () => Promise<T>): void;\n}\n\n/**\n * Interface for Cloudflare Environment bindings\n */\nexport interface Env {\n /** Optional worker-loader binding for $function support */\n LOADER?: WorkerLoader\n /** Enable debug endpoints (/internal/reset, /internal/dump) - DO NOT enable in production */\n ENABLE_DEBUG_ENDPOINTS?: string\n}\n\n/**\n * Result of an insertMany operation\n * Note: This uses string[] for insertedIds (matching MongoDB's native driver behavior),\n * while the shared InsertManyResult type uses Record<number, string> for MongoDB compatibility\n */\nexport interface InsertManyResult {\n acknowledged: boolean;\n insertedCount: number;\n insertedIds: string[];\n}\n\n/**\n * MondoDatabase Durable Object\n *\n * Provides MongoDB-compatible document storage using Cloudflare Durable Objects\n * with SQLite as the backing store.\n */\nexport class MondoDatabase {\n private state: DurableObjectState;\n private env: Env;\n private schemaManager: SchemaManager;\n private initialized: boolean = false;\n private mcpHandler: HttpHandler | null = null;\n\n constructor(state: DurableObjectState, env: Env) {\n this.state = state;\n this.env = env;\n this.schemaManager = new SchemaManager(state.storage);\n\n // Use blockConcurrencyWhile to ensure atomic schema initialization\n // This prevents race conditions when multiple requests arrive simultaneously\n this.state.blockConcurrencyWhile(async () => {\n await this.schemaManager.initializeSchema();\n this.initialized = true;\n });\n }\n\n /**\n * Check if the database is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get the schema manager for advanced operations\n */\n getSchemaManager(): SchemaManager {\n return this.schemaManager;\n }\n\n /**\n * Get the underlying storage\n */\n getStorage(): DurableObjectStorage {\n return this.state.storage;\n }\n\n /**\n * Get or create a collection by name, returning the collection_id\n */\n private getOrCreateCollection(name: string): number {\n const sql = this.state.storage.sql;\n\n // Try to get existing collection\n const existing = sql.exec(\n `SELECT id FROM collections WHERE name = ?`,\n name\n ).toArray() as { id: number }[];\n\n if (existing.length > 0 && existing[0]) {\n return existing[0].id;\n }\n\n // Create new collection\n sql.exec(\n `INSERT INTO collections (name, options) VALUES (?, '{}')`,\n name\n );\n\n // Get the inserted id\n const result = sql.exec(\n `SELECT id FROM collections WHERE name = ?`,\n name\n ).toArray() as { id: number }[];\n\n if (!result[0]) {\n throw new Error(`Failed to create collection: ${name}`);\n }\n return result[0].id;\n }\n\n /**\n * Get collection ID by name, returns undefined if not found\n */\n private getCollectionId(name: string): number | undefined {\n const sql = this.state.storage.sql;\n const result = sql.exec(\n `SELECT id FROM collections WHERE name = ?`,\n name\n ).toArray() as { id: number }[];\n\n return result.length > 0 && result[0] ? result[0].id : undefined;\n }\n\n /**\n * Insert a single document into a collection\n */\n async insertOne(collection: string, document: Document): Promise<InsertOneResult> {\n const collectionId = this.getOrCreateCollection(collection);\n const sql = this.state.storage.sql;\n\n // Generate _id if not provided\n const docId = document._id\n ? (document._id instanceof ObjectId ? document._id.toHexString() : String(document._id))\n : new ObjectId().toHexString();\n\n // Create document with _id included\n const docWithId = { ...document, _id: docId };\n\n // Insert document using json() for proper JSON storage\n sql.exec(\n `INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, json(?))`,\n collectionId,\n docId,\n JSON.stringify(docWithId)\n );\n\n return {\n acknowledged: true,\n insertedId: docId,\n };\n }\n\n /**\n * Insert multiple documents into a collection\n */\n async insertMany(collection: string, documents: Document[]): Promise<InsertManyResult> {\n const collectionId = this.getOrCreateCollection(collection);\n const sql = this.state.storage.sql;\n\n // Use transactionSync for atomic bulk insert\n // If any insert fails, all are rolled back\n const insertedIds = this.state.storage.transactionSync(() => {\n const ids: string[] = [];\n\n for (const document of documents) {\n // Generate _id if not provided\n const docId = document._id\n ? (document._id instanceof ObjectId ? document._id.toHexString() : String(document._id))\n : new ObjectId().toHexString();\n\n // Create document with _id included\n const docWithId = { ...document, _id: docId };\n\n // Insert document\n sql.exec(\n `INSERT INTO documents (collection_id, _id, data) VALUES (?, ?, json(?))`,\n collectionId,\n docId,\n JSON.stringify(docWithId)\n );\n\n ids.push(docId);\n }\n\n return ids;\n });\n\n return {\n acknowledged: true,\n insertedCount: insertedIds.length,\n insertedIds,\n };\n }\n\n /**\n * Find a single document matching the query\n */\n async findOne(collection: string, query: Document = {}): Promise<Document | null> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return null;\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(query);\n\n const sqlQuery = `\n SELECT data FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n LIMIT 1\n `;\n\n const result = sql.exec(sqlQuery, collectionId, ...params).toArray() as { data: string }[];\n\n if (result.length === 0 || !result[0]) {\n return null;\n }\n\n return JSON.parse(result[0].data) as Document;\n }\n\n /**\n * Find all documents matching the query\n */\n async find(collection: string, query: Document = {}): Promise<Document[]> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return [];\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(query);\n\n const sqlQuery = `\n SELECT data FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n `;\n\n const result = sql.exec(sqlQuery, collectionId, ...params).toArray() as { data: string }[];\n\n return result.map((row) => JSON.parse(row.data) as Document);\n }\n\n /**\n * Update a single document matching the filter\n */\n async updateOne(\n collection: string,\n filter: Document,\n update: { $set?: Document; $unset?: Record<string, unknown> }\n ): Promise<UpdateResult> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return { acknowledged: true, matchedCount: 0, modifiedCount: 0 };\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n // Find the document to update\n const findQuery = `\n SELECT id, data FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n LIMIT 1\n `;\n\n const found = sql.exec(findQuery, collectionId, ...params).toArray() as { id: number; data: string }[];\n\n if (found.length === 0 || !found[0]) {\n return { acknowledged: true, matchedCount: 0, modifiedCount: 0 };\n }\n\n const docRowId = found[0].id;\n const existingDoc = JSON.parse(found[0].data) as Document;\n\n // Apply $set updates\n let updatedDoc = { ...existingDoc };\n if (update.$set) {\n for (const [key, value] of Object.entries(update.$set)) {\n if (key !== '_id') {\n this.setNestedValue(updatedDoc, key, value);\n }\n }\n }\n\n // Apply $unset to remove fields\n if (update.$unset) {\n for (const key of Object.keys(update.$unset)) {\n if (key !== '_id') {\n this.deleteNestedValue(updatedDoc, key);\n }\n }\n }\n\n // Update the document in the database\n sql.exec(\n `UPDATE documents SET data = json(?) WHERE id = ?`,\n JSON.stringify(updatedDoc),\n docRowId\n );\n\n return {\n acknowledged: true,\n matchedCount: 1,\n modifiedCount: 1,\n };\n }\n\n /**\n * Delete a single document matching the filter\n */\n async deleteOne(collection: string, filter: Document): Promise<DeleteResult> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return { acknowledged: true, deletedCount: 0 };\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n // Find the document to delete\n const findQuery = `\n SELECT id FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n LIMIT 1\n `;\n\n const found = sql.exec(findQuery, collectionId, ...params).toArray() as { id: number }[];\n\n if (found.length === 0 || !found[0]) {\n return { acknowledged: true, deletedCount: 0 };\n }\n\n // Delete the document\n sql.exec(`DELETE FROM documents WHERE id = ?`, found[0].id);\n\n return {\n acknowledged: true,\n deletedCount: 1,\n };\n }\n\n /**\n * Build WHERE clause from MongoDB-style query\n * Supports: _id, simple field equality, $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $exists\n */\n private buildWhereClause(query: Document): { whereClause: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (key === '_id') {\n // Direct _id comparison on the _id column\n conditions.push('_id = ?');\n params.push(value instanceof ObjectId ? value.toHexString() : String(value));\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Handle MongoDB operators\n for (const [op, opValue] of Object.entries(value as Record<string, unknown>)) {\n const jsonPath = this.fieldToJsonPath(key);\n switch (op) {\n case '$eq': {\n conditions.push(`json_extract(data, ?) = ?`);\n const eqValue = typeof opValue === 'boolean' ? (opValue ? 1 : 0) : opValue;\n params.push(jsonPath, eqValue);\n break;\n }\n case '$ne': {\n conditions.push(`json_extract(data, ?) != ?`);\n const neValue = typeof opValue === 'boolean' ? (opValue ? 1 : 0) : opValue;\n params.push(jsonPath, neValue);\n break;\n }\n case '$gt':\n conditions.push(`json_extract(data, ?) > ?`);\n params.push(jsonPath, opValue);\n break;\n case '$gte':\n conditions.push(`json_extract(data, ?) >= ?`);\n params.push(jsonPath, opValue);\n break;\n case '$lt':\n conditions.push(`json_extract(data, ?) < ?`);\n params.push(jsonPath, opValue);\n break;\n case '$lte':\n conditions.push(`json_extract(data, ?) <= ?`);\n params.push(jsonPath, opValue);\n break;\n case '$in':\n if (Array.isArray(opValue) && opValue.length > 0) {\n const placeholders = opValue.map(() => '?').join(', ');\n conditions.push(`json_extract(data, ?) IN (${placeholders})`);\n params.push(jsonPath, ...opValue);\n }\n break;\n case '$nin':\n if (Array.isArray(opValue) && opValue.length > 0) {\n const placeholders = opValue.map(() => '?').join(', ');\n conditions.push(`json_extract(data, ?) NOT IN (${placeholders})`);\n params.push(jsonPath, ...opValue);\n }\n break;\n case '$exists':\n if (opValue) {\n conditions.push(`json_extract(data, ?) IS NOT NULL`);\n } else {\n conditions.push(`json_extract(data, ?) IS NULL`);\n }\n params.push(jsonPath);\n break;\n }\n }\n } else {\n // Implicit $eq for simple values using json_extract\n const jsonPath = this.fieldToJsonPath(key);\n conditions.push(`json_extract(data, ?) = ?`);\n // SQLite's json_extract returns 1/0 for booleans, so convert JS booleans\n const sqlValue = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n params.push(jsonPath, sqlValue);\n }\n }\n\n return {\n whereClause: conditions.join(' AND '),\n params,\n };\n }\n\n /**\n * Convert a field name (possibly with dot notation) to JSON path\n * e.g., \"profile.level\" -> \"$.profile.level\"\n */\n private fieldToJsonPath(field: string): string {\n return `$.${field}`;\n }\n\n /**\n * Set a nested value in an object using dot notation path\n */\n private setNestedValue(obj: Document, path: string, value: unknown): void {\n const keys = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]!;\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (lastKey !== undefined) {\n current[lastKey] = value;\n }\n }\n\n /**\n * Delete a nested value from an object using dot notation path\n */\n private deleteNestedValue(obj: Document, path: string): void {\n const keys = path.split('.');\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]!;\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n return; // Path doesn't exist\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (lastKey !== undefined) {\n delete current[lastKey];\n }\n }\n\n /**\n * Delete multiple documents matching the filter\n */\n async deleteMany(collection: string, filter: Document = {}): Promise<DeleteResult> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return { acknowledged: true, deletedCount: 0 };\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n // Use transactionSync for atomic bulk delete\n // If any delete fails, all are rolled back\n const deletedCount = this.state.storage.transactionSync(() => {\n // If no filter, delete all documents in collection\n if (!whereClause) {\n const countResult = sql.exec(\n `SELECT COUNT(*) as count FROM documents WHERE collection_id = ?`,\n collectionId\n ).toArray() as { count: number }[];\n\n const count = countResult[0]?.count || 0;\n\n sql.exec(`DELETE FROM documents WHERE collection_id = ?`, collectionId);\n\n return count;\n }\n\n // Find and delete matching documents\n const findQuery = `\n SELECT id FROM documents\n WHERE collection_id = ? AND ${whereClause}\n `;\n\n const found = sql.exec(findQuery, collectionId, ...params).toArray() as { id: number }[];\n\n for (const row of found) {\n sql.exec(`DELETE FROM documents WHERE id = ?`, row.id);\n }\n\n return found.length;\n });\n\n return {\n acknowledged: true,\n deletedCount,\n };\n }\n\n /**\n * Count documents matching the filter\n */\n async countDocuments(collection: string, filter: Document = {}): Promise<number> {\n const collectionId = this.getCollectionId(collection);\n if (collectionId === undefined) {\n return 0;\n }\n\n const sql = this.state.storage.sql;\n const { whereClause, params } = this.buildWhereClause(filter);\n\n const countQuery = `\n SELECT COUNT(*) as count FROM documents\n WHERE collection_id = ?${whereClause ? ` AND ${whereClause}` : ''}\n `;\n\n const result = sql.exec(countQuery, collectionId, ...params).toArray() as { count: number }[];\n\n return result[0]?.count || 0;\n }\n\n /**\n * Execute an aggregation pipeline on a collection\n *\n * Supports async execution for $function operators that require\n * JavaScript execution via worker-loader.\n *\n * @param collection - The collection name\n * @param pipeline - Array of aggregation pipeline stages\n * @returns Array of result documents\n */\n async aggregate(collection: string, pipeline: PipelineStage[]): Promise<unknown[]> {\n // Ensure collection exists - create view for documents\n const collectionId = this.getCollectionId(collection);\n\n if (collectionId === undefined) {\n // Return empty for non-existent collection\n return [];\n }\n\n // Create SQL interface that wraps the storage.sql for AggregationExecutor\n const sqlInterface = {\n exec: (query: string, ...params: unknown[]) => {\n // The AggregationTranslator generates SQL that selects from collection name directly\n // We need to replace the collection name with a subquery that filters by collection_id\n // Handle both cases: with and without existing WHERE clause\n let modifiedQuery: string;\n const fromPattern = new RegExp(`FROM\\\\s+${collection}\\\\b(\\\\s+WHERE\\\\s+)?`, 'gi');\n modifiedQuery = query.replace(fromPattern, (_match, hasWhere) => {\n if (hasWhere) {\n // There's an existing WHERE clause, use AND to combine conditions\n return `FROM documents WHERE collection_id = ${collectionId} AND `;\n } else {\n // No existing WHERE clause\n return `FROM documents WHERE collection_id = ${collectionId}`;\n }\n });\n const result = this.state.storage.sql.exec(modifiedQuery, ...params);\n const array = result.toArray();\n return {\n results: array,\n toArray: () => array\n };\n }\n };\n\n const executor = new AggregationExecutor(sqlInterface, this.env);\n return executor.execute(collection, pipeline);\n }\n\n /**\n * Reset database - for testing purposes\n */\n private async reset(): Promise<void> {\n const sql = this.state.storage.sql;\n sql.exec(`DELETE FROM documents`);\n sql.exec(`DELETE FROM collections`);\n }\n\n /**\n * Dump database contents - for debugging\n */\n private async dump(): Promise<{ collections: unknown[]; documents: unknown[] }> {\n const sql = this.state.storage.sql;\n const collections = sql.exec(`SELECT * FROM collections`).toArray();\n const documents = sql.exec(`SELECT * FROM documents`).toArray();\n return { collections, documents };\n }\n\n /**\n * Handle incoming fetch requests\n * Implements HTTP API for MongoDB-compatible operations\n */\n async fetch(request: Request): Promise<Response> {\n // Ensure initialization is complete\n if (!this.initialized) {\n return new Response(JSON.stringify({ error: 'Database initializing' }), {\n status: 503,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const url = new URL(request.url);\n const path = url.pathname;\n\n try {\n // MCP endpoint - route to MCP handler for AI agent access\n if (path.startsWith('/mcp')) {\n // Lazily create MCP handler on first request\n if (!this.mcpHandler) {\n this.mcpHandler = createMondoMcpHandler(this);\n }\n return this.mcpHandler(request);\n }\n\n // Health check endpoint\n if (path === '/health') {\n const isValid = await this.schemaManager.validateSchema();\n return new Response(\n JSON.stringify({\n status: isValid ? 'healthy' : 'unhealthy',\n schemaVersion: await this.schemaManager.getSchemaVersion(),\n }),\n {\n status: isValid ? 200 : 500,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n // Internal endpoints for testing - SECURITY: Gated behind ENABLE_DEBUG_ENDPOINTS\n // These endpoints are dangerous and should NEVER be enabled in production\n if (path === '/internal/reset' || path === '/internal/dump') {\n // Check if debug endpoints are enabled via environment variable\n if (this.env.ENABLE_DEBUG_ENDPOINTS !== 'true') {\n return new Response(JSON.stringify({ error: 'Debug endpoints are disabled' }), {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (request.method === 'POST' && path === '/internal/reset') {\n await this.reset();\n return new Response(JSON.stringify({ ok: true }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (request.method === 'GET' && path === '/internal/dump') {\n const data = await this.dump();\n return new Response(JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n // CRUD endpoints\n if (request.method === 'POST') {\n const body = await request.json() as Record<string, unknown>;\n const collection = body.collection as string;\n\n if (!collection) {\n return new Response(JSON.stringify({ error: 'Collection name required' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/insertOne') {\n const result = await this.insertOne(collection, body.document as Document || {});\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/insertMany') {\n const result = await this.insertMany(collection, body.documents as Document[] || []);\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/findOne') {\n const result = await this.findOne(collection, body.filter as Document || {});\n return new Response(JSON.stringify({ document: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/find') {\n const result = await this.find(collection, body.filter as Document || {});\n return new Response(JSON.stringify({ documents: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/updateOne') {\n const result = await this.updateOne(\n collection,\n body.filter as Document || {},\n body.update as { $set?: Document; $unset?: Record<string, unknown> } || {}\n );\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/deleteOne') {\n const result = await this.deleteOne(collection, body.filter as Document || {});\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/deleteMany') {\n const result = await this.deleteMany(collection, body.filter as Document || {});\n return new Response(JSON.stringify(result), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/countDocuments') {\n const result = await this.countDocuments(collection, body.filter as Document || {});\n return new Response(JSON.stringify({ count: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (path === '/aggregate') {\n const result = await this.aggregate(collection, body.pipeline as PipelineStage[] || []);\n return new Response(JSON.stringify({ documents: result }), {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n return new Response(JSON.stringify({ error: 'Not found' }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return new Response(JSON.stringify({ error: message }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n}\n","/**\n * Cloudflare Workers entry point for mongo.do\n *\n * This file exports only what's needed for the worker runtime:\n * - Default export: The main Worker handler with fetch method\n * - Named exports: Durable Object classes and WorkerEntrypoint classes\n *\n * For library/package usage, import from './index.ts' instead.\n */\n\nimport { MondoEntrypoint, MondoEnv, ExecutionContext } from './rpc/worker-entrypoint';\n\n// Export the default Worker handler as a module with fetch method\nexport default {\n async fetch(request: Request, env: MondoEnv, ctx: ExecutionContext): Promise<Response> {\n const entrypoint = new MondoEntrypoint(ctx, env);\n return entrypoint.fetch(request);\n }\n};\n\n// Export named entrypoints for service bindings\nexport { MondoEntrypoint, WorkerEntrypoint } from './rpc/worker-entrypoint';\n\n// Export Durable Object class for binding\nexport { MondoDatabase } from './durable-object/mondo-database';\n"]}