mongoku
Version:
[](https://github.com/huggingface/Mongoku/actions/workflows/ci.yml)
397 lines (394 loc) • 22.8 kB
JavaScript
import './async-DUoD1OpG.js';
import { i as await_block, e as escape_html, a as attr, d as derived, b as ensure_array_like, c as attr_class, k as attr_style } from './root-otUAnOAR.js';
import './servers.remote-CGenkEHX.js';
import './utils-BQzn9ikS.js';
import './exports-B5ORJhfK.js';
import './state.svelte-Bj5yxNNk.js';
import './client-COtw9Xqw.js';
import { J as JsonValue_1 } from './JsonValue-CGVfzyTL.js';
import { M as Modal } from './Modal-D2E5OLRi.js';
import { P as Panel } from './Panel-C6VWd6JD.js';
import { f as formatBytes } from './filters-B3U8Nh9P.js';
import './shared-server-BmU87nph.js';
import './shared-DlqhoNLb.js';
import './index-NcxaM188.js';
import './jsonParser-C3QUcODD.js';
import 'esprima';
import './JsonEncoder-Dgtqxb_U.js';
import 'mongodb';
import './logger-PfH_grbh.js';
import 'async_hooks';
import 'node:util';
import './mongo-B92d7zNj.js';
import 'dns/promises';
import 'url';
import 'node:fs';
import 'node:os';
import 'node:path';
import './schema-BZonjzNJ.js';
import 'zod';
import './client2-BIa3wTXU.js';
import './index-CtYzvcG6.js';
import './Tooltip-OVylvwfb.js';
function formatSignificantDigits(value, digits = 3) {
if (value === 0) {
return "0";
}
const absValue = Math.abs(value);
const sign = value < 0 ? "-" : "";
if (absValue >= 1e9) {
const billions = absValue / 1e9;
return `${sign}${billions.toPrecision(digits)}B`;
} else if (absValue >= 1e6) {
const millions = absValue / 1e6;
return `${sign}${millions.toPrecision(digits)}M`;
} else if (absValue >= 1e3) {
const thousands = absValue / 1e3;
return `${sign}${thousands.toPrecision(digits)}k`;
} else {
return `${sign}${absValue.toPrecision(Math.min(digits, Math.ceil(Math.log10(absValue + 1))))}`;
}
}
function findCommonPrefix(strings) {
if (strings.length === 0) {
return "";
}
if (strings.length === 1) {
return "";
}
let prefix = strings[0];
for (let i = 1; i < strings.length; i++) {
while (strings[i].indexOf(prefix) !== 0) {
prefix = prefix.substring(0, prefix.length - 1);
if (prefix === "") {
return "";
}
}
}
return prefix;
}
function findCommonSuffix(strings) {
if (strings.length === 0) {
return "";
}
if (strings.length === 1) {
return "";
}
const reversed = strings.map((s) => s.split("").reverse().join(""));
const reversedPrefix = findCommonPrefix(reversed);
return reversedPrefix.split("").reverse().join("");
}
function shortenHostname(hostname, commonPrefix, commonSuffix) {
if (!commonPrefix && !commonSuffix) {
return hostname;
}
let result = hostname;
if (commonPrefix && result.startsWith(commonPrefix)) {
result = result.slice(commonPrefix.length);
}
if (commonSuffix && result.endsWith(commonSuffix)) {
result = result.slice(0, -commonSuffix.length);
}
if (result.length === 0) {
return hostname;
}
const hasPrefix = commonPrefix.length > 0;
const hasSuffix = commonSuffix.length > 0;
if (hasPrefix && hasSuffix) {
return `…${result}…`;
} else if (hasPrefix) {
return `…${result}`;
} else if (hasSuffix) {
return `${result}…`;
}
return result;
}
function getShortenedHostnames(hosts) {
if (hosts.length <= 1) {
return Object.fromEntries(hosts.map((h) => [h, h]));
}
const commonPrefix = findCommonPrefix(hosts);
const commonSuffix = findCommonSuffix(hosts);
return Object.fromEntries(hosts.map((host) => [host, shortenHostname(host, commonPrefix, commonSuffix)]));
}
function omit(obj, keys) {
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
}
function _page($$renderer, $$props) {
$$renderer.component(($$renderer2) => {
const { data } = $$props;
const readOnly = derived(() => data.readOnly);
let loadingIndexes = /* @__PURE__ */ new Set();
let showDropModal = false;
let indexToDrop = null;
let showCreateModal = false;
let multiNodeStats = {};
let baselineMultiNodeStats = {};
let creatingIndex = false;
const shortenedHostnames = derived(() => {
const hosts = [
...new Set(Object.values(multiNodeStats).map((stat) => stat.host))
];
return getShortenedHostnames(hosts);
});
let indexKeys = '{ "fieldName": 1 }';
let indexName = "";
let indexUnique = false;
let indexSparse = false;
let indexPartialFilterExpression = "";
let indexExpireAfterSeconds = void 0;
let indexBackground = false;
const indexesData = derived(() => data.indexes);
function closeCreateModal() {
showCreateModal = false;
}
function closeDropModal() {
showDropModal = false;
indexToDrop = null;
}
let $$settled = true;
let $$inner_renderer;
function $$render_inner($$renderer3) {
await_block(
$$renderer3,
indexesData(),
() => {
Panel($$renderer3, {
title: "Indexes",
children: ($$renderer4) => {
$$renderer4.push(`<div class="loading svelte-l3ef1w">Loading indexes...</div>`);
},
$$slots: { default: true }
});
},
(result) => {
if (result.error) {
$$renderer3.push("<!--[0-->");
Panel($$renderer3, {
title: "Indexes",
children: ($$renderer4) => {
$$renderer4.push(`<div class="p-4 svelte-l3ef1w"><p class="error svelte-l3ef1w">${escape_html(result.error)}</p></div>`);
},
$$slots: { default: true }
});
} else {
$$renderer3.push("<!--[-1-->");
$$renderer3.push(`<div class="mb-4 flex gap-3 svelte-l3ef1w">`);
if (!readOnly()) {
$$renderer3.push("<!--[0-->");
$$renderer3.push(`<button class="btn btn-success btn-sm flex items-center svelte-l3ef1w" type="button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-4 h-4 inline mr-1 svelte-l3ef1w"><path d="M12 5v14M5 12h14" class="svelte-l3ef1w"></path></svg> Create Index</button>`);
} else {
$$renderer3.push("<!--[-1-->");
}
$$renderer3.push(`<!--]--> <button class="btn btn-primary btn-sm svelte-l3ef1w">${escape_html("Show")} Multi-Node Usage</button></div> `);
if (result.data.length === 0) {
$$renderer3.push("<!--[0-->");
Panel($$renderer3, {
title: "Indexes",
children: ($$renderer4) => {
$$renderer4.push(`<div class="text-center p-4 svelte-l3ef1w" style="color: var(--text-darker)">No indexes found</div>`);
},
$$slots: { default: true }
});
} else {
$$renderer3.push("<!--[-1-->");
{
$$renderer3.push("<!--[-1-->");
}
$$renderer3.push(`<!--]--> `);
Panel($$renderer3, {
title: "Indexes",
children: ($$renderer4) => {
$$renderer4.push(`<div class="table-wrapper svelte-l3ef1w"><table class="table svelte-l3ef1w"><thead class="svelte-l3ef1w"><tr class="svelte-l3ef1w"><th class="name-column svelte-l3ef1w">Name</th><th class="svelte-l3ef1w">Keys</th><th class="svelte-l3ef1w">Properties</th><th class="shrink-column svelte-l3ef1w">Size</th><th class="shrink-column svelte-l3ef1w">Usage</th><th style="min-width: 300px" class="svelte-l3ef1w">Details</th>`);
if (!readOnly()) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<th style="width: 150px" class="svelte-l3ef1w">Actions</th>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--></tr></thead><tbody class="svelte-l3ef1w"><!--[-->`);
const each_array = ensure_array_like(result.data);
for (let $$index_2 = 0, $$length = each_array.length; $$index_2 < $$length; $$index_2++) {
let index = each_array[$$index_2];
const isLoading = loadingIndexes.has(index.name);
$$renderer4.push(`<tr${attr_class("group svelte-l3ef1w", void 0, { "opacity-50": isLoading })}><td class="name-cell svelte-l3ef1w"><span class="font-mono text-sm index-name svelte-l3ef1w"${attr("title", index.name)}>${escape_html(index.name)}</span></td><td class="svelte-l3ef1w">`);
if (index.key) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<div class="flex flex-wrap gap-2 svelte-l3ef1w"><!--[-->`);
const each_array_1 = ensure_array_like(Object.entries(index.key));
for (let i = 0, $$length2 = each_array_1.length; i < $$length2; i++) {
let [field, direction] = each_array_1[i];
$$renderer4.push(`<span class="index-key svelte-l3ef1w">${escape_html(field)}: ${escape_html(direction === 1 ? "↑" : direction === -1 ? "↓" : direction)}</span>`);
}
$$renderer4.push(`<!--]--></div>`);
} else {
$$renderer4.push("<!--[-1-->");
$$renderer4.push(`<span style="color: var(--text-darker)" class="svelte-l3ef1w">-</span>`);
}
$$renderer4.push(`<!--]--></td><td class="svelte-l3ef1w"><div class="flex flex-wrap gap-2 svelte-l3ef1w">`);
if (index.building) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span class="badge badge-building svelte-l3ef1w"${attr("title", index.building.pct > 0 ? `${index.building.pct}% (${index.building.done.toLocaleString()} / ${index.building.total.toLocaleString()})` : "Building…")}${attr_style(index.building.pct > 0 ? `background: linear-gradient(to right, hsl(45, 100%, 45%) ${index.building.pct}%, hsl(45, 100%, 75%) ${index.building.pct}%)` : "")}>building</span>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--> `);
if (index.hidden) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span class="badge badge-hidden svelte-l3ef1w">hidden</span>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--> `);
if (index.unique) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span class="badge badge-unique svelte-l3ef1w">unique</span>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--> `);
if (index.sparse) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span class="badge badge-sparse svelte-l3ef1w">sparse</span>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--> `);
if (index.partialFilterExpression) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span class="badge badge-partial svelte-l3ef1w">partial</span>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--> `);
if (!index.building && !index.hidden && !index.unique && !index.sparse && !index.partialFilterExpression) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span style="color: var(--text-darker)" class="svelte-l3ef1w">-</span>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--></div></td><td class="svelte-l3ef1w">`);
if (index.size) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span class="text-sm whitespace-nowrap svelte-l3ef1w">${escape_html(formatBytes(index.size))}</span>`);
} else {
$$renderer4.push("<!--[-1-->");
$$renderer4.push(`<span style="color: var(--text-darker)" class="svelte-l3ef1w">-</span>`);
}
$$renderer4.push(`<!--]--></td><td class="svelte-l3ef1w">`);
if (index.stats) {
$$renderer4.push("<!--[0-->");
const indexMultiNodeStats = Object.entries(multiNodeStats).filter(([key]) => key.startsWith(`${index.name}::`)).map(([key, stats]) => ({ key, stats }));
const indexBaselineStats = Object.fromEntries(Object.entries(baselineMultiNodeStats).filter(([key]) => key.startsWith(`${index.name}::`)));
$$renderer4.push(`<div class="text-sm mt-1 svelte-l3ef1w">`);
if (indexMultiNodeStats.length > 0) {
$$renderer4.push("<!--[0-->");
{
$$renderer4.push("<!--[-1-->");
$$renderer4.push(`<!--[-->`);
const each_array_2 = ensure_array_like(indexMultiNodeStats);
for (let i = 0, $$length2 = each_array_2.length; i < $$length2; i++) {
let { key, stats } = each_array_2[i];
const baselineOps = indexBaselineStats[key]?.ops || 0;
const increment = baselineOps > 0 ? stats.ops - baselineOps : 0;
$$renderer4.push(`<div class="separate-stat svelte-l3ef1w"${attr("title", stats.host)}><span class="stat-host svelte-l3ef1w">${escape_html(shortenedHostnames()[stats.host] || stats.host)}:</span> <span class="stat-value svelte-l3ef1w">${escape_html(increment > 0 ? formatSignificantDigits(stats.ops) : stats.ops.toLocaleString())} `);
if (increment > 0) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<span class="increment-badge svelte-l3ef1w">+${escape_html(formatSignificantDigits(increment))}</span>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--></span></div>`);
}
$$renderer4.push(`<!--]-->`);
}
$$renderer4.push(`<!--]-->`);
} else {
$$renderer4.push("<!--[-1-->");
$$renderer4.push(`<div class="svelte-l3ef1w">${escape_html(index.stats.ops.toLocaleString())}</div>`);
}
$$renderer4.push(`<!--]--></div>`);
} else {
$$renderer4.push("<!--[-1-->");
$$renderer4.push(`<span style="color: var(--text-darker)" class="svelte-l3ef1w">-</span>`);
}
$$renderer4.push(`<!--]--></td><td class="svelte-l3ef1w"><details class="cursor-pointer svelte-l3ef1w"><summary class="details-link svelte-l3ef1w">View full</summary> <div class="details-content svelte-l3ef1w">`);
JsonValue_1($$renderer4, { value: omit(index, ["stats"]), collapsed: false });
$$renderer4.push(`<!----></div></details></td>`);
if (!readOnly()) {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<td class="svelte-l3ef1w">`);
if (index.name !== "_id_") {
$$renderer4.push("<!--[0-->");
$$renderer4.push(`<div class="flex gap-2 hidden group-hover:flex -my-2 svelte-l3ef1w"><button class="btn btn-outline-light btn-sm svelte-l3ef1w"${attr("disabled", isLoading, true)}>${escape_html(index.hidden ? "Unhide" : "Hide")}</button> <button class="btn btn-outline-danger btn-sm svelte-l3ef1w"${attr("disabled", isLoading, true)}>Drop</button></div>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--></td>`);
} else {
$$renderer4.push("<!--[-1-->");
}
$$renderer4.push(`<!--]--></tr>`);
}
$$renderer4.push(`<!--]--></tbody></table></div>`);
},
$$slots: { default: true }
});
$$renderer3.push(`<!---->`);
}
$$renderer3.push(`<!--]-->`);
}
$$renderer3.push(`<!--]-->`);
}
);
$$renderer3.push(`<!--]--> `);
{
let footer = function($$renderer4) {
$$renderer4.push(`<button class="btn btn-default btn-sm svelte-l3ef1w">Cancel</button> <button class="btn btn-danger btn-sm svelte-l3ef1w">Drop Index</button>`);
};
Modal($$renderer3, {
show: showDropModal,
onclose: closeDropModal,
footer,
children: ($$renderer4) => {
$$renderer4.push(`<p class="svelte-l3ef1w">Are you sure you want to drop the index <strong class="svelte-l3ef1w">${escape_html(indexToDrop)}</strong>?</p> <p class="text-sm mt-2 svelte-l3ef1w" style="color: var(--text-darker)">This action cannot be undone. The index will need to be recreated if needed again.</p>`);
}
});
}
$$renderer3.push(`<!----> `);
{
let footer = function($$renderer4) {
$$renderer4.push(`<button class="btn btn-default btn-sm svelte-l3ef1w"${attr("disabled", creatingIndex, true)}>Cancel</button> <button class="btn btn-success btn-sm svelte-l3ef1w"${attr("disabled", creatingIndex, true)}>${escape_html("Create Index")}</button>`);
};
Modal($$renderer3, {
show: showCreateModal,
onclose: closeCreateModal,
title: "Create Index",
footer,
children: ($$renderer4) => {
$$renderer4.push(`<div class="space-y-4 svelte-l3ef1w"><div class="svelte-l3ef1w"><label for="index-keys" class="block text-sm font-semibold mb-2 svelte-l3ef1w" style="color: var(--text);">Index Keys (JSON) <span style="color: var(--error);" class="svelte-l3ef1w">*</span></label> <p class="text-xs mb-2 svelte-l3ef1w" style="color: var(--text-darker);">Define the fields to index. Use 1 for ascending, -1 for descending. Example: <code class="svelte-l3ef1w">{ "fieldName": 1 }</code></p> <textarea id="index-keys" rows="3" placeholder="{"fieldName": 1}" class="w-full p-3 rounded border border-[var(--border-color)] bg-[var(--color-1)] font-mono text-sm focus:outline-none focus:ring-2 svelte-l3ef1w" style="color: var(--text); --tw-ring-color: var(--link);">`);
const $$body = escape_html(indexKeys);
if ($$body) {
$$renderer4.push(`${$$body}`);
}
$$renderer4.push(`</textarea></div> <div class="svelte-l3ef1w"><label for="index-name" class="block text-sm font-semibold mb-2 svelte-l3ef1w" style="color: var(--text);">Index Name (Optional)</label> <p class="text-xs mb-2 svelte-l3ef1w" style="color: var(--text-darker);">Leave empty to auto-generate based on fields</p> <input id="index-name" type="text"${attr("value", indexName)} placeholder="e.g., user_email_idx" class="w-full p-2 rounded border border-[var(--border-color)] bg-[var(--color-1)] text-sm focus:outline-none focus:ring-2 svelte-l3ef1w" style="color: var(--text); --tw-ring-color: var(--link);"/></div> <div class="grid grid-cols-2 gap-3 svelte-l3ef1w"><label class="flex items-center gap-2 cursor-pointer svelte-l3ef1w"><input type="checkbox"${attr("checked", indexUnique, true)} class="cursor-pointer svelte-l3ef1w"/> <span class="text-sm svelte-l3ef1w" style="color: var(--text);">Unique</span></label> <label class="flex items-center gap-2 cursor-pointer svelte-l3ef1w"><input type="checkbox"${attr("checked", indexSparse, true)} class="cursor-pointer svelte-l3ef1w"/> <span class="text-sm svelte-l3ef1w" style="color: var(--text);">Sparse</span></label> <label class="flex items-center gap-2 cursor-pointer svelte-l3ef1w"><input type="checkbox"${attr("checked", indexBackground, true)} class="cursor-pointer svelte-l3ef1w"/> <span class="text-sm svelte-l3ef1w" style="color: var(--text);">Background</span></label></div> <div class="svelte-l3ef1w"><label for="index-partial" class="block text-sm font-semibold mb-2 svelte-l3ef1w" style="color: var(--text);">Partial Filter Expression (Optional)</label> <p class="text-xs mb-2 svelte-l3ef1w" style="color: var(--text-darker);">Only index documents that match this filter. Example: <code class="svelte-l3ef1w">{ "status": "active" }</code></p> <textarea id="index-partial" rows="2" placeholder="{"status": "active"}" class="w-full p-3 rounded border border-[var(--border-color)] bg-[var(--color-1)] font-mono text-sm focus:outline-none focus:ring-2 svelte-l3ef1w" style="color: var(--text); --tw-ring-color: var(--link);">`);
const $$body_1 = escape_html(indexPartialFilterExpression);
if ($$body_1) {
$$renderer4.push(`${$$body_1}`);
}
$$renderer4.push(`</textarea></div> <div class="svelte-l3ef1w"><label for="index-ttl" class="block text-sm font-semibold mb-2 svelte-l3ef1w" style="color: var(--text);">TTL - Expire After Seconds (Optional)</label> <p class="text-xs mb-2 svelte-l3ef1w" style="color: var(--text-darker);">Automatically delete documents after specified seconds (for TTL indexes)</p> <input id="index-ttl" type="number"${attr("value", indexExpireAfterSeconds)} placeholder="e.g., 3600" min="0" class="w-full p-2 rounded border border-[var(--border-color)] bg-[var(--color-1)] text-sm focus:outline-none focus:ring-2 svelte-l3ef1w" style="color: var(--text); --tw-ring-color: var(--link);"/></div></div>`);
}
});
}
$$renderer3.push(`<!---->`);
}
do {
$$settled = true;
$$inner_renderer = $$renderer2.copy();
$$render_inner($$inner_renderer);
} while (!$$settled);
$$renderer2.subsume($$inner_renderer);
});
}
export { _page as default };
//# sourceMappingURL=_page.svelte-zD7qndty.js.map