mongoku 2.8.1-compat → 2.9.0-compat

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/build/client/_app/immutable/assets/0.DTh4C4pw.css +1 -0
  2. package/build/client/_app/immutable/assets/0.DTh4C4pw.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.DTh4C4pw.css.gz +0 -0
  4. package/build/client/_app/immutable/chunks/AXErlVVG.js +1 -0
  5. package/build/client/_app/immutable/chunks/AXErlVVG.js.br +0 -0
  6. package/build/client/_app/immutable/chunks/AXErlVVG.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/B-TH2U-E.js +1 -0
  8. package/build/client/_app/immutable/chunks/B-TH2U-E.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/B-TH2U-E.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/BaCQ7DA8.js +66 -0
  11. package/build/client/_app/immutable/chunks/BaCQ7DA8.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/BaCQ7DA8.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/{Dbu5gl04.js → BnRtSpxa.js} +1 -1
  14. package/build/client/_app/immutable/chunks/BnRtSpxa.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/BnRtSpxa.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{B0NBs67v.js → BwoNhxjg.js} +1 -1
  17. package/build/client/_app/immutable/chunks/BwoNhxjg.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BwoNhxjg.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/CS2LukIO.js +1 -0
  20. package/build/client/_app/immutable/chunks/CS2LukIO.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/CS2LukIO.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{89pcxPJY.js → ChBg3kNp.js} +9 -9
  23. package/build/client/_app/immutable/chunks/ChBg3kNp.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/ChBg3kNp.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/Cl89kjea.js +1 -0
  26. package/build/client/_app/immutable/chunks/Cl89kjea.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/Cl89kjea.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/CynGo-ch.js +1 -0
  29. package/build/client/_app/immutable/chunks/CynGo-ch.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/CynGo-ch.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/D1_vCvEb.js +1 -0
  32. package/build/client/_app/immutable/chunks/D1_vCvEb.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/D1_vCvEb.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/D2Q18L5i.js +1 -0
  35. package/build/client/_app/immutable/chunks/D2Q18L5i.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/D2Q18L5i.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/D899Ie42.js +1 -0
  38. package/build/client/_app/immutable/chunks/D899Ie42.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/D899Ie42.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/DIjqwnsi.js +1 -0
  41. package/build/client/_app/immutable/chunks/DIjqwnsi.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/DIjqwnsi.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/DR3Cu5oT.js +4 -0
  44. package/build/client/_app/immutable/chunks/DR3Cu5oT.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/DR3Cu5oT.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/Dchfcdh4.js +1 -0
  47. package/build/client/_app/immutable/chunks/Dchfcdh4.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/Dchfcdh4.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/{M0r2x3Hz.js → DeOonNGy.js} +2 -2
  50. package/build/client/_app/immutable/chunks/DeOonNGy.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/DeOonNGy.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/{ULh2o3ji.js → DjUt71lH.js} +1 -1
  53. package/build/client/_app/immutable/chunks/DjUt71lH.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/DjUt71lH.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/Hg2DaShQ.js +1 -0
  56. package/build/client/_app/immutable/chunks/Hg2DaShQ.js.br +3 -0
  57. package/build/client/_app/immutable/chunks/Hg2DaShQ.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/KvnnxfV5.js +1 -0
  59. package/build/client/_app/immutable/chunks/KvnnxfV5.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/KvnnxfV5.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/{CETiZ6GF.js → NycVVWZD.js} +1 -1
  62. package/build/client/_app/immutable/chunks/NycVVWZD.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/NycVVWZD.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/{Dv9wDVNU.js → TfiCUZYY.js} +1 -1
  65. package/build/client/_app/immutable/chunks/TfiCUZYY.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/TfiCUZYY.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/TxmsiDxf.js +1 -0
  68. package/build/client/_app/immutable/chunks/TxmsiDxf.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/TxmsiDxf.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/ogOVEqzG.js +1 -0
  71. package/build/client/_app/immutable/chunks/ogOVEqzG.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/ogOVEqzG.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/tqAjkrD5.js +1 -0
  74. package/build/client/_app/immutable/chunks/tqAjkrD5.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/tqAjkrD5.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/wZ9dd4xr.js +2 -0
  77. package/build/client/_app/immutable/chunks/wZ9dd4xr.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/wZ9dd4xr.js.gz +0 -0
  79. package/build/client/_app/immutable/entry/app.Cnr92HsX.js +2 -0
  80. package/build/client/_app/immutable/entry/app.Cnr92HsX.js.br +0 -0
  81. package/build/client/_app/immutable/entry/app.Cnr92HsX.js.gz +0 -0
  82. package/build/client/_app/immutable/entry/start.CUm_Zoui.js +1 -0
  83. package/build/client/_app/immutable/entry/start.CUm_Zoui.js.br +0 -0
  84. package/build/client/_app/immutable/entry/start.CUm_Zoui.js.gz +0 -0
  85. package/build/client/_app/immutable/nodes/0.D--SH7lr.js +1 -0
  86. package/build/client/_app/immutable/nodes/0.D--SH7lr.js.br +0 -0
  87. package/build/client/_app/immutable/nodes/0.D--SH7lr.js.gz +0 -0
  88. package/build/client/_app/immutable/nodes/1.CfS20bBk.js +1 -0
  89. package/build/client/_app/immutable/nodes/1.CfS20bBk.js.br +0 -0
  90. package/build/client/_app/immutable/nodes/1.CfS20bBk.js.gz +0 -0
  91. package/build/client/_app/immutable/nodes/10.XNPeqIPf.js +2 -0
  92. package/build/client/_app/immutable/nodes/10.XNPeqIPf.js.br +0 -0
  93. package/build/client/_app/immutable/nodes/10.XNPeqIPf.js.gz +0 -0
  94. package/build/client/_app/immutable/nodes/11.CGK1EcDL.js +6 -0
  95. package/build/client/_app/immutable/nodes/11.CGK1EcDL.js.br +0 -0
  96. package/build/client/_app/immutable/nodes/11.CGK1EcDL.js.gz +0 -0
  97. package/build/client/_app/immutable/nodes/{12.CTgbu5Hp.js → 12.CxTR_73N.js} +1 -1
  98. package/build/client/_app/immutable/nodes/12.CxTR_73N.js.br +0 -0
  99. package/build/client/_app/immutable/nodes/12.CxTR_73N.js.gz +0 -0
  100. package/build/client/_app/immutable/nodes/13.DxFblnDq.js +1 -0
  101. package/build/client/_app/immutable/nodes/13.DxFblnDq.js.br +0 -0
  102. package/build/client/_app/immutable/nodes/13.DxFblnDq.js.gz +0 -0
  103. package/build/client/_app/immutable/nodes/14.Damf9Bij.js +65 -0
  104. package/build/client/_app/immutable/nodes/14.Damf9Bij.js.br +0 -0
  105. package/build/client/_app/immutable/nodes/14.Damf9Bij.js.gz +0 -0
  106. package/build/client/_app/immutable/nodes/15.DKVveqyb.js +1 -0
  107. package/build/client/_app/immutable/nodes/15.DKVveqyb.js.br +0 -0
  108. package/build/client/_app/immutable/nodes/15.DKVveqyb.js.gz +0 -0
  109. package/build/client/_app/immutable/nodes/{2.C6NzDBVE.js → 2.CdWjCbJf.js} +1 -1
  110. package/build/client/_app/immutable/nodes/2.CdWjCbJf.js.br +0 -0
  111. package/build/client/_app/immutable/nodes/2.CdWjCbJf.js.gz +0 -0
  112. package/build/client/_app/immutable/nodes/{3.CZJqJ4La.js → 3.BIfBaSHs.js} +1 -1
  113. package/build/client/_app/immutable/nodes/3.BIfBaSHs.js.br +1 -0
  114. package/build/client/_app/immutable/nodes/3.BIfBaSHs.js.gz +0 -0
  115. package/build/client/_app/immutable/nodes/{4.CNe3XPNo.js → 4.D_Olflem.js} +1 -1
  116. package/build/client/_app/immutable/nodes/4.D_Olflem.js.br +0 -0
  117. package/build/client/_app/immutable/nodes/4.D_Olflem.js.gz +0 -0
  118. package/build/client/_app/immutable/nodes/{5.BWhhv567.js → 5.BjQaqBuw.js} +1 -1
  119. package/build/client/_app/immutable/nodes/5.BjQaqBuw.js.br +0 -0
  120. package/build/client/_app/immutable/nodes/5.BjQaqBuw.js.gz +0 -0
  121. package/build/client/_app/immutable/nodes/{7.BgzaW6PD.js → 7.BrMDvseF.js} +1 -1
  122. package/build/client/_app/immutable/nodes/7.BrMDvseF.js.br +0 -0
  123. package/build/client/_app/immutable/nodes/7.BrMDvseF.js.gz +0 -0
  124. package/build/client/_app/immutable/nodes/8.BxYzhvU1.js +2 -0
  125. package/build/client/_app/immutable/nodes/8.BxYzhvU1.js.br +0 -0
  126. package/build/client/_app/immutable/nodes/8.BxYzhvU1.js.gz +0 -0
  127. package/build/client/_app/immutable/nodes/{9.BwL7jHVk.js → 9.oHz2JV_1.js} +1 -1
  128. package/build/client/_app/immutable/nodes/9.oHz2JV_1.js.br +0 -0
  129. package/build/client/_app/immutable/nodes/9.oHz2JV_1.js.gz +0 -0
  130. package/build/client/_app/version.json +1 -1
  131. package/build/client/_app/version.json.br +0 -0
  132. package/build/client/_app/version.json.gz +0 -0
  133. package/build/server/chunks/0-xp6k7WWM.js +31 -0
  134. package/build/server/chunks/{0-z0icXjVd.js.map → 0-xp6k7WWM.js.map} +1 -1
  135. package/build/server/chunks/1-zOPta5ak.js +9 -0
  136. package/build/server/chunks/1-zOPta5ak.js.map +1 -0
  137. package/build/server/chunks/{10-qbg5WNBn.js → 10-Dhe07FYG.js} +3 -3
  138. package/build/server/chunks/{10-qbg5WNBn.js.map → 10-Dhe07FYG.js.map} +1 -1
  139. package/build/server/chunks/{11-GYyGVicU.js → 11-DDHEOURT.js} +5 -4
  140. package/build/server/chunks/11-DDHEOURT.js.map +1 -0
  141. package/build/server/chunks/{12-B8qDF2DL.js → 12-Db_xDDjW.js} +3 -3
  142. package/build/server/chunks/{12-B8qDF2DL.js.map → 12-Db_xDDjW.js.map} +1 -1
  143. package/build/server/chunks/{13-CNgkTOlo.js → 13-CzMKjEv9.js} +5 -4
  144. package/build/server/chunks/13-CzMKjEv9.js.map +1 -0
  145. package/build/server/chunks/{14-DFIpRdGb.js → 14-BayJ52pt.js} +5 -4
  146. package/build/server/chunks/14-BayJ52pt.js.map +1 -0
  147. package/build/server/chunks/15-0Uv1hrI_.js +67 -0
  148. package/build/server/chunks/15-0Uv1hrI_.js.map +1 -0
  149. package/build/server/chunks/{2-BNTmkYSf.js → 2-5hqMVf4i.js} +3 -3
  150. package/build/server/chunks/{2-BNTmkYSf.js.map → 2-5hqMVf4i.js.map} +1 -1
  151. package/build/server/chunks/{3-ClKd4dXQ.js → 3-DIscxOEl.js} +3 -3
  152. package/build/server/chunks/{3-ClKd4dXQ.js.map → 3-DIscxOEl.js.map} +1 -1
  153. package/build/server/chunks/{4-BSPVNKkN.js → 4-_oEOFnHF.js} +3 -3
  154. package/build/server/chunks/{4-BSPVNKkN.js.map → 4-_oEOFnHF.js.map} +1 -1
  155. package/build/server/chunks/{5-BzxZlQk0.js → 5-qiB9L-y2.js} +3 -3
  156. package/build/server/chunks/{5-BzxZlQk0.js.map → 5-qiB9L-y2.js.map} +1 -1
  157. package/build/server/chunks/{6-Bw8JUxiD.js → 6-eXO6RVDu.js} +4 -4
  158. package/build/server/chunks/{6-Bw8JUxiD.js.map → 6-eXO6RVDu.js.map} +1 -1
  159. package/build/server/chunks/{7-D3DooSft.js → 7-CRPZ9GW3.js} +7 -7
  160. package/build/server/chunks/{7-D3DooSft.js.map → 7-CRPZ9GW3.js.map} +1 -1
  161. package/build/server/chunks/{8-ftrQ1gsJ.js → 8-CkktJU5D.js} +3 -3
  162. package/build/server/chunks/{8-ftrQ1gsJ.js.map → 8-CkktJU5D.js.map} +1 -1
  163. package/build/server/chunks/{9-DqDaj8M0.js → 9-BcC34Wws.js} +3 -3
  164. package/build/server/chunks/{9-DqDaj8M0.js.map → 9-BcC34Wws.js.map} +1 -1
  165. package/build/server/chunks/{JsonValue-CTg4aH_w.js → JsonValue-CGVfzyTL.js} +32 -32
  166. package/build/server/chunks/JsonValue-CGVfzyTL.js.map +1 -0
  167. package/build/server/chunks/{Modal-yO0qzufQ.js → Modal-D2E5OLRi.js} +9 -9
  168. package/build/server/chunks/Modal-D2E5OLRi.js.map +1 -0
  169. package/build/server/chunks/{Panel-D9GzVDDt.js → Panel-C6VWd6JD.js} +9 -9
  170. package/build/server/chunks/Panel-C6VWd6JD.js.map +1 -0
  171. package/build/server/chunks/{PrettyJson-BVgLycwy.js → PrettyJson-0NvyC3vB.js} +43 -21
  172. package/build/server/chunks/PrettyJson-0NvyC3vB.js.map +1 -0
  173. package/build/server/chunks/{Tooltip-D2BX7dwq.js → Tooltip-OVylvwfb.js} +5 -5
  174. package/build/server/chunks/Tooltip-OVylvwfb.js.map +1 -0
  175. package/build/server/chunks/{TooltipTable-91W9LxGR.js → TooltipTable-CLglfpck.js} +6 -6
  176. package/build/server/chunks/TooltipTable-CLglfpck.js.map +1 -0
  177. package/build/server/chunks/{_layout.svelte-BFxKanne.js → _layout.svelte-CLPxHDiP.js} +24 -24
  178. package/build/server/chunks/_layout.svelte-CLPxHDiP.js.map +1 -0
  179. package/build/server/chunks/{_page.svelte-CYgL8X_3.js → _page.svelte-BPcsZPKb.js} +21 -20
  180. package/build/server/chunks/_page.svelte-BPcsZPKb.js.map +1 -0
  181. package/build/server/chunks/{_page.svelte-BkyGMJtY.js → _page.svelte-BS4_Zesn.js} +27 -26
  182. package/build/server/chunks/_page.svelte-BS4_Zesn.js.map +1 -0
  183. package/build/server/chunks/{_page.svelte-Q0qOjc1K.js → _page.svelte-Bx5MBXSd.js} +23 -22
  184. package/build/server/chunks/_page.svelte-Bx5MBXSd.js.map +1 -0
  185. package/build/server/chunks/{_page.svelte-CSuE9bVi.js → _page.svelte-C3QVwl-z.js} +5 -5
  186. package/build/server/chunks/{_page.svelte-CSuE9bVi.js.map → _page.svelte-C3QVwl-z.js.map} +1 -1
  187. package/build/server/chunks/{_page.svelte-DybQp3Hh.js → _page.svelte-CM6QtCvm.js} +26 -25
  188. package/build/server/chunks/_page.svelte-CM6QtCvm.js.map +1 -0
  189. package/build/server/chunks/{_page.svelte-DEuOrgce.js → _page.svelte-Cai_1P5J.js} +58 -57
  190. package/build/server/chunks/_page.svelte-Cai_1P5J.js.map +1 -0
  191. package/build/server/chunks/_page.svelte-Cy0ShxWk.js +135 -0
  192. package/build/server/chunks/_page.svelte-Cy0ShxWk.js.map +1 -0
  193. package/build/server/chunks/{_page.svelte-BE3IXD7W.js → _page.svelte-DFg9NEZU.js} +52 -51
  194. package/build/server/chunks/_page.svelte-DFg9NEZU.js.map +1 -0
  195. package/build/server/chunks/{_page.svelte-BimaUmmG.js → _page.svelte-yY_cbSNt.js} +27 -26
  196. package/build/server/chunks/_page.svelte-yY_cbSNt.js.map +1 -0
  197. package/build/server/chunks/{_server.ts-CNiqI4C6.js → _server.ts-CEBmCzTO.js} +5 -5
  198. package/build/server/chunks/{_server.ts-CNiqI4C6.js.map → _server.ts-CEBmCzTO.js.map} +1 -1
  199. package/build/server/chunks/{_server.ts-OSPJ0dek.js → _server.ts-CoUHVeKI.js} +5 -5
  200. package/build/server/chunks/{_server.ts-OSPJ0dek.js.map → _server.ts-CoUHVeKI.js.map} +1 -1
  201. package/build/server/chunks/{_server.ts-CHqxLmE4.js → _server.ts-i-glbZtX.js} +4 -4
  202. package/build/server/chunks/{_server.ts-CHqxLmE4.js.map → _server.ts-i-glbZtX.js.map} +1 -1
  203. package/build/server/chunks/{async-lVJA8xJZ.js → async-DUoD1OpG.js} +2 -1
  204. package/build/server/chunks/async-DUoD1OpG.js.map +1 -0
  205. package/build/server/chunks/client-COtw9Xqw.js +7 -0
  206. package/build/server/chunks/{client-C7bEwskR.js.map → client-COtw9Xqw.js.map} +1 -1
  207. package/build/server/chunks/{client2-DcCKOWWC.js → client2-BIa3wTXU.js} +5 -5
  208. package/build/server/chunks/client2-BIa3wTXU.js.map +1 -0
  209. package/build/server/chunks/error.svelte-DUZ2SYyF.js +18 -0
  210. package/build/server/chunks/{error.svelte-Bk-0XnBt.js.map → error.svelte-DUZ2SYyF.js.map} +1 -1
  211. package/build/server/chunks/{hooks.server-ChbJBVwm.js → hooks.server-BiUSRqj1.js} +4 -4
  212. package/build/server/chunks/{hooks.server-ChbJBVwm.js.map → hooks.server-BiUSRqj1.js.map} +1 -1
  213. package/build/server/chunks/{index-CC9WtE-y.js → index-CtYzvcG6.js} +2 -2
  214. package/build/server/chunks/index-CtYzvcG6.js.map +1 -0
  215. package/build/server/chunks/{index-wpIsICWW.js → index-NcxaM188.js} +21 -4
  216. package/build/server/chunks/index-NcxaM188.js.map +1 -0
  217. package/build/server/chunks/{index2-DMabdSHV.js → index2-B0RgZaJY.js} +3 -3
  218. package/build/server/chunks/{index2-DMabdSHV.js.map → index2-B0RgZaJY.js.map} +1 -1
  219. package/build/server/chunks/{layout.svelte-CJcHX-Na.js → layout.svelte-PFROMnUZ.js} +2 -2
  220. package/build/server/chunks/{layout.svelte-CJcHX-Na.js.map → layout.svelte-PFROMnUZ.js.map} +1 -1
  221. package/build/server/chunks/{oauth-BbSyq_Sb.js → oauth-D6jTWKFd.js} +2 -2
  222. package/build/server/chunks/{oauth-BbSyq_Sb.js.map → oauth-D6jTWKFd.js.map} +1 -1
  223. package/build/server/chunks/{remote-xxtqbu-DU1VUIfB.js → remote-xxtqbu-CmaCzxbq.js} +8 -7
  224. package/build/server/chunks/remote-xxtqbu-CmaCzxbq.js.map +1 -0
  225. package/build/server/chunks/{url-hmE1zcJ6.js → root-otUAnOAR.js} +1771 -1355
  226. package/build/server/chunks/root-otUAnOAR.js.map +1 -0
  227. package/build/server/chunks/{routing-CYknP78v.js → routing-EDfUNu8L.js} +2 -2
  228. package/build/server/chunks/{routing-CYknP78v.js.map → routing-EDfUNu8L.js.map} +1 -1
  229. package/build/server/chunks/schema-BZonjzNJ.js +315 -0
  230. package/build/server/chunks/schema-BZonjzNJ.js.map +1 -0
  231. package/build/server/chunks/{server2-uigtM6st.js → server2-D_y4YbpC.js} +8 -3
  232. package/build/server/chunks/server2-D_y4YbpC.js.map +1 -0
  233. package/build/server/chunks/{servers.remote-ChLjCujn.js → servers.remote-W2x65uTK.js} +407 -100
  234. package/build/server/chunks/servers.remote-W2x65uTK.js.map +1 -0
  235. package/build/server/chunks/{shared-BqTYMAzZ.js → shared-DlqhoNLb.js} +321 -127
  236. package/build/server/chunks/shared-DlqhoNLb.js.map +1 -0
  237. package/build/server/chunks/state.svelte-Bj5yxNNk.js +10 -0
  238. package/build/server/chunks/state.svelte-Bj5yxNNk.js.map +1 -0
  239. package/build/server/chunks/{utils2-kjxf7BZO.js → utils-BQzn9ikS.js} +2 -3
  240. package/build/server/chunks/utils-BQzn9ikS.js.map +1 -0
  241. package/build/server/index.js +322 -117
  242. package/build/server/index.js.map +1 -1
  243. package/build/server/manifest.js +28 -20
  244. package/build/server/manifest.js.map +1 -1
  245. package/package.json +5 -2
  246. package/src/api/servers.remote.ts +60 -0
  247. package/src/lib/components/PrettyJson.svelte +33 -10
  248. package/src/lib/server/mongo.ts +1 -1
  249. package/src/lib/server/schema.ts +499 -0
  250. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.ts +1 -0
  251. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.ts +1 -0
  252. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/mappings/+page.ts +1 -0
  253. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/schema/+page.server.ts +25 -0
  254. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/schema/+page.svelte +429 -0
  255. package/src/routes/servers/[server]/databases/[database]/collections/[collection]/schema/+page.ts +11 -0
  256. package/build/client/_app/immutable/assets/0.CdYhspVa.css +0 -1
  257. package/build/client/_app/immutable/assets/0.CdYhspVa.css.br +0 -0
  258. package/build/client/_app/immutable/assets/0.CdYhspVa.css.gz +0 -0
  259. package/build/client/_app/immutable/chunks/89pcxPJY.js.br +0 -0
  260. package/build/client/_app/immutable/chunks/89pcxPJY.js.gz +0 -0
  261. package/build/client/_app/immutable/chunks/B0NBs67v.js.br +0 -0
  262. package/build/client/_app/immutable/chunks/B0NBs67v.js.gz +0 -0
  263. package/build/client/_app/immutable/chunks/B59nRjE7.js +0 -1
  264. package/build/client/_app/immutable/chunks/B59nRjE7.js.br +0 -2
  265. package/build/client/_app/immutable/chunks/B59nRjE7.js.gz +0 -0
  266. package/build/client/_app/immutable/chunks/C--_T2uI.js +0 -4
  267. package/build/client/_app/immutable/chunks/C--_T2uI.js.br +0 -0
  268. package/build/client/_app/immutable/chunks/C--_T2uI.js.gz +0 -0
  269. package/build/client/_app/immutable/chunks/C6nv_pni.js +0 -1
  270. package/build/client/_app/immutable/chunks/C6nv_pni.js.br +0 -0
  271. package/build/client/_app/immutable/chunks/C6nv_pni.js.gz +0 -0
  272. package/build/client/_app/immutable/chunks/CETiZ6GF.js.br +0 -0
  273. package/build/client/_app/immutable/chunks/CETiZ6GF.js.gz +0 -0
  274. package/build/client/_app/immutable/chunks/CWqvin6E.js +0 -1
  275. package/build/client/_app/immutable/chunks/CWqvin6E.js.br +0 -0
  276. package/build/client/_app/immutable/chunks/CWqvin6E.js.gz +0 -0
  277. package/build/client/_app/immutable/chunks/CX0xC2bt.js +0 -1
  278. package/build/client/_app/immutable/chunks/CX0xC2bt.js.br +0 -0
  279. package/build/client/_app/immutable/chunks/CX0xC2bt.js.gz +0 -0
  280. package/build/client/_app/immutable/chunks/Ccmw5IVm.js +0 -1
  281. package/build/client/_app/immutable/chunks/Ccmw5IVm.js.br +0 -0
  282. package/build/client/_app/immutable/chunks/Ccmw5IVm.js.gz +0 -0
  283. package/build/client/_app/immutable/chunks/DJHYr09v.js +0 -1
  284. package/build/client/_app/immutable/chunks/DJHYr09v.js.br +0 -0
  285. package/build/client/_app/immutable/chunks/DJHYr09v.js.gz +0 -0
  286. package/build/client/_app/immutable/chunks/DZxZehvI.js +0 -1
  287. package/build/client/_app/immutable/chunks/DZxZehvI.js.br +0 -0
  288. package/build/client/_app/immutable/chunks/DZxZehvI.js.gz +0 -0
  289. package/build/client/_app/immutable/chunks/DaNl6Y92.js +0 -2
  290. package/build/client/_app/immutable/chunks/DaNl6Y92.js.br +0 -0
  291. package/build/client/_app/immutable/chunks/DaNl6Y92.js.gz +0 -0
  292. package/build/client/_app/immutable/chunks/Dbu5gl04.js.br +0 -0
  293. package/build/client/_app/immutable/chunks/Dbu5gl04.js.gz +0 -0
  294. package/build/client/_app/immutable/chunks/DczwA5Ds.js +0 -1
  295. package/build/client/_app/immutable/chunks/DczwA5Ds.js.br +0 -0
  296. package/build/client/_app/immutable/chunks/DczwA5Ds.js.gz +0 -0
  297. package/build/client/_app/immutable/chunks/DjlV9yev.js +0 -1
  298. package/build/client/_app/immutable/chunks/DjlV9yev.js.br +0 -0
  299. package/build/client/_app/immutable/chunks/DjlV9yev.js.gz +0 -0
  300. package/build/client/_app/immutable/chunks/DskkUG-R.js +0 -41
  301. package/build/client/_app/immutable/chunks/DskkUG-R.js.br +0 -0
  302. package/build/client/_app/immutable/chunks/DskkUG-R.js.gz +0 -0
  303. package/build/client/_app/immutable/chunks/Dv9wDVNU.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/Dv9wDVNU.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/DwvJoC1a.js +0 -1
  306. package/build/client/_app/immutable/chunks/DwvJoC1a.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/DwvJoC1a.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/K8AVG7U-.js +0 -1
  309. package/build/client/_app/immutable/chunks/K8AVG7U-.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/K8AVG7U-.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/M0r2x3Hz.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/M0r2x3Hz.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/ULh2o3ji.js.br +0 -0
  314. package/build/client/_app/immutable/chunks/ULh2o3ji.js.gz +0 -0
  315. package/build/client/_app/immutable/chunks/V1mdyEl2.js +0 -1
  316. package/build/client/_app/immutable/chunks/V1mdyEl2.js.br +0 -0
  317. package/build/client/_app/immutable/chunks/V1mdyEl2.js.gz +0 -0
  318. package/build/client/_app/immutable/chunks/gjWX2x82.js +0 -1
  319. package/build/client/_app/immutable/chunks/gjWX2x82.js.br +0 -0
  320. package/build/client/_app/immutable/chunks/gjWX2x82.js.gz +0 -0
  321. package/build/client/_app/immutable/chunks/y5L2Na-S.js +0 -1
  322. package/build/client/_app/immutable/chunks/y5L2Na-S.js.br +0 -0
  323. package/build/client/_app/immutable/chunks/y5L2Na-S.js.gz +0 -0
  324. package/build/client/_app/immutable/entry/app.CN3FlvzE.js +0 -2
  325. package/build/client/_app/immutable/entry/app.CN3FlvzE.js.br +0 -0
  326. package/build/client/_app/immutable/entry/app.CN3FlvzE.js.gz +0 -0
  327. package/build/client/_app/immutable/entry/start.ZNv-kHib.js +0 -1
  328. package/build/client/_app/immutable/entry/start.ZNv-kHib.js.br +0 -0
  329. package/build/client/_app/immutable/entry/start.ZNv-kHib.js.gz +0 -0
  330. package/build/client/_app/immutable/nodes/0.CTPqrgua.js +0 -1
  331. package/build/client/_app/immutable/nodes/0.CTPqrgua.js.br +0 -0
  332. package/build/client/_app/immutable/nodes/0.CTPqrgua.js.gz +0 -0
  333. package/build/client/_app/immutable/nodes/1.8bYu10bQ.js +0 -1
  334. package/build/client/_app/immutable/nodes/1.8bYu10bQ.js.br +0 -5
  335. package/build/client/_app/immutable/nodes/1.8bYu10bQ.js.gz +0 -0
  336. package/build/client/_app/immutable/nodes/10.D4tZlGfK.js +0 -2
  337. package/build/client/_app/immutable/nodes/10.D4tZlGfK.js.br +0 -0
  338. package/build/client/_app/immutable/nodes/10.D4tZlGfK.js.gz +0 -0
  339. package/build/client/_app/immutable/nodes/11.CO_n27OV.js +0 -6
  340. package/build/client/_app/immutable/nodes/11.CO_n27OV.js.br +0 -0
  341. package/build/client/_app/immutable/nodes/11.CO_n27OV.js.gz +0 -0
  342. package/build/client/_app/immutable/nodes/12.CTgbu5Hp.js.br +0 -0
  343. package/build/client/_app/immutable/nodes/12.CTgbu5Hp.js.gz +0 -0
  344. package/build/client/_app/immutable/nodes/13.DTPzhEpw.js +0 -1
  345. package/build/client/_app/immutable/nodes/13.DTPzhEpw.js.br +0 -0
  346. package/build/client/_app/immutable/nodes/13.DTPzhEpw.js.gz +0 -0
  347. package/build/client/_app/immutable/nodes/14.Di5Z9YXM.js +0 -65
  348. package/build/client/_app/immutable/nodes/14.Di5Z9YXM.js.br +0 -0
  349. package/build/client/_app/immutable/nodes/14.Di5Z9YXM.js.gz +0 -0
  350. package/build/client/_app/immutable/nodes/2.C6NzDBVE.js.br +0 -2
  351. package/build/client/_app/immutable/nodes/2.C6NzDBVE.js.gz +0 -0
  352. package/build/client/_app/immutable/nodes/3.CZJqJ4La.js.br +0 -0
  353. package/build/client/_app/immutable/nodes/3.CZJqJ4La.js.gz +0 -0
  354. package/build/client/_app/immutable/nodes/4.CNe3XPNo.js.br +0 -0
  355. package/build/client/_app/immutable/nodes/4.CNe3XPNo.js.gz +0 -0
  356. package/build/client/_app/immutable/nodes/5.BWhhv567.js.br +0 -0
  357. package/build/client/_app/immutable/nodes/5.BWhhv567.js.gz +0 -0
  358. package/build/client/_app/immutable/nodes/7.BgzaW6PD.js.br +0 -0
  359. package/build/client/_app/immutable/nodes/7.BgzaW6PD.js.gz +0 -0
  360. package/build/client/_app/immutable/nodes/8.DOUFYQB3.js +0 -2
  361. package/build/client/_app/immutable/nodes/8.DOUFYQB3.js.br +0 -0
  362. package/build/client/_app/immutable/nodes/8.DOUFYQB3.js.gz +0 -0
  363. package/build/client/_app/immutable/nodes/9.BwL7jHVk.js.br +0 -0
  364. package/build/client/_app/immutable/nodes/9.BwL7jHVk.js.gz +0 -0
  365. package/build/server/chunks/0-z0icXjVd.js +0 -31
  366. package/build/server/chunks/1-B6pqeVnb.js +0 -9
  367. package/build/server/chunks/1-B6pqeVnb.js.map +0 -1
  368. package/build/server/chunks/11-GYyGVicU.js.map +0 -1
  369. package/build/server/chunks/13-CNgkTOlo.js.map +0 -1
  370. package/build/server/chunks/14-DFIpRdGb.js.map +0 -1
  371. package/build/server/chunks/JsonValue-CTg4aH_w.js.map +0 -1
  372. package/build/server/chunks/Modal-yO0qzufQ.js.map +0 -1
  373. package/build/server/chunks/Panel-D9GzVDDt.js.map +0 -1
  374. package/build/server/chunks/PrettyJson-BVgLycwy.js.map +0 -1
  375. package/build/server/chunks/Tooltip-D2BX7dwq.js.map +0 -1
  376. package/build/server/chunks/TooltipTable-91W9LxGR.js.map +0 -1
  377. package/build/server/chunks/_layout.svelte-BFxKanne.js.map +0 -1
  378. package/build/server/chunks/_page.svelte-BE3IXD7W.js.map +0 -1
  379. package/build/server/chunks/_page.svelte-BimaUmmG.js.map +0 -1
  380. package/build/server/chunks/_page.svelte-BkyGMJtY.js.map +0 -1
  381. package/build/server/chunks/_page.svelte-CYgL8X_3.js.map +0 -1
  382. package/build/server/chunks/_page.svelte-DEuOrgce.js.map +0 -1
  383. package/build/server/chunks/_page.svelte-DybQp3Hh.js.map +0 -1
  384. package/build/server/chunks/_page.svelte-Q0qOjc1K.js.map +0 -1
  385. package/build/server/chunks/async-lVJA8xJZ.js.map +0 -1
  386. package/build/server/chunks/client-C7bEwskR.js +0 -7
  387. package/build/server/chunks/client2-DcCKOWWC.js.map +0 -1
  388. package/build/server/chunks/error.svelte-Bk-0XnBt.js +0 -18
  389. package/build/server/chunks/index-CC9WtE-y.js.map +0 -1
  390. package/build/server/chunks/index-wpIsICWW.js.map +0 -1
  391. package/build/server/chunks/remote-xxtqbu-DU1VUIfB.js.map +0 -1
  392. package/build/server/chunks/server2-uigtM6st.js.map +0 -1
  393. package/build/server/chunks/servers.remote-ChLjCujn.js.map +0 -1
  394. package/build/server/chunks/shared-BqTYMAzZ.js.map +0 -1
  395. package/build/server/chunks/state.svelte-Dzb7Lf2r.js +0 -9
  396. package/build/server/chunks/state.svelte-Dzb7Lf2r.js.map +0 -1
  397. package/build/server/chunks/url-hmE1zcJ6.js.map +0 -1
  398. package/build/server/chunks/utils2-kjxf7BZO.js.map +0 -1
@@ -0,0 +1,499 @@
1
+ import type { MongoClientWithMappings } from "$lib/server/mongo";
2
+ import { ReadPreference } from "mongodb";
3
+ import { z } from "zod";
4
+
5
+ export interface CollectionSchemaInfo {
6
+ hasSchema: boolean;
7
+ validator: Record<string, unknown> | null;
8
+ validationLevel: string | null;
9
+ validationAction: string | null;
10
+ }
11
+
12
+ export interface SchemaAuditResult {
13
+ nrecords: number;
14
+ nInvalidDocuments: number;
15
+ nValidDocuments: number;
16
+ compliancePct: number;
17
+ errors: Array<{
18
+ message: string;
19
+ docId?: unknown;
20
+ /** The full document that failed validation (encoded via JsonEncoder) */
21
+ document?: unknown;
22
+ }>;
23
+ warnings: string[];
24
+ hasSchema: boolean;
25
+ tookMs: number;
26
+ }
27
+
28
+ /**
29
+ * Fetch the JSON Schema validator configuration for a collection.
30
+ */
31
+ export async function getCollectionSchema(
32
+ client: MongoClientWithMappings,
33
+ dbName: string,
34
+ colName: string,
35
+ ): Promise<CollectionSchemaInfo> {
36
+ const db = client.db(dbName);
37
+ const collections = await db.listCollections({ name: colName }, { nameOnly: false }).toArray();
38
+
39
+ const colInfo = collections[0];
40
+ if (!colInfo) {
41
+ return { hasSchema: false, validator: null, validationLevel: null, validationAction: null };
42
+ }
43
+
44
+ const options = (colInfo as { options?: Record<string, unknown> }).options ?? {};
45
+
46
+ const validator = (options.validator as Record<string, unknown>) ?? null;
47
+ const validationLevel = (options.validationLevel as string) ?? "strict";
48
+ const validationAction = (options.validationAction as string) ?? "error";
49
+
50
+ return {
51
+ hasSchema: !!validator && Object.keys(validator).length > 0,
52
+ validator,
53
+ validationLevel,
54
+ validationAction,
55
+ };
56
+ }
57
+
58
+ /**
59
+ * Extract the inner JSON Schema object from a MongoDB validator document.
60
+ * Validators are typically `{ $jsonSchema: { ... } }` but may also be wrapped
61
+ * in `$and`/`$or` or combined with other operators.
62
+ */
63
+ function extractJsonSchema(validator: Record<string, unknown>): Record<string, unknown> | null {
64
+ // Direct $jsonSchema (most common)
65
+ if (validator.$jsonSchema && typeof validator.$jsonSchema === "object") {
66
+ return validator.$jsonSchema as Record<string, unknown>;
67
+ }
68
+ // $and: [{ $jsonSchema: ... }, ...]
69
+ if (Array.isArray(validator.$and)) {
70
+ for (const clause of validator.$and) {
71
+ const extracted = extractJsonSchema(clause as Record<string, unknown>);
72
+ if (extracted) {
73
+ return extracted;
74
+ }
75
+ }
76
+ }
77
+ return null;
78
+ }
79
+
80
+ /** Standard JSON Schema type names that zod's fromJSONSchema supports. */
81
+ const STANDARD_TYPES = new Set(["string", "number", "integer", "boolean", "object", "array", "null"]);
82
+
83
+ /** Map MongoDB bsonType aliases to standard JSON Schema types. */
84
+ const BSON_TYPE_MAP: Record<string, string> = {
85
+ int: "integer",
86
+ long: "integer",
87
+ double: "number",
88
+ bool: "boolean",
89
+ decimal: "number",
90
+ objectId: "objectId",
91
+ date: "date",
92
+ };
93
+
94
+ /**
95
+ * JSON Schema keywords that, when present, give the schema actual semantics.
96
+ * If none of these are set, the schema is `z.any()`-equivalent under zod's
97
+ * `fromJSONSchema`, which means it silently accepts `undefined` even when
98
+ * the parent's `required` list includes the property.
99
+ */
100
+ const CONSTRAINT_KEYWORDS = [
101
+ "type",
102
+ "bsonType",
103
+ "enum",
104
+ "const",
105
+ "anyOf",
106
+ "oneOf",
107
+ "allOf",
108
+ "$ref",
109
+ "properties",
110
+ "patternProperties",
111
+ "additionalProperties",
112
+ "items",
113
+ "prefixItems",
114
+ "additionalItems",
115
+ "not",
116
+ "required",
117
+ "propertyNames",
118
+ ];
119
+
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ function isEffectivelyAnySchema(schema: any): boolean {
122
+ if (typeof schema !== "object" || schema === null) {
123
+ return false;
124
+ }
125
+ return !CONSTRAINT_KEYWORDS.some((k) => schema[k] !== undefined);
126
+ }
127
+
128
+ /**
129
+ * Replacement for empty `{}` sub-schemas under a required property: a union
130
+ * of every JSON-representable type. This lets the value be anything (mirroring
131
+ * the original "any" intent) while still rejecting `undefined`, so the parent
132
+ * object's `required` check fires when the field is missing.
133
+ */
134
+ const ANY_NON_UNDEFINED_SCHEMA = {
135
+ anyOf: [
136
+ { type: "string" },
137
+ { type: "number" },
138
+ { type: "boolean" },
139
+ { type: "object" },
140
+ { type: "array" },
141
+ { type: "null" },
142
+ ],
143
+ };
144
+
145
+ /**
146
+ * Convert a MongoDB $jsonSchema (which uses `bsonType` instead of `type`) into
147
+ * standard JSON Schema Draft-07 that zod's `fromJSONSchema` can enforce.
148
+ *
149
+ * MongoDB-specific types are mapped to EJSON wrapper shapes so zod can
150
+ * perform precise structural validation:
151
+ * bsonType: "objectId" → { type: "object", required: ["$oid"], properties: { $oid: { type: "string" } } }
152
+ * bsonType: "date" → { type: "object", required: ["$date"], properties: { $date: { type: "string" } } }
153
+ *
154
+ * Documents are likewise normalized via `normalizeBsonValue()` so ObjectId
155
+ * instances become `{ $oid: "hex" }` and Date instances become `{ $date: "ISO" }`
156
+ * before validation.
157
+ *
158
+ * Supports bsonType as a string or array (e.g., `["string", "null"]` for nullable).
159
+ */
160
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
161
+ function bsonSchemaToStandard(schema: any): any {
162
+ if (typeof schema !== "object" || schema === null) {
163
+ return schema;
164
+ }
165
+ const out: Record<string, unknown> = { ...schema };
166
+ if (out.bsonType) {
167
+ const bsonTypeVal = out.bsonType;
168
+ delete out.bsonType;
169
+ // Handle array of types (nullable fields): bsonType: ["string", "null"]
170
+ const types: string[] = Array.isArray(bsonTypeVal) ? bsonTypeVal : [bsonTypeVal as string];
171
+ const mapped = types
172
+ .map((t) => BSON_TYPE_MAP[t] ?? (STANDARD_TYPES.has(t) ? t : null))
173
+ .filter((t): t is string => t !== null);
174
+ if (mapped.length === 0) {
175
+ // All types were unknown (binData, regex, etc.) — drop type constraint
176
+ } else if (mapped.length === 1) {
177
+ const bson = mapped[0];
178
+ if (bson === "objectId") {
179
+ out.type = "object";
180
+ out.required = ["$oid"];
181
+ out.properties = { $oid: { type: "string" } };
182
+ return out;
183
+ }
184
+ if (bson === "date") {
185
+ out.type = "object";
186
+ out.required = ["$date"];
187
+ out.properties = { $date: { type: "string" } };
188
+ return out;
189
+ }
190
+ out.type = bson;
191
+ } else {
192
+ // Multiple types — use anyOf. Don't return early; still need to recurse
193
+ // into properties/items/etc. for any object types in the union.
194
+ out.anyOf = mapped.map((t) => {
195
+ if (t === "objectId") {
196
+ return { type: "object", required: ["$oid"], properties: { $oid: { type: "string" } } };
197
+ }
198
+ if (t === "date") {
199
+ return { type: "object", required: ["$date"], properties: { $date: { type: "string" } } };
200
+ }
201
+ return { type: t };
202
+ });
203
+ }
204
+ // binData, regex, timestamp, etc. — drop the type so zod uses z.any()
205
+ }
206
+ if (out.properties) {
207
+ const requiredKeys = new Set(Array.isArray(out.required) ? (out.required as string[]) : []);
208
+ out.properties = Object.fromEntries(
209
+ Object.entries(out.properties as Record<string, unknown>).map(([k, v]) => {
210
+ const converted = bsonSchemaToStandard(v);
211
+ // If a required property has no real constraints, zod's
212
+ // fromJSONSchema collapses it to `z.any()` — which silently
213
+ // accepts `undefined` and defeats the `required` check.
214
+ // Replace with an explicit any-of-any-non-undefined union.
215
+ if (requiredKeys.has(k) && isEffectivelyAnySchema(converted)) {
216
+ return [k, ANY_NON_UNDEFINED_SCHEMA];
217
+ }
218
+ return [k, converted];
219
+ }),
220
+ );
221
+ }
222
+ if (out.additionalProperties && typeof out.additionalProperties === "object") {
223
+ out.additionalProperties = bsonSchemaToStandard(out.additionalProperties);
224
+ }
225
+ if (Array.isArray(out.oneOf)) {
226
+ out.oneOf = (out.oneOf as Array<unknown>).map((v) => bsonSchemaToStandard(v));
227
+ }
228
+ if (Array.isArray(out.anyOf)) {
229
+ out.anyOf = (out.anyOf as Array<unknown>).map((v) => bsonSchemaToStandard(v));
230
+ }
231
+ if (Array.isArray(out.allOf)) {
232
+ out.allOf = (out.allOf as Array<unknown>).map((v) => bsonSchemaToStandard(v));
233
+ }
234
+ if (out.items) {
235
+ out.items = Array.isArray(out.items)
236
+ ? (out.items as Array<unknown>).map((v) => bsonSchemaToStandard(v))
237
+ : bsonSchemaToStandard(out.items);
238
+ }
239
+ return out;
240
+ }
241
+
242
+ /**
243
+ * Recursively normalise BSON types in a document to their EJSON wrapper
244
+ * representations so zod can structurally validate them against a schema
245
+ * that has been converted to expect those wrappers.
246
+ *
247
+ * ObjectId → { $oid: "...hex..." }
248
+ * Date → { $date: "...ISO..." }
249
+ * Decimal128 → { $numberDecimal: "...string..." }
250
+ * Long → { $numberLong: "...string..." }
251
+ */
252
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
253
+ function normalizeBsonValue(value: any): any {
254
+ if (value === null || value === undefined) {
255
+ return value;
256
+ }
257
+ if (typeof value !== "object") {
258
+ return value;
259
+ }
260
+ if (value instanceof Date) {
261
+ return { $date: value.toISOString() };
262
+ }
263
+ // ObjectId
264
+ if (value.constructor?.name === "ObjectId" && typeof value.toHexString === "function") {
265
+ return { $oid: value.toHexString() };
266
+ }
267
+ // Decimal128
268
+ if (value.constructor?.name === "Decimal128" && typeof value.toString === "function") {
269
+ return { $numberDecimal: value.toString() };
270
+ }
271
+ // Long
272
+ if (value.constructor?.name === "Long" && typeof value.toString === "function") {
273
+ return { $numberLong: value.toString() };
274
+ }
275
+ if (Array.isArray(value)) {
276
+ return value.map(normalizeBsonValue);
277
+ }
278
+ const out: Record<string, unknown> = {};
279
+ for (const [k, v] of Object.entries(value)) {
280
+ out[k] = normalizeBsonValue(v);
281
+ }
282
+ return out;
283
+ }
284
+
285
+ /**
286
+ * BSON numeric types that have no faithful representation in JavaScript:
287
+ * MongoDB distinguishes int/long/double/decimal at the storage layer, but
288
+ * when a document is returned through the Node driver they all surface as
289
+ * `number` (or wrapped Long/Decimal128 for ranges that don't fit).
290
+ *
291
+ * If a validator constrains a field to one of these, our zod-based audit
292
+ * cannot reliably detect violations — so we use this to produce a more
293
+ * helpful fallback message when we know specific feedback isn't possible.
294
+ */
295
+ const PRECISE_BSON_NUMERIC_TYPES = new Set(["int", "long", "double", "decimal"]);
296
+
297
+ /** Walk the schema tree and check whether any field uses a precise BSON numeric type. */
298
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
299
+ function schemaUsesPreciseBsonTypes(schema: any): boolean {
300
+ if (typeof schema !== "object" || schema === null) {
301
+ return false;
302
+ }
303
+ if (schema.bsonType) {
304
+ const types = Array.isArray(schema.bsonType) ? schema.bsonType : [schema.bsonType];
305
+ if (types.some((t: unknown) => typeof t === "string" && PRECISE_BSON_NUMERIC_TYPES.has(t))) {
306
+ return true;
307
+ }
308
+ }
309
+ for (const key of ["properties", "patternProperties"]) {
310
+ const props = schema[key];
311
+ if (props && typeof props === "object") {
312
+ for (const v of Object.values(props)) {
313
+ if (schemaUsesPreciseBsonTypes(v)) {
314
+ return true;
315
+ }
316
+ }
317
+ }
318
+ }
319
+ for (const key of ["items", "additionalProperties", "additionalItems"]) {
320
+ const v = schema[key];
321
+ if (v && typeof v === "object" && schemaUsesPreciseBsonTypes(v)) {
322
+ return true;
323
+ }
324
+ }
325
+ for (const key of ["oneOf", "anyOf", "allOf"]) {
326
+ const arr = schema[key];
327
+ if (Array.isArray(arr) && arr.some((v) => schemaUsesPreciseBsonTypes(v))) {
328
+ return true;
329
+ }
330
+ }
331
+ return false;
332
+ }
333
+
334
+ /**
335
+ * Build a reusable per-document validator from a MongoDB `$jsonSchema`.
336
+ *
337
+ * The conversion + `z.fromJSONSchema` compilation is non-trivial for nested
338
+ * schemas, so we do it once per audit run and reuse the resulting closure
339
+ * for every sampled document.
340
+ *
341
+ * Returns a function that, given a raw MongoDB document, returns an array of
342
+ * human-readable failure messages (empty if the doc matches the schema, or a
343
+ * single fallback message if the validator itself couldn't be built).
344
+ */
345
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
346
+ function buildDocumentValidator(schema: Record<string, unknown>): (doc: any) => string[] {
347
+ let validator: ReturnType<typeof z.fromJSONSchema> | null = null;
348
+ try {
349
+ const standardSchema = bsonSchemaToStandard(schema);
350
+ validator = z.fromJSONSchema(standardSchema);
351
+ } catch {
352
+ // Conversion / compilation failed — every doc will get the fallback.
353
+ validator = null;
354
+ }
355
+
356
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
357
+ return (doc: any): string[] => {
358
+ if (!validator) {
359
+ return ["document does not match schema (could not parse schema with zod)"];
360
+ }
361
+ try {
362
+ const normalized = normalizeBsonValue(doc);
363
+ const result = validator.safeParse(normalized);
364
+ if (result.success) {
365
+ return [];
366
+ }
367
+ return [z.prettifyError(result.error)];
368
+ } catch {
369
+ return ["document does not match schema (could not parse schema with zod)"];
370
+ }
371
+ };
372
+ }
373
+
374
+ /**
375
+ * Audit schema compliance for a collection.
376
+ *
377
+ * Uses aggregation with the `$jsonSchema` operator rather than `db.validate()`
378
+ * because validate() does not reliably return `nInvalidDocuments` counts in
379
+ * MongoDB 8.x (always returns 0, only logs a warning to the server log).
380
+ */
381
+ export async function auditSchemaCompliance(
382
+ client: MongoClientWithMappings,
383
+ dbName: string,
384
+ colName: string,
385
+ opts?: {
386
+ readPreference?: ReadPreference;
387
+ maxTimeMS?: number;
388
+ },
389
+ ): Promise<SchemaAuditResult> {
390
+ const coll = client.db(dbName).collection(colName);
391
+
392
+ const schemaInfo = await getCollectionSchema(client, dbName, colName);
393
+
394
+ if (!schemaInfo.hasSchema || !schemaInfo.validator) {
395
+ return {
396
+ nrecords: 0,
397
+ nInvalidDocuments: 0,
398
+ nValidDocuments: 0,
399
+ compliancePct: 100,
400
+ errors: [],
401
+ warnings: [],
402
+ hasSchema: false,
403
+ tookMs: 0,
404
+ };
405
+ }
406
+
407
+ const jsonSchema = extractJsonSchema(schemaInfo.validator);
408
+ if (!jsonSchema) {
409
+ return {
410
+ nrecords: 0,
411
+ nInvalidDocuments: 0,
412
+ nValidDocuments: 0,
413
+ compliancePct: 100,
414
+ errors: [],
415
+ warnings: [
416
+ "Validator is present but could not extract a $jsonSchema for auditing — validator may use non-schema operators",
417
+ ],
418
+ hasSchema: true,
419
+ tookMs: 0,
420
+ };
421
+ }
422
+
423
+ const start = performance.now();
424
+
425
+ const aggOptions: Record<string, unknown> = {};
426
+ if (opts?.readPreference) {
427
+ aggOptions.readPreference = opts.readPreference;
428
+ }
429
+ if (opts?.maxTimeMS) {
430
+ aggOptions.maxTimeMS = opts.maxTimeMS;
431
+ }
432
+
433
+ const total = await coll.countDocuments({}, aggOptions);
434
+
435
+ // Count non-matching documents.
436
+ // $nor + $jsonSchema identifies docs that don't conform.
437
+ const nonMatchingResult = await coll
438
+ .aggregate([{ $match: { $nor: [{ $jsonSchema: jsonSchema }] } }, { $count: "c" }], aggOptions)
439
+ .next()
440
+ .then((r) => (r as { c: number } | null)?.c ?? 0)
441
+ .catch(() => null);
442
+
443
+ if (nonMatchingResult === null) {
444
+ return {
445
+ nrecords: total,
446
+ nInvalidDocuments: 0,
447
+ nValidDocuments: total,
448
+ compliancePct: 100,
449
+ errors: [],
450
+ warnings: ["Unable to count non-matching documents (aggregation failed)"],
451
+ hasSchema: true,
452
+ tookMs: Math.round(performance.now() - start),
453
+ };
454
+ }
455
+
456
+ const nInvalidDocuments = nonMatchingResult;
457
+ const nValidDocuments = total - nInvalidDocuments;
458
+ const compliancePct = total > 0 ? (nValidDocuments * 100) / total : 100;
459
+
460
+ // Sample non-matching documents (up to 20)
461
+ const sampleDocs = await coll
462
+ .aggregate([{ $match: { $nor: [{ $jsonSchema: jsonSchema }] } }, { $limit: 20 }], aggOptions)
463
+ .toArray();
464
+
465
+ // Compare each non-matching doc against individual $jsonSchema constraints
466
+ // to produce specific error messages rather than a generic "does not match".
467
+ // When zod can't pinpoint the failure (returns no issues), it usually means
468
+ // the violation is a BSON-specific type distinction that isn't visible from
469
+ // the JS value alone (e.g. `bsonType: "double"` where the doc has an int).
470
+ const fallbackMessage = schemaUsesPreciseBsonTypes(jsonSchema)
471
+ ? "The validator uses BSON-specific numeric types (int/long/double/decimal) which cannot be distinguished from a JavaScript value alone — try inspecting the document directly in MongoDB."
472
+ : "Failed to detect validation error";
473
+
474
+ // Build the per-document validator once: the schema is identical across
475
+ // every sample, so there's no need to re-run bsonSchemaToStandard /
476
+ // z.fromJSONSchema for each doc.
477
+ const validateOne = buildDocumentValidator(jsonSchema);
478
+ const errors: SchemaAuditResult["errors"] = sampleDocs.map((doc) => {
479
+ const failures = validateOne(doc);
480
+ return {
481
+ message: failures.length > 0 ? failures.join("; ") : fallbackMessage,
482
+ docId: doc._id,
483
+ document: doc,
484
+ };
485
+ });
486
+
487
+ const tookMs = Math.round(performance.now() - start);
488
+
489
+ return {
490
+ nrecords: total,
491
+ nInvalidDocuments,
492
+ nValidDocuments,
493
+ compliancePct,
494
+ errors,
495
+ warnings: [],
496
+ hasSchema: true,
497
+ tookMs,
498
+ };
499
+ }
@@ -5,6 +5,7 @@ export const load = async (data) => {
5
5
  { key: "documents", label: "Documents" },
6
6
  { key: "indexes", label: "Indexes" },
7
7
  { key: "mappings", label: "Mappings" },
8
+ { key: "schema", label: "Schema" },
8
9
  ],
9
10
  };
10
11
  };
@@ -5,6 +5,7 @@ export const load = async (data) => {
5
5
  { key: "documents", label: "Documents" },
6
6
  { key: "indexes", label: "Indexes" },
7
7
  { key: "mappings", label: "Mappings" },
8
+ { key: "schema", label: "Schema" },
8
9
  ],
9
10
  };
10
11
  };
@@ -5,6 +5,7 @@ export const load = async (data) => {
5
5
  { key: "documents", label: "Documents" },
6
6
  { key: "indexes", label: "Indexes" },
7
7
  { key: "mappings", label: "Mappings" },
8
+ { key: "schema", label: "Schema" },
8
9
  ],
9
10
  };
10
11
  };
@@ -0,0 +1,25 @@
1
+ import { getCollectionSchema } from "$lib/server/schema";
2
+ import { getMongo } from "$lib/server/mongo";
3
+ import type { PageServerLoad } from "./$types";
4
+
5
+ export const load: PageServerLoad = async ({ params }) => {
6
+ const mongo = await getMongo();
7
+ const client = mongo.getClient(params.server);
8
+
9
+ try {
10
+ const schemaInfo = await getCollectionSchema(client, params.database, params.collection);
11
+
12
+ return {
13
+ schemaInfo,
14
+ };
15
+ } catch {
16
+ return {
17
+ schemaInfo: {
18
+ hasSchema: false,
19
+ validator: null,
20
+ validationLevel: null,
21
+ validationAction: null,
22
+ },
23
+ };
24
+ }
25
+ };