mongoku 2.0.1 → 2.0.3

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 (292) hide show
  1. package/Dockerfile +27 -0
  2. package/README.md +8 -0
  3. package/build/client/_app/immutable/assets/0.BHsXFfsc.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/PrettyJson.CtngcfyW.css.gz +0 -0
  5. package/build/client/_app/immutable/chunks/{W-qL5_8w.js → BAM9w9EL.js} +1 -1
  6. package/build/client/_app/immutable/chunks/BAM9w9EL.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/BAM9w9EL.js.gz +0 -0
  8. package/build/client/_app/immutable/chunks/BKCvWebR.js +23 -0
  9. package/build/client/_app/immutable/chunks/BKCvWebR.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/BKCvWebR.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/{Dbyirw23.js → BMa204Dm.js} +3 -3
  12. package/build/client/_app/immutable/chunks/BMa204Dm.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/BMa204Dm.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/BN_N9-2s.js.gz +0 -0
  15. package/build/client/_app/immutable/chunks/BY57TmdO.js +1 -0
  16. package/build/client/_app/immutable/chunks/BY57TmdO.js.br +0 -0
  17. package/build/client/_app/immutable/chunks/BY57TmdO.js.gz +0 -0
  18. package/build/client/_app/immutable/chunks/BaB-cr9N.js +2 -0
  19. package/build/client/_app/immutable/chunks/BaB-cr9N.js.br +0 -0
  20. package/build/client/_app/immutable/chunks/BaB-cr9N.js.gz +0 -0
  21. package/build/client/_app/immutable/chunks/BdR-m9Ad.js +1 -0
  22. package/build/client/_app/immutable/chunks/BdR-m9Ad.js.br +0 -0
  23. package/build/client/_app/immutable/chunks/BdR-m9Ad.js.gz +0 -0
  24. package/build/client/_app/immutable/chunks/ByjLCPv2.js +1 -0
  25. package/build/client/_app/immutable/chunks/ByjLCPv2.js.br +0 -0
  26. package/build/client/_app/immutable/chunks/ByjLCPv2.js.gz +0 -0
  27. package/build/client/_app/immutable/chunks/BzAcxkRZ.js +4 -0
  28. package/build/client/_app/immutable/chunks/BzAcxkRZ.js.br +0 -0
  29. package/build/client/_app/immutable/chunks/BzAcxkRZ.js.gz +0 -0
  30. package/build/client/_app/immutable/chunks/CyQLXPZI.js +2 -0
  31. package/build/client/_app/immutable/chunks/CyQLXPZI.js.br +0 -0
  32. package/build/client/_app/immutable/chunks/CyQLXPZI.js.gz +0 -0
  33. package/build/client/_app/immutable/chunks/D17Lj1H7.js +1 -0
  34. package/build/client/_app/immutable/chunks/D17Lj1H7.js.br +0 -0
  35. package/build/client/_app/immutable/chunks/D17Lj1H7.js.gz +0 -0
  36. package/build/client/_app/immutable/chunks/D4VhtiDg.js +1 -0
  37. package/build/client/_app/immutable/chunks/D4VhtiDg.js.br +0 -0
  38. package/build/client/_app/immutable/chunks/D4VhtiDg.js.gz +0 -0
  39. package/build/client/_app/immutable/chunks/D72Du7TF.js +1 -0
  40. package/build/client/_app/immutable/chunks/D72Du7TF.js.br +2 -0
  41. package/build/client/_app/immutable/chunks/D72Du7TF.js.gz +0 -0
  42. package/build/client/_app/immutable/chunks/{DZSJW-Zm.js → XYFbSe2V.js} +1 -1
  43. package/build/client/_app/immutable/chunks/XYFbSe2V.js.br +0 -0
  44. package/build/client/_app/immutable/chunks/XYFbSe2V.js.gz +0 -0
  45. package/build/client/_app/immutable/chunks/iHsChU5o.js +1 -0
  46. package/build/client/_app/immutable/chunks/iHsChU5o.js.br +0 -0
  47. package/build/client/_app/immutable/chunks/iHsChU5o.js.gz +0 -0
  48. package/build/client/_app/immutable/chunks/{DzSHMQR7.js → p23QjN60.js} +1 -1
  49. package/build/client/_app/immutable/chunks/p23QjN60.js.br +2 -0
  50. package/build/client/_app/immutable/chunks/p23QjN60.js.gz +0 -0
  51. package/build/client/_app/immutable/chunks/sBKW2MYH.js +1 -0
  52. package/build/client/_app/immutable/chunks/sBKW2MYH.js.br +0 -0
  53. package/build/client/_app/immutable/chunks/sBKW2MYH.js.gz +0 -0
  54. package/build/client/_app/immutable/chunks/{BEuO9qGi.js → uMNMODvc.js} +1 -1
  55. package/build/client/_app/immutable/chunks/uMNMODvc.js.br +0 -0
  56. package/build/client/_app/immutable/chunks/uMNMODvc.js.gz +0 -0
  57. package/build/client/_app/immutable/entry/app.9nC_873E.js +2 -0
  58. package/build/client/_app/immutable/entry/app.9nC_873E.js.br +0 -0
  59. package/build/client/_app/immutable/entry/app.9nC_873E.js.gz +0 -0
  60. package/build/client/_app/immutable/entry/start.Bn88Alw2.js +1 -0
  61. package/build/client/_app/immutable/entry/start.Bn88Alw2.js.br +2 -0
  62. package/build/client/_app/immutable/entry/start.Bn88Alw2.js.gz +0 -0
  63. package/build/client/_app/immutable/nodes/{0.B2lBDs71.js → 0.COxTCtn2.js} +1 -1
  64. package/build/client/_app/immutable/nodes/0.COxTCtn2.js.br +0 -0
  65. package/build/client/_app/immutable/nodes/0.COxTCtn2.js.gz +0 -0
  66. package/build/client/_app/immutable/nodes/1.Bc8yPK_D.js +1 -0
  67. package/build/client/_app/immutable/nodes/1.Bc8yPK_D.js.br +0 -0
  68. package/build/client/_app/immutable/nodes/1.Bc8yPK_D.js.gz +0 -0
  69. package/build/client/_app/immutable/nodes/3.CI2GcqTf.js +1 -0
  70. package/build/client/_app/immutable/nodes/3.CI2GcqTf.js.br +0 -0
  71. package/build/client/_app/immutable/nodes/3.CI2GcqTf.js.gz +0 -0
  72. package/build/client/_app/immutable/nodes/{4.BqBphmVX.js → 4.ChSdW7ac.js} +1 -1
  73. package/build/client/_app/immutable/nodes/4.ChSdW7ac.js.br +0 -0
  74. package/build/client/_app/immutable/nodes/4.ChSdW7ac.js.gz +0 -0
  75. package/build/client/_app/immutable/nodes/{5.BkAWRgl4.js → 5.DaMML2go.js} +1 -1
  76. package/build/client/_app/immutable/nodes/5.DaMML2go.js.br +0 -0
  77. package/build/client/_app/immutable/nodes/5.DaMML2go.js.gz +0 -0
  78. package/build/client/_app/immutable/nodes/6.Dcq0qwvO.js +1 -0
  79. package/build/client/_app/immutable/nodes/6.Dcq0qwvO.js.br +0 -0
  80. package/build/client/_app/immutable/nodes/6.Dcq0qwvO.js.gz +0 -0
  81. package/build/client/_app/immutable/nodes/7.CU-ncPes.js +1 -0
  82. package/build/client/_app/immutable/nodes/7.CU-ncPes.js.br +0 -0
  83. package/build/client/_app/immutable/nodes/7.CU-ncPes.js.gz +0 -0
  84. package/build/client/_app/version.json +1 -1
  85. package/build/client/_app/version.json.br +0 -0
  86. package/build/client/_app/version.json.gz +0 -0
  87. package/build/server/chunks/{0-BGoFMRn2.js → 0-C1NyHW8A.js} +3 -3
  88. package/build/server/chunks/{0-BGoFMRn2.js.map → 0-C1NyHW8A.js.map} +1 -1
  89. package/build/server/chunks/1-CThf4W5r.js +9 -0
  90. package/build/server/chunks/{1-Ch0AY58K.js.map → 1-CThf4W5r.js.map} +1 -1
  91. package/build/server/chunks/{3-Bmk9Qof9.js → 3-CJf0NbiV.js} +3 -3
  92. package/build/server/chunks/{3-Bmk9Qof9.js.map → 3-CJf0NbiV.js.map} +1 -1
  93. package/build/server/chunks/{4-DnpScx2e.js → 4-Dfbpsagm.js} +3 -3
  94. package/build/server/chunks/{4-DnpScx2e.js.map → 4-Dfbpsagm.js.map} +1 -1
  95. package/build/server/chunks/{5-Bw8bTTBj.js → 5-DLB6GOjf.js} +3 -3
  96. package/build/server/chunks/{5-Bw8bTTBj.js.map → 5-DLB6GOjf.js.map} +1 -1
  97. package/build/server/chunks/{6-D8zNoyW_.js → 6-DfCARDKO.js} +10 -5
  98. package/build/server/chunks/6-DfCARDKO.js.map +1 -0
  99. package/build/server/chunks/{7-Cim4qVL3.js → 7-B5o4OymX.js} +3 -3
  100. package/build/server/chunks/{7-Cim4qVL3.js.map → 7-B5o4OymX.js.map} +1 -1
  101. package/build/server/chunks/{Panel-DTdYk-gk.js → Panel-Box8ld78.js} +3 -3
  102. package/build/server/chunks/Panel-Box8ld78.js.map +1 -0
  103. package/build/server/chunks/{PrettyJson-wIuHvehp.js → PrettyJson-C2c9xGNo.js} +5 -5
  104. package/build/server/chunks/PrettyJson-C2c9xGNo.js.map +1 -0
  105. package/build/server/chunks/{TooltipTable-J278e1CA.js → TooltipTable-0z4HkHlH.js} +3 -1
  106. package/build/server/chunks/TooltipTable-0z4HkHlH.js.map +1 -0
  107. package/build/server/chunks/{_layout.svelte-D7RD9tLN.js → _layout.svelte-CU7AVRSZ.js} +14 -11
  108. package/build/server/chunks/_layout.svelte-CU7AVRSZ.js.map +1 -0
  109. package/build/server/chunks/{_page.svelte-4PYYtPii.js → _page.svelte-B_T8EFk3.js} +7 -6
  110. package/build/server/chunks/_page.svelte-B_T8EFk3.js.map +1 -0
  111. package/build/server/chunks/{_page.svelte-Be5VTn1e.js → _page.svelte-CflJkclc.js} +7 -6
  112. package/build/server/chunks/_page.svelte-CflJkclc.js.map +1 -0
  113. package/build/server/chunks/{_page.svelte-DZ59Sr3N.js → _page.svelte-D1QIZqLv.js} +65 -42
  114. package/build/server/chunks/_page.svelte-D1QIZqLv.js.map +1 -0
  115. package/build/server/chunks/{_page.svelte-DIPUjSjm.js → _page.svelte-PuIVQ52p.js} +20 -8
  116. package/build/server/chunks/_page.svelte-PuIVQ52p.js.map +1 -0
  117. package/build/server/chunks/_page.svelte-zlHeUnJK.js +101 -0
  118. package/build/server/chunks/_page.svelte-zlHeUnJK.js.map +1 -0
  119. package/build/server/chunks/{context-BU6gUbSI.js → async-BfR0vYHo.js} +8 -46
  120. package/build/server/chunks/async-BfR0vYHo.js.map +1 -0
  121. package/build/server/chunks/client-bj7sePQc.js +7 -0
  122. package/build/server/chunks/{client-BZtxOgbR.js.map → client-bj7sePQc.js.map} +1 -1
  123. package/build/server/chunks/{client2-LilSGYJA.js → client2-BX4-xbM4.js} +6 -5
  124. package/build/server/chunks/{client2-LilSGYJA.js.map → client2-BX4-xbM4.js.map} +1 -1
  125. package/build/server/chunks/error.svelte-D5sIJv3P.js +18 -0
  126. package/build/server/chunks/error.svelte-D5sIJv3P.js.map +1 -0
  127. package/build/server/chunks/event-DVH-6ISX.js +64 -0
  128. package/build/server/chunks/event-DVH-6ISX.js.map +1 -0
  129. package/build/server/chunks/{exports-DiyTWREe.js → exports-Cv9LZeD1.js} +2 -39
  130. package/build/server/chunks/exports-Cv9LZeD1.js.map +1 -0
  131. package/build/server/chunks/hooks.server-_TKfdzGA.js +26 -0
  132. package/build/server/chunks/hooks.server-_TKfdzGA.js.map +1 -0
  133. package/build/server/chunks/{index-XFKuhGxM.js → index-EKt9-9bV.js} +2 -2
  134. package/build/server/chunks/{index-XFKuhGxM.js.map → index-EKt9-9bV.js.map} +1 -1
  135. package/build/server/chunks/{index3-CUhdJ7wv.js → index3-DquTjlmp.js} +3 -3
  136. package/build/server/chunks/index3-DquTjlmp.js.map +1 -0
  137. package/build/server/chunks/{notifications.svelte-CrTIrfvL.js → notifications.svelte-CIqkoPWX.js} +6 -12
  138. package/build/server/chunks/notifications.svelte-CIqkoPWX.js.map +1 -0
  139. package/build/server/chunks/remote-xxtqbu-BFzaWXy0.js +234 -0
  140. package/build/server/chunks/remote-xxtqbu-BFzaWXy0.js.map +1 -0
  141. package/build/server/chunks/{routing-zIlQn_LN.js → routing-Ddj5b-2K.js} +25 -4
  142. package/build/server/chunks/routing-Ddj5b-2K.js.map +1 -0
  143. package/build/server/chunks/{server2-DfQrrcsk.js → server2-BOoUfKd7.js} +3 -3
  144. package/build/server/chunks/{server2-DfQrrcsk.js.map → server2-BOoUfKd7.js.map} +1 -1
  145. package/build/server/chunks/{state.svelte-s-CFCWQX.js → state.svelte-CRHA9yov.js} +3 -2
  146. package/build/server/chunks/{state.svelte-s-CFCWQX.js.map → state.svelte-CRHA9yov.js.map} +1 -1
  147. package/build/server/chunks/utils-DGYJFmnf.js +39 -0
  148. package/build/server/chunks/utils-DGYJFmnf.js.map +1 -0
  149. package/build/server/index.js +71 -24
  150. package/build/server/index.js.map +1 -1
  151. package/build/server/manifest.js +9 -30
  152. package/build/server/manifest.js.map +1 -1
  153. package/cli.ts +148 -0
  154. package/dist/cli.js +3 -4
  155. package/ecosystem.config.js +9 -0
  156. package/package.json +88 -81
  157. package/src/api/servers.remote.ts +98 -0
  158. package/src/app.css +228 -0
  159. package/src/app.d.ts +16 -0
  160. package/src/app.html +11 -0
  161. package/src/hooks.server.ts +34 -0
  162. package/src/lib/components/Breadcrumbs.svelte +133 -0
  163. package/src/lib/components/JsonValue.svelte +248 -0
  164. package/src/lib/components/Notifications.svelte +81 -0
  165. package/src/lib/components/Panel.svelte +37 -0
  166. package/src/lib/components/PrettyJson.svelte +187 -0
  167. package/src/lib/components/SearchBox.svelte +160 -0
  168. package/src/lib/components/TooltipTable.svelte +137 -0
  169. package/src/lib/server/HostsManager.ts +105 -0
  170. package/src/lib/server/JsonEncoder.ts +62 -0
  171. package/src/lib/server/mongo.ts +199 -0
  172. package/src/lib/stores/notifications.svelte.ts +45 -0
  173. package/src/lib/types.ts +56 -0
  174. package/src/lib/utils/filters.ts +25 -0
  175. package/src/lib/utils/jsonParser.ts +125 -0
  176. package/src/routes/+layout.server.ts +7 -0
  177. package/src/routes/+layout.svelte +27 -0
  178. package/src/routes/+page.server.ts +6 -0
  179. package/src/routes/servers/+page.server.ts +53 -0
  180. package/src/routes/servers/+page.svelte +196 -0
  181. package/src/routes/servers/[server]/databases/+page.server.ts +47 -0
  182. package/src/routes/servers/[server]/databases/+page.svelte +88 -0
  183. package/src/routes/servers/[server]/databases/[database]/collections/+page.server.ts +21 -0
  184. package/src/routes/servers/[server]/databases/[database]/collections/+page.svelte +110 -0
  185. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+page.server.ts +106 -0
  186. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+page.svelte +174 -0
  187. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.server.ts +25 -0
  188. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.svelte +90 -0
  189. package/src/tests/api/readonly.test.ts +89 -0
  190. package/src/tests/setup.ts +19 -0
  191. package/svelte.config.js +28 -0
  192. package/tsconfig.cli.json +15 -0
  193. package/tsconfig.json +19 -0
  194. package/vite.config.ts +7 -0
  195. package/build/client/_app/immutable/chunks/B-Z1NsR7.js +0 -1
  196. package/build/client/_app/immutable/chunks/B-Z1NsR7.js.br +0 -0
  197. package/build/client/_app/immutable/chunks/B-Z1NsR7.js.gz +0 -0
  198. package/build/client/_app/immutable/chunks/BEuO9qGi.js.br +0 -0
  199. package/build/client/_app/immutable/chunks/BEuO9qGi.js.gz +0 -0
  200. package/build/client/_app/immutable/chunks/BuIrCFA_.js +0 -1
  201. package/build/client/_app/immutable/chunks/BuIrCFA_.js.br +0 -0
  202. package/build/client/_app/immutable/chunks/BuIrCFA_.js.gz +0 -0
  203. package/build/client/_app/immutable/chunks/C9b4uNov.js +0 -1
  204. package/build/client/_app/immutable/chunks/C9b4uNov.js.br +0 -0
  205. package/build/client/_app/immutable/chunks/C9b4uNov.js.gz +0 -0
  206. package/build/client/_app/immutable/chunks/CIYBIyvN.js +0 -1
  207. package/build/client/_app/immutable/chunks/CIYBIyvN.js.br +0 -0
  208. package/build/client/_app/immutable/chunks/CIYBIyvN.js.gz +0 -0
  209. package/build/client/_app/immutable/chunks/CWUhQKKC.js +0 -1
  210. package/build/client/_app/immutable/chunks/CWUhQKKC.js.br +0 -0
  211. package/build/client/_app/immutable/chunks/CWUhQKKC.js.gz +0 -0
  212. package/build/client/_app/immutable/chunks/CrJSDly5.js +0 -2
  213. package/build/client/_app/immutable/chunks/CrJSDly5.js.br +0 -0
  214. package/build/client/_app/immutable/chunks/CrJSDly5.js.gz +0 -0
  215. package/build/client/_app/immutable/chunks/DRy_44ib.js +0 -1
  216. package/build/client/_app/immutable/chunks/DRy_44ib.js.br +0 -0
  217. package/build/client/_app/immutable/chunks/DRy_44ib.js.gz +0 -0
  218. package/build/client/_app/immutable/chunks/DS5yzhLt.js +0 -1
  219. package/build/client/_app/immutable/chunks/DS5yzhLt.js.br +0 -0
  220. package/build/client/_app/immutable/chunks/DS5yzhLt.js.gz +0 -0
  221. package/build/client/_app/immutable/chunks/DZSJW-Zm.js.br +0 -0
  222. package/build/client/_app/immutable/chunks/DZSJW-Zm.js.gz +0 -0
  223. package/build/client/_app/immutable/chunks/Dbyirw23.js.br +0 -0
  224. package/build/client/_app/immutable/chunks/Dbyirw23.js.gz +0 -0
  225. package/build/client/_app/immutable/chunks/DsnmJJEf.js +0 -1
  226. package/build/client/_app/immutable/chunks/DsnmJJEf.js.br +0 -2
  227. package/build/client/_app/immutable/chunks/DsnmJJEf.js.gz +0 -0
  228. package/build/client/_app/immutable/chunks/DzSHMQR7.js.br +0 -0
  229. package/build/client/_app/immutable/chunks/DzSHMQR7.js.gz +0 -0
  230. package/build/client/_app/immutable/chunks/W-qL5_8w.js.br +0 -0
  231. package/build/client/_app/immutable/chunks/W-qL5_8w.js.gz +0 -0
  232. package/build/client/_app/immutable/chunks/aB6hH3ax.js +0 -3
  233. package/build/client/_app/immutable/chunks/aB6hH3ax.js.br +0 -0
  234. package/build/client/_app/immutable/chunks/aB6hH3ax.js.gz +0 -0
  235. package/build/client/_app/immutable/chunks/nJ6DKbk8.js +0 -1
  236. package/build/client/_app/immutable/chunks/nJ6DKbk8.js.br +0 -0
  237. package/build/client/_app/immutable/chunks/nJ6DKbk8.js.gz +0 -0
  238. package/build/client/_app/immutable/chunks/zeTqHWB5.js +0 -2
  239. package/build/client/_app/immutable/chunks/zeTqHWB5.js.br +0 -0
  240. package/build/client/_app/immutable/chunks/zeTqHWB5.js.gz +0 -0
  241. package/build/client/_app/immutable/entry/app.CW91YXu8.js +0 -2
  242. package/build/client/_app/immutable/entry/app.CW91YXu8.js.br +0 -0
  243. package/build/client/_app/immutable/entry/app.CW91YXu8.js.gz +0 -0
  244. package/build/client/_app/immutable/entry/start.CidwPVgO.js +0 -1
  245. package/build/client/_app/immutable/entry/start.CidwPVgO.js.br +0 -2
  246. package/build/client/_app/immutable/entry/start.CidwPVgO.js.gz +0 -0
  247. package/build/client/_app/immutable/nodes/0.B2lBDs71.js.br +0 -0
  248. package/build/client/_app/immutable/nodes/0.B2lBDs71.js.gz +0 -0
  249. package/build/client/_app/immutable/nodes/1.CueZCvtl.js +0 -1
  250. package/build/client/_app/immutable/nodes/1.CueZCvtl.js.br +0 -0
  251. package/build/client/_app/immutable/nodes/1.CueZCvtl.js.gz +0 -0
  252. package/build/client/_app/immutable/nodes/3.alYAlI3j.js +0 -1
  253. package/build/client/_app/immutable/nodes/3.alYAlI3j.js.br +0 -0
  254. package/build/client/_app/immutable/nodes/3.alYAlI3j.js.gz +0 -0
  255. package/build/client/_app/immutable/nodes/4.BqBphmVX.js.br +0 -0
  256. package/build/client/_app/immutable/nodes/4.BqBphmVX.js.gz +0 -0
  257. package/build/client/_app/immutable/nodes/5.BkAWRgl4.js.br +0 -0
  258. package/build/client/_app/immutable/nodes/5.BkAWRgl4.js.gz +0 -0
  259. package/build/client/_app/immutable/nodes/6.KI4mq5ln.js +0 -1
  260. package/build/client/_app/immutable/nodes/6.KI4mq5ln.js.br +0 -0
  261. package/build/client/_app/immutable/nodes/6.KI4mq5ln.js.gz +0 -0
  262. package/build/client/_app/immutable/nodes/7.Brjrw0K8.js +0 -1
  263. package/build/client/_app/immutable/nodes/7.Brjrw0K8.js.br +0 -0
  264. package/build/client/_app/immutable/nodes/7.Brjrw0K8.js.gz +0 -0
  265. package/build/server/chunks/1-Ch0AY58K.js +0 -9
  266. package/build/server/chunks/6-D8zNoyW_.js.map +0 -1
  267. package/build/server/chunks/Panel-DTdYk-gk.js.map +0 -1
  268. package/build/server/chunks/PrettyJson-wIuHvehp.js.map +0 -1
  269. package/build/server/chunks/TooltipTable-J278e1CA.js.map +0 -1
  270. package/build/server/chunks/_layout.svelte-D7RD9tLN.js.map +0 -1
  271. package/build/server/chunks/_page.svelte-4PYYtPii.js.map +0 -1
  272. package/build/server/chunks/_page.svelte-Be5VTn1e.js.map +0 -1
  273. package/build/server/chunks/_page.svelte-DIPUjSjm.js.map +0 -1
  274. package/build/server/chunks/_page.svelte-DZ59Sr3N.js.map +0 -1
  275. package/build/server/chunks/_page.svelte-sdKGQrEF.js +0 -91
  276. package/build/server/chunks/_page.svelte-sdKGQrEF.js.map +0 -1
  277. package/build/server/chunks/_server.ts-BIRebnb3.js +0 -20
  278. package/build/server/chunks/_server.ts-BIRebnb3.js.map +0 -1
  279. package/build/server/chunks/_server.ts-MnKJDybo.js +0 -19
  280. package/build/server/chunks/_server.ts-MnKJDybo.js.map +0 -1
  281. package/build/server/chunks/_server.ts-Tog8k3Mh.js +0 -52
  282. package/build/server/chunks/_server.ts-Tog8k3Mh.js.map +0 -1
  283. package/build/server/chunks/client-BZtxOgbR.js +0 -7
  284. package/build/server/chunks/context-BU6gUbSI.js.map +0 -1
  285. package/build/server/chunks/error.svelte-BfneeC-d.js +0 -16
  286. package/build/server/chunks/error.svelte-BfneeC-d.js.map +0 -1
  287. package/build/server/chunks/exports-DiyTWREe.js.map +0 -1
  288. package/build/server/chunks/hooks.server-DNhdbQNi.js +0 -7
  289. package/build/server/chunks/hooks.server-DNhdbQNi.js.map +0 -1
  290. package/build/server/chunks/index3-CUhdJ7wv.js.map +0 -1
  291. package/build/server/chunks/notifications.svelte-CrTIrfvL.js.map +0 -1
  292. package/build/server/chunks/routing-zIlQn_LN.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ import { ObjectId } from "mongodb";
2
+
3
+ export default class JsonEncoder {
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ static encode(obj: any): any {
6
+ if (obj instanceof ObjectId) {
7
+ return {
8
+ $type: "ObjectId",
9
+ $value: obj.toHexString(),
10
+ $date: obj.getTimestamp().getTime(),
11
+ };
12
+ }
13
+ if (obj instanceof Date) {
14
+ return {
15
+ $type: "Date",
16
+ $value: obj.toISOString(),
17
+ };
18
+ }
19
+ if (obj instanceof RegExp) {
20
+ return {
21
+ $type: "RegExp",
22
+ $value: {
23
+ $pattern: obj.source,
24
+ $flags: obj.flags,
25
+ },
26
+ };
27
+ }
28
+ if (Array.isArray(obj)) {
29
+ return [...obj.map(JsonEncoder.encode)];
30
+ }
31
+ if (obj && typeof obj === "object") {
32
+ for (const [key, value] of Object.entries(obj)) {
33
+ obj[key] = JsonEncoder.encode(value);
34
+ }
35
+ }
36
+
37
+ return obj;
38
+ }
39
+
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ static decode(obj: any): any {
42
+ if (obj && obj.$type === "ObjectId") {
43
+ return ObjectId.createFromHexString(obj.$value);
44
+ }
45
+ if (obj && obj.$type === "Date") {
46
+ return new Date(obj.$value);
47
+ }
48
+ if (obj && obj.$type === "RegExp") {
49
+ return new RegExp(obj.$value.$pattern, obj.$value.$flags);
50
+ }
51
+ if (Array.isArray(obj)) {
52
+ return [...obj.map(JsonEncoder.decode)];
53
+ }
54
+ if (obj && typeof obj === "object") {
55
+ for (const [key, value] of Object.entries(obj)) {
56
+ obj[key] = JsonEncoder.decode(value);
57
+ }
58
+ }
59
+
60
+ return obj;
61
+ }
62
+ }
@@ -0,0 +1,199 @@
1
+ import type { CollectionJSON } from "$lib/types";
2
+ import { MongoClient, type Collection } from "mongodb";
3
+ import { URL } from "url";
4
+ import { HostsManager } from "./HostsManager";
5
+
6
+ export async function getCollectionJson(
7
+ collection: Collection,
8
+ type?: "view" | "timeseries" | "collection" | string,
9
+ ): Promise<CollectionJSON> {
10
+ const stats = {
11
+ size: 0,
12
+ count: 0,
13
+ avgObjSize: 0,
14
+ storageSize: 0,
15
+ capped: false,
16
+ nindexes: 0,
17
+ totalIndexSize: 0,
18
+ indexSizes: {},
19
+ };
20
+
21
+ if (type !== "view") {
22
+ const agg = (await collection
23
+ .aggregate([
24
+ {
25
+ $collStats: {
26
+ storageStats: {},
27
+ count: {},
28
+ },
29
+ },
30
+ ])
31
+ .next()
32
+ .catch(() => null)) as {
33
+ storageStats: {
34
+ size: number;
35
+ count: number;
36
+ storageSize: number;
37
+ capped: boolean;
38
+ nindexes: number;
39
+ totalIndexSize: number;
40
+ indexSizes: Record<string, number>;
41
+ };
42
+ } | null;
43
+
44
+ if (agg) {
45
+ stats.size = agg.storageStats.size;
46
+ stats.count = agg.storageStats.count;
47
+ stats.avgObjSize = Math.round(agg.storageStats.size / agg.storageStats.count);
48
+ stats.storageSize = agg.storageStats.storageSize;
49
+ stats.capped = agg.storageStats.capped;
50
+ stats.nindexes = agg.storageStats.nindexes;
51
+ stats.totalIndexSize = agg.storageStats.totalIndexSize;
52
+ stats.indexSizes = agg.storageStats.indexSizes;
53
+ }
54
+ }
55
+
56
+ // Get index definitions
57
+ let indexes: Array<{ name: string; key?: Record<string, number>; size: number }> = [];
58
+ if (type !== "view") {
59
+ try {
60
+ const indexList = await collection.listIndexes().toArray();
61
+ indexes = indexList.map((index: { name: string; key: Record<string, number> }) => ({
62
+ name: index.name,
63
+ key: index.key,
64
+ size: (stats.indexSizes as Record<string, number>)[index.name] || 0,
65
+ }));
66
+ } catch {
67
+ // If we can't get index details, fall back to indexSizes
68
+ indexes = Object.entries(stats.indexSizes).map(([name, size]) => ({
69
+ name,
70
+ size: size as number,
71
+ }));
72
+ }
73
+ }
74
+
75
+ return {
76
+ name: collection.collectionName,
77
+ size: (stats.storageSize ?? 0) + (stats.totalIndexSize ?? 0),
78
+ dataSize: stats.size,
79
+ count: stats.count,
80
+ avgObjSize: stats.avgObjSize ?? 0,
81
+ storageSize: stats.storageSize ?? 0,
82
+ capped: stats.capped,
83
+ nIndexes: stats.nindexes,
84
+ totalIndexSize: stats.totalIndexSize ?? 0,
85
+ indexSizes: stats.indexSizes,
86
+ indexes,
87
+ };
88
+ }
89
+
90
+ class MongoConnections {
91
+ /**
92
+ * Todo: better system where we can have mutiple servers with same hostname, and labels for each server that
93
+ * would be displayed in the UI instead of the hostname.
94
+ */
95
+ private clients: Map<string, MongoClient> = new Map();
96
+ private clientIds: Map<string, string> = new Map(); // hostname -> _id
97
+ private hostsManager: HostsManager;
98
+ private countTimeout = parseInt(process.env.MONGOKU_COUNT_TIMEOUT!, 10) || 5000;
99
+
100
+ constructor() {
101
+ this.hostsManager = new HostsManager();
102
+ }
103
+
104
+ async initialize() {
105
+ await this.hostsManager.load();
106
+ const hosts = await this.hostsManager.getHosts();
107
+
108
+ // Create MongoClient instances without connecting (lazy connection)
109
+ for (const host of hosts) {
110
+ const urlStr = host.path.startsWith("mongodb") ? host.path : `mongodb://${host.path}`;
111
+ try {
112
+ const url = new URL(urlStr);
113
+ const hostname = url.host || host.path;
114
+
115
+ if (!this.clients.has(hostname)) {
116
+ const client = new MongoClient(urlStr);
117
+ this.clients.set(hostname, client);
118
+ this.clientIds.set(hostname, host._id);
119
+ }
120
+ } catch (err) {
121
+ console.error(`Failed to parse URL for host ${host.path}:`, err);
122
+ }
123
+ }
124
+ }
125
+
126
+ getClient(name: string): MongoClient {
127
+ const client = this.clients.get(name) || this.clients.get(`${name}:27017`);
128
+ if (!client) {
129
+ throw new Error("Server does not exist");
130
+ }
131
+ return client;
132
+ }
133
+
134
+ listClients(): Array<{ name: string; _id: string; client: MongoClient }> {
135
+ return Array.from(this.clients.entries())
136
+ .filter(([, client]) => client instanceof MongoClient)
137
+ .map(([name, client]) => ({
138
+ name,
139
+ _id: this.clientIds.get(name) || "",
140
+ client: client as MongoClient,
141
+ }));
142
+ }
143
+
144
+ getCollection(serverName: string, databaseName: string, collectionName: string) {
145
+ const client = this.getClient(serverName);
146
+ const db = client.db(databaseName);
147
+ return db.collection(collectionName);
148
+ }
149
+
150
+ getCountTimeout() {
151
+ return this.countTimeout;
152
+ }
153
+
154
+ async addServer(hostPath: string) {
155
+ const id = await this.hostsManager.add(hostPath);
156
+
157
+ // Add the new server client
158
+ const urlStr = hostPath.startsWith("mongodb") ? hostPath : `mongodb://${hostPath}`;
159
+ try {
160
+ const url = new URL(urlStr);
161
+ const hostname = url.host || hostPath;
162
+
163
+ if (!this.clients.has(hostname)) {
164
+ const client = new MongoClient(urlStr);
165
+ this.clients.set(hostname, client);
166
+ this.clientIds.set(hostname, id);
167
+ }
168
+ } catch (err) {
169
+ console.error(`Failed to parse URL for host ${hostPath}:`, err);
170
+ throw err;
171
+ }
172
+ }
173
+
174
+ async removeServer(name: string) {
175
+ await this.hostsManager.remove(name);
176
+ this.clients.delete(name);
177
+ this.clientIds.delete(name);
178
+ }
179
+ }
180
+
181
+ // Singleton instance
182
+ let mongoConnections: MongoConnections | null = null;
183
+ let initPromise: Promise<MongoConnections> | null = null;
184
+
185
+ export async function getMongo(): Promise<MongoConnections> {
186
+ if (!mongoConnections) {
187
+ if (!initPromise) {
188
+ initPromise = (async () => {
189
+ mongoConnections = new MongoConnections();
190
+ await mongoConnections.initialize();
191
+ return mongoConnections;
192
+ })();
193
+ }
194
+ return initPromise;
195
+ }
196
+ return mongoConnections;
197
+ }
198
+
199
+ export { mongoConnections };
@@ -0,0 +1,45 @@
1
+ import z from "zod";
2
+
3
+ interface Notification {
4
+ id: number;
5
+ message: string;
6
+ type: "success" | "error" | "info";
7
+ }
8
+
9
+ let notifications = $state<Notification[]>([]);
10
+ let nextId = 1;
11
+
12
+ export const notificationStore = {
13
+ get items() {
14
+ return notifications;
15
+ },
16
+
17
+ notify(message: string, type: "success" | "error" | "info" = "info") {
18
+ const id = nextId++;
19
+ notifications = [...notifications, { id, message, type }];
20
+
21
+ setTimeout(() => {
22
+ this.remove(id);
23
+ }, 5000);
24
+ },
25
+
26
+ async notifyError(message: string | unknown, fallbackMessage?: string) {
27
+ const finalMessage =
28
+ typeof message === "string"
29
+ ? message
30
+ : (z.object({ message: z.string() }).safeParse(message).data?.message ??
31
+ z.object({ body: z.object({ message: z.string() }), status: z.number() }).safeParse(message).data?.body
32
+ ?.message ??
33
+ fallbackMessage ??
34
+ "An unexpected error occurred");
35
+ this.notify(finalMessage, "error");
36
+ },
37
+
38
+ notifySuccess(message: string) {
39
+ this.notify(message, "success");
40
+ },
41
+
42
+ remove(id: number) {
43
+ notifications = notifications.filter((n) => n.id !== id);
44
+ },
45
+ };
@@ -0,0 +1,56 @@
1
+ export interface MongoDocument {
2
+ _id?: {
3
+ $type: string;
4
+ $value: string;
5
+ };
6
+ [key: string]: unknown;
7
+ }
8
+
9
+ export interface SearchParams {
10
+ query: string;
11
+ sort: string;
12
+ project: string;
13
+ limit: number;
14
+ skip: number;
15
+ }
16
+
17
+ /**
18
+ * Database stats as returned by the db.stats() method
19
+ *
20
+ * Type not exposed by MongoDB
21
+ */
22
+ export interface DatabaseStats {
23
+ db: string;
24
+ collections: number;
25
+ views: number;
26
+ objects: number;
27
+ avgObjSize: number;
28
+ dataSize: number;
29
+ storageSize: number;
30
+ indexes: number;
31
+ indexSize: number;
32
+ totalSize: number;
33
+ fsUsedSize: number;
34
+ fsTotalSize: number;
35
+ ok: number;
36
+ }
37
+
38
+ export interface CollectionJSON {
39
+ name: string;
40
+ size: number;
41
+ dataSize: number;
42
+ count: number;
43
+ avgObjSize: number;
44
+ storageSize: number;
45
+ capped: boolean;
46
+ nIndexes: number;
47
+ totalIndexSize: number;
48
+ indexSizes: {
49
+ [name: string]: number;
50
+ };
51
+ indexes: Array<{
52
+ name: string;
53
+ key?: Record<string, number>;
54
+ size: number;
55
+ }>;
56
+ }
@@ -0,0 +1,25 @@
1
+ export function formatBytes(bytes: number): string {
2
+ if (bytes === 0) return "0 B";
3
+ if (bytes < 1000) return bytes + " B";
4
+ if (bytes < 1000000) return (bytes / 1000).toFixed(2) + " kB";
5
+ if (bytes < 1000000000) return (bytes / 1000000).toFixed(2) + " MB";
6
+ if (bytes < 1000000000000) return (bytes / 1000000000).toFixed(2) + " GB";
7
+ return (bytes / 1000000000000).toFixed(2) + " TB";
8
+ }
9
+
10
+ export function formatNumber(num: number): string {
11
+ return num.toLocaleString();
12
+ }
13
+
14
+ export function serverName(name: string): string {
15
+ // Extract hostname from MongoDB connection string
16
+ if (name.startsWith("mongodb://") || name.startsWith("mongodb+srv://")) {
17
+ try {
18
+ const url = new URL(name);
19
+ return url.hostname;
20
+ } catch {
21
+ return name;
22
+ }
23
+ }
24
+ return name;
25
+ }
@@ -0,0 +1,125 @@
1
+ import { parseScript } from "esprima";
2
+ import type { Expression, Node } from "estree";
3
+
4
+ function buildObject(node: Node | Expression): unknown {
5
+ switch (node.type) {
6
+ case "ObjectExpression": {
7
+ const obj: Record<string, unknown> = {};
8
+ for (const prop of node.properties) {
9
+ let name;
10
+ if (prop.type === "SpreadElement") {
11
+ throw new Error(`Expected "Property" but received: ${prop.type}`);
12
+ }
13
+ if (prop.key.type === "Identifier") {
14
+ name = prop.key.name;
15
+ } else if (prop.key.type === "Literal") {
16
+ if (
17
+ prop.key.value instanceof RegExp ||
18
+ typeof prop.key.value === "bigint" ||
19
+ prop.key.value === false ||
20
+ prop.key.value === null ||
21
+ prop.key.value === true ||
22
+ prop.key.value === undefined
23
+ ) {
24
+ throw new Error(`Expected "Identifier" for object key but received: ${prop.key.type}`);
25
+ }
26
+ name = prop.key.value;
27
+ } else {
28
+ throw new Error(`Expected "Identifier" but received: ${prop.key.type}`);
29
+ }
30
+
31
+ obj[name] = buildObject(prop.value);
32
+ }
33
+ return obj;
34
+ }
35
+
36
+ case "ArrayExpression": {
37
+ const obj: unknown[] = [];
38
+ for (const prop of node.elements) {
39
+ if (prop === null) {
40
+ throw new Error(`Expected "Expression" but received: ${prop}`);
41
+ }
42
+ obj.push(buildObject(prop));
43
+ }
44
+ return obj;
45
+ }
46
+
47
+ case "Literal": {
48
+ if (node.value instanceof RegExp) {
49
+ return {
50
+ $type: "RegExp",
51
+ $value: {
52
+ $pattern: node.value.source,
53
+ $flags: node.value.flags,
54
+ },
55
+ };
56
+ }
57
+
58
+ return node.value;
59
+ }
60
+
61
+ case "UnaryExpression": {
62
+ if (node.operator === "-" && node.argument.type === "Literal" && typeof node.argument.value === "number") {
63
+ return -node.argument.value;
64
+ }
65
+ // const arg = buildObject(node.argument);
66
+ // const exp = node.prefix ? `${node.operator}${arg}` : `${arg}${node.operator}`;
67
+
68
+ // return eval(exp);
69
+ throw new Error(`${node.type} are not authorized`);
70
+ }
71
+
72
+ case "NewExpression":
73
+ case "CallExpression": {
74
+ const authorizedCalls = ["ObjectId", "Date", "RegExp"];
75
+ const callee = node.callee.type === "Identifier" ? node.callee.name : null;
76
+ if (callee && authorizedCalls.includes(callee)) {
77
+ if (callee === "RegExp") {
78
+ const [pattern, flags] = node.arguments.map((arg) => buildObject(arg));
79
+ return {
80
+ $type: "RegExp",
81
+ $value: {
82
+ $pattern: pattern,
83
+ $flags: flags,
84
+ },
85
+ };
86
+ }
87
+
88
+ return {
89
+ $type: callee,
90
+ $value: buildObject(node.arguments[0]),
91
+ };
92
+ } else {
93
+ throw new Error(`Unknown ${node.type}: ${callee}`);
94
+ }
95
+ }
96
+
97
+ case "Identifier": {
98
+ if (node.name === "undefined") {
99
+ return undefined;
100
+ }
101
+ throw `Unknown identifier: ${node.name}`;
102
+ }
103
+
104
+ default:
105
+ throw new Error(`Sorry but ${node.type} are not authorized`);
106
+ }
107
+ }
108
+
109
+ export function parseJSON(text: string): unknown {
110
+ const tree = parseScript(`var __JSON__ = ${text};`, {
111
+ tolerant: true,
112
+ });
113
+
114
+ const varDeclaration = tree.body[0];
115
+ if (varDeclaration.type !== "VariableDeclaration") {
116
+ throw new Error("Expected VariableDeclaration but received: " + varDeclaration.type);
117
+ }
118
+
119
+ const objExpression = varDeclaration.declarations[0].init;
120
+ if (objExpression?.type !== "ObjectExpression") {
121
+ throw new Error("Expected ObjectExpression but received: " + objExpression?.type);
122
+ }
123
+
124
+ return buildObject(objExpression);
125
+ }
@@ -0,0 +1,7 @@
1
+ import type { LayoutServerLoad } from "./$types";
2
+
3
+ export const load: LayoutServerLoad = async () => {
4
+ return {
5
+ readOnly: process.env.MONGOKU_READ_ONLY_MODE === "true",
6
+ };
7
+ };
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { resolve } from "$app/paths";
3
+ import Breadcrumbs from "$lib/components/Breadcrumbs.svelte";
4
+ import Notifications from "$lib/components/Notifications.svelte";
5
+ import "../app.css";
6
+
7
+ let { children } = $props();
8
+ </script>
9
+
10
+ <div style="min-height: 100vh">
11
+ <nav class="navbar px-6 py-4 flex items-center">
12
+ <a href={resolve("/")} class="text-2xl font-medium">Mongoku</a>
13
+ <Breadcrumbs />
14
+ </nav>
15
+
16
+ <div class="px-6 py-6 flex flex-col gap-6">
17
+ <Notifications />
18
+ {@render children()}
19
+ </div>
20
+ </div>
21
+
22
+ <style lang="postcss">
23
+ .navbar {
24
+ background-color: var(--color-2);
25
+ border-bottom: var(--border);
26
+ }
27
+ </style>
@@ -0,0 +1,6 @@
1
+ import { redirect } from "@sveltejs/kit";
2
+ import type { PageServerLoad } from "./$types";
3
+
4
+ export const load: PageServerLoad = async () => {
5
+ redirect(307, "/servers");
6
+ };
@@ -0,0 +1,53 @@
1
+ import { getMongo } from "$lib/server/mongo";
2
+ import type { DatabaseStats } from "$lib/types";
3
+ import type { PageServerLoad } from "./$types";
4
+
5
+ export const load: PageServerLoad = async () => {
6
+ const mongo = await getMongo();
7
+
8
+ const servers = mongo.listClients().map(({ name, _id, client }) => ({
9
+ name,
10
+ _id,
11
+ details: (async () => {
12
+ try {
13
+ const adminDb = client.db("test").admin();
14
+ const results = await adminDb.listDatabases();
15
+ const collectionsCount = await Promise.all(
16
+ results.databases.map(async (d) => {
17
+ const db = client.db(d.name);
18
+ const dbStats = (await db.stats()) as DatabaseStats;
19
+ return dbStats.collections;
20
+ }),
21
+ );
22
+
23
+ return {
24
+ databases: results.databases.map((d, index) => ({
25
+ name: d.name,
26
+ size: d.sizeOnDisk ?? 0,
27
+ collections: collectionsCount[index],
28
+ })),
29
+ size: results.totalSize ?? 0,
30
+ };
31
+ } catch (err) {
32
+ return {
33
+ error: {
34
+ code: err instanceof Error && "code" in err ? err.code : undefined,
35
+ name: err instanceof Error ? err.name : "Error",
36
+ message: err instanceof Error ? err.message : String(err),
37
+ },
38
+ };
39
+ }
40
+ })().catch((err) => ({
41
+ error: {
42
+ code: err instanceof Error && "code" in err ? err.code : undefined,
43
+ name: err instanceof Error ? err.name : "Error",
44
+ message: err instanceof Error ? err.message : String(err),
45
+ },
46
+ })),
47
+ }));
48
+
49
+ servers.sort((a, b) => a.name.localeCompare(b.name));
50
+ return {
51
+ servers,
52
+ };
53
+ };