diff --git a/.changeset/config.json b/.changeset/config.json index 273997bb..bfad7cea 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -2,7 +2,7 @@ "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, - "fixed": [["@zazuko/*"]], + "fixed": [["@rdfjs/*"]], "linked": [], "access": "public", "baseBranch": "main", diff --git a/.changeset/migrate-to-monaco.md b/.changeset/migrate-to-monaco.md new file mode 100644 index 00000000..313f9ea9 --- /dev/null +++ b/.changeset/migrate-to-monaco.md @@ -0,0 +1,42 @@ +--- +"@rdfjs/sparql-studio": major +"@rdfjs/sparql-utils": major +"@rdfjs/sparql-editor-monaco": major +"@rdfjs/sparql-editor-codemirror": major +"@rdfjs/sparql-results": major +--- + +- Migrate from CodeMirror 5 to Monaco/CodeMirror 6 editors with language servers + - Users can now choose between 2 editors: one based on Monaco, the other based on CodeMirror 6 + - The editor now extends `EventEmitter` instead of `CodeMirror`, with a shared `IEditor` interface both editors implement + - Enable use of language servers for diagnostics, syntax highlighting, autocompletion, code actions, hover and formatting + - Delete the editor's built-in autocomplete and grammar code (now handled by the language server) + - CodeMirror falls back to static SPARQL syntax highlighting when the language server provides no semantic tokens + - Update some of the puppeteer tests +- Language servers + - Unified, editor-agnostic language server interface for both Monaco and CodeMirror: you pass a `Worker` (instance or factory) and the editor connects the client for you, waiting for the worker's `ready` signal + - Support multiple language servers via a `languageServers` array, with runtime switching (right-click menu in Monaco, dropdown in CodeMirror) and a per-endpoint preference persisted to localStorage + - Generic settings panel generated from a JSON schema, with a callback to apply settings to the active server + - Improved display of error messages coming from the language server + - Ship qlue-ls plumbing (settings, types, backend/endpoint registration, prefix discovery, completion-query templates) in utils under the `qlueLs` namespace, so consumers can wire it up easily + - The demo implements 3 language servers: **qlue-ls** (WASM, endpoint-powered completions), **swls** (WASM, semantic web language server) and **Traqula** (JS SPARQL 1.2 parser, diagnostics only) +- App and editor improvements + - Enable light/dark theme + - Add a "Share query URL" entry to the Monaco right-click menu (under Execute query) bound to Cmd/Ctrl+S + - Update the CodeMirror used by the results viewer to display the raw response JSON from v5 to v6 + - Update the default SPARQL endpoint from DBpedia to https://sparql.dblp.org/sparql (faster for completion queries) + - Improve the partial config implementation (`DeepPartial`) + - Enable importing the main JS and CSS from `@rdfjs/sparql-studio` and `@rdfjs/sparql-studio/style.css` +- Docs + - Add a documentation website built with VitePress (served from https://sparql.studio), with an auto-generated API reference (TypeDoc) + - The home page is the full app with the 3 language servers, a second page demos the CodeMirror editor +- Drop UMD support: the libraries are now ESM-only (Monaco loads its workers/wasm via `import.meta.url`, which UMD cannot express). ESM imports work in plain HTML ` + + diff --git a/dev/editor_results.html b/dev/editor_results.html new file mode 100644 index 00000000..3e44200a --- /dev/null +++ b/dev/editor_results.html @@ -0,0 +1,53 @@ + + + + + + + SPARQL Editor & Results + + + +
+
+ + + diff --git a/dev/index.html b/dev/index.html index 072add26..cd90cfd7 100644 --- a/dev/index.html +++ b/dev/index.html @@ -2,50 +2,70 @@ - - - YASGUI + + + SPARQL Studio -
+ -
+
diff --git a/dev/public/sparql-studio.svg b/dev/public/sparql-studio.svg new file mode 100644 index 00000000..8b4eff97 --- /dev/null +++ b/dev/public/sparql-studio.svg @@ -0,0 +1,14 @@ + + SPARQL Studio + Triangle of three rings colored orange, green and purple (W3C Semantic Web palette) joined by neutral grey edges, an RDF triple. + + + + + + + + + + + diff --git a/dev/public/yasgui.png b/dev/public/yasgui.png deleted file mode 100644 index 8fed2aee..00000000 Binary files a/dev/public/yasgui.png and /dev/null differ diff --git a/dev/qluels.worker.ts b/dev/qluels.worker.ts new file mode 100644 index 00000000..8ec9c93d --- /dev/null +++ b/dev/qluels.worker.ts @@ -0,0 +1,38 @@ +/** + * qlue-ls SPARQL language server running as a Web Worker (WASM). + * + * This is consumer-side config: `sparqlEditor` is language server agnostic and just receives this worker. + * The SAME worker drives both the Monaco editor (`@rdfjs/sparql-editor-monaco`) and the CodeMirror editor + * (`@rdfjs/sparql-editor-codemirror`). + */ +// @ts-ignore qlue-ls is loaded as a wasm module via vite-plugin-wasm +import init, { init_language_server, listen } from "qlue-ls?init"; + +init().then(() => { + // Connection Worker <-> Language Server (WASM) + const wasmInputStream = new TransformStream(); + const wasmOutputStream = new TransformStream(); + const wasmReader = wasmOutputStream.readable.getReader(); + const wasmWriter = wasmInputStream.writable.getWriter(); + + // Initialize and start language server + const server = init_language_server(wasmOutputStream.writable.getWriter()); + listen(server, wasmInputStream.readable.getReader()); + + // Language Client -> Language Server + self.onmessage = function (message) { + wasmWriter.write(JSON.stringify(message.data)); + }; + // Language Server -> Language Client + (async () => { + while (true) { + const { value, done } = await wasmReader.read(); + if (done) break; + self.postMessage(JSON.parse(value)); + } + })(); + + // Signal to the host that the WASM server is initialized and ready to connect + self.postMessage({ type: "ready" }); +}); +export {}; diff --git a/dev/style.css b/dev/style.css new file mode 100644 index 00000000..dcc546e8 --- /dev/null +++ b/dev/style.css @@ -0,0 +1,87 @@ +body { + font-family: sans-serif; + margin: 0px; +} +.navItem a { + color: #555; + text-decoration: none; + padding: 5px; + padding-right: 15px; +} +.navItem a:hover { + color: #222; +} +.navItem.active a { + color: black; + font-size: 110%; +} +/* Light/dark theme toggle */ +.themeToggle { + margin-left: auto; + align-self: center; + margin-right: 12px; + padding: 5px 10px; + font-size: 18px; + line-height: 1; + cursor: pointer; + border: 1px solid transparent; + border-radius: 8px; + background: rgba(0, 0, 0, 0.06); + user-select: none; + transition: background 0.15s ease; +} +.themeToggle:hover { + background: rgba(0, 0, 0, 0.13); +} +.navBar { + background: #eee; +} +/* Light/dark theme */ +html[data-theme="dark"] body { + background: #1e1e1e; + color: #d4d4d4; +} +html[data-theme="dark"] .navBar { + background: #2d2d30; +} +html[data-theme="dark"] .navItem a, +html[data-theme="dark"] .themeToggle { + color: #ccc; +} +html[data-theme="dark"] .navItem.active a { + color: #fff; +} +/* html[data-theme="dark"] .logo { + filter: invert(1); +} */ +html[data-theme="dark"] .themeToggle { + background: rgba(255, 255, 255, 0.1); +} +html[data-theme="dark"] .themeToggle:hover { + background: rgba(255, 255, 255, 0.18); +} +@media (prefers-color-scheme: dark) { + html:not([data-theme="light"]) .themeToggle { + background: rgba(255, 255, 255, 0.1); + } + html:not([data-theme="light"]) .themeToggle:hover { + background: rgba(255, 255, 255, 0.18); + } + /* html:not([data-theme="light"]) .logo { + filter: invert(1); + } */ + html:not([data-theme="light"]) body { + background: #1e1e1e; + color: #d4d4d4; + } + html:not([data-theme="light"]) .navBar { + background: #2d2d30; + } + html:not([data-theme="light"]) .navItem a, + html:not([data-theme="light"]) .themeToggle { + color: #ccc; + } + html:not([data-theme="light"]) .navItem.active a { + color: #fff; + } +} diff --git a/dev/swls.worker.ts b/dev/swls.worker.ts new file mode 100644 index 00000000..1fdb2079 --- /dev/null +++ b/dev/swls.worker.ts @@ -0,0 +1,121 @@ +/** + * swls SPARQL language server running as a Web Worker (WASM). + * + * Consumer-side config: `sparqlEditor` is language server agnostic and just receives this worker. + * Unlike qlue-ls, swls speaks length-prefixed LSP frames (`Content-Length` headers), so this + * worker frames outgoing messages and deframes incoming bytes back into JSON-RPC objects. + * + * The WASM is loaded once up front and the worker only signals "ready" afterwards. The host waits + * for that signal before connecting a language client, so the initialize/initialized/didOpen burst + * can't arrive before the server exists (a lazy per-message import races that burst and corrupts + * message ordering, which left semantic-token highlighting unapplied). + */ +class LspMessageSplitter { + private buffer: Uint8Array = new Uint8Array(0); + private readonly asciiDecoder = new TextDecoder("ascii"); + private readonly utf8Decoder = new TextDecoder("utf-8"); + + /** + * Push raw bytes into the splitter. + * Returns zero or more complete LSP message payloads (JSON text). + */ + push(chunk: Uint8Array): string[] { + this.buffer = concat(this.buffer, chunk); + + const messages: string[] = []; + + while (true) { + const headerEnd = indexOfDoubleCRLF(this.buffer); + if (headerEnd === -1) break; + + const headerBytes = this.buffer.subarray(0, headerEnd); + const headerText = this.asciiDecoder.decode(headerBytes); + + const match = /Content-Length:\s*(\d+)/i.exec(headerText); + if (!match) { + throw new Error("Invalid LSP header: missing Content-Length"); + } + + const contentLength = Number(match[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + + if (this.buffer.length < messageEnd) break; + + const messageBytes = this.buffer.subarray(messageStart, messageEnd); + const messageText = this.utf8Decoder.decode(messageBytes); + + messages.push(messageText); + + // Consume processed bytes + this.buffer = this.buffer.subarray(messageEnd); + } + + return messages; + } +} + +/* ----------------- helpers ----------------- */ + +function concat(a: Uint8Array, b: Uint8Array): Uint8Array { + const out = new Uint8Array(a.length + b.length); + out.set(a, 0); + out.set(b, a.length); + return out; +} + +function indexOfDoubleCRLF(buf: Uint8Array): number { + for (let i = 0; i + 3 < buf.length; i++) { + if ( + buf[i] === 13 && // \r + buf[i + 1] === 10 && // \n + buf[i + 2] === 13 && + buf[i + 3] === 10 + ) { + return i; + } + } + return -1; +} + +const encoder = new TextEncoder(); +const deframer = new LspMessageSplitter(); + +/** + * swls logs through this callback as verbose structured (JSON) lines. Surface only WARN/ERROR (and + * anything that isn't a recognizable structured log) so the console isn't flooded with INFO traces. + */ +function logFromSwls(...args: unknown[]) { + const line = args[0]; + if (typeof line === "string") { + try { + const level = JSON.parse(line).level; + if (level === "INFO" || level === "DEBUG" || level === "TRACE") return; + } catch { + // not a structured log line; fall through and print it + } + } + // eslint-disable-next-line no-console + console.log(...args); +} + +(async () => { + const mod = await import("swls-wasm"); + const lsp = new mod.WasmLsp((bytes: Uint8Array) => { + // Language Server -> Language Client: deframe and forward each complete message as JSON. + for (const msg of deframer.push(bytes)) self.postMessage(JSON.parse(msg)); + }, logFromSwls); + + // Language Client -> Language Server: frame as a length-prefixed LSP message. + self.onmessage = (event) => { + const payload = typeof event.data === "string" ? event.data : JSON.stringify(event.data); + // Content-Length is a byte count; the server reads UTF-8 bytes, so measure bytes, not chars. + const framed = `Content-Length: ${encoder.encode(payload).length}\r\n\r\n${payload}`; + lsp.send(framed); + }; + + // Signal to the host that the WASM server is initialized and ready to connect. + self.postMessage({ type: "ready" }); +})(); + +export {}; diff --git a/dev/traqula.worker.ts b/dev/traqula.worker.ts new file mode 100644 index 00000000..5be16310 --- /dev/null +++ b/dev/traqula.worker.ts @@ -0,0 +1,171 @@ +/** + * Traqula SPARQL 1.2 language server running as a Web Worker. + * + * Consumer-side config: `sparqlEditor` is language server agnostic and just receives this worker. + * This is a pure-JS parser (no WASM): it runs the @traqula SPARQL 1.2 parser on every document + * change and reports syntax errors as LSP diagnostics. It provides no completions. + */ +import { defaultLexerErrorProvider, defaultParserErrorProvider } from "@traqula/chevrotain"; +import { Parser } from "@traqula/parser-sparql-1-2"; + +interface LspPosition { + line: number; + character: number; +} + +interface LspRange { + start: LspPosition; + end: LspPosition; +} + +interface LspDiagnostic { + range: LspRange; + severity: 1 | 2 | 3 | 4; + message: string; +} + +const lexerErrors: { length: number; line?: number; column?: number; message: string }[] = []; +const parserErrors: { token: any; message: string }[] = []; + +const parser = new Parser({ + lexerConfig: { + positionTracking: "full", + errorMessageProvider: Object.assign({}, defaultLexerErrorProvider, { + buildUnexpectedCharactersMessage( + fullText: string, + startOffset: number, + length: number, + line?: number, + column?: number, + mode?: string, + ): string { + const message = defaultLexerErrorProvider.buildUnexpectedCharactersMessage( + fullText, + startOffset, + length, + line, + column, + mode, + ); + lexerErrors.push({ length, line, column, message }); + return message; + }, + }), + }, + parserConfig: { + errorMessageProvider: Object.assign({}, defaultParserErrorProvider, { + buildMismatchTokenMessage(options: any): string { + const message = defaultParserErrorProvider.buildMismatchTokenMessage(options); + parserErrors.push({ token: options.actual, message }); + return message; + }, + buildNotAllInputParsedMessage(options: any): string { + const message = defaultParserErrorProvider.buildNotAllInputParsedMessage(options); + parserErrors.push({ token: options.firstRedundant, message }); + return message; + }, + buildNoViableAltMessage(options: any): string { + const message = defaultParserErrorProvider.buildNoViableAltMessage(options); + const token = options.actual?.[0] ?? options.previous; + parserErrors.push({ token, message }); + return message; + }, + buildEarlyExitMessage(options: any): string { + const message = defaultParserErrorProvider.buildEarlyExitMessage(options); + const token = options.actual?.[0] ?? options.previous; + parserErrors.push({ token, message }); + return message; + }, + }), + }, +}); + +function tokenToRange(token: any): LspRange { + const startLine = Math.max(0, (token?.startLine ?? 1) - 1); + const startChar = Math.max(0, (token?.startColumn ?? 1) - 1); + const endLine = Math.max(0, (token?.endLine ?? token?.startLine ?? 1) - 1); + // chevrotain endColumn is 1-indexed inclusive; convert to 0-indexed exclusive + const endChar = token?.endColumn ?? startChar + 1; + return { + start: { line: startLine, character: startChar }, + end: { line: endLine, character: endChar }, + }; +} + +function runParser(text: string): LspDiagnostic[] { + lexerErrors.length = 0; + parserErrors.length = 0; + + try { + parser.parse(text); + } catch { + // errors already captured by the providers above + } + + const diagnostics: LspDiagnostic[] = []; + + for (const err of lexerErrors) { + const line = Math.max(0, (err.line ?? 1) - 1); + const character = Math.max(0, (err.column ?? 1) - 1); + diagnostics.push({ + range: { + start: { line, character }, + end: { line, character: character + err.length }, + }, + severity: 1, + message: err.message, + }); + } + + for (const err of parserErrors) { + diagnostics.push({ + range: tokenToRange(err.token), + severity: 1, + message: err.message, + }); + } + + return diagnostics; +} + +onmessage = function handleIncomingMessage(event: MessageEvent) { + const msg = typeof event.data === "string" ? JSON.parse(event.data) : event.data; + const { id, method, params } = msg; + + if (method === "initialize") { + postMessage({ + jsonrpc: "2.0", + id, + result: { + capabilities: { + textDocumentSync: 1, // Full: client always sends complete document text + }, + }, + }); + } else if (method === "textDocument/didOpen") { + const { textDocument } = params; + const diagnostics = runParser(textDocument.text); + postMessage({ + jsonrpc: "2.0", + method: "textDocument/publishDiagnostics", + params: { + uri: textDocument.uri, + diagnostics, + }, + }); + } else if (method === "textDocument/didChange") { + const { textDocument, contentChanges } = params; + const text: string = contentChanges[contentChanges.length - 1].text; + const diagnostics = runParser(text); + postMessage({ + jsonrpc: "2.0", + method: "textDocument/publishDiagnostics", + params: { + uri: textDocument.uri, + diagnostics, + }, + }); + } +}; + +postMessage("ready"); diff --git a/dev/utils.ts b/dev/utils.ts new file mode 100644 index 00000000..ce5980e9 --- /dev/null +++ b/dev/utils.ts @@ -0,0 +1,33 @@ +/// + +/** Default SPARQL endpoint used across the demo pages. */ +export const DEMO_ENDPOINT = "https://sparql.dblp.org/sparql"; + +export type DevTheme = "light" | "dark"; + +/** + * Wire the demo page's light/dark switcher: start from the OS preference, and on toggle set the + * `[data-theme]` attribute (which drives the CSS) and call `onThemeChange` (e.g. editor.setTheme). + */ +export function setupThemeToggle(onThemeChange?: (theme: DevTheme) => void): DevTheme { + let currentTheme: DevTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; + document.documentElement.dataset.theme = currentTheme; + const button = document.getElementById("darkModeToggle"); + const sunSvg = ``; + const moonSvg = ``; + const render = () => { + if (!button) return; + button.innerHTML = currentTheme === "dark" ? sunSvg : moonSvg; + const title = currentTheme === "dark" ? "Switch to light theme" : "Switch to dark theme"; + button.setAttribute("title", title); + button.setAttribute("aria-label", title); + }; + render(); + button?.addEventListener("click", () => { + currentTheme = currentTheme === "dark" ? "light" : "dark"; + document.documentElement.dataset.theme = currentTheme; + render(); + onThemeChange?.(currentTheme); + }); + return currentTheme; +} diff --git a/dev/yasqe.html b/dev/yasqe.html deleted file mode 100644 index 70f8ea85..00000000 --- a/dev/yasqe.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - YASQE - - - -
- -
- - -
- - - diff --git a/dev/yasr.html b/dev/yasr.html deleted file mode 100644 index 70201879..00000000 --- a/dev/yasr.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - YASR - - -
- -
- -
-
- - - diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 00000000..59c98ec2 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,177 @@ +import { defineConfig } from "vitepress"; +import wasm from "vite-plugin-wasm"; +import importMetaUrlPlugin from "@codingame/esbuild-import-meta-url-plugin"; +import typedocSidebar from "../api/typedoc-sidebar.json"; + +const siteUrl = "https://sparql.studio"; +const ogImage = `${siteUrl}/sparql-studio.svg`; + +const shortDescription= "SPARQL query editor and results viewer"; +const description= "Modular SPARQL query editor and results viewer for the web, with multiple language servers available"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "SPARQL Studio", + description, + base: "/", + lang: "en-US", + cleanUrls: true, + lastUpdated: true, + sitemap: { + hostname: "https://sparql.studio/", + }, + head: [ + ["link", { rel: "icon", type: "image/png", href: "/sparql-studio.svg" }], + ["link", { rel: "alternate icon", href: "/sparql-studio.svg" }], + ["meta", { name: "author", content: "SPARQL Studio contributors" }], + [ + "meta", + { + name: "keywords", + content: + "SPARQL Studio, SPARQL, SPARQL editor, SPARQL query, SPARQL results, RDF, linked data, semantic web, Yasgui, Yasqe, Yasr, query editor, SPARQL GUI, Monaco editor", + }, + ], + ["meta", { name: "theme-color", content: "#7d3fbd" }], + // Open Graph + ["meta", { property: "og:type", content: "website" }], + ["meta", { property: "og:site_name", content: "SPARQL Studio" }], + ["meta", { property: "og:title", content: shortDescription }], + [ + "meta", + { + property: "og:description", + content: description, + }, + ], + ["meta", { property: "og:image", content: ogImage }], + ["meta", { property: "og:url", content: `${siteUrl}/` }], + // Twitter + ["meta", { name: "twitter:card", content: "summary" }], + ["meta", { name: "twitter:title", content: shortDescription }], + [ + "meta", + { + name: "twitter:description", + content: description, + }, + ], + ["meta", { name: "twitter:image", content: ogImage }], + ], + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + logo: "/sparql-studio.svg", + nav: [ + { text: "Monaco Editor", link: "/" }, + { text: "CodeMirror Editor", link: "/codemirror" }, + { text: "Documentation", link: "/docs/introduction" }, + { text: "API Reference", link: "/api/" }, + ], + sidebar: { + "/docs/": [ + { + text: "Introduction", + items: [ + { text: "What is SPARQL Studio?", link: "/docs/introduction" }, + { text: "Getting started", link: "/docs/getting-started" }, + ], + }, + { + text: "Packages", + items: [ + { text: "SPARQL Studio", link: "/docs/sparql-studio" }, + { text: "SPARQL Editor", link: "/docs/sparql-editor" }, + { text: "SPARQL Results", link: "/docs/sparql-results" }, + ], + }, + { + text: "Configuration", + items: [ + { text: "Language server", link: "/docs/language-server" }, + { text: "Results plugins", link: "/docs/plugins" }, + { text: "Request configuration", link: "/docs/request-config" }, + { text: "Theming", link: "/docs/theming" }, + { text: "Monaco editor options", link: "/docs/editor-options" }, + ], + }, + { + text: "Reference", + items: [ + { text: "Build from source", link: "/docs/build" }, + { text: "API reference", link: "/api/" }, + ], + }, + ], + "/api/": [ + { + text: "API Reference", + items: [{ text: "Overview", link: "/api/" }], + }, + ...typedocSidebar, + ], + }, + socialLinks: [{ icon: "github", link: "https://github.com/rdfjs/Yasgui" }], + search: { provider: "local" }, + editLink: { + pattern: "https://github.com/rdfjs/Yasgui/edit/main/docs/:path", + text: "Edit this page on GitHub", + }, + footer: { + message: 'Documentation · Source code', + copyright: "MIT License", + }, + }, + vite: { + // The demo imports the @rdfjs/* packages' pre-built + // Run `npm run build:lib` before building/serving the docs so those bundles exist + // esnext is required because the qlue-ls / swls wasm glue emits top-level await; VitePress's + // default es2020 target rejects it (and the worker bundle inherits this target). + build: { target: "esnext" }, + css: { + preprocessorOptions: { + scss: { api: "modern-compiler" }, + }, + }, + resolve: { + // Deduplicate cm packages so the docs site and qlue-ls client + // share one CM6 instance and avoid extension-instance runtime errors. + dedupe: [ + "@codemirror/state", + "@codemirror/view", + "@codemirror/language", + "@codemirror/commands", + "@codemirror/search", + "@codemirror/autocomplete", + "@codemirror/lint", + "@codemirror/lsp-client", + "@lezer/common", + "@lezer/highlight", + ], + }, + // The qlue-ls language server worker is compiled here and loads WebAssembly, so it needs + // the wasm plugin, ES-format workers and the import.meta.url esbuild rewrite (dev pre-bundling). + plugins: [wasm()], + worker: { + format: "es", + plugins: () => [wasm()], + }, + optimizeDeps: { + esbuildOptions: { plugins: [importMetaUrlPlugin as any] }, + // The pre-built editor bundles ship their own internal chunks/assets; swls-wasm imports its + // .wasm directly (handled by vite-plugin-wasm, not esbuild dep pre-bundling). + exclude: ["@rdfjs/sparql-studio", "@rdfjs/sparql-editor-monaco", "@rdfjs/sparql-editor-codemirror", "@rdfjs/sparql-results", "qlue-ls", "swls-wasm"], + }, + ssr: { + // The demo is client-only, so the editor deps must not enter the server bundle + external: [ + "@rdfjs/sparql-studio", + "@rdfjs/sparql-editor-monaco", + "@rdfjs/sparql-editor-codemirror", + "@rdfjs/sparql-results", + "@rdfjs/sparql-utils", + "@matdata/yasgui-graph-plugin", + "yasgui-geo-tg", + ], + }, + }, +}); diff --git a/docs/.vitepress/theme/components/YasguiCmDemo.vue b/docs/.vitepress/theme/components/YasguiCmDemo.vue new file mode 100644 index 00000000..e2743e79 --- /dev/null +++ b/docs/.vitepress/theme/components/YasguiCmDemo.vue @@ -0,0 +1,267 @@ + + + + + + + diff --git a/docs/.vitepress/theme/components/YasguiDemo.vue b/docs/.vitepress/theme/components/YasguiDemo.vue new file mode 100644 index 00000000..26ac101f --- /dev/null +++ b/docs/.vitepress/theme/components/YasguiDemo.vue @@ -0,0 +1,265 @@ + + + + + + + diff --git a/docs/.vitepress/theme/demo.css b/docs/.vitepress/theme/demo.css new file mode 100644 index 00000000..25c82807 --- /dev/null +++ b/docs/.vitepress/theme/demo.css @@ -0,0 +1,63 @@ +/* Sticky footer: page fills at least the viewport */ +.sparql-studio-home { + min-height: 100dvh; + display: flex; + flex-direction: column; +} +.sparql-studio-home .VPContent { + flex: 1 1 auto; + display: flex; + flex-direction: column; +} +/* Fill the content chain down to the demo so its theme bar can sit at the bottom */ +.sparql-studio-home .VPPage, +.sparql-studio-home .VPPage > div, +.sparql-studio-home .VPPage > div > div, +.sparql-studio-home .sparql-studio-home-demo { + flex: 1 1 auto; + min-height: 0; + display: flex; + flex-direction: column; +} +.sparql-studio-home .VPPage { + padding: 0; +} +/* Hide the fixed "Return to top" local-nav bar that overlaps the demo on small screens */ +.sparql-studio-home .VPLocalNav { + display: none; +} + +/* VitePress global CSS resets can inflate the endpoint input */ +.sparql-studio .autocomplete { + font-size: 13px; + line-height: normal; + height: auto; +} + +/* YASR and results: natural block height, no overflow clipping */ +.sparql-demo .sparql-studio .sparql-results, +.sparql-demo .sparql-studio .sparql-results_results { + height: auto; + overflow: visible; +} + +/* Graph plugin */ +.sparql-demo .sparql-studio-graph-plugin-container { + min-height: 30vh; +} + +/* Geo plugin/leaflet: needs an explicit height to render */ +.sparql-demo .sparql-results_results .leaflet-container { + min-height: 300px; +} + +/* VitePress dark mode uses class="dark" on , while SparqlStudio's own dark theme keys off [data-theme="dark"] */ +.dark .sparql-studio .clearEndpointBtn { + background-color: var(--yg-d-border); + border-color: var(--yg-d-border); + color: var(--yg-d-text); +} +.dark .sparql-studio .clearEndpointBtn:hover { + background-color: var(--yg-d-hover); + color: #fff; +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 00000000..dd77b35f --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,15 @@ +// https://vitepress.dev/guide/custom-theme +import type { Theme } from "vitepress"; +import DefaultTheme from "vitepress/theme"; +import YasguiDemo from "./components/YasguiDemo.vue"; +import YasguiCmDemo from "./components/YasguiCmDemo.vue"; +import "./style.css"; +import "./demo.css"; + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + app.component("YasguiDemo", YasguiDemo); + app.component("YasguiCmDemo", YasguiCmDemo); + }, +} satisfies Theme; diff --git a/docs/.vitepress/theme/qluels.worker.ts b/docs/.vitepress/theme/qluels.worker.ts new file mode 100644 index 00000000..6b3583a4 --- /dev/null +++ b/docs/.vitepress/theme/qluels.worker.ts @@ -0,0 +1,48 @@ +/* eslint-disable no-console */ +/** + * qlue-ls SPARQL language server running as a Web Worker (WASM). + * + * This is consumer-side config: sparqlEditor is language server agnostic and just receives this worker. + */ +// @ts-ignore qlue-ls is loaded as a wasm module via vite-plugin-wasm +import init, { init_language_server, listen } from "qlue-ls?init"; + +// qlue-ls (Rust tracing-wasm) has no log-level API: it routes every level through the +// console. Keep DEBUG/TRACE in dev, but only surface INFO and above in prod +if (import.meta.env.PROD) { + console.debug = () => {}; + const nativeLog = console.log.bind(console); + console.log = (...args: unknown[]) => { + if (typeof args[0] === "string" && /^%c\s*(DEBUG|TRACE)\b/.test(args[0])) return; + nativeLog(...args); + }; +} + +init().then(() => { + // Connection Worker <-> Language Server (WASM) + const wasmInputStream = new TransformStream(); + const wasmOutputStream = new TransformStream(); + const wasmReader = wasmOutputStream.readable.getReader(); + const wasmWriter = wasmInputStream.writable.getWriter(); + + // Initialize and start language server + const server = init_language_server(wasmOutputStream.writable.getWriter()); + listen(server, wasmInputStream.readable.getReader()); + + // Language Client -> Language Server + self.onmessage = function (message) { + wasmWriter.write(JSON.stringify(message.data)); + }; + // Language Server -> Language Client + (async () => { + while (true) { + const { value, done } = await wasmReader.read(); + if (done) break; + self.postMessage(JSON.parse(value)); + } + })(); + + // Signal to the host that the WASM server is initialized and ready to connect + self.postMessage({ type: "ready" }); +}); +export {}; diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css new file mode 100644 index 00000000..62c847eb --- /dev/null +++ b/docs/.vitepress/theme/style.css @@ -0,0 +1,132 @@ +/** + * Customize default theme styling by overriding CSS variables: + * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css + */ + +/** + * Colors + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * - `XXX-2`: The color used mainly for hover state of the button. + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create a accent, such as when having inline code block inside + * custom containers. + * - `default`: The color used purely for subtle indication without any + * special meanings attached to it such as bg color for menu hover state. + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + */ + +:root { + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--vp-c-indigo-1); + --vp-c-brand-2: var(--vp-c-indigo-2); + --vp-c-brand-3: var(--vp-c-indigo-3); + --vp-c-brand-soft: var(--vp-c-indigo-soft); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); +} + +/** + * Component: Button + */ + +:root { + --vp-button-brand-border: transparent; + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: var(--vp-c-brand-3); + --vp-button-brand-hover-border: transparent; + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: var(--vp-c-brand-2); + --vp-button-brand-active-border: transparent; + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: var(--vp-c-brand-1); +} + +/** + * Component: Home + */ + +:root { + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient( + 120deg, + #bd34fe 30%, + #41d1ff + ); + + --vp-home-hero-image-background-image: linear-gradient( + -45deg, + #bd34fe 50%, + #47caff 50% + ); + --vp-home-hero-image-filter: blur(44px); +} + +@media (min-width: 640px) { + :root { + --vp-home-hero-image-filter: blur(56px); + } +} + +@media (min-width: 960px) { + :root { + --vp-home-hero-image-filter: blur(68px); + } +} + +/** + * Component: Custom Block + */ + +:root { + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); +} + +.DocSearch { + --docsearch-primary-color: var(--vp-c-brand-1) !important; +} + + +/** + * Invert the logo colors in dark mode (matches dev/ files) + */ +/* .dark .VPNavBarTitle .logo { + filter: invert(1); +} */ diff --git a/docs/.vitepress/theme/swls.worker.ts b/docs/.vitepress/theme/swls.worker.ts new file mode 100644 index 00000000..a6a07bbe --- /dev/null +++ b/docs/.vitepress/theme/swls.worker.ts @@ -0,0 +1,111 @@ +/* eslint-disable no-console */ +/** + * swls SPARQL language server running as a Web Worker (WASM). + * + * Consumer-side config: sparqlEditor is language server agnostic and just receives this worker. + * Unlike qlue-ls, swls speaks length-prefixed LSP frames (`Content-Length` headers), so this + * worker frames outgoing messages and deframes incoming bytes back into JSON-RPC objects. + * + * The WASM is loaded once up front and the worker only signals "ready" afterwards. The host waits + * for that signal before connecting a language client, so the initialize/initialized/didOpen burst + * can't arrive before the server exists (a lazy per-message import races that burst and corrupts + * message ordering, which left semantic-token highlighting unapplied). + */ +class LspMessageSplitter { + private buffer: Uint8Array = new Uint8Array(0); + private readonly asciiDecoder = new TextDecoder("ascii"); + private readonly utf8Decoder = new TextDecoder("utf-8"); + + /** + * Push raw bytes into the splitter. + * Returns zero or more complete LSP message payloads (JSON text). + */ + push(chunk: Uint8Array): string[] { + this.buffer = concat(this.buffer, chunk); + const messages: string[] = []; + while (true) { + const headerEnd = indexOfDoubleCRLF(this.buffer); + if (headerEnd === -1) break; + const headerBytes = this.buffer.subarray(0, headerEnd); + const headerText = this.asciiDecoder.decode(headerBytes); + const match = /Content-Length:\s*(\d+)/i.exec(headerText); + if (!match) { + throw new Error("Invalid LSP header: missing Content-Length"); + } + const contentLength = Number(match[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (this.buffer.length < messageEnd) break; + const messageBytes = this.buffer.subarray(messageStart, messageEnd); + const messageText = this.utf8Decoder.decode(messageBytes); + messages.push(messageText); + // Consume processed bytes + this.buffer = this.buffer.subarray(messageEnd); + } + return messages; + } +} + +/* ----------------- helpers ----------------- */ + +function concat(a: Uint8Array, b: Uint8Array): Uint8Array { + const out = new Uint8Array(a.length + b.length); + out.set(a, 0); + out.set(b, a.length); + return out; +} + +function indexOfDoubleCRLF(buf: Uint8Array): number { + for (let i = 0; i + 3 < buf.length; i++) { + if ( + buf[i] === 13 && // \r + buf[i + 1] === 10 && // \n + buf[i + 2] === 13 && + buf[i + 3] === 10 + ) { + return i; + } + } + return -1; +} + +const encoder = new TextEncoder(); +const deframer = new LspMessageSplitter(); + +/** + * swls logs through this callback as verbose structured (JSON) lines. Surface only WARN/ERROR (and + * anything that isn't a recognizable structured log) so the console isn't flooded with INFO traces. + */ +function logFromSwls(...args: unknown[]) { + const line = args[0]; + if (typeof line === "string") { + try { + const level = JSON.parse(line).level; + if (level === "INFO" || level === "DEBUG" || level === "TRACE") return; + } catch { + // not a structured log line; fall through and print it + } + } + console.log(...args); +} + +(async () => { + const mod = await import("swls-wasm"); + const lsp = new mod.WasmLsp((bytes: Uint8Array) => { + // Language Server -> Language Client: deframe and forward each complete message as JSON. + for (const msg of deframer.push(bytes)) self.postMessage(JSON.parse(msg)); + }, logFromSwls); + + // Language Client -> Language Server: frame as a length-prefixed LSP message. + self.onmessage = (event) => { + const payload = typeof event.data === "string" ? event.data : JSON.stringify(event.data); + // Content-Length is a byte count; the server reads UTF-8 bytes, so measure bytes, not chars. + const framed = `Content-Length: ${encoder.encode(payload).length}\r\n\r\n${payload}`; + lsp.send(framed); + }; + + // Signal to the host that the WASM server is initialized and ready to connect. + self.postMessage({ type: "ready" }); +})(); + +export {}; diff --git a/docs/.vitepress/theme/traqula.worker.ts b/docs/.vitepress/theme/traqula.worker.ts new file mode 100644 index 00000000..16d62d5b --- /dev/null +++ b/docs/.vitepress/theme/traqula.worker.ts @@ -0,0 +1,165 @@ +/** + * Traqula SPARQL 1.2 language server running as a Web Worker. + * + * Consumer-side config: sparqlEditor is language server agnostic and just receives this worker. + * This is a pure-JS parser (no WASM): it runs the @traqula SPARQL 1.2 parser on every document + * change and reports syntax errors as LSP diagnostics. It provides no completions. + */ +import { defaultLexerErrorProvider, defaultParserErrorProvider } from "@traqula/chevrotain"; +import { Parser } from "@traqula/parser-sparql-1-2"; + +interface LspPosition { + line: number; + character: number; +} + +interface LspRange { + start: LspPosition; + end: LspPosition; +} + +interface LspDiagnostic { + range: LspRange; + severity: 1 | 2 | 3 | 4; + message: string; +} + +const lexerErrors: { length: number; line?: number; column?: number; message: string }[] = []; +const parserErrors: { token: any; message: string }[] = []; + +const parser = new Parser({ + lexerConfig: { + positionTracking: "full", + errorMessageProvider: Object.assign({}, defaultLexerErrorProvider, { + buildUnexpectedCharactersMessage( + fullText: string, + startOffset: number, + length: number, + line?: number, + column?: number, + mode?: string, + ): string { + const message = defaultLexerErrorProvider.buildUnexpectedCharactersMessage( + fullText, + startOffset, + length, + line, + column, + mode, + ); + lexerErrors.push({ length, line, column, message }); + return message; + }, + }), + }, + parserConfig: { + errorMessageProvider: Object.assign({}, defaultParserErrorProvider, { + buildMismatchTokenMessage(options: any): string { + const message = defaultParserErrorProvider.buildMismatchTokenMessage(options); + parserErrors.push({ token: options.actual, message }); + return message; + }, + buildNotAllInputParsedMessage(options: any): string { + const message = defaultParserErrorProvider.buildNotAllInputParsedMessage(options); + parserErrors.push({ token: options.firstRedundant, message }); + return message; + }, + buildNoViableAltMessage(options: any): string { + const message = defaultParserErrorProvider.buildNoViableAltMessage(options); + const token = options.actual?.[0] ?? options.previous; + parserErrors.push({ token, message }); + return message; + }, + buildEarlyExitMessage(options: any): string { + const message = defaultParserErrorProvider.buildEarlyExitMessage(options); + const token = options.actual?.[0] ?? options.previous; + parserErrors.push({ token, message }); + return message; + }, + }), + }, +}); + +function tokenToRange(token: any): LspRange { + const startLine = Math.max(0, (token?.startLine ?? 1) - 1); + const startChar = Math.max(0, (token?.startColumn ?? 1) - 1); + const endLine = Math.max(0, (token?.endLine ?? token?.startLine ?? 1) - 1); + // chevrotain endColumn is 1-indexed inclusive; convert to 0-indexed exclusive + const endChar = token?.endColumn ?? startChar + 1; + return { + start: { line: startLine, character: startChar }, + end: { line: endLine, character: endChar }, + }; +} + +function runParser(text: string): LspDiagnostic[] { + lexerErrors.length = 0; + parserErrors.length = 0; + try { + parser.parse(text); + } catch { + // errors already captured by the providers above + } + const diagnostics: LspDiagnostic[] = []; + for (const err of lexerErrors) { + const line = Math.max(0, (err.line ?? 1) - 1); + const character = Math.max(0, (err.column ?? 1) - 1); + diagnostics.push({ + range: { + start: { line, character }, + end: { line, character: character + err.length }, + }, + severity: 1, + message: err.message, + }); + } + for (const err of parserErrors) { + diagnostics.push({ + range: tokenToRange(err.token), + severity: 1, + message: err.message, + }); + } + return diagnostics; +} + +onmessage = function handleIncomingMessage(event: MessageEvent) { + const msg = typeof event.data === "string" ? JSON.parse(event.data) : event.data; + const { id, method, params } = msg; + if (method === "initialize") { + postMessage({ + jsonrpc: "2.0", + id, + result: { + capabilities: { + textDocumentSync: 1, // Full: client always sends complete document text + }, + }, + }); + } else if (method === "textDocument/didOpen") { + const { textDocument } = params; + const diagnostics = runParser(textDocument.text); + postMessage({ + jsonrpc: "2.0", + method: "textDocument/publishDiagnostics", + params: { + uri: textDocument.uri, + diagnostics, + }, + }); + } else if (method === "textDocument/didChange") { + const { textDocument, contentChanges } = params; + const text: string = contentChanges[contentChanges.length - 1].text; + const diagnostics = runParser(text); + postMessage({ + jsonrpc: "2.0", + method: "textDocument/publishDiagnostics", + params: { + uri: textDocument.uri, + diagnostics, + }, + }); + } +}; + +postMessage("ready"); diff --git a/docs/.vitepress/theme/utils.ts b/docs/.vitepress/theme/utils.ts new file mode 100644 index 00000000..e4c47c5a --- /dev/null +++ b/docs/.vitepress/theme/utils.ts @@ -0,0 +1,31 @@ +/// + +/** Default SPARQL endpoint used across the demo pages. */ +export const DEMO_ENDPOINT = "https://sparql.dblp.org/sparql"; + +export type DevTheme = "light" | "dark"; + +/** + * Wire the demo page's light/dark switcher: start from the OS preference, and on toggle set the + * `[data-theme]` attribute (which drives the CSS) and call `onThemeChange` (e.g. editor.setTheme). + */ +export function setupThemeToggle(onThemeChange?: (theme: DevTheme) => void): DevTheme { + let currentTheme: DevTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; + document.documentElement.dataset.theme = currentTheme; + const button = document.getElementById("darkModeToggle"); + const render = () => { + if (!button) return; + button.textContent = currentTheme === "dark" ? "☀️" : "🌙"; + const title = currentTheme === "dark" ? "Switch to light theme" : "Switch to dark theme"; + button.setAttribute("title", title); + button.setAttribute("aria-label", title); + }; + render(); + button?.addEventListener("click", () => { + currentTheme = currentTheme === "dark" ? "light" : "dark"; + document.documentElement.dataset.theme = currentTheme; + render(); + onThemeChange?.(currentTheme); + }); + return currentTheme; +} diff --git a/docs/codemirror.md b/docs/codemirror.md new file mode 100644 index 00000000..f56e93c2 --- /dev/null +++ b/docs/codemirror.md @@ -0,0 +1,11 @@ +--- +layout: page +pageClass: sparql-studio-home +sidebar: false +aside: false +navbar: false +--- + +
+ +
diff --git a/docs/docs/build.md b/docs/docs/build.md new file mode 100644 index 00000000..eb69654c --- /dev/null +++ b/docs/docs/build.md @@ -0,0 +1,68 @@ +# Build from source + +The repository is an npm workspaces monorepo with five packages under `packages/`: `sparql-utils`, `sparql-editor-monaco`, `sparql-editor-codemirror`, `sparql-results` and `sparql-studio`. + +Install: + +```sh +npm i +``` + +Run dev server (`dev/*.html`): + +```sh +npm run dev +``` + +Run tests: + +```sh +npm test +``` + +Build packages: + +```sh +npm run build +``` + +## What the library build emits + +For each package, `build:lib` emits into `packages//build`: + +- ESM (`*.js`), the main entry point. +- CSS (`*.css`). +- TypeScript declarations. +- The editor / language server worker assets. + +::: info Assets bundling +Asset URLs use a relative base (`base: "./"`) so they resolve in any consuming bundler. +::: + +## The documentation website + +This site is built with [VitePress](https://vitepress.dev) from the `docs/` folder: + +Local preview with hot reload: + +```sh +npm run docs:dev +``` + +Build the static site into `docs/.vitepress/dist`: + +```sh +npm run docs:build +``` + +Preview the built site: + +```sh +npm run docs:preview +``` + +One-liner to build and test the docs website: + +```sh +npm run build && npm run docs:build && npm run docs:preview +``` diff --git a/docs/docs/editor-options.md b/docs/docs/editor-options.md new file mode 100644 index 00000000..57b14a4b --- /dev/null +++ b/docs/docs/editor-options.md @@ -0,0 +1,36 @@ +# Monaco editor options + +Pass any [Monaco editor options](https://microsoft.github.io/monaco-editor/typedoc/interfaces/editor.IStandaloneEditorConstructionOptions.html) via `editorOptions`. They are **deep-merged over** the editor defaults. + +```ts +new SparqlEditor(el, { + editorOptions: { + lineNumbers: "off", + wordWrap: "off", + fontSize: 16, + minimap: { enabled: true }, + renderWhitespace: "all", + }, +}); +``` + +Via SPARQL Studio, forward them inside the `editor` factory: + +```ts +new SparqlStudio(el, { + editor: (parent, conf) => new SparqlEditor(parent, { ...conf, editorOptions: { fontSize: 16 } }), +}); +``` + +## Defaults + +The editor's defaults already enable: + +- line numbers +- word wrap +- bracket matching +- code folding +- the VSCode right-click context menu (including **Format Document**) +- semantic highlighting + +You only need `editorOptions` to override these or to enable extra Monaco features. diff --git a/docs/docs/getting-started.md b/docs/docs/getting-started.md new file mode 100644 index 00000000..2becd115 --- /dev/null +++ b/docs/docs/getting-started.md @@ -0,0 +1,146 @@ +# Getting started + +This guide embeds the full SparqlStudio app with the **qlue-ls** language server. If you only +need the editor or the result viewer, see [Editor](./sparql-editor) and [Results](./sparql-results). + +## 1. Install + +```bash +npm install @rdfjs/sparql-studio +``` + +To use the qlue-ls language server, also add it and the Vite WASM plugin to **your app**: + +```bash +npm install qlue-ls +npm install -D vite-plugin-wasm +``` + +The `@rdfjs/*` packages are **self-contained ESM bundles** (Monaco and the language client are bundled in), you do **not** need to install `monaco-editor`. They are **ESM only** (Monaco loads its workers via `import.meta.url`, which UMD can't do), so use a modern bundler (Vite recommended). + +Each package ships its own CSS that you must import once: + +```js +import "@rdfjs/sparql-studio/style.css"; +// or for standalone use: +// import "@rdfjs/sparql-editor-monaco/style.css"; +// import "@rdfjs/sparql-results/style.css"; +``` + +## 2. Bundler setup (Vite) + +Because the qlue-ls worker loads WebAssembly, your app's Vite config needs `vite-plugin-wasm` and ES-module workers: + +```ts +// vite.config.ts +import { defineConfig } from "vite"; +import wasm from "vite-plugin-wasm"; + +export default defineConfig({ + plugins: [wasm()], + worker: { + format: "es", + plugins: () => [wasm()], + }, +}); +``` + +::: info No language server +If you don't use a language server at all, none of this is needed, the editor still does syntax highlighting. +::: + +## 3. Set up the language server + +The language server runs in a **Web Worker**. The qlue-ls backend/settings plumbing ships with the package (the `qlueLs` helpers), so the only file you write is the worker itself, which is also the only file you change to switch to a different SPARQL language server later. You pass that worker straight to the editor: it waits for the worker to signal it is ready, then connects the LSP client for you, so no readiness wrapper is needed. + +See the [Language server](./language-server) page for details, here is the minimal setup: + +```ts [qlue-ls.worker.ts] +// @ts-ignore qlue-ls is loaded as a WASM module via vite-plugin-wasm +import init, { init_language_server, listen } from "qlue-ls?init"; + +init().then(() => { + const input = new TransformStream(); + const output = new TransformStream(); + const reader = output.readable.getReader(); + const writer = input.writable.getWriter(); + + const server = init_language_server(output.writable.getWriter()); + listen(server, input.readable.getReader()); + + // Bridge: language client -> server, and server -> language client. + self.onmessage = (msg) => writer.write(JSON.stringify(msg.data)); + (async () => { + while (true) { + const { value, done } = await reader.read(); + if (done) break; + self.postMessage(JSON.parse(value)); + } + })(); + + // Tell the editor the WASM server is initialized; it waits for this before connecting. + self.postMessage({ type: "ready" }); +}); +export {}; +``` + +## 4. Mount SparqlStudio + +`SparqlStudio` is editor-independent, so you build the editor yourself. Pass the worker instance, the editor waits for its "ready" signal and connects the client. Per-entry hooks `(onReady, onEndpointChange)` fire only while that server is active. + +```ts +import SparqlStudio from "@rdfjs/sparql-studio"; +import SparqlEditor, { qlueLs } from "@rdfjs/sparql-editor-monaco"; +import "@rdfjs/sparql-studio/style.css"; +import QlueLsWorker from "./qlue-ls.worker?worker"; + +const sparqlStudio = new SparqlStudio(document.getElementById("sparqlStudio")!, { + requestConfig: { endpoint: "https://sparql.dblp.org/sparql" }, + editor: (parent, conf) => + new SparqlEditor(parent, { + ...conf, + languageServers: [ + { + label: "Qlue-ls", + worker: () => new QlueLsWorker({ name: "qlue-ls" }), + onReady: (client) => { + qlueLs.configureSettings(client); + qlueLs.configureBackend(client, sparqlStudio?.getTab()?.getEndpoint()); + }, + onEndpointChange: (client, endpoint) => qlueLs.configureBackend(client, endpoint), + }, + ], + }), +}); +``` + +::: tip Offering several servers +Add more entries to `languageServers` to let users switch at runtime; with two or more, a switcher appears (right-click in Monaco, a dropdown in CodeMirror) and the choice is remembered per endpoint. +::: + +::: info CodeMirror instead of Monaco +The factory is also where you choose the editor implementation. To use the CodeMirror 6 editor, import `SparqlEditor` from `@rdfjs/sparql-editor-codemirror` instead. The `languageServers` config is identical, both editors take the same `worker` (Monaco connects a language client to it, CodeMirror builds an `LSPClient` from it internally). See [Language server](./language-server). +::: + +## Framework integration + +`SparqlStudio` is a plain DOM library, so it drops into any framework: mount it into a ref/element on mount and call `destroy()` on unmount. React example: + +```tsx +import { useEffect, useRef } from "react"; +import SparqlStudio from "@rdfjs/sparql-studio"; +import SparqlEditor from "@rdfjs/sparql-editor-monaco"; +import "@rdfjs/sparql-studio/style.css"; + +export function Sparql() { + const el = useRef(null); + useEffect(() => { + const sparqlStudio = new SparqlStudio(el.current!, { + requestConfig: { endpoint: "https://sparql.dblp.org/sparql" }, + editor: (parent, conf) => new SparqlEditor(parent, { ...conf /* + languageServers */ }), + }); + return () => sparqlStudio.destroy(); + }, []); + return
; +} +``` diff --git a/docs/docs/introduction.md b/docs/docs/introduction.md new file mode 100644 index 00000000..511ab43b --- /dev/null +++ b/docs/docs/introduction.md @@ -0,0 +1,58 @@ +# What is SPARQL Studio? + +**SPARQL Studio** is a web-based interface for writing, running and exploring SPARQL queries against any endpoint. + +::: tip Compatible with Yasgui Yasr plugins +It is a fork of [Yasgui](https://github.com/zazuko/Yasgui) and is compatible with all existing Yasr result-view plugins. +::: + +It is built from packages you can use together or independently: + +| Package | npm | What it is | +| --- | --- | --- | +| **Studio** | `@rdfjs/sparql-studio` | The full **app**: tabs, endpoint selector, editor + Yasr wired together | +| **Editor · Monaco** | `@rdfjs/sparql-editor-monaco` | The SPARQL query **editor** (Monaco-based, with optional LSP) | +| **Editor · CodeMirror** | `@rdfjs/sparql-editor-codemirror` | Alternative SPARQL **editor** built on CodeMirror 6 (takes an LSP client) | +| **Results** | `@rdfjs/sparql-results` | The SPARQL **result** viewer (table, response, geo, …) | + +Try it now on the [live demo](/). Then head to [Getting started](./getting-started) to embed it in your own app. + +## 🔑 Key features + +- **Modern query editor** · SPARQL syntax highlighting, smart completions, query formatting, + diagnostics, code actions, hover information, prefix management. +- **User-friendly result viewers** · interactive tables, graph visualizations, geographic maps and a raw + response viewer. +- **Multiple tabs** · work with several queries at once, each with its own endpoint. +- **Light and dark themes** · follows the OS preference, or set it explicitly. +- **Persistent storage** · queries, tabs and results survive a page reload via `localStorage`. +- **Developer friendly** · small ESM packages, an event system and a documented API. + +## ⚡️ Powered by language servers + +SPARQL Studio's features: semantic highlighting, diagnostics, code actions, hover, formatting and completion, all come from a **SPARQL [language server (LSP)](https://microsoft.github.io/language-server-protocol/)**. + +The editors are language server agnostic: you provide a language server and they wire a language client to it, so all server-specific config lives in your app and you can swap servers later. + +The live demo wires up 3 language servers: + +| Language server | Description | Implementation | Completion | Semantic tokens | Author | +| ------------------------------------------------------------ | ------------------------------------------------------------ | -------------- | ---------- | --------------- | ------------------------------------------------- | +| [**qlue-ls**](https://github.com/IoannisNezis/Qlue-ls) | SPARQL language server with endpoint-powered completion and code actions | 🦀 WASM | ✅ | ✅ | [Ioannis Nezis](https://github.com/IoannisNezis/) | +| [**swls**](https://github.com/SemanticWebLanguageServer/swls) | Semantic Web Language Server | 🦀 WASM | | ☑️ | [Arthur Vercruysse](https://github.com/ajuvercr) | +| [**Traqula**](https://github.com/comunica/traqula) | SPARQL 1.2 parser written in JS | 🟨 JS | | | [Jitse De Smet](https://github.com/jitsedesmet) | + +::: info Default syntax highlighting + +When the language server provides no semantic tokens for highlighting, we use a default syntax highlighting (monarch on monaco, lezer on CodeMirror) + +::: + +> See [Language server](./language-server) for how to use language servers. + +## 📝 Two editors to choose from + +SPARQL Studio is editor-independent: you pick the editor when embedding it, and both implement the same interface so they are interchangeable behind the editor factory. + +- **Monaco** (`@rdfjs/sparql-editor-monaco`) · the editor that powers VSCode, more features. +- **CodeMirror 6** (`@rdfjs/sparql-editor-codemirror`) · more lightweight. diff --git a/docs/docs/language-server.md b/docs/docs/language-server.md new file mode 100644 index 00000000..4b3b2e26 --- /dev/null +++ b/docs/docs/language-server.md @@ -0,0 +1,141 @@ +# Language server + +Smart features, completion, diagnostics, hover, formatting and semantic highlighting, come from a **SPARQL language server (LSP)** running in a Web Worker. + +`SparqlEditor` and `SparqlStudio` are language-server **agnostic**: you pass them an LSP `Worker` (or a factory that returns one) and they connect a language client to it for you, waiting until the worker signals it is ready. The same worker works in both editors (Monaco connects a `monaco-languageclient`; CodeMirror builds an `LSPClient` internally). + +The server used throughout this documentation is [**qlue-ls**](https://github.com/IoannisNezis/Qlue-ls), a fast WASM SPARQL language server. `SparqlEditor` ships the qlue-ls plumbing (settings, backend/endpoint registration, prefix discovery, completion-query templates and types) under the `qlueLs` namespace, so the only thing you write yourself is the WASM worker: + +```ts +import { qlueLs } from "@rdfjs/sparql-utils"; +``` + +## The worker + +qlue-ls is distributed as a WASM module; you wrap it in a Web Worker that posts a `ready` message once its WASM is initialized. The editor waits for that signal before connecting the client, so you hand it the worker directly, no readiness wrapper or Promise needed. This is the only qlue-ls specific code you maintain (it depends on the `qlue-ls` package); everything else comes from the `qlueLs` helpers. + +The worker file is the same for both editors, see the copy-paste version in [Getting started · Set up the language server](./getting-started#_3-set-up-the-language-server). The **contract** is all that matters here: post `{ type: "ready" }` once started, then bridge messages both ways between `self` and the WASM server. Any server that honors that contract works. + +## Hooking it up + +Configure one or more servers through the `languageServers` array. Each entry has a `label`, the `worker` (instance or factory) and two optional **per-server** hooks, only the *active* server's hooks fire: + +- `onReady(client, editor)` · runs when that server becomes active (on load or when switched to). Use it to push settings and register the active endpoint as the default backend. +- `onEndpointChange(client, endpoint, editor)` · runs when the endpoint changes while that server is active. Use it to re-register the backend for the new endpoint. + +The first entry is activated on load; with two or more configured, a switcher appears (right-click the editor in Monaco, a dropdown in CodeMirror) and the user's choice is remembered per endpoint. + + ```ts [main.ts] + import SparqlStudio from "@rdfjs/sparql-studio"; + import SparqlEditor, { qlueLs } from "@rdfjs/sparql-editor-monaco"; + import QlueLsWorker from "./qlue-ls.worker?worker"; + + new SparqlStudio(el, { + // SparqlStudio is editor-independent: pass an editor factory and list the servers in the editor. + editor: (parent, conf) => + new SparqlEditor(parent, { + ...conf, + languageServers: [ + { + label: "Qlue-ls", + description: "SPARQL language server with endpoint-powered completions", + worker: () => new QlueLsWorker({ name: "qlue-ls" }), + onReady: (client) => { + qlueLs.configureSettings(client); + qlueLs.configureBackend(client, sparqlStudio?.getTab()?.getEndpoint()); + }, + onEndpointChange: (client, endpoint) => qlueLs.configureBackend(client, endpoint), + }, + ], + }), + }); + ``` + +Standalone **SparqlEditor** takes the identical `languageServers` array (it is the editor's own option), the per-server `onReady` and `onEndpointChange` carry the setup, except you trigger the latter yourself with `sparqlEditor.notifyEndpointChange(endpoint)` since there is no SparqlStudio to call it. See [SPARQL Editor](./sparql-editor) for the standalone example. + +::: warning Per-server vs SparqlStudio-level +The per-server `onEndpointChange` only fires for the active server, so each server handles endpoints its own way. SparqlStudio still has a top-level `onEndpointChange(sparqlStudio, endpoint)` for app-wide, server-independent work (analytics, UI). Both fire. +::: + +`qlueLs.configureBackend` is safe to call repeatedly (it skips re-registering the same endpoint on the same client). `sparqlEditor.getLanguageClient()` returns the active `monaco-languageclient`, so you can also send any other LSP request or custom notification yourself. + +::: tip Offering several servers +List more than one entry to let users switch at runtime (e.g. qlue-ls for QLever endpoints, another server for large Virtuoso ones). Each entry's `worker` is resolved lazily the first time it is activated, so unused servers are never started. The reserved `configSchema` / `configCallback` fields are placeholders for a future generic config UI and are not yet implemented. +::: + +## The `qlueLs` helpers + +| export | what it does | +| --- | --- | +| `configureBackend(client, endpoint, options?)` | register `endpoint` as the **default** backend so completions resolve against it. Fetches the endpoint's prefixes when none are passed, and uses `defaultCompletionQueries` for term completion. | +| `configureSettings(client, settings?)` | push server settings (formatting, completion, prefix handling). Defaults to `defaultSettings`. | +| `createBackendConf(endpoint, options?)` | build a `BackendConfiguration` (fetching prefixes when not provided) without sending it. | +| `fetchPrefixMap(endpoint)` | query the endpoint for `sh:prefix` / `sh:namespace` declarations, falling back to `fallbackPrefixMap`. | +| `defaultSettings`, `fallbackPrefixMap`, `defaultCompletionQueries` | sensible defaults you can spread/override. | + +`BackendOptions` lets you override pieces without rebuilding the config by hand: + +```ts +qlueLs.configureBackend(lc, endpoint, { + prefixMap: { rdf: "http://www.w3.org/1999/02/22-rdf-syntax-ns#", ...qlueLs.fallbackPrefixMap }, + queries: qlueLs.defaultCompletionQueries, // or your own CompletionTemplate map + engine: "QLever", +}); +``` + +### The backend object + +The qlue-ls `BackendConfiguration` (what `createBackendConf` builds) is flat and camelCase: + +| field | required | meaning | +| --- | --- | --- | +| `name` | yes | backend identifier / label | +| `url` | yes | SPARQL endpoint URL | +| `default` | — | whether it is the default backend | +| `prefixMap` | — | `{ prefix: namespace }` used for prefix completion | +| `queries` | — | completion-query templates, keyed by qlue-ls `CompletionTemplate` (`subjectCompletion`, `predicateCompletionContextSensitive`, `objectCompletionContextSensitive`, …). Needed for **term** completion. An empty object still gives prefix/keyword completion. | +| `engine`, `requestMethod`, `healthCheckUrl` | — | optional | + +::: tip Auto-discovering prefixes +`configureBackend` / `createBackendConf` call `fetchPrefixMap` for you when you don't pass a `prefixMap`: many endpoints expose their prefixes via `sh:namespace` / `sh:prefix`, and `qlueLs` falls back to `fallbackPrefixMap` (a broad set of common vocab prefixes) when none are returned. +::: + +## CodeMirror editor (`@rdfjs/sparql-editor-codemirror`) + +The Monaco editor (`@rdfjs/sparql-editor-monaco`) is the default, but SparqlStudio is editor-independent: you can build the editor factory around the CodeMirror 6 editor instead. The `languageServers` config is **identical**, same `worker` field, same `qlueLs` helpers (they operate on the editor-agnostic connection passed to `onReady` / `onEndpointChange`). The only change is the editor import; CodeMirror builds the `@codemirror/lsp-client` `LSPClient` from your worker internally: + +```ts +import SparqlStudio from "@rdfjs/sparql-studio"; +import SparqlEditor from "@rdfjs/sparql-editor-codemirror"; +import { qlueLs } from "@rdfjs/sparql-utils"; +import QlueLsWorker from "./qlue-ls.worker?worker"; + +new SparqlStudio(el, { + requestConfig: { endpoint }, + editor: (parent, conf) => + new SparqlEditor(parent, { + ...conf, + languageServers: [ + { + label: "Qlue-ls", + worker: () => new QlueLsWorker({ name: "qlue-ls" }), + onReady: (conn) => qlueLs.configureBackend(conn, sparqlStudio?.getTab()?.getEndpoint()), + onEndpointChange: (conn, endpoint) => qlueLs.configureBackend(conn, endpoint), + }, + ], + }), +}); +``` + +With two or more entries the editor shows a labelled switcher dropdown in its toolbar (left of the +format/share/run buttons). See `dev/codemirror.html` in the repo for the full reference wiring. + +## Using a different language server + +SparqlEditor and SparqlStudio only need an LSP `Worker` (the same field for both editors). The `qlueLs` helpers are a convenience for qlue-ls; they are not required. To use, for example, [swls](https://github.com/SemanticWebLanguageServer/swls) instead: + +1. Replace `qlue-ls.worker.ts` with that server's worker (it must post a `ready` message once started). +2. Add it as another `languageServers` entry (its own `worker`), alongside or instead of qlue-ls. +3. In that entry's `onReady` / `onEndpointChange`, send whatever that server needs to target an endpoint (its own custom requests) on the connection you receive. + +No changes to the `@rdfjs/*` packages are required. diff --git a/docs/docs/plugins.md b/docs/docs/plugins.md new file mode 100644 index 00000000..6882477a --- /dev/null +++ b/docs/docs/plugins.md @@ -0,0 +1,271 @@ +# Yasr plugins + +Yasr renders a SPARQL response through one of several plugins. The right plugin is picked automatically from the query type (`SELECT`, `ASK`, `CONSTRUCT`, `DESCRIBE`), the response content type and the data structure, but you can switch manually with the tabs above the result area. Your choice is kept per tab. + +The **Table**, **Boolean**, **Response** and **Error** plugins are built in. **Graph** and **Geo** are community plugins registered by the demo (see [Yasr](./sparql-results#result-view-plugins)). + +## Configuring plugins + +Plugins are configured through the `results` slot of the SparqlStudio config. Three options control which plugins are available and how they are ordered: + +```ts +import SparqlStudio from '@rdfjs/sparql-studio'; +import '@rdfjs/sparql-studio/style.css'; + +const sparqlStudio = new SparqlStudio(document.getElementById('sparqlStudio'), { + results: { + // Tab order in the result area (plugins not listed are appended alphabetically) + pluginOrder: ['table', 'response'], + // Plugin selected when no better match is found for a response + defaultPlugin: 'table', + // Per-plugin configuration, keyed by the name used at registration + plugins: { + table: { + enabled: true, + // Initial values for the plugin's own settings (also adjustable in the UI) + dynamicConfig: { pageSize: 50, compact: false }, + }, + response: { + enabled: true, + dynamicConfig: { maxLines: 60 }, + }, + // Disable a built-in plugin entirely + boolean: { enabled: false }, + }, + }, +}); +``` + +Notes: + +- The key in `plugins` is the name passed to `SparqlStudio.Results.registerPlugin(name, …)` (`table`, `response`, `boolean`, plus any community plugins you register). +- `dynamicConfig` seeds the plugin's per-tab settings. Values the user later changes through the plugin UI are persisted to `localStorage` and take precedence on the next load. +- Defaults: `pluginOrder` is `['table', 'response']` and `defaultPlugin` is `'table'`. + +## Table + +Renders `SELECT` results as an interactive table: sortable columns, real-time search filtering, virtual scrolling for large result sets, and cell selection with copy to clipboard (Markdown, CSV, TSV). + +```sparql +SELECT ?item ?itemLabel WHERE { + ?item wdt:P31 wd:Q146 . + SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } +} LIMIT 100 +``` + +Config (`results.plugins.table.dynamicConfig`): + +| Option | Type | Default | Description | +|---|---|---|---| +| `pageSize` | `number` | `50` | Rows shown per page. | +| `compact` | `boolean` | `false` | Compact rendering: hide the first index column and collapse IRI brackets. | +| `isEllipsed` | `boolean` | `true` | Truncate long cell values with an ellipsis (expand on click). | + +```ts +const sparqlStudio = new SparqlStudio(document.getElementById('sparqlStudio'), { + results: { + plugins: { + table: { dynamicConfig: { pageSize: 100, compact: true } }, + }, + }, +}); +``` + +## Boolean + +Shows the outcome of an `ASK` query as a clear, color-coded `TRUE` (green) or `FALSE` (red). + +```sparql +ASK { wd:Q42 wdt:P31 wd:Q5 } +``` + +## Response + +Shows the raw endpoint response with syntax highlighting (JSON, XML, Turtle…), line numbers, code folding and copy to clipboard. Useful for debugging and inspecting the exact payload returned by the endpoint. + +```sparql +SELECT * WHERE { ?s ?p ?o } LIMIT 10 +``` + +Config (`results.plugins.response.dynamicConfig`): + +| Option | Type | Default | Description | +|---|---|---|---| +| `maxLines` | `number` | `30` | Maximum number of lines rendered before the output is truncated (the full payload is still available via copy/download). | + +```ts +const sparqlStudio = new SparqlStudio(document.getElementById('sparqlStudio'), { + results: { + plugins: { + response: { dynamicConfig: { maxLines: 100 } }, + }, + }, +}); +``` + +## Geo + +::: warning External plugin +[`yasgui-geo-tg`](https://github.com/Thib-G/yasgui-geo-tg) +::: + +Displays geographic results on an interactive [Leaflet](https://leafletjs.com/) map. It reads WKT (`geo:wktLiteral`), GeoJSON, GML and GeoHash literals, and also auto-detects `?lat` / `?lon` numeric columns without WKT. Includes multiple basemaps, drawing tools that generate spatial SPARQL filters, a time slider for temporal data, and export to GeoJSON, KML, CSV and PNG. + +Integrate it: + +Register the plugin (under the name `geo`) **before** constructing SparqlStudio, then add it to `pluginOrder`: + +```ts +import SparqlStudio from '@rdfjs/sparql-studio'; +import GeoPlugin from 'yasgui-geo-tg'; + +SparqlStudio.Results.registerPlugin('geo', GeoPlugin); + +const sparqlStudio = new SparqlStudio(document.getElementById('sparqlStudio'), { + results: { + pluginOrder: ['table', 'response', 'geo'], + defaultPlugin: 'geo', + }, +}); +``` + +The map controls (basemap, color, clustering, export, drawing, time slider…) are driven from the plugin UI; there are no programmatic config options to pass through `results.plugins.geo`. + +Examples queries: + +```sparql +PREFIX geo: +SELECT * WHERE { + VALUES (?wktLabel ?lat ?lon ?wktColor) { + ("Geneva" 46.2044 6.1432 "blue") + ("Lausanne" 46.5197 6.6323 "red") + ("Sion" 46.2297 7.3597 "green") + } + BIND (STRDT(CONCAT("POINT(", STR(?lon), " ", STR(?lat), ")"),geo:wktLiteral) AS ?point_no_crs_defined) + BIND (STRDT(CONCAT("SRID=4326;POINT(", STR(?lon), " ", STR(?lat), ")"),geo:wktLiteral) AS ?point_ewkt_4326) + BIND (STRDT(CONCAT(" POINT(", STR(?lat), " ", STR(?lon), ")"),geo:wktLiteral) AS ?point_opengis_4326) + BIND (?wktLabel AS ?wktTooltip) +} +``` + +```sparql +PREFIX geo: +SELECT ?feature ?wkt WHERE { + ?feature geo:hasGeometry/geo:asWKT ?wkt . +} LIMIT 500 +``` + +## Graph + +::: warning External plugin +[`@matdata/yasgui-graph-plugin`](https://github.com/Matdata-eu/yasgui-graph-plugin) +::: + +Renders `CONSTRUCT` / `DESCRIBE` results as an interactive node-edge graph with a force-directed layout. URIs, literals and blank nodes are color-coded, double-click a node to expand it with a `DESCRIBE` query, and use compact mode to hide literals and class nodes. + +Integrate it: + +```ts +import SparqlStudio from '@rdfjs/sparql-studio'; +import GraphPlugin from '@matdata/yasgui-graph-plugin'; + +SparqlStudio.Results.registerPlugin('graph', GraphPlugin); + +const sparqlStudio = new SparqlStudio(document.getElementById('sparqlStudio'), { + results: { + pluginOrder: ['table', 'response', 'graph'], + }, +}); +``` + +Graph settings (compact mode, edge style, node size…) are adjustable from the plugin's ⚙ panel and persisted to `localStorage`. To change the defaults, subclass the plugin and register your variant: + +```ts +class MyGraphPlugin extends GraphPlugin { + constructor(sparqlResults) { + super(sparqlResults); + this.settings.compactMode = true; // hide literal/class nodes (default: false) + this.settings.edgeStyle = 'straight'; // 'curved' | 'straight' (default: 'curved') + this.settings.nodeSize = 'large'; // 'small' | 'medium' | 'large' (default: 'medium') + this.settings.predicateDisplay = 'label';// 'label' | 'icon' | 'hidden' (default: 'icon') + this.settings.physicsEnabled = false; // disable force-directed layout (default: true) + this.settings.showNodeLabels = true; // display node labels (default: true) + } +} + +SparqlStudio.Results.registerPlugin('graph', MyGraphPlugin); +``` + +Example query: + +```sparql +PREFIX ex: +CONSTRUCT { + ?s ex:knows ?o . + ?s rdfs:label ?label . +} +WHERE { + ?s ex:knows ?o . + ?s rdfs:label ?label . +} +``` + +## Error + +Appears automatically when a query fails. Shows detailed error messages, HTTP status codes, SPARQL endpoint errors and CORS troubleshooting guidance for network errors, syntax problems or an unavailable endpoint. + +## Writing a plugin + +A plugin is a class that implements the `Plugin` interface and renders into the result area. Register it with `SparqlStudio.Results.registerPlugin(name, PluginClass)` **before** creating the app. The constructor receives the `SparqlResults` instance; render into `this.results.resultsEl`. + +```ts +import SparqlStudio from "@rdfjs/sparql-studio"; +import type { Plugin } from "@rdfjs/sparql-results"; + +class BooleanPlugin implements Plugin { + // Higher wins when several plugins can handle the same response. + priority = 10; + // Hide it from the plugin tabs (it is auto-selected via canHandleResults instead). + hideFromSelection = true; + + constructor(private results: InstanceType) {} + + // Required: can this plugin render the current response? + canHandleResults() { + return typeof this.results.results?.getBoolean?.() === "boolean"; + } + + // Required: render into the results element. + draw() { + const el = document.createElement("div"); + el.textContent = this.results.results?.getBoolean() ? "True" : "False"; + this.results.resultsEl.appendChild(el); + } + + // Required: a tab/selection icon (an SVG element renders best). + getIcon() { + const icon = document.createElement("span"); + icon.textContent = "✓/✗"; + return icon; + } +} + +SparqlStudio.Results.registerPlugin("myBoolean", BooleanPlugin); +``` + +### The `Plugin` interface + +| member | required | purpose | +| --- | --- | --- | +| `priority` | yes | when multiple plugins return `true` from `canHandleResults()`, the highest priority is auto-selected | +| `canHandleResults()` | yes | whether this plugin can render the current `results` | +| `draw(persistentConfig?, runtimeConfig?)` | yes | render into `this.results.resultsEl` (may be async) | +| `getIcon()` | yes | the `Element` shown on the plugin's selection tab | +| `hideFromSelection` | — | hide the selection tab (e.g. auto-only plugins like Boolean/Error) | +| `label` | — | display name on the tab (defaults to the registered name) | +| `options` | — | the plugin's settings object, seeded from `dynamicConfig` | +| `initialize()` / `destroy()` | — | async setup / teardown hooks | +| `download(filename?)` | — | return a `DownloadInfo` (`{ contentType, getData, filename, title }`) to enable the download button | +| `helpReference` | — | URL shown as a help link for the plugin | + +The parsed response is on `this.results.results` (a `Parser`): `getBoolean()`, `getBindings()`, `getVariables()`, the content type, etc. See the built-in [table](https://github.com/rdfjs/Yasgui/tree/main/packages/sparql-results/src/plugins/table) and [boolean](https://github.com/rdfjs/Yasgui/tree/main/packages/sparql-results/src/plugins/boolean) plugins for full references. diff --git a/docs/docs/request-config.md b/docs/docs/request-config.md new file mode 100644 index 00000000..c6f27b26 --- /dev/null +++ b/docs/docs/request-config.md @@ -0,0 +1,33 @@ +# Request configuration + +`requestConfig` controls how queries are sent to the endpoint. It is accepted by both [SparqlEditor](./sparql-editor) and [SparqlStudio](./sparql-studio) (where it sets the default for every tab). + +Every field may be a value **or** a `(sparqlEditor) => value` function, so you can compute it per request. + +```ts +new SparqlStudio(el, { + requestConfig: { + endpoint: "https://sparql.dblp.org/sparql", + method: "POST", + headers: () => ({ Authorization: `Bearer ${getToken()}` }), + withCredentials: false, + }, +}); +``` + +| field | default | description | +| --- | --- | --- | +| `endpoint` | — | SPARQL endpoint URL | +| `method` | `"POST"` | `"GET"` or `"POST"` | +| `acceptHeaderSelect` | `application/sparql-results+json,*/*;q=0.9` | accept header for `SELECT` / `ASK` | +| `acceptHeaderGraph` | `application/n-triples,*/*;q=0.9` | accept header for `CONSTRUCT` / `DESCRIBE` | +| `acceptHeaderUpdate` | `text/plain,*/*;q=0.9` | accept header for updates | +| `namedGraphs` / `defaultGraphs` | `[]` | graph URIs | +| `args` | `[]` | extra `{ name, value }` request args | +| `headers` | `{}` | extra HTTP headers | +| `withCredentials` | `false` | send credentials (cookies) with the request | +| `adjustQueryBeforeRequest` | `false` | `(sparqlEditor) => string` to rewrite the query before sending | + +::: tip CORS +If the endpoint does not return CORS headers, set a `corsProxy` on SparqlStudio rather than fighting the request config. See [SparqlStudio · CORS](./sparql-studio#cors). +::: diff --git a/docs/docs/sparql-editor.md b/docs/docs/sparql-editor.md new file mode 100644 index 00000000..2c0aa675 --- /dev/null +++ b/docs/docs/sparql-editor.md @@ -0,0 +1,107 @@ +# SPARQL Editor + +::: info Previously Yasqe + +The editor began as Yasqe. Its CSS classes has been updated: `.yasqe*` -> `.sparql-editor*`. + +::: + +`@rdfjs/sparql-editor-monaco` is the SPARQL query editor on its own, the Monaco editor plus an optional language client. Use it when you want only the editor, without tabs or the result viewer. + +```ts +import SparqlEditor, { qlueLs } from "@rdfjs/sparql-editor-monaco"; +import "@rdfjs/sparql-editor-monaco/style.css"; +import QlueLsWorker from "./qlue-ls.worker?worker"; + +const endpoint = "https://sparql.dblp.org/sparql"; +const editor = new SparqlEditor(document.getElementById("yasqe")!, { + value: "SELECT * WHERE { ?s ?p ?o } LIMIT 10", + requestConfig: { endpoint }, + languageServers: [ + { + label: "Qlue-ls", + worker: () => new QlueLsWorker({ name: "qlue-ls" }), + onReady: (client) => { + qlueLs.configureSettings(client); + qlueLs.configureBackend(client, endpoint); + }, + // Per-server, fires only while this server is active; trigger it with notifyEndpointChange(). + onEndpointChange: (client, endpoint) => qlueLs.configureBackend(client, endpoint), + }, + ], +}); + +editor.on("query", (editor, req) => console.log("running", req)); +editor.on("queryResponse", (yasqe, response, duration) => console.log(response, duration)); +``` + +With an empty `languageServers`, Yasqe still works as a syntax-highlighted editor, you just don't get completion, diagnostics or formatting. The `languageServers` array, its per-server `onReady` / `onEndpointChange` hooks, the runtime switcher and helpers like `getLanguageClient()` / `setLanguageServer()` / `notifyEndpointChange()` are all covered in [Language server](./language-server), this is the same config the full app uses. + +::: warning Events are instance-first +Editor events are emitted **instance-first**, handlers receive `(yasqeInstance, ...payload)`. For example `queryResponse` is `(yasqe, response, duration)`. +::: + +## Common config + +| option | description | +| --- | --- | +| `value` | initial query string | +| `theme` | `"light"` / `"dark"` (defaults to the OS preference) | +| `editorOptions` | [Monaco options](./editor-options), deep-merged over the defaults | +| `requestConfig` | how queries are sent, see [Request configuration](./request-config) | +| `editorHeight` | initial editor height (e.g. `"300px"`) | +| `resizeable` | whether the editor can be resized | +| `showQueryButton` | show the run button | +| `persistenceId` | localStorage namespace | +| `languageServers` | array of language servers (`{ label, description?, worker, onReady?, onEndpointChange? }`); empty for highlighting-only. The first is activated on load; 2+ adds a switcher. The `onReady`/`onEndpointChange` hooks fire only for the active server | + +## Programmatic API + +```ts +editor.getValue(); // current query string +editor.setValue("SELECT * WHERE { ?s ?p ?o }"); +await editor.query(); // run the query (uses requestConfig) +editor.abortQuery(); +editor.getQueryType(); // "SELECT" | "ASK" | "CONSTRUCT" | "DESCRIBE" | ... +editor.getQueryMode(); // "query" | "update" +editor.getPrefixesFromQuery(); // { prefix: namespace } parsed from the query +editor.getAsCurlString(); // the current query as a curl command +editor.setTheme("dark"); +editor.focus(); + +// Language servers (see Language server page) +editor.getLanguageClient(); // active monaco-languageclient (or undefined) +editor.getLanguageServers(); // [{ label, description? }] +editor.getActiveLanguageServer(); // active index +await editor.setLanguageServer("Qlue-ls"); // by label or index +editor.notifyEndpointChange(endpoint); // re-fire the active server's onEndpointChange +``` + +## Events + +Handlers are **instance-first**: `(editor, ...payload)`. + +| event | payload | fires when | +| --- | --- | --- | +| `query` | `(editor, req, abortController?)` | a query starts | +| `queryResponse` | `(editor, response, duration)` | a response arrives | +| `queryAbort` | `(editor, req)` | a query is aborted | +| `error` | `(editor)` | a query errors | +| `resize` | `(editor, newSize)` | the editor is resized | +| `languageServerChange` | `(editor, def, index)` | the active language server changes | +| `blur` | `(editor)` | the editor loses focus | + +```ts +editor.on("queryResponse", (editor, response, duration) => console.log(response, duration)); +``` + +## Keyboard shortcuts + +On top of all the standard [Monaco / VS Code](https://code.visualstudio.com/docs/getstarted/keybindings) bindings (multi-cursor, `Ctrl/Cmd + /` to toggle comments, **Format Document** from the right-click menu, …), the editor adds: + +| shortcut | action | +| --- | --- | +| `Ctrl/Cmd + Enter` | run the query | +| `Ctrl/Cmd + S` | share the query (copies a shareable URL; does not trigger the browser save dialog) | + +Both also appear at the top of the editor's right-click context menu. diff --git a/docs/docs/sparql-results.md b/docs/docs/sparql-results.md new file mode 100644 index 00000000..4cbf497c --- /dev/null +++ b/docs/docs/sparql-results.md @@ -0,0 +1,80 @@ +# SPARQL Results + +::: info Formerly Yasr + +The viewer began as Yasr. It keeps compatibility with existing Yasr plugins, but its CSS classes has been updated: `.yasr*` -> `.sparql-results*` + +::: + +`@rdfjs/sparql-results` renders a SPARQL response, as a table, raw response, graph or map. Use it standalone when you have results from anywhere and want SparqlStudio's viewer without the editor. + +Wire it to a [SparqlEditor](./sparql-editor) instance (or feed it a response from any source): + +```ts +import SparqlEditor from "@rdfjs/sparql-editor-monaco"; +import SparqlResults from "@rdfjs/sparql-results"; +import "@rdfjs/sparql-editor-monaco/style.css"; +import "@rdfjs/sparql-results/style.css"; + +const editor = new SparqlEditor(document.getElementById("yasqe")!, { + requestConfig: { endpoint: "https://sparql.dblp.org/sparql" }, +}); +const results = new SparqlResults(document.getElementById("sparqlResults")!, { + // resolve prefixed names in results using the query's PREFIX declarations + prefixes: () => editor.getPrefixesFromQuery(), +}); + +// queryResponse is emitted instance-first: (yasqe, response, duration) +editor.on("queryResponse", (editor, response, duration) => { + results.setResponse(response, duration); +}); +``` + +## Feeding a response directly + +You don't need SparqlEditor at all, `setResponse` accepts any SPARQL JSON / response object: + +```ts +const results = new SparqlResults(document.getElementById("sparqlResults")!); +results.setResponse(sparqlResultsJson); +``` + +## Programmatic API + +```ts +results.setResponse(response, duration); // parse + render a response +results.selectPlugin("response"); // switch the active plugin by name +results.getSelectedPluginName(); // current plugin name +results.draw(); // re-render with the current plugin +results.download(); // download the current view (if supported) +results.somethingDrawn(); // whether a result is currently rendered +results.results; // the parsed response (Parser): getBindings(), getVariables(), getBoolean(), … +``` + +## Events + +Handlers are **instance-first**: `(results, ...payload)`. + +| event | payload | fires when | +| --- | --- | --- | +| `draw` | `(results, plugin)` | just before a plugin renders | +| `drawn` | `(results, plugin)` | after a plugin finishes rendering | +| `change` | `(results)` | the response or settings change | + +```ts +results.on("drawn", (results, plugin) => console.log("rendered with", plugin)); +``` + +## Result-view plugins + +Yasr picks a sensible plugin based on the response (a table for `SELECT`, a boolean for `ASK`, etc.) and users switch with the tabs above the result area. Built in are **Table**, **Response**, **Boolean** and **Error**; **Graph** and **Geo** are community plugins you register before creating the app: + +```ts +import GraphPlugin from "@matdata/yasgui-graph-plugin"; +import GeoPlugin from "yasgui-geo-tg"; + +SparqlStudio.Results.registerPlugin("Graph", GraphPlugin); +SparqlStudio.Results.registerPlugin("Geo", GeoPlugin); +``` + +See [Results plugins](./plugins) for each plugin's config, example queries and how to register your own. diff --git a/docs/docs/sparql-studio.md b/docs/docs/sparql-studio.md new file mode 100644 index 00000000..758a0639 --- /dev/null +++ b/docs/docs/sparql-studio.md @@ -0,0 +1,121 @@ +# SPARQL Studio + +::: info Formerly Yasgui + +SPARQL Studio is a fork of [Yasgui](https://github.com/zazuko/Yasgui). Its CSS classes has been updated: `.yasgui*` -> `.sparql-studio*`. + +::: + +`@rdfjs/sparql-studio` is the complete app: query tabs, an endpoint selector, and SparqlEditor + SparqlResults wired together. [Getting started](./getting-started) walks through mounting it end to end (including the language server worker); this page is the configuration reference. + +## The editor factory + +SparqlStudio is **editor-independent**: instead of an editor config object, you pass a factory `(parent, conf) => IEditor` that builds the editor. `conf` is the per-tab config SparqlStudio prepares (value, requestConfig, …); spread it, then add your own options: + +```ts +import SparqlStudio from "@rdfjs/sparql-studio"; +import SparqlEditor from "@rdfjs/sparql-editor-monaco"; +import "@rdfjs/sparql-studio/style.css"; + +const sparqlStudio = new SparqlStudio(document.getElementById("sparqlStudio")!, { + requestConfig: { endpoint: "https://sparql.dblp.org/sparql" }, + editor: (parent, conf) => new SparqlEditor(parent, { ...conf /* + languageServers, theme, … */ }), +}); +``` + +The factory is where you choose the editor implementation (Monaco `@rdfjs/sparql-editor-monaco` or CodeMirror `@rdfjs/sparql-editor-codemirror`) and list its [language servers](./language-server), theme and [editor options](./editor-options). `sparqlStudio.editor.getLanguageClient()` returns the active language client so you can send any LSP request. With two or more `languageServers`, a switcher lets users pick one and SparqlStudio remembers the choice **per endpoint**. + +## Configuration + +| option | type | description | +| --- | --- | --- | +| `requestConfig` | `RequestConfig` | default endpoint & request settings (see [Request configuration](./request-config)) | +| `onEndpointChange` | `(client, endpoint) => void` | called when the active endpoint changes | +| `editor` | `SparqlEditorFactory` = `(parent, conf) => IEditor` | editor factory: build the editor (Monaco `@rdfjs/sparql-editor-monaco` or CodeMirror `@rdfjs/sparql-editor-codemirror`) and wire in its LSP, theme, etc. | +| `results` | `Partial` | result-viewer config | +| `corsProxy` | `string` | optional CORS proxy URL | +| `persistenceId` | `string \| fn \| null` | localStorage namespace; `null` disables persistence | + +## Programmatic API + +SparqlStudio works in tabs; each tab owns its query, endpoint, editor and results. Drive it after construction: + +```ts +const sparqlStudio = new SparqlStudio(el, { requestConfig: { endpoint } }); + +// Tabs +const tab = sparqlStudio.addTab(true, { ...SparqlStudio.Tab.getDefaults(), name: "My query" }); // true = make active +sparqlStudio.getTab(); // the active tab (or a tab id: getTab("tab_id")) +sparqlStudio.getActiveTab(); + +// Drive the active tab +tab.setQuery("SELECT * WHERE { ?s ?p ?o } LIMIT 10"); +tab.setEndpoint("https://dbpedia.org/sparql"); +await tab.query(); // run it +tab.getEditor(); // the IEditor for this tab (see SPARQL Editor API) +tab.getResults(); // the SparqlResults instance +tab.close(); +``` + +## Events + +SparqlStudio extends an event emitter; handlers are **instance-first** (`(sparqlStudio, …)`). + +| event | payload | fires when | +| --- | --- | --- | +| `query` | `(sparqlStudio, tab)` | a query starts | +| `queryResponse` | `(sparqlStudio, tab)` | a response arrives | +| `queryAbort` | `(sparqlStudio, tab)` | a running query is aborted | +| `tabSelect` | `(sparqlStudio, tabId)` | the active tab changes | +| `tabAdd` | `(sparqlStudio, tabId)` | a tab is added | +| `tabClose` | `(sparqlStudio, tab)` | a tab is closed | +| `endpointHistoryChange` | `(sparqlStudio, history)` | the endpoint history changes | + +```ts +sparqlStudio.on("queryResponse", (sparqlStudio, tab) => console.log(tab.getResults()?.results)); +``` + +## Endpoint catalogue + +The endpoint selector can suggest endpoints from a catalogue you supply via `endpointCatalogueOptions`: + +```ts +new SparqlStudio(el, { + endpointCatalogueOptions: { + getData: () => [ + { endpoint: "https://sparql.dblp.org/sparql" }, + { endpoint: "https://query.wikidata.org/sparql", label: "Wikidata" }, + ], + keys: ["label"], // extra fields to match on besides `endpoint` + renderItem: (data, source) => { + const div = document.createElement("div"); + div.textContent = data.value.label ?? data.value.endpoint; + source.appendChild(div); + }, + }, +}); +``` + +Each item must have an `endpoint` string; add any other fields and list the searchable ones in `keys`. + +::: tip Locking to a single endpoint +To hide the selector entirely (fixed endpoint), set the endpoint in `requestConfig` and hide the selector with CSS: `.sparql-studio .autocompleteWrapper { display: none !important; }`. +::: + +## CORS + +Public endpoints usually send the right CORS headers. For endpoints that don't, set a `corsProxy`: + +```ts +new SparqlStudio(el, { corsProxy: "https://corsproxy.example/?" }); +``` + +The proxy URL is prepended to the request URL. + +## Persistence + +By default SparqlStudio persists tabs, queries and the last results to `localStorage` under a namespace derived from the container element id. Pass `persistenceId: null` to disable persistence, or a string / function to control the namespace. + +## Sharing queries + +The editor's **share** action (`Ctrl/Cmd + S`, or the share button) produces a URL that encodes the current query and view settings, no server needed. When SparqlStudio loads with such a URL it restores that query into a tab (`populateFromUrl`, on by default). Build the link yourself with `tab.getShareableLink()`. Disable URL restoring with `populateFromUrl: false`. diff --git a/docs/docs/theming.md b/docs/docs/theming.md new file mode 100644 index 00000000..ab87f1ff --- /dev/null +++ b/docs/docs/theming.md @@ -0,0 +1,33 @@ +# Theming + +SparqlStudio supports light and dark themes through two layers, both following standard mechanisms: + +1. **The Monaco editor**, set via `theme: "light" | "dark"` in config, or at runtime with + `yasqe.setTheme("dark")`. The default follows the OS `prefers-color-scheme`. +2. **The surrounding chrome CSS** (buttons, tabs, result table), driven by a `data-theme` attribute + on `` **and** the OS preference. `setTheme()` sets `document.documentElement.dataset.theme`. + +The built-in CSS auto-adapts to dark mode: + +- `@media (prefers-color-scheme: dark)`, follows the OS automatically. +- `html[data-theme="dark"]`, explicit opt-in; `html[data-theme="light"]` forces light. + +## A minimal app-level toggle + +```ts +function setTheme(theme: "light" | "dark") { + document.documentElement.dataset.theme = theme; // drives the chrome CSS + sparqlStudio.editor?.setTheme(theme); // drives the Monaco editor +} +``` + +Set the initial theme from the OS preference: + +```ts +const initial = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; +setTheme(initial); +``` + +::: info Integrating with a framework dark mode +If your app already has a dark-mode switch (Tailwind, VitePress, etc.), just call both lines from its change handler. The [live demo](/) wires SparqlStudio's theme to VitePress' own dark-mode toggle this way. +::: diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..ebf39027 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,26 @@ +--- +layout: page +# title: SparqlStudio · SPARQL query editor +pageClass: sparql-studio-home +sidebar: false +aside: false +navbar: false +--- + + + +
+ +
diff --git a/docs/public/CNAME b/docs/public/CNAME new file mode 100644 index 00000000..a68e7661 --- /dev/null +++ b/docs/public/CNAME @@ -0,0 +1 @@ +sparql.studio diff --git a/docs/public/robots.txt b/docs/public/robots.txt new file mode 100644 index 00000000..d31da3d4 --- /dev/null +++ b/docs/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://sparql.studio/sitemap.xml diff --git a/docs/public/sparql-studio.svg b/docs/public/sparql-studio.svg new file mode 100644 index 00000000..8b4eff97 --- /dev/null +++ b/docs/public/sparql-studio.svg @@ -0,0 +1,14 @@ + + SPARQL Studio + Triangle of three rings colored orange, green and purple (W3C Semantic Web palette) joined by neutral grey edges, an RDF triple. + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index c7784b91..818d481e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,23 @@ { - "name": "yasgui", + "name": "sparql-studio-monorepo", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "yasgui", + "name": "sparql-studio-monorepo", "workspaces": [ "packages/*" ], + "dependencies": { + "@traqula/chevrotain": "^1.1.0", + "@traqula/parser-sparql-1-2": "^1.1.4", + "qlue-ls": "^2.8.2", + "swls-wasm": "^0.3.1" + }, "devDependencies": { "@changesets/cli": "^2.29.7", + "@codingame/esbuild-import-meta-url-plugin": "^1.0.3", + "@matdata/yasgui-graph-plugin": "^1.6.2", "@types/chai": "^5.2.3", "@types/fs-extra": "^11.0.4", "@types/mocha": "^10.0.10", @@ -25,15 +33,316 @@ "lint-staged": "^16.2.6", "mocha": "^11.7.4", "node-static": "^0.7.11", + "postcss-nested": "^7.0.2", "prettier": "^3.6.2", "puppeteer": "^25.1.0", "rimraf": "^6.1.3", "sass": "^1.93.3", "source-map-support": "^0.5.21", + "typedoc": "^0.28.19", + "typedoc-plugin-markdown": "^4.12.0", + "typedoc-vitepress-theme": "^1.1.3", "typescript": "^5.9.3", "typescript-eslint": "^8.60.1", "vite": "^8.0.16", - "vite-plugin-dts": "^5.0.2" + "vite-plugin-dts": "^5.0.2", + "vite-plugin-wasm": "^3.4.1", + "vitepress": "^1.6.4", + "yasgui-geo-tg": "^1.1.2" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.19.0.tgz", + "integrity": "sha512-Lhnez3hhXHk25lfxLAMxvkP4fmN3+1RgADhD2ssMDBYuAsDVReeyP+3SGRx+ntq8ijMrLqUyfvO72TB6jsTteQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.53.0.tgz", + "integrity": "sha512-0ZjA5Hcmaoz5Lj6OG0zhfIyeqzJZnLW2CRJA1W17UwMFGRtZAJ9yJKRvPEDA6gkpsIoQxORTSW6sWFiuYncPNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.53.0.tgz", + "integrity": "sha512-kWNodP75iiEaOtemC9F/hlxNBG5E2QUjN1BusnE6m2b4l7Qh/BUO3fGCVsmKJI65VO4VKGGmT43ICvHtTcJ2JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.53.0.tgz", + "integrity": "sha512-YPN45TXD9Wrse185t/Ta7nktZsqpv97oOjCzp2sblHnCL6rBc9TDeJAg1IGl2UpdwnSD05Zu/5wLB4watOUMyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.53.0.tgz", + "integrity": "sha512-qAcYTDJE6m924FDDUQvdD6vh7DYaqOeSpFS74IP37/JRV0v4cGBauyxTF2WzDnokUylQDbqreoFIJZfg0Fitmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.53.0.tgz", + "integrity": "sha512-fQaY+DkSJOpuUVUe8MQTwrdiKAqkJGhpDarB08duBn/sUv7Bkib6MDRQauCcWTWTe4HIW+EbwQP9R4kci1V/Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.53.0.tgz", + "integrity": "sha512-o72tsiEZGfeS/dxL9IADfzcZWGEwKDEe5CvtrBuT//3JR+SHuTtHRI2ZTf7D7bcKagcbojvO8hnkHdfoakSlYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.53.0.tgz", + "integrity": "sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.53.0.tgz", + "integrity": "sha512-oNbT6z4NwD8Pou9VPINGlN/tlG1afESh2EbxqnP6rwl95xKVD/Zlciis1PpNeO/9U/rrajc1+7DcfKi03tX1KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.53.0.tgz", + "integrity": "sha512-G+KZb/yd+qAOFn/cEvTGeLxQm8aP3a0od50l3z/ylccY+/o4YG3TNcjU1tFQHW4mXC137GPyR7W70R0kRQDLnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.53.0.tgz", + "integrity": "sha512-6aVfYd55Un6IUgPLbo84WfgFZlS3L0vA1ttzXL5vahHewUJ8jYgd89TzlWRTeej7w70mb9RWsVlFYGmJ/diQww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.53.0.tgz", + "integrity": "sha512-ke27DqgzCOlt+RbeEdCxtXxMQOnAOi8ujr2wid0DmDKzR95Kw/f9sBsuhBxtjevCqJRJszfRTLY0B1pbO6IhkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.53.0.tgz", + "integrity": "sha512-GngiOqt2Gq4oLno6yXQVj9om+qSO9SWAoduoTOEg79dKZ62brB8OOIvSJG/vDNoanYi6a7Al9uDZwXvi+bcVTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.53.0.tgz", + "integrity": "sha512-6mF9LZMUk0QqWvrnxkxBqhswwz6Xfiwy6/gmTzL5HrlhdVG3ITAqGV2k3XmVThP1h0Ulc3VQwiNCD7/Nr4JNlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/runtime": { @@ -45,6 +354,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@changesets/apply-release-plan": { "version": "7.0.14", "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.14.tgz", @@ -530,636 +853,665 @@ "node": ">= 4.0.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, + "node_modules/@codemirror/commands": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, + "node_modules/@codemirror/language": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", + "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, + "node_modules/@codemirror/lint": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" } }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@codemirror/lsp-client": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lsp-client/-/lsp-client-6.2.5.tgz", + "integrity": "sha512-1EqhGRmCZOV7Me+rRuwwkTuvkNoD4Nz6UcE1yx5gdwTVTLD4D9xIy48MJc0LeBQGFLn/HNRW/pHmet4EAEkJFQ==", + "license": "MIT", "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "@codemirror/autocomplete": "^6.20.0", + "@codemirror/language": "^6.11.0", + "@codemirror/lint": "^6.8.5", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.37.0", + "@lezer/highlight": "^1.2.1", + "marked": "^15.0.12", + "vscode-languageserver-protocol": "^3.17.5" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", - "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" + "node_modules/@codemirror/lsp-client/node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 18" } }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@codemirror/search": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", + "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" } }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node_modules/@codemirror/state": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@codemirror/view": { + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.0.tgz", + "integrity": "sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==", + "license": "MIT", "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" } }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", - "hasInstallScript": true, + "node_modules/@codingame/esbuild-import-meta-url-plugin": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@codingame/esbuild-import-meta-url-plugin/-/esbuild-import-meta-url-plugin-1.0.3.tgz", + "integrity": "sha512-SAIOsWZteIWYAk04BCqQ+ugu8KiJm8EplQbMvxJl905uZv3r+21+XjtGg/zzrbxlVAY1cP+hGAG7z7sBPmy63w==", + "dev": true, + "license": "ISC", + "dependencies": { + "esbuild": ">=0.19.x", + "import-meta-resolve": "^4.0.0" + } + }, + "node_modules/@codingame/monaco-vscode-api": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-25.1.2.tgz", + "integrity": "sha512-K04QcQA+Zb0KXucBAK/BGCT5dldiwIqdUbBQq7yuLvBLbof3cP1WSUuxasMHGYwM0MWyzIAsDtyAYMS7is8ZuA==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@codingame/monaco-vscode-base-service-override": "25.1.2", + "@codingame/monaco-vscode-environment-service-override": "25.1.2", + "@codingame/monaco-vscode-extensions-service-override": "25.1.2", + "@codingame/monaco-vscode-files-service-override": "25.1.2", + "@codingame/monaco-vscode-host-service-override": "25.1.2", + "@codingame/monaco-vscode-layout-service-override": "25.1.2", + "@codingame/monaco-vscode-quickaccess-service-override": "25.1.2", + "@vscode/iconv-lite-umd": "0.7.1", + "dompurify": "3.3.1", + "jschardet": "3.1.4", + "marked": "14.0.0" } }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", - "hasInstallScript": true, - "license": "(CC-BY-4.0 AND MIT)", + "node_modules/@codingame/monaco-vscode-base-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-base-service-override/-/monaco-vscode-base-service-override-25.1.2.tgz", + "integrity": "sha512-OwYs6h1ATUAeMmX+Q1c8esTG7GLMqniBs+fLEr1/9b/ciY485ArKo5UvrUxVPDtRNy/7F06vRW9IUCq9iKP14w==", + "license": "MIT", "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - }, - "engines": { - "node": ">=6" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@codingame/monaco-vscode-bulk-edit-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-bulk-edit-service-override/-/monaco-vscode-bulk-edit-service-override-25.1.2.tgz", + "integrity": "sha512-+EfSzjiFakCf0IIJKPZrHVGioq5N8GBsp51bXuKBR5J/B58cUaJY0Dc12PNTSpgAusAGOppUIOSBqUk4F/7IaQ==", + "license": "MIT", "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@codingame/monaco-vscode-configuration-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-configuration-service-override/-/monaco-vscode-configuration-service-override-25.1.2.tgz", + "integrity": "sha512-oeoZ3WtM42zHA1IWHrx9UGEfE+TixE+G8Bl9M9bjgFj1EROnkB5yOfELwRYPo4WOEtcK1C5nvIvWIj/hL9MaLg==", + "license": "MIT", "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-files-service-override": "25.1.2" } }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" + "node_modules/@codingame/monaco-vscode-editor-api": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-editor-api/-/monaco-vscode-editor-api-25.1.2.tgz", + "integrity": "sha512-dVXoBLRN8vyFHsLY6iYISaNetZ3ispXLut0qL+jvN0e0CEFkUv1F/3EAE7myptrJSS/N1AptrRIxATT3lwFP+Q==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node_modules/@codingame/monaco-vscode-editor-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-editor-service-override/-/monaco-vscode-editor-service-override-25.1.2.tgz", + "integrity": "sha512-EadvDCyWdgxOPmaIvbcVVDNjTUYuKdjYWwKbPbbcTs9t4z1/DjdE7mV3ZdT6aGh5m6zkEEUOi143l27Y5eRt+Q==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node_modules/@codingame/monaco-vscode-environment-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-environment-service-override/-/monaco-vscode-environment-service-override-25.1.2.tgz", + "integrity": "sha512-8GoD3lk0CN0dIMZOrZNS/i8RCaF1YSQ6nmrf+rqneOSHG9S382EnsZZD69d4+i7JnoeyttO7Kr9KH8WOhRV6OA==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "dev": true, + "node_modules/@codingame/monaco-vscode-extension-api": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-extension-api/-/monaco-vscode-extension-api-25.1.2.tgz", + "integrity": "sha512-SJW/YOhjo+9MXEyzMwQMUWdJVR3Llc6pTq5JQqs6Y30v73gTrpLqtzbd9FNdCuQR8S6bUk5ScH8GL4QrVuL5FA==", "license": "MIT", "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-extensions-service-override": "25.1.2" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", + "node_modules/@codingame/monaco-vscode-extensions-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-extensions-service-override/-/monaco-vscode-extensions-service-override-25.1.2.tgz", + "integrity": "sha512-rTTZW2biPxcg+JumhVf2L+38C5ptvNNxiJlwz39VfXFEh6qOHtAsIMy7vIXa0uGg5/y8DNp0SnOQJP/RKhLYZA==", + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-files-service-override": "25.1.2" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, + "node_modules/@codingame/monaco-vscode-files-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-files-service-override/-/monaco-vscode-files-service-override-25.1.2.tgz", + "integrity": "sha512-TenLLAFIwY7keZFF8e3beUn7OVfnNINR5Noi4PVrjeeTcy6FuNH6Jghdul2JwpRAkvyJLdFMvomE2jlT6F03jQ==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, + "node_modules/@codingame/monaco-vscode-host-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-host-service-override/-/monaco-vscode-host-service-override-25.1.2.tgz", + "integrity": "sha512-lgaalpA9CUQW7i0bBwgBOK0DQNDvOo3QO3p6Rz6yVsHpgA4iMqq2d11dBDUKvuQSwIHPRu8CMHCqhQk/BQN/YA==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" + "node_modules/@codingame/monaco-vscode-keybindings-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-keybindings-service-override/-/monaco-vscode-keybindings-service-override-25.1.2.tgz", + "integrity": "sha512-cp/gGyTvCTAzCYnQm0HJykXJRB0Huz8Lvq60lj5LutgWcb8S3w6dOB2Houm8dHoeUm/jOko8SQNIP8hzWN92Zw==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-files-service-override": "25.1.2" + } }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-cs": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-cs/-/monaco-vscode-language-pack-cs-25.1.2.tgz", + "integrity": "sha512-v0cB2uAOCwj135aGIf0arGV+DNW32lbWh04bv8ctTxcWRt1Pr2kTQ1pjfE8ynKgxabPfAk8E25/CerKSYOmZ+A==", "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-de": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-de/-/monaco-vscode-language-pack-de-25.1.2.tgz", + "integrity": "sha512-xA3WOt1w5jlAOnyx4PBwx+qV3vx8C8/zie29qjYbgJMxGKDkb0HfpuKUwywDA2uUMI2wJZS+PnNG00zPDoLIrw==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-es": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-es/-/monaco-vscode-language-pack-es-25.1.2.tgz", + "integrity": "sha512-1/upuO9lRJilZ3sRr0QLTpz55KYRaBWDe8wtPvghOFYOHyWgW8A4VhUQxa6L9SJgY1JkypUAm0U8WcMX2G4LnQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-fr": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-fr/-/monaco-vscode-language-pack-fr-25.1.2.tgz", + "integrity": "sha512-iq+xx+tv1QIMmFD0eBhFRMF4xMAsVf/HyA1WogqBofteCWeAvRE9HUjZ5JzHz7jXBPe3dLP1LOM0r0GrJZs4fQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-it": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-it/-/monaco-vscode-language-pack-it-25.1.2.tgz", + "integrity": "sha512-FajWCML9OR8ppLnJ0mcg+sFHEhYJl8zhb3/DHnd+pNysw8dLfetXoSWjaPnwPPpwiQgkNN1UsToZHOU9czVifQ==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-ja": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ja/-/monaco-vscode-language-pack-ja-25.1.2.tgz", + "integrity": "sha512-NwKh0BnPgUrJkxsm0X6vY4ftnd9DjxkcnQqK+bohta6UOzm09J1EjZ6QD42fjWngxrp/xiegtrYQ9NA2q6VpoA==", "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" + "node_modules/@codingame/monaco-vscode-language-pack-ko": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ko/-/monaco-vscode-language-pack-ko-25.1.2.tgz", + "integrity": "sha512-fvaisgfcg8YaAwnyPcGmQDLwkwqzamLQUyx9HmnwDpXw0YANzd058Kwn6bz+Vfn9MjwuMNT0nllD0qQMnpdyew==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-pl": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pl/-/monaco-vscode-language-pack-pl-25.1.2.tgz", + "integrity": "sha512-9hDRyzFJkDia5rO9QE262JgxwP/cnalFisLFo7FQcw57ZhqzqXIdQIuwcKaHuAgzeQ6W2+A3KOLfTr3m7VZrXw==", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@json2csv/formatters": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@json2csv/formatters/-/formatters-7.0.6.tgz", - "integrity": "sha512-hjIk1H1TR4ydU5ntIENEPgoMGW+Q7mJ+537sDFDbsk+Y3EPl2i4NfFVjw0NJRgT+ihm8X30M67mA8AS6jPidSA==", - "license": "MIT" + "node_modules/@codingame/monaco-vscode-language-pack-pt-br": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pt-br/-/monaco-vscode-language-pack-pt-br-25.1.2.tgz", + "integrity": "sha512-7fFnqOTAJGb5RuJ4uwh9sh0JmXALuHPGOl7iL9rZkcgIuVP5y6wVDUDXq5qjiRTNSFDs7Bzh463Ir5m5D6mJbA==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } }, - "node_modules/@json2csv/plainjs": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@json2csv/plainjs/-/plainjs-7.0.6.tgz", - "integrity": "sha512-4Md7RPDCSYpmW1HWIpWBOqCd4vWfIqm53S3e/uzQ62iGi7L3r34fK/8nhOMEe+/eVfCx8+gdSCt1d74SlacQHw==", + "node_modules/@codingame/monaco-vscode-language-pack-qps-ploc": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-qps-ploc/-/monaco-vscode-language-pack-qps-ploc-25.1.2.tgz", + "integrity": "sha512-IFjoqrSuPtIFWb+KlPT6PFWKszzNX+TCD9drgCV6AigvBO/xfGL3QwHB68l/DLbmDbohOz4Xdkutv20wuENAeA==", "license": "MIT", "dependencies": { - "@json2csv/formatters": "^7.0.6", - "@streamparser/json": "^0.0.20" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-ru": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ru/-/monaco-vscode-language-pack-ru-25.1.2.tgz", + "integrity": "sha512-0uDAeXO+GllKUPhJzP893rlDhlFV1IwCu/515rBdcyegt48iGm/xAgj26V90hNz8hmB6EuM/7d8MFeklbiIpYA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true, - "license": "MIT" + "node_modules/@codingame/monaco-vscode-language-pack-tr": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-tr/-/monaco-vscode-language-pack-tr-25.1.2.tgz", + "integrity": "sha512-MJhHxDyJEiuVLQ9+jb8MnnN9lsbJOjJjMswVCeJ7v/Q/msAhq25QYUfn0DbOIzESJE1f7crffRb5e38XP8sYWA==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-zh-hans": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hans/-/monaco-vscode-language-pack-zh-hans-25.1.2.tgz", + "integrity": "sha512-c7MMrhnSLb59NxpAa8nVy9aIbxy4gVYrCpDMq8W380LOaXTYb7nueTrw8QJ5QbJBNi2P2KZoGkn2BlONuBtJJg==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@manypkg/find-root/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, + "node_modules/@codingame/monaco-vscode-language-pack-zh-hant": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hant/-/monaco-vscode-language-pack-zh-hant-25.1.2.tgz", + "integrity": "sha512-ARedFTM6JCluoPLJqkBcTJaQFdJNcN86OX6B8/NMApIPrnSIAfanMndpyilt8XjzUG6IH22cypR+DAlEjf48cA==", "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@manypkg/find-root/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, + "node_modules/@codingame/monaco-vscode-languages-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-25.1.2.tgz", + "integrity": "sha512-ipuS1V3NgXDkNrj0vBcgMBFnqo+19HVsZjjFGfPFH3x0uptP9aiWWK42wtDK3Qbu4teSjHL7WnSLrmw94rplWw==", "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-files-service-override": "25.1.2" } }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, + "node_modules/@codingame/monaco-vscode-layout-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-25.1.2.tgz", + "integrity": "sha512-SxBGcMK3RgkGtUn7ZDl7dCoyNW0CWFQ/bfSRYUY06A0IA4JNS5jq1lhof57d0WXewm+5l8w1Spr/vMsfx1c9ig==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true, - "license": "MIT" + "node_modules/@codingame/monaco-vscode-localization-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-localization-service-override/-/monaco-vscode-localization-service-override-25.1.2.tgz", + "integrity": "sha512-QLj62A8XDOIQW3KjsZlNxs+sfsNNHYxWMjQMwZu/y2Vw3IIHGly2Lpn4t4SFbeaBHJQJy4i5s7NpzlbF9MbEzQ==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, + "node_modules/@codingame/monaco-vscode-log-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-log-service-override/-/monaco-vscode-log-service-override-25.1.2.tgz", + "integrity": "sha512-OoileAUtPAJ0j3RW31DFSxtOipy0EcFq+iIXEdGvoRlsQPZJ3o9ayjf1JvCXpxUjJ3QkmvQVhXsWNUFREjEFLg==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-environment-service-override": "25.1.2" } }, - "node_modules/@manypkg/get-packages/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, + "node_modules/@codingame/monaco-vscode-model-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-25.1.2.tgz", + "integrity": "sha512-MGz/eV1CxibLvnl6WzK6idUHJCXJOVepJvKM6Trkv5050vRe+f/o1TjCiG8PaznAypYqZvnwkTG0B7/OTizCpQ==", "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" } }, - "node_modules/@manypkg/get-packages/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/@codingame/monaco-vscode-monarch-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-monarch-service-override/-/monaco-vscode-monarch-service-override-25.1.2.tgz", + "integrity": "sha512-akyNHOJQRS7YHyk6kf0Encnkt+shlR+bIB84UJRUHFgSeF8s5gkDkQuFJph0YeUDWJWat+yBLUSZx2nHomdbHQ==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-quickaccess-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-25.1.2.tgz", + "integrity": "sha512-7IIrXnwHiF3w9d9p9kspEUz/LCibMLUztmRpGdZQfFtWBJw043q7rk8V1O42KdXr1hVg9IR5vfffwjy9nbiiUg==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-textmate-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-textmate-service-override/-/monaco-vscode-textmate-service-override-25.1.2.tgz", + "integrity": "sha512-AL0FtSQBW+1vtoXYQvUqB2hfWojpK73Kq/n6KuNXxjLF/XBJ5FpeeZDfrBfwhWPPoHuBTsaFUCQy4L8xQgbVlA==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-files-service-override": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-theme-defaults-default-extension": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-theme-defaults-default-extension/-/monaco-vscode-theme-defaults-default-extension-25.1.2.tgz", + "integrity": "sha512-0vTMFiC89YSDSmjFckuQBUKwRuFNtsILNO3k0PBiSLN/MW+VDItjJpiVLXC42+rUWlGgY2lYxOneGVa5slCV1w==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-theme-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-theme-service-override/-/monaco-vscode-theme-service-override-25.1.2.tgz", + "integrity": "sha512-hsTwl6YYTiheFuQMmCmiEGLIdIdgYaf8Z85XWyxe6YgPtDaYGnp0fGSOXKA9/bf0JtuynzoLKtUUfDupK/A7Tw==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-files-service-override": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-view-banner-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-banner-service-override/-/monaco-vscode-view-banner-service-override-25.1.2.tgz", + "integrity": "sha512-zhujHd1PQ6rRXsC2OQGrx/282G2v3lpPFl9heDFGKzpdj5119SgcW+B9p/MwJ1qF3LJpuRRgefNiQtqC/KT1eA==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-view-common-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-common-service-override/-/monaco-vscode-view-common-service-override-25.1.2.tgz", + "integrity": "sha512-4Po/YaHUvVf4VmhVCZmM2lc/flOptiWSM140bIRNpMcfH0VwihYg15CcDeu1Oc+6DaauzsG3u59GtEvlMmJ9Zw==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-bulk-edit-service-override": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-view-status-bar-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-status-bar-service-override/-/monaco-vscode-view-status-bar-service-override-25.1.2.tgz", + "integrity": "sha512-Jp9ytLaWZ6evabTPtG3Mu3dFx+7WTIPz69BsGpl9PnU0kiSWUqQhPSob0Jz7E2qmMj0ZcNv2Wqvm6bMBu5OyrA==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-view-title-bar-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-title-bar-service-override/-/monaco-vscode-view-title-bar-service-override-25.1.2.tgz", + "integrity": "sha512-NVYtTAFR35NV/Fx7tSlbASicvpAjK5A14fmxF7/LJJN8ZmzhA/P3Y+UzhqOQl6/VcPV4pAMU0Z7Sicgwbn37dw==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-views-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-views-service-override/-/monaco-vscode-views-service-override-25.1.2.tgz", + "integrity": "sha512-LfzlztsvobdP5L5EvJ/rqSEgy5fEVmrkMqRteuhEtNGd4hnmdBoX8W7BNMBPff6d4NfCK74pGHJF57RyT4Iixg==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-keybindings-service-override": "25.1.2", + "@codingame/monaco-vscode-layout-service-override": "25.1.2", + "@codingame/monaco-vscode-quickaccess-service-override": "25.1.2", + "@codingame/monaco-vscode-view-common-service-override": "25.1.2" + } + }, + "node_modules/@codingame/monaco-vscode-workbench-service-override": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-workbench-service-override/-/monaco-vscode-workbench-service-override-25.1.2.tgz", + "integrity": "sha512-2LMHr+na03FhOAaXpIGmamq9hf7e4wt2kULn8NqNZRd3i+0v1tx/TSSjGhsA5EkrNrFD7CMSoXayBq8tgpCq/A==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-keybindings-service-override": "25.1.2", + "@codingame/monaco-vscode-quickaccess-service-override": "25.1.2", + "@codingame/monaco-vscode-view-banner-service-override": "25.1.2", + "@codingame/monaco-vscode-view-common-service-override": "25.1.2", + "@codingame/monaco-vscode-view-status-bar-service-override": "25.1.2", + "@codingame/monaco-vscode-view-title-bar-service-override": "25.1.2" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" }, "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@types/hammerjs": "^2.0.36" }, "engines": { - "node": ">= 8" + "node": ">=0.8.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 8" + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "tslib": "^2.4.0" } }, - "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, + "os": [ + "aix" + ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "node": ">=18" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", "cpu": [ - "arm64" + "arm" ], "dev": true, "license": "MIT", @@ -1168,17 +1520,13 @@ "android" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", "cpu": [ "arm64" ], @@ -1186,20 +1534,16 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", "cpu": [ "x64" ], @@ -1207,106 +1551,86 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "darwin" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", "cpu": [ - "arm" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", "cpu": [ - "arm64" + "arm" ], "dev": true, "license": "MIT", @@ -1315,19 +1639,15 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", @@ -1336,19 +1656,15 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", "cpu": [ - "x64" + "ia32" ], "dev": true, "license": "MIT", @@ -1357,143 +1673,115 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", "cpu": [ - "arm64" + "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", "cpu": [ - "ia32" + "mips64el" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.0.4.tgz", - "integrity": "sha512-HGM8iAmGTf+Y7t0373szVbTmt3d7vPkYL/1bpOkOFO0YUYLgSeuYBCzESklogNPvOBnZ/MRD5f07OkpqH1trtA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "modern-tar": "^0.7.6", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/main-cli.js" - }, - "engines": { - "node": ">=22.12.0" - }, - "peerDependencies": { - "proxy-agent": ">=8.0.1" - }, - "peerDependenciesMeta": { - "proxy-agent": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@rdfjs/types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-2.0.1.tgz", - "integrity": "sha512-uyAzpugX7KekAXAHq26m3JlUIZJOC0uSBhpnefGV5i15bevDyyejoB7I+9MKeUrzXD8OOUI3+4FeV1wwQr5ihA==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", "cpu": [ "arm64" ], @@ -1501,16 +1789,16 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", "cpu": [ "x64" ], @@ -1518,50 +1806,50 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "openbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", "cpu": [ "arm64" ], @@ -1569,67 +1857,67 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "openharmony" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "sunos" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", "cpu": [ - "s390x" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", "cpu": [ "x64" ], @@ -1637,1342 +1925,4498 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", - "cpu": [ - "wasm32" - ], + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, - "license": "MIT", - "optional": true, + "license": "Apache-2.0", "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } }, - "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=6" } }, - "node_modules/@streamparser/json": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.20.tgz", - "integrity": "sha512-VqAAkydywPpkw63WQhPVKCD3SdwXuihCUVZbbiY3SfSTGQyHmwRoq27y4dmJdZuJwd5JIlQoMPyGvMbUPY0RKQ==", - "license": "MIT" - }, - "node_modules/@tarekraafat/autocomplete.js": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@tarekraafat/autocomplete.js/-/autocomplete.js-7.2.0.tgz", - "integrity": "sha512-p1aEcKC/WHpVBuFyRhXq/ie+mgO4QqCNEsdVIPUBgmNqmxV4dVfqYEpk///9vvKyranUUvrlVu4e2tdzAaXKIg==", - "license": "Apache-2.0" + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "node_modules/@gerrit0/mini-shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", + "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@shikijs/engine-oniguruma": "^3.23.0", + "@shikijs/langs": "^3.23.0", + "@shikijs/themes": "^3.23.0", + "@shikijs/types": "^3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, - "node_modules/@types/autosuggest-highlight": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@types/autosuggest-highlight/-/autosuggest-highlight-3.2.3.tgz", - "integrity": "sha512-8Mb21KWtpn6PvRQXjsKhrXIcxbSloGqNH50RntwGeJsGPW4xvNhfml+3kKulaKpO/7pgZfOmzsJz7VbepArlGQ==", + "node_modules/@gerrit0/mini-shiki/node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } }, - "node_modules/@types/blueimp-md5": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/@types/blueimp-md5/-/blueimp-md5-2.18.2.tgz", - "integrity": "sha512-dJ9yRry9Olt5GAWlgCtE5dK9d/Dfhn/V7hna86eEO2Pn76+E8Y0S0n61iEUEGhWXXgtKtHxtZLVNwL8X+vLHzg==", + "node_modules/@gerrit0/mini-shiki/node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "node_modules/@gerrit0/mini-shiki/node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "@shikijs/types": "3.23.0" } }, - "node_modules/@types/codemirror": { - "version": "0.0.100", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.100.tgz", - "integrity": "sha512-4jGmu1T8vpQrJCe8cbe3KveiJmK2UAt3rZO2qE2sPoMhGLuwW0cMzFYJLyXebbRJg5G3RbuUXLip1IHPUESkFA==", + "node_modules/@gerrit0/mini-shiki/node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/tern": "*" + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } }, - "node_modules/@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@types/jquery": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.33.tgz", - "integrity": "sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.86", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.86.tgz", + "integrity": "sha512-t3jck5qPQuK1qy+bRn9eCoDQhIB7XSazKz1Fjp8hcan3XOAsTI5Mq/s3F0ekOKSvMQqkVORYK6ns6o6T9f5EMA==", + "dev": true, + "license": "CC0-1.0", "dependencies": { - "@types/sizzle": "*" + "@iconify/types": "*" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", "dev": true, "license": "MIT" }, - "node_modules/@types/jsonfile": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@types/jsuri": { - "version": "1.3.35", - "resolved": "https://registry.npmjs.org/@types/jsuri/-/jsuri-1.3.35.tgz", - "integrity": "sha512-kaRErZwFnRSpQGdAebfwu8jb5QChcuf9R0U49YFNM2zVmSsbraQgELU+dAWce131Hhs8O8pE/7KOVfav+BFLww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/lodash": "*" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, - "node_modules/@types/n3": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.26.1.tgz", - "integrity": "sha512-TilYHzpU6ecXVJAbV+6o17Z8ZkWLWx6ZJD3IluaU4RiGHxqjU2or9fopxFHS6iXS6qcl5Mg1K3wSx9L8xxJaJQ==", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { - "@rdfjs/types": "*", - "@types/node": "*" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/node": { - "version": "24.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz", - "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@types/node-static": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@types/node-static/-/node-static-0.7.12.tgz", - "integrity": "sha512-jpQIPcHd5r9jnfVZb/WdxZ3shwigGcS0LC/0vM7PaB+n5HvQSuhUiXVJgNGtwNeUliyqMyjr7Ogz04PEkqPQAw==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@types/node/node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/papaparse": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.1.tgz", - "integrity": "sha512-esEO+VISsLIyE+JZBmb89NzsYYbpwV8lmv2rPo6oX5y9KhBaIP7hhHgjuTut54qjdKVMufTEcrh5fUl9+58huw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@types/sanitize-html": { - "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-1.27.2.tgz", - "integrity": "sha512-DrH26m7CV6PB4YVckjbSIx+xloB7HBolr9Ctm0gZBffSu5dDV4yJKFQGPquJlReVW+xmg59gx+b/8/qYHxZEuw==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { - "htmlparser2": "^4.1.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@types/sizzle": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", - "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, - "node_modules/@types/tern": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", - "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "node_modules/@json2csv/formatters": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@json2csv/formatters/-/formatters-7.0.6.tgz", + "integrity": "sha512-hjIk1H1TR4ydU5ntIENEPgoMGW+Q7mJ+537sDFDbsk+Y3EPl2i4NfFVjw0NJRgT+ihm8X30M67mA8AS6jPidSA==", + "license": "MIT" + }, + "node_modules/@json2csv/plainjs": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@json2csv/plainjs/-/plainjs-7.0.6.tgz", + "integrity": "sha512-4Md7RPDCSYpmW1HWIpWBOqCd4vWfIqm53S3e/uzQ62iGi7L3r34fK/8nhOMEe+/eVfCx8+gdSCt1d74SlacQHw==", "license": "MIT", - "optional": true + "dependencies": { + "@json2csv/formatters": "^7.0.6", + "@streamparser/json": "^0.0.20" + } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", - "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", - "dev": true, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/type-utils": "8.60.1", - "@typescript-eslint/utils": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.60.1", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "@lezer/common": "^1.3.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", - "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", - "dev": true, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "@lezer/common": "^1.0.0" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", - "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.60.1", - "@typescript-eslint/types": "^8.60.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", - "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6 <7 || >=8" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", - "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", + "node_modules/@manypkg/find-root/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", - "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", + "node_modules/@manypkg/find-root/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/utils": "8.60.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "node": ">= 4.0.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", - "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", - "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.60.1", - "@typescript-eslint/tsconfig-utils": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/visitor-keys": "8.60.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", - "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", + "node_modules/@manypkg/get-packages/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.60.1", - "@typescript-eslint/types": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", - "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", + "node_modules/@manypkg/get-packages/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.60.1", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.28" + "node": ">= 4.0.0" } }, - "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "dev": true, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", "license": "MIT" }, - "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "node_modules/@matdata/yasgui-graph-plugin": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@matdata/yasgui-graph-plugin/-/yasgui-graph-plugin-1.6.2.tgz", + "integrity": "sha512-tdEIRxWIjnCQBmBSMra0q0EURYP6CPOHUAMI+LMIAvWif2Co9XKaYWWsy7VI+aMpRDw2p62qqBN/+pjloR0lhg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" + "n3": "^2.0.1", + "vis-network": "^9.1.9" } }, - "node_modules/@zazuko/yasgui": { - "resolved": "packages/yasgui", - "link": true - }, - "node_modules/@zazuko/yasgui-utils": { - "resolved": "packages/utils", - "link": true - }, - "node_modules/@zazuko/yasqe": { - "resolved": "packages/yasqe", - "link": true - }, - "node_modules/@zazuko/yasr": { - "resolved": "packages/yasr", - "link": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@matdata/yasgui-graph-plugin/node_modules/n3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/n3/-/n3-2.0.3.tgz", + "integrity": "sha512-um/toGVENTarHBYIK2TdH6ByBhW75WpdKpv8iTYt9wF2QfBk8s8a16iaWZFUAAC1BKfGdb99kfgx6pltdDwfKA==", + "dev": true, "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" + "buffer": "^6.0.3", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">=6.5" + "node": ">=12.0" } }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 8" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/ansi-escapes": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { - "environment": "^1.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { - "color-convert": "^2.0.1" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">= 10.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.0.4.tgz", + "integrity": "sha512-HGM8iAmGTf+Y7t0373szVbTmt3d7vPkYL/1bpOkOFO0YUYLgSeuYBCzESklogNPvOBnZ/MRD5f07OkpqH1trtA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "modern-tar": "^0.7.6", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/main-cli.js" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "proxy-agent": ">=8.0.1" + }, + "peerDependenciesMeta": { + "proxy-agent": { + "optional": true + } + } + }, + "node_modules/@rdfjs/sparql-editor-codemirror": { + "resolved": "packages/sparql-editor-codemirror", + "link": true + }, + "node_modules/@rdfjs/sparql-editor-monaco": { + "resolved": "packages/sparql-editor-monaco", + "link": true + }, + "node_modules/@rdfjs/sparql-results": { + "resolved": "packages/sparql-results", + "link": true + }, + "node_modules/@rdfjs/sparql-studio": { + "resolved": "packages/sparql-studio", + "link": true + }, + "node_modules/@rdfjs/sparql-utils": { + "resolved": "packages/sparql-utils", + "link": true + }, + "node_modules/@rdfjs/types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-2.0.1.tgz", + "integrity": "sha512-uyAzpugX7KekAXAHq26m3JlUIZJOC0uSBhpnefGV5i15bevDyyejoB7I+9MKeUrzXD8OOUI3+4FeV1wwQr5ihA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@streamparser/json": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.20.tgz", + "integrity": "sha512-VqAAkydywPpkw63WQhPVKCD3SdwXuihCUVZbbiY3SfSTGQyHmwRoq27y4dmJdZuJwd5JIlQoMPyGvMbUPY0RKQ==", + "license": "MIT" + }, + "node_modules/@tarekraafat/autocomplete.js": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@tarekraafat/autocomplete.js/-/autocomplete.js-7.2.0.tgz", + "integrity": "sha512-p1aEcKC/WHpVBuFyRhXq/ie+mgO4QqCNEsdVIPUBgmNqmxV4dVfqYEpk///9vvKyranUUvrlVu4e2tdzAaXKIg==", + "license": "Apache-2.0" + }, + "node_modules/@traqula/chevrotain": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@traqula/chevrotain/-/chevrotain-1.1.0.tgz", + "integrity": "sha512-VpcoQKb2ZnsOQPlPO2mE9hfR0Aidp7drwTCtaXfpdRHGkXeQ5Nv4rnxmxwUoEDRzu6b/3z4n8oTd+sYhe4fAaA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@traqula/core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@traqula/core/-/core-1.1.4.tgz", + "integrity": "sha512-oSY1Ig2CDKoVflW87oaLvQuPYYbkknwLjIkGE1TsMpYYcbxUiVfN5KCqP2qhRIZPdLTjWUd07HxYhZ7K07ERDw==", + "license": "MIT", + "dependencies": { + "@traqula/chevrotain": "^1.1.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@traqula/parser-sparql-1-1": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@traqula/parser-sparql-1-1/-/parser-sparql-1-1-1.1.4.tgz", + "integrity": "sha512-SRjc2aOFUiiSGHA0NhT6ESyUQmiRW972boPTW8lq+KDMSREv0gtAAP39P3KJniCzOgz5lBeQ9wjWF5MnxSkpiA==", + "license": "MIT", + "dependencies": { + "@traqula/core": "^1.1.4", + "@traqula/rules-sparql-1-1": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@traqula/parser-sparql-1-2": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@traqula/parser-sparql-1-2/-/parser-sparql-1-2-1.1.4.tgz", + "integrity": "sha512-Nlvk/wetqhFXP6s+C6Dw39TSNN/5ozp3JBSeJ+PDKbTaaf/GjSBzTukshX2j0oliui834GhWKArJJxJHerdgWg==", + "license": "MIT", + "dependencies": { + "@traqula/core": "^1.1.4", + "@traqula/parser-sparql-1-1": "^1.1.4", + "@traqula/rules-sparql-1-1": "^1.1.4", + "@traqula/rules-sparql-1-2": "^1.1.4", + "rdf-data-factory": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@traqula/rules-sparql-1-1": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@traqula/rules-sparql-1-1/-/rules-sparql-1-1-1.1.4.tgz", + "integrity": "sha512-E/IbmR7PM50yLDHlWP19amsAf2X0+KBb8lYI8lRQH92/rhVCP7QYEhSZksJ75+w6jm/l+OQvmQKolCZaMF7JHA==", + "license": "MIT", + "dependencies": { + "@traqula/chevrotain": "^1.1.0", + "@traqula/core": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@traqula/rules-sparql-1-2": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@traqula/rules-sparql-1-2/-/rules-sparql-1-2-1.1.4.tgz", + "integrity": "sha512-ooEETfE/HGOf2ufpOhwOvbZFbCCMLQ4tYTESGRvfcF+4l/mythXNeCbVXCA1CWv4JiEDmAX+myVZMtGvBijpAA==", + "license": "MIT", + "dependencies": { + "@traqula/core": "^1.1.4", + "@traqula/rules-sparql-1-1": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/autosuggest-highlight": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/autosuggest-highlight/-/autosuggest-highlight-3.2.3.tgz", + "integrity": "sha512-8Mb21KWtpn6PvRQXjsKhrXIcxbSloGqNH50RntwGeJsGPW4xvNhfml+3kKulaKpO/7pgZfOmzsJz7VbepArlGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/blueimp-md5": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/@types/blueimp-md5/-/blueimp-md5-2.18.2.tgz", + "integrity": "sha512-dJ9yRry9Olt5GAWlgCtE5dK9d/Dfhn/V7hna86eEO2Pn76+E8Y0S0n61iEUEGhWXXgtKtHxtZLVNwL8X+vLHzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", + "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/jquery": { + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.33.tgz", + "integrity": "sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jsuri": { + "version": "1.3.35", + "resolved": "https://registry.npmjs.org/@types/jsuri/-/jsuri-1.3.35.tgz", + "integrity": "sha512-kaRErZwFnRSpQGdAebfwu8jb5QChcuf9R0U49YFNM2zVmSsbraQgELU+dAWce131Hhs8O8pE/7KOVfav+BFLww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/n3": { + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.26.1.tgz", + "integrity": "sha512-TilYHzpU6ecXVJAbV+6o17Z8ZkWLWx6ZJD3IluaU4RiGHxqjU2or9fopxFHS6iXS6qcl5Mg1K3wSx9L8xxJaJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rdfjs/types": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz", + "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/node-static": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/@types/node-static/-/node-static-0.7.12.tgz", + "integrity": "sha512-jpQIPcHd5r9jnfVZb/WdxZ3shwigGcS0LC/0vM7PaB+n5HvQSuhUiXVJgNGtwNeUliyqMyjr7Ogz04PEkqPQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/@types/papaparse": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.1.tgz", + "integrity": "sha512-esEO+VISsLIyE+JZBmb89NzsYYbpwV8lmv2rPo6oX5y9KhBaIP7hhHgjuTut54qjdKVMufTEcrh5fUl9+58huw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sanitize-html": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-1.27.2.tgz", + "integrity": "sha512-DrH26m7CV6PB4YVckjbSIx+xloB7HBolr9Ctm0gZBffSu5dDV4yJKFQGPquJlReVW+xmg59gx+b/8/qYHxZEuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "htmlparser2": "^4.1.0" + } + }, + "node_modules/@types/sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", + "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/type-utils": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", + "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", + "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.1", + "@typescript-eslint/types": "^8.60.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", + "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", + "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", + "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", + "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", + "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.1", + "@typescript-eslint/tsconfig-utils": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", + "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", + "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/iconv-lite-umd": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.1.tgz", + "integrity": "sha512-tK6k0DXFHW7q5+GGuGZO+phpAqpxO4WXl+BLc/8/uOk3RsM2ssAL3CQUQDb1TGfwltjsauhN6S4ghYZzs4sPFw==", + "license": "MIT" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", + "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.35", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", + "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", + "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.35", + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", + "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", + "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", + "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", + "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/runtime-core": "3.5.35", + "@vue/shared": "3.5.35", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", + "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "vue": "3.5.35" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", + "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/algoliasearch": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.53.0.tgz", + "integrity": "sha512-OGW1q6b91CRSSeiOnM8LxuR5NYJ2esvw66jUZ4IIvdv+ItNkx3pwLuyR+jaCdbGee4ov5WgUnyPryyh11xvByQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.19.0", + "@algolia/client-abtesting": "5.53.0", + "@algolia/client-analytics": "5.53.0", + "@algolia/client-common": "5.53.0", + "@algolia/client-insights": "5.53.0", + "@algolia/client-personalization": "5.53.0", + "@algolia/client-query-suggestions": "5.53.0", + "@algolia/client-search": "5.53.0", + "@algolia/ingestion": "1.53.0", + "@algolia/monitoring": "1.53.0", + "@algolia/recommend": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", + "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/autosuggest-highlight": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/autosuggest-highlight/-/autosuggest-highlight-3.3.4.tgz", + "integrity": "sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA==", + "license": "MIT", + "dependencies": { + "remove-accents": "^0.4.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/betterknown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/betterknown/-/betterknown-1.2.0.tgz", + "integrity": "sha512-9kuLOeVkgAXnKsMn9WAHLLJ45Wn51jPuZlS1XPkia7NoBpqM9EbVvr+A2Wr0g1WAEL5rX7/oM428Akd3wCL3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.16" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/choices.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-9.1.0.tgz", + "integrity": "sha512-6NnqiE/MNnNAiMzdW7phJ49nMQylkKMQ6La6PAS1+h1VhrGt38MOPnjzEJ3cRaECieqaGpl9eFGtI2icW27r8A==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "fuse.js": "^3.4.6", + "redux": "^4.1.2" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chromium-bidi": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-16.0.1.tgz", + "integrity": "sha512-J63PGu/9PpeCwLIcKYyzWP6yaVL5pxuBc0shlYCYM8BaAkmlwiQboXO1iNbOgSDbVklEyYFfNEcHD8oOAWacUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "engines": { + "node": ">=20.19.0 <22.0.0 || >=22.12.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { "node": ">=12" } }, - "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/column-resizer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/column-resizer/-/column-resizer-1.4.0.tgz", + "integrity": "sha512-KM5Jh/UBKwVUr01oEGN/OvxF6gZIEn4c1Qde4iHSqNru9hxq93ao3u93qb9N1E1TZ2Sxjh4x7OHGe8v/P8FgkA==", + "license": "BSD-3-Clause", + "dependencies": { + "string-hash": "~1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-2.0.0.tgz", + "integrity": "sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/datatables.net": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.5.tgz", + "integrity": "sha512-Qrwc+vuw8GHo42u1usWTuriNAMW0VvLPSW3j8g3GxvatiD8wS/ZGW32VAYLLfmF4Hz0C/fo2KB3xZBfcpqqVTQ==", + "license": "MIT", + "dependencies": { + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-dt": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-2.3.5.tgz", + "integrity": "sha512-JJkMNM03RUkv4jwAqyXsDHqUTEvti3+15466QiauzqRCmBOSwrHoglt1sRbvBwsv2isrCObp50JemgfG8R3wEQ==", + "license": "MIT", + "dependencies": { + "datatables.net": "2.3.5", + "jquery": ">=1.7" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1624250", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1624250.tgz", + "integrity": "sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", + "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "29.15.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz", + "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.0.0" + }, + "engines": { + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "jest": "*", + "typescript": ">=4.8.4 <7.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" + "jest": { + "optional": true }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "typescript": { + "optional": true } - ], + } + }, + "node_modules/eslint-plugin-lodash": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-lodash/-/eslint-plugin-lodash-8.0.0.tgz", + "integrity": "sha512-7DA8485FolmWRzh+8t4S8Pzin2TTuWfb0ZW3j/2fYElgk82ZanFz8vDcvc4BBPceYdX1p/za+tkbO68maDBGGw==", + "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", - "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "lodash": "^4.17.21" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10" }, "peerDependencies": { - "postcss": "^8.1.0" + "eslint": ">=9.0.0" } }, - "node_modules/autosuggest-highlight": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/autosuggest-highlight/-/autosuggest-highlight-3.3.4.tgz", - "integrity": "sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA==", + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "license": "MIT", "dependencies": { - "remove-accents": "^0.4.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz", - "integrity": "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "MIT", - "dependencies": { - "is-windows": "^1.0.0" + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "balanced-match": "^1.0.0" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "fill-range": "^7.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "ISC" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=0.10.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "engines": { + "node": ">=6" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, "license": "MIT" }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.x" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" + "license": "MIT" }, - "node_modules/chai": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", - "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, "engines": { - "node": ">=18" + "node": ">=8.6.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 6" } }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, - "node_modules/choices.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-9.1.0.tgz", - "integrity": "sha512-6NnqiE/MNnNAiMzdW7phJ49nMQylkKMQ6La6PAS1+h1VhrGt38MOPnjzEJ3cRaECieqaGpl9eFGtI2icW27r8A==", - "license": "MIT", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", "dependencies": { - "deepmerge": "^4.2.2", - "fuse.js": "^3.4.6", - "redux": "^4.1.2" + "reusify": "^1.0.4" } }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=16.0.0" } }, - "node_modules/chromium-bidi": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-16.0.1.tgz", - "integrity": "sha512-J63PGu/9PpeCwLIcKYyzWP6yaVL5pxuBc0shlYCYM8BaAkmlwiQboXO1iNbOgSDbVklEyYFfNEcHD8oOAWacUA==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=20.19.0 <22.0.0 || >=22.12.0" - }, - "peerDependencies": { - "devtools-protocol": "*" + "node": ">=8" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^5.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/cli-truncate": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^7.1.0", - "string-width": "^8.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "tabbable": "^6.4.0" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/codemirror": { - "version": "5.65.20", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.20.tgz", - "integrity": "sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==", - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=14.14" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.1.90" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/column-resizer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/column-resizer/-/column-resizer-1.4.0.tgz", - "integrity": "sha512-KM5Jh/UBKwVUr01oEGN/OvxF6gZIEn4c1Qde4iHSqNru9hxq93ao3u93qb9N1E1TZ2Sxjh4x7OHGe8v/P8FgkA==", - "license": "BSD-3-Clause", - "dependencies": { - "string-hash": "~1.1.3" - }, + "node_modules/fuse.js": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", + "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", + "license": "Apache-2.0", "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/datatables.net": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.5.tgz", - "integrity": "sha512-Qrwc+vuw8GHo42u1usWTuriNAMW0VvLPSW3j8g3GxvatiD8wS/ZGW32VAYLLfmF4Hz0C/fo2KB3xZBfcpqqVTQ==", - "license": "MIT", - "dependencies": { - "jquery": ">=1.7" - } - }, - "node_modules/datatables.net-dt": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-2.3.5.tgz", - "integrity": "sha512-JJkMNM03RUkv4jwAqyXsDHqUTEvti3+15466QiauzqRCmBOSwrHoglt1sRbvBwsv2isrCObp50JemgfG8R3wEQ==", - "license": "MIT", - "dependencies": { - "datatables.net": "2.3.5", - "jquery": ">=1.7" + "node": ">=10.13.0" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ms": "^2.1.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=16 || 14 >=14.17" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { "node": ">=10" }, @@ -2980,862 +6424,1182 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=8" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "MIT", "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" + "he": "bin/he" } }, - "node_modules/devtools-protocol": { - "version": "0.0.1624250", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1624250.tgz", - "integrity": "sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==", + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT" }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", "dev": true, "license": "MIT", "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" } }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/human-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", + "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", "dev": true, "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "bin": { + "human-id": "dist/cli.js" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/dom-serializer/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 4" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "BSD-2-Clause" + "license": "BSD-3-Clause" }, - "node_modules/domhandler": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", - "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.0.1" - }, + "license": "MIT", "engines": { "node": ">= 4" - }, + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/domutils/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "get-east-asian-width": "^1.3.1" }, "engines": { - "node": ">= 4" + "node": ">=18" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "better-path-resolve": "1.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=4" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/eslint": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", - "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.6.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "argparse": "^2.0.1" }, "bin": { - "eslint": "bin/eslint.js" - }, + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jschardet": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-3.1.4.tgz", + "integrity": "sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==", + "license": "LGPL-2.1+", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "node": ">=0.1.90" } }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" + "dependencies": { + "universalify": "^2.0.0" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/eslint-plugin-jest": { - "version": "29.15.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz", - "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==", + "node_modules/jsuri": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsuri/-/jsuri-1.3.1.tgz", + "integrity": "sha512-LLdAeqOf88/X0hylAI7oSir6QUsz/8kOW0FcJzzu/SJRfORA/oPHycAOthkNp7eLPlTAbqVDFbqNRHkRVzEA3g==", + "engines": { + "node": "*" + } + }, + "node_modules/keycharm": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.4.0.tgz", + "integrity": "sha512-TyQTtsabOVv3MeOpR92sIKk/br9wxS+zGj4BG7CR8YbK4jM3tyIBaF0zhzeBUMx36/Q/iQLOKKOT+3jOQtemRQ==", + "dev": true, + "license": "(Apache-2.0 OR MIT)", + "peer": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.0.0" - }, - "engines": { - "node": "^20.12.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^8.0.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "jest": "*", - "typescript": ">=4.8.4 <7.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - }, - "typescript": { - "optional": true - } + "json-buffer": "3.0.1" } }, - "node_modules/eslint-plugin-lodash": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lodash/-/eslint-plugin-lodash-8.0.0.tgz", - "integrity": "sha512-7DA8485FolmWRzh+8t4S8Pzin2TTuWfb0ZW3j/2fYElgk82ZanFz8vDcvc4BBPceYdX1p/za+tkbO68maDBGGw==", + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.21" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": ">=9.0.0" + "node": ">= 0.8.0" } }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MPL-2.0", "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "detect-libc": "^2.0.3" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 12.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 12.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 12.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 12.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 12.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" + "node": ">= 12.0.0" }, - "engines": { - "node": ">=0.10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "Apache-2.0", "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/event-target-shim": { + "node_modules/linkify-it": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", + "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "uc.micro": "^2.0.0" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "node_modules/lint-staged": { + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", + "dependencies": { + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, "engines": { - "node": ">=0.8.x" + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "dev": true, - "license": "MIT" - }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20" + } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" }, "engines": { - "node": ">=8.6.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.1", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=14" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, "engines": { - "node": "*" + "node": ">= 18" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mgrs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", + "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "MIT" }, - "node_modules/fuse.js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", - "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==", - "license": "Apache-2.0", + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">=6" + "node": ">=8.6" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "ISC", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=4" } }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -3845,2745 +7609,3062 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "brace-expansion": "^5.0.5" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/minimatch/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": "18 || 20 || >=22" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "18 || 20 || >=22" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, + "license": "MIT" + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, "license": "MIT", - "bin": { - "he": "bin/he" + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" } }, - "node_modules/htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", - "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "entities": "^2.0.0" + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, - "node_modules/human-id": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", - "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", + "node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", "dev": true, "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, "bin": { - "human-id": "dist/cli.js" + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "bin": { - "husky": "bin.js" + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/typicode" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", - "dev": true, - "license": "MIT" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=0.8.19" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.1" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/modern-tar": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.6.tgz", + "integrity": "sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=18.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/monaco-editor": { + "name": "@codingame/monaco-vscode-editor-api", + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-editor-api/-/monaco-vscode-editor-api-25.1.2.tgz", + "integrity": "sha512-dVXoBLRN8vyFHsLY6iYISaNetZ3ispXLut0qL+jvN0e0CEFkUv1F/3EAE7myptrJSS/N1AptrRIxATT3lwFP+Q==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "25.1.2" + } + }, + "node_modules/monaco-languageclient": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-10.7.0.tgz", + "integrity": "sha512-oA5cOFixkF4bspVL2zMSn48LvlNR/Cu3vJ8MCVam3PdjobSULGgHtOASuZIi3FgWK42X1z8/6hrG0LCjvNu1Hw==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-api": "^25.1.2", + "@codingame/monaco-vscode-configuration-service-override": "^25.1.2", + "@codingame/monaco-vscode-editor-api": "^25.1.2", + "@codingame/monaco-vscode-editor-service-override": "^25.1.2", + "@codingame/monaco-vscode-extension-api": "^25.1.2", + "@codingame/monaco-vscode-extensions-service-override": "^25.1.2", + "@codingame/monaco-vscode-language-pack-cs": "^25.1.2", + "@codingame/monaco-vscode-language-pack-de": "^25.1.2", + "@codingame/monaco-vscode-language-pack-es": "^25.1.2", + "@codingame/monaco-vscode-language-pack-fr": "^25.1.2", + "@codingame/monaco-vscode-language-pack-it": "^25.1.2", + "@codingame/monaco-vscode-language-pack-ja": "^25.1.2", + "@codingame/monaco-vscode-language-pack-ko": "^25.1.2", + "@codingame/monaco-vscode-language-pack-pl": "^25.1.2", + "@codingame/monaco-vscode-language-pack-pt-br": "^25.1.2", + "@codingame/monaco-vscode-language-pack-qps-ploc": "^25.1.2", + "@codingame/monaco-vscode-language-pack-ru": "^25.1.2", + "@codingame/monaco-vscode-language-pack-tr": "^25.1.2", + "@codingame/monaco-vscode-language-pack-zh-hans": "^25.1.2", + "@codingame/monaco-vscode-language-pack-zh-hant": "^25.1.2", + "@codingame/monaco-vscode-languages-service-override": "^25.1.2", + "@codingame/monaco-vscode-localization-service-override": "^25.1.2", + "@codingame/monaco-vscode-log-service-override": "^25.1.2", + "@codingame/monaco-vscode-model-service-override": "^25.1.2", + "@codingame/monaco-vscode-monarch-service-override": "^25.1.2", + "@codingame/monaco-vscode-textmate-service-override": "^25.1.2", + "@codingame/monaco-vscode-theme-defaults-default-extension": "^25.1.2", + "@codingame/monaco-vscode-theme-service-override": "^25.1.2", + "@codingame/monaco-vscode-views-service-override": "^25.1.2", + "@codingame/monaco-vscode-workbench-service-override": "^25.1.2", + "vscode": "npm:@codingame/monaco-vscode-extension-api@^25.1.2", + "vscode-languageclient": "~9.0.1", + "vscode-languageserver-protocol": "~3.17.5", + "vscode-ws-jsonrpc": "~3.5.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, + "license": "MIT" + }, + "node_modules/n3": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.26.0.tgz", + "integrity": "sha512-SQknS0ua90rN+3RHuk8BeIqeYyqIH/+ecViZxX08jR4j6MugqWRjtONl3uANG/crWXnOM2WIqBJtjIhVYFha+w==", "license": "MIT", "dependencies": { - "better-path-resolve": "1.0.0" + "buffer": "^6.0.3", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=12.0" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=20.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-static": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/node-static/-/node-static-0.7.11.tgz", + "integrity": "sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "colors": ">=0.6.0", + "mime": "^1.2.9", + "optimist": ">=0.3.4" + }, + "bin": { + "static": "bin/cli.js" + }, + "engines": { + "node": ">= 0.4.1" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "mimic-function": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", "dev": true, - "license": "MIT", + "license": "MIT/X11", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsuri": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsuri/-/jsuri-1.3.1.tgz", - "integrity": "sha512-LLdAeqOf88/X0hylAI7oSir6QUsz/8kOW0FcJzzu/SJRfORA/oPHycAOthkNp7eLPlTAbqVDFbqNRHkRVzEA3g==", - "engines": { - "node": "*" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", "dev": true, "license": "MIT" }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "p-map": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "detect-libc": "^2.0.3" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=8" } }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=6" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^0.2.7" } }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], + "node_modules/papaparse": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", + "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", + "license": "MIT" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=16 || 14 >=14.18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=8.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=0.10" } }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=6" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" } }, - "node_modules/lightningcss/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "dev": true, - "license": "Apache-2.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + }, + "node_modules/postcss-nested": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz", + "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": ">=14" + "node": ">=18.0" }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/lint-staged": { - "version": "16.2.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", - "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", + "node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "dev": true, "license": "MIT", "dependencies": { - "commander": "^14.0.2", - "listr2": "^9.0.5", - "micromatch": "^4.0.8", - "nano-spawn": "^2.0.0", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.8.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" + "node": ">=4" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/preact": { + "version": "10.29.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.2.tgz", + "integrity": "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/listr2": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", - "dependencies": { - "cli-truncate": "^5.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, "engines": { - "node": ">=20.0.0" + "node": ">= 0.8.0" } }, - "node_modules/local-pkg": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", - "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proj4": { + "version": "2.20.8", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.20.8.tgz", + "integrity": "sha512-1C8sfT4xY4PAPwk0MroFBTGF4R4bzDXdmPQTGYVLsoNssrZ9odzObxS2dTeGBty8jW8KO7h16C1Hs2JP+ctfFw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "mgrs": "1.0.0", + "wkt-parser": "^1.5.5" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ahocevar" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "dev": true, - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "node_modules/puppeteer": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.1.0.tgz", + "integrity": "sha512-7L6/0JM7XStK99lIL4xQySyNEXNfII6pk0BxkI5kKBTOhR7AsoQiv067YTsE/rIXxQiq9ajlO4WcqBjS/FWK1A==", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "@puppeteer/browsers": "3.0.4", + "chromium-bidi": "16.0.1", + "devtools-protocol": "0.0.1624250", + "lilconfig": "^3.1.3", + "puppeteer-core": "25.1.0", + "typed-query-selector": "^2.12.2" }, - "engines": { - "node": ">=18" + "bin": { + "puppeteer": "lib/puppeteer/node/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=22.12.0" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/puppeteer-core": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.1.0.tgz", + "integrity": "sha512-jKzy5y4WG6uNuFbTWgW1D7mqoT9o0nllc/6a1DGF775T1mPmgw3scdFEtEq67yVFikavQmbYq6NLfbTfxHSlqQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "3.0.4", + "chromium-bidi": "16.0.1", + "devtools-protocol": "0.0.1624250", + "typed-query-selector": "^2.12.2", + "webdriver-bidi-protocol": "0.4.2", + "ws": "^8.21.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=22.12.0" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/qlue-ls": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/qlue-ls/-/qlue-ls-2.8.2.tgz", + "integrity": "sha512-CcQ+cbl2yc6JbuBa31RIg+IFQgr0TaBJ/qaExCjDuUUTUn0/0ZgoM6pEkitzzuu2tBZG+xkHiq5dVCYj3ygB7Q==", + "license": "SEE LICENSE IN LICENSE" + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/query-string": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", + "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "safe-buffer": "^5.1.0" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "node_modules/rdf-data-factory": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-2.0.2.tgz", + "integrity": "sha512-WzPoYHwQYWvIP9k+7IBLY1b4nIDitzAK4mA37WumAF/Cjvu/KOtYJH9IPZnUTWNSd5K2+pq4vrcE9WZC4sRHhg==", "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "@rdfjs/types": "^2.0.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.5" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/minimatch/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "@babel/runtime": "^7.9.2" } }, - "node_modules/minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" } }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" + "regex-utilities": "^2.3.0" } }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "dev": true, "license": "MIT" }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "node_modules/remove-accents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz", + "integrity": "sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/mocha": { - "version": "11.7.5", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", - "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "dependencies": { - "browser-stdout": "^1.3.1", - "chokidar": "^4.0.1", - "debug": "^4.3.5", - "diff": "^7.0.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^10.4.5", - "he": "^1.2.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^9.0.5", - "ms": "^2.1.3", - "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^9.2.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" } }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/rimraf/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "yocto-queue": "^0.1.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "p-limit": "^3.0.2" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "rolldown": "bin/cli.mjs" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/modern-tar": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.6.tgz", - "integrity": "sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=4" + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", "dev": true, - "license": "MIT" - }, - "node_modules/n3": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/n3/-/n3-1.26.0.tgz", - "integrity": "sha512-SQknS0ua90rN+3RHuk8BeIqeYyqIH/+ecViZxX08jR4j6MugqWRjtONl3uANG/crWXnOM2WIqBJtjIhVYFha+w==", "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "readable-stream": "^4.0.0" + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=12.0" - } - }, - "node_modules/nano-spawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", - "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.17" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" } }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, - "node_modules/node-static": { - "version": "0.7.11", - "resolved": "https://registry.npmjs.org/node-static/-/node-static-0.7.11.tgz", - "integrity": "sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ==", + "node_modules/sass": { + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.95.0.tgz", + "integrity": "sha512-9QMjhLq+UkOg/4bb8Lt8A+hJZvY3t+9xeZMKSBtBEgxrXA3ed5Ts4NDreUkYgJP1BTmrscQE/xYhf7iShow6lw==", "dev": true, "license": "MIT", "dependencies": { - "colors": ">=0.6.0", - "mime": "^1.2.9", - "optimist": ">=0.3.4" + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { - "static": "bin/cli.js" + "sass": "sass.js" }, "engines": { - "node": ">= 0.4.1" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "peer": true }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" + "node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "license": "MIT/X11", + "license": "BSD-3-Clause", "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "randombytes": "^2.1.0" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", "engines": { - "node": ">=6" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { "node": ">=8" } }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "node_modules/sortablejs": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", + "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "BlueOak-1.0.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/package-manager-detector": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { - "quansync": "^0.2.7" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/papaparse": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", - "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", - "license": "MIT" + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/store": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/store/-/store-2.0.12.tgz", + "integrity": "sha512-eO9xlzDpXLiMr9W1nQ3Nfp9EzZieIQc10zPPMP5jsVV7bLOziSFFBP0XoDXACEIFtdI+rIz0NwWVA/QVJ8zJtw==", "license": "MIT", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.6.19" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "license": "CC0-1.0" }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=8.6" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=8" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=8" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/puppeteer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.1.0.tgz", - "integrity": "sha512-7L6/0JM7XStK99lIL4xQySyNEXNfII6pk0BxkI5kKBTOhR7AsoQiv067YTsE/rIXxQiq9ajlO4WcqBjS/FWK1A==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "3.0.4", - "chromium-bidi": "16.0.1", - "devtools-protocol": "0.0.1624250", - "lilconfig": "^3.1.3", - "puppeteer-core": "25.1.0", - "typed-query-selector": "^2.12.2" - }, - "bin": { - "puppeteer": "lib/puppeteer/node/cli.js" - }, + "license": "MIT", "engines": { - "node": ">=22.12.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/puppeteer-core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.1.0.tgz", - "integrity": "sha512-jKzy5y4WG6uNuFbTWgW1D7mqoT9o0nllc/6a1DGF775T1mPmgw3scdFEtEq67yVFikavQmbYq6NLfbTfxHSlqQ==", + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@puppeteer/browsers": "3.0.4", - "chromium-bidi": "16.0.1", - "devtools-protocol": "0.0.1624250", - "typed-query-selector": "^2.12.2", - "webdriver-bidi-protocol": "0.4.2", - "ws": "^8.21.0" + "copy-anything": "^4" }, "engines": { - "node": ">=22.12.0" + "node": ">=16" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "license": "MIT", "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/swls-wasm": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/swls-wasm/-/swls-wasm-0.3.1.tgz", + "integrity": "sha512-HDYg3euyEYShZINGscoodKqyK4eyTxJ6PviCCv055Rtfe6+8l4iojPuZMriGcB2hs26RFsKTUSD6t1691VtnQA==" + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=6" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/read-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=12" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "is-number": "^7.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8.0" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/remove-accents": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz", - "integrity": "sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==", - "license": "MIT" + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/typed-query-selector": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz", + "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "node_modules/typedoc": { + "version": "0.28.19", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.19.tgz", + "integrity": "sha512-wKh+lhdmMFivMlc6vRRcMGXeGEHGU2g8a2CkPTJjJlwRf1iXbimWIPcFolCqe4E0d/FRtGszpIrsp3WLpDB8Pw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" + "@gerrit0/mini-shiki": "^3.23.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.1", + "minimatch": "^10.2.5", + "yaml": "^2.8.3" + }, + "bin": { + "typedoc": "bin/typedoc" }, "engines": { - "node": ">=18" + "node": ">= 18", + "pnpm": ">= 10" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/typedoc-plugin-markdown": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.12.0.tgz", + "integrity": "sha512-eJDEMAfxCmede22c/Jw7d0FA13ggAQv+KkwQYKYCdqI02cin6Rc9QRwbG/7XvvHWinuFejySnZVUWDtvGk3Vbg==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.28.x" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "node_modules/typedoc-vitepress-theme": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/typedoc-vitepress-theme/-/typedoc-vitepress-theme-1.1.3.tgz", + "integrity": "sha512-EK9iV7e3+R8lFNigdc0rIPWMxqfmDku0uGac3qYUu9tS4Qf1rhWZnyZJ4zu4G3iXrP5mqNPkv2wpODzRlA7jLw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peerDependencies": { + "typedoc-plugin-markdown": ">=4.11.0" + } }, - "node_modules/rimraf": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.3", - "package-json-from-dist": "^1.0.1" - }, + "license": "Apache-2.0", "bin": { - "rimraf": "dist/esm/bin.mjs" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14.17" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "node_modules/typescript-eslint": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.1.tgz", + "integrity": "sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" + "@typescript-eslint/eslint-plugin": "8.60.1", + "@typescript-eslint/parser": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1" }, "engines": { - "node": "18 || 20 || >=22" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/rimraf/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.133.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" + "@types/unist": "^3.0.0" }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/sass": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.95.0.tgz", - "integrity": "sha512-9QMjhLq+UkOg/4bb8Lt8A+hJZvY3t+9xeZMKSBtBEgxrXA3ed5Ts4NDreUkYgJP1BTmrscQE/xYhf7iShow6lw==", + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/semver": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", - "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 10.0.0" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "randombytes": "^2.1.0" + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/unplugin-dts": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.0.2.tgz", + "integrity": "sha512-VbNiMD0LMl/t6nJueGtrCp79N7ZO1nquxj/FUybJDnKwZGsnW2wjdwBSzA3QEHujoxmxZIptsG43hL7LzXE96w==", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.26", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "unplugin": "^2.3.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@microsoft/api-extractor": ">=7", + "@rspack/core": "^1", + "@vue/language-core": "~3.1.5", + "esbuild": "*", + "rolldown": "*", + "rollup": ">=3", + "typescript": ">=4", + "vite": ">=3", + "webpack": "^4 || ^5" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "@vue/language-core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/update-browserslist-db": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "engines": { - "node": ">=8" + "peer": true, + "bin": { + "uuid": "dist/esm/bin/uuid" } }, - "node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sortablejs": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", - "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/vis-data": { + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.10.tgz", + "integrity": "sha512-23juM9tdCaHTX5vyIQ7XBzsfZU0Hny+gSTwniLrfFcmw9DOm7pi3+h9iEBsoZMp5rX6KNqWwc1MF0fkAmWVuoQ==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "license": "(Apache-2.0 OR MIT)", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "vis-util": "^5.0.1" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/vis-network": { + "version": "9.1.13", + "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.13.tgz", + "integrity": "sha512-HLeHd5KZS92qzO1kC59qMh1/FWAZxMUEwUWBwDMoj6RKj/Ajkrgy/heEYo0Zc8SZNQ2J+u6omvK2+a28GX1QuQ==", "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "license": "(Apache-2.0 OR MIT)", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "@egjs/hammerjs": "^2.0.0", + "component-emitter": "^1.3.0 || ^2.0.0", + "keycharm": "^0.2.0 || ^0.3.0 || ^0.4.0", + "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "vis-data": "^6.3.0 || ^7.0.0", + "vis-util": "^5.0.1" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/vis-util": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.7.tgz", + "integrity": "sha512-E3L03G3+trvc/X4LXvBfih3YIHcKS2WrP0XTdZefr6W6Qi/2nNCqZfe4JFfJU6DcQLm6Gxqj2Pfl+02859oL5A==", "dev": true, - "license": "BSD-3-Clause", + "license": "(Apache-2.0 OR MIT)", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "@egjs/hammerjs": "^2.0.0", + "component-emitter": "^1.3.0 || ^2.0.0" } }, - "node_modules/spawndamnit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, - "license": "SEE LICENSE IN LICENSE", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.5", - "signal-exit": "^4.0.1" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "node_modules/vite-plugin-dts": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-5.0.2.tgz", + "integrity": "sha512-lNeHS+dwGju6eRmNvZQt8Shwv9j3m98hbHse/lIbLq9q3yE2DcIOBBYQEVUF6tS0kOmv+VA9Z5FqmzFnGe4U8g==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "unplugin-dts": "1.0.2" + }, + "peerDependencies": { + "@microsoft/api-extractor": ">=7", + "rollup": ">=3", + "vite": ">=3" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "node_modules/vite-plugin-wasm": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.6.0.tgz", + "integrity": "sha512-mL/QPziiIA4RAA6DkaZZzOstdwbW5jO4Vz7Zenj0wieKWBlNvIvX5L5ljum9lcUX0ShNfBgCNLKTjNkRVVqcsw==", "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/store": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/store/-/store-2.0.12.tgz", - "integrity": "sha512-eO9xlzDpXLiMr9W1nQ3Nfp9EzZieIQc10zPPMP5jsVV7bLOziSFFBP0XoDXACEIFtdI+rIz0NwWVA/QVJ8zJtw==", "license": "MIT", - "engines": { - "node": "*" + "peerDependencies": { + "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } } }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "node_modules/vitepress/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=0.6.19" + "node": ">=12" } }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "license": "CC0-1.0" + "node_modules/vitepress/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "node_modules/vitepress/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/vitepress/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/vitepress/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/vitepress/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/vitepress/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/vitepress/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/vitepress/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=12" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "node": ">=12" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/vitepress/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/vitepress/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" + "node": ">=12" } }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peerDependencies": { - "typescript": ">=3.7.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/vitepress/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/typed-query-selector": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz", - "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/vitepress/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14.17" + "node": ">=12" } }, - "node_modules/typescript-eslint": { - "version": "8.60.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.1.tgz", - "integrity": "sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==", + "node_modules/vitepress/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.60.1", - "@typescript-eslint/parser": "8.60.1", - "@typescript-eslint/typescript-estree": "8.60.1", - "@typescript-eslint/utils": "8.60.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "node": ">=12" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/vitepress/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 10.0.0" + "node": ">=12" } }, - "node_modules/unplugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "node_modules/vitepress/node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "acorn": "^8.15.0", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, "engines": { - "node": ">=18.12.0" + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" } }, - "node_modules/unplugin-dts": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.0.2.tgz", - "integrity": "sha512-VbNiMD0LMl/t6nJueGtrCp79N7ZO1nquxj/FUybJDnKwZGsnW2wjdwBSzA3QEHujoxmxZIptsG43hL7LzXE96w==", + "node_modules/vitepress/node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.26", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "unplugin": "^2.3.2" + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@microsoft/api-extractor": ">=7", - "@rspack/core": "^1", - "@vue/language-core": "~3.1.5", - "esbuild": "*", - "rolldown": "*", - "rollup": ">=3", - "typescript": ">=4", - "vite": ">=3", - "webpack": "^4 || ^5" + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" }, "peerDependenciesMeta": { - "@microsoft/api-extractor": { + "async-validator": { "optional": true }, - "@rspack/core": { + "axios": { "optional": true }, - "@vue/language-core": { + "change-case": { "optional": true }, - "esbuild": { + "drauu": { "optional": true }, - "rolldown": { + "focus-trap": { "optional": true }, - "rollup": { + "fuse.js": { "optional": true }, - "vite": { + "idb-keyval": { "optional": true }, - "webpack": { + "jwt-decode": { "optional": true - } - } - }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "nprogress": { + "optional": true }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" } }, - "node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "node_modules/vitepress/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", - "tinyglobby": "^0.2.17" - }, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": ">=12" }, "optionalDependencies": { - "fsevents": "~2.3.3" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitepress/node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { + "less": { "optional": true }, - "less": { + "lightningcss": { "optional": true }, "sass": { @@ -6600,54 +10681,71 @@ }, "terser": { "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true } } }, - "node_modules/vite-plugin-dts": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-5.0.2.tgz", - "integrity": "sha512-lNeHS+dwGju6eRmNvZQt8Shwv9j3m98hbHse/lIbLq9q3yE2DcIOBBYQEVUF6tS0kOmv+VA9Z5FqmzFnGe4U8g==", - "dev": true, + "node_modules/vscode": { + "name": "@codingame/monaco-vscode-extension-api", + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-extension-api/-/monaco-vscode-extension-api-25.1.2.tgz", + "integrity": "sha512-SJW/YOhjo+9MXEyzMwQMUWdJVR3Llc6pTq5JQqs6Y30v73gTrpLqtzbd9FNdCuQR8S6bUk5ScH8GL4QrVuL5FA==", "license": "MIT", "dependencies": { - "unplugin-dts": "1.0.2" - }, - "peerDependencies": { - "@microsoft/api-extractor": ">=7", - "rollup": ">=3", - "vite": ">=3" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "rollup": { - "optional": true - }, - "vite": { - "optional": true - } + "@codingame/monaco-vscode-api": "25.1.2", + "@codingame/monaco-vscode-extensions-service-override": "25.1.2" } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", + "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", + "license": "MIT", + "dependencies": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.5" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "vscode": "^1.82.0" + } + }, + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, "node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", @@ -6655,6 +10753,56 @@ "dev": true, "license": "MIT" }, + "node_modules/vscode-ws-jsonrpc": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-3.5.0.tgz", + "integrity": "sha512-13ZDy7Od4AfEPK2HIfY3DtyRi4FVsvFql1yobVJrpIoHOKGGJpIjVvIJpMxkrHzCZzWlYlg+WEu2hrYkCTvM0Q==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "~8.2.1" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/vscode-ws-jsonrpc/node_modules/vscode-jsonrpc": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", + "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vue": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", + "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-sfc": "3.5.35", + "@vue/runtime-dom": "3.5.35", + "@vue/server-renderer": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, "node_modules/webdriver-bidi-protocol": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.2.tgz", @@ -6685,6 +10833,16 @@ "node": ">= 8" } }, + "node_modules/wkt-parser": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.5.5.tgz", + "integrity": "sha512-/zMYi94/7D7fxcOSlVmWn6vnOMj3Gq5d1xvVjaYOS9n6h0qOJ4I7YYVxBWYcH1vq9+suhqzXkn05Yx47zQNUIA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ahocevar" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -6874,9 +11032,9 @@ } }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "bin": { @@ -6969,6 +11127,18 @@ "node": ">=8" } }, + "node_modules/yasgui-geo-tg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/yasgui-geo-tg/-/yasgui-geo-tg-1.1.2.tgz", + "integrity": "sha512-mP15sP5aG0jJJtnK5P7T4fEoN0sXZLH9YsnK3pKa1p9bqNaFwiL13wQNYwdGSN0GWuk5ZWQl2tfiK7gSkoaumg==", + "dev": true, + "license": "MIT", + "dependencies": { + "betterknown": "^1.1.1", + "leaflet": "^1.9.4", + "proj4": "^2.20.2" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -6992,37 +11162,138 @@ "url": "https://github.com/sponsors/colinhacks" } }, - "packages/utils": { - "name": "@zazuko/yasgui-utils", + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/sparql-editor-codemirror": { + "name": "@rdfjs/sparql-editor-codemirror", "version": "4.6.1", "license": "MIT", "dependencies": { - "dompurify": "^3.2.4", - "store": "^2.0.12" + "@codemirror/autocomplete": "^6.18.0", + "@codemirror/commands": "^6.6.0", + "@codemirror/language": "^6.10.2", + "@codemirror/lint": "^6.8.1", + "@codemirror/lsp-client": "^6.2.4", + "@codemirror/search": "^6.5.6", + "@codemirror/state": "^6.4.1", + "@codemirror/view": "^6.28.0", + "@lezer/highlight": "^1.2.3", + "@rdfjs/sparql-utils": "^4.6.1", + "events": "^3.3.0", + "lodash-es": "^4.18.1", + "query-string": "^6.10.1" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.3", + "@types/node": "^22.5.4" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/sparql-editor-codemirror/node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/sparql-editor-monaco": { + "name": "@rdfjs/sparql-editor-monaco", + "version": "4.6.1", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-textmate-service-override": "^25.1.2", + "@rdfjs/sparql-utils": "^4.6.1", + "lodash-es": "^4.18.1", + "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@^25.1.2", + "monaco-languageclient": "~10.7.0", + "query-string": "^6.10.1", + "vscode": "npm:@codingame/monaco-vscode-extension-api@^25.1.2" }, "devDependencies": { + "@types/lodash-es": "^4.17.3", "@types/node": "^22.5.4" + }, + "engines": { + "node": ">= 8" } }, - "packages/utils/node_modules/@types/node": { - "version": "22.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz", - "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", + "packages/sparql-editor-monaco/node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, - "packages/yasgui": { - "name": "@zazuko/yasgui", + "packages/sparql-results": { + "name": "@rdfjs/sparql-results", + "version": "4.6.1", + "license": "MIT", + "dependencies": { + "@codemirror/lang-json": "^6.0.2", + "@codemirror/language": "^6.12.3", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.43.0", + "@fortawesome/free-solid-svg-icons": "^5.14.0", + "@json2csv/plainjs": "^7.0.4", + "@rdfjs/sparql-editor-monaco": "^4.6.1", + "@rdfjs/sparql-utils": "^4.6.1", + "colors": "^1.4.0", + "column-resizer": "^1.4.0", + "datatables.net": "^2.0.5", + "datatables.net-dt": "^2.0.5", + "dompurify": "^3.2.4", + "jquery": "^3.7.1", + "lodash-es": "^4.18.1", + "n3": "^1.3.5", + "papaparse": "^5.3.1" + }, + "devDependencies": { + "@types/jquery": "^3.5.32", + "@types/lodash-es": "^4.17.3", + "@types/n3": "^1.1.5", + "@types/node": "^22.5.4", + "@types/papaparse": "^5.3.2", + "@types/sanitize-html": "^1.20.2" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/sparql-results/node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/sparql-studio": { + "name": "@rdfjs/sparql-studio", "version": "4.6.1", "license": "MIT", "dependencies": { + "@rdfjs/sparql-results": "^4.6.1", + "@rdfjs/sparql-utils": "^4.6.1", "@tarekraafat/autocomplete.js": "^7.2.0", - "@zazuko/yasgui-utils": "^4.6.1", - "@zazuko/yasqe": "^4.6.1", - "@zazuko/yasr": "^4.6.1", "autosuggest-highlight": "^3.1.1", "blueimp-md5": "^2.12.0", "choices.js": "^9.0.1", @@ -7040,55 +11311,146 @@ "@types/node": "^22.5.4" } }, - "packages/yasgui/node_modules/@types/node": { - "version": "22.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz", - "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", + "packages/sparql-studio/node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, - "packages/yasqe": { - "name": "@zazuko/yasqe", + "packages/sparql-utils": { + "name": "@rdfjs/sparql-utils", "version": "4.6.1", "license": "MIT", "dependencies": { - "@zazuko/yasgui-utils": "^4.6.1", - "codemirror": "^5.51.0", + "dompurify": "^3.2.4", "lodash-es": "^4.18.1", - "query-string": "^6.10.1" + "query-string": "^6.10.1", + "store": "^2.0.12" }, "devDependencies": { - "@types/codemirror": "0.0.100", "@types/lodash-es": "^4.17.3", "@types/node": "^22.5.4" - }, - "engines": { - "node": ">= 8" } }, - "packages/yasqe/node_modules/@types/node": { - "version": "22.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz", - "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", + "packages/sparql-utils/node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "packages/utils": { + "name": "@rdfjs/sparql-utils", + "version": "4.6.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "dompurify": "^3.2.4", + "lodash-es": "^4.18.1", + "query-string": "^6.10.1", + "store": "^2.0.12" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.3", + "@types/node": "^22.5.4" + } + }, + "packages/yasgui": { + "name": "@rdfjs/sparql-studio", + "version": "4.6.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@rdfjs/sparql-results": "^4.6.1", + "@rdfjs/sparql-utils": "^4.6.1", + "@tarekraafat/autocomplete.js": "^7.2.0", + "autosuggest-highlight": "^3.1.1", + "blueimp-md5": "^2.12.0", + "choices.js": "^9.0.1", + "dompurify": "^3.2.4", + "es6-object-assign": "^1.1.0", + "jsuri": "^1.3.1", + "lodash-es": "^4.18.1", + "sortablejs": "^1.10.2" + }, + "devDependencies": { + "@types/autosuggest-highlight": "^3.1.0", + "@types/blueimp-md5": "^2.7.0", + "@types/jsuri": "^1.3.30", + "@types/lodash-es": "^4.17.3", + "@types/node": "^22.5.4" + } + }, + "packages/yasqe": { + "name": "@rdfjs/sparql-editor-monaco", + "version": "4.6.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-textmate-service-override": "^25.1.2", + "@rdfjs/sparql-utils": "^4.6.1", + "lodash-es": "^4.18.1", + "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@^25.1.2", + "monaco-languageclient": "~10.7.0", + "query-string": "^6.10.1", + "vscode": "npm:@codingame/monaco-vscode-extension-api@^25.1.2" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.3", + "@types/node": "^22.5.4" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/yasqe-codemirror": { + "name": "@rdfjs/sparql-editor-codemirror", + "version": "4.6.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.18.0", + "@codemirror/commands": "^6.6.0", + "@codemirror/language": "^6.10.2", + "@codemirror/lint": "^6.8.1", + "@codemirror/lsp-client": "^6.2.4", + "@codemirror/search": "^6.5.6", + "@codemirror/state": "^6.4.1", + "@codemirror/view": "^6.28.0", + "@rdfjs/sparql-utils": "^4.6.1", + "events": "^3.3.0", + "lodash-es": "^4.18.1", + "query-string": "^6.10.1" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.3", + "@types/node": "^22.5.4" + }, + "engines": { + "node": ">= 8" + } + }, "packages/yasr": { - "name": "@zazuko/yasr", + "name": "@rdfjs/sparql-results", "version": "4.6.1", + "extraneous": true, "license": "MIT", "dependencies": { + "@codemirror/lang-json": "^6.0.2", + "@codemirror/language": "^6.12.3", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.43.0", "@fortawesome/free-solid-svg-icons": "^5.14.0", "@json2csv/plainjs": "^7.0.4", - "@zazuko/yasgui-utils": "^4.6.1", - "@zazuko/yasqe": "^4.6.1", - "codemirror": "^5.51.0", + "@rdfjs/sparql-editor-monaco": "^4.6.1", + "@rdfjs/sparql-utils": "^4.6.1", "colors": "^1.4.0", "column-resizer": "^1.4.0", "datatables.net": "^2.0.5", @@ -7100,28 +11462,16 @@ "papaparse": "^5.3.1" }, "devDependencies": { - "@types/codemirror": "0.0.100", "@types/jquery": "^3.5.32", "@types/lodash-es": "^4.17.3", "@types/n3": "^1.1.5", "@types/node": "^22.5.4", "@types/papaparse": "^5.3.2", - "@types/sanitize-html": "^1.20.2", - "ts-essentials": "^7.0.1" + "@types/sanitize-html": "^1.20.2" }, "engines": { "node": ">= 8" } - }, - "packages/yasr/node_modules/@types/node": { - "version": "22.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz", - "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } } } } diff --git a/package.json b/package.json index 34e3cc11..8a12e3f0 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "yasgui", + "name": "sparql-studio-monorepo", "private": true, "workspaces": [ "packages/*" @@ -10,8 +10,8 @@ "preview": "vite preview --port 4000", "build": "rimraf ./build && npm run build:demo && npm run build:lib", "build:demo": "NODE_ENV=production vite build", - "build:lib": "for p in utils yasqe yasr yasgui; do BUILD_PACKAGE=$p NODE_ENV=production vite build || exit 1; done", - "util:prefixes": "curl -fsS http://prefix.cc/popular/all.file.json | jq 'to_entries | .[0:500] | from_entries' > packages/yasqe/src/prefixes.json", + "build:lib": "for p in sparql-utils sparql-editor-monaco sparql-editor-codemirror sparql-results sparql-studio; do BUILD_PACKAGE=$p NODE_ENV=production vite build || exit 1; done", + "util:prefixes": "curl -fsS http://prefix.cc/popular/all.file.json | jq 'to_entries | .[0:500] | from_entries' > prefixes.json", "util:lint": "ESLINT_STRICT=true eslint \"packages/*/{src,test,grammar}/**/*.{ts,tsx}\"", "util:validateTs": "tsc -p ./tsconfig.json --noEmit", "util:prettify": "prettier --parser typescript --write $(find ./packages/*/src -regex '.*\\.tsx?$') && prettier --parser css --write $(find ./packages/*/src -regex '.*\\.?scss$')", @@ -22,7 +22,10 @@ "unit-test": "tsc -p ./tsconfig-test.json && mocha $(find ./build/test -name '*-test.js') --require source-map-support/register || true", "puppeteer-test": "tsc -p ./tsconfig-test.json && mocha --timeout 30000 ./build/test/test/run.js --require source-map-support/register", "prerelease": "npm run build && npm run test", - "release": "changeset publish" + "release": "changeset publish", + "docs:dev": "typedoc && vitepress dev docs", + "docs:build": "typedoc && vitepress build docs", + "docs:preview": "vitepress preview docs" }, "lint-staged": { "*.ts?(x)": [ @@ -35,6 +38,8 @@ }, "devDependencies": { "@changesets/cli": "^2.29.7", + "@codingame/esbuild-import-meta-url-plugin": "^1.0.3", + "@matdata/yasgui-graph-plugin": "^1.6.2", "@types/chai": "^5.2.3", "@types/fs-extra": "^11.0.4", "@types/mocha": "^10.0.10", @@ -50,17 +55,30 @@ "lint-staged": "^16.2.6", "mocha": "^11.7.4", "node-static": "^0.7.11", + "postcss-nested": "^7.0.2", "prettier": "^3.6.2", "puppeteer": "^25.1.0", "rimraf": "^6.1.3", "sass": "^1.93.3", "source-map-support": "^0.5.21", + "typedoc": "^0.28.19", + "typedoc-plugin-markdown": "^4.12.0", + "typedoc-vitepress-theme": "^1.1.3", "typescript": "^5.9.3", "typescript-eslint": "^8.60.1", "vite": "^8.0.16", - "vite-plugin-dts": "^5.0.2" + "vite-plugin-dts": "^5.0.2", + "vite-plugin-wasm": "^3.4.1", + "vitepress": "^1.6.4", + "yasgui-geo-tg": "^1.1.2" }, "prettier": { "printWidth": 120 + }, + "dependencies": { + "@traqula/chevrotain": "^1.1.0", + "@traqula/parser-sparql-1-2": "^1.1.4", + "qlue-ls": "^2.8.2", + "swls-wasm": "^0.3.1" } } diff --git a/packages/sparql-editor-codemirror/package.json b/packages/sparql-editor-codemirror/package.json new file mode 100644 index 00000000..1d26c55b --- /dev/null +++ b/packages/sparql-editor-codemirror/package.json @@ -0,0 +1,60 @@ +{ + "name": "@rdfjs/sparql-editor-codemirror", + "description": "SPARQL query editor for the web, based on CodeMirror 6 (fork of Yasqe)", + "version": "4.6.1", + "type": "module", + "main": "build/sparql-editor-codemirror.js", + "module": "build/sparql-editor-codemirror.js", + "types": "build/ts/src/index.d.ts", + "files": ["build"], + "exports": { + ".": { + "types": "./build/ts/src/index.d.ts", + "import": "./build/sparql-editor-codemirror.js" + }, + "./style.css": "./build/sparql-editor-codemirror.css", + "./*": "./*" + }, + "license": "MIT", + "author": "Triply ", + "homepage": "https://github.com/rdfjs/Yasgui", + "engines": { + "node": ">= 8" + }, + "keywords": [ + "JavaScript", + "SPARQL", + "Editor", + "CodeMirror", + "Semantic Web", + "Linked Data" + ], + "bugs": "https://github.com/rdfjs/Yasgui/issues/", + "repository": { + "type": "git", + "url": "https://github.com/rdfjs/Yasgui.git", + "directory": "packages/sparql-editor-codemirror" + }, + "dependencies": { + "@codemirror/autocomplete": "^6.18.0", + "@codemirror/commands": "^6.6.0", + "@codemirror/language": "^6.10.2", + "@codemirror/lint": "^6.8.1", + "@codemirror/lsp-client": "^6.2.4", + "@codemirror/search": "^6.5.6", + "@codemirror/state": "^6.4.1", + "@codemirror/view": "^6.28.0", + "@lezer/highlight": "^1.2.3", + "@rdfjs/sparql-utils": "^4.6.1", + "events": "^3.3.0", + "lodash-es": "^4.18.1", + "query-string": "^6.10.1" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.3", + "@types/node": "^22.5.4" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/sparql-editor-codemirror/src/defaults.ts b/packages/sparql-editor-codemirror/src/defaults.ts new file mode 100644 index 00000000..9edda732 --- /dev/null +++ b/packages/sparql-editor-codemirror/src/defaults.ts @@ -0,0 +1,71 @@ +/** + * Default options for the CodeMirror 6 SparqlEditor. Override by setting `SparqlEditor.defaults` or by + * passing your own options as the second argument to the constructor. + */ +import { default as SparqlEditor, Config } from "./"; +import { defaultQueryValue, defaultRequestConfig, PlainRequestConfig } from "@rdfjs/sparql-utils"; +import * as queryString from "query-string"; + +export default function get() { + const prefixCcApi = + (window.location.protocol.indexOf("http") === 0 ? "//" : "http://") + "prefix.cc/popular/all.file.json"; + + const config: Omit = { + value: defaultQueryValue, + lineNumbers: true, + lineWrapping: true, + highlightActiveLine: true, + foldGutter: true, + matchBrackets: true, + readOnly: false, + syntaxErrorCheck: true, + extensions: [], + // Language servers are consumer-provided; none by default (SparqlEditor is then a plain text editor) + languageServers: [], + // Follow the OS/browser preference by default so the editor matches the auto-adapting chrome. + // Callers can override by passing `theme` explicitly or via SparqlEditor.setTheme(). + theme: + typeof window !== "undefined" && window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light", + showQueryButton: true, + resizeable: true, + editorHeight: "300px", + queryingDisabled: undefined, + collapsePrefixesOnLoad: false, + autocompleters: [], + hintConfig: {}, + + createShareableLink: function (yasqe: SparqlEditor) { + return ( + document.location.protocol + + "//" + + document.location.host + + document.location.pathname + + document.location.search + + "#" + + queryString.stringify(yasqe.configToQueryParams()) + ); + }, + createShortLink: undefined, + consumeShareLink: function (yasqe: SparqlEditor) { + yasqe.queryParamsToConfig(yasqe.getUrlParams()); + }, + persistenceId: function (yasqe: SparqlEditor) { + let id = ""; + let elem: any = yasqe.rootEl; + if (elem?.id) id = elem.id; + for (; elem && elem !== (document as any); elem = elem.parentNode) { + if (elem?.id) { + id = elem.id; + break; + } + } + return "sparql-editor_" + id + "_query"; + }, + persistencyExpire: 60 * 60 * 24 * 30, + pluginButtons: undefined, + prefixCcApi, + }; + + const requestConfig: PlainRequestConfig = { ...defaultRequestConfig }; + return { ...config, requestConfig }; +} diff --git a/packages/sparql-editor-codemirror/src/imgs.ts b/packages/sparql-editor-codemirror/src/imgs.ts new file mode 100644 index 00000000..66fca7bc --- /dev/null +++ b/packages/sparql-editor-codemirror/src/imgs.ts @@ -0,0 +1,12 @@ +export var query = + ''; +export var queryInvalid = + ''; +export var download = + ''; +export var share = + ''; +export var format = + ''; +export var warning = + ''; diff --git a/packages/sparql-editor-codemirror/src/index.ts b/packages/sparql-editor-codemirror/src/index.ts new file mode 100644 index 00000000..3bb1bfe7 --- /dev/null +++ b/packages/sparql-editor-codemirror/src/index.ts @@ -0,0 +1,1336 @@ +/** + * SparqlEditor (CodeMirror 6 edition) · the standalone CodeMirror-based SPARQL query editor. + * + * SparqlEditor is language server agnostic. The embedder supplies each server as a Web `Worker` (the + * universal LS transport, identical to the Monaco-based `@rdfjs/sparql-editor-monaco`) via + * `config.languageServers`; SparqlEditor builds the `@codemirror/lsp-client` `LSPClient` internally. All + * language features (highlighting, diagnostics, completion, hover, formatting) come from the active + * server; SparqlEditor ships no SPARQL grammar of its own. When two or more servers are configured, a + * switcher dropdown lets the user pick between them at runtime ({@link SparqlEditor.setLanguageServer}). + * @module YasqeCodeMirror + */ +import "./style/yasqe.css"; +import "./style/buttons.css"; +import "./style/codemirrorMods.css"; + +import { EventEmitter } from "events"; +import { merge } from "lodash-es"; +import * as queryString from "query-string"; + +import { EditorState, Extension, Compartment } from "@codemirror/state"; +import { + EditorView, + keymap, + highlightSpecialChars, + drawSelection, + highlightActiveLine, + dropCursor, + rectangularSelection, + crosshairCursor, + lineNumbers, + highlightActiveLineGutter, + ViewUpdate, +} from "@codemirror/view"; +import { + defaultHighlightStyle, + syntaxHighlighting, + indentOnInput, + bracketMatching, + codeFolding, + foldGutter, + foldService, + foldEffect, + foldKeymap, +} from "@codemirror/language"; +import { indentWithTab, defaultKeymap, history, historyKeymap } from "@codemirror/commands"; +import { search, searchKeymap, highlightSelectionMatches } from "@codemirror/search"; +import { autocompletion, completionKeymap, closeBrackets, closeBracketsKeymap } from "@codemirror/autocomplete"; +import { lintGutter, lintKeymap } from "@codemirror/lint"; +import { LSPPlugin, type LSPClient } from "@codemirror/lsp-client"; + +import { + Storage as YStorage, + drawSvgStringAsElement, + addClass, + removeClass, + getQueryType, + getQueryMode, + getPrefixesFromQuery, + getSparqlBlockFoldingRanges, + executeQuery, + getAjaxConfig, + getUrlArguments, + getAcceptHeader, + getAsCurlString, + createLspErrorNotification, + openSettingsPanel, + unflatten, + defaultsFromSchema, +} from "@rdfjs/sparql-utils"; +import type { + DeepPartial, + QueryType, + RequestConfig, + IEditor, + Prefixes, + EditorAjaxConfig, + RequestArgs, + LspErrorNotification, + LanguageServerDef as SharedLanguageServerDef, + LanguageServerSettingsSchema, + LspConnection, +} from "@rdfjs/sparql-utils"; +export type { QueryType, RequestConfig, PlainRequestConfig, Prefixes } from "@rdfjs/sparql-utils"; +export type { LanguageServerSettingsSchema, SettingFieldSchema, LspConnection } from "@rdfjs/sparql-utils"; +import { connectLanguageClient } from "./lsp/connect"; +import { clearSemanticTokens } from "./lsp/glue"; +import { sparqlFallbackHighlight } from "./lsp/sparqlHighlight"; + +/** A language server made available to the CodeMirror-based SparqlEditor. The editor-agnostic descriptor + * with its `yasqe` hook argument bound to this editor's {@link SparqlEditor}. Defined once in + * `@rdfjs/sparql-utils` so the SAME object also works with `@rdfjs/sparql-editor-monaco` (Monaco). */ +export type LanguageServerDef = SharedLanguageServerDef; + +/** Adapt a CodeMirror `LSPClient` to the editor-agnostic {@link LspConnection} handed to + * language server hooks. Cached per client so identity-based de-dup (e.g. qlue-ls's backend cache, + * keyed on the connection object) keeps working across repeated hook calls. */ +const lspConnections = new WeakMap(); +function toLspConnection(client: LSPClient): LspConnection { + let conn = lspConnections.get(client); + if (!conn) { + conn = { + sendNotification: (method, params) => client.notification(method, params), + sendRequest: (method, params) => client.request(method, params) as Promise, + }; + lspConnections.set(client, conn); + } + return conn; +} + +import getDefaults from "./defaults"; +import * as imgs from "./imgs"; + +// Editor chrome (background, gutter, selection, cursor) per theme. Both are applied as CodeMirror +// themes so the editor always has an explicit background matching its own theme, regardless of the +// surrounding page. Colors mirror the Monaco SPARQL theme (see yasqe/src/editor/sparqlTheme.ts) so +// the two editors look identical. Token colors are driven by CSS (see style/codemirrorMods.css, +// `.cm-st-*` and the `[data-theme="dark"]` overrides) so semantic-token highlighting follows too. +const lightTheme = EditorView.theme({ + "&": { color: "#586e75", backgroundColor: "#f7f7f7" }, + ".cm-content": { caretColor: "#002b36" }, + ".cm-cursor, .cm-dropCursor": { borderLeftColor: "#002b36" }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": { + backgroundColor: "#eee8d5", + }, + ".cm-activeLine": { backgroundColor: "#fdf6e3" }, + ".cm-gutters": { backgroundColor: "#f7f7f7", color: "#93a1a1", border: "none" }, + ".cm-activeLineGutter": { backgroundColor: "#fdf6e3" }, +}); +const darkTheme = EditorView.theme( + { + "&": { color: "#839496", backgroundColor: "#002b36" }, + ".cm-content": { caretColor: "#fdf6e3" }, + ".cm-cursor, .cm-dropCursor": { borderLeftColor: "#fdf6e3" }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": { + backgroundColor: "#073642", + }, + ".cm-activeLine": { backgroundColor: "#073642" }, + ".cm-gutters": { backgroundColor: "#002b36", color: "#586e75", border: "none" }, + ".cm-activeLineGutter": { backgroundColor: "#073642" }, + ".cm-matchhighlight": { backgroundColor: "#3a3d41" }, + ".cm-selectionMatch": { backgroundColor: "#3a3d41" }, + }, + { dark: true }, +); + +// Detect the leading SPARQL prologue (the contiguous run of PREFIX/BASE declarations) for folding +function prologueFoldRange(state: EditorState): { headFrom: number; from: number; to: number } | null { + const doc = state.doc; + let first = 0; + let last = 0; + for (let n = 1; n <= doc.lines; n++) { + const t = doc.line(n).text.trim(); + if (/^(PREFIX|BASE)\b/i.test(t)) { + if (!first) first = n; + last = n; + } else if (t === "" || t.startsWith("#")) { + // blank / comment line: skip leading ones, tolerate ones interleaved in the prologue + continue; + } else { + break; // first real (non-prologue) line ends the prologue + } + } + if (!first || last <= first) return null; // need at least two declaration lines to fold + const firstLine = doc.line(first); + return { headFrom: firstLine.from, from: firstLine.to, to: doc.line(last).to }; +} + +// Fold service that offers to fold the prologue block when a fold is requested on its first line +const prologueFoldService = foldService.of((state, lineStart) => { + const range = prologueFoldRange(state); + if (!range || range.headFrom !== lineStart) return null; + return { from: range.from, to: range.to }; +}); + +// Fold service for the brace-delimited blocks (WHERE / SERVICE / OPTIONAL / sub-SELECT, …) +const blockFoldService = foldService.of((state, lineStart, lineEnd) => { + let best: { from: number; to: number } | null = null; + for (const r of getSparqlBlockFoldingRanges(state.doc.toString())) { + const bracePos = r.innerFrom - 1; // position of the opening `{` + if (bracePos < lineStart || bracePos > lineEnd) continue; + // Prefer the largest block when several open on the same line (e.g. nested `{ { … } }`). + if (!best || r.innerTo - r.innerFrom > best.to - best.from) best = { from: r.innerFrom, to: r.innerTo }; + } + return best; +}); + +export class SparqlEditor extends EventEmitter implements IEditor { + private static storageNamespace = "triply"; + public rootEl: HTMLDivElement; + private editorEl: HTMLDivElement; + public cm!: EditorView; + public config: Config; + public storage: YStorage; + public persistentConfig: PersistentConfig | undefined; + public autocompleters: { [name: string]: any } = {}; // reserved for future LSP-based completion + public queryValid = true; + public lastQueryDuration: number | undefined; + private queryType: QueryType | undefined; + private req: Request | undefined; + private abortController: AbortController | undefined; + private queryStatus: "valid" | "error" | undefined; + private queryBtn: HTMLButtonElement | undefined; + private resizeWrapper?: HTMLDivElement; + private readOnlyCompartment = new Compartment(); + private extensionsCompartment = new Compartment(); + private themeCompartment = new Compartment(); + // Holds the active language server's CM6 extension (lint gutter + LSP plugin); reconfigured on switch. + private lspCompartment = new Compartment(); + // Static SPARQL highlighting, enabled only while the active server emits no semantic tokens. + private fallbackHighlightCompartment = new Compartment(); + private static uriCounter = 0; + private documentUri?: string; + /** Index of the active language server in `config.languageServers`, or -1 when none is active. */ + public activeLanguageServerIndex = -1; + /** The currently active LSPClient (used by format() and diagnostics). */ + private activeClient?: LSPClient; + /** Resolved LSPClient per server index, so switching back is instant (clients are heavy/WASM). */ + private lsClients = new Map(); + /** Serializes language server switches so concurrent calls (init + a restored preference) don't race. */ + private lsSwitchQueue: Promise = Promise.resolve(); + /** Index of the most recently requested language server. A queued activation whose index no longer + * matches this has been superseded (e.g. the constructor's default 0 followed by a restored + * preference); it bails before any client setup so we never start a server just to dispose it. */ + private requestedLanguageServerIndex = -1; + /** The language server switcher button (only drawn when 2+ servers are configured). */ + private lsSelectEl?: HTMLButtonElement; + /** Document-level click handler that closes the open switcher menu (removed on destroy). */ + private lsMenuOutsideClick?: (e: MouseEvent) => void; + /** Dispose handle for an open settings panel, so a second open (or a server switch) closes the first. */ + private lsSettingsPanelDispose?: () => void; + + constructor(parent: HTMLElement, conf: PartialConfig = {}) { + super(); + if (!parent) throw new Error("No parent passed as argument. Dont know where to draw YASQE"); + this.rootEl = document.createElement("div"); + this.rootEl.className = "sparql-editor"; + parent.appendChild(this.rootEl); + this.editorEl = document.createElement("div"); + this.editorEl.className = "sparql-editor_editor"; + this.rootEl.appendChild(this.editorEl); + + // `languageServers` (carrying Worker instances / factory + callback functions) and + // `extensions` (opaque CM6 objects) must not be deep-merged by lodash, which would clone away + // their prototypes / identity. Assign them by reference. + // (cast to `any` to avoid the deep type instantiation lodash.merge triggers over DeepPartial) + const rawConf = conf as any; + const { languageServers, extensions } = rawConf; + const mergeableConf = { ...rawConf }; + delete mergeableConf.languageServers; + delete mergeableConf.extensions; + this.config = merge({}, SparqlEditor.defaults, mergeableConf) as Config; + if (extensions) this.config.extensions = extensions as Extension[]; + if (languageServers) this.config.languageServers = languageServers as Config["languageServers"]; + this.storage = new YStorage(SparqlEditor.storageNamespace); + + // Restore persisted query + let initialValue = this.config.value ?? ""; + const storageId = this.getStorageId(); + if (storageId) { + const persConf = this.storage.get(storageId); + if (persConf && typeof persConf === "string") { + this.persistentConfig = { query: persConf, editorHeight: this.config.editorHeight }; + } else { + this.persistentConfig = persConf; + } + if (!this.persistentConfig) { + this.persistentConfig = { query: initialValue, editorHeight: this.config.editorHeight }; + } + if (this.persistentConfig.query) initialValue = this.persistentConfig.query; + } + + this.cm = new EditorView({ + parent: this.editorEl, + state: EditorState.create({ + doc: initialValue, + extensions: this.buildExtensions(), + }), + }); + + if (this.config.collapsePrefixesOnLoad) { + const range = prologueFoldRange(this.cm.state); + if (range) this.cm.dispatch({ effects: foldEffect.of({ from: range.from, to: range.to }) }); + } + + this.drawButtons(); + + // Activate the first configured language server (the consumer may switch between several). + if (this.config.languageServers?.length) void this.setLanguageServer(0); + + if (this.config.consumeShareLink) { + this.config.consumeShareLink(this); + window.addEventListener("hashchange", this.handleHashChange); + } + + this.checkSyntax(); + + const height = this.persistentConfig?.editorHeight || this.config.editorHeight; + if (height) this.editorEl.style.height = height; + + if (this.config.resizeable) this.drawResizer(); + } + + private buildExtensions(): Extension[] { + const c = this.config; + const base: Extension[] = []; + if (c.lineNumbers) base.push(lineNumbers()); + if (c.highlightActiveLine) { + base.push(highlightActiveLineGutter()); + base.push(highlightActiveLine()); + } + base.push(highlightSpecialChars()); + base.push(history()); + base.push(codeFolding()); + base.push(prologueFoldService); + base.push(blockFoldService); + if (c.foldGutter) base.push(foldGutter()); + base.push(drawSelection()); + base.push(dropCursor()); + base.push(EditorState.allowMultipleSelections.of(true)); + base.push(indentOnInput()); + base.push(syntaxHighlighting(defaultHighlightStyle, { fallback: true })); + if (c.matchBrackets) base.push(bracketMatching()); + base.push(closeBrackets()); + base.push(autocompletion()); + base.push(rectangularSelection()); + base.push(crosshairCursor()); + base.push(highlightSelectionMatches()); + base.push( + keymap.of([ + // Custom bindings first so they take precedence over the default ones + { + key: "Mod-Enter", + run: () => { + this.query().catch(() => {}); + return true; + }, + }, + { + key: "Ctrl-Enter", + run: () => { + this.query().catch(() => {}); + return true; + }, + }, + { + key: "Mod-/", + run: () => { + this.commentLines(); + return true; + }, + }, + { + key: "Mod-s", + preventDefault: true, + run: () => { + this.saveQuery(); + return true; + }, + }, + { + key: "Shift-Alt-f", + preventDefault: true, + run: () => { + void this.format(); + return true; + }, + }, + ...closeBracketsKeymap, + ...defaultKeymap, + ...searchKeymap, + ...historyKeymap, + ...foldKeymap, + ...completionKeymap, + ...lintKeymap, + indentWithTab, + ]), + ); + base.push(search({ top: true })); + // The active language server (lint gutter + LSP plugin) lives in a compartment so it can be + // swapped at runtime via setLanguageServer. Starts empty; the first server is activated below. + base.push(this.lspCompartment.of([])); + // Static SPARQL highlighting on by default; switched off once a semantic-token server activates. + base.push(this.fallbackHighlightCompartment.of(sparqlFallbackHighlight)); + if (c.lineWrapping) base.push(EditorView.lineWrapping); + base.push( + EditorView.updateListener.of((u: ViewUpdate) => { + if (u.docChanged) { + this.emit("change"); + this.emit("changes"); + this.checkSyntax(); + this.updateQueryButton(); + } + if (u.selectionSet) { + this.emit("cursorActivity"); + } + if (u.focusChanged) { + if (this.cm.hasFocus) this.emit("focus"); + else { + this.saveQuery(); + this.emit("blur"); + } + } + }), + ); + base.push(this.themeCompartment.of(c.theme === "dark" ? darkTheme : lightTheme)); + base.push(this.readOnlyCompartment.of(EditorState.readOnly.of(!!c.readOnly))); + base.push(this.extensionsCompartment.of(c.extensions ?? [])); + return base; + } + + /* Value & document */ + public getValue(): string { + return this.cm.state.doc.toString(); + } + public setValue(value: string) { + this.cm.dispatch({ changes: { from: 0, to: this.cm.state.doc.length, insert: value } }); + } + public dispatch(...specs: Parameters) { + return this.cm.dispatch(...specs); + } + public focus() { + this.cm.focus(); + } + public refresh() { + this.cm.requestMeasure(); + } + public getWrapperElement(): HTMLElement { + return this.cm.dom; + } + + /** + * Switch the editor theme. Sets the global `[data-theme]` attribute (which CSS, including the + * semantic-token colors, keys off) and swaps the CodeMirror editor-chrome theme. + */ + public setTheme(theme: "light" | "dark") { + this.config.theme = theme; + document.documentElement.dataset.theme = theme; + this.cm.dispatch({ effects: this.themeCompartment.reconfigure(theme === "dark" ? darkTheme : lightTheme) }); + } + + /** + * The LSP document URI for this editor. Stable across server switches. Derived from the active + * server's `documentUri` (string or factory), falling back to an auto-generated unique URI so + * that several editors sharing one client (e.g. SparqlStudio tabs) get distinct URIs. + */ + public getDocumentUri(def?: LanguageServerDef): string { + if (this.documentUri) return this.documentUri; + const conf = def?.documentUri; + if (typeof conf === "function") this.documentUri = conf(this); + else if (typeof conf === "string") this.documentUri = conf; + else this.documentUri = `file:///query${++SparqlEditor.uriCounter}.rq`; + return this.documentUri; + } + + /* Language servers */ + /** The configured language servers, as `{ label, description }` (the switcher-facing subset). */ + public getLanguageServers(): { label: string; description?: string }[] { + return (this.config.languageServers ?? []).map((s) => ({ label: s.label, description: s.description })); + } + /** Index of the active language server in `config.languageServers`, or -1 when none is active. */ + public getActiveLanguageServer(): number { + return this.activeLanguageServerIndex; + } + /** The active `LSPClient`, or undefined when no language server is active. */ + public getLanguageClient(): LSPClient | undefined { + return this.activeClient; + } + /** + * Notify the active language server that the endpoint changed, firing only its `onEndpointChange` + * (with the active `LSPClient`). SparqlStudio calls this on endpoint changes; standalone consumers can + * call it themselves. No-op when no server is active or it defines no handler. + */ + public notifyEndpointChange(endpoint: string): void { + const def = this.config.languageServers?.[this.activeLanguageServerIndex]; + if (def?.onEndpointChange && this.activeClient && endpoint) { + def.onEndpointChange(toLspConnection(this.activeClient), endpoint, this); + } + } + /** + * Activate a language server by label or index. Resolves (and caches) the target client, runs its + * `onReady`, swaps it into the editor via the LSP compartment, refreshes the switcher button and + * emits `languageServerChange`. The query/document is preserved. + */ + public setLanguageServer(target: string | number): Promise { + const servers = this.config.languageServers ?? []; + const index = typeof target === "number" ? target : servers.findIndex((s) => s.label === target); + if (index < 0 || index >= servers.length) { + console.warn("Unknown language server:", target); + return Promise.resolve(); + } + this.requestedLanguageServerIndex = index; + // Swallow a prior switch's failure so it doesn't block this one (the chain is reused). + this.lsSwitchQueue = this.lsSwitchQueue.catch(() => {}).then(() => this.activateLanguageServer(index)); + return this.lsSwitchQueue; + } + + private async activateLanguageServer(index: number): Promise { + const servers = this.config.languageServers ?? []; + if (!servers.length) return; + if (index !== this.requestedLanguageServerIndex) return; + if (index === this.activeLanguageServerIndex && this.activeClient) return; + const def = servers[index]; + // A settings panel belongs to the outgoing server; close it before switching. + this.lsSettingsPanelDispose?.(); + this.lsSettingsPanelDispose = undefined; + // Resolve (and cache) the target client. The consumer provides a Worker, we build the `LSPClient` + // from it internally. Cached clients make switching back instant + let client = this.lsClients.get(index); + if (!client) { + const worker = typeof def.worker === "function" ? await def.worker() : def.worker; + if (!worker) { + console.warn("Language server provided no worker:", def.label); + return; + } + // Bail if a newer switch superseded this one while the worker/client was starting. + if (index !== this.requestedLanguageServerIndex) return; + client = await connectLanguageClient(worker); + this.lsClients.set(index, client); + } + if (index !== this.requestedLanguageServerIndex) return; + this.setupLanguageServerErrorNotifications(client); + // Each entry has its own worker/client, so a switch always changes the active client; attach + // its LSP plugin (lint gutter + document sync + the moved diagnostics/semantic-token glue). + const clientChanged = client !== this.activeClient; + this.activeClient = client; + this.activeLanguageServerIndex = index; + if (clientChanged) { + const uri = this.getDocumentUri(def); + this.cm.dispatch({ + effects: this.lspCompartment.reconfigure([lintGutter(), client.plugin(uri, def.languageId ?? "sparql")]), + }); + } + const hasSemanticTokens = !!client.serverCapabilities?.semanticTokensProvider; + this.cm.dispatch({ + effects: hasSemanticTokens + ? this.fallbackHighlightCompartment.reconfigure([]) + : [this.fallbackHighlightCompartment.reconfigure(sparqlFallbackHighlight), clearSemanticTokens], + }); + if (def.onReady) def.onReady(toLspConnection(client), this); + this.applyPersistedLanguageServerSettings(def, client); + this.updateLanguageServerDropdown(); + this.emit("languageServerChange", { label: def.label, description: def.description }, index); + } + + /** + * Open the schema-driven settings panel for the active language server. No-op when no server is + * active or it exposes no `configSchema`/`configCallback`. On Apply, the collected values are + * de-flattened (dotted keys become nested objects) and handed to the server's `configCallback`. + */ + public openLanguageServerSettings(): void { + this.lsSettingsPanelDispose?.(); + this.lsSettingsPanelDispose = undefined; + const def = this.config.languageServers?.[this.activeLanguageServerIndex]; + const client = this.activeClient; + if (!def?.configSchema || !def.configCallback || !client) return; + const schema = def.configSchema as LanguageServerSettingsSchema; + const current = this.getLanguageServerSettings(def.label) ?? defaultsFromSchema(schema); + this.lsSettingsPanelDispose = openSettingsPanel({ + root: this.rootEl, + schema, + serverLabel: def.label, + current, + onApply: (values) => { + this.setLanguageServerSettings(def.label, values); + def.configCallback!(toLspConnection(client), unflatten(values)); + }, + }); + } + + /** + * Persisted settings panel values for a language server (by label), or undefined if none stored. + * A consumer-supplied store (`config.getLanguageServerSettings`, used by SparqlStudio) takes precedence + * over yasqe's own persistentConfig (used in standalone mode). + */ + private getLanguageServerSettings(label: string): Record | undefined { + return this.config.getLanguageServerSettings?.(label) ?? this.persistentConfig?.languageServerSettings?.[label]; + } + + /** + * Store the settings panel values for a language server (by label). Persists to yasqe's own local + * storage when enabled (standalone), and emits `languageServerSettingsChange` so a consumer (e.g. + * SparqlStudio) can own persistence, mirroring the `languageServerChange` bridge. + */ + private setLanguageServerSettings(label: string, values: Record): void { + if (this.persistentConfig) { + (this.persistentConfig.languageServerSettings ??= {})[label] = values; + this.saveQuery(); + } + this.emit("languageServerSettingsChange", label, values); + } + + /** Re-apply any persisted settings to a freshly connected client, so they survive reloads/switches. */ + private applyPersistedLanguageServerSettings(def: LanguageServerDef, client: LSPClient): void { + if (!def.configCallback) return; + const stored = this.getLanguageServerSettings(def.label); + if (stored && Object.keys(stored).length) def.configCallback(toLspConnection(client), unflatten(stored)); + } + + /* Events */ + /** + * Emit an event, always passing this SparqlEditor instance as the first argument to listeners (the + * documented `(instance, ...payload)` API), so callers emit only the payload. Matches the Monaco + * editor and lets the shared SPARQL module (in utils) emit without knowing the instance. + */ + public emit(event: string | symbol, ...data: any[]): boolean { + return super.emit(event, this, ...data); + } + // Alias for backwards compatibility with CM5-style `signal` + public signal(event: string, ...args: any[]) { + this.emit(event, ...args); + } + + /* Query button & buttons */ + private handleHashChange = () => { + this.config.consumeShareLink?.(this); + }; + + public getStorageId(getter?: Config["persistenceId"]): string | undefined { + const persistenceId = getter || this.config.persistenceId; + if (!persistenceId) return undefined; + if (typeof persistenceId === "string") return persistenceId; + return persistenceId(this); + } + public saveQuery() { + const storageId = this.getStorageId(); + if (!storageId || !this.persistentConfig) return; + this.persistentConfig.query = this.getValue(); + this.storage.set(storageId, this.persistentConfig, this.config.persistencyExpire, this.handleLocalStorageQuotaFull); + } + public handleLocalStorageQuotaFull(_e: any) { + console.warn("Localstorage quota exceeded. Clearing all queries"); + SparqlEditor.clearStorage(); + } + + /* Query type */ + public getQueryType(): QueryType | undefined { + return this.queryType; + } + public getQueryMode(): "update" | "query" { + return getQueryMode(this.queryType); + } + /** Re-detect the query type (shared detector) and refresh the run button. Runs on every edit. */ + public checkSyntax() { + this.queryType = getQueryType(this.getValue()); + this.updateQueryButton(); + } + + /* Comment / duplicate / format helpers */ + public commentLines() { + const state = this.cm.state; + const sel = state.selection.main; + const fromLine = state.doc.lineAt(sel.from).number; + const toLine = state.doc.lineAt(sel.to).number; + const lines: { line: number; text: string }[] = []; + let allCommented = true; + for (let i = fromLine; i <= toLine; i++) { + const l = state.doc.line(i); + lines.push({ line: i, text: l.text }); + if (l.text.length === 0 || l.text.charAt(0) !== "#") allCommented = false; + } + const changes = lines.map(({ line }) => { + const l = state.doc.line(line); + return allCommented ? { from: l.from, to: l.from + 1, insert: "" } : { from: l.from, to: l.from, insert: "#" }; + }); + this.cm.dispatch({ changes }); + } + public duplicateLine() { + const state = this.cm.state; + const sel = state.selection.main; + const line = state.doc.lineAt(sel.head); + this.cm.dispatch({ changes: { from: line.to, to: line.to, insert: "\n" + line.text } }); + } + /** + * Pretty-print the query via the language server's `textDocument/formatting` request and apply + * the returned edits. No-op when no language server is connected (SparqlEditor ships no formatter). + */ + public async format(): Promise { + const client = this.activeClient; + const plugin = LSPPlugin.get(this.cm); + if (!client || !plugin) return; + // Make sure the server has the latest document before asking it to format. + plugin.client.sync(); + try { + const edits: any[] = await client.request("textDocument/formatting", { + textDocument: { uri: plugin.uri }, + options: { tabSize: 2, insertSpaces: true }, + }); + if (!Array.isArray(edits) || edits.length === 0) return; + // Clamp LSP positions to the document: qlue-ls returns a whole-document replacement whose end + // is the `u32::MAX` (4294967295) sentinel, which `plugin.fromPosition` would map out of range. + const doc = this.cm.state.doc; + const toOffset = (p: { line: number; character: number }) => { + const line = doc.line(Math.min(p.line + 1, doc.lines)); + return line.from + Math.min(p.character, line.length); + }; + // LSP edits are non-overlapping; map each range to document offsets and apply in one dispatch. + const changes = edits.map((e) => ({ + from: toOffset(e.range.start), + to: toOffset(e.range.end), + insert: e.newText, + })); + this.cm.dispatch({ changes }); + } catch (e) { + console.warn("Formatting failed:", e); + } + } + + /* Prefixes */ + /** Extract the PREFIX declarations from the current query (delegates to the shared util). */ + public getPrefixesFromQuery(): Prefixes { + return getPrefixesFromQuery(this.getValue()); + } + /** Prepend missing PREFIX declarations, from a `"prefix: "` string or a `{ prefix: iri }` map. */ + public addPrefixes(prefixes: string | Prefixes): void { + if (typeof prefixes === "string") { + this.addPrefixAsString(prefixes); + return; + } + const existing = this.getPrefixesFromQuery(); + for (const pref in prefixes) { + if (!(pref in existing)) this.addPrefixAsString(pref + ": <" + prefixes[pref] + ">"); + } + } + private addPrefixAsString(prefixString: string): void { + this.dispatch({ changes: { from: 0, to: 0, insert: "PREFIX " + prefixString + "\n" } }); + } + /** Remove the given PREFIX declarations from the query. */ + public removePrefixes(prefixes: Prefixes): void { + const escapeRegex = (s: string) => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); + let value = this.getValue(); + for (const pref in prefixes) { + value = value.replace( + new RegExp("PREFIX\\s*" + pref + ":\\s*" + escapeRegex("<" + prefixes[pref] + ">") + "\\s*", "ig"), + "", + ); + } + this.setValue(value); + } + public collapsePrefixes(_collapse = true) { + // Folding by syntax tree may be added later; no-op for now. + } + + /* TODO: remove autocompleter stubs */ + public enableCompleter(_name: string): Promise { + return Promise.resolve(); + } + public disableCompleter(_name: string): void {} + public autocomplete(_fromAutoShow = false): void {} + + /* Buttons */ + private drawButtons() { + const buttons = document.createElement("div"); + buttons.className = "sparql-editor_buttons"; + this.rootEl.appendChild(buttons); + + // Language-server switcher, leftmost in the button bar (only when 2+ servers are configured). + this.drawLanguageServerDropdown(buttons); + + if (this.config.pluginButtons) { + const pluginButtons = this.config.pluginButtons(); + if (pluginButtons) { + if (Array.isArray(pluginButtons)) { + for (const b of pluginButtons) buttons.append(b); + } else { + buttons.appendChild(pluginButtons); + } + } + } + + // Format button: pretty-print the query via the language server (no-op without one). + { + const svgFormat = drawSvgStringAsElement(imgs.format); + const formatBtn = document.createElement("button"); + formatBtn.className = "sparql-editor_format"; + formatBtn.title = "Format query (Shift+Alt+F)"; + formatBtn.setAttribute("aria-label", "Format query"); + formatBtn.appendChild(svgFormat); + formatBtn.addEventListener("click", () => void this.format()); + buttons.appendChild(formatBtn); + } + + if (this.config.createShareableLink) { + const svgShare = drawSvgStringAsElement(imgs.share); + const shareLinkWrapper = document.createElement("button"); + shareLinkWrapper.className = "sparql-editor_share"; + shareLinkWrapper.title = "Share query"; + shareLinkWrapper.setAttribute("aria-label", "Share query"); + shareLinkWrapper.appendChild(svgShare); + buttons.appendChild(shareLinkWrapper); + const showSharePopup = (event: MouseEvent | KeyboardEvent) => { + event.stopPropagation(); + let popup: HTMLDivElement | undefined = document.createElement("div"); + popup.className = "sparql-editor_sharePopup"; + buttons.appendChild(popup); + document.body.addEventListener( + "click", + (e) => { + if (popup && e.target !== popup && !popup.contains(e.target as any)) { + popup.remove(); + popup = undefined; + } + }, + true, + ); + const input = document.createElement("input"); + input.type = "text"; + input.value = this.config.createShareableLink!(this); + input.onfocus = () => input.select(); + const inputWrapper = document.createElement("div"); + inputWrapper.className = "inputWrapper"; + inputWrapper.appendChild(input); + popup.appendChild(inputWrapper); + + const popupInputButtons: HTMLButtonElement[] = []; + const createShortLink = this.config.createShortLink; + if (createShortLink) { + popup.className += " enableShort"; + const shortBtn = document.createElement("button"); + popupInputButtons.push(shortBtn); + shortBtn.innerHTML = "Shorten"; + shortBtn.className = "sparql-editor_btn sparql-editor_btn-sm shorten"; + popup.appendChild(shortBtn); + shortBtn.onclick = () => { + popupInputButtons.forEach((b) => (b.disabled = true)); + createShortLink(this, input.value).then( + (v) => { + input.value = v; + input.focus(); + }, + (err) => { + const errSpan = document.createElement("span"); + errSpan.className = "shortlinkErr"; + let textContent = "An error has occurred"; + if (typeof err === "string" && err.length !== 0) textContent = err; + else if (err?.message?.length) textContent = err.message; + errSpan.textContent = textContent; + input.replaceWith(errSpan); + }, + ); + }; + } + const curlBtn = document.createElement("button"); + popupInputButtons.push(curlBtn); + curlBtn.innerText = "cURL"; + curlBtn.className = "sparql-editor_btn sparql-editor_btn-sm curl"; + popup.appendChild(curlBtn); + curlBtn.onclick = () => { + popupInputButtons.forEach((b) => (b.disabled = true)); + input.value = this.getAsCurlString(); + input.focus(); + }; + const svgPos = svgShare.getBoundingClientRect(); + popup.style.top = svgShare.offsetTop + svgPos.height + "px"; + popup.style.left = svgShare.offsetLeft + svgShare.clientWidth - popup.clientWidth + "px"; + input.focus(); + }; + shareLinkWrapper.addEventListener("click", showSharePopup); + shareLinkWrapper.addEventListener("keydown", (e) => { + if (e.code === "Enter") showSharePopup(e); + }); + } + + if (this.config.showQueryButton) { + this.queryBtn = document.createElement("button"); + addClass(this.queryBtn, "sparql-editor_queryButton"); + const queryEl = drawSvgStringAsElement(imgs.query); + addClass(queryEl, "queryIcon"); + this.queryBtn.appendChild(queryEl); + const warningIcon = drawSvgStringAsElement(imgs.warning); + addClass(warningIcon, "warningIcon"); + this.queryBtn.appendChild(warningIcon); + this.queryBtn.onclick = () => { + if (this.config.queryingDisabled) return; + if (this.req) this.abortQuery(); + else this.query().catch(() => {}); + }; + this.queryBtn.title = "Run query"; + this.queryBtn.setAttribute("aria-label", "Run query"); + buttons.appendChild(this.queryBtn); + this.updateQueryButton(); + } + } + private updateQueryButton(status?: "valid" | "error") { + if (!this.queryBtn) return; + if (this.config.queryingDisabled) { + addClass(this.queryBtn, "query_disabled"); + this.queryBtn.title = this.config.queryingDisabled; + } else { + removeClass(this.queryBtn, "query_disabled"); + this.queryBtn.title = "Run query"; + this.queryBtn.setAttribute("aria-label", "Run query"); + } + if (!status) status = this.queryValid ? "valid" : "error"; + if (status !== this.queryStatus) { + removeClass(this.queryBtn, "query_" + this.queryStatus); + addClass(this.queryBtn, "query_" + status); + this.queryStatus = status; + } + if (this.req && this.queryBtn.className.indexOf("busy") < 0) { + this.queryBtn.className += " busy"; + } + if (!this.req && this.queryBtn.className.indexOf("busy") >= 0) { + this.queryBtn.className = this.queryBtn.className.replace("busy", ""); + } + } + + /** + * Draw the language server switcher: a labelled dropdown button (showing the active server's + * label) that, when clicked, opens a menu listing each server with its label and a dimmed + * description. Only drawn when two or more servers are configured. + */ + private drawLanguageServerDropdown(buttons: HTMLElement) { + const servers = this.config.languageServers ?? []; + // Show the dropdown to switch servers (2+) or to expose a single server's settings panel. + const hasConfigurable = servers.some((s) => s.configSchema && s.configCallback); + if (servers.length < 2 && !hasConfigurable) return; + const select = document.createElement("button"); + select.className = "sparql-editor_btn sparql-editor_lsSelect"; + select.title = "Select language server"; + select.setAttribute("aria-label", "Select language server"); + this.lsSelectEl = select; + buttons.appendChild(select); + + let menu: HTMLDivElement | undefined; + const closeMenu = () => { + menu?.remove(); + menu = undefined; + }; + const openMenu = () => { + menu = document.createElement("div"); + menu.className = "sparql-editor_lsMenu"; + servers.forEach((s, i) => { + const item = document.createElement("button"); + item.className = "sparql-editor_lsMenuItem" + (i === this.activeLanguageServerIndex ? " active" : ""); + const label = document.createElement("span"); + label.className = "sparql-editor_lsMenuLabel"; + label.textContent = s.label; + item.appendChild(label); + if (s.description) { + const desc = document.createElement("span"); + desc.className = "sparql-editor_lsMenuDesc"; + desc.textContent = s.description; + item.appendChild(desc); + } + item.addEventListener("click", (e) => { + e.stopPropagation(); + closeMenu(); + void this.setLanguageServer(i); + }); + menu!.appendChild(item); + }); + // "Configure …" only when the active server exposes a settings schema. + const active = servers[this.activeLanguageServerIndex]; + if (active?.configSchema && active.configCallback) { + const configItem = document.createElement("button"); + configItem.className = "sparql-editor_lsMenuItem sparql-editor_lsMenuConfigure"; + const label = document.createElement("span"); + label.className = "sparql-editor_lsMenuLabel"; + label.textContent = `Configure ${active.label}…`; + configItem.appendChild(label); + configItem.addEventListener("click", (e) => { + e.stopPropagation(); + closeMenu(); + this.openLanguageServerSettings(); + }); + menu!.appendChild(configItem); + } + buttons.appendChild(menu); + }; + select.addEventListener("click", (e) => { + e.stopPropagation(); + if (menu) closeMenu(); + else openMenu(); + }); + this.lsMenuOutsideClick = (e: MouseEvent) => { + if (menu && e.target !== select && !menu.contains(e.target as Node)) closeMenu(); + }; + document.body.addEventListener("click", this.lsMenuOutsideClick, true); + this.updateLanguageServerDropdown(); + } + + /** Refresh the switcher button label to reflect the active server. */ + private updateLanguageServerDropdown() { + if (!this.lsSelectEl) return; + const active = (this.config.languageServers ?? [])[this.activeLanguageServerIndex]; + this.lsSelectEl.textContent = active?.label ?? "Language server"; + } + + /* Resizer */ + private drawResizer() { + if (this.resizeWrapper) return; + this.resizeWrapper = document.createElement("div"); + addClass(this.resizeWrapper, "resizeWrapper"); + const chip = document.createElement("div"); + addClass(chip, "resizeChip"); + this.resizeWrapper.appendChild(chip); + this.resizeWrapper.addEventListener("mousedown", this.initDrag, false); + this.resizeWrapper.addEventListener("dblclick", this.expandEditor); + this.rootEl.appendChild(this.resizeWrapper); + } + private initDrag = () => { + document.documentElement.addEventListener("mousemove", this.doDrag, false); + document.documentElement.addEventListener("mouseup", this.stopDrag, false); + }; + private doDrag = (event: MouseEvent) => { + let parentOffset = 0; + if (this.rootEl.offsetParent) parentOffset = (this.rootEl.offsetParent as HTMLElement).offsetTop; + let scrollOffset = 0; + let parentEl = this.rootEl.parentElement; + while (parentEl) { + scrollOffset += parentEl.scrollTop; + parentEl = parentEl.parentElement; + } + const newHeight = event.clientY - parentOffset - this.rootEl.offsetTop + scrollOffset; + this.editorEl.style.height = newHeight + "px"; + }; + private stopDrag = () => { + document.documentElement.removeEventListener("mousemove", this.doDrag, false); + document.documentElement.removeEventListener("mouseup", this.stopDrag, false); + this.emit("resize", this.editorEl.style.height); + if (this.getStorageId() && this.persistentConfig) { + this.persistentConfig.editorHeight = this.editorEl.style.height; + this.saveQuery(); + } + this.refresh(); + }; + public expandEditor = () => { + this.editorEl.style.height = "100%"; + }; + + /** + * Set the editor wrapper size. Mirrors the Monaco editor's `setSize` so SparqlStudio can drive both + * editors identically (it loads each tab's persisted height through this). + */ + public setSize(height?: string, width?: string) { + if (height) this.editorEl.style.height = height; + if (width) this.rootEl.style.width = width; + this.refresh(); + } + + /* Query lifecycle */ + public query(config?: EditorAjaxConfig) { + if (this.config.queryingDisabled) return Promise.reject("Querying is disabled."); + this.abortQuery(); + // Wire request emission to internal state via listeners + const onQuery = (_y: SparqlEditor, req: Request, abort?: AbortController) => { + this.req = req; + this.abortController = abort; + this.updateQueryButton(); + }; + const onResponse = (_y: SparqlEditor, _resp: any, duration: number) => { + this.lastQueryDuration = duration; + this.req = undefined; + this.updateQueryButton(); + this.off("query", onQuery); + this.off("queryResponse", onResponse); + this.off("queryAbort", onAbort); + }; + const onAbort = (_y: SparqlEditor) => { + this.req = undefined; + this.updateQueryButton(); + this.off("query", onQuery); + this.off("queryResponse", onResponse); + this.off("queryAbort", onAbort); + }; + this.on("query", onQuery); + this.on("queryResponse", onResponse); + this.on("queryAbort", onAbort); + return executeQuery(this, config); + } + public abortQuery() { + if (this.req) { + this.abortController?.abort(); + this.emit("queryAbort", this.req); + } + } + public getAsCurlString(config?: EditorAjaxConfig): string { + return getAsCurlString(this, config); + } + + /** Build the SPARQL request arguments for the current query against the given request config. */ + public getUrlArguments(requestConfig: EditorAjaxConfig): RequestArgs { + return getUrlArguments(this, requestConfig); + } + + /* URL params */ + public getUrlParams(): queryString.ParsedQuery { + let urlParams: queryString.ParsedQuery = {}; + if (window.location.hash.length > 1) { + urlParams = queryString.parse(location.hash); + } + if ((!urlParams || !("query" in urlParams)) && window.location.search.length > 1) { + urlParams = queryString.parse(window.location.search); + } + return urlParams; + } + public configToQueryParams(): queryString.ParsedQuery { + const urlParams: any = window.location.hash.length > 1 ? queryString.parse(window.location.hash) : {}; + urlParams["query"] = this.getValue(); + return urlParams; + } + public queryParamsToConfig(params: queryString.ParsedQuery) { + if (params && params.query && typeof params.query === "string") { + this.setValue(params.query); + } + } + + /* Misc helpers preserved from old API */ + public getValueWithoutComments(): string { + return this.getValue().replace(/#[^\n]*/g, ""); + } + public getQueryWithValues(values: string | { [k: string]: string } | Array<{ [k: string]: string }>): string { + if (!values) return this.getValue(); + let injectString: string; + if (typeof values === "string") { + injectString = values; + } else { + const arr = Array.isArray(values) ? values : [values]; + const vars: { [k: string]: true } = {}; + arr.forEach((v) => Object.keys(v).forEach((k) => (vars[k] = true))); + const varArray = Object.keys(vars); + if (!varArray.length) return this.getValue(); + injectString = "VALUES (" + varArray.join(" ") + ") {\n"; + arr.forEach((v) => { + injectString += "( "; + varArray.forEach((variable) => { + injectString += (v[variable] ?? "UNDEF") + " "; + }); + injectString += ")\n"; + }); + injectString += "}\n"; + } + return this.getValue().replace(/(\bSELECT\b[\s\S]*?{)/i, (m) => m + "\n" + injectString); + } + /** @deprecated Diagnostics are provided by the language server; this flag is no longer used. */ + public setCheckSyntaxErrors(isEnabled: boolean) { + this.config.syntaxErrorCheck = isEnabled; + } + public getVariablesFromQuery(): string[] { + const set = new Set(); + const re = /[?$]([A-Za-z_][\w]*)/g; + let m: RegExpExecArray | null; + while ((m = re.exec(this.getValue())) !== null) set.add(m[1]); + return Array.from(set).sort(); + } + + /* Notifications */ + private notificationEls: { [key: string]: HTMLDivElement } = {}; + public showNotification(key: string, message: string) { + if (!this.notificationEls[key]) { + const notificationContainer = document.createElement("div"); + addClass(notificationContainer, "notificationContainer"); + this.rootEl.appendChild(notificationContainer); + this.notificationEls[key] = document.createElement("div"); + addClass(this.notificationEls[key], "notification", "notif_" + key); + notificationContainer.appendChild(this.notificationEls[key]); + } + for (const id in this.notificationEls) if (id !== key) this.hideNotification(id); + const el = this.notificationEls[key]; + addClass(el, "active"); + el.innerText = message; + } + public hideNotification(key: string) { + if (this.notificationEls[key]) removeClass(this.notificationEls[key], "active"); + } + private lsErrorNotification?: LspErrorNotification; + + /** + * Surface language server errors in the shared bottom-right notification (see + * `createLspErrorNotification` in `@rdfjs/sparql-utils`). SparqlEditor is language server agnostic, so + * this only understands generic JSON-RPC: `LSPClient.request` rejects with the raw `error` object + * of a JSON-RPC error response. The client is usually shared across tabs, so `request` is wrapped + * only once and a per-instance notifier is kept in a listener list + */ + private setupLanguageServerErrorNotifications(client: LSPClient) { + const notify = (message: string) => { + if (!this.lsErrorNotification) this.lsErrorNotification = createLspErrorNotification(this.rootEl); + this.lsErrorNotification.show(message); + }; + const tapped = client as LSPClient & { __yasqeErrorListeners?: ((message: string) => void)[] }; + if (tapped.__yasqeErrorListeners) { + tapped.__yasqeErrorListeners.push(notify); + return; + } + const listeners: ((message: string) => void)[] = [notify]; + tapped.__yasqeErrorListeners = listeners; + // Expected-during-typing codes (qlue-ls uses string codes; standard LSP uses these numbers), plus + // MethodNotFound (-32601): a server legitimately lacking an optional feature (e.g. swls has no + // formatting / pull diagnostics) should not surface as an error popup. + const ignoredCodes = new Set([ + -32800, + -32801, + -32601, + "RequestCancelled", + "ContentModified", + "MethodNotFound", + ]); + const original = client.request.bind(client); + client.request = function (method: string, params: unknown) { + return original(method, params).catch((error: any) => { + const code = error?.code; + const hasCode = typeof code === "number" || (typeof code === "string" && code.length > 0); + if (hasCode && typeof error?.message === "string" && !ignoredCodes.has(code)) { + // qlue-ls puts the detail in `message` (often a quoted blob) but it may also arrive in + // `data`; append it so the description is surfaced either way. + let message: string = error.message; + if (typeof error.data === "string" && error.data && !message.includes(error.data)) { + message += "\n" + error.data; + } + for (const l of listeners) l(message); + } + throw error; + }); + } as typeof client.request; + } + + /* Destroy */ + public destroy() { + this.abortQuery(); + this.removeAllListeners(); + this.resizeWrapper?.removeEventListener("mousedown", this.initDrag, false); + this.resizeWrapper?.removeEventListener("dblclick", this.expandEditor); + window.removeEventListener("hashchange", this.handleHashChange); + if (this.lsMenuOutsideClick) document.body.removeEventListener("click", this.lsMenuOutsideClick, true); + this.cm.destroy(); + this.rootEl.remove(); + } + + /* Statics */ + static Sparql = { executeQuery, getAjaxConfig, getUrlArguments, getAcceptHeader, getAsCurlString }; + static defaults = getDefaults(); + static Autocompleters: { [name: string]: any } = {}; + static registerAutocompleter(_value: any, _enable = true): void { + // No-op: autocomplete is now provided by the language server (see `config.languageServers`). + } + static forkAutocompleter(_from: string, _to: { name: string } & any, _enable = true): void { + // No-op: autocomplete is now provided by the language server (see `config.languageServers`). + } + static clearStorage() { + const storage = new YStorage(SparqlEditor.storageNamespace); + storage.removeNamespace(); + } +} + +export interface Position { + line: number; + ch: number; +} +export interface Token { + start: number; + end: number; + string: string; + type: string | null; + state: { prefixes: Prefixes; queryType?: QueryType; variables?: { [k: string]: boolean } }; +} + +export type PartialConfig = DeepPartial; + +export interface Config { + /** Initial editor content */ + value: string; + /** Show line numbers gutter */ + lineNumbers: boolean; + /** Soft-wrap long lines */ + lineWrapping: boolean; + /** Highlight the current line */ + highlightActiveLine: boolean; + /** Show fold gutter (folds the leading PREFIX / BASE prologue block) */ + foldGutter: boolean; + /** Highlight matching brackets */ + matchBrackets: boolean; + /** Editor starts as read-only */ + readOnly: boolean; + /** Editor theme. Switch at runtime with {@link SparqlEditor.setTheme}. */ + theme: "light" | "dark"; + /** @deprecated No-op. Diagnostics come from the language server (`languageServers`); SparqlEditor ships no built-in syntax checker. */ + syntaxErrorCheck: boolean; + /** Extra CodeMirror 6 extensions (advanced) */ + extensions: Extension[]; + /** + * Language Server Protocol integration. SparqlEditor ships no SPARQL grammar of its own, all language + * features (highlighting, diagnostics, completion, hover, formatting) come from the server. The + * embedder supplies each server as a Web `Worker` (the universal LS transport, identical to the + * Monaco-based `@rdfjs/sparql-editor-monaco`, the SAME `languageServers` array works for either editor); SparqlEditor + * builds the `LSPClient` internally and wires diagnostics + semantic-token highlighting. The first + * is activated on load; when two or more are configured a switcher dropdown appears. qlue-ls (or + * any SPARQL server) lives in the embedder, never in SparqlEditor's dependencies. When empty, SparqlEditor is a + * plain text editor. + */ + languageServers: LanguageServerDef[]; + /** + * Optional store for language server settings panel values, keyed by server label. When provided + * (e.g. by SparqlStudio, to persist per endpoint), it is the source of truth for pre-filling the panel + * and re-applying settings when a server (re)starts. Pairs with the `languageServerSettingsChange` + * event. When omitted, SparqlEditor falls back to its own local-storage persistence. + */ + getLanguageServerSettings?: (label: string) => Record | undefined; + + /** Show button to run the query */ + showQueryButton: boolean; + /** Show resize handle below the editor */ + resizeable: boolean; + /** Initial editor height (CSS value) */ + editorHeight: string; + /** Disable querying (also disables the run button); the string is shown as tooltip */ + queryingDisabled: string | undefined; + /** Pre-fold the leading PREFIX / BASE prologue block on load */ + collapsePrefixesOnLoad: boolean; + /** Legacy autocompleter names; ignored for now */ + autocompleters: string[]; + /** Legacy hint config; ignored for now */ + hintConfig: any; + + createShareableLink: (yasqe: SparqlEditor) => string; + createShortLink: ((yasqe: SparqlEditor, longLink: string) => Promise) | undefined; + consumeShareLink: ((yasqe: SparqlEditor) => void) | undefined | null; + persistenceId: ((yasqe: SparqlEditor) => string) | string | undefined | null; + persistencyExpire: number; + requestConfig: RequestConfig | ((yasqe: SparqlEditor) => RequestConfig); + pluginButtons: (() => HTMLElement[] | HTMLElement) | undefined; + prefixCcApi: string; +} + +export interface PersistentConfig { + query: string; + editorHeight: string; + /** Last-applied settings panel values per language server label (flat dotted keys), so they + * survive reloads and are re-applied to the server when it restarts. */ + languageServerSettings?: { [label: string]: Record }; +} + +export interface HintConfig { + [k: string]: any; +} + +export default SparqlEditor; diff --git a/packages/sparql-editor-codemirror/src/lsp/connect.ts b/packages/sparql-editor-codemirror/src/lsp/connect.ts new file mode 100644 index 00000000..bd19f26c --- /dev/null +++ b/packages/sparql-editor-codemirror/src/lsp/connect.ts @@ -0,0 +1,43 @@ +/** + * Build a connected `@codemirror/lsp-client` {@link LSPClient} from a Web Worker LSP server. + * + * This is the CodeMirror counterpart to the Monaco editor's `connectLanguageClient`: the editor is + * language server agnostic and the consumer only provides a worker (see `LanguageServerDef.worker`). + * The client is wired with the base `languageServerExtensions()` plus the reusable glue + * ({@link ./glue}) that adds pull-diagnostics and semantic-token highlighting, so any LSP worker + * gets full editor features. Document open + the LSP plugin are attached by the editor (it owns the + * document URI / language id and the LSP compartment). + */ +import { LSPClient, languageServerExtensions } from "@codemirror/lsp-client"; +import { workerTransport } from "./workerTransport"; +import { pullDiagnostics, semanticTokens } from "./glue"; + +/** + * Resolve once a freshly created LSP worker signals it is ready, so the client never sends + * `initialize`/`didOpen` before the worker has installed its message handler. WASM-backed workers + * (qlue-ls, swls, ...) set their handler only AFTER an async `import()` / WASM init; a client + * connecting too early races that setup and corrupts message ordering. By convention these workers + * post `{ type: "ready" }` (or the bare string `"ready"`) once set up. `addEventListener` (not + * `onmessage=`) so it never clobbers the handler the client attaches later. + */ +function awaitWorkerReady(worker: Worker): Promise { + return new Promise((resolve) => { + const onReady = (event: MessageEvent) => { + if (event.data?.type === "ready" || event.data === "ready") { + worker.removeEventListener("message", onReady); + resolve(); + } + }; + worker.addEventListener("message", onReady); + }); +} + +/** Build, connect and initialise an LSPClient over `worker`. Resolves once `initialize` completes. */ +export async function connectLanguageClient(worker: Worker): Promise { + await awaitWorkerReady(worker); + const client = new LSPClient({ + extensions: [...languageServerExtensions(), pullDiagnostics(), semanticTokens()], + }).connect(workerTransport(worker)); + await client.initializing; + return client; +} diff --git a/packages/sparql-editor-codemirror/src/lsp/glue.ts b/packages/sparql-editor-codemirror/src/lsp/glue.ts new file mode 100644 index 00000000..13be9260 --- /dev/null +++ b/packages/sparql-editor-codemirror/src/lsp/glue.ts @@ -0,0 +1,207 @@ +/** + * Reusable, server-agnostic CodeMirror LSP glue. `@codemirror/lsp-client` covers document sync, + * completion and hover, but not pull-diagnostics, code-action quick fixes or semantic-token + * highlighting, the things `monaco-languageclient` gives Monaco for free. These extensions add them + * so the CodeMirror editor reaches feature parity from any LSP worker (qlue-ls, swls, ...). + * + * Token colors are rendered via `cm-st-` CSS classes shipped in the editor's stylesheet, + * so highlighting follows the light/dark theme (no editor-side color theme needed here). + */ +import { LSPPlugin, type LSPClientExtension } from "@codemirror/lsp-client"; +import { EditorView, ViewPlugin, ViewUpdate, Decoration, DecorationSet } from "@codemirror/view"; +import { RangeSetBuilder, StateField, StateEffect } from "@codemirror/state"; +import { setDiagnostics, Diagnostic } from "@codemirror/lint"; + +const SEVERITY: Record = { 1: "error", 2: "warning", 3: "info", 4: "info" }; + +/* Pull-model diagnostics (`textDocument/diagnostic`) + quick fixes (`textDocument/codeAction`). + * lsp-client only understands push diagnostics; qlue-ls is pull-only and has no code-action support, + * so we request a quick fix per diagnostic and attach it as a `@codemirror/lint` action. */ + +/** Apply an LSP WorkspaceEdit to the current editor (single-file SPARQL queries). */ +function applyWorkspaceEdit(view: EditorView, plugin: LSPPlugin, edit: any) { + if (!edit) return; + const uri = plugin.uri; + let edits: any[] = []; + if (edit.changes?.[uri]) { + edits = edit.changes[uri]; + } else if (Array.isArray(edit.documentChanges)) { + for (const dc of edit.documentChanges) { + if (dc?.textDocument?.uri === uri && Array.isArray(dc.edits)) edits.push(...dc.edits); + } + } + if (!edits.length) return; + const changes = edits.map((e) => ({ + from: plugin.fromPosition(e.range.start), + to: plugin.fromPosition(e.range.end), + insert: e.newText, + })); + view.dispatch({ changes }); +} + +/** Convert one LSP diagnostic into a CodeMirror Diagnostic, attaching any server quick fixes. */ +async function toDiagnostic(plugin: LSPPlugin, item: any): Promise { + let actions: Diagnostic["actions"]; + try { + const cas: any[] = + (await plugin.client.request("textDocument/codeAction", { + textDocument: { uri: plugin.uri }, + range: item.range, + context: { diagnostics: [item], only: ["quickfix"] }, + })) ?? []; + const fixes = cas.filter((ca) => ca?.edit && !ca.disabled); + if (fixes.length) { + actions = fixes.map((ca) => ({ + name: ca.title, + apply: (v: EditorView) => applyWorkspaceEdit(v, plugin, ca.edit), + })); + } + } catch { + // no code actions for this diagnostic + } + return { + from: plugin.fromPosition(item.range.start), + to: plugin.fromPosition(item.range.end), + severity: SEVERITY[item.severity ?? 1] ?? "error", + message: item.message, + source: item.source, + actions, + }; +} + +/** Pull diagnostics on every edit (debounced) and feed them to `@codemirror/lint`. */ +export function pullDiagnostics(delay = 400): LSPClientExtension { + const editorExtension = ViewPlugin.define((view) => { + let timer: ReturnType | undefined; + const run = async () => { + const plugin = LSPPlugin.get(view); + if (!plugin) return; + // Only pull when the server advertises pull diagnostics. Push-only servers (e.g. swls) would + // answer `textDocument/diagnostic` with "Method not found"; their diagnostics arrive via + // `publishDiagnostics`, which `languageServerExtensions()` already handles. + if (!plugin.client.serverCapabilities?.diagnosticProvider) return; + plugin.client.sync(); + try { + const result: any = await plugin.client.request("textDocument/diagnostic", { + textDocument: { uri: plugin.uri }, + }); + const items: any[] = result?.items ?? []; + const diagnostics = await Promise.all(items.map((item) => toDiagnostic(plugin, item))); + view.dispatch(setDiagnostics(view.state, diagnostics)); + } catch { + // server not ready / request cancelled, retry on next edit + } + }; + void run(); + return { + update(u: ViewUpdate) { + if (u.docChanged) { + if (timer) clearTimeout(timer); + timer = setTimeout(run, delay); + } + }, + destroy() { + if (timer) clearTimeout(timer); + }, + }; + }); + return { editorExtension }; +} + +/* Semantic-token highlighting (`textDocument/semanticTokens/full`). lsp-client has no semantic-token + * support, so we decode them here and render them as `cm-st-` decorations. This is the + * only source of highlighting (the editor ships no SPARQL grammar). */ +const setSemanticTokens = StateEffect.define(); +const semanticTokensField = StateField.define({ + create: () => Decoration.none, + update(deco, tr) { + deco = deco.map(tr.changes); + for (const e of tr.effects) if (e.is(setSemanticTokens)) deco = e.value; + return deco; + }, + provide: (f) => EditorView.decorations.from(f), +}); + +/** Effect that drops all semantic-token decorations. The field is shared across clients, so the + * editor dispatches this when switching to a server that emits no semantic tokens, to clear any the + * previous server left behind. */ +export const clearSemanticTokens = setSemanticTokens.of(Decoration.none); + +// Decode the LSP delta-encoded token array (groups of 5: +// [deltaLine, deltaStartChar, length, tokenType, tokenModifiers]). +function decodeSemanticTokens(data: number[], view: EditorView, tokenTypes: string[]): DecorationSet { + const builder = new RangeSetBuilder(); + const doc = view.state.doc; + let line = 0; + let char = 0; + for (let i = 0; i + 4 < data.length; i += 5) { + const dLine = data[i]; + const dChar = data[i + 1]; + const len = data[i + 2]; + const typeName = tokenTypes[data[i + 3]]; + if (dLine > 0) { + line += dLine; + char = dChar; + } else { + char += dChar; + } + if (!typeName || len <= 0 || line < 0 || line >= doc.lines) continue; + const lineObj = doc.line(line + 1); + const from = Math.min(lineObj.from + char, lineObj.to); + const to = Math.min(from + len, lineObj.to); + if (to > from) builder.add(from, to, Decoration.mark({ class: `cm-st-${typeName}` })); + } + return builder.finish(); +} + +/** Request semantic tokens on every edit (debounced) and render them as decorations. */ +export function semanticTokens(delay = 200): LSPClientExtension { + const requester = ViewPlugin.fromClass( + class { + timer: ReturnType | undefined; + constructor(readonly view: EditorView) { + void this.run(); + } + update(u: ViewUpdate) { + if (u.docChanged) this.schedule(); + } + schedule() { + if (this.timer) clearTimeout(this.timer); + this.timer = setTimeout(() => void this.run(), delay); + } + async run() { + const plugin = LSPPlugin.get(this.view); + const legend = plugin?.client.serverCapabilities?.semanticTokensProvider?.legend; + if (!plugin || !legend) return; + plugin.client.sync(); + try { + const res: any = await plugin.client.request("textDocument/semanticTokens/full", { + textDocument: { uri: plugin.uri }, + }); + if (!res?.data) return; + this.view.dispatch({ + effects: setSemanticTokens.of(decodeSemanticTokens(res.data, this.view, legend.tokenTypes)), + }); + } catch { + // ignore, will retry on next edit + } + } + destroy() { + if (this.timer) clearTimeout(this.timer); + } + }, + ); + return { + clientCapabilities: { + textDocument: { + semanticTokens: { + requests: { full: true }, + tokenTypes: [], + tokenModifiers: [], + formats: ["relative"], + }, + }, + }, + editorExtension: [semanticTokensField, requester], + }; +} diff --git a/packages/sparql-editor-codemirror/src/lsp/sparqlHighlight.ts b/packages/sparql-editor-codemirror/src/lsp/sparqlHighlight.ts new file mode 100644 index 00000000..7ecf1aa5 --- /dev/null +++ b/packages/sparql-editor-codemirror/src/lsp/sparqlHighlight.ts @@ -0,0 +1,105 @@ +/** + * Static SPARQL syntax highlighting, used as a FALLBACK when the active language server provides no + * semantic tokens (e.g. traqula, which is diagnostics-only). Servers that do emit semantic tokens + * (qlue-ls, swls) stay the source of truth, so this is toggled off for them by the editor + * (see `activateLanguageServer` in `../index.ts`). + * + * Tokens are tagged via a small {@link StreamLanguage} tokenizer and colored by mapping those tags + * onto the SAME `cm-st-` CSS classes the semantic-token glue uses (see `./glue` and the + * editor stylesheet), so the fallback follows the light/dark theme and matches the LSP palette. + */ +import { StreamLanguage, StreamParser, StringStream, HighlightStyle, syntaxHighlighting } from "@codemirror/language"; +import { tags as t } from "@lezer/highlight"; +import type { Extension } from "@codemirror/state"; + +// SPARQL 1.1 keywords + built-in functions (matched case-insensitively). `a` (the rdf:type +// shorthand) is handled separately so it only counts as a keyword when standing alone. +const KEYWORDS = new Set( + ( + "BASE PREFIX SELECT CONSTRUCT DESCRIBE ASK WHERE FROM NAMED DISTINCT REDUCED AS GROUP BY HAVING " + + "ORDER ASC DESC LIMIT OFFSET VALUES OPTIONAL UNION MINUS GRAPH SERVICE FILTER BIND UNDEF IN NOT " + + "EXISTS INSERT DELETE DATA WITH USING CLEAR DROP CREATE ADD MOVE COPY LOAD INTO SILENT DEFAULT ALL " + + "STR LANG LANGMATCHES DATATYPE BOUND IRI URI BNODE RAND ABS CEIL FLOOR ROUND CONCAT STRLEN UCASE " + + "LCASE ENCODE_FOR_URI CONTAINS STRSTARTS STRENDS STRBEFORE STRAFTER YEAR MONTH DAY HOURS MINUTES " + + "SECONDS TIMEZONE TZ NOW UUID STRUUID MD5 SHA1 SHA256 SHA384 SHA512 COALESCE IF STRLANG STRDT " + + "SAMETERM ISIRI ISURI ISBLANK ISLITERAL ISNUMERIC REGEX SUBSTR REPLACE COUNT SUM MIN MAX AVG " + + "SAMPLE GROUP_CONCAT SEPARATOR" + ) + .split(" ") + .map((w) => w.toUpperCase()), +); + +const sparqlParser: StreamParser = { + token(stream: StringStream): string | null { + if (stream.eatSpace()) return null; + const ch = stream.peek(); + + // Comments: # to end of line + if (stream.match(/^#.*/)) return "comment"; + + // Variables: ?name or $name + if (stream.match(/^[?$][A-Za-z0-9_]+/)) return "variableName"; + + // IRI refs: <...> + if (stream.match(/^<[^\s<>"{}|^`\\]*>/)) return "namespace"; + + // Strings (single-line, both quote styles, with escapes) + if (ch === '"' || ch === "'") { + const quote = ch; + stream.next(); + let escaped = false; + let c: string | void; + while ((c = stream.next()) != null) { + if (c === quote && !escaped) break; + escaped = !escaped && c === "\\"; + } + return "string"; + } + + // Language tag: @en, @en-GB + if (stream.match(/^@[A-Za-z][A-Za-z0-9-]*/)) return "meta"; + + // Numbers + if (stream.match(/^[+-]?(\d+\.\d*|\.\d+|\d+)([eE][+-]?\d+)?/)) return "number"; + + // Prefixed names (foo:bar, :bar) and bare prefixes (foo:) + if (stream.match(/^[A-Za-z_][\w.-]*:[\w.-]*/) || stream.match(/^:[\w.-]*/)) return "namespace"; + + // Words: keywords / `a` / booleans / plain identifiers + const word = stream.match(/^[A-Za-z_]\w*/) as RegExpMatchArray | null; + if (word) { + const w = word[0]; + if (w === "a") return "keyword"; + if (/^(true|false)$/i.test(w)) return "bool"; + if (KEYWORDS.has(w.toUpperCase())) return "keyword"; + return null; + } + + // Operators and punctuation + if (stream.match(/^(\|\||&&|!=|<=|>=|\^\^|[=<>+\-*/!^|&.,;(){}[\]])/)) return "operator"; + + stream.next(); + return null; + }, + languageData: { commentTokens: { line: "#" } }, +}; + +// Map the tokenizer's tags onto the same `cm-st-*` classes the LSP semantic-token glue uses, so the +// fallback shares the editor's theme-aware palette (no extra CSS needed). +const sparqlHighlightStyle = HighlightStyle.define([ + { tag: t.keyword, class: "cm-st-keyword" }, + { tag: t.variableName, class: "cm-st-variable" }, + { tag: t.string, class: "cm-st-string" }, + { tag: t.number, class: "cm-st-number" }, + { tag: t.comment, class: "cm-st-comment" }, + { tag: t.namespace, class: "cm-st-namespace" }, + { tag: t.bool, class: "cm-st-boolean" }, + { tag: t.meta, class: "cm-st-langTag" }, + { tag: t.operator, class: "cm-st-operator" }, +]); + +/** SPARQL grammar-based highlighting to use when no semantic tokens are available. */ +export const sparqlFallbackHighlight: Extension = [ + StreamLanguage.define(sparqlParser), + syntaxHighlighting(sparqlHighlightStyle), +]; diff --git a/packages/sparql-editor-codemirror/src/lsp/workerTransport.ts b/packages/sparql-editor-codemirror/src/lsp/workerTransport.ts new file mode 100644 index 00000000..c414e4ec --- /dev/null +++ b/packages/sparql-editor-codemirror/src/lsp/workerTransport.ts @@ -0,0 +1,40 @@ +/** + * A `@codemirror/lsp-client` {@link Transport} backed by a Web Worker LSP server. + * + * `@codemirror/lsp-client` speaks JSON-RPC as strings; the SparqlStudio LSP workers (qlue-ls, swls, + * traqula) exchange parsed JSON objects over `postMessage` (the same shape `monaco-languageclient` + * uses), with their own framing handled internally. This bridge converts between the two and + * swallows the worker's `{type:"ready"}` startup signal so it never reaches the JSON-RPC layer. + */ +import type { Transport } from "@codemirror/lsp-client"; + +export function workerTransport(worker: Worker): Transport { + let handlers: ((value: string) => void)[] = []; + worker.addEventListener("message", (event: MessageEvent) => { + const data = event.data; + // Startup handshake, not a JSON-RPC message. + if (data && typeof data === "object" && (data as any).type === "ready") return; + if (data === "ready") return; + // Some servers (e.g. swls) stamp `publishDiagnostics` with `version: 0` instead of echoing the + // document version. `@codemirror/lsp-client` drops diagnostics whose version != the current doc + // version, so after the first edit they would never render. + if (data && typeof data === "object" && (data as any).method === "textDocument/publishDiagnostics") { + const params = (data as any).params; + if (params && "version" in params) delete params.version; + } + const str = typeof data === "string" ? data : JSON.stringify(data); + for (const h of handlers) h(str); + }); + return { + // CM hands us JSON-RPC strings; the workers expect objects (they stringify/frame internally). + send(message: string) { + worker.postMessage(JSON.parse(message)); + }, + subscribe(handler) { + handlers.push(handler); + }, + unsubscribe(handler) { + handlers = handlers.filter((h) => h !== handler); + }, + }; +} diff --git a/packages/sparql-editor-codemirror/src/style/buttons.css b/packages/sparql-editor-codemirror/src/style/buttons.css new file mode 100644 index 00000000..0046e79c --- /dev/null +++ b/packages/sparql-editor-codemirror/src/style/buttons.css @@ -0,0 +1,294 @@ +.sparql-editor .sparql-editor_btn { + color: #333; + border: 1px solid transparent; + background-color: #fff; + border-color: #ccc; + border-width: 1px; + display: inline-block; + text-align: center; + vertical-align: middle; + cursor: pointer; + white-space: nowrap; + padding: 6px 12px; + border-radius: 2px; + user-select: none; + overflow: visible; + box-sizing: border-box; +} +.sparql-editor .sparql-editor_btn.btn_icon { + padding: 4px 8px; +} +.sparql-editor .sparql-editor_btn[disabled], +.sparql-editor .sparql-editor_btn.disabled { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50); + box-shadow: none; +} +.sparql-editor .sparql-editor_btn:hover { + outline: 0; + background-color: #ebebeb; + border-color: #adadad; +} +.sparql-editor .sparql-editor_btn:focus, +.sparql-editor .sparql-editor_btn.selected { + color: #fff; + outline: 0; + background-color: #337ab7; + border-color: #337ab7; +} +.sparql-editor .sparql-editor_btn.btn_icon:focus { + color: #333; + border: 1px solid transparent; + background-color: #fff; + border-color: #ccc; +} +.sparql-editor .sparql-editor_btn.sparql-editor_btn-sm { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.sparql-editor .sparql-editor_buttons { + position: absolute; + top: 10px; + right: 20px; + z-index: 5; +} +.sparql-editor .sparql-editor_buttons svg { + fill: #505050; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_share, +.sparql-editor .sparql-editor_buttons .sparql-editor_format { + cursor: pointer; + margin-top: 3px; + display: inline-block; + border: none; + background: none; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_share svg, +.sparql-editor .sparql-editor_buttons .sparql-editor_format svg { + height: 25px; + width: 25px; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_format svg { + height: 22px; + width: 22px; +} +.sparql-editor .sparql-editor_buttons button { + vertical-align: top; + margin-left: 5px; +} + +/* Language-server switcher */ +.sparql-editor .sparql-editor_buttons .sparql-editor_lsSelect { + font-size: 12px; + line-height: 1.5; + padding: 2px 22px 2px 8px; + position: relative; + max-width: 220px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_lsSelect::after { + content: ""; + position: absolute; + right: 8px; + top: 50%; + margin-top: -2px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid currentColor; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu { + position: absolute; + top: 28px; + left: 0; + z-index: 10; + min-width: 220px; + max-width: 360px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 2px; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); + /* padding: 4px 0; */ +} +.sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuItem { + display: block; + width: 100%; + margin: 0; + padding: 6px 12px; + border: none; + border-radius: 0; + background: none; + text-align: left; + cursor: pointer; + white-space: normal; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuItem:hover { + background-color: #ebebeb; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuItem.active { + background-color: #e6f0fb; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuLabel { + display: block; + font-weight: 600; + color: #333; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuDesc { + display: block; + font-size: 11px; + color: #888; + margin-top: 2px; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_sharePopup { + position: absolute; + padding: 4px; + margin-left: 0px; + background-color: #fff; + border: 1px solid #e3e3e3; + border-radius: 2px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + width: 600px; + height: auto; + display: flex; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_sharePopup .inputWrapper { + flex-grow: 100; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_sharePopup input { + float: left; + width: 100%; + border: 0px; + box-sizing: border-box; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_sharePopup button { + float: right; + margin-left: 5px; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_sharePopup textarea { + width: 100%; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton { + display: inline-block; + position: relative; + border: none; + background: none; + padding: 0; + cursor: pointer; + width: 40px; + height: 40px; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton .queryIcon { + display: block; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton .queryIcon svg { + width: 40px; + height: 40px; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton .svgImg { + position: absolute; + height: inherit; + top: 0; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton.busy svg #loadingIcon { + stroke-dasharray: 100; + animation: dash 1.5s linear infinite; + stroke-width: 8px; + stroke: white; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton .warningIcon { + display: none; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton.query_error .warningIcon { + display: block; + top: 5px; + right: 0px; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton.query_error .warningIcon svg { + width: 15px; + height: 15px; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton.query_error .warningIcon svg g { + fill: red; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton.query_disabled { + cursor: not-allowed; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton.query_disabled .queryIcon { + opacity: 0.5; + filter: alpha(opacity=50); +} + +/* Subtle feedback on the icon buttons (execute, share, format): dim on hover */ +.sparql-editor .sparql-editor_buttons .sparql-editor_share, +.sparql-editor .sparql-editor_buttons .sparql-editor_format, +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton { + transition: filter 0.15s ease; +} +.sparql-editor .sparql-editor_buttons .sparql-editor_share:hover, +.sparql-editor .sparql-editor_buttons .sparql-editor_format:hover, +.sparql-editor .sparql-editor_buttons .sparql-editor_queryButton:not(.query_disabled):hover { + filter: brightness(0.8); +} + +@keyframes dash { + to { + stroke-dashoffset: 200; + } +} +@keyframes rotate { + 100% { + transform: rotate(360deg); + } +} +@-webkit-keyframes spin { + 100% { + transform: rotate(360deg); + } +} + +[data-theme="dark"] .sparql-editor .sparql-editor_btn { + color: #ddd; + background-color: #2a2a2a; + border-color: #444; +} +[data-theme="dark"] .sparql-editor .sparql-editor_btn:hover { + background-color: #333; + border-color: #555; +} +[data-theme="dark"] .sparql-editor .sparql-editor_btn.btn_icon:focus { + color: #ddd; + background-color: #2a2a2a; + border-color: #444; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons svg { + fill: #bbb; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons .sparql-editor_sharePopup { + background-color: #2a2a2a; + border-color: #444; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons .sparql-editor_sharePopup input { + background-color: #1e1e1e; + color: #ddd; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu { + background-color: #2a2a2a; + border-color: #444; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuItem:hover { + background-color: #333; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuItem.active { + background-color: #1f3a52; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuLabel { + color: #ddd; +} +[data-theme="dark"] .sparql-editor .sparql-editor_buttons .sparql-editor_lsMenu .sparql-editor_lsMenuDesc { + color: #999; +} diff --git a/packages/sparql-editor-codemirror/src/style/codemirrorMods.css b/packages/sparql-editor-codemirror/src/style/codemirrorMods.css new file mode 100644 index 00000000..2df6855f --- /dev/null +++ b/packages/sparql-editor-codemirror/src/style/codemirrorMods.css @@ -0,0 +1,104 @@ +.sparql-editor .cm-editor { + line-height: 1.5em; + font-size: 14px; + border: 1px solid #d1d1d1; + height: 100%; +} +.sparql-editor .cm-editor.cm-focused { + outline: none; +} +.sparql-editor .cm-scroller { + font-family: monospace; +} +.sparql-editor .cm-matchhighlight { + background-color: #dbdeed; +} + +/* Semantic-token colors: the consumer language server glue marks tokens with `cm-st-` classes */ +.sparql-editor .cm-st-keyword { + color: #62036f; +} +.sparql-editor .cm-st-function { + color: #cb4b16; +} +.sparql-editor .cm-st-variable { + color: #219; +} +.sparql-editor .cm-st-string { + color: #aa1011; +} +.sparql-editor .cm-st-number { + color: #2aa198; +} +.sparql-editor .cm-st-comment { + color: #708090; + font-style: italic; +} +.sparql-editor .cm-st-operator { + color: #000000; +} +.sparql-editor .cm-st-namespace { + color: #ff5600; +} +/* Additional standard LSP semantic-token types (e.g. emitted by swls), mapped onto the same palette + so any language server's tokens get colored rather than rendering grey. */ +.sparql-editor .cm-st-property { + color: #cb4b16; /* like function */ +} +.sparql-editor .cm-st-enum { + color: #62036f; /* like keyword */ +} +.sparql-editor .cm-st-enumMember, +.sparql-editor .cm-st-boolean { + color: #2aa198; /* like number / constant */ +} +.sparql-editor .cm-st-langTag { + color: #ff5600; /* like namespace */ +} + +/* Dark theme overrides. The CodeMirror editor chrome (background, gutter, selection) is themed via + the `darkTheme` extension in index.ts; these rules cover the surrounding container and the + semantic-token palette, which live outside CodeMirror's own theming. */ +[data-theme="dark"] .sparql-editor .cm-editor { + border-color: #3a3a3a; +} +[data-theme="dark"] .sparql-editor .cm-matchhighlight { + background-color: #3a3d41; +} +[data-theme="dark"] .sparql-editor .cm-st-keyword { + color: #7f85e7; +} +[data-theme="dark"] .sparql-editor .cm-st-function { + color: #32beb3; +} +[data-theme="dark"] .sparql-editor .cm-st-variable { + color: #adbebe; +} +[data-theme="dark"] .sparql-editor .cm-st-string { + color: #9db500; +} +[data-theme="dark"] .sparql-editor .cm-st-number { + color: #f0591a; +} +[data-theme="dark"] .sparql-editor .cm-st-comment { + color: #68828a; +} +[data-theme="dark"] .sparql-editor .cm-st-operator { + color: #32beb3; +} +[data-theme="dark"] .sparql-editor .cm-st-namespace { + color: #d6a200; +} +[data-theme="dark"] .sparql-editor .cm-st-property { + color: #32beb3; +} +[data-theme="dark"] .sparql-editor .cm-st-enum { + color: #7f85e7; +} +[data-theme="dark"] .sparql-editor .cm-st-enumMember, +[data-theme="dark"] .sparql-editor .cm-st-boolean { + color: #f0591a; +} +[data-theme="dark"] .sparql-editor .cm-st-langTag { + color: #d6a200; +} diff --git a/packages/sparql-editor-codemirror/src/style/yasqe.css b/packages/sparql-editor-codemirror/src/style/yasqe.css new file mode 100644 index 00000000..14fb2287 --- /dev/null +++ b/packages/sparql-editor-codemirror/src/style/yasqe.css @@ -0,0 +1,94 @@ +.sparql-editor { + position: relative; +} +.sparql-editor .cm-editor { + min-height: 60px; +} +.sparql-editor .svgImg { + display: inline-block; +} +.sparql-editor span.shortlinkErr { + font-size: small; + color: red; + font-weight: bold; + float: left; +} +.sparql-editor .notificationContainer { + width: 100%; + display: flex; + justify-content: center; + position: absolute; + bottom: 0; +} +.sparql-editor .notification { + z-index: 4; + padding: 0 5px; + max-height: 0px; + /* Clip while collapsed so the (possibly multi-line) text disappears with the box on dismiss. */ + overflow: hidden; + color: #999; + background-color: #eee; + font-size: 90%; + text-align: center; + transition: max-height 0.2s ease-in; + border-top-right-radius: 2px; + border-top-left-radius: 2px; +} +.sparql-editor .notification.active { + max-height: 3rem; +} +.sparql-editor .parseErrorIcon { + width: 13px; + height: 13px; + margin-top: 2px; + margin-left: 2px; +} +.sparql-editor .parseErrorIcon svg g { + fill: red; +} +.sparql-editor .sparql-editor_tooltip { + background: #333; + background: rgba(0, 0, 0, 0.8); + border-radius: 5px; + color: #fff; + padding: 5px 15px; + width: 220px; + white-space: pre-wrap; + white-space: normal; + margin-top: 5px; +} +.sparql-editor .notificationLoader { + width: 18px; + height: 18px; + vertical-align: middle; +} +.sparql-editor .resizeWrapper { + width: 100%; + height: 10px; + display: flex; + align-items: center; + justify-content: center; + cursor: row-resize; +} +.sparql-editor .resizeChip { + width: 20%; + height: 4px; + background-color: #d1d1d1; + visibility: hidden; + border-radius: 2px; +} +/* Show resizeChip when sparql-editor is hovered */ +.sparql-editor:hover .resizeChip { + visibility: visible; +} + +[data-theme="dark"] .sparql-editor .notification { + color: #aaa; + background-color: #2a2a2a; +} +[data-theme="dark"] .sparql-editor .resizeChip { + background-color: #3a3a3a; +} + +/* Language-server error notifications render via the shared `createLspErrorNotification` helper + (@rdfjs/sparql-utils), which injects its own `.sparql-editor-lsp-error` styles. */ diff --git a/packages/yasqe/src/tooltip.ts b/packages/sparql-editor-codemirror/src/tooltip.ts similarity index 63% rename from packages/yasqe/src/tooltip.ts rename to packages/sparql-editor-codemirror/src/tooltip.ts index f8df7cb6..41d9b67c 100644 --- a/packages/yasqe/src/tooltip.ts +++ b/packages/sparql-editor-codemirror/src/tooltip.ts @@ -4,20 +4,15 @@ * position tooltip within codemirror frame as much as possible, to avoid z-index issues with external things on page * use html as content */ -import Yasqe from "./"; +import SparqlEditor from "./"; -export default function tooltip(_yasqe: Yasqe, parent: HTMLDivElement, html: string) { +export default function tooltip(_yasqe: SparqlEditor, parent: HTMLDivElement, html: string) { var tooltip: HTMLDivElement; parent.onmouseover = function () { if (!tooltip) { tooltip = document.createElement("div"); - tooltip.className = "yasqe_tooltip"; + tooltip.className = "sparql-editor_tooltip"; } - // if ($(yasqe.getWrapperElement()).offset().top >= tooltip.offset().top) { - //shit, move the tooltip down. The tooltip now hovers over the top edge of the yasqe instance - // tooltip.css("bottom", "auto"); - // tooltip.css("top", "26px"); - // } tooltip.style.display = "block"; tooltip.innerHTML = html; parent.appendChild(tooltip); diff --git a/packages/yasqe/CHANGELOG.md b/packages/sparql-editor-monaco/CHANGELOG.md similarity index 85% rename from packages/yasqe/CHANGELOG.md rename to packages/sparql-editor-monaco/CHANGELOG.md index 487d12e7..70349067 100644 --- a/packages/yasqe/CHANGELOG.md +++ b/packages/sparql-editor-monaco/CHANGELOG.md @@ -5,7 +5,7 @@ ### Patch Changes - 2285bff: Fix the display of results of DESCRIBE and CONSTRUCT queries. - - @zazuko/yasgui-utils@4.6.1 + - @rdfjs/sparql-utils@4.6.1 ## 4.6.0 @@ -13,33 +13,33 @@ - 2e04999: Upgrade various dependencies - Updated dependencies [2e04999] - - @zazuko/yasgui-utils@4.6.0 + - @rdfjs/sparql-utils@4.6.0 ## 4.5.0 ### Patch Changes -- @zazuko/yasgui-utils@4.5.0 +- @rdfjs/sparql-utils@4.5.0 ## 4.4.3 ### Patch Changes - b835764: Fix support for CONSTRUCT queries. - - @zazuko/yasgui-utils@4.4.3 + - @rdfjs/sparql-utils@4.4.3 ## 4.4.2 ### Patch Changes - c7ae45e: Fix `Content-Type` header for `fetch` GET request - - @zazuko/yasgui-utils@4.4.2 + - @rdfjs/sparql-utils@4.4.2 ## 4.4.1 ### Patch Changes -- @zazuko/yasgui-utils@4.4.1 +- @rdfjs/sparql-utils@4.4.1 ## 4.4.0 @@ -49,7 +49,7 @@ ### Patch Changes -- @zazuko/yasgui-utils@4.4.0 +- @rdfjs/sparql-utils@4.4.0 ## 4.3.3 @@ -59,27 +59,27 @@ - d918c63: Add a `queryBefore` event on Yasgui and Yasqe (by @vemonet, in #16) - Updated dependencies [d918c63] - Updated dependencies [d918c63] - - @zazuko/yasgui-utils@4.3.3 + - @rdfjs/sparql-utils@4.3.3 ## 4.3.2 ### Patch Changes -- @zazuko/yasgui-utils@4.3.2 +- @rdfjs/sparql-utils@4.3.2 ## 4.3.1 ### Patch Changes -- @zazuko/yasgui-utils@4.3.1 +- @rdfjs/sparql-utils@4.3.1 ## 4.3.0 ### Patch Changes -- b14ed24: Update Git repository to https://github.com/zazuko/Yasgui +- b14ed24: Update Git repository to https://github.com/rdfjs/Yasgui - Updated dependencies [b14ed24] - - @zazuko/yasgui-utils@4.3.0 + - @rdfjs/sparql-utils@4.3.0 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. diff --git a/packages/sparql-editor-monaco/package.json b/packages/sparql-editor-monaco/package.json new file mode 100644 index 00000000..ce2c154e --- /dev/null +++ b/packages/sparql-editor-monaco/package.json @@ -0,0 +1,54 @@ +{ + "name": "@rdfjs/sparql-editor-monaco", + "description": "SPARQL query editor for the web, based on the Monaco editor (fork of Yasqe)", + "version": "4.6.1", + "type": "module", + "main": "build/sparql-editor-monaco.js", + "module": "build/sparql-editor-monaco.js", + "types": "build/ts/src/index.d.ts", + "files": ["build"], + "exports": { + ".": { + "types": "./build/ts/src/index.d.ts", + "import": "./build/sparql-editor-monaco.js" + }, + "./index.js": "./build/sparql-editor-monaco.js", + "./style.css": "./build/sparql-editor-monaco.css", + "./*": "./*" + }, + "license": "MIT", + "author": "Triply ", + "homepage": "https://github.com/rdfjs/Yasgui", + "engines": { + "node": ">= 8" + }, + "keywords": [ + "JavaScript", + "SPARQL", + "Editor", + "Semantic Web", + "Linked Data" + ], + "bugs": "https://github.com/rdfjs/Yasgui/issues/", + "repository": { + "type": "git", + "url": "https://github.com/rdfjs/Yasgui.git", + "directory": "packages/sparql-editor-monaco" + }, + "dependencies": { + "@rdfjs/sparql-utils": "^4.6.1", + "@codingame/monaco-vscode-textmate-service-override": "^25.1.2", + "lodash-es": "^4.18.1", + "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@^25.1.2", + "monaco-languageclient": "~10.7.0", + "query-string": "^6.10.1", + "vscode": "npm:@codingame/monaco-vscode-extension-api@^25.1.2" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.3", + "@types/node": "^22.5.4" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/sparql-editor-monaco/src/defaults.ts b/packages/sparql-editor-monaco/src/defaults.ts new file mode 100644 index 00000000..fc4d2dcb --- /dev/null +++ b/packages/sparql-editor-monaco/src/defaults.ts @@ -0,0 +1,78 @@ +/** + * The default SparqlEditor options. Editor-specific behaviour (line numbers, word wrap, keybindings, ...) + * is configured through Monaco editor options, see the `editorOptions` config field. Override these + * defaults by setting `SparqlEditor.defaults`, or by passing your own options as the second constructor argument. + */ +import { default as SparqlEditor, Config, PlainRequestConfig } from "./"; +import * as queryString from "query-string"; +export default function get() { + const config: Omit = { + value: `PREFIX rdf: +PREFIX rdfs: +SELECT * WHERE { + ?sub ?pred ?obj . +} LIMIT 10`, + // Follow the OS/browser preference by default so the editor matches the auto-adapting chrome. + // Callers can override by passing `theme` explicitly or via SparqlEditor.setTheme(). + theme: + typeof window !== "undefined" && window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light", + // Custom Monaco editor options, deep-merged over the built-in defaults + editorOptions: {}, + // Custom SPARQL theme overrides, deep-merged over the built-in light/dark themes + themes: {}, + createShareableLink: function (yasqe: SparqlEditor) { + return ( + document.location.protocol + + "//" + + document.location.host + + document.location.pathname + + document.location.search + + "#" + + queryString.stringify(yasqe.configToQueryParams()) + ); + }, + pluginButtons: undefined, + createShortLink: undefined, + + consumeShareLink: function (yasqe: SparqlEditor) { + yasqe.queryParamsToConfig(yasqe.getUrlParams()); + }, + persistenceId: function (yasqe: SparqlEditor) { + //Traverse parents untl we've got an id + // Get matching parent elements + let id = ""; + let elem: any = yasqe.rootEl; + if ((elem).id) id = (elem).id; + for (; elem && elem !== document; elem = elem.parentNode) { + if (elem) { + if ((elem).id) id = (elem).id; + break; + } + } + return "sparql-editor_" + id + "_query"; + }, + persistencyExpire: 60 * 60 * 24 * 30, + + showQueryButton: true, + resizeable: true, + editorHeight: "300px", + queryingDisabled: undefined, + // Language servers are consumer-provided; none by default (Monarch highlighting still works) + languageServers: [], + }; + const requestConfig: PlainRequestConfig = { + queryArgument: undefined, //undefined means: get query argument based on query mode + endpoint: "https://sparql.dblp.org/sparql", + method: "POST", + acceptHeaderGraph: "text/turtle,application/n-triples,application/rdf+xml,application/trig,application/n-quads", + acceptHeaderSelect: "application/sparql-results+json,*/*;q=0.9", + acceptHeaderUpdate: "text/plain,*/*;q=0.9", + namedGraphs: [], + defaultGraphs: [], + args: [], + headers: {}, + withCredentials: false, + adjustQueryBeforeRequest: false, + }; + return { ...config, requestConfig }; +} diff --git a/packages/sparql-editor-monaco/src/editor/editorConfig.ts b/packages/sparql-editor-monaco/src/editor/editorConfig.ts new file mode 100644 index 00000000..0a198e0c --- /dev/null +++ b/packages/sparql-editor-monaco/src/editor/editorConfig.ts @@ -0,0 +1,281 @@ +/** + * Monaco Editor setup with SPARQL syntax highlighting. + * + * Uses the monaco-languageclient "classic" configuration: no VSCode extension host, no TextMate + * engine and no oniguruma wasm. The SPARQL language, a Monarch tokenizer (fallback highlighting) + * and the light/dark themes are registered directly through the standalone Monaco API. The + * authoritative coloring comes from qlue-ls LSP *semantic tokens*; the Monarch grammar only + * provides highlighting before the language server responds. + * + * This module is language server agnostic: it does NOT create or know about any specific + * language server. A ready-to-use LSP `Worker` can be injected by the caller; when provided, + * a monaco-languageclient is wired to it (giving completions, diagnostics, formatting, semantic + * tokens, etc. whatever that server supports). When omitted, the editor still works with + * Monarch-based syntax highlighting only. + */ + +import { configureDefaultWorkerFactory } from "monaco-languageclient/workerFactory"; +import { type EditorAppConfig, EditorApp } from "monaco-languageclient/editorApp"; +import { type MonacoVscodeApiConfig, MonacoVscodeApiWrapper } from "monaco-languageclient/vscodeApiWrapper"; +import { type LanguageClientConfig, LanguageClientWrapper } from "monaco-languageclient/lcwrapper"; +import { Uri, editor, languages } from "monaco-editor"; +import { merge } from "lodash-es"; +import { getSparqlBlockFoldingRanges } from "@rdfjs/sparql-utils"; + +// SPARQL themes (Monaco standalone theme data is derived from these) and classic-mode grammar +import { sparqlThemeDark, sparqlThemeLight } from "./sparqlTheme"; +import { sparqlMonarchLanguage, sparqlLanguageConfiguration, buildSparqlThemeData } from "./sparqlMonarch"; + +/** Monaco standalone theme names registered for the SPARQL editor. */ +export const SPARQL_THEME_LIGHT = "sparql-light"; +export const SPARQL_THEME_DARK = "sparql-dark"; + +const LANGUAGE_ID = "sparql"; + +// Registered once for the language (not per editor) so the brace-block ranges are added on top of +// whatever the language server reports. qlue-ls only folds the PREFIX/BASE prologue, so this is what +// makes WHERE / SERVICE / OPTIONAL / sub-SELECT blocks foldable. +let foldingProviderRegistered = false; +function registerSparqlFoldingProvider(): void { + if (foldingProviderRegistered) return; + foldingProviderRegistered = true; + languages.registerFoldingRangeProvider(LANGUAGE_ID, { + provideFoldingRanges(model) { + // Monaco lines are 1-based and the folded area starts/ends at a line's last character; using + // `endLine` (0-based line of `}`) as the 1-based end keeps the closing brace line visible. + return getSparqlBlockFoldingRanges(model.getValue()).map((r) => ({ + start: r.startLine + 1, + end: r.endLine, + kind: languages.FoldingRangeKind.Region, + })); + }, + }); +} + +export interface MonacoEditorResult { + apiWrapper: MonacoVscodeApiWrapper; + editorApp: EditorApp; + getContent(): string; + setContent(content: string): void; + focus(): void; + getDocumentUri(): string; +} + +/** Consumer overrides for the SPARQL editor themes, deep-merged OVER the built-in light/dark themes. */ +export interface SparqlThemeOverrides { + light?: Record; + dark?: Record; +} + +/** + * Connect a `monaco-languageclient` LanguageClient to a ready language server `Worker`. SparqlEditor calls + * this for the active language server (it may switch between several), so it is decoupled from the + * editor setup in {@link startMonacoEditor}. The returned wrapper is already started. + */ +/** + * Resolve once a freshly created LSP worker signals it is ready, so the client never sends + * `initialize`/`didOpen` before the worker has installed its message handler. WASM-backed workers + * (qlue-ls, swls, ...) set their handler only AFTER an async `import()` / WASM init; a client + * connecting too early races that setup and corrupts message ordering. By convention these workers + * post `{ type: "ready" }` (or the bare string `"ready"`) once set up. `addEventListener` (not + * `onmessage=`) so it never clobbers the handler the client attaches later. + */ +function awaitWorkerReady(worker: Worker): Promise { + return new Promise((resolve) => { + const onReady = (event: MessageEvent) => { + if (event.data?.type === "ready" || event.data === "ready") { + worker.removeEventListener("message", onReady); + resolve(); + } + }; + worker.addEventListener("message", onReady); + }); +} + +export async function connectLanguageClient(lsWorker: Worker): Promise { + await awaitWorkerReady(lsWorker); + const languageClientConfig: LanguageClientConfig = { + languageId: LANGUAGE_ID, + clientOptions: { + documentSelector: [{ language: LANGUAGE_ID }], + workspaceFolder: { + index: 0, + name: "workspace", + uri: Uri.parse("file:/"), + }, + progressOnInitialization: true, + diagnosticPullOptions: { + onChange: true, + onSave: false, + }, + // The language server returns completion labels as { label, detail } where `detail` is the + // human-readable text. Monaco glues `detail` directly onto the label with no separator, + // so we prefix it with a space here. + middleware: { + provideCompletionItem: async (document, position, context, token, next) => { + const result = await next(document, position, context, token); + if (!result) return result; + const items = Array.isArray(result) ? result : result.items; + for (const item of items) { + const label = item.label; + if (label && typeof label === "object" && label.detail && !label.detail.startsWith(" ")) { + label.detail = " " + label.detail; + } + } + return result; + }, + }, + }, + connection: { + options: { + $type: "WorkerDirect", + worker: lsWorker, + }, + }, + restartOptions: { + retries: 5, + timeout: 1000, + keepWorker: false, + }, + }; + const lcWrapper = new LanguageClientWrapper(languageClientConfig); + await lcWrapper.start(); + return lcWrapper; +} + +/** + * Creates a Monaco editor with SPARQL syntax highlighting. Language-server agnostic: the editor is + * built here, and SparqlEditor connects the active language client separately via {@link connectLanguageClient}. + * @param editorOptions Optional Monaco editor options, deep-merged OVER the built-in defaults. + * @param themeOverrides Optional partial light/dark theme objects, deep-merged OVER the built-in themes. + */ +export async function startMonacoEditor( + container: HTMLElement, + initialValue: string, + theme: "light" | "dark" = "dark", + editorOptions?: Record, + themeOverrides?: SparqlThemeOverrides, +): Promise { + // Built-in themes with any consumer overrides deep-merged on top + const lightTheme = merge({}, sparqlThemeLight, themeOverrides?.light ?? {}); + const darkTheme = merge({}, sparqlThemeDark, themeOverrides?.dark ?? {}); + const initialThemeName = theme === "dark" ? SPARQL_THEME_DARK : SPARQL_THEME_LIGHT; + + // Classic monaco-vscode api config: no extension host, no TextMate, no theme service. + const vscodeApiConfig: MonacoVscodeApiConfig = { + $type: "classic", + viewsConfig: { + $type: "EditorService", + }, + userConfiguration: { + json: JSON.stringify({ + "editor.guides.bracketPairsHorizontal": "active", + "editor.lightbulb.enabled": "On", + "editor.wordBasedSuggestions": "off", + "editor.experimental.asyncTokenization": true, + // Use language server semantic tokens (parser-based) on top of the Monarch fallback grammar + "editor.semanticHighlighting.enabled": true, + "editor.tabSize": 2, + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "editor.fontSize": 14, + "editor.minimap.enabled": false, + "files.eol": "\n", + }), + }, + monacoWorkerFactory: configureDefaultWorkerFactory, + // Skip the extension-host services entirely (classic mode registers language/grammar/theme + // through the standalone API), which drops the extensionHost worker + extensions service. + advanced: { + loadExtensionServices: false, + // enforceSemanticHighlighting: true, + }, + }; + + // Create and start the monaco-vscode api wrapper + const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig); + await apiWrapper.start(); + + // Built-in default Monaco editor options. Consumers can override/extend any of these via the + // `editorOptions` argument (deep-merged on top) + const defaultEditorOptions = { + tabCompletion: "on", + suggestOnTriggerCharacters: true, + fontSize: 14, + fontFamily: "Source Code Pro, monospace", + links: false, + minimap: { enabled: false }, + overviewRulerLanes: 0, + scrollBeyondLastLine: false, + scrollbar: { + alwaysConsumeMouseWheel: false, + }, + padding: { top: 8, bottom: 8 }, + lineDecorationsWidth: 0, + lineNumbersMinChars: 2, + glyphMargin: true, + // Show the Monaco/VSCode right-click context menu (Format Document, Cut/Copy/Paste, ...) + contextmenu: true, + folding: true, + foldingImportsByDefault: true, + snippetSuggestions: "top", + tabSize: 2, + // Monaco equivalents of the old YASQE/CodeMirror defaults, kept so behaviour is preserved + lineNumbers: "on", // was lineNumbers: true + wordWrap: "on", // was lineWrapping: true + matchBrackets: "always", // was matchBrackets: true + selectionHighlight: true, // was highlightSelectionMatches: { showToken: /\w/ } + } as const; + + // EditorAppConfig: classic mode registers the SPARQL language + Monarch grammar + initial theme + const editorAppConfig: EditorAppConfig = { + codeResources: { + modified: { + uri: "query.rq", + text: initialValue, + }, + }, + editorOptions: merge({}, defaultEditorOptions, editorOptions ?? {}), + languageDef: { + languageExtensionConfig: { + id: LANGUAGE_ID, + extensions: [".rq", ".sparql"], + aliases: ["SPARQL", "sparql"], + }, + monarchLanguage: sparqlMonarchLanguage, + theme: { + name: initialThemeName, + data: buildSparqlThemeData(theme === "dark" ? darkTheme : lightTheme), + }, + }, + }; + + // Create and start the editor app (registers language, Monarch grammar and the initial theme) + const editorApp = new EditorApp(editorAppConfig); + await editorApp.start(container); + + // Register both themes + the language configuration (brackets/comments/auto-close) so theme + // switching at runtime works and bracket matching/auto-closing behave correctly. + editor.defineTheme(SPARQL_THEME_LIGHT, buildSparqlThemeData(lightTheme)); + editor.defineTheme(SPARQL_THEME_DARK, buildSparqlThemeData(darkTheme)); + editor.setTheme(initialThemeName); + languages.setLanguageConfiguration(LANGUAGE_ID, sparqlLanguageConfiguration); + registerSparqlFoldingProvider(); + + return { + apiWrapper, + editorApp, + getContent(): string { + return editorApp.getEditor()?.getValue() ?? ""; + }, + setContent(content: string): void { + editorApp.getEditor()?.setValue(content); + }, + focus(): void { + editorApp.getEditor()?.focus(); + }, + getDocumentUri(): string { + return editorApp.getEditor()?.getModel()?.uri.toString() ?? ""; + }, + }; +} diff --git a/packages/sparql-editor-monaco/src/editor/sparqlMonarch.ts b/packages/sparql-editor-monaco/src/editor/sparqlMonarch.ts new file mode 100644 index 00000000..ec46a869 --- /dev/null +++ b/packages/sparql-editor-monaco/src/editor/sparqlMonarch.ts @@ -0,0 +1,233 @@ +/** + * Classic-mode SPARQL highlighting (no VSCode extension host / TextMate / oniguruma). + * + * A Monarch tokenizer provides the *fallback* syntax highlighting shown before the language + * server responds. The authoritative coloring still comes from qlue-ls LSP semantic tokens. + * Both are driven by the SAME theme `rules` table: Monarch emits token names that match the + * standard LSP semantic token types (keyword, function, variable, string, number, comment, + * operator, namespace), so one set of rules colors both. + */ + +import type * as monaco from "monaco-editor"; + +/** Control/structural SPARQL keywords (case-insensitive). */ +const SPARQL_KEYWORDS = [ + "BASE", + "PREFIX", + "SELECT", + "DISTINCT", + "REDUCED", + "FROM", + "NAMED", + "WHERE", + "UNION", + "OPTIONAL", + "MINUS", + "GRAPH", + "SERVICE", + "SILENT", + "VALUES", + "AS", + "GROUP", + "BY", + "HAVING", + "ORDER", + "DESC", + "ASC", + "LIMIT", + "OFFSET", + "CONSTRUCT", + "DESCRIBE", + "ASK", + "LOAD", + "INTO", + "CLEAR", + "ALL", + "DEFAULT", + "DROP", + "ADD", + "TO", + "MOVE", + "COPY", + "WITH", + "USING", + "CREATE", + "INSERT", + "DELETE", + "DATA", + "true", + "false", + "a", +]; + +/** SPARQL built-in functions / aggregates (case-insensitive). */ +const SPARQL_FUNCTIONS = [ + "FILTER", + "BIND", + "MAX", + "SAMPLE", + "LANG", + "STR", + "RAND", + "ABS", + "CEIL", + "FLOOR", + "ROUND", + "CONCAT", + "STRLEN", + "UCASE", + "LCASE", + "ENCODE_FOR_URI", + "CONTAINS", + "STRSTARTS", + "STRENDS", + "STRBEFORE", + "STRAFTER", + "YEAR", + "MONTH", + "DAY", + "HOURS", + "MINUTES", + "SECONDS", + "TIMEZONE", + "TZ", + "NOW", + "UUID", + "STRUUID", + "MD5", + "SHA1", + "SHA256", + "SHA384", + "SHA512", + "COALESCE", + "IF", + "STRLANG", + "STRDT", + "sameTerm", + "isIRI", + "isURI", + "isBLANK", + "isLITERAL", + "isNUMERIC", + "COUNT", + "SUM", + "MIN", + "AVG", + "GROUP_CONCAT", + "SEPARATOR", + "SUBSTR", + "REGEX", + "EXISTS", + "IN", + "NOT", + "BOUND", +]; + +/** Monarch language definition used for the pre-LSP fallback tokenization. */ +export const sparqlMonarchLanguage: monaco.languages.IMonarchLanguage = { + ignoreCase: true, + defaultToken: "", + keywords: SPARQL_KEYWORDS, + functions: SPARQL_FUNCTIONS, + tokenizer: { + root: [ + // Comments + [/#.*$/, "comment"], + // Variables: ?var or $var + [/[?$]\w+/, "variable"], + // IRIs: <...> + [/<[^<>"{}|^`\s]*>/, "operator"], + // Prefixed name / CURIE + [/[A-Za-z_][\w.\-]*:[A-Za-z0-9_-]*/, "namespace"], + // Numbers + [/\d+(\.\d+([eE][\-+]?\d+)?)?/, "number"], + // Strings (double / single quoted, with escapes) + [/"([^"\\]|\\.)*"/, "string"], + [/'([^'\\]|\\.)*'/, "string"], + // Identifiers -> keyword / function / plain + [ + /[a-zA-Z_]\w*/, + { + cases: { + "@keywords": "keyword", + "@functions": "function", + "@default": "identifier", + }, + }, + ], + // Brackets / punctuation / operators + [/[{}()\[\].;,]/, "operator"], + [/[*+\/<>=!&|^~-]+/, "operator"], + ], + }, +}; + +/** Brackets, comments and auto-closing pairs (classic equivalent of the language configuration). */ +export const sparqlLanguageConfiguration: monaco.languages.LanguageConfiguration = { + comments: { lineComment: "#" }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'", notIn: ["string", "comment"] }, + { open: '"', close: '"', notIn: ["string"] }, + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'" }, + { open: '"', close: '"' }, + ], +}; + +/** Source theme shape (subset of a VSCode theme) used to derive a standalone Monaco theme. */ +interface SparqlThemeSource { + type: string; + colors: Record; + semanticTokenColors: Record; +} + +/** + * Normalize a hex color to the 6/8-digit form (no leading `#`) that Monaco's standalone + * `defineTheme` requires for token-color rules. Monaco's strict token-color parser rejects the + * CSS shorthand (e.g. `#219`), so expand 3/4-digit shorthand to its full form. + */ +function normalizeHex(color: string): string { + const h = color.replace(/^#/, ""); + if (h.length === 3 || h.length === 4) { + return h + .split("") + .map((ch) => ch + ch) + .join(""); + } + return h; +} + +/** + * Build a standalone Monaco theme (IStandaloneThemeData) from one of the SPARQL theme objects. + * The `rules` are keyed by the LSP semantic token type names, which also match the Monarch + * token names emitted above, so a single table colors both the fallback and the LSP tokens. + */ +export function buildSparqlThemeData(theme: SparqlThemeSource): monaco.editor.IStandaloneThemeData { + const rules: monaco.editor.ITokenThemeRule[] = []; + for (const [token, value] of Object.entries(theme.semanticTokenColors)) { + const fg = typeof value === "string" ? value : value.foreground; + if (!fg) continue; + const rule: monaco.editor.ITokenThemeRule = { token, foreground: normalizeHex(fg) }; + const fontStyle = typeof value === "object" ? value.fontStyle : undefined; + if (fontStyle) rule.fontStyle = fontStyle; + rules.push(rule); + } + return { + base: theme.type === "dark" ? "vs-dark" : "vs", + inherit: true, + colors: theme.colors, + rules, + }; +} diff --git a/packages/sparql-editor-monaco/src/editor/sparqlTheme.ts b/packages/sparql-editor-monaco/src/editor/sparqlTheme.ts new file mode 100644 index 00000000..4fdab60e --- /dev/null +++ b/packages/sparql-editor-monaco/src/editor/sparqlTheme.ts @@ -0,0 +1,225 @@ +export const sparqlThemeDark = { + // Solarized Dark theme, adapted from the original Solarized palette + name: "SPARQL Dark Theme", + type: "dark", + colors: { + "editor.foreground": "#839496", + "editor.background": "#002b36", + "editor.selectionBackground": "#073642", + "editor.lineHighlightBackground": "#073642", + "editorCursor.foreground": "#fdf6e3", + "editorWhitespace.foreground": "#586e75", + "editorIndentGuide.activeBackground": "#cb4b1680", + "editor.selectionHighlightBorder": "#d33682", + }, + // Used when the language server (qlue-ls) emits semantic tokens + // colors mirror the TextMate scopes below so highlighting stays consistent + semanticHighlighting: true, + semanticTokenColors: { + keyword: "#7f85e7", // purple - matches keyword.control.sparql + function: "#32beb3", // cyan - matches keyword.operator.function.sparql (STRDT, CONCAT, ...) + variable: "#adbebe", // base1 grey - matches variable.other.sparql + string: "#9db500", // green - matches string + number: "#f0591a", // orange - matches constant.numeric, alt: #FF5600 + comment: "#68828a", // base01 - solarized + operator: "#32beb3", // cyan - matches keyword.symbol (*, ...) + namespace: "#d6a200", // gold - matches variable.prefix.sparql + // Additional standard LSP token types (e.g. emitted by swls), mapped onto the same palette. + property: "#32beb3", // like function + enum: "#7f85e7", // like keyword + enumMember: "#f0591a", // like number + boolean: "#f0591a", // like number / constant + langTag: "#d6a200", // like namespace + // namespace: { foreground: "#d6a200", fontStyle: "italic bold" }, + }, + // Used by TextMate grammars (fallback if no semantic colors provided by language server) + tokenColors: [ + { + scope: "keyword.control.sparql", + settings: { + foreground: "#7f85e7", // purple + // fontStyle: "bold italic", + }, + }, + { + scope: "keyword.operator.function.sparql", + settings: { + foreground: "#32beb3", // cyan + }, + }, + { + scope: "keyword.operator.prefixdecl.sparql", + settings: { + foreground: "#7f85e7", // purple + }, + }, + { + scope: "variable.prefix.sparql", + settings: { + foreground: "#d6a200", // gold + }, + }, + { + scope: "variable.reference.sparql", + settings: { + foreground: "#d6a200", // gold + }, + }, + { + scope: "variable.other.sparql", + settings: { + foreground: "#adbebe", // base1 grey + }, + }, + { + scope: "constant.other.iri.sparql", + settings: { + foreground: "#32beb3", // cyan + }, + }, + { + scope: "constant.numeric", + settings: { + foreground: "#f0591a", // orange + }, + }, + { + scope: "string", + settings: { + foreground: "#9db500", // green + }, + }, + { + scope: "keyword.symbol", + settings: { + foreground: "#32beb3", // cyan + }, + }, + ], +}; + +export const sparqlThemeLight = { + name: "SPARQL Light Theme", + type: "light", + colors: { + "editor.foreground": "#586e75", + "editor.background": "#f7f7f7", // off-white with better contrast than white + // "editor.background": "#ffffff", // white + // "editor.background": "#fdf6e3", // solarized light background + "editor.selectionBackground": "#eee8d5", + "editor.lineHighlightBackground": "#fdf6e3", + "editorCursor.foreground": "#002b36", + "editorWhitespace.foreground": "#93a1a1", + "editorIndentGuide.activeBackground": "#cb4b1680", + "editor.selectionHighlightBorder": "#d33682", + }, + semanticHighlighting: true, + semanticTokenColors: { + keyword: "#62036F", + function: "#cb4b16", + variable: "#219", + string: "#AA1011", + number: "#2aa198", + comment: "#708090", + operator: "#000000", + namespace: "#FF5600", + // Additional standard LSP token types (e.g. emitted by swls), mapped onto the same palette. + property: "#cb4b16", // like function + enum: "#62036F", // like keyword + enumMember: "#2aa198", // like number + boolean: "#2aa198", // like number / constant + langTag: "#FF5600", // like namespace + }, + tokenColors: [ + { + scope: "keyword.control.sparql", + settings: { + foreground: "#62036F", + // fontStyle: "bold", + }, + }, + { + scope: "keyword.operator.function.sparql", + settings: { + foreground: "#cb4b16", + }, + }, + { + scope: "keyword.operator.prefixdecl.sparql", + settings: { + foreground: "#62036F", + }, + }, + { + scope: "variable.prefix.sparql", + settings: { + foreground: "#FF5600", + }, + }, + { + scope: "variable.reference.sparql", + settings: { + foreground: "#FF5600", + }, + }, + { + scope: "variable.other.sparql", + settings: { + foreground: "#219", + }, + }, + { + scope: "constant.other.iri.sparql", + settings: { + foreground: "#085", + }, + }, + { + scope: "constant.numeric", + settings: { + foreground: "#2aa198", + }, + }, + { + scope: "string", + settings: { + foreground: "#AA1011", + }, + }, + { + scope: "keyword.symbol", + settings: { + foreground: "#000000", + }, + }, + ], +}; + +// NOTE: alternative dark theme +// export const sparqlThemeDark = { +// name: "SPARQL Dark Theme", +// type: "dark", +// colors: { +// "editor.foreground": "#928364", +// "editor.background": "#282828", +// "editor.selectionBackground": "#44475a", +// "editor.lineHighlightBackground": "#32302f", +// "editorCursor.foreground": "#f8f8f0", +// "editorWhitespace.foreground": "#3B3A32", +// "editorIndentGuide.activeBackground": "#9D550FB0", +// "editor.selectionHighlightBorder": "#222218", +// }, +// // Used when the language server (qlue-ls) emits semantic tokens +// // colors mirror the TextMate scopes below so highlighting stays consistent +// semanticHighlighting: true, +// semanticTokenColors: { +// keyword: "#98971a", +// function: "#d65d0e", +// variable: "#ebdbb2", +// string: "#d79921", +// number: "#689d6a", +// comment: "#928374", +// operator: "#fe8019", +// namespace: "#cc241d", +// }, +// }; diff --git a/packages/sparql-editor-monaco/src/env.d.ts b/packages/sparql-editor-monaco/src/env.d.ts new file mode 100644 index 00000000..448c4c41 --- /dev/null +++ b/packages/sparql-editor-monaco/src/env.d.ts @@ -0,0 +1,21 @@ +/// + +declare module "*?worker" { + const worker: { + new (): Worker; + }; + export default worker; +} + +declare module "*?worker&url" { + const workerUrl: string; + export default workerUrl; +} + +// Internal monaco-vscode-api modules used to render the language server right-click submenu +// (MenuRegistry/MenuId/CommandsRegistry/ContextKeyExpr). Reachable at runtime via the package's +// `./vscode/*` export (aliased to concrete files in vite.config.ts), but that export exposes no +// `types` condition, so TS can't resolve their declarations. We import them as `any`. +declare module "@codingame/monaco-vscode-api/vscode/src/vs/platform/actions/common/actions"; +declare module "@codingame/monaco-vscode-api/vscode/src/vs/platform/commands/common/commands"; +declare module "@codingame/monaco-vscode-api/vscode/src/vs/platform/contextkey/common/contextkey"; diff --git a/packages/yasqe/src/imgs.ts b/packages/sparql-editor-monaco/src/imgs.ts similarity index 100% rename from packages/yasqe/src/imgs.ts rename to packages/sparql-editor-monaco/src/imgs.ts diff --git a/packages/sparql-editor-monaco/src/index.ts b/packages/sparql-editor-monaco/src/index.ts new file mode 100644 index 00000000..8c4b979d --- /dev/null +++ b/packages/sparql-editor-monaco/src/index.ts @@ -0,0 +1,1293 @@ +/** + * SparqlEditor · the standalone Monaco-based SPARQL query editor. + * @module SparqlEditor + */ +import { EventEmitter } from "events"; +import { Storage as YStorage } from "@rdfjs/sparql-utils"; +import * as queryString from "query-string"; +import { + drawSvgStringAsElement, + addClass, + removeClass, + getPrefixesFromQuery, + getQueryType, + getQueryMode, + // SPARQL request handling is shared across editors and lives in utils. + executeQuery, + getAjaxConfig, + getUrlArguments, + getAcceptHeader, + getAsCurlString, + createLspErrorNotification, +} from "@rdfjs/sparql-utils"; +import { merge } from "lodash-es"; +import type { + DeepPartial, + QueryType, + RequestConfig, + EditorAjaxConfig, + RequestArgs, + LspErrorNotification, +} from "@rdfjs/sparql-utils"; + +export type { QueryType, RequestConfig, PlainRequestConfig } from "@rdfjs/sparql-utils"; + +import * as imgs from "./imgs"; +import getDefaults from "./defaults"; +export { sparqlThemeDark, sparqlThemeLight } from "./editor/sparqlTheme"; +import { MonacoVscodeApiWrapper } from "monaco-languageclient/vscodeApiWrapper"; +import { LanguageClientWrapper } from "monaco-languageclient/lcwrapper"; +import "./style/yasqe.css"; +import "./style/buttons.css"; +import type { editor } from "monaco-editor"; +import { MonacoLanguageClient } from "monaco-languageclient"; +export type { SparqlThemeOverrides } from "./editor/editorConfig"; +export { qlueLs } from "@rdfjs/sparql-utils"; +import { openSettingsPanel, unflatten, defaultsFromSchema } from "@rdfjs/sparql-utils"; +import type { + LanguageServerDef as SharedLanguageServerDef, + LanguageServerSettingsSchema, + LspConnection, +} from "@rdfjs/sparql-utils"; +export type { LanguageServerSettingsSchema, SettingFieldSchema, LspConnection } from "@rdfjs/sparql-utils"; + +/** A language server made available to the Monaco-based SparqlEditor. The editor-agnostic descriptor with + * its `yasqe` hook argument bound to this editor's {@link SparqlEditor}. Defined once in + * `@rdfjs/sparql-utils` so the SAME object also works with `@rdfjs/sparql-editor-codemirror`. */ +export type LanguageServerDef = SharedLanguageServerDef; + +/** Adapt a Monaco `MonacoLanguageClient` to the editor-agnostic {@link LspConnection} handed to + * language server hooks. Cached per client so identity-based de-dup (e.g. qlue-ls's backend cache, + * keyed on the connection object) keeps working across repeated hook calls. */ +const lspConnections = new WeakMap(); +function toLspConnection(client: MonacoLanguageClient): LspConnection { + let conn = lspConnections.get(client); + if (!conn) { + conn = { + sendNotification: (method, params) => void client.sendNotification(method, params as any), + sendRequest: (method, params) => client.sendRequest(method, params as any) as Promise, + }; + lspConnections.set(client, conn); + } + return conn; +} + +export interface SparqlEditor { + on( + eventName: "query", + handler: (instance: SparqlEditor, req: Request, abortController?: AbortController) => void, + ): this; + off( + eventName: "query", + handler: (instance: SparqlEditor, req: Request, abortController?: AbortController) => void, + ): this; + on(eventName: "queryAbort", handler: (instance: SparqlEditor, req: Request) => void): this; + off(eventName: "queryAbort", handler: (instance: SparqlEditor, req: Request) => void): this; + on(eventName: "queryResponse", handler: (instance: SparqlEditor, response: any, duration: number) => void): this; + off(eventName: "queryResponse", handler: (instance: SparqlEditor, response: any, duration: number) => void): this; + on(eventName: "error", handler: (instance: SparqlEditor) => void): this; + off(eventName: "error", handler: (instance: SparqlEditor) => void): this; + on(eventName: "blur", handler: (instance: SparqlEditor) => void): this; + off(eventName: "blur", handler: (instance: SparqlEditor) => void): this; + on(eventName: "queryBefore", handler: (instance: SparqlEditor, config: EditorAjaxConfig) => void): this; + off(eventName: "queryBefore", handler: (instance: SparqlEditor, config: EditorAjaxConfig) => void): this; + on(eventName: "queryResults", handler: (instance: SparqlEditor, results: any, duration: number) => void): this; + off(eventName: "queryResults", handler: (instance: SparqlEditor, results: any, duration: number) => void): this; + on(eventName: "autocompletionShown", handler: (instance: SparqlEditor, widget: any) => void): this; + off(eventName: "autocompletionShown", handler: (instance: SparqlEditor, widget: any) => void): this; + on(eventName: "autocompletionClose", handler: (instance: SparqlEditor) => void): this; + off(eventName: "autocompletionClose", handler: (instance: SparqlEditor) => void): this; + on(eventName: "resize", handler: (instance: SparqlEditor, newSize: string) => void): this; + off(eventName: "resize", handler: (instance: SparqlEditor, newSize: string) => void): this; + on( + eventName: "languageServerChange", + handler: (instance: SparqlEditor, def: { label: string; description?: string }, index: number) => void, + ): this; + off( + eventName: "languageServerChange", + handler: (instance: SparqlEditor, def: { label: string; description?: string }, index: number) => void, + ): this; + on(eventName: string, handler: () => void): this; +} + +export class SparqlEditor extends EventEmitter { + private static storageNamespace = "triply"; + public rootEl: HTMLDivElement; + public storage: YStorage = new YStorage(SparqlEditor.storageNamespace); + public config: Config; + public persistentConfig?: PersistentConfig; + public queryValid = true; + public lastQueryDuration?: number; + public languageClientWrapper?: LanguageClientWrapper; + public vscodeApi?: MonacoVscodeApiWrapper; + public editor?: editor.IStandaloneCodeEditor; + /** Resolves once the Monaco editor has finished initializing (rejects if init fails). */ + public ready: Promise; + /** Index of the active language server in `config.languageServers`, or -1 when none is active. */ + public activeLanguageServerIndex = -1; + /** Disposables for the context-menu language server entries (re-created on every switch). */ + private lsMenuDisposables: { dispose(): void }[] = []; + /** Glyph-margin diagnostic icons (mirrors model markers into the left margin) + its marker listener. */ + private diagnosticGlyphs?: editor.IEditorDecorationsCollection; + private markerListener?: { dispose(): void }; + /** Serializes language server switches so concurrent calls (init + a restored preference) don't race. */ + private lsSwitchQueue: Promise = Promise.resolve(); + /** Index of the most recently requested language server. A queued activation whose index no longer + * matches this has been superseded (e.g. the constructor's default 0 followed by a restored + * preference); it bails before any worker/client setup so we never start a server just to dispose it. */ + private requestedLanguageServerIndex = -1; + /** Monaco's internal menu API, used to render the nested "Language servers" right-click submenu. + * `undefined` = not loaded yet, `null` = unavailable (then we fall back to flat context-menu actions). Loaded once, lazily. + */ + private lsMenuApi: { MenuRegistry: any; MenuId: any; CommandsRegistry: any; ContextKeyExpr: any } | null | undefined; + private lsMenuApiLoading = false; + private lsSubmenuId?: any; + /** Dispose handle for an open settings panel, so a second open (or a server switch) closes the first. */ + private lsSettingsPanelDispose?: () => void; + private static menuInstanceCounter = 0; + private readonly menuInstanceId = SparqlEditor.menuInstanceCounter++; + /** The `.sparql-editor_buttons` container; the share popup is appended to and positioned within it. */ + private buttonsEl?: HTMLDivElement; + + private req?: Request; + private abortController?: AbortController; + private queryStatus?: "valid" | "error"; + private queryBtn?: HTMLButtonElement; + private resizeWrapper?: HTMLDivElement; + /** Value requested via setValue() before the async editor finished initializing */ + private pendingValue?: string; + /** Last height requested via setSize() */ + private currentHeight?: string; + + /** + * Initializes the Monaco editor in the given element. + * @param el HTMLElement to initialize the editor in + * @param conf configuration for the editor + */ + public async initEditor(el: HTMLElement, conf: PartialConfig = {}) { + try { + const { startMonacoEditor } = await import("./editor/editorConfig"); + // Language servers are provided by the consumer (yasqe is LS-agnostic). The editor is built + // here without a server; the active language client is connected separately (see + // setLanguageServer) so the consumer can configure several and switch between them. With none + // configured the editor still works with Monarch syntax highlighting only. + const result = await startMonacoEditor( + el, + this.config.value, + this.config.theme, + this.config.editorOptions, + this.config.themes, + ); + this.editor = result.editorApp.getEditor(); + this.vscodeApi = result.apiWrapper; + + // Apply any value set via setValue() before the editor finished initializing + if (this.pendingValue !== undefined) { + this.editor?.setValue(this.pendingValue); + this.pendingValue = undefined; + } + + const monaco = await import("monaco-editor"); + // Run the query on Cmd/Ctrl+Enter + this.editor?.addAction({ + id: "sparql-editor-run-query", + label: "Run SPARQL Query", + keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter], + // Show it in the right-click context menu, at the top + contextMenuGroupId: "navigation", + contextMenuOrder: 0, + run: () => { + this.query().catch(() => {}); // catch to avoid unhandled rejection + }, + }); + + // Share the query URL on Cmd/Ctrl+S (also persists the query and prevents the browser's + // "save page" dialog). Shown in the right-click menu right under "Run SPARQL Query". + this.editor?.addAction({ + id: "sparql-editor-share-query", + label: "Share query URL", + keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS], + contextMenuGroupId: "navigation", + contextMenuOrder: 1, + run: () => { + this.saveQuery(); + this.openSharePopup(); + }, + }); + + // Register event listeners first, before setting up Monaco editor events + this.registerEventListeners(); + + // Listen for changes in the editor + this.editor?.getModel()?.onDidChangeContent(() => { + this.emit("change"); + this.emit("changes"); + }); + // Listen for cursor position changes + this.editor?.onDidChangeCursorPosition(() => { + this.emit("cursorActivity"); + }); + // Listen for blur events + this.editor?.onDidBlurEditorText(() => { + this.emit("blur"); + }); + + // Mirror LSP diagnostics into the left glyph margin (Monaco only shows squiggles by default) + this.setupDiagnosticGlyphs(monaco); + + // Do some post processing, init storage + this.drawButtons(); + + const storageId = this.getStorageId(); + if (storageId) { + const persConf = this.storage.get(storageId); + if (persConf && typeof persConf === "string") { + this.persistentConfig = { query: persConf, editorHeight: this.config.editorHeight }; + } else { + this.persistentConfig = persConf; + } + if (!this.persistentConfig) + this.persistentConfig = { query: this.getValue(), editorHeight: this.config.editorHeight }; + if (this.persistentConfig && this.persistentConfig.query) this.setValue(this.persistentConfig.query); + } + + if (this.config.consumeShareLink) { + this.config.consumeShareLink(this); + window.addEventListener("hashchange", this.handleHashChange); + } + // Add beforeunload event to save query when tab/window changes + window.addEventListener("beforeunload", this.handleBeforeUnload); + // Add visibility change event to save query when tab becomes hidden + document.addEventListener("visibilitychange", this.handleVisibilityChange); + + // Apply the editor height. A height requested before the editor was ready (e.g. a tab's + // persisted height set via setSize()) wins over the configured default, so reloads keep + // the user's resized height instead of snapping back to the default. + this.setSize(this.currentHeight ?? this.persistentConfig?.editorHeight ?? this.config.editorHeight); + if (this.config.resizeable) this.drawResizer(); + } catch (error) { + console.error("Failed to initialize Monaco editor:", error); + // Fallback to show error message in the element + el.innerHTML = `
+ Error initializing SPARQL editor: ${error instanceof Error ? error.message : String(error)} +
`; + throw error; + } + } + + public getValue(): string { + if (this.editor) return this.editor.getValue() || ""; + return this.pendingValue ?? this.config.value ?? ""; + } + + public setValue(newValue: string) { + if (this.editor) { + this.editor.setValue(newValue); + } else { + // Editor not ready yet, remember and apply once initEditor completes + this.pendingValue = newValue; + } + } + + /** Re-layout the Monaco editor (replaces CodeMirror's refresh). */ + public refresh() { + this.editor?.layout(); + } + + /** Focus the editor input. */ + public focus() { + this.editor?.focus(); + } + + /** + * Extract the PREFIX declarations from the current query as a `{ prefix: iri }` map. + * Used by SparqlResults to resolve prefixed names in results. + */ + public getPrefixesFromQuery(): { [prefix: string]: string } { + return getPrefixesFromQuery(this.getValue()); + } + + /** + * The active monaco-languageclient `LanguageClient`, or undefined if no language server is + * active. Use it to send server-specific requests/notifications (yasqe stays LS-agnostic). + */ + public getLanguageClient(): MonacoLanguageClient | undefined { + return this.languageClientWrapper?.getLanguageClient?.(); + } + + /** The configured language servers, as `{ label, description }` (the switcher-facing subset). */ + public getLanguageServers(): { label: string; description?: string }[] { + return (this.config.languageServers ?? []).map((s) => ({ label: s.label, description: s.description })); + } + + /** Index of the active language server in `config.languageServers`, or -1 when none is active. */ + public getActiveLanguageServer(): number { + return this.activeLanguageServerIndex; + } + + /** + * Notify the active language server that the endpoint changed, firing only its `onEndpointChange` + * (with the active `LanguageClient`). SparqlStudio calls this on endpoint changes; standalone consumers + * can call it themselves. No-op when no server is active or it defines no handler. + */ + public notifyEndpointChange(endpoint: string): void { + const def = this.config.languageServers?.[this.activeLanguageServerIndex]; + const client = this.getLanguageClient(); + if (def?.onEndpointChange && client && endpoint) def.onEndpointChange(toLspConnection(client), endpoint, this); + } + + /** + * Activate a language server by label or index. Disposes the current language client (its worker + * is terminated), resolves and connects the target server's worker, runs its `onReady`, refreshes + * the context-menu switcher and emits `languageServerChange`. The query/editor model is preserved. + * Switches are serialized so concurrent calls (e.g. init + a restored preference) run in order. + */ + public setLanguageServer(target: string | number): Promise { + const servers = this.config.languageServers ?? []; + const index = typeof target === "number" ? target : servers.findIndex((s) => s.label === target); + if (index < 0 || index >= servers.length) { + console.warn("Unknown language server:", target); + return Promise.resolve(); + } + this.requestedLanguageServerIndex = index; + // Swallow a prior switch's failure so it doesn't block this one (the chain is reused). + this.lsSwitchQueue = this.lsSwitchQueue.catch(() => {}).then(() => this.activateLanguageServer(index)); + return this.lsSwitchQueue; + } + + private async activateLanguageServer(index: number): Promise { + // Wait for the editor before touching language clients / context-menu actions. + await this.ready.catch(() => {}); + const servers = this.config.languageServers ?? []; + if (!servers.length) return; + if (index !== this.requestedLanguageServerIndex) return; + if (index === this.activeLanguageServerIndex && this.languageClientWrapper) return; + const def = servers[index]; + // A settings panel belongs to the outgoing server; close it before switching. + this.lsSettingsPanelDispose?.(); + this.lsSettingsPanelDispose = undefined; + // Tear down the current client (restartOptions.keepWorker is false, so its worker is terminated) + if (this.languageClientWrapper) { + try { + await this.languageClientWrapper.dispose(); + } catch (error) { + console.warn("Failed to dispose the previous language client:", error); + } + this.languageClientWrapper = undefined; + } + // Resolve the target server's worker (instance or factory) and connect a language client to it. + const worker = typeof def.worker === "function" ? await def.worker() : def.worker; + if (!worker) { + console.warn("Language server provided no worker:", def.label); + return; + } + this.setupLanguageServerErrorNotifications(worker); + const { connectLanguageClient } = await import("./editor/editorConfig"); + this.languageClientWrapper = await connectLanguageClient(worker); + this.activeLanguageServerIndex = index; + const client = this.getLanguageClient(); + if (client && def.onReady) def.onReady(toLspConnection(client), this); + if (client) this.applyPersistedLanguageServerSettings(def, client); + this.updateLanguageServerMenu(); + this.emit("languageServerChange", { label: def.label, description: def.description }, index); + } + + // /** + // * Force Monaco to discard the previous language server's semantic tokens and re-pull from the now + // * active client. Disposing a language client does not clear the tokens it already painted, so + // * after a switch the old server's colors linger (and a server without semantic tokens never + // * clears them). Bouncing the model language to `plaintext` and back resets the model's + // * tokenization, which re-opens the document on the new client and re-requests its tokens (or + // * leaves the Monarch fallback when the new server provides none). + // */ + // private async refreshSemanticTokens(): Promise { + // const model = this.editor?.getModel(); + // if (!model) return; + // const languageId = model.getLanguageId(); + // if (languageId === "plaintext") return; + // try { + // const monaco = await import("monaco-editor"); + // monaco.editor.setModelLanguage(model, "plaintext"); + // monaco.editor.setModelLanguage(model, languageId); + // } catch (error) { + // console.warn("Failed to refresh semantic tokens after language server switch:", error); + // } + // } + + /** + * Build the right-click "Language servers" switcher. Only shown when two or more servers are + * configured. Renders as a nested submenu (a single "Language servers" entry that expands to the + * right, with a native checkmark on the active server) when Monaco's internal menu API is + * reachable; otherwise falls back to a flat list of actions. + */ + private updateLanguageServerMenu() { + for (const d of this.lsMenuDisposables) { + try { + d.dispose(); + } catch { + // ignore + } + } + this.lsMenuDisposables = []; + const servers = this.config.languageServers ?? []; + if (!this.editor || servers.length < 2) return; + if (this.lsMenuApi === undefined) { + // Menu API not resolved yet: render the flat fallback now, then upgrade to the nested submenu + // once the (lazy, one-time) import resolves. Subsequent calls are synchronous. + this.buildFlatLanguageServerActions(servers); + if (!this.lsMenuApiLoading) { + this.lsMenuApiLoading = true; + void this.loadMenuApi().then((api) => { + this.lsMenuApi = api; + this.updateLanguageServerMenu(); + }); + } + return; + } + if (this.lsMenuApi) { + try { + this.buildLanguageServerSubmenu(this.lsMenuApi, servers); + return; + } catch (error) { + console.warn("Language-server submenu unavailable, using a flat menu:", error); + } + } + this.buildFlatLanguageServerActions(servers); + } + + /** Lazily import Monaco's internal menu API (shared singleton); null when it isn't reachable. */ + private async loadMenuApi(): Promise<{ + MenuRegistry: any; + MenuId: any; + CommandsRegistry: any; + ContextKeyExpr: any; + } | null> { + try { + const actions: any = await import("@codingame/monaco-vscode-api/vscode/src/vs/platform/actions/common/actions"); + const commands: any = + await import("@codingame/monaco-vscode-api/vscode/src/vs/platform/commands/common/commands"); + const contextkey: any = + await import("@codingame/monaco-vscode-api/vscode/src/vs/platform/contextkey/common/contextkey"); + if ( + actions?.MenuRegistry && + actions?.MenuId?.EditorContext && + commands?.CommandsRegistry && + contextkey?.ContextKeyExpr?.true + ) { + return { + MenuRegistry: actions.MenuRegistry, + MenuId: actions.MenuId, + CommandsRegistry: commands.CommandsRegistry, + ContextKeyExpr: contextkey.ContextKeyExpr, + }; + } + } catch { + // not reachable; caller falls back to flat actions + } + return null; + } + + /** Native nested submenu in right click menu to choose language server */ + private buildLanguageServerSubmenu( + api: { MenuRegistry: any; MenuId: any; CommandsRegistry: any; ContextKeyExpr: any }, + servers: LanguageServerDef[], + ) { + const { MenuRegistry, MenuId, CommandsRegistry, ContextKeyExpr } = api; + if (!this.lsSubmenuId) this.lsSubmenuId = new MenuId(`yasqeLanguageServers_${this.menuInstanceId}`); + const submenu = this.lsSubmenuId; + // Parent entry under the editor context menu; its title is the category label. + this.lsMenuDisposables.push( + MenuRegistry.appendMenuItem(MenuId.EditorContext, { + submenu, + title: "Language server", + group: "navigation", + order: 2, + }), + ); + servers.forEach((s, i) => { + const active = i === this.activeLanguageServerIndex; + const id = `yasqe.languageServer.${this.menuInstanceId}.${i}`; + this.lsMenuDisposables.push( + CommandsRegistry.registerCommand(id, () => { + this.setLanguageServer(i).catch(() => {}); + }), + ); + this.lsMenuDisposables.push( + MenuRegistry.appendMenuItem(submenu, { + command: { + id, + title: s.description ? `${s.label} · ${s.description}` : s.label, + // A constant-true condition makes the active server render with a native checkmark. + toggled: active ? ContextKeyExpr.true() : undefined, + }, + group: "navigation", + order: i, + }), + ); + }); + // "Configure ..." only when the active server exposes a settings schema. + const activeServer = servers[this.activeLanguageServerIndex]; + if (activeServer?.configSchema && activeServer.configCallback) { + const configId = `yasqe.languageServer.${this.menuInstanceId}.configure`; + this.lsMenuDisposables.push(CommandsRegistry.registerCommand(configId, () => this.openLanguageServerSettings())); + this.lsMenuDisposables.push( + MenuRegistry.appendMenuItem(submenu, { + command: { id: configId, title: `Configure ${activeServer.label}…` }, + group: "zz_configure", + order: 0, + }), + ); + } + } + + /** Fallback flat list of editor actions (active marked with "· "), when the submenu API is absent. */ + private buildFlatLanguageServerActions(servers: LanguageServerDef[]) { + servers.forEach((s, i) => { + const active = i === this.activeLanguageServerIndex; + const label = `${active ? "✓ " : ""}${s.label}${s.description ? " · " + s.description : ""}`; + const action = this.editor?.addAction({ + id: `sparql-editor-language-server-${i}`, + label, + contextMenuGroupId: "navigation", + contextMenuOrder: 2 + i, + run: () => { + this.setLanguageServer(i).catch(() => {}); + }, + }); + if (action) this.lsMenuDisposables.push(action); + }); + const activeServer = servers[this.activeLanguageServerIndex]; + if (activeServer?.configSchema && activeServer.configCallback) { + const action = this.editor?.addAction({ + id: `sparql-editor-language-server-configure`, + label: `Configure ${activeServer.label}…`, + contextMenuGroupId: "navigation", + contextMenuOrder: 2 + servers.length, + run: () => this.openLanguageServerSettings(), + }); + if (action) this.lsMenuDisposables.push(action); + } + } + + /** + * Open the schema-driven settings panel for the active language server. No-op when no server is + * active or it exposes no `configSchema`/`configCallback`. On Apply, the collected values are + * de-flattened (dotted keys become nested objects) and handed to the server's `configCallback`. + */ + public openLanguageServerSettings(): void { + this.lsSettingsPanelDispose?.(); + this.lsSettingsPanelDispose = undefined; + const index = this.activeLanguageServerIndex; + const def = this.config.languageServers?.[index]; + const client = this.getLanguageClient(); + if (!def?.configSchema || !def.configCallback || !client) return; + const schema = def.configSchema as LanguageServerSettingsSchema; + const current = this.getLanguageServerSettings(def.label) ?? defaultsFromSchema(schema); + this.lsSettingsPanelDispose = openSettingsPanel({ + root: this.rootEl, + schema, + serverLabel: def.label, + current, + onApply: (values) => { + this.setLanguageServerSettings(def.label, values); + def.configCallback!(toLspConnection(client), unflatten(values)); + }, + }); + } + + /** + * Persisted settings panel values for a language server (by label), or undefined if none stored. + * A consumer-supplied store (`config.getLanguageServerSettings`, used by SparqlStudio) takes precedence + * over yasqe's own persistentConfig (used in standalone mode). + */ + private getLanguageServerSettings(label: string): Record | undefined { + return this.config.getLanguageServerSettings?.(label) ?? this.persistentConfig?.languageServerSettings?.[label]; + } + + /** + * Store the settings panel values for a language server (by label). Persists to yasqe's own local + * storage when enabled (standalone), and emits `languageServerSettingsChange` so a consumer (e.g. + * SparqlStudio) can own persistence, mirroring the `languageServerChange` bridge. + */ + private setLanguageServerSettings(label: string, values: Record): void { + if (this.persistentConfig) { + (this.persistentConfig.languageServerSettings ??= {})[label] = values; + this.saveQuery(); + } + this.emit("languageServerSettingsChange", label, values); + } + + /** Re-apply any persisted settings to a freshly connected client, so they survive reloads/switches. */ + private applyPersistedLanguageServerSettings(def: LanguageServerDef, client: MonacoLanguageClient): void { + if (!def.configCallback) return; + const stored = this.getLanguageServerSettings(def.label); + if (stored && Object.keys(stored).length) def.configCallback(toLspConnection(client), unflatten(stored)); + } + + /** + * Switch the theme of the Monaco editor + * @param theme - The theme to switch to ('light' or 'dark') + */ + public async setTheme(theme: "light" | "dark"): Promise { + document.documentElement.dataset.theme = theme; + // Classic mode: switch theme via the standalone Monaco API (themes registered in editorConfig.ts) + try { + const { SPARQL_THEME_DARK, SPARQL_THEME_LIGHT } = await import("./editor/editorConfig"); + const monaco = await import("monaco-editor"); + monaco.editor.setTheme(theme === "dark" ? SPARQL_THEME_DARK : SPARQL_THEME_LIGHT); + } catch (error) { + console.error("Failed to switch theme:", error); + } + } + + public getWrapperElement(): HTMLDivElement { + return this.rootEl; + } + + constructor(parent: HTMLElement, conf: PartialConfig = {}) { + super(); + if (!parent) throw new Error("No parent passed as argument. Dont know where to draw YASQE"); + this.rootEl = document.createElement("div"); + this.rootEl.className = "sparql-editor"; + parent.appendChild(this.rootEl); + + // `languageServers` carry Worker instances / factory + callback functions that lodash.merge + // would deep-clone (mangling their prototypes / identity). Assign them by reference instead. + const rawConf = conf as any; + const languageServers = rawConf.languageServers; + const mergeableConf = { ...rawConf }; + delete mergeableConf.languageServers; + this.config = merge({}, SparqlEditor.defaults, mergeableConf); + if (languageServers) this.config.languageServers = languageServers as LanguageServerDef[]; + + // Initialize the editor and then setup everything else. Exposed as `ready` so consumers can + // await initialization; swallow here to avoid an unhandled rejection when they don't. + this.ready = this.initEditor(this.rootEl); + this.ready.catch(() => {}); + + // Activate the first configured language server. Queued now (the activation itself waits for the + // editor to be ready) so a later restored-preference switch is guaranteed to run after this one. + if (this.config.languageServers?.length) void this.setLanguageServer(0); + } + + private handleBeforeUnload = () => { + this.saveQuery(); + }; + + private handleVisibilityChange = () => { + if (document.hidden) this.saveQuery(); + }; + + private handleHashChange = () => { + this.config.consumeShareLink?.(this); + }; + private handleChange() { + this.updateQueryButton(); + this.saveQuery(); // Save query on every change + } + private handleBlur() { + this.saveQuery(); + } + private handleChanges() { + // e.g. handle blur + this.updateQueryButton(); + this.saveQuery(); + } + private handleCursorActivity() { + // this.autocomplete(true); + } + private handleQuery(_yasqe: SparqlEditor, req: Request, abortController?: AbortController) { + this.req = req; + this.abortController = abortController; + this.updateQueryButton(); + } + private handleQueryResponse(_yasqe: SparqlEditor, _response: any, duration: number) { + this.lastQueryDuration = duration; + this.req = undefined; + this.updateQueryButton(); + } + private handleQueryAbort(_yasqe: SparqlEditor, _req: Request) { + this.req = undefined; + this.updateQueryButton(); + } + + private registerEventListeners() { + /** + * Register listeners + */ + this.on("change", this.handleChange); + this.on("blur", this.handleBlur); + this.on("changes", this.handleChanges); + this.on("cursorActivity", this.handleCursorActivity); + + this.on("query", this.handleQuery); + this.on("queryResponse", this.handleQueryResponse); + this.on("queryAbort", this.handleQueryAbort); + } + + private unregisterEventListeners() { + this.off("change" as any, this.handleChange); + this.off("blur", this.handleBlur); + this.off("changes" as any, this.handleChanges); + this.off("cursorActivity" as any, this.handleCursorActivity); + + this.off("query", this.handleQuery); + this.off("queryResponse", this.handleQueryResponse); + this.off("queryAbort", this.handleQueryAbort); + } + /** + * Emit an event, always passing this SparqlEditor instance as the first argument to listeners + * (matches the documented `on(event, (instance, ...data) => ...)` API). So callers emit only the + * payload, e.g. `this.emit("queryResponse", response, duration)`. + */ + public emit(event: string | symbol, ...data: any[]): boolean { + return super.emit(event, this, ...data); + } + + public getStorageId(getter?: Config["persistenceId"]): string | undefined { + const persistenceId = getter || this.config.persistenceId; + if (!persistenceId) return undefined; + if (typeof persistenceId === "string") return persistenceId; + return persistenceId(this); + } + /** + * Open the "share query" popup (link input + Shorten/cURL buttons). Triggered from the right-click + * menu / Cmd+Ctrl+S, since the Monaco editor has no share button. No-op without `createShareableLink`. + */ + public openSharePopup() { + const buttons = this.buttonsEl; + if (!this.config.createShareableLink || !buttons) return; + // Toggle: a second invocation closes an open popup. + const existing = buttons.querySelector(".sparql-editor_sharePopup"); + if (existing) { + existing.remove(); + return; + } + let popup: HTMLDivElement | undefined = document.createElement("div"); + popup.className = "sparql-editor_sharePopup"; + buttons.appendChild(popup); + document.body.addEventListener( + "click", + (event) => { + if (popup && event.target !== popup && !popup.contains(event.target)) { + popup.remove(); + popup = undefined; + } + }, + true, + ); + const input = document.createElement("input"); + input.type = "text"; + input.value = this.config.createShareableLink(this); + input.onfocus = function () { + input.select(); + }; + // Work around Chrome's little problem + input.onmouseup = function () { + return false; + }; + + const inputWrapper = document.createElement("div"); + inputWrapper.className = "inputWrapper"; + inputWrapper.appendChild(input); + popup.appendChild(inputWrapper); + + // We need to track which buttons are drawn here since the two implementations don't play nice together + const popupInputButtons: HTMLButtonElement[] = []; + const createShortLink = this.config.createShortLink; + if (createShortLink) { + popup.className += " enableShort"; + const shortBtn = document.createElement("button"); + popupInputButtons.push(shortBtn); + shortBtn.innerHTML = "Shorten"; + shortBtn.className = "sparql-editor_btn sparql-editor_btn-sm shorten"; + popup.appendChild(shortBtn); + shortBtn.onclick = () => { + popupInputButtons.forEach((button) => (button.disabled = true)); + createShortLink(this, input.value).then( + (value) => { + input.value = value; + input.focus(); + }, + (err) => { + const errSpan = document.createElement("span"); + errSpan.className = "shortlinkErr"; + let textContent = "An error has occurred"; + if (typeof err === "string" && err.length !== 0) { + textContent = err; + } else if (err.message && err.message.length !== 0) { + textContent = err.message; + } + errSpan.textContent = textContent; + input.replaceWith(errSpan); + }, + ); + }; + } + + const curlBtn = document.createElement("button"); + popupInputButtons.push(curlBtn); + curlBtn.innerText = "cURL"; + curlBtn.className = "sparql-editor_btn sparql-editor_btn-sm curl"; + popup.appendChild(curlBtn); + curlBtn.onclick = () => { + popupInputButtons.forEach((button) => (button.disabled = true)); + input.value = this.getAsCurlString(); + input.focus(); + popup?.appendChild(curlBtn); + }; + + // Position below the buttons row, right-aligned to it (anchor on the query button when present). + const anchor: HTMLElement = this.queryBtn ?? buttons; + popup.style.top = anchor.offsetTop + anchor.offsetHeight + "px"; + popup.style.left = anchor.offsetLeft + anchor.clientWidth - popup.clientWidth + "px"; + input.focus(); + } + + private drawButtons() { + const buttons = document.createElement("div"); + buttons.className = "sparql-editor_buttons"; + this.buttonsEl = buttons; + this.getWrapperElement().appendChild(buttons); + + if (this.config.pluginButtons) { + const pluginButtons = this.config.pluginButtons(); + if (!pluginButtons) return; + if (Array.isArray(pluginButtons)) { + for (const button of pluginButtons) { + buttons.append(button); + } + } else { + buttons.appendChild(pluginButtons); + } + } + + /** + * Draw query btn + */ + if (this.config.showQueryButton) { + this.queryBtn = document.createElement("button"); + addClass(this.queryBtn, "sparql-editor_queryButton"); + + /** + * Add busy/valid/error btns + */ + const queryEl = drawSvgStringAsElement(imgs.query); + addClass(queryEl, "queryIcon"); + this.queryBtn.appendChild(queryEl); + + const warningIcon = drawSvgStringAsElement(imgs.warning); + addClass(warningIcon, "warningIcon"); + this.queryBtn.appendChild(warningIcon); + + this.queryBtn.onclick = () => { + if (this.config.queryingDisabled) return; // Don't do anything + if (this.req) { + this.abortQuery(); + } else { + this.query().catch(() => {}); //catch this to avoid unhandled rejection + } + }; + this.queryBtn.title = "Run query"; + this.queryBtn.setAttribute("aria-label", "Run query"); + + buttons.appendChild(this.queryBtn); + this.updateQueryButton(); + } + } + private drawResizer() { + if (this.resizeWrapper) return; + this.resizeWrapper = document.createElement("div"); + addClass(this.resizeWrapper, "resizeWrapper"); + const chip = document.createElement("div"); + addClass(chip, "resizeChip"); + this.resizeWrapper.appendChild(chip); + this.resizeWrapper.addEventListener("mousedown", this.initDrag.bind(this), false); + this.resizeWrapper.addEventListener("dblclick", this.expandEditor.bind(this)); + this.rootEl.appendChild(this.resizeWrapper); + } + private boundDoDrag = (event: MouseEvent) => this.doDrag(event); + private boundStopDrag = () => this.stopDrag(); + private initDrag(event: MouseEvent) { + event.preventDefault(); + document.documentElement.addEventListener("mousemove", this.boundDoDrag, false); + document.documentElement.addEventListener("mouseup", this.boundStopDrag, false); + } + private calculateDragOffset(event: MouseEvent, rootEl: HTMLElement) { + const rect = rootEl.getBoundingClientRect(); + return event.clientY - rect.top; + } + private doDrag(event: MouseEvent) { + event.preventDefault(); + const newHeight = this.calculateDragOffset(event, this.rootEl); + const minHeight = 100; // Minimum height in pixels + const maxHeight = window.innerHeight - 100; // Maximum height + const constrainedHeight = Math.max(minHeight, Math.min(maxHeight, newHeight)); + this.getWrapperElement().style.height = constrainedHeight + "px"; + // Resize the Monaco editor to fit the new container size + if (this.editor) { + this.editor.layout(); + } + } + private stopDrag() { + document.documentElement.removeEventListener("mousemove", this.boundDoDrag, false); + document.documentElement.removeEventListener("mouseup", this.boundStopDrag, false); + this.emit("resize", this.getWrapperElement().style.height); + if (this.getStorageId() && this.persistentConfig) { + // If there is no storage id there is no persistency wanted + this.persistentConfig.editorHeight = this.getWrapperElement().style.height; + this.saveQuery(); + } + // Refresh the editor to make sure the 'hidden' lines are rendered + if (this.editor) { + this.editor.layout(); + } + } + + private updateQueryButton(status?: "valid" | "error") { + if (!this.queryBtn) return; + + /** + * Set query status (valid vs invalid) + */ + if (this.config.queryingDisabled) { + addClass(this.queryBtn, "query_disabled"); + this.queryBtn.title = this.config.queryingDisabled; + } else { + removeClass(this.queryBtn, "query_disabled"); + this.queryBtn.title = "Run query"; + this.queryBtn.setAttribute("aria-label", "Run query"); + } + if (!status) { + status = this.queryValid ? "valid" : "error"; + } + if (status != this.queryStatus) { + //reset query status classnames + removeClass(this.queryBtn, "query_" + this.queryStatus); + addClass(this.queryBtn, "query_" + status); + this.queryStatus = status; + } + + /** + * Set/remove spinner if needed + */ + if (this.req && this.queryBtn.className.indexOf("busy") < 0) { + this.queryBtn.className = this.queryBtn.className += " busy"; + } + if (!this.req && this.queryBtn.className.indexOf("busy") >= 0) { + this.queryBtn.className = this.queryBtn.className.replace("busy", ""); + } + } + public handleLocalStorageQuotaFull(_e: any) { + console.warn("Localstorage quota exceeded. Clearing all queries"); + SparqlEditor.clearStorage(); + } + + public saveQuery() { + const storageId = this.getStorageId(); + if (!storageId || !this.persistentConfig) return; + this.persistentConfig.query = this.getValue(); + this.storage.set(storageId, this.persistentConfig, this.config.persistencyExpire, this.handleLocalStorageQuotaFull); + } + + /** + * Detect the SPARQL query form by scanning the query text. Comments and the PREFIX/BASE prologue + * are skipped so the first real keyword (SELECT, CONSTRUCT, INSERT, ...) is what's matched. + * Defaults to "SELECT" when nothing matches (e.g. an empty or still-typed query). + */ + public getQueryType(): QueryType { + // Defaults to "SELECT" when nothing matches (e.g. an empty or still-typed query). + return getQueryType(this.getValue()) ?? "SELECT"; + } + public getQueryMode(): "update" | "query" { + return getQueryMode(this.getQueryType()); + } + + /** + * Notification management + */ + private notificationEls: { [key: string]: HTMLDivElement } = {}; + private lsErrorNotification?: LspErrorNotification; + + /** + * Surface language server errors in the shared bottom-right notification (see + * `createLspErrorNotification` in `@rdfjs/sparql-utils`). SparqlEditor is language server agnostic, so + * this only understands generic JSON-RPC: any server->client message carrying an `error` (i.e. a + * JSON-RPC error response) is shown. Transient errors (request cancelled / content modified) are + * ignored. The qlue-ls helpers send no `window/showMessage`, so this is the only channel through + * which its errors (e.g. "No Backend defined") reach the user. + */ + private setupLanguageServerErrorNotifications(worker: Worker) { + // Expected-during-typing codes (qlue-ls uses string codes; standard LSP uses these numbers). + const ignoredCodes = new Set([-32800, -32801, "RequestCancelled", "ContentModified"]); + worker.addEventListener("message", (event: MessageEvent) => { + let data: any = event.data; + if (typeof data === "string") { + try { + data = JSON.parse(data); + } catch { + return; + } + } + const error = data?.error; + const code = error?.code; + const hasCode = typeof code === "number" || (typeof code === "string" && code.length > 0); + if (!error || !hasCode || typeof error.message !== "string" || ignoredCodes.has(code)) return; + // qlue-ls puts the detail in `message` (often with a quoted blob) but it may also arrive in `data` + let message: string = error.message; + if (typeof error.data === "string" && error.data && !message.includes(error.data)) { + message += "\n" + error.data; + } + if (!this.lsErrorNotification) this.lsErrorNotification = createLspErrorNotification(this.rootEl); + this.lsErrorNotification.show(message); + }); + } + + /** + * Shows notification + * @param key reference to the notification + * @param message the message to display + */ + public showNotification(key: string, message: string) { + if (!this.notificationEls[key]) { + // We create one wrapper for each notification, since there is no interactivity with the container (yet) we don't need to keep a reference + const notificationContainer = document.createElement("div"); + addClass(notificationContainer, "notificationContainer"); + this.getWrapperElement().appendChild(notificationContainer); + + // Create the actual notification element + this.notificationEls[key] = document.createElement("div"); + addClass(this.notificationEls[key], "notification", "notif_" + key); + notificationContainer.appendChild(this.notificationEls[key]); + } + // Hide others + for (const notificationId in this.notificationEls) { + if (notificationId !== key) this.hideNotification(notificationId); + } + const el = this.notificationEls[key]; + addClass(el, "active"); + el.innerText = message; + } + /** + * Hides notification + * @param key the identifier of the notification to hide + */ + public hideNotification(key: string) { + if (this.notificationEls[key]) { + removeClass(this.notificationEls[key], "active"); + } + } + + /** + * Querying + */ + public query(config?: EditorAjaxConfig) { + if (this.config.queryingDisabled) return Promise.reject("Querying is disabled."); + // Abort previous request + this.abortQuery(); + return executeQuery(this, config); + } + + public getUrlParams() { + //first try hash + let urlParams: queryString.ParsedQuery = {}; + if (window.location.hash.length > 1) { + //firefox does some decoding if we're using window.location.hash (e.g. the + sign in contentType settings) + //Don't want this. So simply get the hash string ourselves + urlParams = queryString.parse(location.hash); + } + if ((!urlParams || !("query" in urlParams)) && window.location.search.length > 1) { + //ok, then just try regular url params + urlParams = queryString.parse(window.location.search); + } + return urlParams; + } + + public configToQueryParams(): queryString.ParsedQuery { + //extend existing link, so first fetch current arguments + let urlParams: queryString.ParsedQuery = {}; + if (window.location.hash.length > 1) urlParams = queryString.parse(window.location.hash); + urlParams["query"] = this.getValue(); + return urlParams; + } + + public queryParamsToConfig(params: queryString.ParsedQuery) { + if (params && params.query && typeof params.query === "string") { + this.setValue(params.query); + } + } + + public getAsCurlString(config?: EditorAjaxConfig): string { + return getAsCurlString(this, config); + } + + /** Build the SPARQL request arguments for the current query against the given request config. */ + public getUrlArguments(requestConfig: EditorAjaxConfig): RequestArgs { + return getUrlArguments(this, requestConfig as any); + } + + public abortQuery() { + if (this.req) { + if (this.abortController) { + this.abortController.abort(); + } + this.emit("queryAbort", this.req); + } + } + + public expandEditor() { + this.setSize("60vh", "100%"); + } + + public setSize(height?: string, width?: string) { + if (height) { + this.currentHeight = height; + this.getWrapperElement().style.height = height; + } + if (width) this.getWrapperElement().style.width = width; + // Resize the Monaco editor to fit the new container size + if (this.editor) this.editor.layout(); + } + + /** + * Mirror the model's LSP diagnostics into the left glyph margin as severity icons. Monaco renders + * markers only as inline squiggles (the overview ruler is disabled here), so there is no gutter + * cue by default. Keeps one icon per line, using the most severe diagnostic on that line and + * collecting every message on it as the hover. + */ + private setupDiagnosticGlyphs(monaco: typeof import("monaco-editor")) { + const ed = this.editor; + const model = ed?.getModel(); + if (!ed || !model) return; + this.diagnosticGlyphs = ed.createDecorationsCollection(); + const severityClass: Record = { + [monaco.MarkerSeverity.Error]: "sparql-editor-glyph-error", + [monaco.MarkerSeverity.Warning]: "sparql-editor-glyph-warning", + [monaco.MarkerSeverity.Info]: "sparql-editor-glyph-info", + [monaco.MarkerSeverity.Hint]: "sparql-editor-glyph-info", + }; + const refresh = () => { + const byLine = new Map(); + for (const m of monaco.editor.getModelMarkers({ resource: model.uri })) { + const entry = byLine.get(m.startLineNumber); + if (!entry) byLine.set(m.startLineNumber, { severity: m.severity, messages: [m.message] }); + else { + entry.messages.push(m.message); + if (m.severity > entry.severity) entry.severity = m.severity; + } + } + const decorations: editor.IModelDeltaDecoration[] = []; + for (const [line, { severity, messages }] of byLine) { + decorations.push({ + range: new monaco.Range(line, 1, line, 1), + options: { + glyphMarginClassName: severityClass[severity] ?? "sparql-editor-glyph-info", + glyphMarginHoverMessage: messages.map((value) => ({ value })), + stickiness: monaco.editor.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + }, + }); + } + this.diagnosticGlyphs?.set(decorations); + }; + refresh(); + // onDidChangeMarkers fires with the affected resource URIs; refresh when ours is among them. + this.markerListener = monaco.editor.onDidChangeMarkers((uris) => { + if (uris.some((u) => u.toString() === model.uri.toString())) refresh(); + }); + } + + public destroy() { + // Abort running query + this.markerListener?.dispose(); + this.diagnosticGlyphs?.clear(); + this.abortQuery(); + this.unregisterEventListeners(); + this.resizeWrapper?.removeEventListener("mousedown", this.initDrag.bind(this), false); + this.resizeWrapper?.removeEventListener("dblclick", this.expandEditor.bind(this)); + // Clean up any remaining drag listeners + document.documentElement.removeEventListener("mousemove", this.doDrag.bind(this), false); + document.documentElement.removeEventListener("mouseup", this.stopDrag.bind(this), false); + window.removeEventListener("hashchange", this.handleHashChange); + window.removeEventListener("beforeunload", this.handleBeforeUnload); + document.removeEventListener("visibilitychange", this.handleVisibilityChange); + this.rootEl.remove(); + } + + /** + * Statics + */ + static Sparql = { executeQuery, getAjaxConfig, getUrlArguments, getAcceptHeader, getAsCurlString }; + static clearStorage() { + const storage = new YStorage(SparqlEditor.storageNamespace); + storage.removeNamespace(); + } + static defaults = getDefaults(); +} + +export type PartialConfig = DeepPartial; +export interface Config { + /** Initial query value. */ + value: string; + /** + * Show a button with which users can create a link to this query. Set this value to null to disable this functionality. + * By default, this feature is enabled, and the only the query value is appended to the link. + * ps. This function should return an object which is parseable by jQuery.param (http://api.jquery.com/jQuery.param/) + */ + createShareableLink: (yasqe: SparqlEditor) => string; + createShortLink: ((yasqe: SparqlEditor, longLink: string) => Promise) | undefined; + consumeShareLink: ((yasqe: SparqlEditor) => void) | undefined | null; + /** + * Change persistency settings for the YASQE query value. Setting the values + * to null, will disable persistancy: nothing is stored between browser + * sessions Setting the values to a string (or a function which returns a + * string), will store the query in localstorage using the specified string. + * By default, the ID is dynamically generated using the closest dom ID, to avoid collissions when using multiple YASQE items on one + * page + */ + persistenceId: ((yasqe: SparqlEditor) => string) | string | undefined | null; + persistencyExpire: number; //seconds + showQueryButton: boolean; + requestConfig: RequestConfig | ((yasqe: SparqlEditor) => RequestConfig); + pluginButtons: (() => HTMLElement[] | HTMLElement) | undefined; + resizeable: boolean; + editorHeight: string; + queryingDisabled: string | undefined; // The string will be the message displayed when hovered + theme: "light" | "dark"; + /** + * Custom Monaco editor options (IStandaloneEditorConstructionOptions), deep-merged over yasqe defaults. + * Use this to fully configure the editor, e.g. `{ lineNumbers: "off", wordWrap: "on", + * fontSize: 16, minimap: { enabled: true } }`. + */ + editorOptions: Record; + /** + * Custom SPARQL theme overrides, deep-merged over the built-in light/dark themes. Use this to + * tweak editor colors, e.g. `{ dark: { colors: { "editor.background": "#000" } }, + * light: { semanticTokenColors: { keyword: "#005" } } }`. + */ + themes: { light?: Record; dark?: Record }; + /** + * The language servers the consumer makes available (yasqe is language server agnostic). The + * first is activated on load; when two or more are configured a switcher appears in the editor's + * right-click context menu. Servers are started lazily (the worker is resolved only when a server + * is first activated). When empty, the editor runs with Monarch syntax highlighting only. + */ + languageServers: LanguageServerDef[]; + /** + * Optional consumer-owned store for language server settings panel values, keyed by server label. + * When provided (e.g. by SparqlStudio, which persists them globally per server), it is the source of + * truth for pre-filling the settings panel and re-applying settings when a server (re)starts. + * Pairs with the `languageServerSettingsChange` event emitted when the user applies settings. When + * omitted, yasqe falls back to its own local-storage persistence. + */ + getLanguageServerSettings?: (label: string) => Record | undefined; +} + +export interface PersistentConfig { + query: string; + editorHeight: string; + /** Last-applied settings panel values per language server label (flat dotted keys), so they + * survive reloads and are re-applied to the server when it restarts. */ + languageServerSettings?: { [label: string]: Record }; +} + +export default SparqlEditor; diff --git a/packages/yasqe/src/scss/buttons.scss b/packages/sparql-editor-monaco/src/style/buttons.css similarity index 65% rename from packages/yasqe/src/scss/buttons.scss rename to packages/sparql-editor-monaco/src/style/buttons.css index 8e0cf484..928ee98a 100644 --- a/packages/yasqe/src/scss/buttons.scss +++ b/packages/sparql-editor-monaco/src/style/buttons.css @@ -1,12 +1,27 @@ -.yasqe { - $queryButtonWidth: 40px; - $queryButtonHeight: 40px; +:root { + --queryButtonWidth: 40px; + --queryButtonHeight: 40px; +} - .yasqe_btn { - color: #333; +/* Keyframes must live at the top level (nesting @keyframes inside a rule is invalid CSS). */ +@keyframes dash { + to { + stroke-dashoffset: 200; + } +} + +@keyframes rotate { + 100% { + transform: rotate(360deg); + } +} + +.sparql-editor { + .sparql-editor_btn { + color: var(--sparql-editor-btn-text); border: 1px solid transparent; - background-color: #fff; - border-color: #ccc; + background-color: var(--sparql-editor-btn-bg); + border-color: var(--sparql-editor-btn-border); border-width: 1px; display: inline-block; text-align: center; @@ -33,26 +48,26 @@ &:hover { outline: 0; - background-color: #ebebeb; - border-color: #adadad; + background-color: var(--sparql-editor-btn-hover-bg); + border-color: var(--sparql-editor-btn-hover-border); } &:focus, &.selected { - color: #fff; + color: var(--sparql-editor-accent-text); outline: 0; - background-color: #337ab7; - border-color: #337ab7; + background-color: var(--sparql-editor-accent); + border-color: var(--sparql-editor-accent); } &.btn_icon:focus { - color: #333; + color: var(--sparql-editor-btn-text); border: 1px solid transparent; - background-color: #fff; - border-color: #ccc; + background-color: var(--sparql-editor-btn-bg); + border-color: var(--sparql-editor-btn-border); } - &.yasqe_btn-sm { + &.sparql-editor_btn-sm { padding: 1px 5px; font-size: 12px; line-height: 1.5; @@ -60,18 +75,18 @@ } } - .yasqe_buttons { + .sparql-editor_buttons { position: absolute; top: 10px; right: 20px; svg { - fill: #505050; + fill: var(--sparql-editor-icon); } z-index: 5; - .yasqe_share { + .sparql-editor_share { cursor: pointer; margin-top: 3px; display: inline-block; @@ -87,12 +102,12 @@ vertical-align: top; margin-left: 5px; } - .yasqe_sharePopup { + .sparql-editor_sharePopup { position: absolute; padding: 4px; margin-left: 0px; - background-color: #fff; - border: 1px solid #e3e3e3; + background-color: var(--sparql-editor-popup-bg); + border: 1px solid var(--sparql-editor-popup-border); border-radius: 2px; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); width: 600px; @@ -130,21 +145,21 @@ width: 100%; } } - .yasqe_queryButton { + .sparql-editor_queryButton { display: inline-block; position: relative; border: none; background: none; padding: 0; cursor: pointer; - width: $queryButtonWidth; - height: $queryButtonHeight; + width: var(--queryButtonWidth); + height: var(--queryButtonHeight); .queryIcon { display: block; svg { - width: $queryButtonWidth; - height: $queryButtonHeight; + width: var(--queryButtonWidth); + height: var(--queryButtonHeight); } } .svgImg { @@ -164,18 +179,6 @@ } } - @keyframes dash { - to { - stroke-dashoffset: 200; - } - } - - @keyframes rotate { - 100% { - transform: rotate(360deg); - } - } - .warningIcon { display: none; } @@ -211,5 +214,15 @@ } } } + + /* Subtle feedback on the icon buttons (execute, share): dim on hover */ + .sparql-editor_share, + .sparql-editor_queryButton { + transition: filter 0.15s ease; + } + .sparql-editor_share:hover, + .sparql-editor_queryButton:not(.query_disabled):hover { + filter: brightness(0.8); + } } } diff --git a/packages/sparql-editor-monaco/src/style/yasqe.css b/packages/sparql-editor-monaco/src/style/yasqe.css new file mode 100644 index 00000000..d1897ed2 --- /dev/null +++ b/packages/sparql-editor-monaco/src/style/yasqe.css @@ -0,0 +1,181 @@ +/* CSS Custom Properties for sparql-editor theming (light defaults) */ +:root { + --sparql-editor-text: #000000; + --sparql-editor-border: #d1d1d1; + --sparql-editor-notification-bg: #eeeeee; + --sparql-editor-notification-text: #999999; + --sparql-editor-tooltip-bg: rgba(0, 0, 0, 0.8); + --sparql-editor-tooltip-text: #ffffff; + --sparql-editor-error: #ff0000; + --sparql-editor-btn-bg: #ffffff; + --sparql-editor-btn-text: #333333; + --sparql-editor-btn-border: #cccccc; + --sparql-editor-btn-hover-bg: #ebebeb; + --sparql-editor-btn-hover-border: #adadad; + --sparql-editor-accent: #337ab7; + --sparql-editor-accent-text: #ffffff; + --sparql-editor-popup-bg: #ffffff; + --sparql-editor-popup-border: #e3e3e3; + --sparql-editor-icon: #505050; +} + +/* Dark values, shared by the explicit toggle and the OS preference below */ +html[data-theme="dark"] { + --sparql-editor-text: #d4d4d4; + --sparql-editor-border: #3e3e3e; + --sparql-editor-notification-bg: #2d2d30; + --sparql-editor-notification-text: #cccccc; + --sparql-editor-tooltip-bg: rgba(255, 255, 255, 0.1); + --sparql-editor-tooltip-text: #ffffff; + --sparql-editor-error: #ff6b6b; + --sparql-editor-btn-bg: #2d2d30; + --sparql-editor-btn-text: #d4d4d4; + --sparql-editor-btn-border: #3e3e3e; + --sparql-editor-btn-hover-bg: #3e3e3e; + --sparql-editor-btn-hover-border: #555555; + --sparql-editor-accent: #4fc3f7; + --sparql-editor-accent-text: #1e1e1e; + --sparql-editor-popup-bg: #2d2d30; + --sparql-editor-popup-border: #3e3e3e; + --sparql-editor-icon: #cccccc; +} + +/* Auto dark mode following the OS/browser preference, unless the user forced light */ +@media (prefers-color-scheme: dark) { + html:not([data-theme="light"]) { + --sparql-editor-text: #d4d4d4; + --sparql-editor-border: #3e3e3e; + --sparql-editor-notification-bg: #2d2d30; + --sparql-editor-notification-text: #cccccc; + --sparql-editor-tooltip-bg: rgba(255, 255, 255, 0.1); + --sparql-editor-tooltip-text: #ffffff; + --sparql-editor-error: #ff6b6b; + --sparql-editor-btn-bg: #2d2d30; + --sparql-editor-btn-text: #d4d4d4; + --sparql-editor-btn-border: #3e3e3e; + --sparql-editor-btn-hover-bg: #3e3e3e; + --sparql-editor-btn-hover-border: #555555; + --sparql-editor-accent: #4fc3f7; + --sparql-editor-accent-text: #1e1e1e; + --sparql-editor-popup-bg: #2d2d30; + --sparql-editor-popup-border: #3e3e3e; + --sparql-editor-icon: #cccccc; + } +} + +.sparql-editor { + position: relative; + color: var(--sparql-editor-text); + + .svgImg { + display: inline-block; + } + span.shortlinkErr { + font-size: small; + color: var(--sparql-editor-error); + font-weight: bold; + float: left; + } + .CodeMirror-hint { + max-width: 30em; + } + .notificationContainer { + width: 100%; + display: flex; + justify-content: center; + position: absolute; + bottom: 0; + } + .notification { + z-index: 4; + padding: 0 5px; + max-height: 0px; + /* Clip while collapsed so the (possibly multi-line) text disappears with the box on dismiss. */ + overflow: hidden; + color: var(--sparql-editor-notification-text); + background-color: var(--sparql-editor-notification-bg); + font-size: 90%; + text-align: center; + transition: max-height 0.2s ease-in; + border-top-right-radius: 2px; + border-top-left-radius: 2px; + } + .notification.active { + max-height: 3rem; + } + /* Language-server error notifications render via the shared `createLspErrorNotification` helper + (@rdfjs/sparql-utils), which injects its own `.sparql-editor-lsp-error` styles. */ + + .parseErrorIcon { + width: 13px; + height: 13px; + margin-top: 2px; + margin-left: 2px; + svg { + g { + fill: var(--sparql-editor-error); + } + } + } + + .sparql-editor_tooltip { + background: var(--sparql-editor-tooltip-bg); + border-radius: 5px; + color: var(--sparql-editor-tooltip-text); + padding: 5px 15px; + width: 220px; + white-space: pre-wrap; + white-space: normal; + margin-top: 5px; + } + .notificationLoader { + width: 18px; + height: 18px; + vertical-align: middle; + } + .resizeWrapper { + width: 100%; + height: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: row-resize; + } + .resizeChip { + width: 20%; + height: 4px; + background-color: var(--sparql-editor-border); + visibility: hidden; + border-radius: 2px; + } + /* Show resizeChip when sparql-editor is hovered */ + &:hover { + .resizeChip { + visibility: visible; + } + } +} + +/* Language-server settings panel styles (`.sparql-editor-settings-*`) are injected at runtime by the + shared `openSettingsPanel` helper in @rdfjs/sparql-utils, so both editors share one source. */ + +/* LSP diagnostics mirrored into the left glyph margin (decorations are set in index.ts via + `setupDiagnosticGlyphs`; Monaco itself only draws inline squiggles). Severity colors are + theme-independent so they stay legible in both light and dark. */ +.sparql-editor-glyph-error, +.sparql-editor-glyph-warning, +.sparql-editor-glyph-info { + background-repeat: no-repeat; + background-position: center center; + background-size: 13px 13px; + cursor: pointer; +} +.sparql-editor-glyph-error { + background-image: url("data:image/svg+xml,"); +} +.sparql-editor-glyph-warning { + background-image: url("data:image/svg+xml,"); +} +.sparql-editor-glyph-info { + background-image: url("data:image/svg+xml,"); +} diff --git a/packages/yasr/CHANGELOG.md b/packages/sparql-results/CHANGELOG.md similarity index 78% rename from packages/yasr/CHANGELOG.md rename to packages/sparql-results/CHANGELOG.md index f10fa2df..38f59c91 100644 --- a/packages/yasr/CHANGELOG.md +++ b/packages/sparql-results/CHANGELOG.md @@ -6,8 +6,8 @@ - 2285bff: Fix the display of results of DESCRIBE and CONSTRUCT queries. - Updated dependencies [2285bff] - - @zazuko/yasqe@4.6.1 - - @zazuko/yasgui-utils@4.6.1 + - @rdfjs/sparql-editor-monaco@4.6.1 + - @rdfjs/sparql-utils@4.6.1 ## 4.6.0 @@ -16,38 +16,38 @@ - 2e04999: Upgrade various dependencies - 0cd6b8e: Fix the documentation links - Updated dependencies [2e04999] - - @zazuko/yasqe@4.6.0 - - @zazuko/yasgui-utils@4.6.0 + - @rdfjs/sparql-editor-monaco@4.6.0 + - @rdfjs/sparql-utils@4.6.0 ## 4.5.0 ### Patch Changes -- @zazuko/yasgui-utils@4.5.0 -- @zazuko/yasqe@4.5.0 +- @rdfjs/sparql-utils@4.5.0 +- @rdfjs/sparql-editor-monaco@4.5.0 ## 4.4.3 ### Patch Changes - Updated dependencies [b835764] - - @zazuko/yasqe@4.4.3 - - @zazuko/yasgui-utils@4.4.3 + - @rdfjs/sparql-editor-monaco@4.4.3 + - @rdfjs/sparql-utils@4.4.3 ## 4.4.2 ### Patch Changes - Updated dependencies [c7ae45e] - - @zazuko/yasqe@4.4.2 - - @zazuko/yasgui-utils@4.4.2 + - @rdfjs/sparql-editor-monaco@4.4.2 + - @rdfjs/sparql-utils@4.4.2 ## 4.4.1 ### Patch Changes -- @zazuko/yasgui-utils@4.4.1 -- @zazuko/yasqe@4.4.1 +- @rdfjs/sparql-utils@4.4.1 +- @rdfjs/sparql-editor-monaco@4.4.1 ## 4.4.0 @@ -58,8 +58,8 @@ ### Patch Changes - Updated dependencies [2489238] - - @zazuko/yasqe@4.4.0 - - @zazuko/yasgui-utils@4.4.0 + - @rdfjs/sparql-editor-monaco@4.4.0 + - @rdfjs/sparql-utils@4.4.0 ## 4.3.3 @@ -69,15 +69,15 @@ - Updated dependencies [d918c63] - Updated dependencies [d918c63] - Updated dependencies [d918c63] - - @zazuko/yasgui-utils@4.3.3 - - @zazuko/yasqe@4.3.3 + - @rdfjs/sparql-utils@4.3.3 + - @rdfjs/sparql-editor-monaco@4.3.3 ## 4.3.2 ### Patch Changes -- @zazuko/yasgui-utils@4.3.2 -- @zazuko/yasqe@4.3.2 +- @rdfjs/sparql-utils@4.3.2 +- @rdfjs/sparql-editor-monaco@4.3.2 ## 4.3.1 @@ -86,8 +86,8 @@ - 8aef253: Upgrade datatables.net to 2.0.5 - cbf8286: Use the right type for DataTables configuration - 6e78f30: This fixes the style of the table by using the new `layout` property from DataTables - - @zazuko/yasgui-utils@4.3.1 - - @zazuko/yasqe@4.3.1 + - @rdfjs/sparql-utils@4.3.1 + - @rdfjs/sparql-editor-monaco@4.3.1 ## 4.3.0 @@ -97,10 +97,10 @@ ### Patch Changes -- b14ed24: Update Git repository to https://github.com/zazuko/Yasgui +- b14ed24: Update Git repository to https://github.com/rdfjs/Yasgui - Updated dependencies [b14ed24] - - @zazuko/yasgui-utils@4.3.0 - - @zazuko/yasqe@4.3.0 + - @rdfjs/sparql-utils@4.3.0 + - @rdfjs/sparql-editor-monaco@4.3.0 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. diff --git a/packages/yasr/package.json b/packages/sparql-results/package.json similarity index 54% rename from packages/yasr/package.json rename to packages/sparql-results/package.json index af6ab2a5..f4d70e32 100644 --- a/packages/yasr/package.json +++ b/packages/sparql-results/package.json @@ -1,22 +1,26 @@ { - "name": "@zazuko/yasr", - "description": "Yet Another SPARQL Resultset GUI", + "name": "@rdfjs/sparql-results", + "description": "SPARQL query results viewer for the web (fork of Yasr)", "version": "4.6.1", - "main": "build/yasr.min.js", - "module": "build/yasr.esm.js", + "type": "module", + "main": "build/sparql-results.js", + "module": "build/sparql-results.js", "types": "build/ts/src/index.d.ts", - "files": ["build"], + "files": [ + "build" + ], "exports": { ".": { "types": "./build/ts/src/index.d.ts", - "import": "./build/yasr.esm.js", - "require": "./build/yasr.min.js" + "import": "./build/sparql-results.js" }, + "./index.js": "./build/sparql-results.js", + "./style.css": "./build/sparql-results.css", "./*": "./*" }, "license": "MIT", "author": "Triply ", - "homepage": "https://github.com/zazuko/Yasgui", + "homepage": "https://github.com/rdfjs/Yasgui", "engines": { "node": ">= 8" }, @@ -27,18 +31,21 @@ "Semantic Web", "Linked Data" ], - "bugs": "https://github.com/zazuko/Yasgui/issues/", + "bugs": "https://github.com/rdfjs/Yasgui/issues/", "repository": { "type": "git", - "url": "https://github.com/zazuko/Yasgui.git", - "directory": "packages/yasr" + "url": "https://github.com/rdfjs/Yasgui.git", + "directory": "packages/sparql-results" }, "dependencies": { + "@codemirror/lang-json": "^6.0.2", + "@codemirror/language": "^6.12.3", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.43.0", "@fortawesome/free-solid-svg-icons": "^5.14.0", "@json2csv/plainjs": "^7.0.4", - "@zazuko/yasgui-utils": "^4.6.1", - "@zazuko/yasqe": "^4.6.1", - "codemirror": "^5.51.0", + "@rdfjs/sparql-utils": "^4.6.1", + "@rdfjs/sparql-editor-monaco": "^4.6.1", "colors": "^1.4.0", "column-resizer": "^1.4.0", "datatables.net": "^2.0.5", @@ -50,14 +57,12 @@ "papaparse": "^5.3.1" }, "devDependencies": { - "@types/codemirror": "0.0.100", "@types/jquery": "^3.5.32", "@types/lodash-es": "^4.17.3", "@types/n3": "^1.1.5", "@types/node": "^22.5.4", "@types/papaparse": "^5.3.2", - "@types/sanitize-html": "^1.20.2", - "ts-essentials": "^7.0.1" + "@types/sanitize-html": "^1.20.2" }, "publishConfig": { "access": "public" diff --git a/packages/yasr/src/bin/takeScreenshot.js b/packages/sparql-results/src/bin/takeScreenshot.cjs similarity index 94% rename from packages/yasr/src/bin/takeScreenshot.js rename to packages/sparql-results/src/bin/takeScreenshot.cjs index 40fbc296..2a9c29e1 100644 --- a/packages/yasr/src/bin/takeScreenshot.js +++ b/packages/sparql-results/src/bin/takeScreenshot.cjs @@ -221,7 +221,7 @@ const getHtml = (plugin) => ` - YASR + SPARQL Results @@ -231,28 +231,28 @@ const getHtml = (plugin) => ` } - + - +
-
+
- + - +