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.
- package/Dockerfile +1 -0
- package/README.md +25 -0
- package/build/client/_app/immutable/assets/0.CdYhspVa.css +1 -0
- package/build/client/_app/immutable/assets/0.CdYhspVa.css.br +0 -0
- package/build/client/_app/immutable/assets/0.CdYhspVa.css.gz +0 -0
- package/build/client/_app/immutable/chunks/{DdLT9cdj.js → B59nRjE7.js} +1 -1
- package/build/client/_app/immutable/chunks/B59nRjE7.js.br +2 -0
- package/build/client/_app/immutable/chunks/B59nRjE7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BBqIHhSl.js +1 -0
- package/build/client/_app/immutable/chunks/BBqIHhSl.js.br +0 -0
- package/build/client/_app/immutable/chunks/BBqIHhSl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BEi7QatZ.js → BIUJX0Ps.js} +6 -6
- package/build/client/_app/immutable/chunks/BIUJX0Ps.js.br +0 -0
- package/build/client/_app/immutable/chunks/BIUJX0Ps.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C6nv_pni.js +1 -0
- package/build/client/_app/immutable/chunks/C6nv_pni.js.br +0 -0
- package/build/client/_app/immutable/chunks/C6nv_pni.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bh2n5Bfy.js → CETiZ6GF.js} +1 -1
- package/build/client/_app/immutable/chunks/CETiZ6GF.js.br +0 -0
- package/build/client/_app/immutable/chunks/CETiZ6GF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CX0xC2bt.js +1 -0
- package/build/client/_app/immutable/chunks/CX0xC2bt.js.br +0 -0
- package/build/client/_app/immutable/chunks/CX0xC2bt.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CeXlKXQN.js +1 -0
- package/build/client/_app/immutable/chunks/CeXlKXQN.js.br +0 -0
- package/build/client/_app/immutable/chunks/CeXlKXQN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ChTiw7nk.js +4 -0
- package/build/client/_app/immutable/chunks/ChTiw7nk.js.br +0 -0
- package/build/client/_app/immutable/chunks/ChTiw7nk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Czyt1_Wc.js +1 -0
- package/build/client/_app/immutable/chunks/Czyt1_Wc.js.br +0 -0
- package/build/client/_app/immutable/chunks/Czyt1_Wc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B5NTIIm5.js → DJHYr09v.js} +1 -1
- package/build/client/_app/immutable/chunks/DJHYr09v.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJHYr09v.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{C2amz0TU.js → DZxZehvI.js} +1 -1
- package/build/client/_app/immutable/chunks/DZxZehvI.js.br +0 -0
- package/build/client/_app/immutable/chunks/DZxZehvI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DaNl6Y92.js +2 -0
- package/build/client/_app/immutable/chunks/DaNl6Y92.js.br +0 -0
- package/build/client/_app/immutable/chunks/DaNl6Y92.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dbu5gl04.js +1 -0
- package/build/client/_app/immutable/chunks/Dbu5gl04.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dbu5gl04.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DczwA5Ds.js +1 -0
- package/build/client/_app/immutable/chunks/DczwA5Ds.js.br +0 -0
- package/build/client/_app/immutable/chunks/DczwA5Ds.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjlV9yev.js +1 -0
- package/build/client/_app/immutable/chunks/DjlV9yev.js.br +0 -0
- package/build/client/_app/immutable/chunks/DjlV9yev.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DkIdyQoH.js +1 -0
- package/build/client/_app/immutable/chunks/DkIdyQoH.js.br +0 -0
- package/build/client/_app/immutable/chunks/DkIdyQoH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DskkUG-R.js +41 -0
- package/build/client/_app/immutable/chunks/DskkUG-R.js.br +0 -0
- package/build/client/_app/immutable/chunks/DskkUG-R.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DtqR9xj2.js +16 -0
- package/build/client/_app/immutable/chunks/DtqR9xj2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DtqR9xj2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{c-rWvg5T.js → Dv9wDVNU.js} +1 -1
- package/build/client/_app/immutable/chunks/Dv9wDVNU.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dv9wDVNU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bl8s7Z6r.js → DwvJoC1a.js} +1 -1
- package/build/client/_app/immutable/chunks/DwvJoC1a.js.br +0 -0
- package/build/client/_app/immutable/chunks/DwvJoC1a.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ULh2o3ji.js +1 -0
- package/build/client/_app/immutable/chunks/ULh2o3ji.js.br +0 -0
- package/build/client/_app/immutable/chunks/ULh2o3ji.js.gz +0 -0
- package/build/client/_app/immutable/chunks/V1mdyEl2.js +1 -0
- package/build/client/_app/immutable/chunks/V1mdyEl2.js.br +0 -0
- package/build/client/_app/immutable/chunks/V1mdyEl2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DUw-I2kh.js → gjWX2x82.js} +1 -1
- package/build/client/_app/immutable/chunks/gjWX2x82.js.br +0 -0
- package/build/client/_app/immutable/chunks/gjWX2x82.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CxcplU4Q.js → y5L2Na-S.js} +1 -1
- package/build/client/_app/immutable/chunks/y5L2Na-S.js.br +0 -0
- package/build/client/_app/immutable/chunks/y5L2Na-S.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DSC3O-oq.js +2 -0
- package/build/client/_app/immutable/entry/app.DSC3O-oq.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DSC3O-oq.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DXWFdQeQ.js +1 -0
- package/build/client/_app/immutable/entry/start.DXWFdQeQ.js.br +0 -0
- package/build/client/_app/immutable/entry/start.DXWFdQeQ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.CMAlzqMw.js +1 -0
- package/build/client/_app/immutable/nodes/0.CMAlzqMw.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CMAlzqMw.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.B6Npt7WS.js +1 -0
- package/build/client/_app/immutable/nodes/1.B6Npt7WS.js.br +4 -0
- package/build/client/_app/immutable/nodes/1.B6Npt7WS.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.UKtNnnWx.js +2 -0
- package/build/client/_app/immutable/nodes/10.UKtNnnWx.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.UKtNnnWx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.DZQrIhD6.js +6 -0
- package/build/client/_app/immutable/nodes/11.DZQrIhD6.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.DZQrIhD6.js.gz +0 -0
- package/build/client/_app/immutable/nodes/12.Bb2XzJJ4.js +1 -0
- package/build/client/_app/immutable/nodes/12.Bb2XzJJ4.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.Bb2XzJJ4.js.gz +0 -0
- package/build/client/_app/immutable/nodes/13.B_EllgAJ.js +1 -0
- package/build/client/_app/immutable/nodes/13.B_EllgAJ.js.br +0 -0
- package/build/client/_app/immutable/nodes/13.B_EllgAJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/14.Ds1Cbw86.js +65 -0
- package/build/client/_app/immutable/nodes/14.Ds1Cbw86.js.br +0 -0
- package/build/client/_app/immutable/nodes/14.Ds1Cbw86.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{2.AM8fesja.js → 2.C6NzDBVE.js} +1 -1
- package/build/client/_app/immutable/nodes/2.C6NzDBVE.js.br +2 -0
- package/build/client/_app/immutable/nodes/2.C6NzDBVE.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{3.BShuoOz5.js → 3.CZJqJ4La.js} +1 -1
- package/build/client/_app/immutable/nodes/3.CZJqJ4La.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CZJqJ4La.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{4.BD6QbApY.js → 4.CNe3XPNo.js} +1 -1
- package/build/client/_app/immutable/nodes/4.CNe3XPNo.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CNe3XPNo.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.JM_dwz0R.js → 5.BWhhv567.js} +1 -1
- package/build/client/_app/immutable/nodes/5.BWhhv567.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.BWhhv567.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.DrDdJlUZ.js +1 -0
- package/build/client/_app/immutable/nodes/7.DrDdJlUZ.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.DrDdJlUZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.DY5fyf2p.js +2 -0
- package/build/client/_app/immutable/nodes/8.DY5fyf2p.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.DY5fyf2p.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DSZg3ucy.js +1 -0
- package/build/client/_app/immutable/nodes/9.DSZg3ucy.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DSZg3ucy.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/robots.txt.br +0 -0
- package/build/client/robots.txt.gz +0 -0
- package/build/handler.js +290 -228
- package/build/server/chunks/0-94hvO2vX.js +31 -0
- package/build/server/chunks/0-94hvO2vX.js.map +1 -0
- package/build/server/chunks/1-DU2n-wa5.js +9 -0
- package/build/server/chunks/1-DU2n-wa5.js.map +1 -0
- package/build/server/chunks/{9-DrDIAOIh.js → 10-CA3VfgE7.js} +7 -6
- package/build/server/chunks/10-CA3VfgE7.js.map +1 -0
- package/build/server/chunks/{10-WRjYTwFT.js → 11-xh-tBR25.js} +8 -7
- package/build/server/chunks/11-xh-tBR25.js.map +1 -0
- package/build/server/chunks/{11-Cq79IAWK.js → 12-CHoThn5d.js} +8 -7
- package/build/server/chunks/12-CHoThn5d.js.map +1 -0
- package/build/server/chunks/{12-DnRkeAVv.js → 13-s3o-iKja.js} +8 -7
- package/build/server/chunks/13-s3o-iKja.js.map +1 -0
- package/build/server/chunks/{13-DKqDuEdB.js → 14-Ch_I9f3x.js} +7 -6
- package/build/server/chunks/14-Ch_I9f3x.js.map +1 -0
- package/build/server/chunks/{2-DaZMexAs.js → 2-BNTmkYSf.js} +2 -2
- package/build/server/chunks/{2-DaZMexAs.js.map → 2-BNTmkYSf.js.map} +1 -1
- package/build/server/chunks/{3-Dr4vFhF1.js → 3-ClKd4dXQ.js} +2 -2
- package/build/server/chunks/{3-Dr4vFhF1.js.map → 3-ClKd4dXQ.js.map} +1 -1
- package/build/server/chunks/{4-K2WnEwm7.js → 4-BSPVNKkN.js} +2 -2
- package/build/server/chunks/{4-K2WnEwm7.js.map → 4-BSPVNKkN.js.map} +1 -1
- package/build/server/chunks/{5-Be-Du8oZ.js → 5-BzxZlQk0.js} +2 -2
- package/build/server/chunks/{5-Be-Du8oZ.js.map → 5-BzxZlQk0.js.map} +1 -1
- package/build/server/chunks/{6-DsYzHmsZ.js → 6-Bw8JUxiD.js} +3 -2
- package/build/server/chunks/6-Bw8JUxiD.js.map +1 -0
- package/build/server/chunks/7-B_ur3ckj.js +9 -0
- package/build/server/chunks/7-B_ur3ckj.js.map +1 -0
- package/build/server/chunks/{7-eAzN1saI.js → 8-BEcdRamT.js} +8 -7
- package/build/server/chunks/8-BEcdRamT.js.map +1 -0
- package/build/server/chunks/{8-Dtaxi2J_.js → 9-CeMYWy9o.js} +7 -6
- package/build/server/chunks/9-CeMYWy9o.js.map +1 -0
- package/build/server/chunks/JsonValue-CTg4aH_w.js +320 -0
- package/build/server/chunks/JsonValue-CTg4aH_w.js.map +1 -0
- package/build/server/chunks/{Modal-fWUUqg69.js → Modal-yO0qzufQ.js} +2 -3
- package/build/server/chunks/Modal-yO0qzufQ.js.map +1 -0
- package/build/server/chunks/{Panel-BXokpC3w.js → Panel-D9GzVDDt.js} +7 -12
- package/build/server/chunks/Panel-D9GzVDDt.js.map +1 -0
- package/build/server/chunks/{PrettyJson-CV4qF02W.js → PrettyJson-CzzntSVh.js} +15 -10
- package/build/server/chunks/PrettyJson-CzzntSVh.js.map +1 -0
- package/build/server/chunks/{Tooltip-1tZ4BUxU.js → Tooltip-D2BX7dwq.js} +2 -2
- package/build/server/chunks/Tooltip-D2BX7dwq.js.map +1 -0
- package/build/server/chunks/{TooltipTable-B2QGp4YW.js → TooltipTable-91W9LxGR.js} +3 -4
- package/build/server/chunks/TooltipTable-91W9LxGR.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-DAGMbkJX.js → _layout.svelte-BFxKanne.js} +28 -24
- package/build/server/chunks/_layout.svelte-BFxKanne.js.map +1 -0
- package/build/server/chunks/{_page.svelte-DgQxD9T8.js → _page.svelte-CQzzieEo.js} +16 -18
- package/build/server/chunks/_page.svelte-CQzzieEo.js.map +1 -0
- package/build/server/chunks/_page.svelte-CSuE9bVi.js +14 -0
- package/build/server/chunks/_page.svelte-CSuE9bVi.js.map +1 -0
- package/build/server/chunks/{_page.svelte-DfZ2COw_.js → _page.svelte-CnboYQ1K.js} +11 -73
- package/build/server/chunks/_page.svelte-CnboYQ1K.js.map +1 -0
- package/build/server/chunks/{_page.svelte-ClakOyno.js → _page.svelte-D41VQj4U.js} +17 -19
- package/build/server/chunks/_page.svelte-D41VQj4U.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CB9ZXhBt.js → _page.svelte-Dg71nX8A.js} +117 -97
- package/build/server/chunks/_page.svelte-Dg71nX8A.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BUqI0nM9.js → _page.svelte-DxlZXLVf.js} +17 -19
- package/build/server/chunks/_page.svelte-DxlZXLVf.js.map +1 -0
- package/build/server/chunks/{_page.svelte-Ccc0KJ66.js → _page.svelte-SZxwc25D.js} +45 -39
- package/build/server/chunks/_page.svelte-SZxwc25D.js.map +1 -0
- package/build/server/chunks/{_page.svelte-wmgrrvR7.js → _page.svelte-THKAhY4k.js} +48 -51
- package/build/server/chunks/_page.svelte-THKAhY4k.js.map +1 -0
- package/build/server/chunks/_server.ts-B3lXxheE.js +15 -0
- package/build/server/chunks/_server.ts-B3lXxheE.js.map +1 -0
- package/build/server/chunks/_server.ts-Bs5HC7Wf.js +46 -0
- package/build/server/chunks/_server.ts-Bs5HC7Wf.js.map +1 -0
- package/build/server/chunks/_server.ts-DRL9sDg4.js +34 -0
- package/build/server/chunks/_server.ts-DRL9sDg4.js.map +1 -0
- package/build/server/chunks/_server.ts-DqL5edUL.js +24 -0
- package/build/server/chunks/_server.ts-DqL5edUL.js.map +1 -0
- package/build/server/chunks/client-C7bEwskR.js +7 -0
- package/build/server/chunks/{client-BCfAqu0g.js.map → client-C7bEwskR.js.map} +1 -1
- package/build/server/chunks/{client2-B-hc4vU8.js → client2-DcCKOWWC.js} +6 -6
- package/build/server/chunks/client2-DcCKOWWC.js.map +1 -0
- package/build/server/chunks/error.svelte-Bk-0XnBt.js +18 -0
- package/build/server/chunks/error.svelte-Bk-0XnBt.js.map +1 -0
- package/build/server/chunks/exports-B5ORJhfK.js +65 -0
- package/build/server/chunks/exports-B5ORJhfK.js.map +1 -0
- package/build/server/chunks/{filters-CbFjTNFI.js → filters-B3U8Nh9P.js} +16 -6
- package/build/server/chunks/filters-B3U8Nh9P.js.map +1 -0
- package/build/server/chunks/hooks.server-Cq7ufuFU.js +79 -0
- package/build/server/chunks/hooks.server-Cq7ufuFU.js.map +1 -0
- package/build/server/chunks/{index2-CJE0QJlP.js → index-CC9WtE-y.js} +3 -13
- package/build/server/chunks/index-CC9WtE-y.js.map +1 -0
- package/build/server/chunks/index-wpIsICWW.js.map +1 -1
- package/build/server/chunks/{index3-CQyDuV4f.js → index2-DMabdSHV.js} +3 -3
- package/build/server/chunks/index2-DMabdSHV.js.map +1 -0
- package/build/server/chunks/{logger-KF6KpVP6.js → logger-PfH_grbh.js} +4 -3
- package/build/server/chunks/logger-PfH_grbh.js.map +1 -0
- package/build/server/chunks/{mongo-CpQtfvt6.js → mongo-B92d7zNj.js} +25 -24
- package/build/server/chunks/mongo-B92d7zNj.js.map +1 -0
- package/build/server/chunks/oauth-BfIECOev.js +178 -0
- package/build/server/chunks/oauth-BfIECOev.js.map +1 -0
- package/build/server/chunks/remote-xxtqbu-D0yn6nhQ.js +22 -0
- package/build/server/chunks/remote-xxtqbu-D0yn6nhQ.js.map +1 -0
- package/build/server/chunks/{routing-BdGCua8Q.js → routing-CYknP78v.js} +23 -4
- package/build/server/chunks/routing-CYknP78v.js.map +1 -0
- package/build/server/chunks/{server2-CkPmd3Rb.js → server2-uigtM6st.js} +3 -3
- package/build/server/chunks/server2-uigtM6st.js.map +1 -0
- package/build/server/chunks/{servers.remote-OwAA4KJJ.js → servers.remote-BhpVo4Zs.js} +67 -42
- package/build/server/chunks/servers.remote-BhpVo4Zs.js.map +1 -0
- package/build/server/chunks/shared-BqTYMAzZ.js +1027 -0
- package/build/server/chunks/shared-BqTYMAzZ.js.map +1 -0
- package/build/server/chunks/shared-server-BmU87nph.js +11 -0
- package/build/server/chunks/shared-server-BmU87nph.js.map +1 -0
- package/build/server/chunks/{state.svelte-BfzDwKMC.js → state.svelte-Dzb7Lf2r.js} +2 -3
- package/build/server/chunks/state.svelte-Dzb7Lf2r.js.map +1 -0
- package/build/server/chunks/url-hmE1zcJ6.js +4721 -0
- package/build/server/chunks/url-hmE1zcJ6.js.map +1 -0
- package/build/server/chunks/{utils-kjxf7BZO.js → utils2-kjxf7BZO.js} +1 -1
- package/build/server/chunks/utils2-kjxf7BZO.js.map +1 -0
- package/build/server/index.js +381 -3466
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +52 -23
- package/build/server/manifest.js.map +1 -1
- package/cli.ts +4 -0
- package/dist/cli.js +3 -0
- package/ecosystem.config.js +3 -0
- package/package.json +2 -2
- package/src/api/servers.remote.ts +20 -8
- package/src/app.d.ts +5 -0
- package/src/hooks.server.ts +38 -17
- package/src/lib/actions/jsonTextarea.ts +24 -8
- package/src/lib/actions/portal.ts +12 -5
- package/src/lib/components/ExplainPanel.svelte +42 -14
- package/src/lib/components/JsonValue.svelte +12 -4
- package/src/lib/components/PrettyJson.svelte +12 -4
- package/src/lib/components/ReplicaSetSelector.svelte +3 -1
- package/src/lib/components/SearchBox.svelte +12 -4
- package/src/lib/components/Tooltip.svelte +1 -1
- package/src/lib/server/HostsManager.ts +8 -17
- package/src/lib/server/logger.ts +4 -4
- package/src/lib/server/mongo.ts +17 -12
- package/src/lib/server/oauth.ts +276 -0
- package/src/lib/utils/filters.ts +15 -5
- package/src/lib/utils/formatSignificantDigits.ts +3 -1
- package/src/lib/utils/formatTimeAgo.ts +3 -1
- package/src/lib/utils/hostnames.ts +15 -5
- package/src/lib/utils/jsonParser.ts +21 -7
- package/src/lib/utils/longestCommonSuffix.ts +3 -1
- package/src/routes/+layout.server.ts +5 -1
- package/src/routes/+layout.svelte +16 -1
- package/src/routes/.well-known/cimd.json/+server.ts +34 -0
- package/src/routes/auth/callback/+server.ts +57 -0
- package/src/routes/auth/login/+server.ts +29 -0
- package/src/routes/auth/logout/+page.svelte +9 -0
- package/src/routes/auth/logout/+server.ts +9 -0
- package/src/routes/servers/+page.svelte +9 -4
- package/src/routes/servers/[server]/databases/+page.svelte +3 -1
- package/src/routes/servers/[server]/databases/[database]/collections/+page.svelte +3 -1
- package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.svelte +3 -1
- package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/[document]/+page.svelte +9 -6
- package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.svelte +18 -6
- package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.svelte +3 -1
- package/build/client/_app/immutable/assets/0.Bg-3Xsxo.css +0 -1
- package/build/client/_app/immutable/assets/0.Bg-3Xsxo.css.br +0 -0
- package/build/client/_app/immutable/assets/0.Bg-3Xsxo.css.gz +0 -0
- package/build/client/_app/immutable/chunks/2G5jukcB.js +0 -1
- package/build/client/_app/immutable/chunks/2G5jukcB.js.br +0 -0
- package/build/client/_app/immutable/chunks/2G5jukcB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B5NTIIm5.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5NTIIm5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BEi7QatZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/BEi7QatZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOZBLPYr.js +0 -1
- package/build/client/_app/immutable/chunks/BOZBLPYr.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOZBLPYr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BUr91kOw.js +0 -1
- package/build/client/_app/immutable/chunks/BUr91kOw.js.br +0 -0
- package/build/client/_app/immutable/chunks/BUr91kOw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BYPjaq07.js +0 -1
- package/build/client/_app/immutable/chunks/BYPjaq07.js.br +0 -0
- package/build/client/_app/immutable/chunks/BYPjaq07.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BZagxdqB.js +0 -16
- package/build/client/_app/immutable/chunks/BZagxdqB.js.br +0 -0
- package/build/client/_app/immutable/chunks/BZagxdqB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bh2n5Bfy.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bh2n5Bfy.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bl8s7Z6r.js.br +0 -1
- package/build/client/_app/immutable/chunks/Bl8s7Z6r.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BnpHJF5-.js +0 -2
- package/build/client/_app/immutable/chunks/BnpHJF5-.js.br +0 -0
- package/build/client/_app/immutable/chunks/BnpHJF5-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C2amz0TU.js.br +0 -0
- package/build/client/_app/immutable/chunks/C2amz0TU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C93uPVVn.js +0 -1
- package/build/client/_app/immutable/chunks/C93uPVVn.js.br +0 -0
- package/build/client/_app/immutable/chunks/C93uPVVn.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CXNtxrhs.js +0 -1
- package/build/client/_app/immutable/chunks/CXNtxrhs.js.br +0 -0
- package/build/client/_app/immutable/chunks/CXNtxrhs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cc583CkD.js +0 -1
- package/build/client/_app/immutable/chunks/Cc583CkD.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cc583CkD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CxcplU4Q.js.br +0 -0
- package/build/client/_app/immutable/chunks/CxcplU4Q.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DDy-Kuac.js +0 -1
- package/build/client/_app/immutable/chunks/DDy-Kuac.js.br +0 -0
- package/build/client/_app/immutable/chunks/DDy-Kuac.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DIDOrPa8.js +0 -41
- package/build/client/_app/immutable/chunks/DIDOrPa8.js.br +0 -0
- package/build/client/_app/immutable/chunks/DIDOrPa8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DJ7MgPmk.js +0 -4
- package/build/client/_app/immutable/chunks/DJ7MgPmk.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJ7MgPmk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DUw-I2kh.js.br +0 -0
- package/build/client/_app/immutable/chunks/DUw-I2kh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DdLT9cdj.js.br +0 -0
- package/build/client/_app/immutable/chunks/DdLT9cdj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/c-rWvg5T.js.br +0 -0
- package/build/client/_app/immutable/chunks/c-rWvg5T.js.gz +0 -0
- package/build/client/_app/immutable/chunks/hbftB6pI.js +0 -1
- package/build/client/_app/immutable/chunks/hbftB6pI.js.br +0 -0
- package/build/client/_app/immutable/chunks/hbftB6pI.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.BvdA5xZX.js +0 -2
- package/build/client/_app/immutable/entry/app.BvdA5xZX.js.br +0 -0
- package/build/client/_app/immutable/entry/app.BvdA5xZX.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.B47HTlUj.js +0 -1
- package/build/client/_app/immutable/entry/start.B47HTlUj.js.br +0 -2
- package/build/client/_app/immutable/entry/start.B47HTlUj.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.C-Qb2qV-.js +0 -1
- package/build/client/_app/immutable/nodes/0.C-Qb2qV-.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.C-Qb2qV-.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CbwunOOA.js +0 -1
- package/build/client/_app/immutable/nodes/1.CbwunOOA.js.br +0 -4
- package/build/client/_app/immutable/nodes/1.CbwunOOA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.BONTXBU2.js +0 -6
- package/build/client/_app/immutable/nodes/10.BONTXBU2.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.BONTXBU2.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.Bt-WKNEi.js +0 -1
- package/build/client/_app/immutable/nodes/11.Bt-WKNEi.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.Bt-WKNEi.js.gz +0 -0
- package/build/client/_app/immutable/nodes/12.DtpUwyyZ.js +0 -1
- package/build/client/_app/immutable/nodes/12.DtpUwyyZ.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.DtpUwyyZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/13.Ce307l0A.js +0 -65
- package/build/client/_app/immutable/nodes/13.Ce307l0A.js.br +0 -0
- package/build/client/_app/immutable/nodes/13.Ce307l0A.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.AM8fesja.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.AM8fesja.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.BShuoOz5.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BShuoOz5.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.BD6QbApY.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.BD6QbApY.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.JM_dwz0R.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.JM_dwz0R.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.lTuFbCm_.js +0 -1
- package/build/client/_app/immutable/nodes/7.lTuFbCm_.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.lTuFbCm_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.DIWHKPrG.js +0 -1
- package/build/client/_app/immutable/nodes/8.DIWHKPrG.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.DIWHKPrG.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.D6Tw6uKW.js +0 -2
- package/build/client/_app/immutable/nodes/9.D6Tw6uKW.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.D6Tw6uKW.js.gz +0 -0
- package/build/server/chunks/0-BdG9Cl9W.js +0 -22
- package/build/server/chunks/0-BdG9Cl9W.js.map +0 -1
- package/build/server/chunks/1-BcZWKLgB.js +0 -9
- package/build/server/chunks/1-BcZWKLgB.js.map +0 -1
- package/build/server/chunks/10-WRjYTwFT.js.map +0 -1
- package/build/server/chunks/11-Cq79IAWK.js.map +0 -1
- package/build/server/chunks/12-DnRkeAVv.js.map +0 -1
- package/build/server/chunks/13-DKqDuEdB.js.map +0 -1
- package/build/server/chunks/6-DsYzHmsZ.js.map +0 -1
- package/build/server/chunks/7-eAzN1saI.js.map +0 -1
- package/build/server/chunks/8-Dtaxi2J_.js.map +0 -1
- package/build/server/chunks/9-DrDIAOIh.js.map +0 -1
- package/build/server/chunks/JsonValue-Dj3vYG5T.js +0 -366
- package/build/server/chunks/JsonValue-Dj3vYG5T.js.map +0 -1
- package/build/server/chunks/Modal-fWUUqg69.js.map +0 -1
- package/build/server/chunks/Panel-BXokpC3w.js.map +0 -1
- package/build/server/chunks/PrettyJson-CV4qF02W.js.map +0 -1
- package/build/server/chunks/Tooltip-1tZ4BUxU.js.map +0 -1
- package/build/server/chunks/TooltipTable-B2QGp4YW.js.map +0 -1
- package/build/server/chunks/_layout.svelte-DAGMbkJX.js.map +0 -1
- package/build/server/chunks/_page.svelte-BUqI0nM9.js.map +0 -1
- package/build/server/chunks/_page.svelte-CB9ZXhBt.js.map +0 -1
- package/build/server/chunks/_page.svelte-Ccc0KJ66.js.map +0 -1
- package/build/server/chunks/_page.svelte-ClakOyno.js.map +0 -1
- package/build/server/chunks/_page.svelte-DfZ2COw_.js.map +0 -1
- package/build/server/chunks/_page.svelte-DgQxD9T8.js.map +0 -1
- package/build/server/chunks/_page.svelte-wmgrrvR7.js.map +0 -1
- package/build/server/chunks/client-BCfAqu0g.js +0 -7
- package/build/server/chunks/client2-B-hc4vU8.js.map +0 -1
- package/build/server/chunks/context-8UI9xWgq.js +0 -92
- package/build/server/chunks/context-8UI9xWgq.js.map +0 -1
- package/build/server/chunks/error.svelte-hj6GNaOv.js +0 -19
- package/build/server/chunks/error.svelte-hj6GNaOv.js.map +0 -1
- package/build/server/chunks/event-DVH-6ISX.js +0 -64
- package/build/server/chunks/event-DVH-6ISX.js.map +0 -1
- package/build/server/chunks/exports-CtTNDGe5.js +0 -161
- package/build/server/chunks/exports-CtTNDGe5.js.map +0 -1
- package/build/server/chunks/filters-CbFjTNFI.js.map +0 -1
- package/build/server/chunks/hooks.server-DRPXFQlL.js +0 -53
- package/build/server/chunks/hooks.server-DRPXFQlL.js.map +0 -1
- package/build/server/chunks/index-DOCFW0vv.js +0 -1355
- package/build/server/chunks/index-DOCFW0vv.js.map +0 -1
- package/build/server/chunks/index2-CJE0QJlP.js.map +0 -1
- package/build/server/chunks/index3-CQyDuV4f.js.map +0 -1
- package/build/server/chunks/logger-KF6KpVP6.js.map +0 -1
- package/build/server/chunks/mongo-CpQtfvt6.js.map +0 -1
- package/build/server/chunks/remote-xxtqbu-CbTWQ3bq.js +0 -21
- package/build/server/chunks/remote-xxtqbu-CbTWQ3bq.js.map +0 -1
- package/build/server/chunks/routing-BdGCua8Q.js.map +0 -1
- package/build/server/chunks/server2-CkPmd3Rb.js.map +0 -1
- package/build/server/chunks/servers.remote-OwAA4KJJ.js.map +0 -1
- package/build/server/chunks/shared-w5gO1Cte.js +0 -446
- package/build/server/chunks/shared-w5gO1Cte.js.map +0 -1
- package/build/server/chunks/state.svelte-BfzDwKMC.js.map +0 -1
- package/build/server/chunks/utils-kjxf7BZO.js.map +0 -1
- package/build/server/chunks/utils2-DrnJY_bz.js +0 -91
- package/build/server/chunks/utils2-DrnJY_bz.js.map +0 -1
- /package/build/client/_app/immutable/assets/{10.Wc4MTSzM.css → 11.Wc4MTSzM.css} +0 -0
- /package/build/client/_app/immutable/assets/{10.Wc4MTSzM.css.br → 11.Wc4MTSzM.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{10.Wc4MTSzM.css.gz → 11.Wc4MTSzM.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{11.CEtFGlZU.css → 12.CEtFGlZU.css} +0 -0
- /package/build/client/_app/immutable/assets/{11.CEtFGlZU.css.br → 12.CEtFGlZU.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{11.CEtFGlZU.css.gz → 12.CEtFGlZU.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{12.I1sSDJ6i.css → 13.I1sSDJ6i.css} +0 -0
- /package/build/client/_app/immutable/assets/{12.I1sSDJ6i.css.br → 13.I1sSDJ6i.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{12.I1sSDJ6i.css.gz → 13.I1sSDJ6i.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{7.CRKE8WvY.css → 8.CRKE8WvY.css} +0 -0
- /package/build/client/_app/immutable/assets/{7.CRKE8WvY.css.br → 8.CRKE8WvY.css.br} +0 -0
- /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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
60
|
+
if (!plan) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
53
63
|
|
|
54
|
-
if (plan.stage === "COLLSCAN")
|
|
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>))
|
|
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>))
|
|
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>))
|
|
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")
|
|
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)
|
|
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)
|
|
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)
|
|
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")
|
|
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)
|
|
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)
|
|
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)
|
|
130
|
-
|
|
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)
|
|
40
|
-
|
|
41
|
-
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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 =
|
|
11
|
-
|
|
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
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
}
|
package/src/lib/server/logger.ts
CHANGED
|
@@ -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 =
|
|
15
|
-
|
|
16
|
-
|
|
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
|
: [];
|
package/src/lib/server/mongo.ts
CHANGED
|
@@ -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(
|
|
204
|
-
private queryTimeout =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
233
|
+
if (env.MONGOKU_READ_PREFERENCE_TAGS) {
|
|
235
234
|
try {
|
|
236
|
-
tags = JSON.parse(
|
|
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
|
-
|
|
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(
|
|
332
|
+
.get(clientId)
|
|
328
333
|
?.close()
|
|
329
334
|
.catch((err) => logger.error(`Error closing client ${name}:`, err));
|
|
330
|
-
this.clients.delete(
|
|
331
|
-
this.clientIds.delete(
|
|
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
|
+
}
|
package/src/lib/utils/filters.ts
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
export function formatBytes(bytes: number): string {
|
|
2
|
-
if (bytes === 0)
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (bytes <
|
|
6
|
-
|
|
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
|
|