mongoku 2.6.0 → 2.7.0-compat

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 (453) hide show
  1. package/Dockerfile +1 -0
  2. package/README.md +25 -0
  3. package/build/client/_app/immutable/assets/0.CdYhspVa.css +1 -0
  4. package/build/client/_app/immutable/assets/0.CdYhspVa.css.br +0 -0
  5. package/build/client/_app/immutable/assets/0.CdYhspVa.css.gz +0 -0
  6. package/build/client/_app/immutable/chunks/{DdLT9cdj.js → B59nRjE7.js} +1 -1
  7. package/build/client/_app/immutable/chunks/B59nRjE7.js.br +2 -0
  8. package/build/client/_app/immutable/chunks/B59nRjE7.js.gz +0 -0
  9. package/build/client/_app/immutable/chunks/BBqIHhSl.js +1 -0
  10. package/build/client/_app/immutable/chunks/BBqIHhSl.js.br +0 -0
  11. package/build/client/_app/immutable/chunks/BBqIHhSl.js.gz +0 -0
  12. package/build/client/_app/immutable/chunks/{BEi7QatZ.js → BIUJX0Ps.js} +6 -6
  13. package/build/client/_app/immutable/chunks/BIUJX0Ps.js.br +0 -0
  14. package/build/client/_app/immutable/chunks/BIUJX0Ps.js.gz +0 -0
  15. package/build/client/_app/immutable/chunks/C6nv_pni.js +1 -0
  16. package/build/client/_app/immutable/chunks/C6nv_pni.js.br +0 -0
  17. package/build/client/_app/immutable/chunks/C6nv_pni.js.gz +0 -0
  18. package/build/client/_app/immutable/chunks/{Bh2n5Bfy.js → CETiZ6GF.js} +1 -1
  19. package/build/client/_app/immutable/chunks/CETiZ6GF.js.br +0 -0
  20. package/build/client/_app/immutable/chunks/CETiZ6GF.js.gz +0 -0
  21. package/build/client/_app/immutable/chunks/CX0xC2bt.js +1 -0
  22. package/build/client/_app/immutable/chunks/CX0xC2bt.js.br +0 -0
  23. package/build/client/_app/immutable/chunks/CX0xC2bt.js.gz +0 -0
  24. package/build/client/_app/immutable/chunks/CeXlKXQN.js +1 -0
  25. package/build/client/_app/immutable/chunks/CeXlKXQN.js.br +0 -0
  26. package/build/client/_app/immutable/chunks/CeXlKXQN.js.gz +0 -0
  27. package/build/client/_app/immutable/chunks/ChTiw7nk.js +4 -0
  28. package/build/client/_app/immutable/chunks/ChTiw7nk.js.br +0 -0
  29. package/build/client/_app/immutable/chunks/ChTiw7nk.js.gz +0 -0
  30. package/build/client/_app/immutable/chunks/Czyt1_Wc.js +1 -0
  31. package/build/client/_app/immutable/chunks/Czyt1_Wc.js.br +0 -0
  32. package/build/client/_app/immutable/chunks/Czyt1_Wc.js.gz +0 -0
  33. package/build/client/_app/immutable/chunks/{B5NTIIm5.js → DJHYr09v.js} +1 -1
  34. package/build/client/_app/immutable/chunks/DJHYr09v.js.br +0 -0
  35. package/build/client/_app/immutable/chunks/DJHYr09v.js.gz +0 -0
  36. package/build/client/_app/immutable/chunks/{C2amz0TU.js → DZxZehvI.js} +1 -1
  37. package/build/client/_app/immutable/chunks/DZxZehvI.js.br +0 -0
  38. package/build/client/_app/immutable/chunks/DZxZehvI.js.gz +0 -0
  39. package/build/client/_app/immutable/chunks/DaNl6Y92.js +2 -0
  40. package/build/client/_app/immutable/chunks/DaNl6Y92.js.br +0 -0
  41. package/build/client/_app/immutable/chunks/DaNl6Y92.js.gz +0 -0
  42. package/build/client/_app/immutable/chunks/Dbu5gl04.js +1 -0
  43. package/build/client/_app/immutable/chunks/Dbu5gl04.js.br +0 -0
  44. package/build/client/_app/immutable/chunks/Dbu5gl04.js.gz +0 -0
  45. package/build/client/_app/immutable/chunks/DczwA5Ds.js +1 -0
  46. package/build/client/_app/immutable/chunks/DczwA5Ds.js.br +0 -0
  47. package/build/client/_app/immutable/chunks/DczwA5Ds.js.gz +0 -0
  48. package/build/client/_app/immutable/chunks/DjlV9yev.js +1 -0
  49. package/build/client/_app/immutable/chunks/DjlV9yev.js.br +0 -0
  50. package/build/client/_app/immutable/chunks/DjlV9yev.js.gz +0 -0
  51. package/build/client/_app/immutable/chunks/DkIdyQoH.js +1 -0
  52. package/build/client/_app/immutable/chunks/DkIdyQoH.js.br +0 -0
  53. package/build/client/_app/immutable/chunks/DkIdyQoH.js.gz +0 -0
  54. package/build/client/_app/immutable/chunks/DskkUG-R.js +41 -0
  55. package/build/client/_app/immutable/chunks/DskkUG-R.js.br +0 -0
  56. package/build/client/_app/immutable/chunks/DskkUG-R.js.gz +0 -0
  57. package/build/client/_app/immutable/chunks/DtqR9xj2.js +16 -0
  58. package/build/client/_app/immutable/chunks/DtqR9xj2.js.br +0 -0
  59. package/build/client/_app/immutable/chunks/DtqR9xj2.js.gz +0 -0
  60. package/build/client/_app/immutable/chunks/{c-rWvg5T.js → Dv9wDVNU.js} +1 -1
  61. package/build/client/_app/immutable/chunks/Dv9wDVNU.js.br +0 -0
  62. package/build/client/_app/immutable/chunks/Dv9wDVNU.js.gz +0 -0
  63. package/build/client/_app/immutable/chunks/{Bl8s7Z6r.js → DwvJoC1a.js} +1 -1
  64. package/build/client/_app/immutable/chunks/DwvJoC1a.js.br +0 -0
  65. package/build/client/_app/immutable/chunks/DwvJoC1a.js.gz +0 -0
  66. package/build/client/_app/immutable/chunks/ULh2o3ji.js +1 -0
  67. package/build/client/_app/immutable/chunks/ULh2o3ji.js.br +0 -0
  68. package/build/client/_app/immutable/chunks/ULh2o3ji.js.gz +0 -0
  69. package/build/client/_app/immutable/chunks/V1mdyEl2.js +1 -0
  70. package/build/client/_app/immutable/chunks/V1mdyEl2.js.br +0 -0
  71. package/build/client/_app/immutable/chunks/V1mdyEl2.js.gz +0 -0
  72. package/build/client/_app/immutable/chunks/{DUw-I2kh.js → gjWX2x82.js} +1 -1
  73. package/build/client/_app/immutable/chunks/gjWX2x82.js.br +0 -0
  74. package/build/client/_app/immutable/chunks/gjWX2x82.js.gz +0 -0
  75. package/build/client/_app/immutable/chunks/{CxcplU4Q.js → y5L2Na-S.js} +1 -1
  76. package/build/client/_app/immutable/chunks/y5L2Na-S.js.br +0 -0
  77. package/build/client/_app/immutable/chunks/y5L2Na-S.js.gz +0 -0
  78. package/build/client/_app/immutable/entry/app.DSC3O-oq.js +2 -0
  79. package/build/client/_app/immutable/entry/app.DSC3O-oq.js.br +0 -0
  80. package/build/client/_app/immutable/entry/app.DSC3O-oq.js.gz +0 -0
  81. package/build/client/_app/immutable/entry/start.DXWFdQeQ.js +1 -0
  82. package/build/client/_app/immutable/entry/start.DXWFdQeQ.js.br +0 -0
  83. package/build/client/_app/immutable/entry/start.DXWFdQeQ.js.gz +0 -0
  84. package/build/client/_app/immutable/nodes/0.CMAlzqMw.js +1 -0
  85. package/build/client/_app/immutable/nodes/0.CMAlzqMw.js.br +0 -0
  86. package/build/client/_app/immutable/nodes/0.CMAlzqMw.js.gz +0 -0
  87. package/build/client/_app/immutable/nodes/1.B6Npt7WS.js +1 -0
  88. package/build/client/_app/immutable/nodes/1.B6Npt7WS.js.br +4 -0
  89. package/build/client/_app/immutable/nodes/1.B6Npt7WS.js.gz +0 -0
  90. package/build/client/_app/immutable/nodes/10.UKtNnnWx.js +2 -0
  91. package/build/client/_app/immutable/nodes/10.UKtNnnWx.js.br +0 -0
  92. package/build/client/_app/immutable/nodes/10.UKtNnnWx.js.gz +0 -0
  93. package/build/client/_app/immutable/nodes/11.DZQrIhD6.js +6 -0
  94. package/build/client/_app/immutable/nodes/11.DZQrIhD6.js.br +0 -0
  95. package/build/client/_app/immutable/nodes/11.DZQrIhD6.js.gz +0 -0
  96. package/build/client/_app/immutable/nodes/12.Bb2XzJJ4.js +1 -0
  97. package/build/client/_app/immutable/nodes/12.Bb2XzJJ4.js.br +0 -0
  98. package/build/client/_app/immutable/nodes/12.Bb2XzJJ4.js.gz +0 -0
  99. package/build/client/_app/immutable/nodes/13.B_EllgAJ.js +1 -0
  100. package/build/client/_app/immutable/nodes/13.B_EllgAJ.js.br +0 -0
  101. package/build/client/_app/immutable/nodes/13.B_EllgAJ.js.gz +0 -0
  102. package/build/client/_app/immutable/nodes/14.Ds1Cbw86.js +65 -0
  103. package/build/client/_app/immutable/nodes/14.Ds1Cbw86.js.br +0 -0
  104. package/build/client/_app/immutable/nodes/14.Ds1Cbw86.js.gz +0 -0
  105. package/build/client/_app/immutable/nodes/{2.AM8fesja.js → 2.C6NzDBVE.js} +1 -1
  106. package/build/client/_app/immutable/nodes/2.C6NzDBVE.js.br +2 -0
  107. package/build/client/_app/immutable/nodes/2.C6NzDBVE.js.gz +0 -0
  108. package/build/client/_app/immutable/nodes/{3.BShuoOz5.js → 3.CZJqJ4La.js} +1 -1
  109. package/build/client/_app/immutable/nodes/3.CZJqJ4La.js.br +0 -0
  110. package/build/client/_app/immutable/nodes/3.CZJqJ4La.js.gz +0 -0
  111. package/build/client/_app/immutable/nodes/{4.BD6QbApY.js → 4.CNe3XPNo.js} +1 -1
  112. package/build/client/_app/immutable/nodes/4.CNe3XPNo.js.br +0 -0
  113. package/build/client/_app/immutable/nodes/4.CNe3XPNo.js.gz +0 -0
  114. package/build/client/_app/immutable/nodes/{5.JM_dwz0R.js → 5.BWhhv567.js} +1 -1
  115. package/build/client/_app/immutable/nodes/5.BWhhv567.js.br +0 -0
  116. package/build/client/_app/immutable/nodes/5.BWhhv567.js.gz +0 -0
  117. package/build/client/_app/immutable/nodes/7.DrDdJlUZ.js +1 -0
  118. package/build/client/_app/immutable/nodes/7.DrDdJlUZ.js.br +0 -0
  119. package/build/client/_app/immutable/nodes/7.DrDdJlUZ.js.gz +0 -0
  120. package/build/client/_app/immutable/nodes/8.DY5fyf2p.js +2 -0
  121. package/build/client/_app/immutable/nodes/8.DY5fyf2p.js.br +0 -0
  122. package/build/client/_app/immutable/nodes/8.DY5fyf2p.js.gz +0 -0
  123. package/build/client/_app/immutable/nodes/9.DSZg3ucy.js +1 -0
  124. package/build/client/_app/immutable/nodes/9.DSZg3ucy.js.br +0 -0
  125. package/build/client/_app/immutable/nodes/9.DSZg3ucy.js.gz +0 -0
  126. package/build/client/_app/version.json +1 -1
  127. package/build/client/_app/version.json.br +0 -0
  128. package/build/client/_app/version.json.gz +0 -0
  129. package/build/client/robots.txt.br +0 -0
  130. package/build/client/robots.txt.gz +0 -0
  131. package/build/handler.js +290 -228
  132. package/build/server/chunks/0-94hvO2vX.js +31 -0
  133. package/build/server/chunks/0-94hvO2vX.js.map +1 -0
  134. package/build/server/chunks/1-DU2n-wa5.js +9 -0
  135. package/build/server/chunks/1-DU2n-wa5.js.map +1 -0
  136. package/build/server/chunks/{9-DrDIAOIh.js → 10-CA3VfgE7.js} +7 -6
  137. package/build/server/chunks/10-CA3VfgE7.js.map +1 -0
  138. package/build/server/chunks/{10-WRjYTwFT.js → 11-xh-tBR25.js} +8 -7
  139. package/build/server/chunks/11-xh-tBR25.js.map +1 -0
  140. package/build/server/chunks/{11-Cq79IAWK.js → 12-CHoThn5d.js} +8 -7
  141. package/build/server/chunks/12-CHoThn5d.js.map +1 -0
  142. package/build/server/chunks/{12-DnRkeAVv.js → 13-s3o-iKja.js} +8 -7
  143. package/build/server/chunks/13-s3o-iKja.js.map +1 -0
  144. package/build/server/chunks/{13-DKqDuEdB.js → 14-Ch_I9f3x.js} +7 -6
  145. package/build/server/chunks/14-Ch_I9f3x.js.map +1 -0
  146. package/build/server/chunks/{2-DaZMexAs.js → 2-BNTmkYSf.js} +2 -2
  147. package/build/server/chunks/{2-DaZMexAs.js.map → 2-BNTmkYSf.js.map} +1 -1
  148. package/build/server/chunks/{3-Dr4vFhF1.js → 3-ClKd4dXQ.js} +2 -2
  149. package/build/server/chunks/{3-Dr4vFhF1.js.map → 3-ClKd4dXQ.js.map} +1 -1
  150. package/build/server/chunks/{4-K2WnEwm7.js → 4-BSPVNKkN.js} +2 -2
  151. package/build/server/chunks/{4-K2WnEwm7.js.map → 4-BSPVNKkN.js.map} +1 -1
  152. package/build/server/chunks/{5-Be-Du8oZ.js → 5-BzxZlQk0.js} +2 -2
  153. package/build/server/chunks/{5-Be-Du8oZ.js.map → 5-BzxZlQk0.js.map} +1 -1
  154. package/build/server/chunks/{6-DsYzHmsZ.js → 6-Bw8JUxiD.js} +3 -2
  155. package/build/server/chunks/6-Bw8JUxiD.js.map +1 -0
  156. package/build/server/chunks/7-B_ur3ckj.js +9 -0
  157. package/build/server/chunks/7-B_ur3ckj.js.map +1 -0
  158. package/build/server/chunks/{7-eAzN1saI.js → 8-BEcdRamT.js} +8 -7
  159. package/build/server/chunks/8-BEcdRamT.js.map +1 -0
  160. package/build/server/chunks/{8-Dtaxi2J_.js → 9-CeMYWy9o.js} +7 -6
  161. package/build/server/chunks/9-CeMYWy9o.js.map +1 -0
  162. package/build/server/chunks/JsonValue-CTg4aH_w.js +320 -0
  163. package/build/server/chunks/JsonValue-CTg4aH_w.js.map +1 -0
  164. package/build/server/chunks/{Modal-fWUUqg69.js → Modal-yO0qzufQ.js} +2 -3
  165. package/build/server/chunks/Modal-yO0qzufQ.js.map +1 -0
  166. package/build/server/chunks/{Panel-BXokpC3w.js → Panel-D9GzVDDt.js} +7 -12
  167. package/build/server/chunks/Panel-D9GzVDDt.js.map +1 -0
  168. package/build/server/chunks/{PrettyJson-CV4qF02W.js → PrettyJson-CzzntSVh.js} +15 -10
  169. package/build/server/chunks/PrettyJson-CzzntSVh.js.map +1 -0
  170. package/build/server/chunks/{Tooltip-1tZ4BUxU.js → Tooltip-D2BX7dwq.js} +2 -2
  171. package/build/server/chunks/Tooltip-D2BX7dwq.js.map +1 -0
  172. package/build/server/chunks/{TooltipTable-B2QGp4YW.js → TooltipTable-91W9LxGR.js} +3 -4
  173. package/build/server/chunks/TooltipTable-91W9LxGR.js.map +1 -0
  174. package/build/server/chunks/{_layout.svelte-DAGMbkJX.js → _layout.svelte-BFxKanne.js} +28 -24
  175. package/build/server/chunks/_layout.svelte-BFxKanne.js.map +1 -0
  176. package/build/server/chunks/{_page.svelte-DgQxD9T8.js → _page.svelte-CQzzieEo.js} +16 -18
  177. package/build/server/chunks/_page.svelte-CQzzieEo.js.map +1 -0
  178. package/build/server/chunks/_page.svelte-CSuE9bVi.js +14 -0
  179. package/build/server/chunks/_page.svelte-CSuE9bVi.js.map +1 -0
  180. package/build/server/chunks/{_page.svelte-DfZ2COw_.js → _page.svelte-CnboYQ1K.js} +11 -73
  181. package/build/server/chunks/_page.svelte-CnboYQ1K.js.map +1 -0
  182. package/build/server/chunks/{_page.svelte-ClakOyno.js → _page.svelte-D41VQj4U.js} +17 -19
  183. package/build/server/chunks/_page.svelte-D41VQj4U.js.map +1 -0
  184. package/build/server/chunks/{_page.svelte-CB9ZXhBt.js → _page.svelte-Dg71nX8A.js} +117 -97
  185. package/build/server/chunks/_page.svelte-Dg71nX8A.js.map +1 -0
  186. package/build/server/chunks/{_page.svelte-BUqI0nM9.js → _page.svelte-DxlZXLVf.js} +17 -19
  187. package/build/server/chunks/_page.svelte-DxlZXLVf.js.map +1 -0
  188. package/build/server/chunks/{_page.svelte-Ccc0KJ66.js → _page.svelte-SZxwc25D.js} +45 -39
  189. package/build/server/chunks/_page.svelte-SZxwc25D.js.map +1 -0
  190. package/build/server/chunks/{_page.svelte-wmgrrvR7.js → _page.svelte-THKAhY4k.js} +48 -51
  191. package/build/server/chunks/_page.svelte-THKAhY4k.js.map +1 -0
  192. package/build/server/chunks/_server.ts-B3lXxheE.js +15 -0
  193. package/build/server/chunks/_server.ts-B3lXxheE.js.map +1 -0
  194. package/build/server/chunks/_server.ts-Bs5HC7Wf.js +46 -0
  195. package/build/server/chunks/_server.ts-Bs5HC7Wf.js.map +1 -0
  196. package/build/server/chunks/_server.ts-DRL9sDg4.js +34 -0
  197. package/build/server/chunks/_server.ts-DRL9sDg4.js.map +1 -0
  198. package/build/server/chunks/_server.ts-DqL5edUL.js +24 -0
  199. package/build/server/chunks/_server.ts-DqL5edUL.js.map +1 -0
  200. package/build/server/chunks/client-C7bEwskR.js +7 -0
  201. package/build/server/chunks/{client-BCfAqu0g.js.map → client-C7bEwskR.js.map} +1 -1
  202. package/build/server/chunks/{client2-B-hc4vU8.js → client2-DcCKOWWC.js} +6 -6
  203. package/build/server/chunks/client2-DcCKOWWC.js.map +1 -0
  204. package/build/server/chunks/error.svelte-Bk-0XnBt.js +18 -0
  205. package/build/server/chunks/error.svelte-Bk-0XnBt.js.map +1 -0
  206. package/build/server/chunks/exports-B5ORJhfK.js +65 -0
  207. package/build/server/chunks/exports-B5ORJhfK.js.map +1 -0
  208. package/build/server/chunks/{filters-CbFjTNFI.js → filters-B3U8Nh9P.js} +16 -6
  209. package/build/server/chunks/filters-B3U8Nh9P.js.map +1 -0
  210. package/build/server/chunks/hooks.server-Cq7ufuFU.js +79 -0
  211. package/build/server/chunks/hooks.server-Cq7ufuFU.js.map +1 -0
  212. package/build/server/chunks/{index2-CJE0QJlP.js → index-CC9WtE-y.js} +3 -13
  213. package/build/server/chunks/index-CC9WtE-y.js.map +1 -0
  214. package/build/server/chunks/index-wpIsICWW.js.map +1 -1
  215. package/build/server/chunks/{index3-CQyDuV4f.js → index2-DMabdSHV.js} +3 -3
  216. package/build/server/chunks/index2-DMabdSHV.js.map +1 -0
  217. package/build/server/chunks/{logger-KF6KpVP6.js → logger-PfH_grbh.js} +4 -3
  218. package/build/server/chunks/logger-PfH_grbh.js.map +1 -0
  219. package/build/server/chunks/{mongo-CpQtfvt6.js → mongo-B92d7zNj.js} +25 -24
  220. package/build/server/chunks/mongo-B92d7zNj.js.map +1 -0
  221. package/build/server/chunks/oauth-BfIECOev.js +178 -0
  222. package/build/server/chunks/oauth-BfIECOev.js.map +1 -0
  223. package/build/server/chunks/remote-xxtqbu-D0yn6nhQ.js +22 -0
  224. package/build/server/chunks/remote-xxtqbu-D0yn6nhQ.js.map +1 -0
  225. package/build/server/chunks/{routing-BdGCua8Q.js → routing-CYknP78v.js} +23 -4
  226. package/build/server/chunks/routing-CYknP78v.js.map +1 -0
  227. package/build/server/chunks/{server2-CkPmd3Rb.js → server2-uigtM6st.js} +3 -3
  228. package/build/server/chunks/server2-uigtM6st.js.map +1 -0
  229. package/build/server/chunks/{servers.remote-OwAA4KJJ.js → servers.remote-BhpVo4Zs.js} +67 -42
  230. package/build/server/chunks/servers.remote-BhpVo4Zs.js.map +1 -0
  231. package/build/server/chunks/shared-BqTYMAzZ.js +1027 -0
  232. package/build/server/chunks/shared-BqTYMAzZ.js.map +1 -0
  233. package/build/server/chunks/shared-server-BmU87nph.js +11 -0
  234. package/build/server/chunks/shared-server-BmU87nph.js.map +1 -0
  235. package/build/server/chunks/{state.svelte-BfzDwKMC.js → state.svelte-Dzb7Lf2r.js} +2 -3
  236. package/build/server/chunks/state.svelte-Dzb7Lf2r.js.map +1 -0
  237. package/build/server/chunks/url-hmE1zcJ6.js +4721 -0
  238. package/build/server/chunks/url-hmE1zcJ6.js.map +1 -0
  239. package/build/server/chunks/{utils-kjxf7BZO.js → utils2-kjxf7BZO.js} +1 -1
  240. package/build/server/chunks/utils2-kjxf7BZO.js.map +1 -0
  241. package/build/server/index.js +381 -3466
  242. package/build/server/index.js.map +1 -1
  243. package/build/server/manifest.js +52 -23
  244. package/build/server/manifest.js.map +1 -1
  245. package/cli.ts +4 -0
  246. package/dist/cli.js +3 -0
  247. package/ecosystem.config.js +3 -0
  248. package/package.json +2 -2
  249. package/src/api/servers.remote.ts +20 -8
  250. package/src/app.d.ts +5 -0
  251. package/src/hooks.server.ts +38 -17
  252. package/src/lib/actions/jsonTextarea.ts +24 -8
  253. package/src/lib/actions/portal.ts +12 -5
  254. package/src/lib/components/ExplainPanel.svelte +42 -14
  255. package/src/lib/components/JsonValue.svelte +12 -4
  256. package/src/lib/components/PrettyJson.svelte +12 -4
  257. package/src/lib/components/ReplicaSetSelector.svelte +3 -1
  258. package/src/lib/components/SearchBox.svelte +12 -4
  259. package/src/lib/components/Tooltip.svelte +1 -1
  260. package/src/lib/server/HostsManager.ts +8 -17
  261. package/src/lib/server/logger.ts +4 -4
  262. package/src/lib/server/mongo.ts +17 -12
  263. package/src/lib/server/oauth.ts +276 -0
  264. package/src/lib/utils/filters.ts +15 -5
  265. package/src/lib/utils/formatSignificantDigits.ts +3 -1
  266. package/src/lib/utils/formatTimeAgo.ts +3 -1
  267. package/src/lib/utils/hostnames.ts +15 -5
  268. package/src/lib/utils/jsonParser.ts +21 -7
  269. package/src/lib/utils/longestCommonSuffix.ts +3 -1
  270. package/src/routes/+layout.server.ts +5 -1
  271. package/src/routes/+layout.svelte +16 -1
  272. package/src/routes/.well-known/cimd.json/+server.ts +34 -0
  273. package/src/routes/auth/callback/+server.ts +57 -0
  274. package/src/routes/auth/login/+server.ts +29 -0
  275. package/src/routes/auth/logout/+page.svelte +9 -0
  276. package/src/routes/auth/logout/+server.ts +9 -0
  277. package/src/routes/servers/+page.svelte +9 -4
  278. package/src/routes/servers/[server]/databases/+page.svelte +3 -1
  279. package/src/routes/servers/[server]/databases/[database]/collections/+page.svelte +3 -1
  280. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.svelte +3 -1
  281. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.svelte +9 -6
  282. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.svelte +18 -6
  283. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.svelte +3 -1
  284. package/build/client/_app/immutable/assets/0.Bg-3Xsxo.css +0 -1
  285. package/build/client/_app/immutable/assets/0.Bg-3Xsxo.css.br +0 -0
  286. package/build/client/_app/immutable/assets/0.Bg-3Xsxo.css.gz +0 -0
  287. package/build/client/_app/immutable/chunks/2G5jukcB.js +0 -1
  288. package/build/client/_app/immutable/chunks/2G5jukcB.js.br +0 -0
  289. package/build/client/_app/immutable/chunks/2G5jukcB.js.gz +0 -0
  290. package/build/client/_app/immutable/chunks/B5NTIIm5.js.br +0 -0
  291. package/build/client/_app/immutable/chunks/B5NTIIm5.js.gz +0 -0
  292. package/build/client/_app/immutable/chunks/BEi7QatZ.js.br +0 -0
  293. package/build/client/_app/immutable/chunks/BEi7QatZ.js.gz +0 -0
  294. package/build/client/_app/immutable/chunks/BOZBLPYr.js +0 -1
  295. package/build/client/_app/immutable/chunks/BOZBLPYr.js.br +0 -0
  296. package/build/client/_app/immutable/chunks/BOZBLPYr.js.gz +0 -0
  297. package/build/client/_app/immutable/chunks/BUr91kOw.js +0 -1
  298. package/build/client/_app/immutable/chunks/BUr91kOw.js.br +0 -0
  299. package/build/client/_app/immutable/chunks/BUr91kOw.js.gz +0 -0
  300. package/build/client/_app/immutable/chunks/BYPjaq07.js +0 -1
  301. package/build/client/_app/immutable/chunks/BYPjaq07.js.br +0 -0
  302. package/build/client/_app/immutable/chunks/BYPjaq07.js.gz +0 -0
  303. package/build/client/_app/immutable/chunks/BZagxdqB.js +0 -16
  304. package/build/client/_app/immutable/chunks/BZagxdqB.js.br +0 -0
  305. package/build/client/_app/immutable/chunks/BZagxdqB.js.gz +0 -0
  306. package/build/client/_app/immutable/chunks/Bh2n5Bfy.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/Bh2n5Bfy.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/Bl8s7Z6r.js.br +0 -1
  309. package/build/client/_app/immutable/chunks/Bl8s7Z6r.js.gz +0 -0
  310. package/build/client/_app/immutable/chunks/BnpHJF5-.js +0 -2
  311. package/build/client/_app/immutable/chunks/BnpHJF5-.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/BnpHJF5-.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/C2amz0TU.js.br +0 -0
  314. package/build/client/_app/immutable/chunks/C2amz0TU.js.gz +0 -0
  315. package/build/client/_app/immutable/chunks/C93uPVVn.js +0 -1
  316. package/build/client/_app/immutable/chunks/C93uPVVn.js.br +0 -0
  317. package/build/client/_app/immutable/chunks/C93uPVVn.js.gz +0 -0
  318. package/build/client/_app/immutable/chunks/CXNtxrhs.js +0 -1
  319. package/build/client/_app/immutable/chunks/CXNtxrhs.js.br +0 -0
  320. package/build/client/_app/immutable/chunks/CXNtxrhs.js.gz +0 -0
  321. package/build/client/_app/immutable/chunks/Cc583CkD.js +0 -1
  322. package/build/client/_app/immutable/chunks/Cc583CkD.js.br +0 -0
  323. package/build/client/_app/immutable/chunks/Cc583CkD.js.gz +0 -0
  324. package/build/client/_app/immutable/chunks/CxcplU4Q.js.br +0 -0
  325. package/build/client/_app/immutable/chunks/CxcplU4Q.js.gz +0 -0
  326. package/build/client/_app/immutable/chunks/DDy-Kuac.js +0 -1
  327. package/build/client/_app/immutable/chunks/DDy-Kuac.js.br +0 -0
  328. package/build/client/_app/immutable/chunks/DDy-Kuac.js.gz +0 -0
  329. package/build/client/_app/immutable/chunks/DIDOrPa8.js +0 -41
  330. package/build/client/_app/immutable/chunks/DIDOrPa8.js.br +0 -0
  331. package/build/client/_app/immutable/chunks/DIDOrPa8.js.gz +0 -0
  332. package/build/client/_app/immutable/chunks/DJ7MgPmk.js +0 -4
  333. package/build/client/_app/immutable/chunks/DJ7MgPmk.js.br +0 -0
  334. package/build/client/_app/immutable/chunks/DJ7MgPmk.js.gz +0 -0
  335. package/build/client/_app/immutable/chunks/DUw-I2kh.js.br +0 -0
  336. package/build/client/_app/immutable/chunks/DUw-I2kh.js.gz +0 -0
  337. package/build/client/_app/immutable/chunks/DdLT9cdj.js.br +0 -0
  338. package/build/client/_app/immutable/chunks/DdLT9cdj.js.gz +0 -0
  339. package/build/client/_app/immutable/chunks/c-rWvg5T.js.br +0 -0
  340. package/build/client/_app/immutable/chunks/c-rWvg5T.js.gz +0 -0
  341. package/build/client/_app/immutable/chunks/hbftB6pI.js +0 -1
  342. package/build/client/_app/immutable/chunks/hbftB6pI.js.br +0 -0
  343. package/build/client/_app/immutable/chunks/hbftB6pI.js.gz +0 -0
  344. package/build/client/_app/immutable/entry/app.BvdA5xZX.js +0 -2
  345. package/build/client/_app/immutable/entry/app.BvdA5xZX.js.br +0 -0
  346. package/build/client/_app/immutable/entry/app.BvdA5xZX.js.gz +0 -0
  347. package/build/client/_app/immutable/entry/start.B47HTlUj.js +0 -1
  348. package/build/client/_app/immutable/entry/start.B47HTlUj.js.br +0 -2
  349. package/build/client/_app/immutable/entry/start.B47HTlUj.js.gz +0 -0
  350. package/build/client/_app/immutable/nodes/0.C-Qb2qV-.js +0 -1
  351. package/build/client/_app/immutable/nodes/0.C-Qb2qV-.js.br +0 -0
  352. package/build/client/_app/immutable/nodes/0.C-Qb2qV-.js.gz +0 -0
  353. package/build/client/_app/immutable/nodes/1.CbwunOOA.js +0 -1
  354. package/build/client/_app/immutable/nodes/1.CbwunOOA.js.br +0 -4
  355. package/build/client/_app/immutable/nodes/1.CbwunOOA.js.gz +0 -0
  356. package/build/client/_app/immutable/nodes/10.BONTXBU2.js +0 -6
  357. package/build/client/_app/immutable/nodes/10.BONTXBU2.js.br +0 -0
  358. package/build/client/_app/immutable/nodes/10.BONTXBU2.js.gz +0 -0
  359. package/build/client/_app/immutable/nodes/11.Bt-WKNEi.js +0 -1
  360. package/build/client/_app/immutable/nodes/11.Bt-WKNEi.js.br +0 -0
  361. package/build/client/_app/immutable/nodes/11.Bt-WKNEi.js.gz +0 -0
  362. package/build/client/_app/immutable/nodes/12.DtpUwyyZ.js +0 -1
  363. package/build/client/_app/immutable/nodes/12.DtpUwyyZ.js.br +0 -0
  364. package/build/client/_app/immutable/nodes/12.DtpUwyyZ.js.gz +0 -0
  365. package/build/client/_app/immutable/nodes/13.Ce307l0A.js +0 -65
  366. package/build/client/_app/immutable/nodes/13.Ce307l0A.js.br +0 -0
  367. package/build/client/_app/immutable/nodes/13.Ce307l0A.js.gz +0 -0
  368. package/build/client/_app/immutable/nodes/2.AM8fesja.js.br +0 -0
  369. package/build/client/_app/immutable/nodes/2.AM8fesja.js.gz +0 -0
  370. package/build/client/_app/immutable/nodes/3.BShuoOz5.js.br +0 -0
  371. package/build/client/_app/immutable/nodes/3.BShuoOz5.js.gz +0 -0
  372. package/build/client/_app/immutable/nodes/4.BD6QbApY.js.br +0 -0
  373. package/build/client/_app/immutable/nodes/4.BD6QbApY.js.gz +0 -0
  374. package/build/client/_app/immutable/nodes/5.JM_dwz0R.js.br +0 -0
  375. package/build/client/_app/immutable/nodes/5.JM_dwz0R.js.gz +0 -0
  376. package/build/client/_app/immutable/nodes/7.lTuFbCm_.js +0 -1
  377. package/build/client/_app/immutable/nodes/7.lTuFbCm_.js.br +0 -0
  378. package/build/client/_app/immutable/nodes/7.lTuFbCm_.js.gz +0 -0
  379. package/build/client/_app/immutable/nodes/8.DIWHKPrG.js +0 -1
  380. package/build/client/_app/immutable/nodes/8.DIWHKPrG.js.br +0 -0
  381. package/build/client/_app/immutable/nodes/8.DIWHKPrG.js.gz +0 -0
  382. package/build/client/_app/immutable/nodes/9.D6Tw6uKW.js +0 -2
  383. package/build/client/_app/immutable/nodes/9.D6Tw6uKW.js.br +0 -0
  384. package/build/client/_app/immutable/nodes/9.D6Tw6uKW.js.gz +0 -0
  385. package/build/server/chunks/0-BdG9Cl9W.js +0 -22
  386. package/build/server/chunks/0-BdG9Cl9W.js.map +0 -1
  387. package/build/server/chunks/1-BcZWKLgB.js +0 -9
  388. package/build/server/chunks/1-BcZWKLgB.js.map +0 -1
  389. package/build/server/chunks/10-WRjYTwFT.js.map +0 -1
  390. package/build/server/chunks/11-Cq79IAWK.js.map +0 -1
  391. package/build/server/chunks/12-DnRkeAVv.js.map +0 -1
  392. package/build/server/chunks/13-DKqDuEdB.js.map +0 -1
  393. package/build/server/chunks/6-DsYzHmsZ.js.map +0 -1
  394. package/build/server/chunks/7-eAzN1saI.js.map +0 -1
  395. package/build/server/chunks/8-Dtaxi2J_.js.map +0 -1
  396. package/build/server/chunks/9-DrDIAOIh.js.map +0 -1
  397. package/build/server/chunks/JsonValue-Dj3vYG5T.js +0 -366
  398. package/build/server/chunks/JsonValue-Dj3vYG5T.js.map +0 -1
  399. package/build/server/chunks/Modal-fWUUqg69.js.map +0 -1
  400. package/build/server/chunks/Panel-BXokpC3w.js.map +0 -1
  401. package/build/server/chunks/PrettyJson-CV4qF02W.js.map +0 -1
  402. package/build/server/chunks/Tooltip-1tZ4BUxU.js.map +0 -1
  403. package/build/server/chunks/TooltipTable-B2QGp4YW.js.map +0 -1
  404. package/build/server/chunks/_layout.svelte-DAGMbkJX.js.map +0 -1
  405. package/build/server/chunks/_page.svelte-BUqI0nM9.js.map +0 -1
  406. package/build/server/chunks/_page.svelte-CB9ZXhBt.js.map +0 -1
  407. package/build/server/chunks/_page.svelte-Ccc0KJ66.js.map +0 -1
  408. package/build/server/chunks/_page.svelte-ClakOyno.js.map +0 -1
  409. package/build/server/chunks/_page.svelte-DfZ2COw_.js.map +0 -1
  410. package/build/server/chunks/_page.svelte-DgQxD9T8.js.map +0 -1
  411. package/build/server/chunks/_page.svelte-wmgrrvR7.js.map +0 -1
  412. package/build/server/chunks/client-BCfAqu0g.js +0 -7
  413. package/build/server/chunks/client2-B-hc4vU8.js.map +0 -1
  414. package/build/server/chunks/context-8UI9xWgq.js +0 -92
  415. package/build/server/chunks/context-8UI9xWgq.js.map +0 -1
  416. package/build/server/chunks/error.svelte-hj6GNaOv.js +0 -19
  417. package/build/server/chunks/error.svelte-hj6GNaOv.js.map +0 -1
  418. package/build/server/chunks/event-DVH-6ISX.js +0 -64
  419. package/build/server/chunks/event-DVH-6ISX.js.map +0 -1
  420. package/build/server/chunks/exports-CtTNDGe5.js +0 -161
  421. package/build/server/chunks/exports-CtTNDGe5.js.map +0 -1
  422. package/build/server/chunks/filters-CbFjTNFI.js.map +0 -1
  423. package/build/server/chunks/hooks.server-DRPXFQlL.js +0 -53
  424. package/build/server/chunks/hooks.server-DRPXFQlL.js.map +0 -1
  425. package/build/server/chunks/index-DOCFW0vv.js +0 -1355
  426. package/build/server/chunks/index-DOCFW0vv.js.map +0 -1
  427. package/build/server/chunks/index2-CJE0QJlP.js.map +0 -1
  428. package/build/server/chunks/index3-CQyDuV4f.js.map +0 -1
  429. package/build/server/chunks/logger-KF6KpVP6.js.map +0 -1
  430. package/build/server/chunks/mongo-CpQtfvt6.js.map +0 -1
  431. package/build/server/chunks/remote-xxtqbu-CbTWQ3bq.js +0 -21
  432. package/build/server/chunks/remote-xxtqbu-CbTWQ3bq.js.map +0 -1
  433. package/build/server/chunks/routing-BdGCua8Q.js.map +0 -1
  434. package/build/server/chunks/server2-CkPmd3Rb.js.map +0 -1
  435. package/build/server/chunks/servers.remote-OwAA4KJJ.js.map +0 -1
  436. package/build/server/chunks/shared-w5gO1Cte.js +0 -446
  437. package/build/server/chunks/shared-w5gO1Cte.js.map +0 -1
  438. package/build/server/chunks/state.svelte-BfzDwKMC.js.map +0 -1
  439. package/build/server/chunks/utils-kjxf7BZO.js.map +0 -1
  440. package/build/server/chunks/utils2-DrnJY_bz.js +0 -91
  441. package/build/server/chunks/utils2-DrnJY_bz.js.map +0 -1
  442. /package/build/client/_app/immutable/assets/{10.Wc4MTSzM.css → 11.Wc4MTSzM.css} +0 -0
  443. /package/build/client/_app/immutable/assets/{10.Wc4MTSzM.css.br → 11.Wc4MTSzM.css.br} +0 -0
  444. /package/build/client/_app/immutable/assets/{10.Wc4MTSzM.css.gz → 11.Wc4MTSzM.css.gz} +0 -0
  445. /package/build/client/_app/immutable/assets/{11.CEtFGlZU.css → 12.CEtFGlZU.css} +0 -0
  446. /package/build/client/_app/immutable/assets/{11.CEtFGlZU.css.br → 12.CEtFGlZU.css.br} +0 -0
  447. /package/build/client/_app/immutable/assets/{11.CEtFGlZU.css.gz → 12.CEtFGlZU.css.gz} +0 -0
  448. /package/build/client/_app/immutable/assets/{12.I1sSDJ6i.css → 13.I1sSDJ6i.css} +0 -0
  449. /package/build/client/_app/immutable/assets/{12.I1sSDJ6i.css.br → 13.I1sSDJ6i.css.br} +0 -0
  450. /package/build/client/_app/immutable/assets/{12.I1sSDJ6i.css.gz → 13.I1sSDJ6i.css.gz} +0 -0
  451. /package/build/client/_app/immutable/assets/{7.CRKE8WvY.css → 8.CRKE8WvY.css} +0 -0
  452. /package/build/client/_app/immutable/assets/{7.CRKE8WvY.css.br → 8.CRKE8WvY.css.br} +0 -0
  453. /package/build/client/_app/immutable/assets/{7.CRKE8WvY.css.gz → 8.CRKE8WvY.css.gz} +0 -0
@@ -12,7 +12,9 @@
12
12
 
13
13
  // Recursively find index name in the execution plan tree
14
14
  function findIndexInPlan(plan: Record<string, unknown> | undefined): string | null {
15
- if (!plan) return null;
15
+ if (!plan) {
16
+ return null;
17
+ }
16
18
 
17
19
  // Check if this stage has an index
18
20
  if (plan.indexName) {
@@ -27,21 +29,27 @@
27
29
  // Recursively check inputStage
28
30
  if (plan.inputStage) {
29
31
  const result = findIndexInPlan(plan.inputStage as Record<string, unknown>);
30
- if (result) return result;
32
+ if (result) {
33
+ return result;
34
+ }
31
35
  }
32
36
 
33
37
  // Check inputStages array (for some aggregation plans)
34
38
  if (Array.isArray(plan.inputStages)) {
35
39
  for (const stage of plan.inputStages) {
36
40
  const result = findIndexInPlan(stage as Record<string, unknown>);
37
- if (result) return result;
41
+ if (result) {
42
+ return result;
43
+ }
38
44
  }
39
45
  }
40
46
 
41
47
  // Check queryPlan (for some MongoDB versions)
42
48
  if (plan.queryPlan) {
43
49
  const result = findIndexInPlan(plan.queryPlan as Record<string, unknown>);
44
- if (result) return result;
50
+ if (result) {
51
+ return result;
52
+ }
45
53
  }
46
54
 
47
55
  return null;
@@ -49,22 +57,32 @@
49
57
 
50
58
  // Check if plan contains COLLSCAN (no index used)
51
59
  function hasCollScan(plan: Record<string, unknown> | undefined): boolean {
52
- if (!plan) return false;
60
+ if (!plan) {
61
+ return false;
62
+ }
53
63
 
54
- if (plan.stage === "COLLSCAN") return true;
64
+ if (plan.stage === "COLLSCAN") {
65
+ return true;
66
+ }
55
67
 
56
68
  if (plan.inputStage) {
57
- if (hasCollScan(plan.inputStage as Record<string, unknown>)) return true;
69
+ if (hasCollScan(plan.inputStage as Record<string, unknown>)) {
70
+ return true;
71
+ }
58
72
  }
59
73
 
60
74
  if (Array.isArray(plan.inputStages)) {
61
75
  for (const stage of plan.inputStages) {
62
- if (hasCollScan(stage as Record<string, unknown>)) return true;
76
+ if (hasCollScan(stage as Record<string, unknown>)) {
77
+ return true;
78
+ }
63
79
  }
64
80
  }
65
81
 
66
82
  if (plan.queryPlan) {
67
- if (hasCollScan(plan.queryPlan as Record<string, unknown>)) return true;
83
+ if (hasCollScan(plan.queryPlan as Record<string, unknown>)) {
84
+ return true;
85
+ }
68
86
  }
69
87
 
70
88
  return false;
@@ -72,7 +90,9 @@
72
90
 
73
91
  // Extract key metrics from explain output
74
92
  const metrics = $derived.by(() => {
75
- if (!data || typeof data !== "object") return null;
93
+ if (!data || typeof data !== "object") {
94
+ return null;
95
+ }
76
96
 
77
97
  const d = data as Record<string, unknown>;
78
98
  const execStats = d.executionStats as Record<string, unknown> | undefined;
@@ -112,7 +132,9 @@
112
132
  // When index used: nReturned / keysExamined
113
133
  // When COLLSCAN (keysExamined = 0): 0% efficiency
114
134
  const efficiency = $derived.by(() => {
115
- if (!metrics) return null;
135
+ if (!metrics) {
136
+ return null;
137
+ }
116
138
  const keysExamined = Number(metrics.keysExamined);
117
139
  const returned = Number(metrics.nReturned);
118
140
 
@@ -126,7 +148,9 @@
126
148
 
127
149
  // For display
128
150
  const efficiencyLabel = $derived.by(() => {
129
- if (!metrics) return "";
151
+ if (!metrics) {
152
+ return "";
153
+ }
130
154
  const keysExamined = Number(metrics.keysExamined);
131
155
  const docsExamined = Number(metrics.docsExamined);
132
156
  const returned = Number(metrics.nReturned);
@@ -139,9 +163,13 @@
139
163
 
140
164
  // Determine if the query is efficient
141
165
  const isEfficient = $derived.by(() => {
142
- if (!metrics) return null;
166
+ if (!metrics) {
167
+ return null;
168
+ }
143
169
  // COLLSCAN is generally inefficient for large collections
144
- if (metrics.indexUsed === "COLLSCAN" || metrics.indexUsed === "N/A") return false;
170
+ if (metrics.indexUsed === "COLLSCAN" || metrics.indexUsed === "N/A") {
171
+ return false;
172
+ }
145
173
  // Has an index - that's good
146
174
  return true;
147
175
  });
@@ -70,7 +70,9 @@
70
70
  }
71
71
 
72
72
  async function handleMouseEnter() {
73
- if (!hasMappings || !fetchMappedDocument) return;
73
+ if (!hasMappings || !fetchMappedDocument) {
74
+ return;
75
+ }
74
76
 
75
77
  // Clear any pending hide timeout
76
78
  if (hideTooltipTimeout) {
@@ -81,7 +83,9 @@
81
83
  showTooltip = true;
82
84
 
83
85
  // If already fetched, don't fetch again
84
- if (fetchedDocument || isFetching) return;
86
+ if (fetchedDocument || isFetching) {
87
+ return;
88
+ }
85
89
 
86
90
  isFetching = true;
87
91
  fetchError = null;
@@ -126,8 +130,12 @@
126
130
 
127
131
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
132
  function getValueType(val: any): string {
129
- if (val === null) return "null";
130
- if (Array.isArray(val)) return "array";
133
+ if (val === null) {
134
+ return "null";
135
+ }
136
+ if (Array.isArray(val)) {
137
+ return "array";
138
+ }
131
139
 
132
140
  switch (typeof val) {
133
141
  case "boolean":
@@ -36,9 +36,15 @@
36
36
 
37
37
  // Helper to get ID value from any type
38
38
  function getIdValue(val: any): string | null {
39
- if (val === null || val === undefined) return null;
40
- if (typeof val === "string" || typeof val === "number") return String(val);
41
- if (val.$type === "ObjectId" && val.$value) return val.$value;
39
+ if (val === null || val === undefined) {
40
+ return null;
41
+ }
42
+ if (typeof val === "string" || typeof val === "number") {
43
+ return String(val);
44
+ }
45
+ if (val.$type === "ObjectId" && val.$value) {
46
+ return val.$value;
47
+ }
42
48
  return null;
43
49
  }
44
50
 
@@ -119,7 +125,9 @@
119
125
 
120
126
  // Watch for textarea resize and update panel height
121
127
  $effect(() => {
122
- if (!textareaRef || !panelRef || !editorVisible) return;
128
+ if (!textareaRef || !panelRef || !editorVisible) {
129
+ return;
130
+ }
123
131
 
124
132
  const resizeObserver = new ResizeObserver((entries) => {
125
133
  for (const entry of entries) {
@@ -22,7 +22,9 @@
22
22
 
23
23
  // Find the actual primary node by matching the longest common suffix
24
24
  const matchedPrimaryNode = $derived.by(() => {
25
- if (!primaryNode || availableNodes.length === 0) return null;
25
+ if (!primaryNode || availableNodes.length === 0) {
26
+ return null;
27
+ }
26
28
  return findBestSuffixMatch(primaryNode, availableNodes);
27
29
  });
28
30
 
@@ -104,7 +104,9 @@
104
104
  $effect(() => {
105
105
  if (showModeDropdown && modeButtonElement) {
106
106
  tick().then(() => {
107
- if (!modeButtonElement) return;
107
+ if (!modeButtonElement) {
108
+ return;
109
+ }
108
110
  const rect = modeButtonElement.getBoundingClientRect();
109
111
  dropdownPosition = {
110
112
  left: `${rect.left}px`,
@@ -207,7 +209,9 @@
207
209
  $effect(() => {
208
210
  if (showNewDocsDropdown && newDocsButtonElement) {
209
211
  tick().then(() => {
210
- if (!newDocsButtonElement) return;
212
+ if (!newDocsButtonElement) {
213
+ return;
214
+ }
211
215
  const rect = newDocsButtonElement.getBoundingClientRect();
212
216
  newDocsDropdownPosition = {
213
217
  left: `${rect.right - 200}px`,
@@ -219,7 +223,9 @@
219
223
  });
220
224
 
221
225
  async function loadStats() {
222
- if (!server || !database || !collection || isStatsLoading) return;
226
+ if (!server || !database || !collection || isStatsLoading) {
227
+ return;
228
+ }
223
229
 
224
230
  isStatsLoading = true;
225
231
  // Reset all stats to loading state
@@ -252,7 +258,9 @@
252
258
 
253
259
  function toggleNewDocsDropdown() {
254
260
  showNewDocsDropdown = !showNewDocsDropdown;
255
- if (!showNewDocsDropdown) return;
261
+ if (!showNewDocsDropdown) {
262
+ return;
263
+ }
256
264
 
257
265
  // Reload stats if never loaded, or if the query has changed
258
266
  const currentQuery = params.mode === "query" ? params.query : undefined;
@@ -31,7 +31,7 @@
31
31
  $effect(() => {
32
32
  if (show && tooltipElement && containerElement) {
33
33
  tick().then(() => {
34
- if (!containerElement || !tooltipElement) return;
34
+ if (!containerElement || !tooltipElement) {return;}
35
35
 
36
36
  const containerRect = containerElement.getBoundingClientRect();
37
37
  const tooltipRect = tooltipElement.getBoundingClientRect();
@@ -1,3 +1,4 @@
1
+ import { env } from "$env/dynamic/private";
1
2
  import * as fs from "node:fs";
2
3
  import * as os from "node:os";
3
4
  import * as path from "node:path";
@@ -7,10 +8,8 @@ export interface Host {
7
8
  _id: string;
8
9
  }
9
10
 
10
- const DEFAULT_HOSTS = process.env.MONGOKU_DEFAULT_HOST
11
- ? process.env.MONGOKU_DEFAULT_HOST.split(";")
12
- : ["localhost:27017"];
13
- const DATABASE_FILE = process.env.MONGOKU_DATABASE_FILE || path.join(os.homedir(), ".mongoku.db");
11
+ const DEFAULT_HOSTS = env.MONGOKU_DEFAULT_HOST ? env.MONGOKU_DEFAULT_HOST.split(";") : ["localhost:27017"];
12
+ const DATABASE_FILE = env.MONGOKU_DATABASE_FILE || path.join(os.homedir(), ".mongoku.db");
14
13
 
15
14
  export class HostsManager {
16
15
  private _hosts: Map<string, string> = new Map(); // path -> _id
@@ -89,20 +88,12 @@ export class HostsManager {
89
88
  return id;
90
89
  }
91
90
 
92
- async remove(hostPath: string): Promise<void> {
93
- // Remove exact matches and regex pattern matches
94
- const toRemove = Array.from(this._hosts.keys()).filter((existingPath) => {
95
- try {
96
- const regex = new RegExp(hostPath);
97
- return existingPath === hostPath || regex.test(existingPath);
98
- } catch {
99
- // If hostPath is not a valid regex, just do exact match
100
- return existingPath === hostPath;
91
+ async removeById(id: string): Promise<void> {
92
+ for (const [hostPath, hostId] of this._hosts) {
93
+ if (hostId === id) {
94
+ this._hosts.delete(hostPath);
95
+ break;
101
96
  }
102
- });
103
-
104
- for (const host of toRemove) {
105
- this._hosts.delete(host);
106
97
  }
107
98
  await this._saveToFile();
108
99
  }
@@ -1,3 +1,4 @@
1
+ import { env } from "$env/dynamic/private";
1
2
  import { contextStore } from "$lib/server/contextStore";
2
3
  import { inspect } from "node:util";
3
4
 
@@ -11,10 +12,9 @@ class Logger {
11
12
  private logHeaders: string[];
12
13
 
13
14
  constructor() {
14
- this.structuredLogging = process.env.MONGOKU_STRUCTURED_LOG === "true";
15
- // Parse comma-delimited list of headers to log
16
- this.logHeaders = process.env.MONGOKU_LOG_HEADERS
17
- ? process.env.MONGOKU_LOG_HEADERS.split(",")
15
+ this.structuredLogging = env.MONGOKU_STRUCTURED_LOG === "true";
16
+ this.logHeaders = env.MONGOKU_LOG_HEADERS
17
+ ? env.MONGOKU_LOG_HEADERS.split(",")
18
18
  .map((h) => h.trim().toLowerCase())
19
19
  .filter(Boolean)
20
20
  : [];
@@ -1,3 +1,4 @@
1
+ import { env } from "$env/dynamic/private";
1
2
  import { logger } from "$lib/server/logger";
2
3
  import type { CollectionJSON, CollectionMappings, Mappings } from "$lib/types";
3
4
  import { resolveSrv } from "dns/promises";
@@ -200,17 +201,15 @@ class MongoConnections {
200
201
  private clients: Map<string, MongoClientWithMappings> = new Map(); // _id -> MongoClientWithMappings
201
202
  private clientIds: Map<string, string> = new Map(); // hostname -> _id
202
203
  private hostsManager: HostsManager;
203
- private countTimeout = parseInt(process.env.MONGOKU_COUNT_TIMEOUT!, 10) || 30_000;
204
- private queryTimeout = process.env.MONGOKU_QUERY_TIMEOUT
205
- ? parseInt(process.env.MONGOKU_QUERY_TIMEOUT, 10)
206
- : undefined;
204
+ private countTimeout = parseInt(env.MONGOKU_COUNT_TIMEOUT!, 10) || 30_000;
205
+ private queryTimeout = env.MONGOKU_QUERY_TIMEOUT ? parseInt(env.MONGOKU_QUERY_TIMEOUT, 10) : undefined;
207
206
  private excludedDatabases: Set<string>;
208
207
  private readPreference: ReadPreference | undefined;
209
208
 
210
209
  constructor() {
211
210
  this.hostsManager = new HostsManager();
212
211
  // Parse MONGOKU_EXCLUDE_DATABASES env var (comma-separated list)
213
- const excludeEnv = process.env.MONGOKU_EXCLUDE_DATABASES || "";
212
+ const excludeEnv = env.MONGOKU_EXCLUDE_DATABASES || "";
214
213
  this.excludedDatabases = new Set(
215
214
  excludeEnv
216
215
  .split(",")
@@ -221,7 +220,7 @@ class MongoConnections {
221
220
  // Parse read preference from env vars
222
221
  // MONGOKU_READ_PREFERENCE: primary, primaryPreferred, secondary, secondaryPreferred, nearest
223
222
  // MONGOKU_READ_PREFERENCE_TAGS: JSON array of tag sets, e.g. [{"nodeType":"ANALYTICS"},{}]
224
- const readPrefMode = process.env.MONGOKU_READ_PREFERENCE as
223
+ const readPrefMode = env.MONGOKU_READ_PREFERENCE as
225
224
  | "primary"
226
225
  | "primaryPreferred"
227
226
  | "secondary"
@@ -231,9 +230,9 @@ class MongoConnections {
231
230
 
232
231
  if (readPrefMode) {
233
232
  let tags: Array<Record<string, string>> | undefined;
234
- if (process.env.MONGOKU_READ_PREFERENCE_TAGS) {
233
+ if (env.MONGOKU_READ_PREFERENCE_TAGS) {
235
234
  try {
236
- tags = JSON.parse(process.env.MONGOKU_READ_PREFERENCE_TAGS);
235
+ tags = JSON.parse(env.MONGOKU_READ_PREFERENCE_TAGS);
237
236
  } catch (err) {
238
237
  logger.error("Failed to parse MONGOKU_READ_PREFERENCE_TAGS:", err);
239
238
  }
@@ -321,14 +320,20 @@ class MongoConnections {
321
320
  }
322
321
 
323
322
  async removeServer(name: string) {
324
- await this.hostsManager.remove(name);
323
+ const clientKey = this.clientIds.has(name) ? name : `${name}:27017`;
324
+ const clientId = this.clientIds.get(clientKey);
325
+ if (!clientId) {
326
+ throw new Error(`Server not found: ${name}`);
327
+ }
328
+
329
+ await this.hostsManager.removeById(clientId);
325
330
 
326
331
  this.clients
327
- .get(name)
332
+ .get(clientId)
328
333
  ?.close()
329
334
  .catch((err) => logger.error(`Error closing client ${name}:`, err));
330
- this.clients.delete(name);
331
- this.clientIds.delete(name);
335
+ this.clients.delete(clientId);
336
+ this.clientIds.delete(clientKey);
332
337
  }
333
338
 
334
339
  async reconnectClient(id: string) {
@@ -0,0 +1,276 @@
1
+ import { base } from "$app/paths";
2
+ import { env } from "$env/dynamic/private";
3
+ import { createHash, createHmac, randomBytes, timingSafeEqual } from "node:crypto";
4
+
5
+ export interface OAuthConfig {
6
+ clientId: string;
7
+ issuerUrl: string;
8
+ authorizationUrl: string;
9
+ tokenUrl: string;
10
+ scopes: string;
11
+ sessionSecret: string;
12
+ sessionDuration: number;
13
+ allowedSubs?: Set<string>;
14
+ }
15
+
16
+ export interface SessionPayload {
17
+ sub?: string;
18
+ name?: string;
19
+ email?: string;
20
+ exp: number;
21
+ }
22
+
23
+ interface OpenIDConfiguration {
24
+ authorization_endpoint: string;
25
+ token_endpoint: string;
26
+ }
27
+
28
+ interface TokenResponse {
29
+ access_token: string;
30
+ token_type: string;
31
+ expires_in?: number;
32
+ id_token?: string;
33
+ scope?: string;
34
+ }
35
+
36
+ const DEFAULT_SESSION_DURATION = 86400;
37
+ export const OAUTH_CIMD_CLIENT_ID = "__CIMD__";
38
+
39
+ let cachedConfig: OAuthConfig | null | undefined;
40
+
41
+ function parseSessionDuration(rawDuration: string | undefined): number {
42
+ if (!rawDuration) {
43
+ return DEFAULT_SESSION_DURATION;
44
+ }
45
+
46
+ const parsed = Number(rawDuration);
47
+ if (!Number.isInteger(parsed) || parsed <= 0) {
48
+ return DEFAULT_SESSION_DURATION;
49
+ }
50
+
51
+ return parsed;
52
+ }
53
+
54
+ async function fetchOpenIDConfiguration(issuerUrl: string): Promise<OpenIDConfiguration> {
55
+ const wellKnown = issuerUrl.replace(/\/+$/, "") + "/.well-known/openid-configuration";
56
+ const response = await fetch(wellKnown);
57
+
58
+ if (!response.ok) {
59
+ throw new Error(`Failed to fetch OpenID configuration from ${wellKnown} (${response.status})`);
60
+ }
61
+
62
+ const config = await response.json();
63
+
64
+ if (!config.authorization_endpoint || !config.token_endpoint) {
65
+ throw new Error(`OpenID configuration at ${wellKnown} is missing required endpoints`);
66
+ }
67
+
68
+ return config;
69
+ }
70
+
71
+ /**
72
+ * Returns OAuth config from env vars, or null if not configured.
73
+ * Fetches the OpenID discovery document on first call and caches the result.
74
+ * Throws if partially configured (some required vars missing).
75
+ */
76
+ export async function getOAuthConfig(): Promise<OAuthConfig | null> {
77
+ if (cachedConfig !== undefined) {
78
+ return cachedConfig;
79
+ }
80
+
81
+ const clientId = env.MONGOKU_OAUTH_CLIENT_ID;
82
+ if (!clientId) {
83
+ cachedConfig = null;
84
+ return null;
85
+ }
86
+
87
+ const issuerUrl = env.MONGOKU_OAUTH_ISSUER_URL;
88
+ const sessionSecret = env.MONGOKU_OAUTH_SESSION_SECRET;
89
+
90
+ if (!issuerUrl || !sessionSecret) {
91
+ throw new Error(
92
+ "OAuth is partially configured. When MONGOKU_OAUTH_CLIENT_ID is set, " +
93
+ "MONGOKU_OAUTH_ISSUER_URL and MONGOKU_OAUTH_SESSION_SECRET are also required.",
94
+ );
95
+ }
96
+
97
+ const oidc = await fetchOpenIDConfiguration(issuerUrl);
98
+
99
+ const allowedSubsRaw = env.MONGOKU_OAUTH_ALLOWED_SUBS;
100
+ const allowedSubs = allowedSubsRaw
101
+ ? new Set(
102
+ allowedSubsRaw
103
+ .split(",")
104
+ .map((s) => s.trim())
105
+ .filter(Boolean),
106
+ )
107
+ : undefined;
108
+
109
+ cachedConfig = {
110
+ clientId,
111
+ issuerUrl,
112
+ authorizationUrl: oidc.authorization_endpoint,
113
+ tokenUrl: oidc.token_endpoint,
114
+ scopes: env.MONGOKU_OAUTH_SCOPES ?? "openid profile email",
115
+ sessionSecret,
116
+ sessionDuration: parseSessionDuration(env.MONGOKU_OAUTH_SESSION_DURATION),
117
+ allowedSubs,
118
+ };
119
+
120
+ return cachedConfig;
121
+ }
122
+
123
+ function resolveOAuthClientId(config: OAuthConfig, origin: string): string {
124
+ if (config.clientId !== OAUTH_CIMD_CLIENT_ID) {
125
+ return config.clientId;
126
+ }
127
+
128
+ return new URL(`${base}/.well-known/cimd.json`, origin).toString();
129
+ }
130
+
131
+ function base64url(buffer: Buffer): string {
132
+ return buffer.toString("base64url");
133
+ }
134
+
135
+ export function generateCodeVerifier(): string {
136
+ return base64url(randomBytes(64));
137
+ }
138
+
139
+ export function generateCodeChallenge(verifier: string): string {
140
+ return base64url(createHash("sha256").update(verifier).digest());
141
+ }
142
+
143
+ export function generateState(): string {
144
+ return base64url(randomBytes(32));
145
+ }
146
+
147
+ export function buildAuthorizationUrl(
148
+ config: OAuthConfig,
149
+ origin: string,
150
+ callbackUrl: string,
151
+ codeChallenge: string,
152
+ state: string,
153
+ ): string {
154
+ const url = new URL(config.authorizationUrl);
155
+ url.searchParams.set("client_id", resolveOAuthClientId(config, origin));
156
+ url.searchParams.set("response_type", "code");
157
+ url.searchParams.set("redirect_uri", callbackUrl);
158
+ url.searchParams.set("scope", config.scopes);
159
+ url.searchParams.set("state", state);
160
+ url.searchParams.set("code_challenge", codeChallenge);
161
+ url.searchParams.set("code_challenge_method", "S256");
162
+ return url.toString();
163
+ }
164
+
165
+ export async function exchangeCode(
166
+ config: OAuthConfig,
167
+ origin: string,
168
+ code: string,
169
+ codeVerifier: string,
170
+ callbackUrl: string,
171
+ ): Promise<TokenResponse> {
172
+ const body = new URLSearchParams({
173
+ grant_type: "authorization_code",
174
+ code,
175
+ redirect_uri: callbackUrl,
176
+ client_id: resolveOAuthClientId(config, origin),
177
+ code_verifier: codeVerifier,
178
+ });
179
+
180
+ const response = await fetch(config.tokenUrl, {
181
+ method: "POST",
182
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
183
+ body: body.toString(),
184
+ });
185
+
186
+ if (!response.ok) {
187
+ const text = await response.text();
188
+ throw new Error(`Token exchange failed (${response.status}): ${text}`);
189
+ }
190
+
191
+ return response.json();
192
+ }
193
+
194
+ /**
195
+ * Extract user info from an OIDC id_token (JWT) without cryptographic verification.
196
+ * This is safe because the token was obtained directly from the token endpoint over HTTPS.
197
+ */
198
+ export function extractUserFromIdToken(idToken: string): { sub?: string; name?: string; email?: string } {
199
+ try {
200
+ const parts = idToken.split(".");
201
+ if (parts.length !== 3) {
202
+ return {};
203
+ }
204
+ const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString());
205
+ return {
206
+ sub: payload.sub,
207
+ name: payload.name || payload.preferred_username,
208
+ email: payload.email,
209
+ };
210
+ } catch {
211
+ return {};
212
+ }
213
+ }
214
+
215
+ export function createSessionCookie(
216
+ config: OAuthConfig,
217
+ user: { sub?: string; name?: string; email?: string },
218
+ ): string {
219
+ const sessionDuration =
220
+ Number.isInteger(config.sessionDuration) && config.sessionDuration > 0
221
+ ? config.sessionDuration
222
+ : DEFAULT_SESSION_DURATION;
223
+
224
+ const payload: SessionPayload = {
225
+ ...user,
226
+ exp: Math.floor(Date.now() / 1000) + sessionDuration,
227
+ };
228
+ const payloadStr = Buffer.from(JSON.stringify(payload)).toString("base64url");
229
+ const signature = createHmac("sha256", config.sessionSecret).update(payloadStr).digest("base64url");
230
+ return `${payloadStr}.${signature}`;
231
+ }
232
+
233
+ export function verifySession(config: OAuthConfig, cookie: string): SessionPayload | null {
234
+ const dotIndex = cookie.lastIndexOf(".");
235
+ if (dotIndex === -1) {
236
+ return null;
237
+ }
238
+
239
+ const payloadStr = cookie.slice(0, dotIndex);
240
+ const signature = cookie.slice(dotIndex + 1);
241
+
242
+ const expectedSignature = createHmac("sha256", config.sessionSecret).update(payloadStr).digest("base64url");
243
+
244
+ const a = Buffer.from(signature);
245
+ const b = Buffer.from(expectedSignature);
246
+ if (a.length !== b.length || !timingSafeEqual(a, b)) {
247
+ return null;
248
+ }
249
+
250
+ try {
251
+ const payload: SessionPayload = JSON.parse(Buffer.from(payloadStr, "base64url").toString());
252
+ if (!Number.isFinite(payload.exp)) {
253
+ return null;
254
+ }
255
+ if (payload.exp < Math.floor(Date.now() / 1000)) {
256
+ return null;
257
+ }
258
+ return payload;
259
+ } catch {
260
+ return null;
261
+ }
262
+ }
263
+
264
+ export function getCallbackUrl(origin: string): string {
265
+ return `${origin}${base}/auth/callback`;
266
+ }
267
+
268
+ export function cookieOptions(url: URL, maxAge?: number) {
269
+ return {
270
+ httpOnly: true,
271
+ secure: url.protocol === "https:",
272
+ sameSite: "lax" as const,
273
+ path: base || "/",
274
+ ...(maxAge !== undefined && { maxAge }),
275
+ };
276
+ }
@@ -1,9 +1,19 @@
1
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";
2
+ if (bytes === 0) {
3
+ return "0 B";
4
+ }
5
+ if (bytes < 1000) {
6
+ return bytes + " B";
7
+ }
8
+ if (bytes < 1000000) {
9
+ return (bytes / 1000).toFixed(2) + " kB";
10
+ }
11
+ if (bytes < 1000000000) {
12
+ return (bytes / 1000000).toFixed(2) + " MB";
13
+ }
14
+ if (bytes < 1000000000000) {
15
+ return (bytes / 1000000000).toFixed(2) + " GB";
16
+ }
7
17
  return (bytes / 1000000000000).toFixed(2) + " TB";
8
18
  }
9
19