mongoku 2.0.4 → 2.1.0

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 (414) hide show
  1. package/README.md +14 -2
  2. package/build/client/_app/immutable/assets/0.egX7ddQL.css +1 -0
  3. package/build/client/_app/immutable/assets/0.egX7ddQL.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.egX7ddQL.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/10.59aTjJn9.css +1 -0
  6. package/build/client/_app/immutable/assets/10.59aTjJn9.css.br +0 -0
  7. package/build/client/_app/immutable/assets/10.59aTjJn9.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/11.CEtFGlZU.css +1 -0
  9. package/build/client/_app/immutable/assets/11.CEtFGlZU.css.br +1 -0
  10. package/build/client/_app/immutable/assets/11.CEtFGlZU.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/12.BdCOhvz0.css +1 -0
  12. package/build/client/_app/immutable/assets/12.BdCOhvz0.css.br +0 -0
  13. package/build/client/_app/immutable/assets/12.BdCOhvz0.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/JsonValue.BEbzuWqZ.css +1 -0
  15. package/build/client/_app/immutable/assets/JsonValue.BEbzuWqZ.css.br +0 -0
  16. package/build/client/_app/immutable/assets/JsonValue.BEbzuWqZ.css.gz +0 -0
  17. package/build/client/_app/immutable/assets/Modal.DIIFkbGB.css +1 -0
  18. package/build/client/_app/immutable/assets/Modal.DIIFkbGB.css.br +0 -0
  19. package/build/client/_app/immutable/assets/Modal.DIIFkbGB.css.gz +0 -0
  20. package/build/client/_app/immutable/assets/Panel.B3aWupye.css +1 -0
  21. package/build/client/_app/immutable/assets/Panel.B3aWupye.css.br +0 -0
  22. package/build/client/_app/immutable/assets/Panel.B3aWupye.css.gz +0 -0
  23. package/build/client/_app/immutable/chunks/7rjwS0Fa.js +1 -0
  24. package/build/client/_app/immutable/chunks/7rjwS0Fa.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/7rjwS0Fa.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/BLDrwdCC.js +1 -0
  27. package/build/client/_app/immutable/chunks/BLDrwdCC.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/BLDrwdCC.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/BNpv6iz_.js +1 -0
  30. package/build/client/_app/immutable/chunks/BNpv6iz_.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/BNpv6iz_.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/BY7rCWFm.js +1 -0
  33. package/build/client/_app/immutable/chunks/BY7rCWFm.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/BY7rCWFm.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/BirzSxMb.js +2 -0
  36. package/build/client/_app/immutable/chunks/BirzSxMb.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/BirzSxMb.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/BsxVnnsB.js +1 -0
  39. package/build/client/_app/immutable/chunks/BsxVnnsB.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/BsxVnnsB.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/BtVcRw28.js +29 -0
  42. package/build/client/_app/immutable/chunks/BtVcRw28.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/BtVcRw28.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/CdQ4HxbR.js +2 -0
  45. package/build/client/_app/immutable/chunks/CdQ4HxbR.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/CdQ4HxbR.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/CeUVbZ2h.js +1 -0
  48. package/build/client/_app/immutable/chunks/CeUVbZ2h.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/CeUVbZ2h.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/CsO4V9Pl.js +1 -0
  51. package/build/client/_app/immutable/chunks/CsO4V9Pl.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/CsO4V9Pl.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/Cy5AtpEx.js +1 -0
  54. package/build/client/_app/immutable/chunks/Cy5AtpEx.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/Cy5AtpEx.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/DD3Ma7mI.js +1 -0
  57. package/build/client/_app/immutable/chunks/DD3Ma7mI.js.br +1 -0
  58. package/build/client/_app/immutable/chunks/DD3Ma7mI.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/DDOxwa8G.js +1 -0
  60. package/build/client/_app/immutable/chunks/DDOxwa8G.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/DDOxwa8G.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/DPilZ31q.js +4 -0
  63. package/build/client/_app/immutable/chunks/DPilZ31q.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/DPilZ31q.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/DkcM24tw.js +1 -0
  66. package/build/client/_app/immutable/chunks/DkcM24tw.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/DkcM24tw.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/{ChWB6xnu.js → DzIzGsAN.js} +1 -1
  69. package/build/client/_app/immutable/chunks/DzIzGsAN.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/DzIzGsAN.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/Dzn375RV.js +1 -0
  72. package/build/client/_app/immutable/chunks/Dzn375RV.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/Dzn375RV.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/hzkOq89z.js +1 -0
  75. package/build/client/_app/immutable/chunks/hzkOq89z.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/hzkOq89z.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/myWOS8Ad.js +1 -0
  78. package/build/client/_app/immutable/chunks/myWOS8Ad.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/myWOS8Ad.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/{DQkpHJGc.js → pwiEVMhR.js} +1 -1
  81. package/build/client/_app/immutable/chunks/pwiEVMhR.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/pwiEVMhR.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/woTmcqT7.js +1 -0
  84. package/build/client/_app/immutable/chunks/woTmcqT7.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/woTmcqT7.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/zDi6mm3o.js +1 -0
  87. package/build/client/_app/immutable/chunks/zDi6mm3o.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/zDi6mm3o.js.gz +0 -0
  89. package/build/client/_app/immutable/entry/app.CxQNYOR7.js +2 -0
  90. package/build/client/_app/immutable/entry/app.CxQNYOR7.js.br +0 -0
  91. package/build/client/_app/immutable/entry/app.CxQNYOR7.js.gz +0 -0
  92. package/build/client/_app/immutable/entry/start.CUo1ZpWZ.js +1 -0
  93. package/build/client/_app/immutable/entry/start.CUo1ZpWZ.js.br +2 -0
  94. package/build/client/_app/immutable/entry/start.CUo1ZpWZ.js.gz +0 -0
  95. package/build/client/_app/immutable/nodes/0.NM9sLghd.js +5 -0
  96. package/build/client/_app/immutable/nodes/0.NM9sLghd.js.br +0 -0
  97. package/build/client/_app/immutable/nodes/0.NM9sLghd.js.gz +0 -0
  98. package/build/client/_app/immutable/nodes/1.DbC3260o.js +1 -0
  99. package/build/client/_app/immutable/nodes/1.DbC3260o.js.br +2 -0
  100. package/build/client/_app/immutable/nodes/1.DbC3260o.js.gz +0 -0
  101. package/build/client/_app/immutable/nodes/10.BVQvX3m0.js +2 -0
  102. package/build/client/_app/immutable/nodes/10.BVQvX3m0.js.br +0 -0
  103. package/build/client/_app/immutable/nodes/10.BVQvX3m0.js.gz +0 -0
  104. package/build/client/_app/immutable/nodes/11.Bxvf_-yk.js +1 -0
  105. package/build/client/_app/immutable/nodes/11.Bxvf_-yk.js.br +0 -0
  106. package/build/client/_app/immutable/nodes/11.Bxvf_-yk.js.gz +0 -0
  107. package/build/client/_app/immutable/nodes/12.Prhpx9Ma.js +1 -0
  108. package/build/client/_app/immutable/nodes/12.Prhpx9Ma.js.br +0 -0
  109. package/build/client/_app/immutable/nodes/12.Prhpx9Ma.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/13.Bgj5oOSN.js +66 -0
  111. package/build/client/_app/immutable/nodes/13.Bgj5oOSN.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/13.Bgj5oOSN.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/2.UoL1FlSn.js +1 -0
  114. package/build/client/_app/immutable/nodes/2.UoL1FlSn.js.br +1 -0
  115. package/build/client/_app/immutable/nodes/2.UoL1FlSn.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/3.oJ7_29Md.js +1 -0
  117. package/build/client/_app/immutable/nodes/3.oJ7_29Md.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/3.oJ7_29Md.js.gz +0 -0
  119. package/build/client/_app/immutable/nodes/4.BbmkM0ZH.js +1 -0
  120. package/build/client/_app/immutable/nodes/4.BbmkM0ZH.js.br +0 -0
  121. package/build/client/_app/immutable/nodes/4.BbmkM0ZH.js.gz +0 -0
  122. package/build/client/_app/immutable/nodes/5.CUeb6mKm.js +1 -0
  123. package/build/client/_app/immutable/nodes/5.CUeb6mKm.js.br +0 -0
  124. package/build/client/_app/immutable/nodes/5.CUeb6mKm.js.gz +0 -0
  125. package/build/client/_app/immutable/nodes/7.BiyUd38g.js +1 -0
  126. package/build/client/_app/immutable/nodes/7.BiyUd38g.js.br +0 -0
  127. package/build/client/_app/immutable/nodes/7.BiyUd38g.js.gz +0 -0
  128. package/build/client/_app/immutable/nodes/8.DhezXfEp.js +1 -0
  129. package/build/client/_app/immutable/nodes/8.DhezXfEp.js.br +0 -0
  130. package/build/client/_app/immutable/nodes/8.DhezXfEp.js.gz +0 -0
  131. package/build/client/_app/immutable/nodes/9.tIbM6W_7.js +2 -0
  132. package/build/client/_app/immutable/nodes/9.tIbM6W_7.js.br +0 -0
  133. package/build/client/_app/immutable/nodes/9.tIbM6W_7.js.gz +0 -0
  134. package/build/client/_app/version.json +1 -1
  135. package/build/client/_app/version.json.br +0 -0
  136. package/build/client/_app/version.json.gz +0 -0
  137. package/build/handler.js +14 -0
  138. package/build/server/chunks/{0-Cb5ytlMI.js → 0-Xn_28PLT.js} +7 -6
  139. package/build/server/chunks/0-Xn_28PLT.js.map +1 -0
  140. package/build/server/chunks/1-CBgVE2FQ.js +9 -0
  141. package/build/server/chunks/1-CBgVE2FQ.js.map +1 -0
  142. package/build/server/chunks/10-nsD-CCn7.js +212 -0
  143. package/build/server/chunks/10-nsD-CCn7.js.map +1 -0
  144. package/build/server/chunks/11-BmqLuLNb.js +41 -0
  145. package/build/server/chunks/11-BmqLuLNb.js.map +1 -0
  146. package/build/server/chunks/12-PgTuaplb.js +101 -0
  147. package/build/server/chunks/12-PgTuaplb.js.map +1 -0
  148. package/build/server/chunks/13-BSGYMCpC.js +51 -0
  149. package/build/server/chunks/13-BSGYMCpC.js.map +1 -0
  150. package/build/server/chunks/2-BJxJqjul.js +24 -0
  151. package/build/server/chunks/2-BJxJqjul.js.map +1 -0
  152. package/build/server/chunks/3-D2ftoQkX.js +25 -0
  153. package/build/server/chunks/3-D2ftoQkX.js.map +1 -0
  154. package/build/server/chunks/4-CdkZadEU.js +25 -0
  155. package/build/server/chunks/4-CdkZadEU.js.map +1 -0
  156. package/build/server/chunks/5-ClD9AjJX.js +25 -0
  157. package/build/server/chunks/5-ClD9AjJX.js.map +1 -0
  158. package/build/server/chunks/{2-B39zPvzn.js → 6-ifXBeMPA.js} +2 -2
  159. package/build/server/chunks/{2-B39zPvzn.js.map → 6-ifXBeMPA.js.map} +1 -1
  160. package/build/server/chunks/7-D0jTAIl_.js +81 -0
  161. package/build/server/chunks/7-D0jTAIl_.js.map +1 -0
  162. package/build/server/chunks/{4-DzHoLo__.js → 8-CgDL2fiA.js} +18 -10
  163. package/build/server/chunks/8-CgDL2fiA.js.map +1 -0
  164. package/build/server/chunks/{5-CCWbCDpk.js → 9-Dn6eMY6x.js} +6 -8
  165. package/build/server/chunks/9-Dn6eMY6x.js.map +1 -0
  166. package/build/server/chunks/JsonValue-DjUulYwg.js +290 -0
  167. package/build/server/chunks/JsonValue-DjUulYwg.js.map +1 -0
  168. package/build/server/chunks/Modal-zVnoAfFx.js +36 -0
  169. package/build/server/chunks/Modal-zVnoAfFx.js.map +1 -0
  170. package/build/server/chunks/{Panel-Bz0b85EW.js → Panel-BM545RWK.js} +4 -3
  171. package/build/server/chunks/Panel-BM545RWK.js.map +1 -0
  172. package/build/server/chunks/PrettyJson-CVemKT9n.js +137 -0
  173. package/build/server/chunks/PrettyJson-CVemKT9n.js.map +1 -0
  174. package/build/server/chunks/Tooltip-ByN2a8nn.js +38 -0
  175. package/build/server/chunks/Tooltip-ByN2a8nn.js.map +1 -0
  176. package/build/server/chunks/TooltipTable-CftpgkMV.js +60 -0
  177. package/build/server/chunks/TooltipTable-CftpgkMV.js.map +1 -0
  178. package/build/server/chunks/_layout.svelte-D8Erqrch.js +163 -0
  179. package/build/server/chunks/_layout.svelte-D8Erqrch.js.map +1 -0
  180. package/build/server/chunks/{_page.svelte-w9cxGvUf.js → _page.svelte-BZL67-Tl.js} +32 -13
  181. package/build/server/chunks/_page.svelte-BZL67-Tl.js.map +1 -0
  182. package/build/server/chunks/{_page.svelte-FIp-IsOo.js → _page.svelte-BwdDcghe.js} +63 -13
  183. package/build/server/chunks/_page.svelte-BwdDcghe.js.map +1 -0
  184. package/build/server/chunks/{_page.svelte-jxFKbZdN.js → _page.svelte-CwGhs70Z.js} +9 -6
  185. package/build/server/chunks/_page.svelte-CwGhs70Z.js.map +1 -0
  186. package/build/server/chunks/_page.svelte-DI3cZxuK.js +197 -0
  187. package/build/server/chunks/_page.svelte-DI3cZxuK.js.map +1 -0
  188. package/build/server/chunks/_page.svelte-DPUr13fG.js +203 -0
  189. package/build/server/chunks/_page.svelte-DPUr13fG.js.map +1 -0
  190. package/build/server/chunks/{_page.svelte-FLzHOuyK.js → _page.svelte-mO3b8YSb.js} +37 -20
  191. package/build/server/chunks/_page.svelte-mO3b8YSb.js.map +1 -0
  192. package/build/server/chunks/{_page.svelte-k8avSQW1.js → _page.svelte-mPOsEew6.js} +105 -30
  193. package/build/server/chunks/_page.svelte-mPOsEew6.js.map +1 -0
  194. package/build/server/chunks/_server.ts-06lGoPp8.js +8 -0
  195. package/build/server/chunks/_server.ts-06lGoPp8.js.map +1 -0
  196. package/build/server/chunks/async-lVJA8xJZ.js +9 -0
  197. package/build/server/chunks/async-lVJA8xJZ.js.map +1 -0
  198. package/build/server/chunks/client-BFlyU7ZU.js +7 -0
  199. package/build/server/chunks/{client-bj7sePQc.js.map → client-BFlyU7ZU.js.map} +1 -1
  200. package/build/server/chunks/{client2-BX4-xbM4.js → client2-DYaMKWrc.js} +4 -4
  201. package/build/server/chunks/{client2-BX4-xbM4.js.map → client2-DYaMKWrc.js.map} +1 -1
  202. package/build/server/chunks/{async-BfR0vYHo.js → context-C22hLSHK.js} +2 -8
  203. package/build/server/chunks/context-C22hLSHK.js.map +1 -0
  204. package/build/server/chunks/error.svelte-BENdaVOT.js +19 -0
  205. package/build/server/chunks/error.svelte-BENdaVOT.js.map +1 -0
  206. package/build/server/chunks/event-DVH-6ISX.js.map +1 -1
  207. package/build/server/chunks/{index-EKt9-9bV.js → index-DFXVwu6p.js} +2 -2
  208. package/build/server/chunks/{index-EKt9-9bV.js.map → index-DFXVwu6p.js.map} +1 -1
  209. package/build/server/chunks/index-Djsj11qr.js.map +1 -1
  210. package/build/server/chunks/index-server-Bf-hP5gL.js +5 -0
  211. package/build/server/chunks/index-server-Bf-hP5gL.js.map +1 -0
  212. package/build/server/chunks/{routing-DcR4fCSD.js → index2-d4SCF7oA.js} +4 -88
  213. package/build/server/chunks/index2-d4SCF7oA.js.map +1 -0
  214. package/build/server/chunks/{index3-DquTjlmp.js → index3-CoOO2o9t.js} +6 -6
  215. package/build/server/chunks/index3-CoOO2o9t.js.map +1 -0
  216. package/build/server/chunks/jsonParser-CraFXJs8.js +174 -0
  217. package/build/server/chunks/jsonParser-CraFXJs8.js.map +1 -0
  218. package/build/server/chunks/layout.svelte-CJcHX-Na.js +10 -0
  219. package/build/server/chunks/layout.svelte-CJcHX-Na.js.map +1 -0
  220. package/build/server/chunks/{mongo-dLmCShL_.js → mongo-DMG2RTBR.js} +51 -10
  221. package/build/server/chunks/mongo-DMG2RTBR.js.map +1 -0
  222. package/build/server/chunks/remote-xxtqbu-BUzBKv3P.js +16 -0
  223. package/build/server/chunks/remote-xxtqbu-BUzBKv3P.js.map +1 -0
  224. package/build/server/chunks/routing-e10vGH37.js +81 -0
  225. package/build/server/chunks/routing-e10vGH37.js.map +1 -0
  226. package/build/server/chunks/{server2-BiqGvkCy.js → server2-_mGVuBoG.js} +2 -2
  227. package/build/server/chunks/{server2-BiqGvkCy.js.map → server2-_mGVuBoG.js.map} +1 -1
  228. package/build/server/chunks/servers.remote-DKhy8wTJ.js +678 -0
  229. package/build/server/chunks/servers.remote-DKhy8wTJ.js.map +1 -0
  230. package/build/server/chunks/shared-Buki-xt5.js +506 -0
  231. package/build/server/chunks/shared-Buki-xt5.js.map +1 -0
  232. package/build/server/chunks/{state.svelte-CRHA9yov.js → state.svelte-C8IWmp_n.js} +2 -2
  233. package/build/server/chunks/{state.svelte-CRHA9yov.js.map → state.svelte-C8IWmp_n.js.map} +1 -1
  234. package/build/server/chunks/{utils-DGYJFmnf.js → utils-kjxf7BZO.js} +2 -2
  235. package/build/server/chunks/{utils-DGYJFmnf.js.map → utils-kjxf7BZO.js.map} +1 -1
  236. package/build/server/index.js +188 -609
  237. package/build/server/index.js.map +1 -1
  238. package/build/server/manifest.js +45 -18
  239. package/build/server/manifest.js.map +1 -1
  240. package/package.json +13 -2
  241. package/src/api/servers.remote.ts +369 -20
  242. package/src/app.css +98 -3
  243. package/src/app.html +15 -0
  244. package/src/lib/actions/jsonTextarea.ts +395 -0
  245. package/src/lib/components/Breadcrumbs.svelte +7 -58
  246. package/src/lib/components/JsonValue.svelte +279 -85
  247. package/src/lib/components/Modal.svelte +59 -0
  248. package/src/lib/components/OriginWarning.svelte +109 -0
  249. package/src/lib/components/PageSwitcher.svelte +37 -0
  250. package/src/lib/components/Panel.svelte +1 -1
  251. package/src/lib/components/PrettyJson.svelte +112 -36
  252. package/src/lib/components/SearchBox.svelte +161 -97
  253. package/src/lib/components/ThemeSwitcher.svelte +66 -0
  254. package/src/lib/components/Tooltip.svelte +83 -0
  255. package/src/lib/components/TooltipTable.svelte +45 -102
  256. package/src/lib/server/HostsManager.ts +4 -0
  257. package/src/lib/server/aggregation.ts +62 -0
  258. package/src/lib/server/mongo.ts +75 -13
  259. package/src/lib/types.ts +60 -0
  260. package/src/lib/utils/isEmptyObject.ts +6 -0
  261. package/src/lib/utils/jsonParser.ts +9 -1
  262. package/src/lib/utils/omit.ts +3 -0
  263. package/src/routes/+layout.server.ts +2 -1
  264. package/src/routes/+layout.svelte +11 -2
  265. package/src/routes/favicon.ico/+server.ts +8 -0
  266. package/src/routes/servers/+page.server.ts +22 -10
  267. package/src/routes/servers/+page.svelte +44 -10
  268. package/src/routes/servers/[server]/databases/+layout.ts +8 -0
  269. package/src/routes/servers/[server]/databases/+page.server.ts +14 -4
  270. package/src/routes/servers/[server]/databases/[database]/collections/+layout.ts +9 -0
  271. package/src/routes/servers/[server]/databases/[database]/collections/+page.server.ts +0 -2
  272. package/src/routes/servers/[server]/databases/[database]/collections/+page.svelte +67 -8
  273. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+layout.ts +9 -0
  274. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.server.ts +216 -0
  275. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.svelte +337 -0
  276. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.ts +10 -0
  277. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+layout.ts +9 -0
  278. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.server.ts +15 -12
  279. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.svelte +79 -5
  280. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.server.ts +87 -0
  281. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.svelte +333 -0
  282. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.ts +10 -0
  283. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.server.ts +18 -0
  284. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.svelte +377 -0
  285. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.ts +10 -0
  286. package/src/tests/api/aggregation.test.ts +125 -0
  287. package/build/client/_app/immutable/assets/0.CEsPYTp2.css +0 -1
  288. package/build/client/_app/immutable/assets/0.CEsPYTp2.css.br +0 -0
  289. package/build/client/_app/immutable/assets/0.CEsPYTp2.css.gz +0 -0
  290. package/build/client/_app/immutable/assets/6.DawdmtJd.css +0 -1
  291. package/build/client/_app/immutable/assets/6.DawdmtJd.css.br +0 -2
  292. package/build/client/_app/immutable/assets/6.DawdmtJd.css.gz +0 -0
  293. package/build/client/_app/immutable/assets/Panel.BDHMtO-3.css +0 -1
  294. package/build/client/_app/immutable/assets/Panel.BDHMtO-3.css.br +0 -0
  295. package/build/client/_app/immutable/assets/Panel.BDHMtO-3.css.gz +0 -0
  296. package/build/client/_app/immutable/assets/PrettyJson.CtngcfyW.css +0 -1
  297. package/build/client/_app/immutable/assets/PrettyJson.CtngcfyW.css.br +0 -0
  298. package/build/client/_app/immutable/assets/PrettyJson.CtngcfyW.css.gz +0 -0
  299. package/build/client/_app/immutable/chunks/B2-iEFN3.js +0 -2
  300. package/build/client/_app/immutable/chunks/B2-iEFN3.js.br +0 -0
  301. package/build/client/_app/immutable/chunks/B2-iEFN3.js.gz +0 -0
  302. package/build/client/_app/immutable/chunks/B5y2vsNr.js +0 -1
  303. package/build/client/_app/immutable/chunks/B5y2vsNr.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/B5y2vsNr.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/BN_N9-2s.js +0 -1
  306. package/build/client/_app/immutable/chunks/BN_N9-2s.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/BN_N9-2s.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/C1z4TjN7.js +0 -1
  309. package/build/client/_app/immutable/chunks/C1z4TjN7.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/C1z4TjN7.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/CQBaNlA9.js +0 -1
  312. package/build/client/_app/immutable/chunks/CQBaNlA9.js.br +0 -0
  313. package/build/client/_app/immutable/chunks/CQBaNlA9.js.gz +0 -0
  314. package/build/client/_app/immutable/chunks/CVoOGazw.js +0 -4
  315. package/build/client/_app/immutable/chunks/CVoOGazw.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/CVoOGazw.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/CapOg2jD.js +0 -1
  318. package/build/client/_app/immutable/chunks/CapOg2jD.js.br +0 -0
  319. package/build/client/_app/immutable/chunks/CapOg2jD.js.gz +0 -0
  320. package/build/client/_app/immutable/chunks/ChWB6xnu.js.br +0 -0
  321. package/build/client/_app/immutable/chunks/ChWB6xnu.js.gz +0 -0
  322. package/build/client/_app/immutable/chunks/CqnBT2zJ.js +0 -1
  323. package/build/client/_app/immutable/chunks/CqnBT2zJ.js.br +0 -0
  324. package/build/client/_app/immutable/chunks/CqnBT2zJ.js.gz +0 -0
  325. package/build/client/_app/immutable/chunks/D069mncP.js +0 -1
  326. package/build/client/_app/immutable/chunks/D069mncP.js.br +0 -0
  327. package/build/client/_app/immutable/chunks/D069mncP.js.gz +0 -0
  328. package/build/client/_app/immutable/chunks/DACrOfV_.js +0 -14
  329. package/build/client/_app/immutable/chunks/DACrOfV_.js.br +0 -0
  330. package/build/client/_app/immutable/chunks/DACrOfV_.js.gz +0 -0
  331. package/build/client/_app/immutable/chunks/DQkpHJGc.js.br +0 -0
  332. package/build/client/_app/immutable/chunks/DQkpHJGc.js.gz +0 -0
  333. package/build/client/_app/immutable/chunks/DSDD_hFT.js +0 -1
  334. package/build/client/_app/immutable/chunks/DSDD_hFT.js.br +0 -0
  335. package/build/client/_app/immutable/chunks/DSDD_hFT.js.gz +0 -0
  336. package/build/client/_app/immutable/chunks/D_aTX_ol.js +0 -1
  337. package/build/client/_app/immutable/chunks/D_aTX_ol.js.br +0 -0
  338. package/build/client/_app/immutable/chunks/D_aTX_ol.js.gz +0 -0
  339. package/build/client/_app/immutable/chunks/Dg3qHExF.js +0 -1
  340. package/build/client/_app/immutable/chunks/Dg3qHExF.js.br +0 -0
  341. package/build/client/_app/immutable/chunks/Dg3qHExF.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/Dt6-JRym.js +0 -2
  343. package/build/client/_app/immutable/chunks/Dt6-JRym.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/Dt6-JRym.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/QoKxaG0e.js +0 -1
  346. package/build/client/_app/immutable/chunks/QoKxaG0e.js.br +0 -2
  347. package/build/client/_app/immutable/chunks/QoKxaG0e.js.gz +0 -0
  348. package/build/client/_app/immutable/chunks/rtveiEyS.js +0 -1
  349. package/build/client/_app/immutable/chunks/rtveiEyS.js.br +0 -0
  350. package/build/client/_app/immutable/chunks/rtveiEyS.js.gz +0 -0
  351. package/build/client/_app/immutable/entry/app.Cc1FNLNH.js +0 -2
  352. package/build/client/_app/immutable/entry/app.Cc1FNLNH.js.br +0 -0
  353. package/build/client/_app/immutable/entry/app.Cc1FNLNH.js.gz +0 -0
  354. package/build/client/_app/immutable/entry/start.CwqlbFyy.js +0 -1
  355. package/build/client/_app/immutable/entry/start.CwqlbFyy.js.br +0 -2
  356. package/build/client/_app/immutable/entry/start.CwqlbFyy.js.gz +0 -0
  357. package/build/client/_app/immutable/nodes/0.wBQEpdjZ.js +0 -1
  358. package/build/client/_app/immutable/nodes/0.wBQEpdjZ.js.br +0 -0
  359. package/build/client/_app/immutable/nodes/0.wBQEpdjZ.js.gz +0 -0
  360. package/build/client/_app/immutable/nodes/1.K6-n7D0b.js +0 -1
  361. package/build/client/_app/immutable/nodes/1.K6-n7D0b.js.br +0 -0
  362. package/build/client/_app/immutable/nodes/1.K6-n7D0b.js.gz +0 -0
  363. package/build/client/_app/immutable/nodes/3.DkGcIF98.js +0 -1
  364. package/build/client/_app/immutable/nodes/3.DkGcIF98.js.br +0 -0
  365. package/build/client/_app/immutable/nodes/3.DkGcIF98.js.gz +0 -0
  366. package/build/client/_app/immutable/nodes/4.C_NxbT98.js +0 -1
  367. package/build/client/_app/immutable/nodes/4.C_NxbT98.js.br +0 -0
  368. package/build/client/_app/immutable/nodes/4.C_NxbT98.js.gz +0 -0
  369. package/build/client/_app/immutable/nodes/5.CFvfYaLM.js +0 -1
  370. package/build/client/_app/immutable/nodes/5.CFvfYaLM.js.br +0 -0
  371. package/build/client/_app/immutable/nodes/5.CFvfYaLM.js.gz +0 -0
  372. package/build/client/_app/immutable/nodes/6.h34Zyorq.js +0 -1
  373. package/build/client/_app/immutable/nodes/6.h34Zyorq.js.br +0 -0
  374. package/build/client/_app/immutable/nodes/6.h34Zyorq.js.gz +0 -0
  375. package/build/client/_app/immutable/nodes/7.BVJmNbU5.js +0 -1
  376. package/build/client/_app/immutable/nodes/7.BVJmNbU5.js.br +0 -0
  377. package/build/client/_app/immutable/nodes/7.BVJmNbU5.js.gz +0 -0
  378. package/build/server/chunks/0-Cb5ytlMI.js.map +0 -1
  379. package/build/server/chunks/1-Cpb7zRtJ.js +0 -9
  380. package/build/server/chunks/1-Cpb7zRtJ.js.map +0 -1
  381. package/build/server/chunks/3-B_DkgZkc.js +0 -69
  382. package/build/server/chunks/3-B_DkgZkc.js.map +0 -1
  383. package/build/server/chunks/4-DzHoLo__.js.map +0 -1
  384. package/build/server/chunks/5-CCWbCDpk.js.map +0 -1
  385. package/build/server/chunks/6-Dok8svjB.js +0 -202
  386. package/build/server/chunks/6-Dok8svjB.js.map +0 -1
  387. package/build/server/chunks/7-CmgJSG2j.js +0 -42
  388. package/build/server/chunks/7-CmgJSG2j.js.map +0 -1
  389. package/build/server/chunks/Panel-Bz0b85EW.js.map +0 -1
  390. package/build/server/chunks/PrettyJson-CX6-dNsW.js +0 -291
  391. package/build/server/chunks/PrettyJson-CX6-dNsW.js.map +0 -1
  392. package/build/server/chunks/TooltipTable-0z4HkHlH.js +0 -17
  393. package/build/server/chunks/TooltipTable-0z4HkHlH.js.map +0 -1
  394. package/build/server/chunks/_layout.svelte-UiDiCQEz.js +0 -111
  395. package/build/server/chunks/_layout.svelte-UiDiCQEz.js.map +0 -1
  396. package/build/server/chunks/_page.svelte-FIp-IsOo.js.map +0 -1
  397. package/build/server/chunks/_page.svelte-FLzHOuyK.js.map +0 -1
  398. package/build/server/chunks/_page.svelte-jxFKbZdN.js.map +0 -1
  399. package/build/server/chunks/_page.svelte-k8avSQW1.js.map +0 -1
  400. package/build/server/chunks/_page.svelte-w9cxGvUf.js.map +0 -1
  401. package/build/server/chunks/async-BfR0vYHo.js.map +0 -1
  402. package/build/server/chunks/client-bj7sePQc.js +0 -7
  403. package/build/server/chunks/error.svelte-D5sIJv3P.js +0 -18
  404. package/build/server/chunks/error.svelte-D5sIJv3P.js.map +0 -1
  405. package/build/server/chunks/index3-DquTjlmp.js.map +0 -1
  406. package/build/server/chunks/mongo-dLmCShL_.js.map +0 -1
  407. package/build/server/chunks/remote-xxtqbu-BFzaWXy0.js +0 -234
  408. package/build/server/chunks/remote-xxtqbu-BFzaWXy0.js.map +0 -1
  409. package/build/server/chunks/routing-DcR4fCSD.js.map +0 -1
  410. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+page.server.ts +0 -106
  411. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/+page.svelte +0 -174
  412. /package/build/client/_app/immutable/assets/{3.CRKE8WvY.css → 7.CRKE8WvY.css} +0 -0
  413. /package/build/client/_app/immutable/assets/{3.CRKE8WvY.css.br → 7.CRKE8WvY.css.br} +0 -0
  414. /package/build/client/_app/immutable/assets/{3.CRKE8WvY.css.gz → 7.CRKE8WvY.css.gz} +0 -0
@@ -1,5 +1,8 @@
1
1
  <script lang="ts">
2
+ import { resolve } from "$app/paths";
3
+ import type { MongoDocument } from "$lib/types";
2
4
  import JsonValue from "./JsonValue.svelte";
5
+ import Tooltip from "./Tooltip.svelte";
3
6
 
4
7
  const INDENT = " ";
5
8
 
@@ -12,14 +15,27 @@
12
15
  /** is it collapsed at top level */
13
16
  collapsed?: boolean;
14
17
  depth?: number;
15
- localTopLevel?: boolean;
18
+ /** Function to check if a key path has a mapping */
19
+ isKeyMapped?: (path: string) => boolean;
20
+ /** Function to fetch a mapped document and get its URL */
21
+ fetchMappedDocument?: (
22
+ path: string,
23
+ value: unknown,
24
+ ) => Promise<{ document: MongoDocument | null; url: string | null; collection: string | null }>;
25
+ /** full path to current key (e.g., "user.address.city") */
26
+ keyPath?: string;
16
27
  }
17
28
 
18
- let { value, key, autoCollapse = false, collapsed = false, localTopLevel = true, depth = 0 }: Props = $props();
19
-
20
- function toggleCollapse() {
21
- collapsed = !collapsed;
22
- }
29
+ let {
30
+ value,
31
+ key,
32
+ autoCollapse = false,
33
+ collapsed = false,
34
+ depth = 0,
35
+ isKeyMapped,
36
+ fetchMappedDocument,
37
+ keyPath = "",
38
+ }: Props = $props();
23
39
 
24
40
  function getIndent(level: number): string {
25
41
  return INDENT.repeat(level);
@@ -29,6 +45,49 @@
29
45
  return /^https?:\/\/[^\s]+$/.test(str);
30
46
  }
31
47
 
48
+ // Mapping-related state and functions
49
+ let showTooltip = $state(false);
50
+ let fetchedDocument = $state<MongoDocument | null>(null);
51
+ let fetchedUrl = $state<string | null>(null);
52
+ let fetchedCollection = $state<string | null>(null);
53
+ let isFetching = $state(false);
54
+ let fetchError = $state<string | null>(null);
55
+
56
+ // Check if current key has a mapping
57
+ const currentKeyPath = $derived([keyPath, key].filter(Boolean).join("."));
58
+
59
+ async function handleMouseEnter() {
60
+ if (!hasMappings || !fetchMappedDocument) return;
61
+
62
+ showTooltip = true;
63
+
64
+ // If already fetched, don't fetch again
65
+ if (fetchedDocument || isFetching) return;
66
+
67
+ isFetching = true;
68
+ fetchError = null;
69
+
70
+ try {
71
+ const result = await fetchMappedDocument(currentKeyPath, value);
72
+
73
+ if (!result.document) {
74
+ fetchError = "Document not found";
75
+ } else {
76
+ fetchedDocument = result.document;
77
+ fetchedUrl = result.url;
78
+ fetchedCollection = result.collection;
79
+ }
80
+ } catch (err) {
81
+ fetchError = err instanceof Error ? err.message : "Failed to fetch document";
82
+ } finally {
83
+ isFetching = false;
84
+ }
85
+ }
86
+
87
+ function handleMouseLeave() {
88
+ showTooltip = false;
89
+ }
90
+
32
91
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
92
  function getValueType(val: any): string {
34
93
  if (val === null) return "null";
@@ -57,56 +116,129 @@
57
116
  }
58
117
  }
59
118
 
60
- let valueType = $derived(getValueType(value));
119
+ const valueType = $derived(getValueType(value));
120
+
121
+ const hasMappings = $derived(
122
+ !!isKeyMapped &&
123
+ !!fetchMappedDocument &&
124
+ key === undefined &&
125
+ isKeyMapped(currentKeyPath) &&
126
+ value !== null &&
127
+ value !== undefined &&
128
+ valueType !== "array" &&
129
+ valueType !== "object",
130
+ );
131
+
61
132
  let isCollapsible = $derived(valueType === "array" || valueType === "object");
62
133
  let isEmpty = $derived(
63
134
  (valueType === "array" && value.length === 0) || (valueType === "object" && Object.keys(value).length === 0),
64
135
  );
136
+ let innerCollapsed = $state(autoCollapse);
137
+
138
+ function toggleInnerCollapse() {
139
+ innerCollapsed = !innerCollapsed;
140
+ }
65
141
  </script>
66
142
 
67
143
  {#if key !== undefined}
68
- <span class="prop" class:collapsible={isCollapsible && !isEmpty} class:collapsed>
69
- {getIndent(depth + 1)}<var>{key}</var>: <JsonValue
70
- {value}
71
- {autoCollapse}
72
- collapsed={autoCollapse}
73
- depth={depth + 1}
74
- localTopLevel={false}
75
- />
76
- </span>
77
- {:else}
78
- <!-- Root value rendering -->
79
- {#if valueType === "string"}
80
- <span class="value quoted">
81
- "<span class="string" class:url={isUrl(value)}>
82
- {#if isUrl(value)}
83
- <!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
84
- <a href={value} target="_blank">{value}</a>
85
- {:else}
144
+ {#if isCollapsible && !isEmpty}
145
+ {#if innerCollapsed}
146
+ <span
147
+ class="prop collapsible collapsed"
148
+ onclick={toggleInnerCollapse}
149
+ role="button"
150
+ tabindex="0"
151
+ onkeydown={(e) => {
152
+ if (e.key === "Enter" || e.key === " ") {
153
+ e.preventDefault();
154
+ toggleInnerCollapse();
155
+ }
156
+ }}
157
+ >
158
+ {getIndent(depth + 1)}<span class="collapse-arrow"> ▶ </span><var>{key}</var>: <JsonValue
86
159
  {value}
87
- {/if}
88
- </span>"
89
- </span>
90
- {:else if valueType === "number"}
91
- <span class="value number">{value}</span>
92
- {:else if valueType === "boolean"}
93
- <span class="value boolean">{value}</span>
94
- {:else if valueType === "null"}
95
- <span class="value null">null</span>
96
- {:else if valueType === "objectid"}
97
- <span class="call function">ObjectId("<span class="string">{value.$value}</span>")</span>
98
- {:else if valueType === "date"}
99
- <span class="call function">Date("<span class="string">{value.$value}</span>")</span>
100
- {:else if valueType === "regexp"}
101
- <span class="value regexp">/{value.$value.$pattern}/{value.$value.$flags}</span>
102
- {:else if valueType === "array"}
103
- {#if isEmpty}
104
- <span class="value array">[]</span>
160
+ {autoCollapse}
161
+ collapsed={innerCollapsed}
162
+ depth={depth + 1}
163
+ {isKeyMapped}
164
+ {fetchMappedDocument}
165
+ keyPath={currentKeyPath}
166
+ />
167
+ </span>
105
168
  {:else}
106
- <span class="collapsible-wrapper" class:collapsed class:expanded={!collapsed}>
107
- <button class="collapse-toggle" onclick={toggleCollapse}>
108
- {collapsed ? "▶" : "▼"}
109
- </button><span class="value array">
169
+ <span class="prop collapsible">
170
+ {getIndent(depth + 1)}<span
171
+ class="collapse-arrow arrow-only"
172
+ onclick={(e) => {
173
+ e.stopPropagation();
174
+ toggleInnerCollapse();
175
+ }}
176
+ role="button"
177
+ tabindex="0"
178
+ onkeydown={(e) => {
179
+ if (e.key === "Enter" || e.key === " ") {
180
+ e.preventDefault();
181
+ e.stopPropagation();
182
+ toggleInnerCollapse();
183
+ }
184
+ }}
185
+ >
186
+
187
+ </span><var>{key}</var>: <JsonValue
188
+ {value}
189
+ {autoCollapse}
190
+ collapsed={innerCollapsed}
191
+ depth={depth + 1}
192
+ {isKeyMapped}
193
+ {fetchMappedDocument}
194
+ keyPath={currentKeyPath}
195
+ />
196
+ </span>
197
+ {/if}
198
+ {:else}
199
+ <span class="prop">
200
+ {getIndent(depth + 1)}<var>{key}</var>: <JsonValue
201
+ {value}
202
+ {autoCollapse}
203
+ collapsed={innerCollapsed}
204
+ depth={depth + 1}
205
+ {isKeyMapped}
206
+ {fetchMappedDocument}
207
+ keyPath={currentKeyPath}
208
+ />
209
+ </span>
210
+ {/if}
211
+ {:else}
212
+ {#snippet valueSnippet()}
213
+ <!-- Root value rendering -->
214
+ {#if valueType === "string"}
215
+ <span class="value quoted">
216
+ "<span class="string" class:url={isUrl(value)}>
217
+ {#if isUrl(value)}
218
+ <!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
219
+ <a href={value} target="_blank">{value}</a>
220
+ {:else}
221
+ {value}
222
+ {/if}
223
+ </span>"
224
+ </span>
225
+ {:else if valueType === "number"}
226
+ <span class="value number">{value}</span>
227
+ {:else if valueType === "boolean"}
228
+ <span class="value boolean">{value}</span>
229
+ {:else if valueType === "null"}
230
+ <span class="value null">null</span>
231
+ {:else if valueType === "objectid"}
232
+ <span class="call function">ObjectId("<span class="string">{value.$value}</span>")</span>
233
+ {:else if valueType === "date"}
234
+ <span class="call function">Date("<span class="string">{value.$value}</span>")</span>
235
+ {:else if valueType === "regexp"}
236
+ <span class="value regexp">/{value.$value.$pattern}/{value.$value.$flags}</span>
237
+ {:else if valueType === "array"}
238
+ {#if isEmpty}
239
+ <span class="value array">[]</span>
240
+ {:else}
241
+ <span class="value array">
110
242
  [<span class="collapsible-content" class:hidden={collapsed}>
111
243
  {#each value as item, i (i)}
112
244
  <br />{getIndent(depth + 1)}<JsonValue
@@ -114,25 +246,33 @@
114
246
  {autoCollapse}
115
247
  collapsed={false}
116
248
  depth={depth + 1}
249
+ keyPath={currentKeyPath}
250
+ {isKeyMapped}
251
+ {fetchMappedDocument}
117
252
  />{/each}
118
253
  <br />{getIndent(depth)}
119
254
  </span>{#if collapsed}
120
255
  <span class="collapsed-summary">... {value.length} item{value.length !== 1 ? "s" : ""}</span>
121
256
  {/if}]
122
257
  </span>
123
- </span>
124
- {/if}
125
- {:else if valueType === "object"}
126
- {#if isEmpty}
127
- <span class="value object">{"{}"}</span>
128
- {:else}
129
- <span class="collapsible-wrapper" class:collapsed class:expanded={!collapsed}>
130
- {#if depth !== 0}<button class="collapse-toggle" class:local-top-level={localTopLevel} onclick={toggleCollapse}>
131
- {collapsed ? "▶" : "▼"}
132
- </button>{/if}<span class="value object">
258
+ {/if}
259
+ {:else if valueType === "object"}
260
+ {#if isEmpty}
261
+ <span class="value object">{"{}"}</span>
262
+ {:else}
263
+ <span class="value object">
133
264
  {"{"}<span class="collapsible-content" class:hidden={collapsed}
134
265
  >{#each Object.keys(value) as objKey (objKey)}
135
- <JsonValue value={value[objKey]} key={objKey} {autoCollapse} collapsed={autoCollapse} {depth} />{/each}
266
+ <JsonValue
267
+ value={value[objKey]}
268
+ key={objKey}
269
+ {autoCollapse}
270
+ collapsed={autoCollapse}
271
+ {depth}
272
+ {isKeyMapped}
273
+ {fetchMappedDocument}
274
+ keyPath={currentKeyPath}
275
+ />{/each}
136
276
  </span>{#if collapsed}
137
277
  <span class="collapsed-summary"
138
278
  >... {Object.keys(value).length} key{Object.keys(value).length !== 1 ? "s" : ""}</span
@@ -141,10 +281,51 @@
141
281
  {getIndent(depth)}
142
282
  {/if}}
143
283
  </span>
144
- </span>
284
+ {/if}
285
+ {:else}
286
+ <span>{String(value)}</span>
145
287
  {/if}
288
+ {/snippet}
289
+ {#if hasMappings}
290
+ <Tooltip show={showTooltip} tooltipClass="max-w-[600px] max-h-[400px] overflow-auto whitespace-pre-wrap">
291
+ {#snippet trigger()}
292
+ <span
293
+ class="string mapped"
294
+ class:url={isUrl(value)}
295
+ onmouseenter={handleMouseEnter}
296
+ onmouseleave={handleMouseLeave}
297
+ role="button"
298
+ tabindex="0"
299
+ >
300
+ {#if fetchedUrl}
301
+ <!-- eslint-disable-next-line @typescript-eslint/no-explicit-any -->
302
+ <a href={resolve(fetchedUrl as any)}>{@render valueSnippet?.()}</a>
303
+ {:else}
304
+ {@render valueSnippet?.()}
305
+ {/if}
306
+ </span>
307
+ {/snippet}
308
+ {#snippet content()}
309
+ {#if isFetching}
310
+ <div class="text-[var(--text-secondary)]">Loading...</div>
311
+ {:else if fetchError}
312
+ <div class="text-[var(--danger,#f44336)]">{fetchError}</div>
313
+ {:else if fetchedDocument}
314
+ <!-- prettier-ignore -->
315
+ <div>
316
+ {#if fetchedCollection}<div
317
+ class="px-2 py-1 pt-2 border-b border-[var(--border-color)] bg-[var(--color-4)] font-bold"
318
+ >
319
+ {fetchedCollection}
320
+ </div>{/if}<div class="font-mono text-sm p-2">
321
+ <JsonValue value={fetchedDocument} autoCollapse={true} collapsed={false} />
322
+ </div>
323
+ </div>
324
+ {/if}
325
+ {/snippet}
326
+ </Tooltip>
146
327
  {:else}
147
- <span>{String(value)}</span>
328
+ {@render valueSnippet?.()}
148
329
  {/if}{#if depth !== 0},{/if}
149
330
  {/if}
150
331
 
@@ -152,40 +333,35 @@
152
333
  .prop {
153
334
  position: relative;
154
335
  display: block;
336
+
337
+ &.collapsible {
338
+ &.collapsed {
339
+ cursor: pointer;
340
+ user-select: none;
341
+
342
+ &:hover .collapse-arrow {
343
+ color: var(--text, #fff);
344
+ }
345
+ }
346
+ }
155
347
  }
156
348
 
157
- .collapsible-wrapper {
158
- display: inline;
159
- position: relative;
349
+ .collapse-arrow {
350
+ display: inline-block;
351
+ width: 16px;
352
+ color: var(--text-secondary, #888);
353
+ font-size: 12px;
354
+ margin-right: 4px;
355
+ margin-left: -20px;
356
+ transition: color 0.2s;
160
357
 
161
- .collapse-toggle {
162
- display: inline-block;
163
- width: 16px;
358
+ &.arrow-only {
164
359
  cursor: pointer;
165
- user-select: none;
166
- color: var(--text-secondary, #888);
167
- font-size: 12px;
168
- margin-right: 4px;
169
- transition: color 0.2s;
170
- background: none;
171
- border: none;
172
- padding: 0;
173
- font-family: inherit;
174
-
175
- &.local-top-level {
176
- position: absolute;
177
- left: -18px;
178
- margin-top: 4px;
179
- }
180
360
 
181
361
  &:hover {
182
362
  color: var(--text, #fff);
183
363
  }
184
364
  }
185
-
186
- &.collapsed .collapsible-content {
187
- display: none;
188
- }
189
365
  }
190
366
 
191
367
  .collapsible-content {
@@ -245,4 +421,22 @@
245
421
  color: var(--code-namespace);
246
422
  font-style: normal;
247
423
  }
424
+
425
+ /* Mapped value styles */
426
+ .mapped {
427
+ text-decoration: underline;
428
+ text-decoration-style: dotted;
429
+ text-decoration-color: var(--code-links, #61afef);
430
+ text-underline-offset: 2px;
431
+ cursor: pointer;
432
+
433
+ a {
434
+ color: inherit;
435
+ text-decoration: inherit;
436
+
437
+ &:hover {
438
+ color: var(--code-links, #61afef);
439
+ }
440
+ }
441
+ }
248
442
  </style>
@@ -0,0 +1,59 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+
4
+ interface Props {
5
+ show: boolean;
6
+ onclose: () => void;
7
+ title?: string;
8
+ children?: Snippet;
9
+ footer?: Snippet;
10
+ }
11
+
12
+ let { show = false, onclose, title, children, footer }: Props = $props();
13
+
14
+ function handleOverlayClick() {
15
+ onclose();
16
+ }
17
+
18
+ function handleKeyDown(e: KeyboardEvent) {
19
+ if (e.key === "Escape" && show) {
20
+ onclose();
21
+ }
22
+ }
23
+ </script>
24
+
25
+ <svelte:window on:keydown={handleKeyDown} />
26
+
27
+ {#if show}
28
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
29
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
30
+ <div class="modal-overlay" onclick={handleOverlayClick}>
31
+ <div class="modal" onclick={(e) => e.stopPropagation()}>
32
+ {#if title}
33
+ <div class="modal-header">
34
+ <h3>{title}</h3>
35
+ </div>
36
+ {/if}
37
+ <div class="modal-body">
38
+ {@render children?.()}
39
+ </div>
40
+ {#if footer}
41
+ <div class="modal-footer">
42
+ {@render footer()}
43
+ </div>
44
+ {/if}
45
+ </div>
46
+ </div>
47
+ {/if}
48
+
49
+ <style lang="postcss">
50
+ .modal-header {
51
+ padding: 20px 20px 0;
52
+ }
53
+
54
+ .modal-header h3 {
55
+ margin: 0;
56
+ font-size: 1.25rem;
57
+ font-weight: 500;
58
+ }
59
+ </style>
@@ -0,0 +1,109 @@
1
+ <script lang="ts">
2
+ import { browser } from "$app/environment";
3
+ import { page } from "$app/state";
4
+
5
+ let { serverOrigin, readOnly } = $props<{
6
+ serverOrigin: string;
7
+ readOnly: boolean;
8
+ }>();
9
+
10
+ const STORAGE_KEY = "mongoku:origin-warning-dismissed";
11
+
12
+ let showOriginWarning = $state(false);
13
+
14
+ // Check if we should show the origin warning
15
+ $effect(() => {
16
+ if (browser && serverOrigin !== page.url.origin) {
17
+ const dismissed = sessionStorage.getItem(STORAGE_KEY);
18
+ showOriginWarning = !dismissed;
19
+ }
20
+ });
21
+
22
+ function dismissWarning() {
23
+ sessionStorage.setItem(STORAGE_KEY, "true");
24
+ showOriginWarning = false;
25
+ }
26
+ </script>
27
+
28
+ {#if showOriginWarning}
29
+ <div class="warning-banner">
30
+ <div class="warning-content">
31
+ <svg
32
+ xmlns="http://www.w3.org/2000/svg"
33
+ width="20"
34
+ height="20"
35
+ viewBox="0 0 24 24"
36
+ fill="none"
37
+ stroke="currentColor"
38
+ stroke-width="2"
39
+ stroke-linecap="round"
40
+ stroke-linejoin="round"
41
+ >
42
+ <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" />
43
+ <line x1="12" y1="9" x2="12" y2="13" />
44
+ <line x1="12" y1="17" x2="12.01" y2="17" />
45
+ </svg>
46
+ <span>
47
+ To enable {readOnly ? "server configuration" : "write operations"}, set the <code>MONGOKU_SERVER_ORIGIN</code>
48
+ environment variable to
49
+ <code>{page.url.origin}</code>. Current server origin is <code>{serverOrigin}</code>
50
+ </span>
51
+ <button class="dismiss-button" onclick={dismissWarning} aria-label="Dismiss warning">&times;</button>
52
+ </div>
53
+ </div>
54
+ {/if}
55
+
56
+ <style lang="postcss">
57
+ .warning-banner {
58
+ background-color: #f59e0b;
59
+ color: #111827;
60
+ padding: 12px 24px;
61
+ border-bottom: 1px solid #d97706;
62
+ }
63
+
64
+ .warning-content {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: 12px;
68
+ max-width: 1400px;
69
+ margin: 0 auto;
70
+
71
+ svg {
72
+ flex-shrink: 0;
73
+ }
74
+
75
+ span {
76
+ flex: 1;
77
+ font-size: 14px;
78
+ line-height: 1.5;
79
+ }
80
+
81
+ code {
82
+ background-color: rgba(0, 0, 0, 0.1);
83
+ padding: 2px 6px;
84
+ border-radius: 3px;
85
+ font-family: monospace;
86
+ font-size: 13px;
87
+ }
88
+ }
89
+
90
+ .dismiss-button {
91
+ background: none;
92
+ border: none;
93
+ font-size: 24px;
94
+ cursor: pointer;
95
+ opacity: 0.7;
96
+ padding: 0;
97
+ width: 24px;
98
+ height: 24px;
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ flex-shrink: 0;
103
+ color: #111827;
104
+
105
+ &:hover {
106
+ opacity: 1;
107
+ }
108
+ }
109
+ </style>
@@ -0,0 +1,37 @@
1
+ <script lang="ts">
2
+ import { resolve } from "$app/paths";
3
+ import { page } from "$app/state";
4
+
5
+ const { class: className }: { class: string } = $props();
6
+
7
+ const categories = $derived(
8
+ ((page.data.categories ?? []) as Array<{ key: string; label: string }>).map((x) => ({
9
+ ...x,
10
+ href: page.url.pathname.split("/").slice(0, -1).join("/") + "/" + x.key,
11
+ })),
12
+ );
13
+ const currentPath = $derived(page.url.pathname.split("/").pop());
14
+ </script>
15
+
16
+ {#if categories.length}
17
+ <div class="flex {className}">
18
+ {#each categories as category, index (category.key)}
19
+ {@const isActive = currentPath === category.key}
20
+ {@const sharedClasses = `btn btn-default btn-sm uppercase
21
+ ${index === 0 ? "" : "rounded-l-none"}
22
+ ${index === categories.length - 1 ? "" : "rounded-r-none"}
23
+ ${index > 0 ? "-ml-px" : ""}
24
+ ${isActive ? "opacity-100 cursor-default !bg-[var(--color-3)]" : ""}`}
25
+ {#if isActive}
26
+ <span class={sharedClasses}>
27
+ {category.label}
28
+ </span>
29
+ {:else}
30
+ <!-- eslint-disable-next-line @typescript-eslint/no-explicit-any -->
31
+ <a href={resolve(category.href as any)} class={sharedClasses}>
32
+ {category.label}
33
+ </a>
34
+ {/if}
35
+ {/each}
36
+ </div>
37
+ {/if}
@@ -31,7 +31,7 @@
31
31
 
32
32
  <style lang="postcss">
33
33
  .panel {
34
- background-color: var(--color-2);
34
+ background-color: var(--light-background);
35
35
  border: var(--border);
36
36
  }
37
37
  </style>