From c705cbd3d9449975d43046f6b8f032e280f26f61 Mon Sep 17 00:00:00 2001 From: Rob Colbert Date: Tue, 12 May 2026 22:41:31 -0400 Subject: [PATCH] feat: replace react-ace with @uiw/react-codemirror react-ace v14 is CommonJS-only with no ESM entry point, making it fundamentally incompatible with Vite's ESM-first dev server. Every CJS interop workaround failed. Switched to @uiw/react-codemirror v4.25 which ships proper dual ESM+CJS and works with Vite out of the box. Changes: - Remove ace-builds and react-ace dependencies - Add @uiw/react-codemirror + 16 @codemirror/lang-* packages - Add @uiw/codemirror-theme-tomorrow-night-blue (closest to ACE's 'tomorrow') - Add @replit/codemirror-lang-csharp for C# support - Rewrite EditorPanel.tsx: delete 108 lines of ACE boilerplate (?url imports, setModuleUrl, CJS interop hack), replace with ~30 lines of clean CodeMirror language extension setup - Delete vite.d.ts (only needed for ACE ?url import types) - Remove optimizeDeps.include from vite.config.ts (not needed for CM) - Add CodeMirror flex layout CSS to index.css Supported languages: JavaScript/JSX, TypeScript/TSX, Python, JSON, HTML, CSS, Less, YAML, Markdown, SQL, Java, Go, Rust, C/C++, C#, PHP, XML. Unsupported types fall back to plain text. Verified: tsc clean, vite build passes, heartbeat worker intact. --- gadget-code/frontend/package.json | 24 +- .../frontend/src/components/EditorPanel.tsx | 397 ++++------- gadget-code/frontend/src/index.css | 17 + gadget-code/frontend/src/types/vite.d.ts | 17 - gadget-code/frontend/vite.config.ts | 3 - gadget-code/pnpm-lock.yaml | 635 ++++++++++++++++-- 6 files changed, 750 insertions(+), 343 deletions(-) delete mode 100644 gadget-code/frontend/src/types/vite.d.ts diff --git a/gadget-code/frontend/package.json b/gadget-code/frontend/package.json index 1b799db..a809f2c 100644 --- a/gadget-code/frontend/package.json +++ b/gadget-code/frontend/package.json @@ -11,9 +11,25 @@ "author": "Robert Colbert ", "license": "Apache-2.0", "dependencies": { - "ace-builds": "^1.44.0", - "marked": "^16.0.0", - "react-ace": "^14.0.1", + "@codemirror/lang-cpp": "^6.0.3", + "@codemirror/lang-css": "^6.3.1", + "@codemirror/lang-go": "^6.0.1", + "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-java": "^6.0.2", + "@codemirror/lang-javascript": "^6.2.5", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/lang-less": "^6.0.2", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-php": "^6.0.2", + "@codemirror/lang-python": "^6.2.1", + "@codemirror/lang-rust": "^6.0.2", + "@codemirror/lang-sql": "^6.10.0", + "@codemirror/lang-xml": "^6.1.0", + "@codemirror/lang-yaml": "^6.1.3", + "@replit/codemirror-lang-csharp": "^6.2.0", + "@uiw/codemirror-theme-tomorrow-night-blue": "^4.25.9", + "@uiw/react-codemirror": "^4.25.9", + "marked": "^16.4.2", "slug": "^11.0.1" } -} \ No newline at end of file +} diff --git a/gadget-code/frontend/src/components/EditorPanel.tsx b/gadget-code/frontend/src/components/EditorPanel.tsx index 5903422..e8862c7 100644 --- a/gadget-code/frontend/src/components/EditorPanel.tsx +++ b/gadget-code/frontend/src/components/EditorPanel.tsx @@ -1,115 +1,27 @@ -import { useState, useCallback, useEffect } from 'react'; -import * as ReactAceModule from 'react-ace'; -import * as aceModule from 'ace-builds'; +import { useState, useCallback, useEffect, useMemo } from 'react'; +import CodeMirror from '@uiw/react-codemirror'; +import { tomorrowNightBlue } from '@uiw/codemirror-theme-tomorrow-night-blue'; -// react-ace v14 ships CommonJS, so the default export may be nested under -// `.default` when Vite pre-bundles it for the dev server. Handle both cases. -const Ace = (ReactAceModule as any).default || ReactAceModule; -const ace = (aceModule as any).default || aceModule; +// Language extensions +import { javascript } from '@codemirror/lang-javascript'; +import { python } from '@codemirror/lang-python'; +import { json } from '@codemirror/lang-json'; +import { html } from '@codemirror/lang-html'; +import { css } from '@codemirror/lang-css'; +import { yaml } from '@codemirror/lang-yaml'; +import { markdown } from '@codemirror/lang-markdown'; +import { sql } from '@codemirror/lang-sql'; +import { java } from '@codemirror/lang-java'; +import { go } from '@codemirror/lang-go'; +import { rust } from '@codemirror/lang-rust'; +import { cpp } from '@codemirror/lang-cpp'; +import { php } from '@codemirror/lang-php'; +import { xml } from '@codemirror/lang-xml'; +import { less } from '@codemirror/lang-less'; +import { csharp } from '@replit/codemirror-lang-csharp'; -// ── Vite ?url imports for ACE modes ────────────────────────────────────── -// These resolve at build time to asset URLs. We register them with ACE's -// module system via setModuleUrl() so that ACE can lazy-load them at runtime -// without relying on broken dynamic import() or script-tag detection. -// -// See: https://github.com/ajaxorg/ace/issues/4597 -// ───────────────────────────────────────────────────────────────────────── - -import modeJavascriptUrl from "ace-builds/src-noconflict/mode-javascript?url"; -import modeTypescriptUrl from "ace-builds/src-noconflict/mode-typescript?url"; -import modePythonUrl from "ace-builds/src-noconflict/mode-python?url"; -import modeJsonUrl from "ace-builds/src-noconflict/mode-json?url"; -import modeHtmlUrl from "ace-builds/src-noconflict/mode-html?url"; -import modeCssUrl from "ace-builds/src-noconflict/mode-css?url"; -import modeYamlUrl from "ace-builds/src-noconflict/mode-yaml?url"; -import modeMarkdownUrl from "ace-builds/src-noconflict/mode-markdown?url"; -import modeShUrl from "ace-builds/src-noconflict/mode-sh?url"; -import modeSqlUrl from "ace-builds/src-noconflict/mode-sql?url"; -import modeJavaUrl from "ace-builds/src-noconflict/mode-java?url"; -import modeGolangUrl from "ace-builds/src-noconflict/mode-golang?url"; -import modeRustUrl from "ace-builds/src-noconflict/mode-rust?url"; -import modeCsharpUrl from "ace-builds/src-noconflict/mode-csharp?url"; -import modePhpUrl from "ace-builds/src-noconflict/mode-php?url"; -import modeRubyUrl from "ace-builds/src-noconflict/mode-ruby?url"; -import modeCcppUrl from "ace-builds/src-noconflict/mode-c_cpp?url"; -import modeScssUrl from "ace-builds/src-noconflict/mode-scss?url"; -import modeLessUrl from "ace-builds/src-noconflict/mode-less?url"; -import modeXmlUrl from "ace-builds/src-noconflict/mode-xml?url"; -import modeDockerfileUrl from "ace-builds/src-noconflict/mode-dockerfile?url"; -import modeMakefileUrl from "ace-builds/src-noconflict/mode-makefile?url"; -import modeSassUrl from "ace-builds/src-noconflict/mode-sass?url"; -import modeTextUrl from "ace-builds/src-noconflict/mode-text?url"; - -// Workers (for syntax validation — currently disabled via useWorker:false, -// but registered in case we want to enable them later) -import workerJavascriptUrl from "ace-builds/src-noconflict/worker-javascript?url"; -import workerJsonUrl from "ace-builds/src-noconflict/worker-json?url"; -import workerCssUrl from "ace-builds/src-noconflict/worker-css?url"; -import workerHtmlUrl from "ace-builds/src-noconflict/worker-html?url"; - -// Theme -import themeTomorrowUrl from "ace-builds/src-noconflict/theme-tomorrow?url"; - -// Extensions -import extLanguageToolsUrl from "ace-builds/src-noconflict/ext-language_tools?url"; -import extSearchboxUrl from "ace-builds/src-noconflict/ext-searchbox?url"; - -// ── Register all modules with ACE ──────────────────────────────────────── - -const MODE_URLS: Record = { - javascript: modeJavascriptUrl, - typescript: modeTypescriptUrl, - python: modePythonUrl, - json: modeJsonUrl, - html: modeHtmlUrl, - css: modeCssUrl, - yaml: modeYamlUrl, - markdown: modeMarkdownUrl, - sh: modeShUrl, - sql: modeSqlUrl, - java: modeJavaUrl, - golang: modeGolangUrl, - rust: modeRustUrl, - csharp: modeCsharpUrl, - php: modePhpUrl, - ruby: modeRubyUrl, - c_cpp: modeCcppUrl, - scss: modeScssUrl, - less: modeLessUrl, - xml: modeXmlUrl, - dockerfile: modeDockerfileUrl, - makefile: modeMakefileUrl, - sass: modeSassUrl, - text: modeTextUrl, -}; - -const WORKER_URLS: Record = { - javascript: workerJavascriptUrl, - typescript: workerJavascriptUrl, // TS mode shares the JS worker - json: workerJsonUrl, - css: workerCssUrl, - html: workerHtmlUrl, -}; - -// Register modes -for (const [mode, url] of Object.entries(MODE_URLS)) { - ace.config.setModuleUrl(`ace/mode/${mode}`, url); -} - -// Register workers -for (const [mode, url] of Object.entries(WORKER_URLS)) { - ace.config.setModuleUrl(`ace/mode/${mode}_worker`, url); -} - -// Register theme and extensions -ace.config.setModuleUrl("ace/theme/tomorrow", themeTomorrowUrl); -ace.config.setModuleUrl("ace/ext/language_tools", extLanguageToolsUrl); -ace.config.setModuleUrl("ace/ext/searchbox", extSearchboxUrl); - -// ── Component ──────────────────────────────────────────────────────────── - -import { WorkspaceMode } from "../lib/types"; -import { socketClient } from "../lib/socket"; +import { WorkspaceMode } from '../lib/types'; +import { socketClient } from '../lib/socket'; interface EditorPanelProps { workspaceMode: WorkspaceMode; @@ -128,88 +40,112 @@ interface EditorState { successMessage?: string; } -// Map file extensions to ACE language modes -function detectLanguage(filePath: string): string { - const ext = filePath.split(".").pop()?.toLowerCase(); - const languageMap: Record = { - js: "javascript", - jsx: "javascript", - ts: "typescript", - tsx: "typescript", - py: "python", - rb: "ruby", - java: "java", - c: "c_cpp", - cpp: "c_cpp", - h: "c_cpp", - hpp: "c_cpp", - cs: "csharp", - go: "golang", - rs: "rust", - php: "php", - html: "html", - htm: "html", - css: "css", - scss: "scss", - sass: "sass", - less: "less", - json: "json", - xml: "xml", - yaml: "yaml", - yml: "yaml", - md: "markdown", - sql: "sql", - sh: "sh", - bash: "sh", - dockerfile: "dockerfile", - makefile: "makefile", +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type Extension = any; + +/** + * Map a language key to a CodeMirror language extension array. + * Returns an empty array for unsupported types (plain text). + */ +function getLanguageExtensions(language: string): Extension[] { + const extensionMap: Record Extension)[]> = { + javascript: [() => javascript({ jsx: true })], + typescript: [() => javascript({ jsx: true, typescript: true })], + python: [() => python()], + json: [() => json()], + html: [() => html()], + css: [() => css()], + yaml: [() => yaml()], + markdown: [() => markdown()], + sql: [() => sql()], + java: [() => java()], + golang: [() => go()], + rust: [() => rust()], + c_cpp: [() => cpp()], + csharp: [() => csharp()], + php: [() => php()], + xml: [() => xml()], + less: [() => less()], }; - return languageMap[ext || ""] || "text"; + const factories = extensionMap[language]; + return factories ? factories.map(fn => fn()) : []; } -export default function EditorPanel({ - workspaceMode, - filePath, - onCloseFile, -}: EditorPanelProps) { +/** Map file extension string to a language key used by getLanguageExtensions. */ +function detectLanguage(filePath: string): string { + const ext = filePath.split('.').pop()?.toLowerCase(); + const languageMap: Record = { + js: 'javascript', + jsx: 'javascript', + ts: 'typescript', + tsx: 'typescript', + py: 'python', + java: 'java', + c: 'c_cpp', + cpp: 'c_cpp', + h: 'c_cpp', + hpp: 'c_cpp', + cs: 'csharp', + go: 'golang', + rs: 'rust', + php: 'php', + html: 'html', + htm: 'html', + css: 'css', + scss: 'css', // CM6 has no official SCSS; CSS is close enough + less: 'less', + json: 'json', + xml: 'xml', + yaml: 'yaml', + yml: 'yaml', + md: 'markdown', + sql: 'sql', + }; + return languageMap[ext || ''] || 'text'; +} + +export default function EditorPanel({ workspaceMode, filePath, onCloseFile }: EditorPanelProps) { const [state, setState] = useState({ - content: "", - originalContent: "", + content: '', + originalContent: '', isDirty: false, isLoading: false, isSaving: false, - language: "text", + language: 'text', }); const isReadOnly = workspaceMode === WorkspaceMode.Agent; - const isReadWrite = workspaceMode === WorkspaceMode.User; + + // Build extensions array from current language + const extensions = useMemo( + () => getLanguageExtensions(state.language), + [state.language], + ); // Load file when filePath changes useEffect(() => { if (filePath) { loadFile(filePath); } else { - // Clear editor when no file is selected setState({ - content: "", - originalContent: "", + content: '', + originalContent: '', isDirty: false, isLoading: false, isSaving: false, - language: "text", + language: 'text', }); } }, [filePath]); const loadFile = useCallback(async (path: string) => { - setState((prev) => ({ ...prev, isLoading: true, error: undefined })); + setState(prev => ({ ...prev, isLoading: true, error: undefined })); try { const result = await socketClient.requestFileRead({ path }); if (result.success && result.content !== undefined) { const language = detectLanguage(path); - // No dynamic import needed — all modes are registered via setModuleUrl at module load time setState({ content: result.content, originalContent: result.content, @@ -219,17 +155,17 @@ export default function EditorPanel({ language, }); } else { - setState((prev) => ({ + setState(prev => ({ ...prev, isLoading: false, - error: result.error || "Failed to load file", + error: result.error || 'Failed to load file', })); } } catch (error) { - setState((prev) => ({ + setState(prev => ({ ...prev, isLoading: false, - error: error instanceof Error ? error.message : "Failed to load file", + error: error instanceof Error ? error.message : 'Failed to load file', })); } }, []); @@ -237,7 +173,7 @@ export default function EditorPanel({ const saveFile = useCallback(async () => { if (!filePath || isReadOnly) return; - setState((prev) => ({ ...prev, isSaving: true, error: undefined })); + setState(prev => ({ ...prev, isSaving: true, error: undefined })); try { const result = await socketClient.requestFileWrite({ @@ -246,78 +182,63 @@ export default function EditorPanel({ }); if (result.success) { - setState((prev) => ({ + setState(prev => ({ ...prev, isSaving: false, originalContent: prev.content, isDirty: false, - successMessage: "File saved successfully", + successMessage: 'File saved successfully', })); - // Clear success message after 3 seconds setTimeout(() => { - setState((prev) => ({ ...prev, successMessage: undefined })); + setState(prev => ({ ...prev, successMessage: undefined })); }, 3000); } else { - setState((prev) => ({ + setState(prev => ({ ...prev, isSaving: false, - error: result.error || "Failed to save file", + error: result.error || 'Failed to save file', })); } } catch (error) { - setState((prev) => ({ + setState(prev => ({ ...prev, isSaving: false, - error: error instanceof Error ? error.message : "Failed to save file", + error: error instanceof Error ? error.message : 'Failed to save file', })); } }, [filePath, state.content, isReadOnly]); const handleContentChange = useCallback((newValue: string) => { - setState((prev) => ({ + setState(prev => ({ ...prev, content: newValue, isDirty: newValue !== prev.originalContent, })); }, []); - const handleKeyDown = useCallback( - (e: KeyboardEvent) => { - // Ctrl+S or Cmd+S to save - if ((e.ctrlKey || e.metaKey) && e.key === "s") { - e.preventDefault(); - if (!isReadOnly && state.isDirty) { - saveFile(); - } + const handleKeyDown = useCallback((e: KeyboardEvent) => { + // Ctrl+S or Cmd+S to save + if ((e.ctrlKey || e.metaKey) && e.key === 's') { + e.preventDefault(); + if (!isReadOnly && state.isDirty) { + saveFile(); } - }, - [saveFile, isReadOnly, state.isDirty], - ); + } + }, [saveFile, isReadOnly, state.isDirty]); - // Add keyboard listener useEffect(() => { - window.addEventListener("keydown", handleKeyDown); - return () => window.removeEventListener("keydown", handleKeyDown); + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); }, [handleKeyDown]); - // If no file is selected, show placeholder + // No file selected — show placeholder if (!filePath) { return (
- - + +

No file open

Select a file from the tree to edit

@@ -359,11 +280,11 @@ export default function EditorPanel({ disabled={isReadOnly || !state.isDirty || state.isSaving} className={`px-3 py-1.5 text-xs font-medium rounded transition-colors ${ isReadOnly || !state.isDirty || state.isSaving - ? "bg-bg-secondary text-text-muted cursor-not-allowed" - : "bg-brand text-white hover:bg-brand/80" + ? 'bg-bg-secondary text-text-muted cursor-not-allowed' + : 'bg-brand text-white hover:bg-brand/80' }`} > - {state.isSaving ? "Saving..." : "Save"} + {state.isSaving ? 'Saving...' : 'Save'} {onCloseFile && ( @@ -372,18 +293,8 @@ export default function EditorPanel({ className="p-1.5 text-text-muted hover:text-text-primary hover:bg-bg-secondary rounded transition-colors" title="Close file" > - - + + )} @@ -394,18 +305,8 @@ export default function EditorPanel({ {state.error && (
- - + +

{state.error}

@@ -430,33 +331,27 @@ export default function EditorPanel({
)} - {/* ACE Editor */} + {/* CodeMirror Editor */} {!state.isLoading && ( -
- +
)} diff --git a/gadget-code/frontend/src/index.css b/gadget-code/frontend/src/index.css index 4868c9f..24d3e3f 100644 --- a/gadget-code/frontend/src/index.css +++ b/gadget-code/frontend/src/index.css @@ -101,6 +101,23 @@ textarea { animation: strobe 1.2s ease-in-out infinite; } +/* ── CodeMirror Editor Layout ─────────────────────────────── */ +/* Make the CodeMirror component fill its flex container. */ +.cm-editor-container { + display: flex; + flex-direction: column; + min-height: 0; +} + +.cm-editor-container .cm-editor { + flex: 1; + min-height: 0; +} + +.cm-editor-container .cm-scroller { + min-height: 0; +} + /* ── Gadget Markdown Styles ─────────────────────────────────── */ /* Dense, technical display — no blog-style whitespace */ diff --git a/gadget-code/frontend/src/types/vite.d.ts b/gadget-code/frontend/src/types/vite.d.ts deleted file mode 100644 index 3546ea7..0000000 --- a/gadget-code/frontend/src/types/vite.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Type declarations for Vite-specific import suffixes -// These allow TypeScript to understand Vite's ?url and ?raw import patterns - -declare module '*?url' { - const url: string; - export default url; -} - -declare module '*?raw' { - const content: string; - export default content; -} - -declare module '*?worker' { - const worker: new () => Worker; - export default worker; -} diff --git a/gadget-code/frontend/vite.config.ts b/gadget-code/frontend/vite.config.ts index 333046c..6c4af97 100644 --- a/gadget-code/frontend/vite.config.ts +++ b/gadget-code/frontend/vite.config.ts @@ -11,9 +11,6 @@ export default defineConfig({ plugins: [react()], root: '.', publicDir: 'public', - optimizeDeps: { - include: ['react-ace', 'ace-builds'], - }, server: { port: 5174, host: '0.0.0.0', diff --git a/gadget-code/pnpm-lock.yaml b/gadget-code/pnpm-lock.yaml index 20a660c..b87b642 100644 --- a/gadget-code/pnpm-lock.yaml +++ b/gadget-code/pnpm-lock.yaml @@ -231,15 +231,63 @@ importers: frontend: dependencies: - ace-builds: - specifier: ^1.44.0 - version: 1.44.0 + '@codemirror/lang-cpp': + specifier: ^6.0.3 + version: 6.0.3 + '@codemirror/lang-css': + specifier: ^6.3.1 + version: 6.3.1 + '@codemirror/lang-go': + specifier: ^6.0.1 + version: 6.0.1 + '@codemirror/lang-html': + specifier: ^6.4.11 + version: 6.4.11 + '@codemirror/lang-java': + specifier: ^6.0.2 + version: 6.0.2 + '@codemirror/lang-javascript': + specifier: ^6.2.5 + version: 6.2.5 + '@codemirror/lang-json': + specifier: ^6.0.2 + version: 6.0.2 + '@codemirror/lang-less': + specifier: ^6.0.2 + version: 6.0.2 + '@codemirror/lang-markdown': + specifier: ^6.5.0 + version: 6.5.0 + '@codemirror/lang-php': + specifier: ^6.0.2 + version: 6.0.2 + '@codemirror/lang-python': + specifier: ^6.2.1 + version: 6.2.1 + '@codemirror/lang-rust': + specifier: ^6.0.2 + version: 6.0.2 + '@codemirror/lang-sql': + specifier: ^6.10.0 + version: 6.10.0 + '@codemirror/lang-xml': + specifier: ^6.1.0 + version: 6.1.0 + '@codemirror/lang-yaml': + specifier: ^6.1.3 + version: 6.1.3 + '@replit/codemirror-lang-csharp': + specifier: ^6.2.0 + version: 6.2.0(@codemirror/autocomplete@6.20.2)(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1)(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.10) + '@uiw/codemirror-theme-tomorrow-night-blue': + specifier: ^4.25.9 + version: 4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1) + '@uiw/react-codemirror': + specifier: ^4.25.9 + version: 4.25.9(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.2)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.0)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.42.1)(codemirror@6.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) marked: - specifier: ^16.0.0 - version: 16.0.0 - react-ace: - specifier: ^14.0.1 - version: 14.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: ^16.4.2 + version: 16.4.2 slug: specifier: ^11.0.1 version: 11.0.1 @@ -301,6 +349,75 @@ packages: resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true + '@codemirror/autocomplete@6.20.2': + resolution: {integrity: sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ==} + + '@codemirror/commands@6.10.3': + resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + + '@codemirror/lang-cpp@6.0.3': + resolution: {integrity: sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==} + + '@codemirror/lang-css@6.3.1': + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + + '@codemirror/lang-go@6.0.1': + resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} + + '@codemirror/lang-html@6.4.11': + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + + '@codemirror/lang-java@6.0.2': + resolution: {integrity: sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==} + + '@codemirror/lang-javascript@6.2.5': + resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} + + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + + '@codemirror/lang-less@6.0.2': + resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} + + '@codemirror/lang-markdown@6.5.0': + resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} + + '@codemirror/lang-php@6.0.2': + resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} + + '@codemirror/lang-python@6.2.1': + resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==} + + '@codemirror/lang-rust@6.0.2': + resolution: {integrity: sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==} + + '@codemirror/lang-sql@6.10.0': + resolution: {integrity: sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==} + + '@codemirror/lang-xml@6.1.0': + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + + '@codemirror/lang-yaml@6.1.3': + resolution: {integrity: sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ==} + + '@codemirror/language@6.12.3': + resolution: {integrity: sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==} + + '@codemirror/lint@6.9.6': + resolution: {integrity: sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==} + + '@codemirror/search@6.7.0': + resolution: {integrity: sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==} + + '@codemirror/state@6.6.0': + resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} + + '@codemirror/theme-one-dark@6.1.3': + resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} + + '@codemirror/view@6.42.1': + resolution: {integrity: sha512-ToN3oFc0nsxNUYVF5P0ztLgbC4UPPjPtA9aKYhkOKQaZASpOUo6ISXyQLP66ctVwlDc+j6Jv0uK5IFALkiXztg==} + '@csstools/color-helpers@6.0.2': resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} @@ -687,6 +804,57 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + '@lezer/common@1.5.2': + resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} + + '@lezer/cpp@1.1.5': + resolution: {integrity: sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw==} + + '@lezer/css@1.3.3': + resolution: {integrity: sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg==} + + '@lezer/go@1.0.1': + resolution: {integrity: sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==} + + '@lezer/highlight@1.2.3': + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + + '@lezer/html@1.3.13': + resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} + + '@lezer/java@1.1.3': + resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + + '@lezer/javascript@1.5.4': + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} + + '@lezer/json@1.0.3': + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + + '@lezer/lr@1.4.10': + resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} + + '@lezer/markdown@1.6.3': + resolution: {integrity: sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==} + + '@lezer/php@1.0.5': + resolution: {integrity: sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==} + + '@lezer/python@1.1.18': + resolution: {integrity: sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==} + + '@lezer/rust@1.0.2': + resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==} + + '@lezer/xml@1.0.6': + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} + + '@lezer/yaml@1.0.4': + resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==} + + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@mongodb-js/saslprep@1.3.0': resolution: {integrity: sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==} @@ -746,6 +914,17 @@ packages: engines: {node: '>=18'} hasBin: true + '@replit/codemirror-lang-csharp@6.2.0': + resolution: {integrity: sha512-6utbaWkoymhoAXj051mkRp+VIJlpwUgCX9Toevz3YatiZsz512fw3OVCedXQx+WcR0wb6zVHjChnuxqfCLtFVQ==} + peerDependencies: + '@codemirror/autocomplete': ^6.0.0 + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + '@lezer/highlight': ^1.0.0 + '@lezer/lr': ^1.0.0 + '@rolldown/binding-android-arm64@1.0.0-rc.17': resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1076,6 +1255,38 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@uiw/codemirror-extensions-basic-setup@4.25.9': + resolution: {integrity: sha512-QFAqr+pu6lDmNpAlecODcF49TlsrZ0bj15zPzfhiqSDl+Um3EsDLFLppixC7kFLn+rdDM2LTvVjn5CPvefpRgw==} + peerDependencies: + '@codemirror/autocomplete': '>=6.0.0' + '@codemirror/commands': '>=6.0.0' + '@codemirror/language': '>=6.0.0' + '@codemirror/lint': '>=6.0.0' + '@codemirror/search': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@uiw/codemirror-theme-tomorrow-night-blue@4.25.9': + resolution: {integrity: sha512-iG2wCXO/rkJIrvW7rJY7Ehh4yushw8X4vQnstjArxofR6uNrE9ay3Ut7M0cxrwY7z8YIU5f7NQFODE/h3HNmVA==} + + '@uiw/codemirror-themes@4.25.9': + resolution: {integrity: sha512-DAHKb/L9ELwjY4nCf/MP/mIllHOn4GQe7RR4x8AMJuNeh9nGRRoo1uPxrxMmUL/bKqe6kDmDbIZ2AlhlqyIJuw==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@uiw/react-codemirror@4.25.9': + resolution: {integrity: sha512-HftqCBUYShAOH0pGi1CHP8vfm5L8fQ3+0j0VI6lQD6QpK+UBu3J7nxfEN5O/BXMilMNf9ZyFJRvRcuMMOLHMng==} + peerDependencies: + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + '@vitejs/plugin-react@6.0.1': resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1129,9 +1340,6 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - ace-builds@1.44.0: - resolution: {integrity: sha512-PFNMSYqFdEUkul2Ntud0HvA09AgY+F1ag0UYdpMH60wNI/qOA8cB8tlTgoALMEwIdUPJK2CjrIQ7OnbiSS/ugQ==} - acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -1339,6 +1547,9 @@ packages: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} + codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1425,6 +1636,9 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -1524,9 +1738,6 @@ packages: diacritics@1.3.0: resolution: {integrity: sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==} - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2087,10 +2298,6 @@ packages: lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2100,10 +2307,6 @@ packages: lodash.isboolean@3.0.3: resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.isfinite@3.3.2: resolution: {integrity: sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==} @@ -2125,10 +2328,6 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - lru-cache@11.3.5: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} @@ -2153,6 +2352,11 @@ packages: engines: {node: '>= 20'} hasBin: true + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -2456,9 +2660,6 @@ packages: promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -2541,20 +2742,11 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} - react-ace@14.0.1: - resolution: {integrity: sha512-z6YAZ20PNf/FqmYEic//G/UK6uw0rn21g58ASgHJHl9rfE4nITQLqthr9rHMVQK4ezwohJbp2dGrZpkq979PYQ==} - peerDependencies: - react: ^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom@19.2.5: resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} peerDependencies: react: ^19.2.5 - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -2861,6 +3053,9 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3098,6 +3293,9 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -3251,6 +3449,179 @@ snapshots: dependencies: css-tree: 3.2.1 + '@codemirror/autocomplete@6.20.2': + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + + '@codemirror/commands@6.10.3': + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + + '@codemirror/lang-cpp@6.0.3': + dependencies: + '@codemirror/language': 6.12.3 + '@lezer/cpp': 1.1.5 + + '@codemirror/lang-css@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/css': 1.3.3 + + '@codemirror/lang-go@6.0.1': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/go': 1.0.1 + + '@codemirror/lang-html@6.4.11': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.5 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + '@lezer/css': 1.3.3 + '@lezer/html': 1.3.13 + + '@codemirror/lang-java@6.0.2': + dependencies: + '@codemirror/language': 6.12.3 + '@lezer/java': 1.1.3 + + '@codemirror/lang-javascript@6.2.5': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/lint': 6.9.6 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + '@lezer/javascript': 1.5.4 + + '@codemirror/lang-json@6.0.2': + dependencies: + '@codemirror/language': 6.12.3 + '@lezer/json': 1.0.3 + + '@codemirror/lang-less@6.0.2': + dependencies: + '@codemirror/lang-css': 6.3.1 + '@codemirror/language': 6.12.3 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@codemirror/lang-markdown@6.5.0': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + '@lezer/markdown': 1.6.3 + + '@codemirror/lang-php@6.0.2': + dependencies: + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/php': 1.0.5 + + '@codemirror/lang-python@6.2.1': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/python': 1.1.18 + + '@codemirror/lang-rust@6.0.2': + dependencies: + '@codemirror/language': 6.12.3 + '@lezer/rust': 1.0.2 + + '@codemirror/lang-sql@6.10.0': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@codemirror/lang-xml@6.1.0': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + '@lezer/xml': 1.0.6 + + '@codemirror/lang-yaml@6.1.3': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + '@lezer/yaml': 1.0.4 + + '@codemirror/language@6.12.3': + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + style-mod: 4.1.3 + + '@codemirror/lint@6.9.6': + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + crelt: 1.0.6 + + '@codemirror/search@6.7.0': + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + crelt: 1.0.6 + + '@codemirror/state@6.6.0': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/theme-one-dark@6.1.3': + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/highlight': 1.2.3 + + '@codemirror/view@6.42.1': + dependencies: + '@codemirror/state': 6.6.0 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + '@csstools/color-helpers@6.0.2': {} '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': @@ -3471,6 +3842,95 @@ snapshots: '@kurkle/color@0.3.4': {} + '@lezer/common@1.5.2': {} + + '@lezer/cpp@1.1.5': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/css@1.3.3': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/go@1.0.1': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/highlight@1.2.3': + dependencies: + '@lezer/common': 1.5.2 + + '@lezer/html@1.3.13': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/java@1.1.3': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/javascript@1.5.4': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/json@1.0.3': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/lr@1.4.10': + dependencies: + '@lezer/common': 1.5.2 + + '@lezer/markdown@1.6.3': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + + '@lezer/php@1.0.5': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/python@1.1.18': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/rust@1.0.2': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/xml@1.0.6': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/yaml@1.0.4': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@marijn/find-cluster-break@1.0.2': {} + '@mongodb-js/saslprep@1.3.0': dependencies: sparse-bitfield: 3.0.3 @@ -3518,6 +3978,16 @@ snapshots: dependencies: playwright: 1.59.1 + '@replit/codemirror-lang-csharp@6.2.0(@codemirror/autocomplete@6.20.2)(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1)(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.10)': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true @@ -3807,6 +4277,47 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 + '@uiw/codemirror-extensions-basic-setup@4.25.9(@codemirror/autocomplete@6.20.2)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.0)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1)': + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/commands': 6.10.3 + '@codemirror/language': 6.12.3 + '@codemirror/lint': 6.9.6 + '@codemirror/search': 6.7.0 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + + '@uiw/codemirror-theme-tomorrow-night-blue@4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1)': + dependencies: + '@uiw/codemirror-themes': 4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1) + transitivePeerDependencies: + - '@codemirror/language' + - '@codemirror/state' + - '@codemirror/view' + + '@uiw/codemirror-themes@4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1)': + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + + '@uiw/react-codemirror@4.25.9(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.2)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.0)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.42.1)(codemirror@6.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@babel/runtime': 7.29.2 + '@codemirror/commands': 6.10.3 + '@codemirror/state': 6.6.0 + '@codemirror/theme-one-dark': 6.1.3 + '@codemirror/view': 6.42.1 + '@uiw/codemirror-extensions-basic-setup': 4.25.9(@codemirror/autocomplete@6.20.2)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.6)(@codemirror/search@6.7.0)(@codemirror/state@6.6.0)(@codemirror/view@6.42.1) + codemirror: 6.0.2 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.0.4)(esbuild@0.25.5)(jiti@2.6.1)(less@4.3.0)(tsx@4.21.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 @@ -3866,8 +4377,6 @@ snapshots: mime-types: 3.0.1 negotiator: 1.0.0 - ace-builds@1.44.0: {} - acorn@7.4.1: {} ansi-regex@5.0.1: {} @@ -4121,6 +4630,16 @@ snapshots: cluster-key-slot@1.1.2: {} + codemirror@6.0.2: + dependencies: + '@codemirror/autocomplete': 6.20.2 + '@codemirror/commands': 6.10.3 + '@codemirror/language': 6.12.3 + '@codemirror/lint': 6.9.6 + '@codemirror/search': 6.7.0 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.42.1 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -4208,6 +4727,8 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + crelt@1.0.6: {} + cron-parser@4.9.0: dependencies: luxon: 3.6.1 @@ -4275,8 +4796,6 @@ snapshots: diacritics@1.3.0: {} - diff-match-patch@1.0.5: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4946,16 +5465,12 @@ snapshots: lodash.defaults@4.2.0: {} - lodash.get@4.4.2: {} - lodash.includes@4.3.0: {} lodash.isarguments@3.1.0: {} lodash.isboolean@3.0.3: {} - lodash.isequal@4.5.0: {} - lodash.isfinite@3.3.2: {} lodash.isinteger@4.0.4: {} @@ -4970,10 +5485,6 @@ snapshots: lodash@4.17.21: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - lru-cache@11.3.5: {} luxon@3.6.1: {} @@ -4992,6 +5503,8 @@ snapshots: marked@16.0.0: {} + marked@16.4.2: {} + math-intrinsics@1.1.0: {} mdn-data@2.27.1: {} @@ -5268,12 +5781,6 @@ snapshots: dependencies: asap: 2.0.6 - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -5389,23 +5896,11 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 - react-ace@14.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): - dependencies: - ace-builds: 1.44.0 - diff-match-patch: 1.0.5 - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - prop-types: 15.8.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - react-dom@19.2.5(react@19.2.5): dependencies: react: 19.2.5 scheduler: 0.27.0 - react-is@16.13.1: {} - react-is@17.0.2: {} react-router-dom@7.14.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5): @@ -5792,6 +6287,8 @@ snapshots: strnum@1.1.2: {} + style-mod@4.1.3: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -5964,6 +6461,8 @@ snapshots: void-elements@3.1.0: {} + w3c-keyname@2.2.8: {} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0