mongoku 2.0.4 → 2.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 (426) hide show
  1. package/README.md +18 -4
  2. package/build/client/_app/immutable/assets/0.egX7ddQL.css +1 -0
  3. package/build/client/_app/immutable/assets/0.egX7ddQL.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.egX7ddQL.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/10.59aTjJn9.css +1 -0
  6. package/build/client/_app/immutable/assets/10.59aTjJn9.css.br +0 -0
  7. package/build/client/_app/immutable/assets/10.59aTjJn9.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/11.CEtFGlZU.css +1 -0
  9. package/build/client/_app/immutable/assets/11.CEtFGlZU.css.br +1 -0
  10. package/build/client/_app/immutable/assets/11.CEtFGlZU.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/12.BdCOhvz0.css +1 -0
  12. package/build/client/_app/immutable/assets/12.BdCOhvz0.css.br +0 -0
  13. package/build/client/_app/immutable/assets/12.BdCOhvz0.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/JsonValue.BEbzuWqZ.css +1 -0
  15. package/build/client/_app/immutable/assets/JsonValue.BEbzuWqZ.css.br +0 -0
  16. package/build/client/_app/immutable/assets/JsonValue.BEbzuWqZ.css.gz +0 -0
  17. package/build/client/_app/immutable/assets/Modal.DIIFkbGB.css +1 -0
  18. package/build/client/_app/immutable/assets/Modal.DIIFkbGB.css.br +0 -0
  19. package/build/client/_app/immutable/assets/Modal.DIIFkbGB.css.gz +0 -0
  20. package/build/client/_app/immutable/assets/Panel.B3aWupye.css +1 -0
  21. package/build/client/_app/immutable/assets/Panel.B3aWupye.css.br +0 -0
  22. package/build/client/_app/immutable/assets/Panel.B3aWupye.css.gz +0 -0
  23. package/build/client/_app/immutable/chunks/3iRu_dUj.js +2 -0
  24. package/build/client/_app/immutable/chunks/3iRu_dUj.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/3iRu_dUj.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/{ChWB6xnu.js → 4l_AWZos.js} +1 -1
  27. package/build/client/_app/immutable/chunks/4l_AWZos.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/4l_AWZos.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/5nAxkTTP.js +1 -0
  30. package/build/client/_app/immutable/chunks/5nAxkTTP.js.br +5 -0
  31. package/build/client/_app/immutable/chunks/5nAxkTTP.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/BBg-V8FE.js +1 -0
  33. package/build/client/_app/immutable/chunks/BBg-V8FE.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/BBg-V8FE.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/BE8UzJuY.js +1 -0
  36. package/build/client/_app/immutable/chunks/BE8UzJuY.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/BE8UzJuY.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/BUNgwIS0.js +1 -0
  39. package/build/client/_app/immutable/chunks/BUNgwIS0.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/BUNgwIS0.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/BjzB4NFq.js +1 -0
  42. package/build/client/_app/immutable/chunks/BjzB4NFq.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/BjzB4NFq.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/BtCOrwSt.js +1 -0
  45. package/build/client/_app/immutable/chunks/BtCOrwSt.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/BtCOrwSt.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/BvKY81hz.js +1 -0
  48. package/build/client/_app/immutable/chunks/BvKY81hz.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/BvKY81hz.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/{DQkpHJGc.js → C0PCwpqt.js} +1 -1
  51. package/build/client/_app/immutable/chunks/C0PCwpqt.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/C0PCwpqt.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/C82Rp5eQ.js +1 -0
  54. package/build/client/_app/immutable/chunks/C82Rp5eQ.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/C82Rp5eQ.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/CEvYYWlm.js +2 -0
  57. package/build/client/_app/immutable/chunks/CEvYYWlm.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/CEvYYWlm.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/CT5SFbzp.js +1 -0
  60. package/build/client/_app/immutable/chunks/CT5SFbzp.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/CT5SFbzp.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/CcyPStn-.js +1 -0
  63. package/build/client/_app/immutable/chunks/CcyPStn-.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/CcyPStn-.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/Cx2cA4gg.js +1 -0
  66. package/build/client/_app/immutable/chunks/Cx2cA4gg.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/Cx2cA4gg.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/D5ccpaXt.js +1 -0
  69. package/build/client/_app/immutable/chunks/D5ccpaXt.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/D5ccpaXt.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/D64wQeYi.js +1 -0
  72. package/build/client/_app/immutable/chunks/D64wQeYi.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/D64wQeYi.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/D7E46CWw.js +1 -0
  75. package/build/client/_app/immutable/chunks/D7E46CWw.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/D7E46CWw.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/DR9xdhsg.js +1 -0
  78. package/build/client/_app/immutable/chunks/DR9xdhsg.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/DR9xdhsg.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/DVJuGan7.js +1 -0
  81. package/build/client/_app/immutable/chunks/DVJuGan7.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/DVJuGan7.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/Dx86XS0G.js +1 -0
  84. package/build/client/_app/immutable/chunks/Dx86XS0G.js.br +4 -0
  85. package/build/client/_app/immutable/chunks/Dx86XS0G.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/lkkUcQuO.js +29 -0
  87. package/build/client/_app/immutable/chunks/lkkUcQuO.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/lkkUcQuO.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/nVJvgG3c.js +4 -0
  90. package/build/client/_app/immutable/chunks/nVJvgG3c.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/nVJvgG3c.js.gz +0 -0
  92. package/build/client/_app/immutable/entry/app.g5qLQ5x2.js +2 -0
  93. package/build/client/_app/immutable/entry/app.g5qLQ5x2.js.br +0 -0
  94. package/build/client/_app/immutable/entry/app.g5qLQ5x2.js.gz +0 -0
  95. package/build/client/_app/immutable/entry/start.C1uqw3sp.js +1 -0
  96. package/build/client/_app/immutable/entry/start.C1uqw3sp.js.br +2 -0
  97. package/build/client/_app/immutable/entry/start.C1uqw3sp.js.gz +0 -0
  98. package/build/client/_app/immutable/nodes/0.CD9yR-49.js +5 -0
  99. package/build/client/_app/immutable/nodes/0.CD9yR-49.js.br +0 -0
  100. package/build/client/_app/immutable/nodes/0.CD9yR-49.js.gz +0 -0
  101. package/build/client/_app/immutable/nodes/1.DztuiMqq.js +1 -0
  102. package/build/client/_app/immutable/nodes/1.DztuiMqq.js.br +0 -0
  103. package/build/client/_app/immutable/nodes/1.DztuiMqq.js.gz +0 -0
  104. package/build/client/_app/immutable/nodes/10.CWMFKPcE.js +2 -0
  105. package/build/client/_app/immutable/nodes/10.CWMFKPcE.js.br +0 -0
  106. package/build/client/_app/immutable/nodes/10.CWMFKPcE.js.gz +0 -0
  107. package/build/client/_app/immutable/nodes/11.-Y7Cu3Uv.js +1 -0
  108. package/build/client/_app/immutable/nodes/11.-Y7Cu3Uv.js.br +0 -0
  109. package/build/client/_app/immutable/nodes/11.-Y7Cu3Uv.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/12.wxif1TtN.js +1 -0
  111. package/build/client/_app/immutable/nodes/12.wxif1TtN.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/12.wxif1TtN.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/13.CpyTaRSN.js +66 -0
  114. package/build/client/_app/immutable/nodes/13.CpyTaRSN.js.br +0 -0
  115. package/build/client/_app/immutable/nodes/13.CpyTaRSN.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/2.DwwrLLW4.js +1 -0
  117. package/build/client/_app/immutable/nodes/2.DwwrLLW4.js.br +1 -0
  118. package/build/client/_app/immutable/nodes/2.DwwrLLW4.js.gz +0 -0
  119. package/build/client/_app/immutable/nodes/3.t20GootO.js +1 -0
  120. package/build/client/_app/immutable/nodes/3.t20GootO.js.br +0 -0
  121. package/build/client/_app/immutable/nodes/3.t20GootO.js.gz +0 -0
  122. package/build/client/_app/immutable/nodes/4.CXHjkPtf.js +1 -0
  123. package/build/client/_app/immutable/nodes/4.CXHjkPtf.js.br +0 -0
  124. package/build/client/_app/immutable/nodes/4.CXHjkPtf.js.gz +0 -0
  125. package/build/client/_app/immutable/nodes/5.C9tcr5B0.js +1 -0
  126. package/build/client/_app/immutable/nodes/5.C9tcr5B0.js.br +0 -0
  127. package/build/client/_app/immutable/nodes/5.C9tcr5B0.js.gz +0 -0
  128. package/build/client/_app/immutable/nodes/7.DoT-dNUk.js +1 -0
  129. package/build/client/_app/immutable/nodes/7.DoT-dNUk.js.br +0 -0
  130. package/build/client/_app/immutable/nodes/7.DoT-dNUk.js.gz +0 -0
  131. package/build/client/_app/immutable/nodes/8.BFPkGTSl.js +1 -0
  132. package/build/client/_app/immutable/nodes/8.BFPkGTSl.js.br +0 -0
  133. package/build/client/_app/immutable/nodes/8.BFPkGTSl.js.gz +0 -0
  134. package/build/client/_app/immutable/nodes/9.Bk397TaK.js +2 -0
  135. package/build/client/_app/immutable/nodes/9.Bk397TaK.js.br +0 -0
  136. package/build/client/_app/immutable/nodes/9.Bk397TaK.js.gz +0 -0
  137. package/build/client/_app/version.json +1 -1
  138. package/build/client/_app/version.json.br +0 -0
  139. package/build/client/_app/version.json.gz +0 -0
  140. package/build/handler.js +14 -0
  141. package/build/server/chunks/{0-Cb5ytlMI.js → 0-hDOo8HzQ.js} +7 -6
  142. package/build/server/chunks/0-hDOo8HzQ.js.map +1 -0
  143. package/build/server/chunks/1-Dsw_dVjH.js +9 -0
  144. package/build/server/chunks/1-Dsw_dVjH.js.map +1 -0
  145. package/build/server/chunks/10-Xy0rxLNm.js +213 -0
  146. package/build/server/chunks/10-Xy0rxLNm.js.map +1 -0
  147. package/build/server/chunks/11-DBYsQ3ww.js +42 -0
  148. package/build/server/chunks/11-DBYsQ3ww.js.map +1 -0
  149. package/build/server/chunks/12-D4aSEhYN.js +102 -0
  150. package/build/server/chunks/12-D4aSEhYN.js.map +1 -0
  151. package/build/server/chunks/13-CNu_Hz8r.js +52 -0
  152. package/build/server/chunks/13-CNu_Hz8r.js.map +1 -0
  153. package/build/server/chunks/2-ClkERMhY.js +24 -0
  154. package/build/server/chunks/2-ClkERMhY.js.map +1 -0
  155. package/build/server/chunks/3-CTpqmxdo.js +25 -0
  156. package/build/server/chunks/3-CTpqmxdo.js.map +1 -0
  157. package/build/server/chunks/4-CUH4fZn8.js +25 -0
  158. package/build/server/chunks/4-CUH4fZn8.js.map +1 -0
  159. package/build/server/chunks/5-BSEdxfut.js +25 -0
  160. package/build/server/chunks/5-BSEdxfut.js.map +1 -0
  161. package/build/server/chunks/{2-B39zPvzn.js → 6-ifXBeMPA.js} +2 -2
  162. package/build/server/chunks/{2-B39zPvzn.js.map → 6-ifXBeMPA.js.map} +1 -1
  163. package/build/server/chunks/7-CJJMTAtJ.js +82 -0
  164. package/build/server/chunks/7-CJJMTAtJ.js.map +1 -0
  165. package/build/server/chunks/{4-DzHoLo__.js → 8-jBgxYwFg.js} +19 -10
  166. package/build/server/chunks/8-jBgxYwFg.js.map +1 -0
  167. package/build/server/chunks/{5-CCWbCDpk.js → 9-U8SAVx43.js} +7 -8
  168. package/build/server/chunks/9-U8SAVx43.js.map +1 -0
  169. package/build/server/chunks/JsonValue-B5gcBFcA.js +290 -0
  170. package/build/server/chunks/JsonValue-B5gcBFcA.js.map +1 -0
  171. package/build/server/chunks/Modal-zVnoAfFx.js +36 -0
  172. package/build/server/chunks/Modal-zVnoAfFx.js.map +1 -0
  173. package/build/server/chunks/{Panel-Bz0b85EW.js → Panel-yg5YKL4d.js} +4 -3
  174. package/build/server/chunks/Panel-yg5YKL4d.js.map +1 -0
  175. package/build/server/chunks/PrettyJson-mXYQacEL.js +137 -0
  176. package/build/server/chunks/PrettyJson-mXYQacEL.js.map +1 -0
  177. package/build/server/chunks/Tooltip-DflJLumT.js +38 -0
  178. package/build/server/chunks/Tooltip-DflJLumT.js.map +1 -0
  179. package/build/server/chunks/TooltipTable-BPMzcmqQ.js +60 -0
  180. package/build/server/chunks/TooltipTable-BPMzcmqQ.js.map +1 -0
  181. package/build/server/chunks/_layout.svelte-DMm1Ill8.js +168 -0
  182. package/build/server/chunks/_layout.svelte-DMm1Ill8.js.map +1 -0
  183. package/build/server/chunks/_page.svelte-B-dLNs2Q.js +199 -0
  184. package/build/server/chunks/_page.svelte-B-dLNs2Q.js.map +1 -0
  185. package/build/server/chunks/{_page.svelte-FLzHOuyK.js → _page.svelte-BBpDrOEz.js} +40 -22
  186. package/build/server/chunks/_page.svelte-BBpDrOEz.js.map +1 -0
  187. package/build/server/chunks/_page.svelte-C9OCv4Hv.js +204 -0
  188. package/build/server/chunks/_page.svelte-C9OCv4Hv.js.map +1 -0
  189. package/build/server/chunks/{_page.svelte-w9cxGvUf.js → _page.svelte-CvWJ35oO.js} +33 -13
  190. package/build/server/chunks/_page.svelte-CvWJ35oO.js.map +1 -0
  191. package/build/server/chunks/_page.svelte-DYHUokXG.js +297 -0
  192. package/build/server/chunks/_page.svelte-DYHUokXG.js.map +1 -0
  193. package/build/server/chunks/{_page.svelte-FIp-IsOo.js → _page.svelte-Ds1-yUh2.js} +64 -13
  194. package/build/server/chunks/_page.svelte-Ds1-yUh2.js.map +1 -0
  195. package/build/server/chunks/{_page.svelte-jxFKbZdN.js → _page.svelte-DzPMpozq.js} +9 -6
  196. package/build/server/chunks/_page.svelte-DzPMpozq.js.map +1 -0
  197. package/build/server/chunks/_server.ts-06lGoPp8.js +8 -0
  198. package/build/server/chunks/_server.ts-06lGoPp8.js.map +1 -0
  199. package/build/server/chunks/async-lVJA8xJZ.js +9 -0
  200. package/build/server/chunks/async-lVJA8xJZ.js.map +1 -0
  201. package/build/server/chunks/client-BFlyU7ZU.js +7 -0
  202. package/build/server/chunks/{client-bj7sePQc.js.map → client-BFlyU7ZU.js.map} +1 -1
  203. package/build/server/chunks/{client2-BX4-xbM4.js → client2-DYaMKWrc.js} +4 -4
  204. package/build/server/chunks/{client2-BX4-xbM4.js.map → client2-DYaMKWrc.js.map} +1 -1
  205. package/build/server/chunks/{async-BfR0vYHo.js → context-C22hLSHK.js} +2 -8
  206. package/build/server/chunks/context-C22hLSHK.js.map +1 -0
  207. package/build/server/chunks/error.svelte-BENdaVOT.js +19 -0
  208. package/build/server/chunks/error.svelte-BENdaVOT.js.map +1 -0
  209. package/build/server/chunks/event-DVH-6ISX.js.map +1 -1
  210. package/build/server/chunks/hooks.server-CagAPNr2.js +40 -0
  211. package/build/server/chunks/hooks.server-CagAPNr2.js.map +1 -0
  212. package/build/server/chunks/{index-EKt9-9bV.js → index-DFXVwu6p.js} +2 -2
  213. package/build/server/chunks/{index-EKt9-9bV.js.map → index-DFXVwu6p.js.map} +1 -1
  214. package/build/server/chunks/index-Djsj11qr.js.map +1 -1
  215. package/build/server/chunks/index-server-Bf-hP5gL.js +5 -0
  216. package/build/server/chunks/index-server-Bf-hP5gL.js.map +1 -0
  217. package/build/server/chunks/{routing-DcR4fCSD.js → index2-DBFlGzWV.js} +23 -100
  218. package/build/server/chunks/index2-DBFlGzWV.js.map +1 -0
  219. package/build/server/chunks/{index3-DquTjlmp.js → index3-CoOO2o9t.js} +6 -6
  220. package/build/server/chunks/index3-CoOO2o9t.js.map +1 -0
  221. package/build/server/chunks/jsonParser-CraFXJs8.js +174 -0
  222. package/build/server/chunks/jsonParser-CraFXJs8.js.map +1 -0
  223. package/build/server/chunks/layout.svelte-CJcHX-Na.js +10 -0
  224. package/build/server/chunks/layout.svelte-CJcHX-Na.js.map +1 -0
  225. package/build/server/chunks/logger-D71iWOkl.js +36 -0
  226. package/build/server/chunks/logger-D71iWOkl.js.map +1 -0
  227. package/build/server/chunks/{mongo-dLmCShL_.js → mongo-BogiTfnG.js} +54 -12
  228. package/build/server/chunks/mongo-BogiTfnG.js.map +1 -0
  229. package/build/server/chunks/remote-xxtqbu-BJDSUh3k.js +17 -0
  230. package/build/server/chunks/remote-xxtqbu-BJDSUh3k.js.map +1 -0
  231. package/build/server/chunks/routing-e10vGH37.js +81 -0
  232. package/build/server/chunks/routing-e10vGH37.js.map +1 -0
  233. package/build/server/chunks/{server2-BiqGvkCy.js → server2-_mGVuBoG.js} +2 -2
  234. package/build/server/chunks/{server2-BiqGvkCy.js.map → server2-_mGVuBoG.js.map} +1 -1
  235. package/build/server/chunks/servers.remote-C2HuT43p.js +690 -0
  236. package/build/server/chunks/servers.remote-C2HuT43p.js.map +1 -0
  237. package/build/server/chunks/shared-Buki-xt5.js +506 -0
  238. package/build/server/chunks/shared-Buki-xt5.js.map +1 -0
  239. package/build/server/chunks/{state.svelte-CRHA9yov.js → state.svelte-C8IWmp_n.js} +2 -2
  240. package/build/server/chunks/{state.svelte-CRHA9yov.js.map → state.svelte-C8IWmp_n.js.map} +1 -1
  241. package/build/server/chunks/{utils-DGYJFmnf.js → utils-kjxf7BZO.js} +2 -2
  242. package/build/server/chunks/{utils-DGYJFmnf.js.map → utils-kjxf7BZO.js.map} +1 -1
  243. package/build/server/index.js +189 -610
  244. package/build/server/index.js.map +1 -1
  245. package/build/server/manifest.js +45 -18
  246. package/build/server/manifest.js.map +1 -1
  247. package/package.json +13 -2
  248. package/src/api/servers.remote.ts +381 -20
  249. package/src/app.css +98 -3
  250. package/src/app.html +15 -0
  251. package/src/hooks.server.ts +18 -1
  252. package/src/lib/actions/jsonTextarea.ts +395 -0
  253. package/src/lib/components/Breadcrumbs.svelte +7 -58
  254. package/src/lib/components/JsonValue.svelte +279 -85
  255. package/src/lib/components/Modal.svelte +59 -0
  256. package/src/lib/components/OriginWarning.svelte +109 -0
  257. package/src/lib/components/PageSwitcher.svelte +37 -0
  258. package/src/lib/components/Panel.svelte +1 -1
  259. package/src/lib/components/PrettyJson.svelte +112 -36
  260. package/src/lib/components/SearchBox.svelte +161 -97
  261. package/src/lib/components/ThemeSwitcher.svelte +66 -0
  262. package/src/lib/components/Tooltip.svelte +83 -0
  263. package/src/lib/components/TooltipTable.svelte +45 -102
  264. package/src/lib/server/HostsManager.ts +4 -0
  265. package/src/lib/server/aggregation.ts +62 -0
  266. package/src/lib/server/mongo.ts +78 -15
  267. package/src/lib/types.ts +60 -0
  268. package/src/lib/utils/isEmptyObject.ts +6 -0
  269. package/src/lib/utils/jsonParser.ts +9 -1
  270. package/src/lib/utils/logger.ts +42 -0
  271. package/src/lib/utils/omit.ts +3 -0
  272. package/src/routes/+layout.server.ts +2 -1
  273. package/src/routes/+layout.svelte +15 -2
  274. package/src/routes/favicon.ico/+server.ts +8 -0
  275. package/src/routes/servers/+page.server.ts +23 -10
  276. package/src/routes/servers/+page.svelte +44 -10
  277. package/src/routes/servers/[server]/databases/+layout.ts +8 -0
  278. package/src/routes/servers/[server]/databases/+page.server.ts +15 -4
  279. package/src/routes/servers/[server]/databases/[database]/collections/+layout.ts +9 -0
  280. package/src/routes/servers/[server]/databases/[database]/collections/+page.server.ts +0 -2
  281. package/src/routes/servers/[server]/databases/[database]/collections/+page.svelte +67 -8
  282. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+layout.ts +9 -0
  283. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.server.ts +217 -0
  284. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.svelte +342 -0
  285. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.ts +10 -0
  286. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+layout.ts +9 -0
  287. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.server.ts +15 -12
  288. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.svelte +81 -7
  289. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.server.ts +88 -0
  290. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.svelte +333 -0
  291. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.ts +10 -0
  292. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.server.ts +18 -0
  293. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.svelte +378 -0
  294. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.ts +10 -0
  295. package/src/tests/api/aggregation.test.ts +125 -0
  296. package/build/client/_app/immutable/assets/0.CEsPYTp2.css +0 -1
  297. package/build/client/_app/immutable/assets/0.CEsPYTp2.css.br +0 -0
  298. package/build/client/_app/immutable/assets/0.CEsPYTp2.css.gz +0 -0
  299. package/build/client/_app/immutable/assets/6.DawdmtJd.css +0 -1
  300. package/build/client/_app/immutable/assets/6.DawdmtJd.css.br +0 -2
  301. package/build/client/_app/immutable/assets/6.DawdmtJd.css.gz +0 -0
  302. package/build/client/_app/immutable/assets/Panel.BDHMtO-3.css +0 -1
  303. package/build/client/_app/immutable/assets/Panel.BDHMtO-3.css.br +0 -0
  304. package/build/client/_app/immutable/assets/Panel.BDHMtO-3.css.gz +0 -0
  305. package/build/client/_app/immutable/assets/PrettyJson.CtngcfyW.css +0 -1
  306. package/build/client/_app/immutable/assets/PrettyJson.CtngcfyW.css.br +0 -0
  307. package/build/client/_app/immutable/assets/PrettyJson.CtngcfyW.css.gz +0 -0
  308. package/build/client/_app/immutable/chunks/B2-iEFN3.js +0 -2
  309. package/build/client/_app/immutable/chunks/B2-iEFN3.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/B2-iEFN3.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/B5y2vsNr.js +0 -1
  312. package/build/client/_app/immutable/chunks/B5y2vsNr.js.br +0 -0
  313. package/build/client/_app/immutable/chunks/B5y2vsNr.js.gz +0 -0
  314. package/build/client/_app/immutable/chunks/BN_N9-2s.js +0 -1
  315. package/build/client/_app/immutable/chunks/BN_N9-2s.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/BN_N9-2s.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/C1z4TjN7.js +0 -1
  318. package/build/client/_app/immutable/chunks/C1z4TjN7.js.br +0 -0
  319. package/build/client/_app/immutable/chunks/C1z4TjN7.js.gz +0 -0
  320. package/build/client/_app/immutable/chunks/CQBaNlA9.js +0 -1
  321. package/build/client/_app/immutable/chunks/CQBaNlA9.js.br +0 -0
  322. package/build/client/_app/immutable/chunks/CQBaNlA9.js.gz +0 -0
  323. package/build/client/_app/immutable/chunks/CVoOGazw.js +0 -4
  324. package/build/client/_app/immutable/chunks/CVoOGazw.js.br +0 -0
  325. package/build/client/_app/immutable/chunks/CVoOGazw.js.gz +0 -0
  326. package/build/client/_app/immutable/chunks/CapOg2jD.js +0 -1
  327. package/build/client/_app/immutable/chunks/CapOg2jD.js.br +0 -0
  328. package/build/client/_app/immutable/chunks/CapOg2jD.js.gz +0 -0
  329. package/build/client/_app/immutable/chunks/ChWB6xnu.js.br +0 -0
  330. package/build/client/_app/immutable/chunks/ChWB6xnu.js.gz +0 -0
  331. package/build/client/_app/immutable/chunks/CqnBT2zJ.js +0 -1
  332. package/build/client/_app/immutable/chunks/CqnBT2zJ.js.br +0 -0
  333. package/build/client/_app/immutable/chunks/CqnBT2zJ.js.gz +0 -0
  334. package/build/client/_app/immutable/chunks/D069mncP.js +0 -1
  335. package/build/client/_app/immutable/chunks/D069mncP.js.br +0 -0
  336. package/build/client/_app/immutable/chunks/D069mncP.js.gz +0 -0
  337. package/build/client/_app/immutable/chunks/DACrOfV_.js +0 -14
  338. package/build/client/_app/immutable/chunks/DACrOfV_.js.br +0 -0
  339. package/build/client/_app/immutable/chunks/DACrOfV_.js.gz +0 -0
  340. package/build/client/_app/immutable/chunks/DQkpHJGc.js.br +0 -0
  341. package/build/client/_app/immutable/chunks/DQkpHJGc.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/DSDD_hFT.js +0 -1
  343. package/build/client/_app/immutable/chunks/DSDD_hFT.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/DSDD_hFT.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/D_aTX_ol.js +0 -1
  346. package/build/client/_app/immutable/chunks/D_aTX_ol.js.br +0 -0
  347. package/build/client/_app/immutable/chunks/D_aTX_ol.js.gz +0 -0
  348. package/build/client/_app/immutable/chunks/Dg3qHExF.js +0 -1
  349. package/build/client/_app/immutable/chunks/Dg3qHExF.js.br +0 -0
  350. package/build/client/_app/immutable/chunks/Dg3qHExF.js.gz +0 -0
  351. package/build/client/_app/immutable/chunks/Dt6-JRym.js +0 -2
  352. package/build/client/_app/immutable/chunks/Dt6-JRym.js.br +0 -0
  353. package/build/client/_app/immutable/chunks/Dt6-JRym.js.gz +0 -0
  354. package/build/client/_app/immutable/chunks/QoKxaG0e.js +0 -1
  355. package/build/client/_app/immutable/chunks/QoKxaG0e.js.br +0 -2
  356. package/build/client/_app/immutable/chunks/QoKxaG0e.js.gz +0 -0
  357. package/build/client/_app/immutable/chunks/rtveiEyS.js +0 -1
  358. package/build/client/_app/immutable/chunks/rtveiEyS.js.br +0 -0
  359. package/build/client/_app/immutable/chunks/rtveiEyS.js.gz +0 -0
  360. package/build/client/_app/immutable/entry/app.Cc1FNLNH.js +0 -2
  361. package/build/client/_app/immutable/entry/app.Cc1FNLNH.js.br +0 -0
  362. package/build/client/_app/immutable/entry/app.Cc1FNLNH.js.gz +0 -0
  363. package/build/client/_app/immutable/entry/start.CwqlbFyy.js +0 -1
  364. package/build/client/_app/immutable/entry/start.CwqlbFyy.js.br +0 -2
  365. package/build/client/_app/immutable/entry/start.CwqlbFyy.js.gz +0 -0
  366. package/build/client/_app/immutable/nodes/0.wBQEpdjZ.js +0 -1
  367. package/build/client/_app/immutable/nodes/0.wBQEpdjZ.js.br +0 -0
  368. package/build/client/_app/immutable/nodes/0.wBQEpdjZ.js.gz +0 -0
  369. package/build/client/_app/immutable/nodes/1.K6-n7D0b.js +0 -1
  370. package/build/client/_app/immutable/nodes/1.K6-n7D0b.js.br +0 -0
  371. package/build/client/_app/immutable/nodes/1.K6-n7D0b.js.gz +0 -0
  372. package/build/client/_app/immutable/nodes/3.DkGcIF98.js +0 -1
  373. package/build/client/_app/immutable/nodes/3.DkGcIF98.js.br +0 -0
  374. package/build/client/_app/immutable/nodes/3.DkGcIF98.js.gz +0 -0
  375. package/build/client/_app/immutable/nodes/4.C_NxbT98.js +0 -1
  376. package/build/client/_app/immutable/nodes/4.C_NxbT98.js.br +0 -0
  377. package/build/client/_app/immutable/nodes/4.C_NxbT98.js.gz +0 -0
  378. package/build/client/_app/immutable/nodes/5.CFvfYaLM.js +0 -1
  379. package/build/client/_app/immutable/nodes/5.CFvfYaLM.js.br +0 -0
  380. package/build/client/_app/immutable/nodes/5.CFvfYaLM.js.gz +0 -0
  381. package/build/client/_app/immutable/nodes/6.h34Zyorq.js +0 -1
  382. package/build/client/_app/immutable/nodes/6.h34Zyorq.js.br +0 -0
  383. package/build/client/_app/immutable/nodes/6.h34Zyorq.js.gz +0 -0
  384. package/build/client/_app/immutable/nodes/7.BVJmNbU5.js +0 -1
  385. package/build/client/_app/immutable/nodes/7.BVJmNbU5.js.br +0 -0
  386. package/build/client/_app/immutable/nodes/7.BVJmNbU5.js.gz +0 -0
  387. package/build/server/chunks/0-Cb5ytlMI.js.map +0 -1
  388. package/build/server/chunks/1-Cpb7zRtJ.js +0 -9
  389. package/build/server/chunks/1-Cpb7zRtJ.js.map +0 -1
  390. package/build/server/chunks/3-B_DkgZkc.js +0 -69
  391. package/build/server/chunks/3-B_DkgZkc.js.map +0 -1
  392. package/build/server/chunks/4-DzHoLo__.js.map +0 -1
  393. package/build/server/chunks/5-CCWbCDpk.js.map +0 -1
  394. package/build/server/chunks/6-Dok8svjB.js +0 -202
  395. package/build/server/chunks/6-Dok8svjB.js.map +0 -1
  396. package/build/server/chunks/7-CmgJSG2j.js +0 -42
  397. package/build/server/chunks/7-CmgJSG2j.js.map +0 -1
  398. package/build/server/chunks/Panel-Bz0b85EW.js.map +0 -1
  399. package/build/server/chunks/PrettyJson-CX6-dNsW.js +0 -291
  400. package/build/server/chunks/PrettyJson-CX6-dNsW.js.map +0 -1
  401. package/build/server/chunks/TooltipTable-0z4HkHlH.js +0 -17
  402. package/build/server/chunks/TooltipTable-0z4HkHlH.js.map +0 -1
  403. package/build/server/chunks/_layout.svelte-UiDiCQEz.js +0 -111
  404. package/build/server/chunks/_layout.svelte-UiDiCQEz.js.map +0 -1
  405. package/build/server/chunks/_page.svelte-FIp-IsOo.js.map +0 -1
  406. package/build/server/chunks/_page.svelte-FLzHOuyK.js.map +0 -1
  407. package/build/server/chunks/_page.svelte-jxFKbZdN.js.map +0 -1
  408. package/build/server/chunks/_page.svelte-k8avSQW1.js +0 -215
  409. package/build/server/chunks/_page.svelte-k8avSQW1.js.map +0 -1
  410. package/build/server/chunks/_page.svelte-w9cxGvUf.js.map +0 -1
  411. package/build/server/chunks/async-BfR0vYHo.js.map +0 -1
  412. package/build/server/chunks/client-bj7sePQc.js +0 -7
  413. package/build/server/chunks/error.svelte-D5sIJv3P.js +0 -18
  414. package/build/server/chunks/error.svelte-D5sIJv3P.js.map +0 -1
  415. package/build/server/chunks/hooks.server-_TKfdzGA.js +0 -26
  416. package/build/server/chunks/hooks.server-_TKfdzGA.js.map +0 -1
  417. package/build/server/chunks/index3-DquTjlmp.js.map +0 -1
  418. package/build/server/chunks/mongo-dLmCShL_.js.map +0 -1
  419. package/build/server/chunks/remote-xxtqbu-BFzaWXy0.js +0 -234
  420. package/build/server/chunks/remote-xxtqbu-BFzaWXy0.js.map +0 -1
  421. package/build/server/chunks/routing-DcR4fCSD.js.map +0 -1
  422. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+page.server.ts +0 -106
  423. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+page.svelte +0 -174
  424. /package/build/client/_app/immutable/assets/{3.CRKE8WvY.css → 7.CRKE8WvY.css} +0 -0
  425. /package/build/client/_app/immutable/assets/{3.CRKE8WvY.css.br → 7.CRKE8WvY.css.br} +0 -0
  426. /package/build/client/_app/immutable/assets/{3.CRKE8WvY.css.gz → 7.CRKE8WvY.css.gz} +0 -0
@@ -1,11 +1,16 @@
1
1
  <script lang="ts">
2
- import { addServer as addServerCommand, removeServer as removeServerCommand } from "$api/servers.remote";
2
+ import {
3
+ addServer as addServerCommand,
4
+ removeServer as removeServerCommand,
5
+ retryConnection,
6
+ } from "$api/servers.remote";
3
7
  import { invalidateAll } from "$app/navigation";
4
8
  import { resolve } from "$app/paths";
5
9
  import Panel from "$lib/components/Panel.svelte";
6
10
  import TooltipTable from "$lib/components/TooltipTable.svelte";
7
11
  import { notificationStore } from "$lib/stores/notifications.svelte";
8
12
  import { formatBytes, serverName } from "$lib/utils/filters";
13
+ import { SvelteSet } from "svelte/reactivity";
9
14
  import type { PageData } from "./$types";
10
15
 
11
16
  let { data }: { data: PageData } = $props();
@@ -17,6 +22,7 @@
17
22
  let loading = $state(false);
18
23
  let showRemoveModal = $state(false);
19
24
  let serverToRemove: Server | null = null;
25
+ const retryingServers = new SvelteSet<string>();
20
26
 
21
27
  async function addServer() {
22
28
  if (!newServer) return;
@@ -65,6 +71,21 @@
65
71
  closeRemoveModal();
66
72
  }
67
73
  }
74
+
75
+ async function retryServerConnection(server: Server) {
76
+ const name = serverName(server.name);
77
+ retryingServers.add(name);
78
+
79
+ try {
80
+ await retryConnection(name);
81
+ notificationStore.notifySuccess("Connection restored successfully");
82
+ await invalidateAll();
83
+ } catch (error) {
84
+ notificationStore.notifyError(error, "Failed to retry connection");
85
+ } finally {
86
+ retryingServers.delete(name);
87
+ }
88
+ }
68
89
  </script>
69
90
 
70
91
  <svelte:window on:keydown={handleKeyDown} />
@@ -121,7 +142,7 @@
121
142
  </td>
122
143
  <td>
123
144
  {#await server.details}
124
- <span class="text-gray-400">...</span>
145
+ <span style="color: var(--text-secondary);">...</span>
125
146
  {:then details}
126
147
  {#if "databases" in details && details.databases}
127
148
  <TooltipTable
@@ -143,20 +164,33 @@
143
164
  </td>
144
165
  <td>
145
166
  {#await server.details}
146
- <span class="text-gray-400">...</span>
167
+ <span style="color: var(--text-secondary);">...</span>
147
168
  {:then details}
148
169
  {#if "size" in details && details.size !== undefined}
149
170
  {formatBytes(details.size)}
150
171
  {/if}
151
172
  {/await}
152
173
  </td>
153
- <td style="width: 140px">
154
- <button
155
- class="btn btn-outline-danger btn-sm -my-2 hidden group-hover:inline"
156
- onclick={() => openRemoveModal(server)}
157
- >
158
- Remove from list
159
- </button>
174
+ <td style="width: 200px">
175
+ <div class="flex gap-2 justify-end">
176
+ {#await server.details then details}
177
+ {#if "error" in details && details.error}
178
+ <button
179
+ class="btn btn-default btn-sm -my-2 hidden group-hover:inline"
180
+ onclick={() => retryServerConnection(server)}
181
+ disabled={retryingServers.has(serverName(server.name))}
182
+ >
183
+ {retryingServers.has(serverName(server.name)) ? "Retrying..." : "Retry"}
184
+ </button>
185
+ {/if}
186
+ {/await}
187
+ <button
188
+ class="btn btn-outline-danger btn-sm -my-2 hidden group-hover:inline"
189
+ onclick={() => openRemoveModal(server)}
190
+ >
191
+ Remove from list
192
+ </button>
193
+ </div>
160
194
  </td>
161
195
  </tr>
162
196
  {/each}
@@ -0,0 +1,8 @@
1
+ export const load = (event) => {
2
+ return {
3
+ server: event.params.server,
4
+ breadcrumbs: [
5
+ { label: event.params.server, path: `/servers/${encodeURIComponent(event.params.server)}/databases` },
6
+ ],
7
+ };
8
+ };
@@ -1,5 +1,6 @@
1
1
  import { getCollectionJson, getMongo } from "$lib/server/mongo";
2
2
  import type { CollectionJSON, DatabaseStats } from "$lib/types";
3
+ import { logger } from "$lib/utils/logger";
3
4
  import type { PageServerLoad } from "./$types";
4
5
 
5
6
  export const load: PageServerLoad = async ({ params }) => {
@@ -10,15 +11,26 @@ export const load: PageServerLoad = async ({ params }) => {
10
11
 
11
12
  if (!Array.isArray(results.databases)) {
12
13
  return {
13
- server: params.server,
14
14
  databases: [],
15
15
  };
16
16
  }
17
17
 
18
+ const filteredDatabases = mongo.filterDatabases(results.databases);
19
+
18
20
  const databases = await Promise.all(
19
- results.databases.map(async (d) => {
21
+ filteredDatabases.map(async (d) => {
20
22
  const db = client.db(d.name);
21
- const dbStats = (await db.stats()) as DatabaseStats;
23
+ const dbStats: Pick<DatabaseStats, "dataSize" | "avgObjSize" | "storageSize" | "indexSize" | "collections"> =
24
+ await (db.stats() as Promise<DatabaseStats>).catch(() => {
25
+ logger.error(`Error getting stats for database ${d.name} on server ${params.server}`);
26
+ return {
27
+ dataSize: 0,
28
+ avgObjSize: 0,
29
+ storageSize: 0,
30
+ indexSize: 0,
31
+ collections: 0,
32
+ };
33
+ });
22
34
 
23
35
  const collectionsJson = db
24
36
  .listCollections()
@@ -41,7 +53,6 @@ export const load: PageServerLoad = async ({ params }) => {
41
53
  );
42
54
 
43
55
  return {
44
- server: params.server,
45
56
  databases,
46
57
  };
47
58
  };
@@ -0,0 +1,9 @@
1
+ export const load = async (event) => {
2
+ return {
3
+ database: event.params.database,
4
+ breadcrumbs: [
5
+ ...(await event.parent()).breadcrumbs,
6
+ { label: event.params.database, path: `/${encodeURIComponent(event.params.database)}/collections` },
7
+ ],
8
+ };
9
+ };
@@ -14,8 +14,6 @@ export const load: PageServerLoad = async ({ params }) => {
14
14
  }));
15
15
 
16
16
  return {
17
- server: params.server,
18
- database: params.database,
19
17
  collections: collectionsWithDetails,
20
18
  };
21
19
  };
@@ -1,11 +1,48 @@
1
1
  <script lang="ts">
2
+ import { dropCollection as dropCollectionCommand } from "$api/servers.remote";
3
+ import { invalidateAll } from "$app/navigation";
2
4
  import { resolve } from "$app/paths";
5
+ import Modal from "$lib/components/Modal.svelte";
3
6
  import Panel from "$lib/components/Panel.svelte";
4
7
  import TooltipTable from "$lib/components/TooltipTable.svelte";
8
+ import { notificationStore } from "$lib/stores/notifications.svelte";
5
9
  import { formatBytes, formatNumber } from "$lib/utils/filters";
6
10
  import type { PageData } from "./$types";
7
11
 
8
12
  let { data }: { data: PageData } = $props();
13
+
14
+ type Collection = PageData["collections"][number];
15
+
16
+ let showDropModal = $state(false);
17
+ let collectionToDrop = $state<Collection | null>(null);
18
+
19
+ function openDropModal(collection: Collection) {
20
+ collectionToDrop = collection;
21
+ showDropModal = true;
22
+ }
23
+
24
+ function closeDropModal() {
25
+ showDropModal = false;
26
+ collectionToDrop = null;
27
+ }
28
+
29
+ async function confirmDrop() {
30
+ if (!collectionToDrop) return;
31
+
32
+ try {
33
+ await dropCollectionCommand({
34
+ server: data.server,
35
+ database: data.database,
36
+ collection: collectionToDrop.name,
37
+ });
38
+ notificationStore.notifySuccess(`Collection "${collectionToDrop.name}" dropped successfully`);
39
+ closeDropModal();
40
+ // Reload the page to get updated collections
41
+ await invalidateAll();
42
+ } catch (error) {
43
+ notificationStore.notifyError(error, "Failed to drop collection");
44
+ }
45
+ }
9
46
  </script>
10
47
 
11
48
  <Panel title="{data.database} collections">
@@ -16,20 +53,19 @@
16
53
  <th>Documents</th>
17
54
  <th>Indexes</th>
18
55
  <th>Size</th>
56
+ <th></th>
19
57
  </tr>
20
58
  </thead>
21
59
  <tbody>
22
60
  {#if data.collections && data.collections.length > 0}
23
61
  {#each data.collections as collection (collection.name)}
24
- <tr>
62
+ <tr class="group">
25
63
  <td>
26
64
  <a
27
65
  href={resolve(
28
66
  `/servers/${encodeURIComponent(data.server)}/databases/${encodeURIComponent(
29
67
  data.database,
30
- )}/collections/${encodeURIComponent(collection.name)}?query=${encodeURIComponent(
31
- "{}",
32
- )}&sort=&project=&skip=0&limit=20`,
68
+ )}/collections/${encodeURIComponent(collection.name)}/documents`,
33
69
  )}
34
70
  >
35
71
  {collection.name}
@@ -37,7 +73,7 @@
37
73
  </td>
38
74
  <td>
39
75
  {#await collection.details}
40
- <span class="text-gray-400">...</span>
76
+ <span style="color: var(--text-secondary);">...</span>
41
77
  {:then details}
42
78
  {#if details}
43
79
  {formatNumber(details.count)}
@@ -48,7 +84,7 @@
48
84
  </td>
49
85
  <td>
50
86
  {#await collection.details}
51
- <span class="text-gray-400">...</span>
87
+ <span style="color: var(--text-secondary);">...</span>
52
88
  {:then details}
53
89
  {#if details}
54
90
  <TooltipTable
@@ -70,7 +106,7 @@
70
106
  </td>
71
107
  <td>
72
108
  {#await collection.details}
73
- <span class="text-gray-400">...</span>
109
+ <span style="color: var(--text-secondary);">...</span>
74
110
  {:then details}
75
111
  {#if details}
76
112
  <TooltipTable
@@ -96,11 +132,23 @@
96
132
  {/if}
97
133
  {/await}
98
134
  </td>
135
+ <td style="width: 100px">
136
+ <div class="flex justify-end">
137
+ {#if !data.readOnly}
138
+ <button
139
+ class="btn btn-outline-danger btn-sm -my-2 hidden group-hover:inline"
140
+ onclick={() => openDropModal(collection)}
141
+ >
142
+ Drop
143
+ </button>
144
+ {/if}
145
+ </div>
146
+ </td>
99
147
  </tr>
100
148
  {/each}
101
149
  {:else}
102
150
  <tr>
103
- <td colspan="4">
151
+ <td colspan="5">
104
152
  <div class="text-center">No collections...</div>
105
153
  </td>
106
154
  </tr>
@@ -108,3 +156,14 @@
108
156
  </tbody>
109
157
  </table>
110
158
  </Panel>
159
+
160
+ <Modal show={showDropModal} onclose={closeDropModal} title="Drop Collection">
161
+ <p>
162
+ Are you sure you want to drop the collection <strong>{collectionToDrop?.name}</strong>? This action cannot be
163
+ undone.
164
+ </p>
165
+ {#snippet footer()}
166
+ <button class="btn btn-default btn-sm" onclick={closeDropModal}>Cancel</button>
167
+ <button class="btn btn-outline-danger btn-sm" onclick={confirmDrop}>Drop Collection</button>
168
+ {/snippet}
169
+ </Modal>
@@ -0,0 +1,9 @@
1
+ export const load = async (event) => {
2
+ return {
3
+ collection: event.params.collection,
4
+ breadcrumbs: [
5
+ ...(await event.parent()).breadcrumbs,
6
+ { label: event.params.collection, path: `/${event.params.collection}/documents` },
7
+ ],
8
+ };
9
+ };
@@ -0,0 +1,217 @@
1
+ import { validateAggregationPipeline } from "$lib/server/aggregation";
2
+ import JsonEncoder from "$lib/server/JsonEncoder";
3
+ import { getMongo } from "$lib/server/mongo";
4
+ import { type MongoDocument } from "$lib/types";
5
+ import { isEmptyObject } from "$lib/utils/isEmptyObject";
6
+ import { parseJSON } from "$lib/utils/jsonParser";
7
+ import { logger } from "$lib/utils/logger";
8
+ import type { Document } from "mongodb";
9
+ import type { PageServerLoad } from "./$types";
10
+
11
+ export const load: PageServerLoad = async ({ params, url }) => {
12
+ const query = url.searchParams.get("query") || "{}";
13
+ const sort = url.searchParams.get("sort") || "{}";
14
+ const project = url.searchParams.get("project") || "{}";
15
+ const skip = parseInt(url.searchParams.get("skip") || "0", 10);
16
+ const limit = parseInt(url.searchParams.get("limit") || "20", 10);
17
+
18
+ // Parse JSON strings - return error state if invalid instead of throwing
19
+ let queryDoc: unknown;
20
+ let parseError: string | null = null;
21
+
22
+ try {
23
+ queryDoc = parseJSON(query, { allowArray: true });
24
+ } catch (err) {
25
+ parseError = `Invalid query: ${err}`;
26
+ }
27
+
28
+ if (!parseError) {
29
+ try {
30
+ parseJSON(sort);
31
+ } catch (err) {
32
+ parseError = `Invalid sort: ${err}`;
33
+ }
34
+ }
35
+
36
+ if (!parseError) {
37
+ try {
38
+ parseJSON(project);
39
+ } catch (err) {
40
+ parseError = `Invalid project: ${err}`;
41
+ }
42
+ }
43
+
44
+ // If there's a parse error, return the page with error state
45
+ if (parseError) {
46
+ return {
47
+ results: Promise.resolve({
48
+ data: [],
49
+ error: parseError,
50
+ }),
51
+ count: Promise.resolve({
52
+ data: 0,
53
+ error: null,
54
+ }),
55
+ params: {
56
+ query,
57
+ sort,
58
+ project,
59
+ skip,
60
+ limit,
61
+ },
62
+ isAggregation: false,
63
+ };
64
+ }
65
+
66
+ const sortDoc = parseJSON(sort);
67
+ const projectDoc = parseJSON(project) as Document;
68
+
69
+ const mongo = await getMongo();
70
+ const client = mongo.getClient(params.server);
71
+ const collection = client.db(params.database).collection(params.collection);
72
+
73
+ if (Array.isArray(queryDoc)) {
74
+ // Validate aggregation pipeline
75
+ try {
76
+ validateAggregationPipeline(queryDoc);
77
+ } catch (err) {
78
+ const validationError = `Invalid aggregation pipeline: ${err instanceof Error ? err.message : String(err)}`;
79
+ return {
80
+ results: Promise.resolve({
81
+ data: [],
82
+ error: validationError,
83
+ }),
84
+ count: Promise.resolve({
85
+ data: 0,
86
+ error: null,
87
+ }),
88
+ params: {
89
+ query,
90
+ sort,
91
+ project,
92
+ skip,
93
+ limit,
94
+ },
95
+ isAggregation: true,
96
+ };
97
+ }
98
+ // Execute aggregation
99
+ const pipeline = JsonEncoder.decode(queryDoc);
100
+
101
+ const resultsPromise = collection
102
+ .aggregate(
103
+ [
104
+ ...pipeline,
105
+ ...(isEmptyObject(projectDoc) ? [] : [{ $project: projectDoc }]),
106
+ ...(isEmptyObject(sortDoc as object) ? [] : [{ $sort: sortDoc }]),
107
+ { $limit: limit },
108
+ { $skip: skip },
109
+ ],
110
+ {
111
+ maxTimeMS: mongo.getQueryTimeout(),
112
+ },
113
+ )
114
+ .map((obj) => JsonEncoder.encode(obj))
115
+ .toArray()
116
+ .then((results) => ({
117
+ data: results as MongoDocument[],
118
+ error: null as string | null,
119
+ }))
120
+ .catch((err) => {
121
+ logger.error("Error executing aggregation:", err);
122
+ return {
123
+ data: [] as MongoDocument[],
124
+ error: `Failed to execute aggregation: ${err instanceof Error ? err.message : String(err)}`,
125
+ };
126
+ });
127
+
128
+ // For aggregations, we can't easily get a count, so we return the result count
129
+ const countPromise = collection
130
+ .aggregate([...pipeline, { $count: "count" }], { maxTimeMS: mongo.getCountTimeout() })
131
+ .next()
132
+ .then((result) => ({
133
+ data: result?.count ?? 0,
134
+ error: null,
135
+ }))
136
+ .catch((err) => {
137
+ logger.error("Error counting documents:", err);
138
+ return {
139
+ data: 0,
140
+ error: `Failed to count documents: ${err instanceof Error ? err.message : String(err)}`,
141
+ };
142
+ });
143
+
144
+ return {
145
+ results: resultsPromise,
146
+ count: countPromise,
147
+ params: {
148
+ query,
149
+ sort,
150
+ project,
151
+ skip,
152
+ limit,
153
+ },
154
+ isAggregation: true,
155
+ };
156
+ }
157
+
158
+ const resultsPromise = collection
159
+ .find(JsonEncoder.decode(queryDoc), { maxTimeMS: mongo.getQueryTimeout() })
160
+ .project(projectDoc)
161
+ .sort(JsonEncoder.decode(sortDoc))
162
+ .limit(limit)
163
+ .skip(skip)
164
+ .map((obj) => JsonEncoder.encode(obj))
165
+ .toArray()
166
+ .then((results) => ({
167
+ data: results as MongoDocument[],
168
+ error: null as string | null,
169
+ }))
170
+ .catch((err) => {
171
+ logger.error("Error fetching query results:", err);
172
+ return {
173
+ data: [] as MongoDocument[],
174
+ error: `Failed to fetch query results: ${err instanceof Error ? err.message : String(err)}`,
175
+ };
176
+ });
177
+
178
+ const countPromise = (async () => {
179
+ try {
180
+ if (queryDoc && Object.keys(queryDoc).length > 0) {
181
+ return {
182
+ data: await collection.countDocuments(JsonEncoder.decode(queryDoc), {
183
+ maxTimeMS: mongo.getCountTimeout(),
184
+ }),
185
+ error: null as string | null,
186
+ };
187
+ } else {
188
+ // fast count
189
+ return {
190
+ data: await collection.estimatedDocumentCount(),
191
+ error: null as string | null,
192
+ };
193
+ }
194
+ } catch (err) {
195
+ logger.error("Error counting documents:", err);
196
+ return {
197
+ data: 0,
198
+ error: `Failed to count documents: ${err instanceof Error ? err.message : String(err)}`,
199
+ };
200
+ }
201
+ })();
202
+
203
+ return {
204
+ // Stream these promises to the client
205
+ results: resultsPromise,
206
+ count: countPromise,
207
+ mappings: await client.getMappings(params.database, params.collection),
208
+ params: {
209
+ query,
210
+ sort,
211
+ project,
212
+ skip,
213
+ limit,
214
+ },
215
+ isAggregation: false,
216
+ };
217
+ };