UNPKG

mongoku

Version:

[![CI](https://github.com/huggingface/Mongoku/actions/workflows/ci.yml/badge.svg)](https://github.com/huggingface/Mongoku/actions/workflows/ci.yml)

397 lines (394 loc) 22.8 kB
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="{&quot;fieldName&quot;: 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="{&quot;status&quot;: &quot;active&quot;}" 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