mongoku 2.4.4 → 2.4.5

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 (190) hide show
  1. package/build/client/_app/immutable/assets/0.CEIWAdGZ.css +1 -0
  2. package/build/client/_app/immutable/assets/0.CEIWAdGZ.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.CEIWAdGZ.css.gz +0 -0
  4. package/build/client/_app/immutable/chunks/{CI_ovvBu.js → 3LgOwb59.js} +1 -1
  5. package/build/client/_app/immutable/chunks/3LgOwb59.js.br +0 -0
  6. package/build/client/_app/immutable/chunks/3LgOwb59.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{0x2tqDge.js → BNF3TSWe.js} +1 -1
  8. package/build/client/_app/immutable/chunks/BNF3TSWe.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/BNF3TSWe.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/CH4IMlv6.js +4 -0
  11. package/build/client/_app/immutable/chunks/CH4IMlv6.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/CH4IMlv6.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/{DqFgKUuF.js → CMu1ND4u.js} +1 -1
  14. package/build/client/_app/immutable/chunks/CMu1ND4u.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/CMu1ND4u.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/CeBnCdu0.js +1 -0
  17. package/build/client/_app/immutable/chunks/CeBnCdu0.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/CeBnCdu0.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{m9KJhr2i.js → CrvogBCO.js} +1 -1
  20. package/build/client/_app/immutable/chunks/CrvogBCO.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/CrvogBCO.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{SENhER8Y.js → DL_7eGCj.js} +6 -6
  23. package/build/client/_app/immutable/chunks/DL_7eGCj.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/DL_7eGCj.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/YVSmS-BO.js +1 -0
  26. package/build/client/_app/immutable/chunks/YVSmS-BO.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/YVSmS-BO.js.gz +0 -0
  28. package/build/client/_app/immutable/entry/{app.6kvAGzFx.js → app.Bn63r6jq.js} +2 -2
  29. package/build/client/_app/immutable/entry/app.Bn63r6jq.js.br +0 -0
  30. package/build/client/_app/immutable/entry/app.Bn63r6jq.js.gz +0 -0
  31. package/build/client/_app/immutable/entry/start.D-zzQzHa.js +1 -0
  32. package/build/client/_app/immutable/entry/start.D-zzQzHa.js.br +2 -0
  33. package/build/client/_app/immutable/entry/start.D-zzQzHa.js.gz +0 -0
  34. package/build/client/_app/immutable/nodes/0._Ka7l4G7.js +1 -0
  35. package/build/client/_app/immutable/nodes/0._Ka7l4G7.js.br +0 -0
  36. package/build/client/_app/immutable/nodes/0._Ka7l4G7.js.gz +0 -0
  37. package/build/client/_app/immutable/nodes/{1.C6-lRSct.js → 1.C_RZUfKy.js} +1 -1
  38. package/build/client/_app/immutable/nodes/1.C_RZUfKy.js.br +0 -0
  39. package/build/client/_app/immutable/nodes/1.C_RZUfKy.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/10.P_2uCVkV.js +3 -0
  41. package/build/client/_app/immutable/nodes/10.P_2uCVkV.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/10.P_2uCVkV.js.gz +0 -0
  43. package/build/client/_app/immutable/nodes/{11.D6PMR4JE.js → 11.B9LD_pR3.js} +1 -1
  44. package/build/client/_app/immutable/nodes/11.B9LD_pR3.js.br +0 -0
  45. package/build/client/_app/immutable/nodes/11.B9LD_pR3.js.gz +0 -0
  46. package/build/client/_app/immutable/nodes/{12.BaG9yS23.js → 12.DtrR4t5w.js} +1 -1
  47. package/build/client/_app/immutable/nodes/12.DtrR4t5w.js.br +0 -0
  48. package/build/client/_app/immutable/nodes/12.DtrR4t5w.js.gz +0 -0
  49. package/build/client/_app/immutable/nodes/{13.ClrBypIt.js → 13.BYagUX2D.js} +1 -1
  50. package/build/client/_app/immutable/nodes/13.BYagUX2D.js.br +0 -0
  51. package/build/client/_app/immutable/nodes/13.BYagUX2D.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/{7.C2cwruWu.js → 7.XwiZ31H4.js} +1 -1
  53. package/build/client/_app/immutable/nodes/7.XwiZ31H4.js.br +0 -0
  54. package/build/client/_app/immutable/nodes/7.XwiZ31H4.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/8.Cgq8c1Pf.js +1 -0
  56. package/build/client/_app/immutable/nodes/8.Cgq8c1Pf.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/8.Cgq8c1Pf.js.gz +0 -0
  58. package/build/client/_app/immutable/nodes/9.ClN4Gbvd.js +2 -0
  59. package/build/client/_app/immutable/nodes/9.ClN4Gbvd.js.br +0 -0
  60. package/build/client/_app/immutable/nodes/9.ClN4Gbvd.js.gz +0 -0
  61. package/build/client/_app/version.json +1 -1
  62. package/build/client/_app/version.json.br +0 -0
  63. package/build/client/_app/version.json.gz +0 -0
  64. package/build/server/chunks/{0-5-SDX-d2.js → 0-DNH-F5x0.js} +4 -4
  65. package/build/server/chunks/{0-5-SDX-d2.js.map → 0-DNH-F5x0.js.map} +1 -1
  66. package/build/server/chunks/{1-Cck2Jrzo.js → 1-1_OQTf0e.js} +2 -2
  67. package/build/server/chunks/{1-Cck2Jrzo.js.map → 1-1_OQTf0e.js.map} +1 -1
  68. package/build/server/chunks/{10-BV4HPibI.js → 10-4E_aVzT4.js} +58 -36
  69. package/build/server/chunks/10-4E_aVzT4.js.map +1 -0
  70. package/build/server/chunks/{11-iazI-4Kb.js → 11-DTyCG8Xj.js} +3 -3
  71. package/build/server/chunks/{11-iazI-4Kb.js.map → 11-DTyCG8Xj.js.map} +1 -1
  72. package/build/server/chunks/{12-B0JxHwKO.js → 12-O3oSmD2o.js} +3 -3
  73. package/build/server/chunks/{12-B0JxHwKO.js.map → 12-O3oSmD2o.js.map} +1 -1
  74. package/build/server/chunks/{13-IcujVjLI.js → 13-Drp2sCYG.js} +3 -3
  75. package/build/server/chunks/{13-IcujVjLI.js.map → 13-Drp2sCYG.js.map} +1 -1
  76. package/build/server/chunks/{7-uVKBumqv.js → 7-DL7-ZmZ2.js} +3 -3
  77. package/build/server/chunks/{7-uVKBumqv.js.map → 7-DL7-ZmZ2.js.map} +1 -1
  78. package/build/server/chunks/{8-eWNgFGi6.js → 8-GUonP2Zy.js} +3 -3
  79. package/build/server/chunks/{8-eWNgFGi6.js.map → 8-GUonP2Zy.js.map} +1 -1
  80. package/build/server/chunks/{9-C8GLDx_s.js → 9-DQhrhu5o.js} +3 -3
  81. package/build/server/chunks/{9-C8GLDx_s.js.map → 9-DQhrhu5o.js.map} +1 -1
  82. package/build/server/chunks/{JsonValue-DiECF6Zd.js → JsonValue-DoGRvQnG.js} +3 -3
  83. package/build/server/chunks/{JsonValue-DiECF6Zd.js.map → JsonValue-DoGRvQnG.js.map} +1 -1
  84. package/build/server/chunks/{Panel-DEP08QXV.js → Panel-BHGtM9Vw.js} +2 -2
  85. package/build/server/chunks/{Panel-DEP08QXV.js.map → Panel-BHGtM9Vw.js.map} +1 -1
  86. package/build/server/chunks/{PrettyJson-ElzPxPF4.js → PrettyJson-Bnmo1PGg.js} +5 -5
  87. package/build/server/chunks/{PrettyJson-ElzPxPF4.js.map → PrettyJson-Bnmo1PGg.js.map} +1 -1
  88. package/build/server/chunks/{Tooltip-DK6Aok7l.js → Tooltip-DAE2mkm6.js} +2 -2
  89. package/build/server/chunks/{Tooltip-DK6Aok7l.js.map → Tooltip-DAE2mkm6.js.map} +1 -1
  90. package/build/server/chunks/TooltipTable-xo_OEG9c.js +64 -0
  91. package/build/server/chunks/TooltipTable-xo_OEG9c.js.map +1 -0
  92. package/build/server/chunks/{_layout.svelte-CCi6mq1k.js → _layout.svelte-Dji2JJ9X.js} +29 -20
  93. package/build/server/chunks/_layout.svelte-Dji2JJ9X.js.map +1 -0
  94. package/build/server/chunks/{_page.svelte-BvjNfjgw.js → _page.svelte-C4rGFSYL.js} +7 -7
  95. package/build/server/chunks/{_page.svelte-BvjNfjgw.js.map → _page.svelte-C4rGFSYL.js.map} +1 -1
  96. package/build/server/chunks/{_page.svelte-B4BL5PJR.js → _page.svelte-CJ5HzoD0.js} +4 -4
  97. package/build/server/chunks/{_page.svelte-B4BL5PJR.js.map → _page.svelte-CJ5HzoD0.js.map} +1 -1
  98. package/build/server/chunks/{_page.svelte-DJFPwyij.js → _page.svelte-ClvvVxpD.js} +101 -35
  99. package/build/server/chunks/_page.svelte-ClvvVxpD.js.map +1 -0
  100. package/build/server/chunks/{_page.svelte-DDe4hyAB.js → _page.svelte-D3jyb8d9.js} +6 -6
  101. package/build/server/chunks/{_page.svelte-DDe4hyAB.js.map → _page.svelte-D3jyb8d9.js.map} +1 -1
  102. package/build/server/chunks/{_page.svelte-BUheieJ5.js → _page.svelte-D9IvgJO5.js} +6 -6
  103. package/build/server/chunks/{_page.svelte-BUheieJ5.js.map → _page.svelte-D9IvgJO5.js.map} +1 -1
  104. package/build/server/chunks/{_page.svelte-DEe2Kbbw.js → _page.svelte-be8sxgGt.js} +6 -6
  105. package/build/server/chunks/{_page.svelte-DEe2Kbbw.js.map → _page.svelte-be8sxgGt.js.map} +1 -1
  106. package/build/server/chunks/{_page.svelte-Bj297hp1.js → _page.svelte-x1L5xjgQ.js} +6 -6
  107. package/build/server/chunks/{_page.svelte-Bj297hp1.js.map → _page.svelte-x1L5xjgQ.js.map} +1 -1
  108. package/build/server/chunks/{index2-DzKnqQNM.js → index2-eSFyMQpS.js} +2 -2
  109. package/build/server/chunks/{index2-DzKnqQNM.js.map → index2-eSFyMQpS.js.map} +1 -1
  110. package/build/server/chunks/{remote-xxtqbu-DBe3CqEJ.js → remote-xxtqbu-ETLGkdRu.js} +2 -2
  111. package/build/server/chunks/remote-xxtqbu-ETLGkdRu.js.map +1 -0
  112. package/build/server/chunks/{servers.remote-HDmNH7n4.js → servers.remote-CGies_Na.js} +85 -6
  113. package/build/server/chunks/servers.remote-CGies_Na.js.map +1 -0
  114. package/build/server/index.js +2 -2
  115. package/build/server/index.js.map +1 -1
  116. package/build/server/manifest.js +11 -11
  117. package/build/server/manifest.js.map +1 -1
  118. package/package.json +1 -1
  119. package/src/api/servers.remote.ts +91 -2
  120. package/src/app.css +5 -0
  121. package/src/lib/actions/clickOutside.ts +24 -0
  122. package/src/lib/components/Breadcrumbs.svelte +5 -19
  123. package/src/lib/components/SearchBox.svelte +161 -62
  124. package/src/lib/components/TooltipTable.svelte +4 -2
  125. package/src/lib/icons/IconChevronDown.svelte +20 -0
  126. package/src/lib/icons/IconCopy.svelte +21 -0
  127. package/src/lib/icons/IconEdit.svelte +21 -0
  128. package/src/lib/icons/IconPlus.svelte +20 -0
  129. package/src/lib/icons/IconSortReverse.svelte +23 -0
  130. package/src/lib/stores/breadcrumbs.svelte.ts +17 -0
  131. package/src/lib/types.ts +2 -0
  132. package/src/routes/+layout.svelte +12 -1
  133. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.server.ts +67 -34
  134. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.svelte +259 -44
  135. package/build/client/_app/immutable/assets/0.C-Y-CVnr.css +0 -1
  136. package/build/client/_app/immutable/assets/0.C-Y-CVnr.css.br +0 -0
  137. package/build/client/_app/immutable/assets/0.C-Y-CVnr.css.gz +0 -0
  138. package/build/client/_app/immutable/chunks/0x2tqDge.js.br +0 -0
  139. package/build/client/_app/immutable/chunks/0x2tqDge.js.gz +0 -0
  140. package/build/client/_app/immutable/chunks/CI_ovvBu.js.br +0 -0
  141. package/build/client/_app/immutable/chunks/CI_ovvBu.js.gz +0 -0
  142. package/build/client/_app/immutable/chunks/Cp0n7wR5.js +0 -4
  143. package/build/client/_app/immutable/chunks/Cp0n7wR5.js.br +0 -0
  144. package/build/client/_app/immutable/chunks/Cp0n7wR5.js.gz +0 -0
  145. package/build/client/_app/immutable/chunks/DqFgKUuF.js.br +0 -0
  146. package/build/client/_app/immutable/chunks/DqFgKUuF.js.gz +0 -0
  147. package/build/client/_app/immutable/chunks/MW_nrxc3.js +0 -1
  148. package/build/client/_app/immutable/chunks/MW_nrxc3.js.br +0 -0
  149. package/build/client/_app/immutable/chunks/MW_nrxc3.js.gz +0 -0
  150. package/build/client/_app/immutable/chunks/SENhER8Y.js.br +0 -0
  151. package/build/client/_app/immutable/chunks/SENhER8Y.js.gz +0 -0
  152. package/build/client/_app/immutable/chunks/m9KJhr2i.js.br +0 -0
  153. package/build/client/_app/immutable/chunks/m9KJhr2i.js.gz +0 -0
  154. package/build/client/_app/immutable/chunks/vsNApJWQ.js +0 -1
  155. package/build/client/_app/immutable/chunks/vsNApJWQ.js.br +0 -0
  156. package/build/client/_app/immutable/chunks/vsNApJWQ.js.gz +0 -0
  157. package/build/client/_app/immutable/entry/app.6kvAGzFx.js.br +0 -0
  158. package/build/client/_app/immutable/entry/app.6kvAGzFx.js.gz +0 -0
  159. package/build/client/_app/immutable/entry/start.CNBjelhv.js +0 -1
  160. package/build/client/_app/immutable/entry/start.CNBjelhv.js.br +0 -2
  161. package/build/client/_app/immutable/entry/start.CNBjelhv.js.gz +0 -0
  162. package/build/client/_app/immutable/nodes/0.ClgWJHZK.js +0 -1
  163. package/build/client/_app/immutable/nodes/0.ClgWJHZK.js.br +0 -0
  164. package/build/client/_app/immutable/nodes/0.ClgWJHZK.js.gz +0 -0
  165. package/build/client/_app/immutable/nodes/1.C6-lRSct.js.br +0 -0
  166. package/build/client/_app/immutable/nodes/1.C6-lRSct.js.gz +0 -0
  167. package/build/client/_app/immutable/nodes/10.DIGWL6eC.js +0 -1
  168. package/build/client/_app/immutable/nodes/10.DIGWL6eC.js.br +0 -0
  169. package/build/client/_app/immutable/nodes/10.DIGWL6eC.js.gz +0 -0
  170. package/build/client/_app/immutable/nodes/11.D6PMR4JE.js.br +0 -0
  171. package/build/client/_app/immutable/nodes/11.D6PMR4JE.js.gz +0 -0
  172. package/build/client/_app/immutable/nodes/12.BaG9yS23.js.br +0 -0
  173. package/build/client/_app/immutable/nodes/12.BaG9yS23.js.gz +0 -0
  174. package/build/client/_app/immutable/nodes/13.ClrBypIt.js.br +0 -0
  175. package/build/client/_app/immutable/nodes/13.ClrBypIt.js.gz +0 -0
  176. package/build/client/_app/immutable/nodes/7.C2cwruWu.js.br +0 -0
  177. package/build/client/_app/immutable/nodes/7.C2cwruWu.js.gz +0 -0
  178. package/build/client/_app/immutable/nodes/8.CRDgVKjB.js +0 -1
  179. package/build/client/_app/immutable/nodes/8.CRDgVKjB.js.br +0 -0
  180. package/build/client/_app/immutable/nodes/8.CRDgVKjB.js.gz +0 -0
  181. package/build/client/_app/immutable/nodes/9.X5vwJ8aD.js +0 -2
  182. package/build/client/_app/immutable/nodes/9.X5vwJ8aD.js.br +0 -0
  183. package/build/client/_app/immutable/nodes/9.X5vwJ8aD.js.gz +0 -0
  184. package/build/server/chunks/10-BV4HPibI.js.map +0 -1
  185. package/build/server/chunks/TooltipTable-DUYKVtrh.js +0 -60
  186. package/build/server/chunks/TooltipTable-DUYKVtrh.js.map +0 -1
  187. package/build/server/chunks/_layout.svelte-CCi6mq1k.js.map +0 -1
  188. package/build/server/chunks/_page.svelte-DJFPwyij.js.map +0 -1
  189. package/build/server/chunks/remote-xxtqbu-DBe3CqEJ.js.map +0 -1
  190. package/build/server/chunks/servers.remote-HDmNH7n4.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ class?: string;
4
+ }
5
+
6
+ let { class: className = "w-4 h-4" }: Props = $props();
7
+ </script>
8
+
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ viewBox="0 0 24 24"
12
+ fill="none"
13
+ stroke="currentColor"
14
+ stroke-width="2"
15
+ stroke-linecap="round"
16
+ stroke-linejoin="round"
17
+ class={className}
18
+ >
19
+ <rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
20
+ <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
21
+ </svg>
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ class?: string;
4
+ }
5
+
6
+ let { class: className = "w-4 h-4" }: Props = $props();
7
+ </script>
8
+
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ viewBox="0 0 24 24"
12
+ fill="none"
13
+ stroke="currentColor"
14
+ stroke-width="2"
15
+ stroke-linecap="round"
16
+ stroke-linejoin="round"
17
+ class={className}
18
+ >
19
+ <path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path>
20
+ <path d="m15 5 4 4"></path>
21
+ </svg>
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ class?: string;
4
+ }
5
+
6
+ let { class: className = "w-4 h-4" }: Props = $props();
7
+ </script>
8
+
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ viewBox="0 0 24 24"
12
+ fill="none"
13
+ stroke="currentColor"
14
+ stroke-width="2"
15
+ stroke-linecap="round"
16
+ stroke-linejoin="round"
17
+ class={className}
18
+ >
19
+ <path d="M12 5v14M5 12h14" />
20
+ </svg>
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ class?: string;
4
+ }
5
+
6
+ let { class: className = "w-4 h-4" }: Props = $props();
7
+ </script>
8
+
9
+ <svg
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ viewBox="0 0 24 24"
12
+ fill="none"
13
+ stroke="currentColor"
14
+ stroke-width="2"
15
+ stroke-linecap="round"
16
+ stroke-linejoin="round"
17
+ class={className}
18
+ >
19
+ <path d="M3 6h18" />
20
+ <path d="M7 12h10" />
21
+ <path d="M10 18h4" />
22
+ <path d="m7 16 3 3 3-3" />
23
+ </svg>
@@ -0,0 +1,17 @@
1
+ import { page } from "$app/state";
2
+
3
+ export interface BreadcrumbItem {
4
+ label: string;
5
+ href?: string;
6
+ }
7
+
8
+ export const breadcrumbs = {
9
+ get items(): BreadcrumbItem[] {
10
+ const list = (page.data.breadcrumbs ?? []) as Array<{ label: string; path: string }>;
11
+
12
+ return list.reduce<BreadcrumbItem[]>(
13
+ (prev, curr) => [...prev, { label: curr.label, href: `${prev.at(-1)?.href ?? ""}${curr.path}` }],
14
+ [],
15
+ );
16
+ },
17
+ };
package/src/lib/types.ts CHANGED
@@ -12,6 +12,8 @@ export interface SearchParams {
12
12
  project: string;
13
13
  limit: number;
14
14
  skip: number;
15
+ mode: "query" | "distinct" | "aggregation";
16
+ field?: string;
15
17
  }
16
18
 
17
19
  /**
@@ -6,13 +6,24 @@
6
6
  import OriginWarning from "$lib/components/OriginWarning.svelte";
7
7
  import PageSwitcher from "$lib/components/PageSwitcher.svelte";
8
8
  import ThemeSwitcher from "$lib/components/ThemeSwitcher.svelte";
9
+ import { breadcrumbs } from "$lib/stores/breadcrumbs.svelte";
9
10
  import "../app.css";
10
11
 
11
12
  let { children, data } = $props();
13
+
14
+ const pageTitle = $derived.by(() => {
15
+ const items = breadcrumbs.items.slice(-2).reverse();
16
+
17
+ if (items.length === 0) {
18
+ return "Mongoku";
19
+ }
20
+
21
+ return items.map((b) => b.label).join(" - ");
22
+ });
12
23
  </script>
13
24
 
14
25
  <svelte:head>
15
- <title>Mongoku</title>
26
+ <title>{pageTitle}</title>
16
27
  </svelte:head>
17
28
 
18
29
  <div style="min-height: 100vh">
@@ -2,7 +2,7 @@ import { validateAggregationPipeline } from "$lib/server/aggregation";
2
2
  import JsonEncoder from "$lib/server/JsonEncoder";
3
3
  import { logger } from "$lib/server/logger";
4
4
  import { getMongo } from "$lib/server/mongo";
5
- import { type MongoDocument } from "$lib/types";
5
+ import { type MongoDocument, type SearchParams } from "$lib/types";
6
6
  import { isEmptyObject } from "$lib/utils/isEmptyObject";
7
7
  import { parseJSON } from "$lib/utils/jsonParser";
8
8
  import type { Document } from "mongodb";
@@ -14,6 +14,18 @@ export const load: PageServerLoad = async ({ params, url }) => {
14
14
  const project = url.searchParams.get("project") || "{}";
15
15
  const skip = parseInt(url.searchParams.get("skip") || "0", 10);
16
16
  const limit = parseInt(url.searchParams.get("limit") || "20", 10);
17
+ const mode = url.searchParams.get("mode") || "query";
18
+ const field = url.searchParams.get("field") || "";
19
+
20
+ const computedParams = {
21
+ query,
22
+ sort,
23
+ project,
24
+ skip,
25
+ limit,
26
+ mode: mode as "query" | "distinct" | "aggregation",
27
+ field,
28
+ } satisfies SearchParams;
17
29
 
18
30
  // Parse JSON strings - return error state if invalid instead of throwing
19
31
  let queryDoc: unknown;
@@ -52,14 +64,7 @@ export const load: PageServerLoad = async ({ params, url }) => {
52
64
  data: 0,
53
65
  error: null,
54
66
  }),
55
- params: {
56
- query,
57
- sort,
58
- project,
59
- skip,
60
- limit,
61
- },
62
- isAggregation: false,
67
+ params: computedParams,
63
68
  };
64
69
  }
65
70
 
@@ -70,7 +75,55 @@ export const load: PageServerLoad = async ({ params, url }) => {
70
75
  const client = mongo.getClient(params.server);
71
76
  const collection = client.db(params.database).collection(params.collection);
72
77
 
73
- if (Array.isArray(queryDoc)) {
78
+ // Handle distinct mode
79
+ if (mode === "distinct") {
80
+ // Validate distinct field is provided
81
+ if (!field) {
82
+ return {
83
+ results: Promise.resolve({
84
+ data: [],
85
+ error: "Invalid distinct query: field name is required",
86
+ }),
87
+ count: Promise.resolve({
88
+ data: 0,
89
+ error: null,
90
+ }),
91
+ mappings: await client.getMappings(params.database, params.collection),
92
+ params: computedParams,
93
+ };
94
+ }
95
+
96
+ const resultsPromise = collection
97
+ .distinct(field, JsonEncoder.decode(queryDoc), {
98
+ maxTimeMS: mongo.getQueryTimeout(),
99
+ })
100
+ .then((results) => ({
101
+ data: results.map((value) => JsonEncoder.encode({ value })) as MongoDocument[],
102
+ error: null as string | null,
103
+ }))
104
+ .catch((err) => {
105
+ logger.error("Error executing distinct:", err);
106
+ return {
107
+ data: [] as MongoDocument[],
108
+ error: `Failed to execute distinct: ${err instanceof Error ? err.message : String(err)}`,
109
+ };
110
+ });
111
+
112
+ const countPromise = resultsPromise.then((result) => ({
113
+ data: result.error ? 0 : result.data.length,
114
+ error: null,
115
+ }));
116
+
117
+ return {
118
+ results: resultsPromise,
119
+ count: countPromise,
120
+ mappings: await client.getMappings(params.database, params.collection),
121
+ params: computedParams,
122
+ };
123
+ }
124
+
125
+ // Handle aggregation mode
126
+ if (mode === "aggregation" && Array.isArray(queryDoc)) {
74
127
  // Validate aggregation pipeline
75
128
  try {
76
129
  validateAggregationPipeline(queryDoc);
@@ -85,14 +138,7 @@ export const load: PageServerLoad = async ({ params, url }) => {
85
138
  data: 0,
86
139
  error: null,
87
140
  }),
88
- params: {
89
- query,
90
- sort,
91
- project,
92
- skip,
93
- limit,
94
- },
95
- isAggregation: true,
141
+ params: computedParams,
96
142
  };
97
143
  }
98
144
  // Execute aggregation
@@ -144,14 +190,8 @@ export const load: PageServerLoad = async ({ params, url }) => {
144
190
  return {
145
191
  results: resultsPromise,
146
192
  count: countPromise,
147
- params: {
148
- query,
149
- sort,
150
- project,
151
- skip,
152
- limit,
153
- },
154
- isAggregation: true,
193
+ mappings: await client.getMappings(params.database, params.collection),
194
+ params: computedParams,
155
195
  };
156
196
  }
157
197
 
@@ -205,13 +245,6 @@ export const load: PageServerLoad = async ({ params, url }) => {
205
245
  results: resultsPromise,
206
246
  count: countPromise,
207
247
  mappings: await client.getMappings(params.database, params.collection),
208
- params: {
209
- query,
210
- sort,
211
- project,
212
- skip,
213
- limit,
214
- },
215
- isAggregation: false,
248
+ params: computedParams,
216
249
  };
217
250
  };